@agent-native/core 0.40.2 → 0.41.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 (136) hide show
  1. package/README.md +11 -1
  2. package/dist/cli/index.js +16 -0
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/pr-visual-recap-workflow.d.ts +11 -0
  5. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -0
  6. package/dist/cli/pr-visual-recap-workflow.js +11 -0
  7. package/dist/cli/pr-visual-recap-workflow.js.map +1 -0
  8. package/dist/cli/recap.d.ts +52 -0
  9. package/dist/cli/recap.d.ts.map +1 -0
  10. package/dist/cli/recap.js +581 -0
  11. package/dist/cli/recap.js.map +1 -0
  12. package/dist/cli/skills.d.ts +17 -4
  13. package/dist/cli/skills.d.ts.map +1 -1
  14. package/dist/cli/skills.js +60 -16
  15. package/dist/cli/skills.js.map +1 -1
  16. package/dist/cli/templates-meta.js +1 -1
  17. package/dist/cli/templates-meta.js.map +1 -1
  18. package/dist/client/blocks/index.d.ts +3 -0
  19. package/dist/client/blocks/index.d.ts.map +1 -1
  20. package/dist/client/blocks/index.js +3 -0
  21. package/dist/client/blocks/index.js.map +1 -1
  22. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +6 -0
  23. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -0
  24. package/dist/client/blocks/library/AnnotatedCodeBlock.js +134 -0
  25. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -0
  26. package/dist/client/blocks/library/HighlightedCode.d.ts +21 -1
  27. package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
  28. package/dist/client/blocks/library/HighlightedCode.js +86 -4
  29. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  30. package/dist/client/blocks/library/annotated-code.config.d.ts +58 -0
  31. package/dist/client/blocks/library/annotated-code.config.d.ts.map +1 -0
  32. package/dist/client/blocks/library/annotated-code.config.js +53 -0
  33. package/dist/client/blocks/library/annotated-code.config.js.map +1 -0
  34. package/dist/client/blocks/library/checklist.js +2 -2
  35. package/dist/client/blocks/library/checklist.js.map +1 -1
  36. package/dist/client/blocks/library/code-highlight.d.ts +16 -0
  37. package/dist/client/blocks/library/code-highlight.d.ts.map +1 -0
  38. package/dist/client/blocks/library/code-highlight.js +160 -0
  39. package/dist/client/blocks/library/code-highlight.js.map +1 -0
  40. package/dist/client/blocks/library/code-tabs.config.d.ts +6 -0
  41. package/dist/client/blocks/library/code-tabs.config.d.ts.map +1 -1
  42. package/dist/client/blocks/library/code-tabs.config.js +1 -0
  43. package/dist/client/blocks/library/code-tabs.config.js.map +1 -1
  44. package/dist/client/blocks/library/code-tabs.d.ts.map +1 -1
  45. package/dist/client/blocks/library/code-tabs.js +35 -5
  46. package/dist/client/blocks/library/code-tabs.js.map +1 -1
  47. package/dist/client/blocks/library/code.config.d.ts +43 -0
  48. package/dist/client/blocks/library/code.config.d.ts.map +1 -0
  49. package/dist/client/blocks/library/code.config.js +34 -0
  50. package/dist/client/blocks/library/code.config.js.map +1 -0
  51. package/dist/client/blocks/library/code.d.ts +3 -0
  52. package/dist/client/blocks/library/code.d.ts.map +1 -0
  53. package/dist/client/blocks/library/code.js +95 -0
  54. package/dist/client/blocks/library/code.js.map +1 -0
  55. package/dist/client/blocks/library/dev-doc-ui.d.ts +2 -1
  56. package/dist/client/blocks/library/dev-doc-ui.d.ts.map +1 -1
  57. package/dist/client/blocks/library/dev-doc-ui.js +2 -1
  58. package/dist/client/blocks/library/dev-doc-ui.js.map +1 -1
  59. package/dist/client/blocks/library/server-specs.d.ts.map +1 -1
  60. package/dist/client/blocks/library/server-specs.js +21 -0
  61. package/dist/client/blocks/library/server-specs.js.map +1 -1
  62. package/dist/client/blocks/library/specs.d.ts +1 -1
  63. package/dist/client/blocks/library/specs.d.ts.map +1 -1
  64. package/dist/client/blocks/library/specs.js +30 -2
  65. package/dist/client/blocks/library/specs.js.map +1 -1
  66. package/dist/client/blocks/server.d.ts +1 -0
  67. package/dist/client/blocks/server.d.ts.map +1 -1
  68. package/dist/client/blocks/server.js +1 -0
  69. package/dist/client/blocks/server.js.map +1 -1
  70. package/dist/client/blocks/types.d.ts +1 -1
  71. package/dist/client/blocks/types.js.map +1 -1
  72. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  73. package/dist/client/extensions/ExtensionsListPage.js +28 -13
  74. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  75. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  76. package/dist/client/extensions/ExtensionsSidebarSection.js +31 -9
  77. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  78. package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts +49 -0
  79. package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +1 -0
  80. package/dist/client/rich-markdown-editor/CodeBlockNode.js +126 -0
  81. package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +1 -0
  82. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  83. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +26 -3
  84. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  85. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +1 -1
  86. package/dist/client/rich-markdown-editor/extensions.d.ts.map +1 -1
  87. package/dist/client/rich-markdown-editor/extensions.js +8 -8
  88. package/dist/client/rich-markdown-editor/extensions.js.map +1 -1
  89. package/dist/client/rich-markdown-editor/index.d.ts +1 -0
  90. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
  91. package/dist/client/rich-markdown-editor/index.js +1 -0
  92. package/dist/client/rich-markdown-editor/index.js.map +1 -1
  93. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts.map +1 -1
  94. package/dist/client/rich-markdown-editor/registrySlashCommands.js +1 -0
  95. package/dist/client/rich-markdown-editor/registrySlashCommands.js.map +1 -1
  96. package/dist/extensions/actions.d.ts.map +1 -1
  97. package/dist/extensions/actions.js +63 -2
  98. package/dist/extensions/actions.js.map +1 -1
  99. package/dist/extensions/routes.d.ts.map +1 -1
  100. package/dist/extensions/routes.js +24 -3
  101. package/dist/extensions/routes.js.map +1 -1
  102. package/dist/extensions/schema.d.ts +43 -2
  103. package/dist/extensions/schema.d.ts.map +1 -1
  104. package/dist/extensions/schema.js +12 -0
  105. package/dist/extensions/schema.js.map +1 -1
  106. package/dist/extensions/store.d.ts +20 -0
  107. package/dist/extensions/store.d.ts.map +1 -1
  108. package/dist/extensions/store.js +82 -3
  109. package/dist/extensions/store.js.map +1 -1
  110. package/dist/server/auth.d.ts.map +1 -1
  111. package/dist/server/auth.js +13 -0
  112. package/dist/server/auth.js.map +1 -1
  113. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  114. package/dist/server/core-routes-plugin.js +11 -0
  115. package/dist/server/core-routes-plugin.js.map +1 -1
  116. package/dist/server/recap-image-route.d.ts +8 -0
  117. package/dist/server/recap-image-route.d.ts.map +1 -0
  118. package/dist/server/recap-image-route.js +200 -0
  119. package/dist/server/recap-image-route.js.map +1 -0
  120. package/dist/server/recap-image-store.d.ts +41 -0
  121. package/dist/server/recap-image-store.d.ts.map +1 -0
  122. package/dist/server/recap-image-store.js +138 -0
  123. package/dist/server/recap-image-store.js.map +1 -0
  124. package/dist/styles/rich-markdown-editor.css +66 -17
  125. package/docs/content/cloneable-saas.md +10 -0
  126. package/docs/content/external-agents.md +4 -7
  127. package/docs/content/faq.md +10 -0
  128. package/docs/content/getting-started.md +11 -0
  129. package/docs/content/pr-visual-recap.md +103 -0
  130. package/docs/content/skills-guide.md +1 -3
  131. package/docs/content/template-assets.md +1 -4
  132. package/docs/content/template-design.md +0 -57
  133. package/docs/content/template-plan.md +22 -18
  134. package/docs/content/visual-plans.md +10 -7
  135. package/docs/content/what-is-agent-native.md +2 -0
  136. package/package.json +1 -1
@@ -0,0 +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}/plans/<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 const match = url.match(/\\/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 aid =\n \"_A visual recap is an aid, not a replacement for reviewing the diff._\";\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 lines.push(\"\");\n lines.push(aid);\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 lines.push(\"\");\n lines.push(aid);\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}/plans/${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 lines.push(\"\");\n lines.push(aid);\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}\\`. ${aid}`);\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 if (!res.ok) return null;\n const json = (await res.json().catch(() => null)) as {\n imageUrl?: string;\n } | null;\n return json?.imageUrl ?? null;\n } catch {\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: 1280, height: 900 },\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 await page.screenshot({ path: out, fullPage: true });\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\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 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 \"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"]}