(module examples.protocol_native_a2ui
  (capsule "0")
  (profile agentic external.mcp external.a2a ui.a2ui)

  (type Issue
    (record
      (title Text)
      (body Text)
      (severity U32)))
  (type SearchIssuesInput
    (record
      (repo Text)))
  (type SearchIssuesResult
    (record
      (issues (List Issue (max 100)))))
  (type CreateIssueInput
    (record
      (repo Text)
      (title Text)
      (body Text)))
  (type CreatedIssue
    (record
      (url Text)))
  (type CapsuleModule
    (record
      (repo Text)
      (summary Text)))
  (type SecurityReviewArtifact
    (record
      (summary Text)
      (risk_score U32)))

  (port github
    (protocol mcp "2025-11-25")
    (tools
      (tool github.search_issues
        (input SearchIssuesInput)
        (output SearchIssuesResult)
        (effects
          (reads external.github.issues))
        (uses-untrusted-external-data true))
      (tool github.create_issue
        (input CreateIssueInput)
        (output CreatedIssue)
        (effects
          (writes external.github.issues))
        (requires-user-confirmation true)
        (requires-auth github.issues.write)))
    (resources
      (resource repo_files
        (uri "github://repo/files")
        (output Json)
        (subscribable true)
        (effects
          (reads external.github.repo))))
    (prompts
      (prompt review_prompt
        (input CapsuleModule)
        (output Text))))

  (agent security_reviewer
    (protocol a2a "1.0")
    (discovery
      (well-known "https://security-reviewer.example/.well-known/agent-card.json")
      (skill "capsule-risk-review"))
    (auth oauth2 security.review)
    (skills
      (skill review_capsule
        (input CapsuleModule)
        (output SecurityReviewArtifact)
        (max-duration "10m")
        (effects
          (a2a.remote-reasoning)
          (reads artifact.repo_files)))))

  (surface repo_review_ui
    (protocol a2ui "v0.9")
    (catalog "https://a2ui.org/specification/v0_9/basic_catalog.json")
    (state
      (repo Text)
      (issues Json)
      (selected_issue (Option Text))
      (approved Bool))
    (action approve_issue_creation
      (input
        (issue_title Text)
        (issue_body Text))
      (requires-user-confirmation true)
      (requires-auth github.issues.write))
    (action reject_issue_creation
      (input
        (reason Text)))
    (title "Repository security review")
    (route "/reviews/repo")
    (bind RepoReview)
    (event Begin ReviewReady ApproveIssue RejectIssue))

  (machine RepoReview
    (version "0.1.0")
    (context
      (repo Text)
      (approved Bool)
      (risk_score U32))
    (event Begin
      (repo Text))
    (event ReviewReady
      (risk_score U32))
    (event ApproveIssue
      (issue_title Text)
      (issue_body Text))
    (event RejectIssue
      (reason Text))
    (initial idle)

    (state idle
      (on Begin
        (target reviewing)
        (assign
          (repo event.repo)
          (approved false)
          (risk_score 0))
        (effects
          (mcp.read-resource github.repo_files)
          (mcp.call github.github.search_issues)
          (a2a.task security_reviewer.review_capsule)
          (a2ui.emit repo_review_ui)
          (a2ui.update-data repo_review_ui.root)
          (uses-untrusted-external-data))))

    (state reviewing
      (on ReviewReady
        (target awaiting_decision)
        (assign
          (risk_score event.risk_score))
        (effects
          (a2ui.update-data repo_review_ui.root)
          (a2ui.await-action repo_review_ui.approve_issue_creation)))

      (on RejectIssue
        (target rejected)
        (assign
          (approved false))
        (effects
          (a2ui.update-data repo_review_ui.root))))

    (state awaiting_decision
      (on ApproveIssue
        (target issued)
        (assign
          (approved true))
        (effects
          (requires-user-confirmation)
          (requires-auth github.issues.write)
          (mcp.call github.github.create_issue)
          (a2a.message security_reviewer)
          (a2ui.update-data repo_review_ui.root)))
      (on RejectIssue
        (target rejected)
        (assign
          (approved false))
        (effects
          (a2ui.update-data repo_review_ui.root))))

    (state issued (type final))
    (state rejected (type final))))
