@agent-native/core 0.44.4 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cli/connect.d.ts +2 -1
  2. package/dist/cli/connect.d.ts.map +1 -1
  3. package/dist/cli/connect.js +185 -5
  4. package/dist/cli/connect.js.map +1 -1
  5. package/dist/cli/index.js +27 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/plan-local.d.ts +43 -0
  8. package/dist/cli/plan-local.d.ts.map +1 -0
  9. package/dist/cli/plan-local.js +477 -0
  10. package/dist/cli/plan-local.js.map +1 -0
  11. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  12. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  13. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  14. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  15. package/dist/cli/recap.d.ts +164 -0
  16. package/dist/cli/recap.d.ts.map +1 -1
  17. package/dist/cli/recap.js +657 -10
  18. package/dist/cli/recap.js.map +1 -1
  19. package/dist/cli/skills.d.ts +2 -2
  20. package/dist/cli/skills.d.ts.map +1 -1
  21. package/dist/cli/skills.js +160 -387
  22. package/dist/cli/skills.js.map +1 -1
  23. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  24. package/dist/client/blocks/library/AnnotatedCodeBlock.js +4 -1
  25. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  26. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
  27. package/dist/client/blocks/library/DiffBlock.js +10 -11
  28. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  29. package/dist/client/blocks/library/annotation-rail.d.ts +15 -5
  30. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  31. package/dist/client/blocks/library/annotation-rail.js +35 -24
  32. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  33. package/dist/client/blocks/library/code-filename-label.d.ts +8 -0
  34. package/dist/client/blocks/library/code-filename-label.d.ts.map +1 -0
  35. package/dist/client/blocks/library/code-filename-label.js +15 -0
  36. package/dist/client/blocks/library/code-filename-label.js.map +1 -0
  37. package/dist/client/blocks/library/code.d.ts.map +1 -1
  38. package/dist/client/blocks/library/code.js +3 -2
  39. package/dist/client/blocks/library/code.js.map +1 -1
  40. package/dist/client/blocks/library/diff.config.d.ts +1 -1
  41. package/dist/client/blocks/library/diff.config.js.map +1 -1
  42. package/dist/client/blocks/library/narrow-container.d.ts +4 -4
  43. package/dist/client/blocks/library/narrow-container.d.ts.map +1 -1
  44. package/dist/client/blocks/library/narrow-container.js +10 -10
  45. package/dist/client/blocks/library/narrow-container.js.map +1 -1
  46. package/dist/client/blocks/library/tabs.d.ts.map +1 -1
  47. package/dist/client/blocks/library/tabs.js +7 -2
  48. package/dist/client/blocks/library/tabs.js.map +1 -1
  49. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  50. package/dist/client/composer/TiptapComposer.js +4 -1
  51. package/dist/client/composer/TiptapComposer.js.map +1 -1
  52. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  53. package/dist/client/db-admin/TableEditor.js +3 -1
  54. package/dist/client/db-admin/TableEditor.js.map +1 -1
  55. package/dist/db/client.d.ts +8 -0
  56. package/dist/db/client.d.ts.map +1 -1
  57. package/dist/db/client.js +23 -2
  58. package/dist/db/client.js.map +1 -1
  59. package/dist/deploy/build.d.ts.map +1 -1
  60. package/dist/deploy/build.js +8 -0
  61. package/dist/deploy/build.js.map +1 -1
  62. package/dist/extensions/html-shell.js +1 -1
  63. package/dist/extensions/html-shell.js.map +1 -1
  64. package/dist/jobs/scheduler.d.ts.map +1 -1
  65. package/dist/jobs/scheduler.js +5 -1
  66. package/dist/jobs/scheduler.js.map +1 -1
  67. package/dist/mcp/build-server.d.ts +1 -0
  68. package/dist/mcp/build-server.d.ts.map +1 -1
  69. package/dist/mcp/build-server.js +7 -3
  70. package/dist/mcp/build-server.js.map +1 -1
  71. package/dist/mcp/oauth-route.d.ts.map +1 -1
  72. package/dist/mcp/oauth-route.js +56 -19
  73. package/dist/mcp/oauth-route.js.map +1 -1
  74. package/dist/mcp/oauth-store.d.ts +1 -0
  75. package/dist/mcp/oauth-store.d.ts.map +1 -1
  76. package/dist/mcp/oauth-store.js +9 -0
  77. package/dist/mcp/oauth-store.js.map +1 -1
  78. package/dist/mcp/server.d.ts.map +1 -1
  79. package/dist/mcp/server.js +9 -4
  80. package/dist/mcp/server.js.map +1 -1
  81. package/dist/mcp-client/errors.js +3 -3
  82. package/dist/mcp-client/errors.js.map +1 -1
  83. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  84. package/dist/server/agent-chat-plugin.js +3 -1
  85. package/dist/server/agent-chat-plugin.js.map +1 -1
  86. package/dist/server/agent-teams.d.ts.map +1 -1
  87. package/dist/server/agent-teams.js +10 -2
  88. package/dist/server/agent-teams.js.map +1 -1
  89. package/dist/server/auth.d.ts.map +1 -1
  90. package/dist/server/auth.js +7 -3
  91. package/dist/server/auth.js.map +1 -1
  92. package/dist/server/recap-image-route.d.ts.map +1 -1
  93. package/dist/server/recap-image-route.js +3 -6
  94. package/dist/server/recap-image-route.js.map +1 -1
  95. package/dist/server/sentry.d.ts.map +1 -1
  96. package/dist/server/sentry.js +12 -5
  97. package/dist/server/sentry.js.map +1 -1
  98. package/dist/server/social-og-image.d.ts.map +1 -1
  99. package/dist/server/social-og-image.js +3 -1
  100. package/dist/server/social-og-image.js.map +1 -1
  101. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +22 -6
  102. package/docs/content/plan-plugin.md +18 -1
  103. package/docs/content/pr-visual-recap.md +37 -10
  104. package/docs/content/template-plan.md +45 -1
  105. package/package.json +1 -1
  106. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +22 -6
@@ -1 +1 @@
1
- {"version":3,"file":"recap.js","sourceRoot":"","sources":["../../src/cli/recap.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native recap <scan|build-prompt|shot|comment>` — the helper surface\n * used by the PR Visual Recap GitHub Action.\n *\n * The action no longer generates the recap deterministically. Instead a coding\n * agent (Claude Code or Codex) RUNS THE REPO'S visual-recap skill against the\n * diff and publishes the plan via the plan MCP tools. These subcommands are the\n * thin, deterministic glue around that:\n *\n * scan Refuse to hand a secret-leaking diff to the agent.\n * build-prompt Assemble the agent prompt = repo SKILL.md + a task wrapper.\n * shot Screenshot the published plan and upload it to the plan app's\n * signed public image route (for an inline PR-comment image).\n * comment Find the previous plan id / upsert the sticky PR comment.\n *\n * Promoting these to the published CLI means an installed repo's workflow calls\n * `agent-native recap …` instead of copying helper scripts into the repo.\n *\n * Node built-ins only (plus an optional dynamic `playwright` import for `shot`).\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { PR_VISUAL_RECAP_WORKFLOW_YML } from \"./pr-visual-recap-workflow.js\";\n\n/* -------------------------------------------------------------------------- */\n/* Arg parsing */\n/* -------------------------------------------------------------------------- */\n\nfunction parseArgs(argv: string[]): Record<string, string | boolean> {\n const out: Record<string, string | boolean> = {};\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (!token.startsWith(\"--\")) continue;\n const key = token.slice(2);\n const next = argv[i + 1];\n if (next === undefined || next.startsWith(\"--\")) out[key] = true;\n else {\n out[key] = next;\n i += 1;\n }\n }\n return out;\n}\n\nfunction stringArg(\n args: Record<string, string | boolean>,\n key: string,\n): string {\n const value = args[key];\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Missing --${key}`);\n }\n return value;\n}\n\nfunction optionalArg(\n args: Record<string, string | boolean>,\n key: string,\n): string | undefined {\n const value = args[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* GitHub Action install (used by `skills add … --with-github-action`) */\n/* -------------------------------------------------------------------------- */\n\n/** GitHub secrets the installed PR Visual Recap workflow needs. */\nexport const PR_VISUAL_RECAP_SETUP: string[] = [\n \"Required secrets:\",\n \" PLAN_RECAP_TOKEN — bearer token from `agent-native connect`\",\n \" ANTHROPIC_API_KEY — the LLM key for the default Claude Code backend\",\n \"Optional (only if you change defaults):\",\n \" OPENAI_API_KEY (secret) + VISUAL_RECAP_AGENT=codex (variable) — use Codex instead of Claude\",\n \" VISUAL_RECAP_MODEL / VISUAL_RECAP_REASONING (variables) — pin the model (e.g. gpt-5.5) and reasoning depth (none|minimal|low|medium|high|xhigh; Codex only)\",\n \" PLAN_RECAP_APP_URL (secret) — only when self-hosting the plan app (defaults to https://plan.agent-native.com)\",\n];\n\n/** Write .github/workflows/pr-visual-recap.yml into a repo. */\nexport function writePrVisualRecapWorkflow(baseDir: string): {\n path: string;\n existed: boolean;\n} {\n const dir = path.resolve(baseDir, \".github\", \"workflows\");\n fs.mkdirSync(dir, { recursive: true });\n const file = path.join(dir, \"pr-visual-recap.yml\");\n const existed = fs.existsSync(file);\n fs.writeFileSync(file, PR_VISUAL_RECAP_WORKFLOW_YML);\n return { path: path.relative(baseDir, file), existed };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Secret scan — defense-in-depth before any LLM sees the diff */\n/* -------------------------------------------------------------------------- */\n\n/**\n * If the diff contains anything that looks like a real secret, we refuse to\n * build a recap at all (rather than risk echoing it into a published plan).\n * These patterns intentionally err toward caution and scan added, removed, and\n * context lines so deleting a real secret does not leak it in a split diff.\n */\nconst SECRET_PATTERNS: RegExp[] = [\n // Common provider key prefixes.\n /\\b(?:sk|pk|rk)-[A-Za-z0-9]{16,}\\b/,\n /\\bghp_[A-Za-z0-9]{20,}\\b/,\n /\\bgithub_pat_[A-Za-z0-9_]{20,}\\b/,\n /\\bxox[baprs]-[A-Za-z0-9-]{10,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bAIza[0-9A-Za-z_-]{20,}\\b/,\n // Bearer / Authorization header values with an actual token.\n /authorization\\s*[:=]\\s*['\"]?bearer\\s+[A-Za-z0-9._-]{12,}/i,\n // Private key blocks.\n /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/,\n // `KEY=...`, `TOKEN=...`, `SECRET=...`, `PASSWORD=...` assigned a real-looking\n // value (long, non-placeholder).\n /\\b[A-Z0-9_]*(?:SECRET|TOKEN|PASSWORD|API_KEY|PRIVATE_KEY|ACCESS_KEY)[A-Z0-9_]*\\s*[:=]\\s*['\"]?(?!.*(?:your|example|placeholder|changeme|xxxx|\\*\\*\\*|<|\\$\\{|process\\.env|env\\.|REDACTED))[A-Za-z0-9/_+=.-]{16,}/i,\n];\n\nexport function lineLooksSecret(line: string): boolean {\n return SECRET_PATTERNS.some((re) => re.test(line));\n}\n\nexport function diffContainsSecret(diffText: string): boolean {\n for (const line of diffText.split(\"\\n\")) {\n if (\n line.startsWith(\"+\") ||\n line.startsWith(\"-\") ||\n line.startsWith(\" \") ||\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\")\n ) {\n if (lineLooksSecret(line)) return true;\n }\n }\n return false;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Prompt builder — repo SKILL.md + task wrapper */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Locate the repo's visual-recap SKILL.md, preferring the host-agent install\n * locations so a user's `agent-native skills add` copy wins, then falling back\n * to the framework's own source locations.\n */\nexport function readRepoSkillMd(cwd: string = process.cwd()): {\n text: string;\n source: string;\n} {\n const candidates = [\n \".claude/skills/visual-recap/SKILL.md\",\n \".agents/skills/visual-recap/SKILL.md\",\n \"skills/visual-recap/SKILL.md\",\n \"templates/plan/.agents/skills/visual-recap/SKILL.md\",\n ];\n for (const rel of candidates) {\n const abs = path.resolve(cwd, rel);\n if (fs.existsSync(abs)) {\n return { text: fs.readFileSync(abs, \"utf8\"), source: rel };\n }\n }\n throw new Error(\n \"Could not find visual-recap/SKILL.md. Run `agent-native skills add visual-plan` first.\",\n );\n}\n\nexport function buildRecapPrompt(input: {\n skillMd: string;\n pr: string;\n head?: string;\n appUrl: string;\n diffPath: string;\n statPath?: string;\n prevPlanId?: string;\n huge?: boolean;\n}): string {\n const appUrl = input.appUrl.replace(/\\/$/, \"\");\n const lines: string[] = [];\n lines.push(\"# Task: publish a Visual Recap of this pull request\");\n lines.push(\"\");\n lines.push(\n `You are running non-interactively in CI. Follow the **visual-recap skill** included verbatim below to turn this PR's diff into a grounded Agent-Native Plan, then publish it.`,\n );\n lines.push(\"\");\n lines.push(\"## Inputs (read them from disk with your Read tool)\");\n lines.push(`- PR number: **#${input.pr}**`);\n if (input.head) lines.push(`- Head commit: \\`${input.head}\\``);\n lines.push(`- Unified diff: \\`${input.diffPath}\\` (read this file)`);\n if (input.statPath)\n lines.push(`- Diff stat: \\`${input.statPath}\\` (read this file)`);\n if (input.huge) {\n lines.push(\n `- The diff is LARGE — produce a **summarized** recap (top files + schema/API deltas), not an exhaustive one.`,\n );\n }\n lines.push(\"\");\n lines.push(\"## Publish (this is the only way to produce output)\");\n lines.push(\n `The \\`plan\\` MCP server is configured for you. Call its tools by name (your host may expose them as \\`create-visual-recap\\` or \\`mcp__plan__create-visual-recap\\` — same tool).`,\n );\n lines.push(\n `1. Call the **create-visual-recap** tool on the \\`plan\\` MCP server with grounded MDX derived ONLY from the real diff${\n input.prevPlanId\n ? `, passing \\`planId: \"${input.prevPlanId}\"\\` so this REPLACES the existing recap plan`\n : \"\"\n }.`,\n );\n lines.push(\n `2. Call the **set-resource-visibility** tool on the \\`plan\\` MCP server with \\`{ resourceType: \"plan\", resourceId: <the returned plan id>, visibility: \"org\" }\\` so the recap is login-gated to the org, never public.`,\n );\n lines.push(\n `3. Write the plan URL to a file named \\`recap-url.txt\\` at the repo root, containing exactly one line: \\`${appUrl}/recaps/<the returned plan id>\\`. This file is the workflow's only hand-off — do not print anything else as the deliverable.`,\n );\n lines.push(\"\");\n lines.push(\n \"Do not invent file names, schema fields, or endpoints. Redact anything that looks like a secret. If the diff has no reviewable substance, still publish a minimal recap and write recap-url.txt.\",\n );\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"# visual-recap skill (follow this exactly)\");\n lines.push(\"\");\n lines.push(input.skillMd.trim());\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* GitHub comment helpers */\n/* -------------------------------------------------------------------------- */\n\nconst MARKER = \"<!-- pr-visual-recap -->\";\n\ntype GitHubComment = {\n id: number;\n body?: string | null;\n html_url?: string;\n user?: { type?: string | null } | null;\n};\n\nfunction repoParts(repoFullName: string): { owner: string; repo: string } {\n const [owner, repo] = repoFullName.split(\"/\");\n if (!owner || !repo) throw new Error(`Invalid --repo: ${repoFullName}`);\n return { owner, repo };\n}\n\nasync function githubRequest<T>(\n token: string,\n apiPath: string,\n init: RequestInit = {},\n): Promise<T> {\n const res = await fetch(`https://api.github.com${apiPath}`, {\n ...init,\n headers: {\n accept: \"application/vnd.github+json\",\n authorization: `Bearer ${token}`,\n \"x-github-api-version\": \"2022-11-28\",\n ...(init.headers ?? {}),\n },\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(\n `GitHub request failed ${res.status} ${res.statusText}: ${detail.slice(0, 500)}`,\n );\n }\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n}\n\nasync function findExistingComment(input: {\n token: string;\n owner: string;\n repo: string;\n issue: string;\n}): Promise<GitHubComment | null> {\n for (let page = 1; ; page += 1) {\n const comments = await githubRequest<GitHubComment[]>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/${encodeURIComponent(input.issue)}/comments?per_page=100&page=${page}`,\n );\n const match = comments.find(\n (comment) =>\n comment.user?.type === \"Bot\" &&\n typeof comment.body === \"string\" &&\n comment.body.includes(MARKER),\n );\n if (match) return match;\n if (comments.length < 100) return null;\n }\n}\n\nasync function upsertComment(input: {\n token: string;\n owner: string;\n repo: string;\n issue: string;\n body: string;\n /** When true, refresh an existing comment but never create a new one. */\n updateOnly?: boolean;\n}): Promise<{\n action: \"created\" | \"updated\" | \"skipped\";\n id: number;\n html_url?: string;\n}> {\n const body = input.body.includes(MARKER)\n ? input.body\n : `${MARKER}\\n${input.body}`;\n const existing = await findExistingComment(input);\n if (!existing && input.updateOnly) {\n // Nothing to refresh and we were told not to create — e.g. a tiny diff with\n // no prior recap. Stay silent rather than posting a \"skipped\" comment.\n return { action: \"skipped\", id: 0 };\n }\n if (existing) {\n const updated = await githubRequest<GitHubComment>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/comments/${existing.id}`,\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ body }),\n },\n );\n return { action: \"updated\", id: existing.id, html_url: updated.html_url };\n }\n const created = await githubRequest<GitHubComment>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/${encodeURIComponent(input.issue)}/comments`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ body }),\n },\n );\n return { action: \"created\", id: created.id, html_url: created.html_url };\n}\n\nfunction planIdFromUrl(url: string): string | null {\n // Accept both /recaps/<id> (the canonical recap route the agent now writes)\n // and /plans/<id> (legacy URLs) so the sticky-comment rebuild keeps working.\n const match = url.match(/\\/(?:recaps|plans)\\/([A-Za-z0-9_-]+)/);\n return match ? match[1] : null;\n}\n\n/** True when both URLs parse and share an origin. */\nfunction sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\n/** The origin of a URL, or \"\" if it doesn't parse. */\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return \"\";\n }\n}\n\n/** Build the sticky comment body from the workflow's environment. */\nexport function buildCommentBody(env: NodeJS.ProcessEnv = process.env): string {\n const headShort = (env.HEAD_SHA || \"\").slice(0, 7);\n const lines: string[] = [MARKER];\n\n if (env.SUPPRESSED === \"true\") {\n let reason = \"potential secret in diff\";\n try {\n const parsed = JSON.parse(env.SUPPRESSED_JSON || \"{}\");\n if (parsed && typeof parsed.reason === \"string\") reason = parsed.reason;\n } catch {\n /* keep default */\n }\n lines.push(\"### Visual recap — not generated\");\n lines.push(\"\");\n lines.push(\n \"The recap was **suppressed** because the diff matched a secret/credential pattern. No plan was published.\",\n );\n lines.push(\"\");\n lines.push(`Reason: \\`${reason}\\`. Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n // Tiny diffs aren't worth a recap. Refresh an existing sticky comment to this\n // state (the workflow only updates, never creates, on tiny) so it never lingers\n // pointing at a stale head SHA.\n if (env.DIFF_TINY === \"true\") {\n lines.push(\"### Visual recap — skipped (diff too small)\");\n lines.push(\"\");\n lines.push(\n \"The change in this push is too small to be worth a visual recap. This is informational only and does **not** block the PR.\",\n );\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n const planUrl = (env.PLAN_URL || \"\").trim();\n const appUrl = (env.PLAN_RECAP_APP_URL || \"\").trim();\n // recap-url.txt is agent-written → untrusted. Rebuild a canonical link from a\n // TRUSTED base (the configured PLAN_RECAP_APP_URL when set, else the parsed\n // origin of the plan URL) plus a strictly-validated plan id, instead of\n // embedding the raw URL. That both enforces the app origin and prevents\n // markdown injection — a same-origin URL with a crafted path/query could\n // otherwise break out of the markdown link.\n const planId = planUrl ? planIdFromUrl(planUrl) : null;\n const sameOriginOk = appUrl === \"\" || sameOrigin(planUrl, appUrl);\n const base = (appUrl || originOf(planUrl)).replace(/\\/$/, \"\");\n const safeUrl =\n planId && base && sameOriginOk ? `${base}/recaps/${planId}` : \"\";\n if (!safeUrl) {\n lines.push(\"### Visual recap — generation failed\");\n lines.push(\"\");\n lines.push(\n \"The visual recap could not be generated for this push. This is informational only and does **not** block the PR.\",\n );\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n // The image URL is produced by our own recap-image route, but validate it is\n // same-origin and matches the canonical hex-token path before embedding it, so\n // it likewise cannot inject markdown.\n const imageUrlRaw = (env.RECAP_IMAGE_URL || \"\").trim();\n const imageUrl =\n imageUrlRaw &&\n sameOrigin(imageUrlRaw, base) &&\n /\\/_agent-native\\/recap-image\\/[0-9a-f]+\\.png$/.test(imageUrlRaw)\n ? imageUrlRaw\n : \"\";\n lines.push(\"### Visual recap — review at a higher altitude\");\n lines.push(\"\");\n if (imageUrl) {\n lines.push(`[![Visual recap](${imageUrl})](${safeUrl})`);\n lines.push(\"\");\n }\n lines.push(`**[Open the interactive recap](${safeUrl})**`);\n if (env.DIFF_HUGE === \"true\") {\n lines.push(\"\");\n lines.push(\n \"> Large diff — this recap is a **summarized** view (top files + schema/API deltas).\",\n );\n }\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n lines.push(\"\");\n lines.push(`<!-- plan-id: ${planId} -->`);\n return lines.join(\"\\n\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Subcommands */\n/* -------------------------------------------------------------------------- */\n\nfunction runScan(args: Record<string, string | boolean>): void {\n const diffPath = stringArg(args, \"diff\");\n const diffText = fs.readFileSync(path.resolve(diffPath), \"utf8\");\n if (diffContainsSecret(diffText)) {\n process.stdout.write(\n `${JSON.stringify({ suppressed: true, reason: \"potential secret in diff\" })}\\n`,\n );\n } else {\n process.stdout.write(`${JSON.stringify({ suppressed: false })}\\n`);\n }\n}\n\nfunction runBuildPrompt(args: Record<string, string | boolean>): void {\n const skill = readRepoSkillMd();\n const prompt = buildRecapPrompt({\n skillMd: skill.text,\n pr: stringArg(args, \"pr\"),\n head: optionalArg(args, \"head\"),\n appUrl: optionalArg(args, \"app-url\") ?? \"https://plan.agent-native.com\",\n diffPath: optionalArg(args, \"diff\") ?? \"recap.diff\",\n statPath: optionalArg(args, \"stat\"),\n prevPlanId: optionalArg(args, \"prev-plan-id\"),\n huge: args.huge === true || args.huge === \"true\",\n });\n const out = optionalArg(args, \"out\") ?? \"recap-prompt.md\";\n fs.writeFileSync(path.resolve(out), prompt);\n process.stdout.write(\n `${JSON.stringify({ ok: true, out, skillSource: skill.source, bytes: prompt.length })}\\n`,\n );\n}\n\n/** Upload a PNG to the plan app's signed public image route; returns its URL. */\nasync function uploadRecapImage(input: {\n appUrl: string;\n token: string;\n pngPath: string;\n}): Promise<string | null> {\n try {\n const base = input.appUrl.replace(/\\/$/, \"\");\n const bytes = fs.readFileSync(path.resolve(input.pngPath));\n const res = await fetch(`${base}/_agent-native/recap-image`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"image/png\",\n authorization: `Bearer ${input.token}`,\n },\n body: bytes,\n });\n // Surface failures on stderr — stdout carries the machine-readable JSON the\n // workflow parses, so it must stay clean. A silent null here is exactly what\n // made the missing-inline-thumbnail failure undebuggable from CI logs.\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n process.stderr.write(\n `[recap shot] image upload failed: ${res.status} ${res.statusText} ${detail.slice(0, 300)}\\n`,\n );\n return null;\n }\n const json = (await res.json().catch(() => null)) as {\n imageUrl?: string;\n } | null;\n if (!json?.imageUrl) {\n process.stderr.write(\n `[recap shot] image upload returned no imageUrl (status ${res.status})\\n`,\n );\n return null;\n }\n return json.imageUrl;\n } catch (err) {\n process.stderr.write(`[recap shot] image upload error: ${String(err)}\\n`);\n return null;\n }\n}\n\nasync function runShot(args: Record<string, string | boolean>): Promise<void> {\n const url = stringArg(args, \"url\");\n const out = optionalArg(args, \"out\") ?? \"recap.png\";\n const token = optionalArg(args, \"token\");\n const appUrl = optionalArg(args, \"app-url\");\n\n const done = (obj: Record<string, unknown>) => {\n process.stdout.write(`${JSON.stringify(obj)}\\n`);\n };\n\n // recap-url.txt is produced by the (LLM) agent, so the URL is untrusted. Only\n // forward the reusable publish token to the trusted plan-app origin — never to\n // an arbitrary URL — so a poisoned recap-url.txt can't exfiltrate the bearer\n // to an attacker-controlled domain.\n let attachToken = false;\n if (token) {\n try {\n attachToken = !!appUrl && new URL(url).origin === new URL(appUrl).origin;\n } catch {\n attachToken = false;\n }\n if (!attachToken) {\n done({\n ok: false,\n reason: appUrl\n ? `refusing to screenshot ${url}: origin does not match --app-url (${appUrl}); the publish token is only sent to the trusted plan app origin`\n : `refusing to attach the publish token without --app-url to validate ${url} against`,\n });\n return;\n }\n }\n\n let chromium: typeof import(\"playwright\").chromium | undefined;\n try {\n ({ chromium } = await import(\"playwright\"));\n } catch {\n try {\n ({ chromium } =\n (await import(\"@playwright/test\")) as unknown as typeof import(\"playwright\"));\n } catch (err) {\n done({ ok: false, reason: `playwright not available: ${String(err)}` });\n return;\n }\n }\n\n let captured = false;\n let browser: import(\"playwright\").Browser | undefined;\n const hardTimer = setTimeout(() => {\n done({ ok: false, reason: \"hard 60s timeout reached\" });\n process.exit(0);\n }, 60_000);\n try {\n browser = await chromium!.launch({ args: [\"--no-sandbox\"] });\n const context = await browser.newContext({\n viewport: { width: 1450, height: 1450 },\n deviceScaleFactor: 2,\n });\n if (attachToken) {\n // Attach the bearer ONLY to same-origin requests. Context-wide\n // extraHTTPHeaders would also send it to every cross-origin subresource\n // the plan page loads (CDN images/fonts/scripts), leaking the publish\n // token; routing scopes it to the trusted app origin.\n const appOrigin = new URL(appUrl as string).origin;\n await context.route(\"**/*\", async (route) => {\n const request = route.request();\n if (new URL(request.url()).origin === appOrigin) {\n await route.continue({\n headers: { ...request.headers(), authorization: `Bearer ${token}` },\n });\n } else {\n await route.continue();\n }\n });\n }\n const page = await context.newPage();\n await page.goto(url, { waitUntil: \"networkidle\", timeout: 45_000 });\n const selectors = [\n \"[data-plan-document]\",\n \"[data-plan-block]\",\n \"main article\",\n \"[data-testid='plan-document']\",\n \"main\",\n ];\n let matched = false;\n for (const sel of selectors) {\n try {\n await page.waitForSelector(sel, { timeout: 6_000, state: \"visible\" });\n matched = true;\n break;\n } catch {\n /* try the next selector */\n }\n }\n await page.waitForTimeout(matched ? 1_200 : 500);\n // Zoom out slightly so more content fits. Keep the plan title (h1) in frame:\n // the recap reads better led by its own title than cropped to the body.\n await page.evaluate(() => {\n (document.documentElement as HTMLElement).style.zoom = \"80%\";\n });\n await page.screenshot({ path: out });\n captured = true;\n await browser.close();\n } catch (err) {\n clearTimeout(hardTimer);\n try {\n if (browser) await browser.close();\n } catch {\n /* ignore */\n }\n done({\n ok: false,\n reason: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n clearTimeout(hardTimer);\n\n let imageUrl: string | null = null;\n if (captured && token && appUrl) {\n imageUrl = await uploadRecapImage({ appUrl, token, pngPath: out });\n }\n done({ ok: captured, out, imageUrl });\n}\n\nasync function runComment(\n args: Record<string, string | boolean>,\n sub: string,\n): Promise<void> {\n const token = stringArg(args, \"token\");\n const { owner, repo } = repoParts(stringArg(args, \"repo\"));\n const issue = stringArg(args, \"issue\");\n\n if (sub === \"find-plan-id\") {\n const existing = await findExistingComment({ token, owner, repo, issue });\n const body = existing?.body ?? \"\";\n const match = body.match(/<!--\\s*plan-id:\\s*([^\\s]+)\\s*-->/);\n process.stdout.write(match ? match[1] : \"\");\n return;\n }\n\n if (sub === \"upsert\") {\n const result = await upsertComment({\n token,\n owner,\n repo,\n issue,\n body: buildCommentBody(),\n updateOnly:\n args[\"update-only\"] === true || args[\"update-only\"] === \"true\",\n });\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n return;\n }\n\n throw new Error(\n \"Usage: agent-native recap comment <find-plan-id|upsert> --repo owner/name --issue n --token token\",\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Usage capture — parse the agent's own token usage and attach it to the plan */\n/* -------------------------------------------------------------------------- */\n\ninterface ParsedUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n model?: string;\n reportedCostUsd?: number;\n}\n\n/** Parse the last top-level JSON object from a possibly-noisy stdout dump. */\nfunction parseLastJsonObject(text: string): Record<string, any> | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n /* fall through to line-by-line */\n }\n const lines = trimmed.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const line = lines[i].trim();\n if (!line.startsWith(\"{\")) continue;\n try {\n return JSON.parse(line);\n } catch {\n /* keep scanning earlier lines */\n }\n }\n return null;\n}\n\n/**\n * Claude Code `-p --output-format json` prints one final result object with a\n * `usage` block and `total_cost_usd`. Anthropic's `input_tokens` already\n * EXCLUDES cache tokens, so no normalization is needed here.\n */\nexport function parseClaudeUsage(stdout: string): ParsedUsage | null {\n const obj = parseLastJsonObject(stdout);\n const u = obj?.usage;\n if (!u) return null;\n const model =\n typeof obj?.model === \"string\"\n ? obj.model\n : obj?.modelUsage && typeof obj.modelUsage === \"object\"\n ? Object.keys(obj.modelUsage)[0]\n : undefined;\n return {\n inputTokens: Number(u.input_tokens ?? 0),\n outputTokens: Number(u.output_tokens ?? 0),\n cacheReadTokens: Number(u.cache_read_input_tokens ?? 0),\n cacheWriteTokens: Number(u.cache_creation_input_tokens ?? 0),\n model,\n reportedCostUsd:\n typeof obj?.total_cost_usd === \"number\" ? obj.total_cost_usd : undefined,\n };\n}\n\n/** Pull the last usage object out of a Codex `exec --json` JSONL stream. */\nfunction lastCodexUsage(jsonl: string): Record<string, any> | undefined {\n let last: Record<string, any> | undefined;\n for (const line of jsonl.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"{\")) continue;\n let obj: any;\n try {\n obj = JSON.parse(trimmed);\n } catch {\n continue;\n }\n // turn.completed carries `usage`; token_count events nest it under\n // `info.total_token_usage`. Accept whichever the pinned Codex emits.\n const u =\n obj?.usage ??\n obj?.turn?.usage ??\n obj?.msg?.usage ??\n obj?.info?.total_token_usage ??\n obj?.payload?.info?.total_token_usage;\n if (u && (u.input_tokens != null || u.total_tokens != null)) last = u;\n }\n return last;\n}\n\n/**\n * Codex `exec --json` reports `input_tokens` INCLUSIVE of `cached_input_tokens`\n * (OpenAI counts cached as a subset of prompt tokens) and bills\n * `reasoning_output_tokens` separately. Normalize to the cache-exclusive shape\n * `calculateCost` expects: strip cached out of input, fold reasoning into\n * output. Without this, cached tokens are billed twice and reasoning is dropped.\n */\nexport function parseCodexUsage(jsonl: string): ParsedUsage | null {\n const u = lastCodexUsage(jsonl);\n if (!u) return null;\n const cached = Number(u.cached_input_tokens ?? 0);\n const input = Number(u.input_tokens ?? 0) - cached;\n return {\n inputTokens: Math.max(0, input),\n outputTokens:\n Number(u.output_tokens ?? 0) + Number(u.reasoning_output_tokens ?? 0),\n cacheReadTokens: cached,\n cacheWriteTokens: 0, // Codex has no separate cache-write token charge\n model: typeof u.model === \"string\" ? u.model : undefined,\n };\n}\n\n/**\n * `recap usage` — parse the agent's run output for token usage and POST it to\n * the plan app's record-recap-usage action so the recap row carries cost. The\n * publish token is only ever sent to the trusted --app-url origin (the plan id\n * is parsed from the untrusted agent-written plan URL but never forwarded).\n */\nasync function runUsage(args: Record<string, string | boolean>): Promise<void> {\n const done = (obj: Record<string, unknown>) =>\n process.stdout.write(`${JSON.stringify(obj)}\\n`);\n\n const planUrl = stringArg(args, \"plan-url\");\n const planId = planIdFromUrl(planUrl);\n const agent = (optionalArg(args, \"agent\") ?? \"claude\").toLowerCase();\n const appUrl = optionalArg(args, \"app-url\");\n const token = optionalArg(args, \"token\");\n\n if (!planId) {\n done({ ok: false, reason: `could not parse plan id from ${planUrl}` });\n return;\n }\n if (!appUrl || !token) {\n done({ ok: false, reason: \"missing --app-url or --token\" });\n return;\n }\n\n let parsed: ParsedUsage | null = null;\n try {\n const raw = fs.readFileSync(\n path.resolve(stringArg(args, \"result-file\")),\n \"utf8\",\n );\n parsed = agent === \"codex\" ? parseCodexUsage(raw) : parseClaudeUsage(raw);\n } catch (err) {\n done({ ok: false, reason: `could not read/parse usage: ${String(err)}` });\n return;\n }\n if (!parsed) {\n done({ ok: false, reason: \"no usage found in agent output\" });\n return;\n }\n\n // The Claude result carries the model; Codex usually does not, so fall back to\n // the pinned --model (VISUAL_RECAP_MODEL) and finally the documented default.\n const model =\n parsed.model ??\n optionalArg(args, \"model\") ??\n (agent === \"codex\" ? \"gpt-5.5\" : \"claude\");\n const body: Record<string, unknown> = {\n planId,\n ...(agent === \"codex\" || agent === \"claude\" ? { agent } : {}),\n model,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n cacheReadTokens: parsed.cacheReadTokens,\n cacheWriteTokens: parsed.cacheWriteTokens,\n ...(parsed.reportedCostUsd != null\n ? { reportedCostUsd: parsed.reportedCostUsd }\n : {}),\n };\n\n try {\n const base = appUrl.replace(/\\/$/, \"\");\n const res = await fetch(\n `${base}/_agent-native/actions/record-recap-usage`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n },\n );\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n done({\n ok: false,\n reason: `record-recap-usage failed ${res.status}: ${detail.slice(0, 300)}`,\n });\n return;\n }\n done({ ok: true, planId, ...body });\n } catch (err) {\n done({ ok: false, reason: `record-recap-usage error: ${String(err)}` });\n }\n}\n\nconst HELP = `agent-native recap — PR visual recap helpers (used by the GitHub Action)\n\nUsage:\n agent-native recap scan --diff <path>\n agent-native recap build-prompt --pr <n> [--head <sha>] [--app-url <url>] [--diff <path>] [--stat <path>] [--prev-plan-id <id>] [--huge] [--out <path>]\n agent-native recap shot --url <planUrl> [--token <planToken>] [--app-url <url>] [--out recap.png]\n agent-native recap usage --plan-url <planUrl> --result-file <path> --app-url <url> --token <planToken> [--agent claude|codex] [--model <id>]\n agent-native recap comment <find-plan-id|upsert> --repo owner/name --issue <n> --token <github-token>\n`;\n\nexport async function runRecap(argv: string[]): Promise<void> {\n const [sub, ...rest] = argv;\n const args = parseArgs(rest);\n switch (sub) {\n case \"scan\":\n runScan(args);\n return;\n case \"build-prompt\":\n runBuildPrompt(args);\n return;\n case \"shot\":\n await runShot(args);\n return;\n case \"usage\":\n await runUsage(args);\n return;\n case \"comment\":\n await runComment(parseArgs(rest.slice(1)), rest[0] ?? \"\");\n return;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n process.stdout.write(HELP);\n return;\n default:\n process.stderr.write(`Unknown recap subcommand: ${sub}\\n${HELP}`);\n process.exit(1);\n }\n}\n"]}
1
+ {"version":3,"file":"recap.js","sourceRoot":"","sources":["../../src/cli/recap.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native recap <scan|build-prompt|shot|comment>` — the helper surface\n * used by the PR Visual Recap GitHub Action.\n *\n * The action no longer generates the recap deterministically. Instead a coding\n * agent (Claude Code or Codex) RUNS THE REPO'S visual-recap skill against the\n * diff and publishes the plan via the plan MCP tools. These subcommands are the\n * thin, deterministic glue around that:\n *\n * gate The security boundary: decide whether the recap runs at all\n * (skipping drafts, forks, bots, missing secrets, an invalid\n * agent/model, and PRs that touch recap-control files) and which\n * normalized backend agent to use.\n * collect-diff Collect the bounded base...head diff (excluding lockfiles,\n * build output, snapshots), cap it at ~600KB, and classify the\n * huge/tiny flags.\n * mcp-config Write the plan MCP client config for the chosen backend\n * (Claude Code JSON or Codex config.toml).\n * scan Refuse to hand a secret-leaking diff to the agent.\n * build-prompt Assemble the agent prompt = repo SKILL.md + a task wrapper.\n * shot Screenshot the published plan and upload it to the plan app's\n * signed public image route (for an inline PR-comment image).\n * comment Find the previous plan id / upsert the sticky PR comment.\n *\n * Promoting these to the published CLI means an installed repo's workflow calls\n * `agent-native recap …` instead of copying helper scripts into the repo.\n *\n * Node built-ins only (plus an optional dynamic `playwright` import for `shot`).\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { PR_VISUAL_RECAP_WORKFLOW_YML } from \"./pr-visual-recap-workflow.js\";\n\n/* -------------------------------------------------------------------------- */\n/* Arg parsing */\n/* -------------------------------------------------------------------------- */\n\nfunction parseArgs(argv: string[]): Record<string, string | boolean> {\n const out: Record<string, string | boolean> = {};\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (!token.startsWith(\"--\")) continue;\n const key = token.slice(2);\n const next = argv[i + 1];\n if (next === undefined || next.startsWith(\"--\")) out[key] = true;\n else {\n out[key] = next;\n i += 1;\n }\n }\n return out;\n}\n\nfunction stringArg(\n args: Record<string, string | boolean>,\n key: string,\n): string {\n const value = args[key];\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Missing --${key}`);\n }\n return value;\n}\n\nfunction optionalArg(\n args: Record<string, string | boolean>,\n key: string,\n): string | undefined {\n const value = args[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* GitHub Action install (used by `skills add … --with-github-action`) */\n/* -------------------------------------------------------------------------- */\n\n/** GitHub secrets the installed PR Visual Recap workflow needs. */\nexport const PR_VISUAL_RECAP_SETUP: string[] = [\n \"Required secrets:\",\n \" PLAN_RECAP_TOKEN — bearer token from `agent-native connect`\",\n \" ANTHROPIC_API_KEY — the LLM key for the default Claude Code backend\",\n \"Optional (only if you change defaults):\",\n \" OPENAI_API_KEY (secret) + VISUAL_RECAP_AGENT=codex (variable) — use Codex instead of Claude\",\n \" VISUAL_RECAP_MODEL / VISUAL_RECAP_REASONING (variables) — pin the model (e.g. gpt-5.5) and reasoning depth (none|minimal|low|medium|high|xhigh; Codex only)\",\n \" PLAN_RECAP_APP_URL (secret) — only when self-hosting the plan app (defaults to https://plan.agent-native.com)\",\n];\n\n/** Write .github/workflows/pr-visual-recap.yml into a repo. */\nexport function writePrVisualRecapWorkflow(baseDir: string): {\n path: string;\n existed: boolean;\n} {\n const dir = path.resolve(baseDir, \".github\", \"workflows\");\n fs.mkdirSync(dir, { recursive: true });\n const file = path.join(dir, \"pr-visual-recap.yml\");\n const existed = fs.existsSync(file);\n fs.writeFileSync(file, PR_VISUAL_RECAP_WORKFLOW_YML);\n return { path: path.relative(baseDir, file), existed };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Secret scan — defense-in-depth before any LLM sees the diff */\n/* -------------------------------------------------------------------------- */\n\n/**\n * If the diff contains anything that looks like a real secret, we refuse to\n * build a recap at all (rather than risk echoing it into a published plan).\n * These patterns intentionally err toward caution and scan added, removed, and\n * context lines so deleting a real secret does not leak it in a split diff.\n */\nconst SECRET_PATTERNS: RegExp[] = [\n // Common provider key prefixes.\n /\\b(?:sk|pk|rk)-[A-Za-z0-9]{16,}\\b/,\n /\\bghp_[A-Za-z0-9]{20,}\\b/,\n /\\bgithub_pat_[A-Za-z0-9_]{20,}\\b/,\n /\\bxox[baprs]-[A-Za-z0-9-]{10,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bAIza[0-9A-Za-z_-]{20,}\\b/,\n // Bearer / Authorization header values with an actual token.\n /authorization\\s*[:=]\\s*['\"]?bearer\\s+[A-Za-z0-9._-]{12,}/i,\n // Private key blocks.\n /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/,\n // `KEY=...`, `TOKEN=...`, `SECRET=...`, `PASSWORD=...` assigned a real-looking\n // value (long, non-placeholder).\n /\\b[A-Z0-9_]*(?:SECRET|TOKEN|PASSWORD|API_KEY|PRIVATE_KEY|ACCESS_KEY)[A-Z0-9_]*\\s*[:=]\\s*['\"]?(?!.*(?:your|example|placeholder|changeme|xxxx|\\*\\*\\*|<|\\$\\{|process\\.env|env\\.|REDACTED))[A-Za-z0-9/_+=.-]{16,}/i,\n];\n\nexport function lineLooksSecret(line: string): boolean {\n return SECRET_PATTERNS.some((re) => re.test(line));\n}\n\nexport function diffContainsSecret(diffText: string): boolean {\n for (const line of diffText.split(\"\\n\")) {\n if (\n line.startsWith(\"+\") ||\n line.startsWith(\"-\") ||\n line.startsWith(\" \") ||\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\")\n ) {\n if (lineLooksSecret(line)) return true;\n }\n }\n return false;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Bounded diff collection — was the workflow's \"Collect bounded diff\" step */\n/* -------------------------------------------------------------------------- */\n\n/** ~600KB byte cap for the diff handed to the recap agent. */\nexport const RECAP_DIFF_BYTE_CAP = 614400;\n\n/** The footer appended when a diff is truncated at the byte cap. */\nexport const RECAP_DIFF_TRUNCATED_FOOTER =\n \"\\n\\n[diff truncated at 600KB for the recap agent]\\n\";\n\n/**\n * The pathspecs the bounded diff excludes — lockfiles, build output, and\n * snapshots are noise for a visual recap. Kept as array args (not a shell\n * string) so the `:(exclude)` pathspecs are never mangled by a shell.\n */\nconst RECAP_DIFF_PATHSPECS: string[] = [\n \".\",\n \":(exclude)pnpm-lock.yaml\",\n \":(exclude)**/dist/**\",\n \":(exclude)**/*.snap\",\n \":(exclude)**/*.lock\",\n];\n\n/**\n * Classify a bounded diff into the `huge` / `tiny` flags the workflow consumes.\n *\n * - huge: BYTES over the ~600KB cap. The agent is told to summarize AND the\n * diff file is physically truncated so it can't overflow the prompt budget.\n * - tiny: <= 1 changed file AND <= 8 changed lines. Uses ORIGINAL line count\n * (captured before any truncation) so a large diff is never misclassified as\n * tiny after the byte cap drops most of its lines.\n *\n * Pure (no I/O) so the classification can be unit-tested without invoking git.\n */\nexport function classifyDiff(input: {\n bytes: number;\n changed: number;\n originalLines: number;\n}): { huge: boolean; tiny: boolean } {\n return {\n huge: input.bytes > RECAP_DIFF_BYTE_CAP,\n tiny: input.changed <= 1 && input.originalLines <= 8,\n };\n}\n\n/**\n * Truncate a diff to the ~600KB byte cap at a COMPLETE LINE boundary, then\n * append the truncated footer. Dropping the last (possibly-partial) line is the\n * equivalent of the original `head -c 614400 | sed '$d'`: it guarantees the cap\n * never cuts a multi-byte UTF-8 char or a diff line mid-way and corrupts the\n * agent's input. Pure (string in, string out) so it can be unit-tested.\n */\nexport function truncateDiffAtLineBoundary(text: string): string {\n const capped = Buffer.from(text, \"utf8\")\n .subarray(0, RECAP_DIFF_BYTE_CAP)\n .toString(\"utf8\");\n const lastNewline = capped.lastIndexOf(\"\\n\");\n // Drop everything after the last newline (the last, possibly-partial line),\n // mirroring `sed '$d'`. If there is no newline at all, drop the whole partial\n // line (empty body) — the footer still makes the truncation explicit.\n const body = lastNewline >= 0 ? capped.slice(0, lastNewline) : \"\";\n return body + RECAP_DIFF_TRUNCATED_FOOTER;\n}\n\n/** Count lines that begin with `+` or `-` (added/removed diff lines). */\nexport function countDiffLines(diffText: string): number {\n let count = 0;\n for (const line of diffText.split(\"\\n\")) {\n if (line.startsWith(\"+\") || line.startsWith(\"-\")) count += 1;\n }\n return count;\n}\n\n/**\n * Run `git diff <base>...<head> -- <pathspecs>` and return its stdout. Tolerates\n * a non-zero git exit (the original step used `|| true`) by capturing stdout\n * regardless. Array args — NOT a shell string — so the `:(exclude)` pathspecs\n * survive intact.\n */\nfunction gitDiff(base: string, head: string, extraArgs: string[]): string {\n const args = [\n \"diff\",\n \"--no-color\",\n ...extraArgs,\n `${base}...${head}`,\n \"--\",\n ...RECAP_DIFF_PATHSPECS,\n ];\n try {\n return execFileSync(\"git\", args, {\n encoding: \"utf8\",\n maxBuffer: 256 * 1024 * 1024,\n });\n } catch (err: any) {\n // Tolerate a non-zero exit (e.g. missing object) but still use whatever git\n // wrote to stdout, exactly like the original `... > recap.diff || true`.\n if (err && typeof err.stdout === \"string\") return err.stdout;\n if (err && Buffer.isBuffer(err.stdout)) return err.stdout.toString(\"utf8\");\n return \"\";\n }\n}\n\n/**\n * `recap collect-diff` — the bounded-diff collection that used to be ~60 lines\n * of inline bash. Writes recap.diff + recap.stat, classifies huge/tiny, and\n * emits the same `bytes/changed/huge/tiny` outputs the workflow expects:\n * appended to $GITHUB_OUTPUT when set, AND printed as JSON to stdout (so it runs\n * and is testable outside GitHub Actions).\n */\nfunction runCollectDiff(args: Record<string, string | boolean>): void {\n const base = stringArg(args, \"base\");\n const head = stringArg(args, \"head\");\n const outPath = optionalArg(args, \"out\") ?? \"recap.diff\";\n const statPath = optionalArg(args, \"stat\") ?? \"recap.stat\";\n\n // The unified diff and the --stat summary (both excluding lockfiles/noise).\n let diff = gitDiff(base, head, []);\n const stat = gitDiff(base, head, [\"--stat\"]);\n fs.writeFileSync(path.resolve(statPath), stat);\n\n // ORIGINAL line count — captured BEFORE any byte-cap truncation so a large\n // diff is never misclassified as tiny after truncation.\n const originalLines = countDiffLines(diff);\n\n // Changed-file count from `--name-only` over the same excludes.\n const names = gitDiff(base, head, [\"--name-only\"]);\n const changed = names.split(\"\\n\").filter((line) => line.length > 0).length;\n\n // Write the (possibly truncated) diff and compute the on-disk byte length.\n const bytesBefore = Buffer.byteLength(diff, \"utf8\");\n const { huge } = classifyDiff({ bytes: bytesBefore, changed, originalLines });\n if (huge) diff = truncateDiffAtLineBoundary(diff);\n fs.writeFileSync(path.resolve(outPath), diff);\n const bytes = fs.statSync(path.resolve(outPath)).size;\n\n const { tiny } = classifyDiff({ bytes: bytesBefore, changed, originalLines });\n\n // Preserve the existing steps.diff.outputs.{bytes,changed,huge,tiny} contract.\n const githubOutput = process.env.GITHUB_OUTPUT;\n if (githubOutput) {\n fs.appendFileSync(\n githubOutput,\n `bytes=${bytes}\\nchanged=${changed}\\nhuge=${huge}\\ntiny=${tiny}\\n`,\n );\n }\n process.stdout.write(`${JSON.stringify({ bytes, changed, huge, tiny })}\\n`);\n}\n\n/* -------------------------------------------------------------------------- */\n/* MCP config writers — were the two `node -e` one-liners in the agent steps */\n/* -------------------------------------------------------------------------- */\n\n/**\n * The Claude Code MCP config the recap agent loads: a single HTTP `plan` server\n * pointing at the app's `/_agent-native/mcp` endpoint, authorized with the\n * PLAN_RECAP_TOKEN. Pure (returns the JSON string) so it can be unit-tested.\n */\nexport function buildRecapClaudeMcpConfig(\n appUrl: string,\n token: string | undefined,\n): string {\n const url = appUrl.replace(/\\/$/, \"\") + \"/_agent-native/mcp\";\n return JSON.stringify({\n mcpServers: {\n plan: {\n type: \"http\",\n url,\n headers: { Authorization: \"Bearer \" + token },\n },\n },\n });\n}\n\n/**\n * The Codex `config.toml` the recap agent loads. JSON.stringify the URL value so\n * a stray quote/newline in the app URL can't break out of the TOML basic string\n * (TOML shares JSON's escaping); the key and env-var name stay literal. Pure so\n * it can be unit-tested.\n */\nexport function buildRecapCodexMcpConfig(appUrl: string): string {\n const url = appUrl.replace(/\\/$/, \"\") + \"/_agent-native/mcp\";\n return (\n \"[mcp_servers.plan]\\n\" +\n \"url = \" +\n JSON.stringify(url) +\n \"\\n\" +\n 'bearer_token_env_var = \"PLAN_RECAP_TOKEN\"\\n'\n );\n}\n\n/**\n * `recap mcp-config` — write the plan MCP client config for the chosen backend,\n * replacing the two `node -e '...'` one-liners that previously lived inline in\n * the agent steps. PLAN_RECAP_TOKEN is read from the environment (claude only),\n * exactly as before.\n */\nfunction runMcpConfig(args: Record<string, string | boolean>): void {\n const agent = stringArg(args, \"agent\").toLowerCase();\n const appUrl = stringArg(args, \"app-url\");\n\n if (agent === \"claude\") {\n const out = stringArg(args, \"out\");\n fs.writeFileSync(\n path.resolve(out),\n buildRecapClaudeMcpConfig(appUrl, process.env.PLAN_RECAP_TOKEN),\n );\n process.stdout.write(`${JSON.stringify({ ok: true, agent, out })}\\n`);\n return;\n }\n\n if (agent === \"codex\") {\n const out =\n optionalArg(args, \"out\") ??\n path.join(os.homedir(), \".codex\", \"config.toml\");\n fs.mkdirSync(path.dirname(path.resolve(out)), { recursive: true });\n fs.writeFileSync(path.resolve(out), buildRecapCodexMcpConfig(appUrl));\n process.stdout.write(`${JSON.stringify({ ok: true, agent, out })}\\n`);\n return;\n }\n\n throw new Error(`Unknown --agent \"${agent}\" (expected \"claude\" or \"codex\")`);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Prompt builder — repo SKILL.md + task wrapper */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Locate the repo's visual-recap SKILL.md, preferring the host-agent install\n * locations so a user's `agent-native skills add` copy wins, then falling back\n * to the framework's own source locations.\n */\nexport function readRepoSkillMd(cwd: string = process.cwd()): {\n text: string;\n source: string;\n} {\n const candidates = [\n \".claude/skills/visual-recap/SKILL.md\",\n \".agents/skills/visual-recap/SKILL.md\",\n \"skills/visual-recap/SKILL.md\",\n \"templates/plan/.agents/skills/visual-recap/SKILL.md\",\n ];\n for (const rel of candidates) {\n const abs = path.resolve(cwd, rel);\n if (fs.existsSync(abs)) {\n return { text: fs.readFileSync(abs, \"utf8\"), source: rel };\n }\n }\n throw new Error(\n \"Could not find visual-recap/SKILL.md. Run `agent-native skills add visual-plan` first.\",\n );\n}\n\nexport function buildRecapPrompt(input: {\n skillMd: string;\n pr: string;\n repo?: string;\n head?: string;\n appUrl: string;\n diffPath: string;\n statPath?: string;\n prevPlanId?: string;\n huge?: boolean;\n localFiles?: boolean;\n localDir?: string;\n}): string {\n const appUrl = input.appUrl.replace(/\\/$/, \"\");\n const localDir =\n input.localDir ?? path.join(\"plans\", `pr-${input.pr}-visual-recap`);\n const lines: string[] = [];\n lines.push(\n input.localFiles\n ? \"# Task: create a DB-free local Visual Recap of this pull request\"\n : \"# Task: publish a Visual Recap of this pull request\",\n );\n lines.push(\"\");\n lines.push(\n input.localFiles\n ? `You are running non-interactively in local-files privacy mode. Follow the **visual-recap skill** included verbatim below to turn this PR's diff into a grounded Agent-Native Plan MDX folder, but do not publish it or call any Plan MCP/action write tool.`\n : `You are running non-interactively in CI. Follow the **visual-recap skill** included verbatim below to turn this PR's diff into a grounded Agent-Native Plan, then publish it.`,\n );\n lines.push(\"\");\n lines.push(\"## Inputs (read them from disk with your Read tool)\");\n lines.push(`- PR number: **#${input.pr}**`);\n if (input.repo) {\n lines.push(`- Repository: **${input.repo}**`);\n lines.push(\n `- Pull request URL: https://github.com/${input.repo}/pull/${input.pr}`,\n );\n }\n if (input.head) lines.push(`- Head commit: \\`${input.head}\\``);\n lines.push(`- Unified diff: \\`${input.diffPath}\\` (read this file)`);\n if (input.statPath)\n lines.push(`- Diff stat: \\`${input.statPath}\\` (read this file)`);\n if (input.huge) {\n lines.push(\n `- The diff is LARGE — produce a **summarized** recap (top files + schema/API deltas), not an exhaustive one.`,\n );\n }\n lines.push(\"\");\n if (input.localFiles) {\n lines.push(\n \"## Local-Files Output (this is the only way to produce output)\",\n );\n lines.push(\n \"Do NOT call the `plan` MCP server, `create-visual-recap`, `import-visual-plan-source`, `update-visual-plan`, `export-visual-plan`, or any hosted Plan action. This mode exists so the recap data never goes to a Plan app database.\",\n );\n lines.push(\n `1. Create or replace the local MDX folder \\`${localDir}\\` with \\`plan.mdx\\` and optional \\`canvas.mdx\\`, \\`prototype.mdx\\`, and \\`.plan-state.json\\` derived ONLY from the real diff. Set \\`kind: \"recap\"\\` and \\`localOnly: true\\` in source metadata/state.`,\n );\n lines.push(\n `2. Run \\`agent-native plan local preview --dir ${JSON.stringify(\n localDir,\n )} --kind recap --out ${JSON.stringify(\n path.join(localDir, \"preview.html\"),\n )}\\` to validate the folder and generate the local preview.`,\n );\n lines.push(\n \"3. Write the returned `url` from that command to `recap-url.txt` at the repo root, containing exactly one line. This file is the workflow's only hand-off.\",\n );\n } else {\n lines.push(\"## Publish (this is the only way to produce output)\");\n lines.push(\n `The \\`plan\\` MCP server is configured for you. Call its tools by name (your host may expose them as \\`create-visual-recap\\` or \\`mcp__plan__create-visual-recap\\` — same tool).`,\n );\n lines.push(\n `1. Call the **create-visual-recap** tool on the \\`plan\\` MCP server with grounded MDX derived ONLY from the real diff${\n input.prevPlanId\n ? `, passing \\`planId: \"${input.prevPlanId}\"\\` so this REPLACES the existing recap plan`\n : \"\"\n }.`,\n );\n lines.push(\n `2. Call the **set-resource-visibility** tool on the \\`plan\\` MCP server with \\`{ resourceType: \"plan\", resourceId: <the returned plan id>, visibility: \"org\" }\\` so the recap is login-gated to the org, never public.`,\n );\n lines.push(\n `3. Write the plan URL to a file named \\`recap-url.txt\\` at the repo root, containing exactly one line: \\`${appUrl}/recaps/<the returned plan id>\\`. This file is the workflow's only hand-off — do not print anything else as the deliverable.`,\n );\n }\n lines.push(\"\");\n lines.push(\n \"Do not invent file names, schema fields, or endpoints. Redact anything that looks like a secret. If the diff has no reviewable substance, still publish a minimal recap and write recap-url.txt.\",\n );\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"# visual-recap skill (follow this exactly)\");\n lines.push(\"\");\n lines.push(input.skillMd.trim());\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* GitHub comment helpers */\n/* -------------------------------------------------------------------------- */\n\nconst MARKER = \"<!-- pr-visual-recap -->\";\n\ntype GitHubComment = {\n id: number;\n body?: string | null;\n html_url?: string;\n user?: { type?: string | null } | null;\n};\n\nfunction repoParts(repoFullName: string): { owner: string; repo: string } {\n const [owner, repo] = repoFullName.split(\"/\");\n if (!owner || !repo) throw new Error(`Invalid --repo: ${repoFullName}`);\n return { owner, repo };\n}\n\nasync function githubRequest<T>(\n token: string,\n apiPath: string,\n init: RequestInit = {},\n): Promise<T> {\n const res = await fetch(`https://api.github.com${apiPath}`, {\n ...init,\n headers: {\n accept: \"application/vnd.github+json\",\n authorization: `Bearer ${token}`,\n \"x-github-api-version\": \"2022-11-28\",\n ...(init.headers ?? {}),\n },\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(\n `GitHub request failed ${res.status} ${res.statusText}: ${detail.slice(0, 500)}`,\n );\n }\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n}\n\nasync function findExistingComment(input: {\n token: string;\n owner: string;\n repo: string;\n issue: string;\n}): Promise<GitHubComment | null> {\n for (let page = 1; ; page += 1) {\n const comments = await githubRequest<GitHubComment[]>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/${encodeURIComponent(input.issue)}/comments?per_page=100&page=${page}`,\n );\n const match = comments.find(\n (comment) =>\n comment.user?.type === \"Bot\" &&\n typeof comment.body === \"string\" &&\n comment.body.includes(MARKER),\n );\n if (match) return match;\n if (comments.length < 100) return null;\n }\n}\n\nasync function upsertComment(input: {\n token: string;\n owner: string;\n repo: string;\n issue: string;\n body: string;\n /** When true, refresh an existing comment but never create a new one. */\n updateOnly?: boolean;\n}): Promise<{\n action: \"created\" | \"updated\" | \"skipped\";\n id: number;\n html_url?: string;\n}> {\n const body = input.body.includes(MARKER)\n ? input.body\n : `${MARKER}\\n${input.body}`;\n const existing = await findExistingComment(input);\n if (!existing && input.updateOnly) {\n // Nothing to refresh and we were told not to create — e.g. a tiny diff with\n // no prior recap. Stay silent rather than posting a \"skipped\" comment.\n return { action: \"skipped\", id: 0 };\n }\n if (existing) {\n const updated = await githubRequest<GitHubComment>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/comments/${existing.id}`,\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ body }),\n },\n );\n return { action: \"updated\", id: existing.id, html_url: updated.html_url };\n }\n const created = await githubRequest<GitHubComment>(\n input.token,\n `/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(\n input.repo,\n )}/issues/${encodeURIComponent(input.issue)}/comments`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ body }),\n },\n );\n return { action: \"created\", id: created.id, html_url: created.html_url };\n}\n\nfunction planIdFromUrl(url: string): string | null {\n // Accept both /recaps/<id> (the canonical recap route the agent now writes)\n // and /plans/<id> (legacy URLs) so the sticky-comment rebuild keeps working.\n const match = url.match(/\\/(?:recaps|plans)\\/([A-Za-z0-9_-]+)/);\n return match ? match[1] : null;\n}\n\n/** True when both URLs parse and share an origin. */\nfunction sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\n/** The origin of a URL, or \"\" if it doesn't parse. */\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return \"\";\n }\n}\n\n/** Build the sticky comment body from the workflow's environment. */\nexport function buildCommentBody(env: NodeJS.ProcessEnv = process.env): string {\n const headShort = (env.HEAD_SHA || \"\").slice(0, 7);\n const lines: string[] = [MARKER];\n\n if (env.SUPPRESSED === \"true\") {\n let reason = \"potential secret in diff\";\n try {\n const parsed = JSON.parse(env.SUPPRESSED_JSON || \"{}\");\n if (parsed && typeof parsed.reason === \"string\") reason = parsed.reason;\n } catch {\n /* keep default */\n }\n lines.push(\"### Visual recap — not generated\");\n lines.push(\"\");\n lines.push(\n \"The recap was **suppressed** because the diff matched a secret/credential pattern. No plan was published.\",\n );\n lines.push(\"\");\n lines.push(`Reason: \\`${reason}\\`. Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n // Tiny diffs aren't worth a recap. Refresh an existing sticky comment to this\n // state (the workflow only updates, never creates, on tiny) so it never lingers\n // pointing at a stale head SHA.\n if (env.DIFF_TINY === \"true\") {\n lines.push(\"### Visual recap — skipped (diff too small)\");\n lines.push(\"\");\n lines.push(\n \"The change in this push is too small to be worth a visual recap. This is informational only and does **not** block the PR.\",\n );\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n const planUrl = (env.PLAN_URL || \"\").trim();\n const appUrl = (env.PLAN_RECAP_APP_URL || \"\").trim();\n // recap-url.txt is agent-written → untrusted. Rebuild a canonical link from a\n // TRUSTED base (the configured PLAN_RECAP_APP_URL when set, else the parsed\n // origin of the plan URL) plus a strictly-validated plan id, instead of\n // embedding the raw URL. That both enforces the app origin and prevents\n // markdown injection — a same-origin URL with a crafted path/query could\n // otherwise break out of the markdown link.\n const planId = planUrl ? planIdFromUrl(planUrl) : null;\n const sameOriginOk = appUrl === \"\" || sameOrigin(planUrl, appUrl);\n const base = (appUrl || originOf(planUrl)).replace(/\\/$/, \"\");\n const safeUrl =\n planId && base && sameOriginOk ? `${base}/recaps/${planId}` : \"\";\n if (!safeUrl) {\n lines.push(\"### Visual recap — generation failed\");\n lines.push(\"\");\n lines.push(\n \"The visual recap could not be generated for this push. This is informational only and does **not** block the PR.\",\n );\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n return lines.join(\"\\n\");\n }\n\n // The image URL is produced by our own recap-image route, but validate it is\n // same-origin and matches the canonical hex-token path before embedding it, so\n // it likewise cannot inject markdown.\n const imageUrlRaw = (env.RECAP_IMAGE_URL || \"\").trim();\n const imageUrl =\n imageUrlRaw &&\n sameOrigin(imageUrlRaw, base) &&\n /\\/_agent-native\\/recap-image\\/[0-9a-f]+\\.png$/.test(imageUrlRaw)\n ? imageUrlRaw\n : \"\";\n lines.push(\"### Visual recap — review at a higher altitude\");\n lines.push(\"\");\n if (imageUrl) {\n lines.push(`[![Visual recap](${imageUrl})](${safeUrl})`);\n lines.push(\"\");\n }\n lines.push(`**[Open the interactive recap](${safeUrl})**`);\n if (env.DIFF_HUGE === \"true\") {\n lines.push(\"\");\n lines.push(\n \"> Large diff — this recap is a **summarized** view (top files + schema/API deltas).\",\n );\n }\n lines.push(\"\");\n lines.push(`Updated for \\`${headShort}\\`.`);\n lines.push(\"\");\n lines.push(`<!-- plan-id: ${planId} -->`);\n return lines.join(\"\\n\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Subcommands */\n/* -------------------------------------------------------------------------- */\n\nfunction runScan(args: Record<string, string | boolean>): void {\n const diffPath = stringArg(args, \"diff\");\n const diffText = fs.readFileSync(path.resolve(diffPath), \"utf8\");\n if (diffContainsSecret(diffText)) {\n process.stdout.write(\n `${JSON.stringify({ suppressed: true, reason: \"potential secret in diff\" })}\\n`,\n );\n } else {\n process.stdout.write(`${JSON.stringify({ suppressed: false })}\\n`);\n }\n}\n\nfunction runBuildPrompt(args: Record<string, string | boolean>): void {\n const skill = readRepoSkillMd();\n const prompt = buildRecapPrompt({\n skillMd: skill.text,\n pr: stringArg(args, \"pr\"),\n repo: optionalArg(args, \"repo\") ?? process.env.GITHUB_REPOSITORY,\n head: optionalArg(args, \"head\"),\n appUrl: optionalArg(args, \"app-url\") ?? \"https://plan.agent-native.com\",\n diffPath: optionalArg(args, \"diff\") ?? \"recap.diff\",\n statPath: optionalArg(args, \"stat\"),\n prevPlanId: optionalArg(args, \"prev-plan-id\"),\n huge: args.huge === true || args.huge === \"true\",\n localFiles: args[\"local-files\"] === true || args[\"local-files\"] === \"true\",\n localDir: optionalArg(args, \"local-dir\"),\n });\n const out = optionalArg(args, \"out\") ?? \"recap-prompt.md\";\n fs.writeFileSync(path.resolve(out), prompt);\n process.stdout.write(\n `${JSON.stringify({ ok: true, out, skillSource: skill.source, bytes: prompt.length })}\\n`,\n );\n}\n\n/** Upload a PNG to the plan app's signed public image route; returns its URL. */\nasync function uploadRecapImage(input: {\n appUrl: string;\n token: string;\n pngPath: string;\n}): Promise<string | null> {\n try {\n const base = input.appUrl.replace(/\\/$/, \"\");\n const bytes = fs.readFileSync(path.resolve(input.pngPath));\n const res = await fetch(`${base}/_agent-native/recap-image`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"image/png\",\n authorization: `Bearer ${input.token}`,\n },\n body: bytes,\n });\n // Surface failures on stderr — stdout carries the machine-readable JSON the\n // workflow parses, so it must stay clean. A silent null here is exactly what\n // made the missing-inline-thumbnail failure undebuggable from CI logs.\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n process.stderr.write(\n `[recap shot] image upload failed: ${res.status} ${res.statusText} ${detail.slice(0, 300)}\\n`,\n );\n return null;\n }\n const json = (await res.json().catch(() => null)) as {\n imageUrl?: string;\n } | null;\n if (!json?.imageUrl) {\n process.stderr.write(\n `[recap shot] image upload returned no imageUrl (status ${res.status})\\n`,\n );\n return null;\n }\n return json.imageUrl;\n } catch (err) {\n process.stderr.write(`[recap shot] image upload error: ${String(err)}\\n`);\n return null;\n }\n}\n\nasync function runShot(args: Record<string, string | boolean>): Promise<void> {\n const url = stringArg(args, \"url\");\n const out = optionalArg(args, \"out\") ?? \"recap.png\";\n const token = optionalArg(args, \"token\");\n const appUrl = optionalArg(args, \"app-url\");\n\n const done = (obj: Record<string, unknown>) => {\n process.stdout.write(`${JSON.stringify(obj)}\\n`);\n };\n\n // recap-url.txt is produced by the (LLM) agent, so the URL is untrusted. Only\n // forward the reusable publish token to the trusted plan-app origin — never to\n // an arbitrary URL — so a poisoned recap-url.txt can't exfiltrate the bearer\n // to an attacker-controlled domain.\n let attachToken = false;\n if (token) {\n try {\n attachToken = !!appUrl && new URL(url).origin === new URL(appUrl).origin;\n } catch {\n attachToken = false;\n }\n if (!attachToken) {\n done({\n ok: false,\n reason: appUrl\n ? `refusing to screenshot ${url}: origin does not match --app-url (${appUrl}); the publish token is only sent to the trusted plan app origin`\n : `refusing to attach the publish token without --app-url to validate ${url} against`,\n });\n return;\n }\n }\n\n let chromium: typeof import(\"playwright\").chromium | undefined;\n try {\n ({ chromium } = await import(\"playwright\"));\n } catch {\n try {\n ({ chromium } =\n (await import(\"@playwright/test\")) as unknown as typeof import(\"playwright\"));\n } catch (err) {\n done({ ok: false, reason: `playwright not available: ${String(err)}` });\n return;\n }\n }\n\n let captured = false;\n let browser: import(\"playwright\").Browser | undefined;\n const hardTimer = setTimeout(() => {\n done({ ok: false, reason: \"hard 60s timeout reached\" });\n process.exit(0);\n }, 60_000);\n try {\n browser = await chromium!.launch({ args: [\"--no-sandbox\"] });\n const context = await browser.newContext({\n viewport: { width: 1450, height: 1450 },\n deviceScaleFactor: 2,\n });\n if (attachToken) {\n // Attach the bearer ONLY to same-origin requests. Context-wide\n // extraHTTPHeaders would also send it to every cross-origin subresource\n // the plan page loads (CDN images/fonts/scripts), leaking the publish\n // token; routing scopes it to the trusted app origin.\n const appOrigin = new URL(appUrl as string).origin;\n await context.route(\"**/*\", async (route) => {\n const request = route.request();\n if (new URL(request.url()).origin === appOrigin) {\n await route.continue({\n headers: { ...request.headers(), authorization: `Bearer ${token}` },\n });\n } else {\n await route.continue();\n }\n });\n }\n const page = await context.newPage();\n await page.goto(url, { waitUntil: \"networkidle\", timeout: 45_000 });\n const selectors = [\n \"[data-plan-document]\",\n \"[data-plan-block]\",\n \"main article\",\n \"[data-testid='plan-document']\",\n \"main\",\n ];\n let matched = false;\n for (const sel of selectors) {\n try {\n await page.waitForSelector(sel, { timeout: 6_000, state: \"visible\" });\n matched = true;\n break;\n } catch {\n /* try the next selector */\n }\n }\n await page.waitForTimeout(matched ? 1_200 : 500);\n // Zoom out slightly so more content fits. Keep the plan title (h1) in frame:\n // the recap reads better led by its own title than cropped to the body.\n await page.evaluate(() => {\n (document.documentElement as HTMLElement).style.zoom = \"80%\";\n });\n await page.screenshot({ path: out });\n captured = true;\n await browser.close();\n } catch (err) {\n clearTimeout(hardTimer);\n try {\n if (browser) await browser.close();\n } catch {\n /* ignore */\n }\n done({\n ok: false,\n reason: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n clearTimeout(hardTimer);\n\n let imageUrl: string | null = null;\n if (captured && token && appUrl) {\n imageUrl = await uploadRecapImage({ appUrl, token, pngPath: out });\n }\n done({ ok: captured, out, imageUrl });\n}\n\nasync function runComment(\n args: Record<string, string | boolean>,\n sub: string,\n): Promise<void> {\n const token = stringArg(args, \"token\");\n const { owner, repo } = repoParts(stringArg(args, \"repo\"));\n const issue = stringArg(args, \"issue\");\n\n if (sub === \"find-plan-id\") {\n const existing = await findExistingComment({ token, owner, repo, issue });\n const body = existing?.body ?? \"\";\n const match = body.match(/<!--\\s*plan-id:\\s*([^\\s]+)\\s*-->/);\n process.stdout.write(match ? match[1] : \"\");\n return;\n }\n\n if (sub === \"upsert\") {\n const result = await upsertComment({\n token,\n owner,\n repo,\n issue,\n body: buildCommentBody(),\n updateOnly:\n args[\"update-only\"] === true || args[\"update-only\"] === \"true\",\n });\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n return;\n }\n\n throw new Error(\n \"Usage: agent-native recap comment <find-plan-id|upsert> --repo owner/name --issue n --token token\",\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Gate — the security boundary that decides whether the recap runs at all */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Minimal shape of the `pull_request` object from a GitHub `pull_request` event\n * payload that the gate inspects. Everything is optional so a malformed/partial\n * payload degrades to \"skip\" rather than throwing.\n */\nexport interface RecapGatePullRequest {\n number?: number;\n draft?: boolean;\n head?: { repo?: { full_name?: string | null } | null } | null;\n user?: { login?: string | null; type?: string | null } | null;\n}\n\nexport interface RecapGateInput {\n /** The `pull_request` payload object, or null when absent. */\n pr: RecapGatePullRequest | null;\n /** GITHUB_REPOSITORY (\"owner/name\"). */\n repository: string | undefined;\n /** PLAN_RECAP_TOKEN present. */\n hasPlan: boolean;\n /** ANTHROPIC_API_KEY present. */\n hasAnthropic: boolean;\n /** OPENAI_API_KEY present. */\n hasOpenai: boolean;\n /** Raw VISUAL_RECAP_AGENT value (may be undefined / mis-cased). */\n agentRaw: string | undefined;\n /** Raw VISUAL_RECAP_MODEL value (may be undefined). */\n model: string | undefined;\n /** Filenames changed by the PR (for the self-modifying guard). */\n changedFiles: string[];\n}\n\n/**\n * Files that, if a PR touches them, would let that PR rewrite what the trusted\n * recap job runs (the workflow itself, the skill, the local CLI, or any agent\n * config the runner loads) — so the whole job is skipped, not just the agent\n * step, to keep untrusted PR code away from the publish/API secrets.\n */\nexport function isRecapSensitivePath(p: string): boolean {\n return (\n p === \".github/workflows/pr-visual-recap.yml\" ||\n /(^|\\/)skills\\/visual-(recap|plan|plans)\\//.test(p) ||\n /(^|\\/)\\.claude\\//.test(p) ||\n /(^|\\/)CLAUDE\\.md$/.test(p) ||\n /(^|\\/)AGENTS\\.md$/.test(p) ||\n /(^|\\/)\\.mcp\\.json$/.test(p) ||\n /(^|\\/)packages\\/core\\//.test(p)\n );\n}\n\n/**\n * The pure gate decision: given the PR payload, secret-presence flags, the\n * configured backend/model, and the PR's changed files, decide whether the\n * visual recap should run, which (normalized) agent to use, and — when skipped —\n * the human-readable reasons. This is the security boundary; it replicates the\n * inline github-script gate bit-for-bit. No I/O so it can be unit-tested.\n */\nexport function evaluateRecapGate(input: RecapGateInput): {\n run: boolean;\n agent: string;\n reasons: string[];\n} {\n const { pr } = input;\n const reasons: string[] = [];\n\n if (!pr) reasons.push(\"no pull_request payload\");\n if (pr && pr.draft) reasons.push(\"draft PR\");\n\n // Fork PRs: head repo differs from this repo. Plain pull_request runs fork\n // code with NO secrets, so publishing would fail anyway — skip.\n const headRepo = pr && pr.head && pr.head.repo && pr.head.repo.full_name;\n if (pr && headRepo && headRepo !== input.repository) {\n reasons.push(`fork PR (${headRepo})`);\n }\n\n // Skip noisy automated authors.\n const login = ((pr && pr.user && pr.user.login) || \"\").toLowerCase();\n const botAuthors = [\n \"dependabot[bot]\",\n \"dependabot\",\n \"renovate[bot]\",\n \"renovate\",\n ];\n if (botAuthors.includes(login)) reasons.push(`bot author (${login})`);\n if (pr && pr.user && pr.user.type === \"Bot\")\n reasons.push(\"bot author (type=Bot)\");\n\n // Publish secret must be configured — otherwise this is a no-op so the\n // workflow can be merged before secrets exist.\n if (!input.hasPlan) reasons.push(\"PLAN_RECAP_TOKEN not configured\");\n\n // The chosen backend's API key must be present. Normalize the agent value once\n // here and validate it: an unknown or mis-cased value (e.g. \"Claude\", \"gpt\")\n // must NOT silently pass the gate and then match neither agent step.\n const agent = (input.agentRaw || \"claude\").toLowerCase();\n if (agent !== \"claude\" && agent !== \"codex\") {\n reasons.push(\n `unsupported VISUAL_RECAP_AGENT \"${input.agentRaw}\" (expected \"claude\" or \"codex\")`,\n );\n } else if (agent === \"codex\") {\n if (!input.hasOpenai)\n reasons.push(\"OPENAI_API_KEY not configured (codex backend)\");\n } else {\n if (!input.hasAnthropic)\n reasons.push(\"ANTHROPIC_API_KEY not configured (claude backend)\");\n }\n\n // Validate VISUAL_RECAP_MODEL if set — an unchecked value could be injected by\n // a repo settings writer and passed straight to the agent CLI.\n const model = input.model || \"\";\n if (model && !/^[a-zA-Z0-9._-]{1,80}$/.test(model)) {\n reasons.push(\n \"invalid VISUAL_RECAP_MODEL value (must match [a-zA-Z0-9._-]{1,80})\",\n );\n }\n\n // Self-modifying guard: if this PR changes the workflow, the\n // visual-recap/visual-plan skill, the local CLI (packages/core), or any agent\n // config the runner would load (.claude/**, CLAUDE.md, .mcp.json), skip the\n // ENTIRE job — not just the agent — so a PR can never rewrite what runs\n // (skill, hooks, settings, CLI) and exfiltrate the publish/API secrets.\n const hits = input.changedFiles.filter(isRecapSensitivePath);\n if (hits.length) {\n reasons.push(\n `PR modifies recap-control files (${hits.slice(0, 3).join(\", \")}${\n hits.length > 3 ? \", …\" : \"\"\n }) — skipping so untrusted PR code never runs with secrets`,\n );\n }\n\n return { run: reasons.length === 0, agent, reasons };\n}\n\n/**\n * Page through `GET /repos/{owner}/{repo}/pulls/{n}/files`, following the\n * `Link` rel=\"next\" header, and return every changed filename. Uses the same\n * api.github.com base + auth headers as `githubRequest`; reads the `Link`\n * header (which `githubRequest` discards) so it can paginate. Throws on any\n * non-2xx so the caller can fail CLOSED — exactly like the inline gate did when\n * `github.paginate(listFiles)` rejected.\n */\nasync function listPullRequestFiles(input: {\n token: string;\n owner: string;\n repo: string;\n pull: number;\n}): Promise<string[]> {\n const filenames: string[] = [];\n let url: string | null = `https://api.github.com/repos/${encodeURIComponent(\n input.owner,\n )}/${encodeURIComponent(input.repo)}/pulls/${input.pull}/files?per_page=100`;\n while (url) {\n const res = await fetch(url, {\n headers: {\n accept: \"application/vnd.github+json\",\n authorization: `Bearer ${input.token}`,\n \"x-github-api-version\": \"2022-11-28\",\n },\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(\n `GitHub request failed ${res.status} ${res.statusText}: ${detail.slice(0, 500)}`,\n );\n }\n const page = (await res.json()) as Array<{ filename?: string }>;\n for (const f of page) {\n if (typeof f.filename === \"string\") filenames.push(f.filename);\n }\n // Follow Link rel=\"next\" for the next page; absent => done.\n const link = res.headers.get(\"link\") || \"\";\n const next = link.match(/<([^>]+)>\\s*;\\s*rel=\"next\"/);\n url = next ? next[1] : null;\n }\n return filenames;\n}\n\n/**\n * `recap gate` — the I/O wrapper around `evaluateRecapGate`. Reads the PR\n * payload from GITHUB_EVENT_PATH, the secret-presence/agent/model signals from\n * the environment, and the PR's changed files from the GitHub REST API (paged,\n * with GH_TOKEN/GITHUB_TOKEN). Writes `run` + the normalized `agent` to\n * $GITHUB_OUTPUT and logs the run/skip summary. Fails CLOSED on any file-list\n * error so an untrusted PR can never run the agent with secrets.\n */\nasync function runGate(): Promise<void> {\n const repository = process.env.GITHUB_REPOSITORY;\n\n // Read the pull_request object out of the event payload, tolerating a\n // missing/unreadable file (degrades to the \"no pull_request payload\" reason).\n let pr: RecapGatePullRequest | null = null;\n const eventPath = process.env.GITHUB_EVENT_PATH;\n if (eventPath) {\n try {\n const payload = JSON.parse(fs.readFileSync(eventPath, \"utf8\"));\n pr = payload && payload.pull_request ? payload.pull_request : null;\n } catch {\n pr = null;\n }\n }\n\n // Fetch the PR's changed files for the self-modifying guard. Any error here is\n // turned into a skip reason (fail-closed), mirroring the inline gate's\n // try/catch around github.paginate(listFiles).\n const changedFiles: string[] = [];\n let fileListError: string | null = null;\n if (pr && typeof pr.number === \"number\" && repository) {\n const token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN || \"\";\n try {\n const { owner, repo } = repoParts(repository);\n const files = await listPullRequestFiles({\n token,\n owner,\n repo,\n pull: pr.number,\n });\n changedFiles.push(...files);\n } catch (e) {\n fileListError = e instanceof Error ? e.message : String(e);\n }\n }\n\n const decision = evaluateRecapGate({\n pr,\n repository,\n hasPlan: process.env.HAS_PLAN === \"true\",\n hasAnthropic: process.env.HAS_ANTHROPIC === \"true\",\n hasOpenai: process.env.HAS_OPENAI === \"true\",\n agentRaw: process.env.AGENT,\n model: process.env.VISUAL_RECAP_MODEL,\n changedFiles,\n });\n\n // If listing PR files failed, append the same fail-closed reason the inline\n // gate used and force run=false.\n let { run } = decision;\n const reasons = [...decision.reasons];\n if (fileListError !== null) {\n reasons.push(\n `could not list PR files for the self-modifying guard (${fileListError}); skipping to be safe`,\n );\n run = false;\n }\n\n // Preserve the github-script contract: write `run` + the NORMALIZED agent to\n // $GITHUB_OUTPUT so the recap job's step conditions match case-insensitively.\n const githubOutput = process.env.GITHUB_OUTPUT;\n if (githubOutput) {\n fs.appendFileSync(\n githubOutput,\n `run=${run ? \"true\" : \"false\"}\\nagent=${decision.agent}\\n`,\n );\n }\n // eslint-disable-next-line no-console\n console.log(\n run\n ? `Visual recap will run (${decision.agent}).`\n : `Visual recap skipped: ${reasons.join(\"; \")}`,\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Check run — the \"Visual Recap\" GitHub check (was two inline github-script */\n/* steps in the workflow's recap job). */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Canonicalize the agent-written plan URL into a trusted recap URL, or \"\".\n *\n * recap-url.txt is produced by the (LLM) agent, so the raw URL is untrusted.\n * This rebuilds a canonical `${origin}${base}/recaps/<id>` link from the TRUSTED\n * app URL plus a strictly-validated plan id, enforcing the app origin and\n * honoring a path-prefixed mount (e.g. https://host/agent-native). Returns \"\"\n * for a wrong origin or an unrecognized path. Pure so it can be unit-tested —\n * SAME impl as the workflow's previous inline `canonicalRecapUrl`.\n */\nexport function canonicalRecapUrl(rawUrl: string, appUrl: string): string {\n try {\n const parsed = new URL(rawUrl);\n const trusted = new URL(appUrl || \"https://plan.agent-native.com\");\n if (parsed.origin !== trusted.origin) return \"\";\n // Honor a path-prefixed mount (e.g. https://host/agent-native): strip the\n // trusted base path before matching /plans|recaps/<id>.\n const base = trusted.pathname.replace(/\\/$/, \"\");\n let rest = parsed.pathname;\n if (base && rest.startsWith(base)) rest = rest.slice(base.length);\n const match = rest.match(/^\\/(?:plans|recaps)\\/([A-Za-z0-9_-]+)\\/?$/);\n return match ? `${trusted.origin}${base}/recaps/${match[1]}` : \"\";\n } catch {\n return \"\";\n }\n}\n\n/** The signals that decide the completed \"Visual Recap\" check's conclusion. */\nexport interface RecapCheckOutcomeInput {\n /** steps.url.outputs.ok — the agent published a plan whose origin validated. */\n planOk: boolean;\n /** steps.url.outputs.plan_url — the (untrusted) agent-written plan URL. */\n planUrl: string;\n /** PLAN_RECAP_APP_URL — the trusted plan app origin/base. */\n appUrl: string;\n /** steps.diff.outputs.huge — the diff exceeded the byte cap (summarized). */\n huge: boolean;\n /** steps.diff.outputs.tiny — the diff was too small to recap. */\n tiny: boolean;\n /** steps.scan.outputs.suppressed — a secret pattern suppressed the recap. */\n suppressed: boolean;\n /** steps.scan.outputs.json — the raw scan JSON (carries the suppress reason). */\n suppressedJson: string;\n /** The Actions run URL, used as the default details_url. */\n workflowUrl: string;\n}\n\n/** The completed-check fields PATCHed to the GitHub check run. */\nexport interface RecapCheckOutcome {\n conclusion: \"neutral\" | \"success\" | \"skipped\";\n title: string;\n summary: string;\n text: string;\n detailsUrl: string;\n}\n\n/**\n * Map the workflow's terminal recap state to the completed check's\n * conclusion/title/summary/text/details_url. Pure so it can be unit-tested —\n * reproduces the workflow's previous inline branch logic EXACTLY:\n *\n * - default → neutral \"Visual recap not generated\"\n * - planOk + valid recapUrl → success \"Visual recap ready\" (huge → \"summarized\"\n * summary), Open-recap link as text, details_url = recapUrl\n * - planOk + invalid url → neutral \"Visual recap published\" (see the comment)\n * - else tiny → skipped \"Visual recap skipped\"\n * - else suppressed → skipped \"Visual recap suppressed\" (reason from scan JSON)\n */\nexport function recapCheckOutcome(\n input: RecapCheckOutcomeInput,\n): RecapCheckOutcome {\n let conclusion: RecapCheckOutcome[\"conclusion\"] = \"neutral\";\n let title = \"Visual recap not generated\";\n let summary =\n \"The visual recap did not produce a plan URL. This is informational only and does not block the PR.\";\n let text = \"\";\n let detailsUrl = input.workflowUrl;\n\n if (input.planOk) {\n const recapUrl = canonicalRecapUrl(input.planUrl, input.appUrl);\n if (recapUrl) {\n conclusion = \"success\";\n title = \"Visual recap ready\";\n summary = input.huge\n ? \"A summarized visual recap was generated for this large PR.\"\n : \"A visual code-review recap was generated for this PR.\";\n detailsUrl = recapUrl;\n text = `**[Open visual recap](${recapUrl})**`;\n } else {\n // Agent reported success but the URL didn't validate against the trusted\n // plan origin — don't claim \"not generated\"; the recap is linked in the\n // sticky comment.\n title = \"Visual recap published\";\n summary =\n \"A recap was published; see the visual recap comment on this PR for the link.\";\n }\n } else if (input.tiny) {\n conclusion = \"skipped\";\n title = \"Visual recap skipped\";\n summary = \"The diff is too small to need a visual recap.\";\n } else if (input.suppressed) {\n let reason = \"potential secret in diff\";\n try {\n const parsed = JSON.parse(input.suppressedJson || \"{}\");\n if (parsed && typeof parsed.reason === \"string\") reason = parsed.reason;\n } catch {\n // Keep the default reason.\n }\n conclusion = \"skipped\";\n title = \"Visual recap suppressed\";\n summary = `No recap was published because ${reason}.`;\n }\n\n return { conclusion, title, summary, text, detailsUrl };\n}\n\nfunction boolFlag(\n args: Record<string, string | boolean>,\n key: string,\n): boolean {\n return args[key] === true || args[key] === \"true\";\n}\n\n/**\n * `recap check start` — create the in-progress \"Visual Recap\" GitHub check run\n * and write its id to $GITHUB_OUTPUT (check_run_id). Best-effort: on any API\n * error, warn on stderr and exit 0 (don't fail the job) without emitting an id.\n * Replaces the workflow's inline \"Start visual recap check\" github-script step.\n */\nasync function runCheckStart(\n args: Record<string, string | boolean>,\n): Promise<void> {\n const repo = optionalArg(args, \"repo\") ?? process.env.GITHUB_REPOSITORY ?? \"\";\n const sha = optionalArg(args, \"sha\") ?? process.env.HEAD_SHA ?? \"\";\n const token =\n optionalArg(args, \"token\") ||\n process.env.GH_TOKEN ||\n process.env.GITHUB_TOKEN ||\n \"\";\n const workflowUrl = optionalArg(args, \"workflow-url\") ?? \"\";\n\n const emit = (id: string) => {\n const githubOutput = process.env.GITHUB_OUTPUT;\n if (githubOutput) {\n fs.appendFileSync(githubOutput, `check_run_id=${id}\\n`);\n }\n };\n\n try {\n const { owner, repo: name } = repoParts(repo);\n const created = await githubRequest<{ id: number }>(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(\n name,\n )}/check-runs`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n name: \"Visual Recap\",\n head_sha: sha,\n status: \"in_progress\",\n started_at: new Date().toISOString(),\n details_url: workflowUrl,\n output: {\n title: \"Visual recap in progress\",\n summary:\n \"Generating a visual code-review recap for this pull request.\",\n },\n }),\n },\n );\n emit(String(created.id));\n } catch (err) {\n process.stderr.write(\n `[recap check] could not create Visual Recap check run: ${String(err)}\\n`,\n );\n // Best-effort: don't fail the job and don't emit a check_run_id.\n }\n}\n\n/**\n * `recap check complete` — PATCH the \"Visual Recap\" check run to completed with\n * the computed conclusion/title/summary/text/details_url. Best-effort: on any\n * API error, warn on stderr and exit 0. Replaces the workflow's inline\n * \"Complete visual recap check\" github-script step.\n */\nasync function runCheckComplete(\n args: Record<string, string | boolean>,\n): Promise<void> {\n const repo = optionalArg(args, \"repo\") ?? process.env.GITHUB_REPOSITORY ?? \"\";\n const token =\n optionalArg(args, \"token\") ||\n process.env.GH_TOKEN ||\n process.env.GITHUB_TOKEN ||\n \"\";\n const checkRunId = optionalArg(args, \"check-run-id\") ?? \"\";\n\n const outcome = recapCheckOutcome({\n planOk: boolFlag(args, \"plan-ok\"),\n planUrl: optionalArg(args, \"plan-url\") ?? \"\",\n appUrl:\n optionalArg(args, \"app-url\") ?? process.env.PLAN_RECAP_APP_URL ?? \"\",\n huge: boolFlag(args, \"huge\"),\n tiny: boolFlag(args, \"tiny\"),\n suppressed: boolFlag(args, \"suppressed\"),\n suppressedJson: optionalArg(args, \"suppressed-json\") ?? \"\",\n workflowUrl: optionalArg(args, \"workflow-url\") ?? \"\",\n });\n\n try {\n const { owner, repo: name } = repoParts(repo);\n await githubRequest(\n token,\n `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(\n name,\n )}/check-runs/${encodeURIComponent(checkRunId)}`,\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n status: \"completed\",\n conclusion: outcome.conclusion,\n completed_at: new Date().toISOString(),\n details_url: outcome.detailsUrl,\n output: {\n title: outcome.title,\n summary: outcome.summary,\n text: outcome.text,\n },\n }),\n },\n );\n } catch (err) {\n process.stderr.write(\n `[recap check] could not update Visual Recap check run: ${String(err)}\\n`,\n );\n // Best-effort: don't fail the job.\n }\n}\n\n/** `recap check <start|complete>` dispatcher. */\nasync function runCheck(\n args: Record<string, string | boolean>,\n sub: string,\n): Promise<void> {\n if (sub === \"start\") {\n await runCheckStart(args);\n return;\n }\n if (sub === \"complete\") {\n await runCheckComplete(args);\n return;\n }\n throw new Error(\n \"Usage: agent-native recap check <start|complete> [flags] (see `recap help`)\",\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Usage capture — parse the agent's own token usage and attach it to the plan */\n/* -------------------------------------------------------------------------- */\n\ninterface ParsedUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n model?: string;\n reportedCostUsd?: number;\n}\n\n/** Parse the last top-level JSON object from a possibly-noisy stdout dump. */\nfunction parseLastJsonObject(text: string): Record<string, any> | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n /* fall through to line-by-line */\n }\n const lines = trimmed.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const line = lines[i].trim();\n if (!line.startsWith(\"{\")) continue;\n try {\n return JSON.parse(line);\n } catch {\n /* keep scanning earlier lines */\n }\n }\n return null;\n}\n\n/**\n * Claude Code `-p --output-format json` prints one final result object with a\n * `usage` block and `total_cost_usd`. Anthropic's `input_tokens` already\n * EXCLUDES cache tokens, so no normalization is needed here.\n */\nexport function parseClaudeUsage(stdout: string): ParsedUsage | null {\n const obj = parseLastJsonObject(stdout);\n const u = obj?.usage;\n if (!u) return null;\n const model =\n typeof obj?.model === \"string\"\n ? obj.model\n : obj?.modelUsage && typeof obj.modelUsage === \"object\"\n ? Object.keys(obj.modelUsage)[0]\n : undefined;\n return {\n inputTokens: Number(u.input_tokens ?? 0),\n outputTokens: Number(u.output_tokens ?? 0),\n cacheReadTokens: Number(u.cache_read_input_tokens ?? 0),\n cacheWriteTokens: Number(u.cache_creation_input_tokens ?? 0),\n model,\n reportedCostUsd:\n typeof obj?.total_cost_usd === \"number\" ? obj.total_cost_usd : undefined,\n };\n}\n\n/** Pull the last usage object out of a Codex `exec --json` JSONL stream. */\nfunction lastCodexUsage(jsonl: string): Record<string, any> | undefined {\n let last: Record<string, any> | undefined;\n for (const line of jsonl.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"{\")) continue;\n let obj: any;\n try {\n obj = JSON.parse(trimmed);\n } catch {\n continue;\n }\n // turn.completed carries `usage`; token_count events nest it under\n // `info.total_token_usage`. Accept whichever the pinned Codex emits.\n const u =\n obj?.usage ??\n obj?.turn?.usage ??\n obj?.msg?.usage ??\n obj?.info?.total_token_usage ??\n obj?.payload?.info?.total_token_usage;\n if (u && (u.input_tokens != null || u.total_tokens != null)) last = u;\n }\n return last;\n}\n\n/**\n * Codex `exec --json` reports `input_tokens` INCLUSIVE of `cached_input_tokens`\n * (OpenAI counts cached as a subset of prompt tokens) and bills\n * `reasoning_output_tokens` separately. Normalize to the cache-exclusive shape\n * `calculateCost` expects: strip cached out of input, fold reasoning into\n * output. Without this, cached tokens are billed twice and reasoning is dropped.\n */\nexport function parseCodexUsage(jsonl: string): ParsedUsage | null {\n const u = lastCodexUsage(jsonl);\n if (!u) return null;\n const cached = Number(u.cached_input_tokens ?? 0);\n const input = Number(u.input_tokens ?? 0) - cached;\n return {\n inputTokens: Math.max(0, input),\n outputTokens:\n Number(u.output_tokens ?? 0) + Number(u.reasoning_output_tokens ?? 0),\n cacheReadTokens: cached,\n cacheWriteTokens: 0, // Codex has no separate cache-write token charge\n model: typeof u.model === \"string\" ? u.model : undefined,\n };\n}\n\n/**\n * `recap usage` — parse the agent's run output for token usage and POST it to\n * the plan app's record-recap-usage action so the recap row carries cost. The\n * publish token is only ever sent to the trusted --app-url origin (the plan id\n * is parsed from the untrusted agent-written plan URL but never forwarded).\n */\nasync function runUsage(args: Record<string, string | boolean>): Promise<void> {\n const done = (obj: Record<string, unknown>) =>\n process.stdout.write(`${JSON.stringify(obj)}\\n`);\n\n const planUrl = stringArg(args, \"plan-url\");\n const planId = planIdFromUrl(planUrl);\n const agent = (optionalArg(args, \"agent\") ?? \"claude\").toLowerCase();\n const appUrl = optionalArg(args, \"app-url\");\n const token = optionalArg(args, \"token\");\n\n if (!planId) {\n done({ ok: false, reason: `could not parse plan id from ${planUrl}` });\n return;\n }\n if (!appUrl || !token) {\n done({ ok: false, reason: \"missing --app-url or --token\" });\n return;\n }\n\n let parsed: ParsedUsage | null = null;\n try {\n const raw = fs.readFileSync(\n path.resolve(stringArg(args, \"result-file\")),\n \"utf8\",\n );\n parsed = agent === \"codex\" ? parseCodexUsage(raw) : parseClaudeUsage(raw);\n } catch (err) {\n done({ ok: false, reason: `could not read/parse usage: ${String(err)}` });\n return;\n }\n if (!parsed) {\n done({ ok: false, reason: \"no usage found in agent output\" });\n return;\n }\n\n // The Claude result carries the model; Codex usually does not, so fall back to\n // the pinned --model (VISUAL_RECAP_MODEL) and finally the documented default.\n const model =\n parsed.model ??\n optionalArg(args, \"model\") ??\n (agent === \"codex\" ? \"gpt-5.5\" : \"claude\");\n const body: Record<string, unknown> = {\n planId,\n ...(agent === \"codex\" || agent === \"claude\" ? { agent } : {}),\n model,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n cacheReadTokens: parsed.cacheReadTokens,\n cacheWriteTokens: parsed.cacheWriteTokens,\n ...(parsed.reportedCostUsd != null\n ? { reportedCostUsd: parsed.reportedCostUsd }\n : {}),\n };\n\n try {\n const base = appUrl.replace(/\\/$/, \"\");\n const res = await fetch(\n `${base}/_agent-native/actions/record-recap-usage`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n },\n );\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n done({\n ok: false,\n reason: `record-recap-usage failed ${res.status}: ${detail.slice(0, 300)}`,\n });\n return;\n }\n done({ ok: true, planId, ...body });\n } catch (err) {\n done({ ok: false, reason: `record-recap-usage error: ${String(err)}` });\n }\n}\n\nconst HELP = `agent-native recap — PR visual recap helpers (used by the GitHub Action)\n\nUsage:\n agent-native recap collect-diff --base <baseSha> --head <headSha> [--out recap.diff] [--stat recap.stat]\n agent-native recap mcp-config --agent claude|codex --app-url <url> [--out <path>]\n agent-native recap scan --diff <path>\n agent-native recap build-prompt --pr <n> [--repo owner/name] [--head <sha>] [--app-url <url>] [--diff <path>] [--stat <path>] [--prev-plan-id <id>] [--huge] [--local-files] [--local-dir <folder>] [--out <path>]\n agent-native recap shot --url <planUrl> [--token <planToken>] [--app-url <url>] [--out recap.png]\n agent-native recap usage --plan-url <planUrl> --result-file <path> --app-url <url> --token <planToken> [--agent claude|codex] [--model <id>]\n agent-native recap comment <find-plan-id|upsert> --repo owner/name --issue <n> --token <github-token>\n agent-native recap check start [--repo owner/name] [--sha <headSha>] [--token <github-token>] [--workflow-url <url>]\n Create the in-progress \"Visual Recap\" GitHub check run and write its id to\n $GITHUB_OUTPUT (check_run_id). repo/sha/token default to GITHUB_REPOSITORY /\n HEAD_SHA / GH_TOKEN (or GITHUB_TOKEN). Best-effort: warns and exits 0 on any\n API error without emitting an id.\n agent-native recap check complete --check-run-id <id> [--repo owner/name] [--token <github-token>] [--plan-ok <bool>] [--plan-url <url>] [--app-url <url>] [--suppressed <bool>] [--suppressed-json <json>] [--huge <bool>] [--tiny <bool>] [--workflow-url <url>]\n Mark the \"Visual Recap\" check run completed with a computed\n conclusion/title/summary/text/details_url (success when the agent published a\n plan whose URL validates against --app-url; neutral/skipped otherwise).\n repo/token/app-url default to GITHUB_REPOSITORY / GH_TOKEN / PLAN_RECAP_APP_URL.\n Best-effort: warns and exits 0 on any API error.\n agent-native recap gate\n The PR Visual Recap security gate. Decides whether to run the recap at all\n and which (normalized) backend agent to use. Reads the pull_request payload\n from $GITHUB_EVENT_PATH, the secret-presence/agent/model signals from the\n environment (HAS_PLAN / HAS_ANTHROPIC / HAS_OPENAI === 'true', AGENT,\n VISUAL_RECAP_MODEL), the repo from $GITHUB_REPOSITORY, and the PR's changed\n files from the GitHub REST API (paged, with GH_TOKEN/GITHUB_TOKEN). Skips\n drafts, forks, bot authors, the missing-secret case, an invalid agent/model,\n and any PR that touches recap-control files (the workflow, the skill,\n packages/core, .claude/**, CLAUDE.md, AGENTS.md, .mcp.json) — failing CLOSED\n on any file-list error. Writes run=<true|false> and agent=<claude|codex> to\n $GITHUB_OUTPUT.\n`;\n\nexport async function runRecap(argv: string[]): Promise<void> {\n const [sub, ...rest] = argv;\n const args = parseArgs(rest);\n switch (sub) {\n case \"collect-diff\":\n runCollectDiff(args);\n return;\n case \"mcp-config\":\n runMcpConfig(args);\n return;\n case \"scan\":\n runScan(args);\n return;\n case \"build-prompt\":\n runBuildPrompt(args);\n return;\n case \"shot\":\n await runShot(args);\n return;\n case \"usage\":\n await runUsage(args);\n return;\n case \"comment\":\n await runComment(parseArgs(rest.slice(1)), rest[0] ?? \"\");\n return;\n case \"check\":\n await runCheck(parseArgs(rest.slice(1)), rest[0] ?? \"\");\n return;\n case \"gate\":\n await runGate();\n return;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n process.stdout.write(HELP);\n return;\n default:\n process.stderr.write(`Unknown recap subcommand: ${sub}\\n${HELP}`);\n process.exit(1);\n }\n}\n"]}