@agent-native/core 0.100.2 → 0.101.3

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 (388) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +83 -0
  3. package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +48 -30
  4. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +7 -0
  5. package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +48 -30
  6. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +7 -0
  7. package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +48 -30
  8. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +14 -0
  9. package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +48 -30
  10. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +7 -0
  11. package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +48 -30
  12. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +7 -0
  13. package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +48 -30
  14. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +7 -0
  15. package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +48 -30
  16. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +7 -0
  17. package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +48 -30
  18. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +14 -0
  19. package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +48 -30
  20. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +7 -0
  21. package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +48 -30
  22. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +7 -0
  23. package/corpus/core/docs/content/pr-visual-recap.mdx +50 -32
  24. package/corpus/core/docs/content/template-plan.mdx +14 -0
  25. package/corpus/core/docs/content/toolkit-comments-review.mdx +16 -2
  26. package/corpus/core/package.json +4 -1
  27. package/corpus/core/src/a2a/index.ts +2 -1
  28. package/corpus/core/src/a2a/server.ts +34 -9
  29. package/corpus/core/src/agent/production-agent.ts +56 -10
  30. package/corpus/core/src/cli/create.ts +47 -19
  31. package/corpus/core/src/cli/pr-visual-recap-workflow.ts +2 -3
  32. package/corpus/core/src/cli/recap.ts +3 -4932
  33. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +6 -4
  34. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +7 -1
  35. package/corpus/core/src/client/AgentPanel.tsx +19 -17
  36. package/corpus/core/src/client/analytics.ts +8 -1
  37. package/corpus/core/src/client/chat/markdown-renderer.tsx +54 -8
  38. package/corpus/core/src/client/chat/message-components.tsx +8 -2
  39. package/corpus/core/src/client/clipboard.ts +28 -1
  40. package/corpus/core/src/client/guided-questions.tsx +4 -0
  41. package/corpus/core/src/client/i18n.tsx +2 -1
  42. package/corpus/core/src/client/index.ts +4 -0
  43. package/corpus/core/src/client/review/ReviewCommentComposer.tsx +108 -0
  44. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +482 -150
  45. package/corpus/core/src/client/review/index.ts +8 -0
  46. package/corpus/core/src/client/review/use-review.ts +35 -1
  47. package/corpus/core/src/client/use-agent-chat-context.ts +3 -2
  48. package/corpus/core/src/credentials/index.ts +41 -8
  49. package/corpus/core/src/extensions/fetch-tool.ts +33 -3
  50. package/corpus/core/src/notifications/channels.ts +20 -6
  51. package/corpus/core/src/review/actions/create-review-comment.ts +2 -1
  52. package/corpus/core/src/review/actions/get-review-feedback.ts +6 -11
  53. package/corpus/core/src/review/actions/list-review-comments.ts +38 -4
  54. package/corpus/core/src/review/actions/reply-review-comment.ts +33 -22
  55. package/corpus/core/src/review/actions/resolve-review-thread.ts +29 -2
  56. package/corpus/core/src/review/actions/send-review-thread-to-agent.ts +62 -0
  57. package/corpus/core/src/review/identity.ts +101 -0
  58. package/corpus/core/src/review/index.ts +14 -0
  59. package/corpus/core/src/review/store.ts +315 -8
  60. package/corpus/core/src/review/types.ts +4 -0
  61. package/corpus/core/src/secrets/crypto.ts +26 -10
  62. package/corpus/core/src/secrets/storage.ts +16 -3
  63. package/corpus/core/src/server/action-discovery.ts +4 -0
  64. package/corpus/core/src/server/action-routes.ts +125 -4
  65. package/corpus/core/src/server/agent-chat/plugin-options.ts +16 -0
  66. package/corpus/core/src/server/agent-chat-plugin.ts +61 -7
  67. package/corpus/core/src/server/derived-secret.ts +5 -1
  68. package/corpus/core/src/server/index.ts +8 -0
  69. package/corpus/core/src/vite/action-types-plugin.ts +4 -0
  70. package/corpus/templates/analytics/changelog/2026-07-14-daily-dashboard-email-captures-authenticate-with-a-sessi.md +6 -0
  71. package/corpus/templates/analytics/changelog/2026-07-14-long-running-cross-app-analyses-now-continue-reliably-in-the.md +6 -0
  72. package/corpus/templates/analytics/server/lib/dashboard-report.ts +156 -3
  73. package/corpus/templates/analytics/server/plugins/agent-chat.ts +8 -4
  74. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +402 -142
  75. package/corpus/templates/assets/app/i18n/zh-TW.ts +1 -0
  76. package/corpus/templates/assets/app/i18n-data.ts +1 -0
  77. package/corpus/templates/assets/app/routes/library.tsx +187 -48
  78. package/corpus/templates/assets/changelog/2026-07-13-merged-the-candidates-panel-into-the-library-as-a-drafts-tab.md +6 -0
  79. package/corpus/templates/chat/app/lib/agent-page.tsx +40 -0
  80. package/corpus/templates/chat/app/routes/agent.tsx +5 -3
  81. package/corpus/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  82. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +5 -0
  83. package/corpus/templates/clips/AGENTS.md +4 -0
  84. package/corpus/templates/clips/actions/get-feature-flags.ts +30 -0
  85. package/corpus/templates/clips/actions/lib/transcript-preview.ts +48 -0
  86. package/corpus/templates/clips/actions/request-transcript.ts +41 -1
  87. package/corpus/templates/clips/actions/view-screen.ts +5 -9
  88. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  89. package/corpus/templates/clips/app/components/player/share-dialog.tsx +44 -81
  90. package/corpus/templates/clips/app/components/player/video-player.tsx +39 -1
  91. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +6 -12
  92. package/corpus/templates/clips/app/hooks/use-mse-video-source.ts +146 -0
  93. package/corpus/templates/clips/app/i18n/ar-SA.ts +0 -8
  94. package/corpus/templates/clips/app/i18n/de-DE.ts +0 -9
  95. package/corpus/templates/clips/app/i18n/en-US.ts +0 -8
  96. package/corpus/templates/clips/app/i18n/es-ES.ts +0 -9
  97. package/corpus/templates/clips/app/i18n/fr-FR.ts +0 -9
  98. package/corpus/templates/clips/app/i18n/hi-IN.ts +0 -8
  99. package/corpus/templates/clips/app/i18n/ja-JP.ts +0 -9
  100. package/corpus/templates/clips/app/i18n/ko-KR.ts +0 -9
  101. package/corpus/templates/clips/app/i18n/pt-BR.ts +0 -9
  102. package/corpus/templates/clips/app/i18n/zh-CN.ts +0 -7
  103. package/corpus/templates/clips/app/i18n/zh-TW.ts +0 -7
  104. package/corpus/templates/clips/app/lib/capture-install-options.ts +21 -0
  105. package/corpus/templates/clips/app/lib/fmp4.ts +271 -0
  106. package/corpus/templates/clips/app/lib/mse-video-loader.ts +585 -0
  107. package/corpus/templates/clips/app/routes/_app.dictate.tsx +0 -4
  108. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +5 -13
  109. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +2 -37
  110. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  111. package/corpus/templates/clips/changelog/2026-07-10-shared-clips-now-start-playing-instantly-instead-of-showing-.md +6 -0
  112. package/corpus/templates/clips/changelog/2026-07-14-clips-now-distinguishes-transcript-previews-from-incomplete-.md +6 -0
  113. package/corpus/templates/clips/changelog/2026-07-14-desktop-app-prompts-stay-hidden-after-you-download-the-insta.md +6 -0
  114. package/corpus/templates/clips/changelog/2026-07-14-share-dialogs-show-separate-links-for-people-and-agents.md +6 -0
  115. package/corpus/templates/clips/desktop/src/lib/recorder.ts +5 -0
  116. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -0
  117. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -0
  118. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +2518 -0
  119. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +353 -0
  120. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +558 -67
  121. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +11 -1
  122. package/corpus/templates/clips/desktop/src-tauri/src/remote_flags.rs +188 -0
  123. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +1 -1
  124. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +1 -0
  125. package/corpus/templates/clips/server/plugins/agent-chat.ts +5 -0
  126. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +5 -1
  127. package/corpus/templates/clips/shared/feature-flags.ts +41 -0
  128. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +3 -0
  129. package/corpus/templates/design/.agents/skills/design-review-feedback/SKILL.md +42 -0
  130. package/corpus/templates/design/AGENTS.md +6 -0
  131. package/corpus/templates/design/README.md +1 -0
  132. package/corpus/templates/design/actions/navigate.ts +4 -4
  133. package/corpus/templates/design/actions/view-screen.ts +116 -2
  134. package/corpus/templates/design/agent-native.app-skill.json +5 -0
  135. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +52 -59
  136. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +13 -9
  137. package/corpus/templates/design/app/components/design/EditPanel.tsx +79 -11
  138. package/corpus/templates/design/app/components/design/LayersPanel.tsx +78 -65
  139. package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +161 -0
  140. package/corpus/templates/design/app/components/design/ReviewStatusControl.tsx +96 -0
  141. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +166 -0
  142. package/corpus/templates/design/app/components/layout/Layout.tsx +1 -0
  143. package/corpus/templates/design/app/components/visual-editor/ReviewCanvasPins.tsx +1077 -0
  144. package/corpus/templates/design/app/components/visual-editor/index.ts +1 -0
  145. package/corpus/templates/design/app/components/visual-editor/review-canvas-state.ts +42 -0
  146. package/corpus/templates/design/app/hooks/use-design-systems.ts +2 -2
  147. package/corpus/templates/design/app/hooks/use-navigation-state.ts +9 -6
  148. package/corpus/templates/design/app/hooks/use-question-flow.ts +7 -1
  149. package/corpus/templates/design/app/i18n/ar-SA.ts +56 -1
  150. package/corpus/templates/design/app/i18n/de-DE.ts +57 -1
  151. package/corpus/templates/design/app/i18n/en-US.ts +56 -1
  152. package/corpus/templates/design/app/i18n/es-ES.ts +56 -1
  153. package/corpus/templates/design/app/i18n/fr-FR.ts +57 -1
  154. package/corpus/templates/design/app/i18n/hi-IN.ts +56 -1
  155. package/corpus/templates/design/app/i18n/ja-JP.ts +56 -1
  156. package/corpus/templates/design/app/i18n/ko-KR.ts +56 -1
  157. package/corpus/templates/design/app/i18n/pt-BR.ts +57 -1
  158. package/corpus/templates/design/app/i18n/zh-CN.ts +56 -1
  159. package/corpus/templates/design/app/i18n/zh-TW.ts +51 -0
  160. package/corpus/templates/design/app/pages/Present.tsx +172 -14
  161. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +23 -0
  162. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +10 -0
  163. package/corpus/templates/design/app/pages/present-review-state.ts +18 -0
  164. package/corpus/templates/design/app/public-routes.ts +8 -0
  165. package/corpus/templates/design/app/root.tsx +7 -6
  166. package/corpus/templates/design/changelog/2026-07-13-dragged-design-assets-now-appear-at-the-visible-drop-locatio.md +6 -0
  167. package/corpus/templates/design/changelog/2026-07-13-reviewers-can-pin-comments-on-shared-designs-and-apply-verif.md +6 -0
  168. package/corpus/templates/design/server/plugins/agent-chat.ts +10 -0
  169. package/corpus/templates/design/server/plugins/auth.ts +7 -5
  170. package/corpus/templates/design/server/plugins/review.ts +9 -0
  171. package/corpus/templates/design/shared/review-anchor.ts +83 -0
  172. package/corpus/templates/design/shared/review-summary.ts +25 -0
  173. package/corpus/templates/dispatch/changelog/2026-07-14-dispatch-now-distinguishes-connected-agents-from-locally-mou.md +6 -0
  174. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +2 -0
  175. package/corpus/templates/forms/AGENTS.md +4 -0
  176. package/corpus/templates/forms/actions/create-form.ts +2 -1
  177. package/corpus/templates/forms/actions/update-form.ts +5 -2
  178. package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
  179. package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
  180. package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
  181. package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
  182. package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
  183. package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
  184. package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
  185. package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
  186. package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
  187. package/corpus/templates/forms/app/i18n/zh-CN.ts +3 -0
  188. package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
  189. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +19 -0
  190. package/corpus/templates/forms/changelog/2026-07-14-fixed-the-ask-forms-loading-input-appearing-above-the-welcom.md +6 -0
  191. package/corpus/templates/forms/changelog/2026-07-14-form-social-previews-now-show-the-form-title-description-and.md +6 -0
  192. package/corpus/templates/forms/changelog/2026-07-14-forms-can-email-the-form-owner-when-new-responses-arrive.md +6 -0
  193. package/corpus/templates/forms/server/handlers/submissions.ts +17 -0
  194. package/corpus/templates/forms/server/lib/form-og-image.ts +64 -6
  195. package/corpus/templates/forms/server/lib/public-form-ssr.ts +6 -2
  196. package/corpus/templates/forms/server/lib/response-email.ts +65 -0
  197. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  198. package/corpus/templates/forms/server/routes/api/forms/og/[...slug]/og.png.get.ts +184 -0
  199. package/corpus/templates/forms/shared/types.ts +2 -0
  200. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +6 -4
  201. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +7 -1
  202. package/dist/a2a/index.d.ts +2 -1
  203. package/dist/a2a/index.d.ts.map +1 -1
  204. package/dist/a2a/index.js +1 -1
  205. package/dist/a2a/index.js.map +1 -1
  206. package/dist/a2a/server.d.ts +25 -0
  207. package/dist/a2a/server.d.ts.map +1 -1
  208. package/dist/a2a/server.js +30 -6
  209. package/dist/a2a/server.js.map +1 -1
  210. package/dist/agent/production-agent.d.ts +2 -0
  211. package/dist/agent/production-agent.d.ts.map +1 -1
  212. package/dist/agent/production-agent.js +37 -12
  213. package/dist/agent/production-agent.js.map +1 -1
  214. package/dist/cli/create.d.ts +5 -3
  215. package/dist/cli/create.d.ts.map +1 -1
  216. package/dist/cli/create.js +44 -19
  217. package/dist/cli/create.js.map +1 -1
  218. package/dist/cli/pr-visual-recap-workflow.d.ts +2 -2
  219. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  220. package/dist/cli/pr-visual-recap-workflow.js +2 -2
  221. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  222. package/dist/cli/recap.d.ts +3 -562
  223. package/dist/cli/recap.d.ts.map +1 -1
  224. package/dist/cli/recap.js +3 -3875
  225. package/dist/cli/recap.js.map +1 -1
  226. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  227. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  228. package/dist/cli/skills-content/visual-plan-skill.js +6 -4
  229. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  230. package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
  231. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
  232. package/dist/cli/skills-content/visual-recap-skill.js +7 -1
  233. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
  234. package/dist/client/AgentPanel.d.ts.map +1 -1
  235. package/dist/client/AgentPanel.js +3 -3
  236. package/dist/client/AgentPanel.js.map +1 -1
  237. package/dist/client/analytics.d.ts +5 -0
  238. package/dist/client/analytics.d.ts.map +1 -1
  239. package/dist/client/analytics.js +3 -1
  240. package/dist/client/analytics.js.map +1 -1
  241. package/dist/client/chat/markdown-renderer.d.ts +1 -0
  242. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  243. package/dist/client/chat/markdown-renderer.js +36 -1
  244. package/dist/client/chat/markdown-renderer.js.map +1 -1
  245. package/dist/client/chat/message-components.d.ts.map +1 -1
  246. package/dist/client/chat/message-components.js +5 -2
  247. package/dist/client/chat/message-components.js.map +1 -1
  248. package/dist/client/clipboard.d.ts +3 -1
  249. package/dist/client/clipboard.d.ts.map +1 -1
  250. package/dist/client/clipboard.js +24 -1
  251. package/dist/client/clipboard.js.map +1 -1
  252. package/dist/client/guided-questions.d.ts +3 -1
  253. package/dist/client/guided-questions.d.ts.map +1 -1
  254. package/dist/client/guided-questions.js +2 -1
  255. package/dist/client/guided-questions.js.map +1 -1
  256. package/dist/client/i18n.d.ts.map +1 -1
  257. package/dist/client/i18n.js +3 -1
  258. package/dist/client/i18n.js.map +1 -1
  259. package/dist/client/index.d.ts +1 -1
  260. package/dist/client/index.d.ts.map +1 -1
  261. package/dist/client/index.js +1 -1
  262. package/dist/client/index.js.map +1 -1
  263. package/dist/client/review/ReviewCommentComposer.d.ts +18 -0
  264. package/dist/client/review/ReviewCommentComposer.d.ts.map +1 -0
  265. package/dist/client/review/ReviewCommentComposer.js +30 -0
  266. package/dist/client/review/ReviewCommentComposer.js.map +1 -0
  267. package/dist/client/review/ReviewThreadPanel.d.ts +28 -1
  268. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -1
  269. package/dist/client/review/ReviewThreadPanel.js +151 -39
  270. package/dist/client/review/ReviewThreadPanel.js.map +1 -1
  271. package/dist/client/review/index.d.ts +3 -2
  272. package/dist/client/review/index.d.ts.map +1 -1
  273. package/dist/client/review/index.js +2 -1
  274. package/dist/client/review/index.js.map +1 -1
  275. package/dist/client/review/use-review.d.ts +23 -0
  276. package/dist/client/review/use-review.d.ts.map +1 -1
  277. package/dist/client/review/use-review.js +3 -0
  278. package/dist/client/review/use-review.js.map +1 -1
  279. package/dist/client/use-agent-chat-context.d.ts +1 -1
  280. package/dist/client/use-agent-chat-context.d.ts.map +1 -1
  281. package/dist/client/use-agent-chat-context.js +4 -2
  282. package/dist/client/use-agent-chat-context.js.map +1 -1
  283. package/dist/collab/awareness.d.ts +2 -2
  284. package/dist/collab/awareness.d.ts.map +1 -1
  285. package/dist/collab/struct-routes.d.ts +1 -1
  286. package/dist/credentials/index.d.ts +12 -7
  287. package/dist/credentials/index.d.ts.map +1 -1
  288. package/dist/credentials/index.js +33 -8
  289. package/dist/credentials/index.js.map +1 -1
  290. package/dist/extensions/fetch-tool.d.ts +13 -1
  291. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  292. package/dist/extensions/fetch-tool.js +9 -2
  293. package/dist/extensions/fetch-tool.js.map +1 -1
  294. package/dist/notifications/channels.js +20 -4
  295. package/dist/notifications/channels.js.map +1 -1
  296. package/dist/observability/routes.d.ts +5 -5
  297. package/dist/progress/routes.d.ts +1 -1
  298. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  299. package/dist/resources/handlers.d.ts +3 -3
  300. package/dist/review/actions/create-review-comment.js +2 -1
  301. package/dist/review/actions/create-review-comment.js.map +1 -1
  302. package/dist/review/actions/get-review-feedback.js +6 -11
  303. package/dist/review/actions/get-review-feedback.js.map +1 -1
  304. package/dist/review/actions/list-review-comments.d.ts +1 -0
  305. package/dist/review/actions/list-review-comments.js +25 -4
  306. package/dist/review/actions/list-review-comments.js.map +1 -1
  307. package/dist/review/actions/reply-review-comment.js +12 -5
  308. package/dist/review/actions/reply-review-comment.js.map +1 -1
  309. package/dist/review/actions/resolve-review-thread.d.ts +3 -0
  310. package/dist/review/actions/resolve-review-thread.js +20 -3
  311. package/dist/review/actions/resolve-review-thread.js.map +1 -1
  312. package/dist/review/actions/send-review-thread-to-agent.d.ts +17 -0
  313. package/dist/review/actions/send-review-thread-to-agent.d.ts.map +1 -0
  314. package/dist/review/actions/send-review-thread-to-agent.js +49 -0
  315. package/dist/review/actions/send-review-thread-to-agent.js.map +1 -0
  316. package/dist/review/identity.d.ts +6 -0
  317. package/dist/review/identity.d.ts.map +1 -0
  318. package/dist/review/identity.js +68 -0
  319. package/dist/review/identity.js.map +1 -0
  320. package/dist/review/index.d.ts +3 -1
  321. package/dist/review/index.d.ts.map +1 -1
  322. package/dist/review/index.js +2 -1
  323. package/dist/review/index.js.map +1 -1
  324. package/dist/review/store.d.ts +36 -0
  325. package/dist/review/store.d.ts.map +1 -1
  326. package/dist/review/store.js +223 -8
  327. package/dist/review/store.js.map +1 -1
  328. package/dist/review/types.d.ts +4 -0
  329. package/dist/review/types.d.ts.map +1 -1
  330. package/dist/review/types.js.map +1 -1
  331. package/dist/secrets/crypto.d.ts +15 -7
  332. package/dist/secrets/crypto.d.ts.map +1 -1
  333. package/dist/secrets/crypto.js +23 -10
  334. package/dist/secrets/crypto.js.map +1 -1
  335. package/dist/secrets/routes.d.ts +9 -9
  336. package/dist/secrets/storage.d.ts.map +1 -1
  337. package/dist/secrets/storage.js +16 -3
  338. package/dist/secrets/storage.js.map +1 -1
  339. package/dist/server/action-discovery.d.ts.map +1 -1
  340. package/dist/server/action-discovery.js +4 -0
  341. package/dist/server/action-discovery.js.map +1 -1
  342. package/dist/server/action-routes.d.ts +45 -0
  343. package/dist/server/action-routes.d.ts.map +1 -1
  344. package/dist/server/action-routes.js +71 -5
  345. package/dist/server/action-routes.js.map +1 -1
  346. package/dist/server/agent-chat/plugin-options.d.ts +16 -0
  347. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  348. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  349. package/dist/server/agent-chat-plugin.d.ts +20 -0
  350. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  351. package/dist/server/agent-chat-plugin.js +39 -4
  352. package/dist/server/agent-chat-plugin.js.map +1 -1
  353. package/dist/server/derived-secret.d.ts +1 -1
  354. package/dist/server/derived-secret.d.ts.map +1 -1
  355. package/dist/server/derived-secret.js.map +1 -1
  356. package/dist/server/index.d.ts +3 -1
  357. package/dist/server/index.d.ts.map +1 -1
  358. package/dist/server/index.js +2 -0
  359. package/dist/server/index.js.map +1 -1
  360. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  361. package/dist/vite/action-types-plugin.js +4 -0
  362. package/dist/vite/action-types-plugin.js.map +1 -1
  363. package/docs/content/locales/ar-SA/pr-visual-recap.mdx +48 -30
  364. package/docs/content/locales/ar-SA/template-plan.mdx +7 -0
  365. package/docs/content/locales/de-DE/pr-visual-recap.mdx +48 -30
  366. package/docs/content/locales/de-DE/template-plan.mdx +7 -0
  367. package/docs/content/locales/es-ES/pr-visual-recap.mdx +48 -30
  368. package/docs/content/locales/es-ES/template-plan.mdx +14 -0
  369. package/docs/content/locales/fr-FR/pr-visual-recap.mdx +48 -30
  370. package/docs/content/locales/fr-FR/template-plan.mdx +7 -0
  371. package/docs/content/locales/hi-IN/pr-visual-recap.mdx +48 -30
  372. package/docs/content/locales/hi-IN/template-plan.mdx +7 -0
  373. package/docs/content/locales/ja-JP/pr-visual-recap.mdx +48 -30
  374. package/docs/content/locales/ja-JP/template-plan.mdx +7 -0
  375. package/docs/content/locales/ko-KR/pr-visual-recap.mdx +48 -30
  376. package/docs/content/locales/ko-KR/template-plan.mdx +7 -0
  377. package/docs/content/locales/pt-BR/pr-visual-recap.mdx +48 -30
  378. package/docs/content/locales/pt-BR/template-plan.mdx +14 -0
  379. package/docs/content/locales/zh-CN/pr-visual-recap.mdx +48 -30
  380. package/docs/content/locales/zh-CN/template-plan.mdx +7 -0
  381. package/docs/content/locales/zh-TW/pr-visual-recap.mdx +48 -30
  382. package/docs/content/locales/zh-TW/template-plan.mdx +7 -0
  383. package/docs/content/pr-visual-recap.mdx +50 -32
  384. package/docs/content/template-plan.mdx +14 -0
  385. package/docs/content/toolkit-comments-review.mdx +16 -2
  386. package/package.json +4 -1
  387. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +0 -68
  388. package/corpus/templates/forms/server/routes/api/forms/og/[slug]/og.png.get.ts +0 -45
@@ -102,13 +102,13 @@ explicitly at any time:
102
102
  npx @agent-native/core@latest skills add visual-plan --with-github-action
103
103
  ```
104
104
 
105
- This installs the `visual-plan` skill (which includes the `visual-recap` skill the action runs) and writes `.github/workflows/pr-visual-recap.yml` into your repo. The workflow calls **published CLI subcommands** through `npx @agent-native/core@latest recap <subcommand>` — including `gate`, `collect-diff`, `block-reference`, `scan`, `build-prompt`, `publish`, `shot`, `comment`, `check`, and `usage` — so nothing is copied into your repo as helper scripts. `setup` and `doctor` are the interactive helpers you run locally; `gate` is the security-gate step the workflow runs before every recap.
105
+ This installs the `visual-plan` skill (which includes the `visual-recap` skill the action runs) and writes `.github/workflows/pr-visual-recap.yml` into your repo. The workflow calls **published CLI subcommands** through `npx @agent-native/recap-cli@latest recap <subcommand>` — including `gate`, `collect-diff`, `block-reference`, `scan`, `build-prompt`, `publish`, `shot`, `comment`, `check`, and `usage` — so nothing is copied into your repo as helper scripts. `setup` and `doctor` are the interactive helpers you run locally; `gate` is the security-gate step the workflow runs before every recap.
106
106
 
107
107
  Then run the guided setup helper:
108
108
 
109
109
  ```bash
110
- npx @agent-native/core@latest recap setup
111
- npx @agent-native/core@latest recap doctor
110
+ npx @agent-native/recap-cli@latest recap setup
111
+ npx @agent-native/recap-cli@latest recap doctor
112
112
  ```
113
113
 
114
114
  `recap setup` refreshes the workflow, uses `gh` to set GitHub Actions
@@ -118,7 +118,7 @@ set. Secret values are sent to `gh` through stdin, not command arguments. Commit
118
118
  the generated workflow file and open a PR to see it run.
119
119
 
120
120
  By default, the workflow builds its agent prompt from the latest bundled
121
- `visual-recap` guidance in `@agent-native/core@latest`, including any sibling
121
+ `visual-recap` guidance in `@agent-native/recap-cli@latest`, including any sibling
122
122
  reference files the skill ships with. If your repo intentionally customizes and
123
123
  pins its committed `visual-recap` folder, set the repository variable
124
124
  `VISUAL_RECAP_SKILL_SOURCE=repo`.
@@ -140,8 +140,8 @@ To configure it during guided setup, pass the same JSON value to `--runs-on`,
140
140
  then validate the workflow and runner availability with `doctor`:
141
141
 
142
142
  ```bash
143
- npx @agent-native/core@latest recap setup --runs-on '["self-hosted","linux","x64","visual-recap"]'
144
- npx @agent-native/core@latest recap doctor
143
+ npx @agent-native/recap-cli@latest recap setup --runs-on '["self-hosted","linux","x64","visual-recap"]'
144
+ npx @agent-native/recap-cli@latest recap doctor
145
145
  ```
146
146
 
147
147
  The lightweight security gate defaults separately to GitHub-hosted
@@ -186,7 +186,7 @@ If the variable is unset, the action uses `claude`.
186
186
 
187
187
  Beyond the backend, these repository variables tune how the agent runs:
188
188
 
189
- - **`VISUAL_RECAP_MODEL`** pins the model passed to the CLI (`--model`) — for example `gpt-5.6-sol` for Codex, a Claude model id, or `deepseek-chat` for DeepSeek. It is required for `openai-compatible`; Claude and Codex may leave it unset to use their CLI default.
189
+ - **`VISUAL_RECAP_MODEL`** pins the model passed to the CLI (`--model`) — for example `gpt-5.6-luna` for Codex, a Claude model id, or `deepseek-chat` for DeepSeek. It is required for `openai-compatible`. For the **Claude** backend, leaving it unset now defaults to `claude-sonnet-5`; set the variable explicitly to use a different Claude model, such as the cheaper `claude-haiku-4-5`. For the **Codex** backend, leaving it unset uses the Codex CLI's own default model.
190
190
  - **`VISUAL_RECAP_REASONING`** sets the reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. It applies to the Codex backend; Claude's reasoning is model-driven, so this variable is ignored there.
191
191
  - **`VISUAL_RECAP_BASE_URL`** selects the HTTP(S) base URL for the `openai-compatible` backend. Use the provider's OpenAI-compatible endpoint, such as DeepSeek or Kimi, without embedding credentials in the URL.
192
192
  - **`VISUAL_RECAP_SKILL_SOURCE`** controls prompt freshness: `auto`/unset uses the latest bundled skill guidance, while `repo` pins to the committed repo-local `visual-recap` skill folder.
@@ -195,6 +195,24 @@ For example, to run the recap on Codex with GPT-5.6 Sol at high reasoning, set t
195
195
 
196
196
  For DeepSeek, set `VISUAL_RECAP_AGENT=openai-compatible`, `VISUAL_RECAP_BASE_URL=https://api.deepseek.com/v1`, `VISUAL_RECAP_MODEL=deepseek-chat`, and the `VISUAL_RECAP_API_KEY` secret. Kimi works the same way with its OpenAI-compatible base URL and model id. Other OpenAI-compatible providers use the same three settings.
197
197
 
198
+ ## Cost
199
+
200
+ Each recap run is a full agentic coding-agent session reading a real diff, not a cheap templated summary, so its cost tracks model choice and how often it runs:
201
+
202
+ - **A full session per PR push.** The default trigger fires on `synchronize`, so a PR that gets pushed to ten times runs the agent ten times.
203
+ - **The whole PR each time**, not just the commits since the last run — cost scales with total PR size, not incremental diff size.
204
+ - **Diff input capped at ~600KB.** This bounds the worst case per run, but large diffs still cost meaningfully more than small ones.
205
+ - **One automatic retry on failure**, which can roughly double the cost of a run that fails transiently.
206
+
207
+ To reduce cost:
208
+
209
+ - **Pin a cheaper model.** For Claude, set `VISUAL_RECAP_MODEL=claude-haiku-4-5` for simple or small repos — it's the cheapest Claude tier; `claude-sonnet-5` (the default) is the balanced tier.
210
+ - **Switch to Codex with a cheaper model.** Set `VISUAL_RECAP_AGENT=codex` with `VISUAL_RECAP_MODEL=gpt-5.6-luna` (the cheapest GPT-5.6 tier) or `gpt-5.6-terra` (mid-tier), and set `VISUAL_RECAP_REASONING=low` to cut reasoning-token spend further. Reasoning depth only applies to Codex.
211
+ - **Point at a cheaper OpenAI-compatible provider.** Set `VISUAL_RECAP_AGENT=openai-compatible` with `VISUAL_RECAP_BASE_URL`/`VISUAL_RECAP_MODEL`/`VISUAL_RECAP_API_KEY` targeting DeepSeek, Kimi, or any other OpenAI-compatible endpoint.
212
+ - **Recap less often.** Edit the installed workflow's `on.pull_request.types` from `[opened, synchronize, reopened, ready_for_review, closed]` to `[opened, ready_for_review, closed]` so it recaps only when a PR opens and when it merges, instead of on every push.
213
+
214
+ Every run records what it actually spent: the workflow's `recap usage` step attaches token and cost usage to the published plan, so you can look at real spend per run instead of guessing.
215
+
198
216
  ## Secrets and variables
199
217
 
200
218
  Set these in your repository's **Settings → Secrets and variables → Actions**.
@@ -225,11 +243,11 @@ Plans app.
225
243
 
226
244
  **Solo: a personal token still works.** Mint it with `npx @agent-native/core@latest connect`
227
245
  against your Plans app. For the hosted app, this also writes a local
228
- publish-token file that `npx @agent-native/core@latest recap setup` can read:
246
+ publish-token file that `npx @agent-native/recap-cli@latest recap setup` can read:
229
247
 
230
248
  ```bash
231
249
  npx @agent-native/core@latest connect https://plan.agent-native.com --client codex
232
- npx @agent-native/core@latest recap setup
250
+ npx @agent-native/recap-cli@latest recap setup
233
251
  ```
234
252
 
235
253
  If you prefer manual setup, paste the token into the GitHub secret. Use a
@@ -238,18 +256,18 @@ real token.
238
256
 
239
257
  ### Optional (only if you change defaults)
240
258
 
241
- | Secret / variable | Default | When you need it |
242
- | ------------------------ | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
243
- | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
244
- | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
245
- | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
246
- | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
247
- | `VISUAL_RECAP_MODEL` | required for compatible backend | Variable. Provider model id for OpenAI-compatible backends; optional for Claude/Codex, where unset uses the CLI default. |
248
- | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
249
- | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/core` CLI version the workflow installs — e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
250
- | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
259
+ | Secret / variable | Default | When you need it |
260
+ | ------------------------ | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
261
+ | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
262
+ | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
263
+ | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
264
+ | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
265
+ | `VISUAL_RECAP_MODEL` | `claude-sonnet-5` for Claude; required for compatible backend | Variable. Provider model id for OpenAI-compatible backends (required there). For Claude, unset now defaults to `claude-sonnet-5` — set it to override, e.g. `claude-haiku-4-5` for the cheapest tier. For Codex, unset uses the Codex CLI's own default. |
266
+ | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
267
+ | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/recap-cli` version the workflow installs — e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
268
+ | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
251
269
 
252
- The workflow auto-detects how to invoke its helper CLI (local source inside this monorepo, the published `@agent-native/core` elsewhere), so there is no `RECAP_CLI` variable to set.
270
+ The workflow auto-detects how to invoke its helper CLI (local source inside this monorepo, the published `@agent-native/recap-cli` elsewhere), so there is no `RECAP_CLI` variable to set.
253
271
 
254
272
  ## Inline screenshot in the comment
255
273
 
@@ -390,9 +408,9 @@ recap without sending recap content to the Agent-Native Plan database, run the
390
408
  same helper flow locally in local-files mode instead:
391
409
 
392
410
  ```bash
393
- npx @agent-native/core@latest recap collect-diff --base main --head HEAD --out recap.diff --stat recap.stat
394
- npx @agent-native/core@latest recap scan --diff recap.diff
395
- npx @agent-native/core@latest recap build-prompt --pr 123 --diff recap.diff --stat recap.stat --local-files --local-dir plans/pr-123-visual-recap
411
+ npx @agent-native/recap-cli@latest recap collect-diff --base main --head HEAD --out recap.diff --stat recap.stat
412
+ npx @agent-native/recap-cli@latest recap scan --diff recap.diff
413
+ npx @agent-native/recap-cli@latest recap build-prompt --pr 123 --diff recap.diff --stat recap.stat --local-files --local-dir plans/pr-123-visual-recap
396
414
  ```
397
415
 
398
416
  Give the generated `recap-prompt.md` to your coding agent. In local-files mode
@@ -422,7 +440,7 @@ The recap is a review aid layered on top of the normal PR flow:
422
440
 
423
441
  ## Version pinning (copy variant) {#version-pinning-copy-variant}
424
442
 
425
- By default the copy-variant workflow installs `@agent-native/core@latest` at run time so every recap run automatically picks up the newest CLI. If your CI needs reproducible tooling, set the **`RECAP_CLI_VERSION`** repository variable to pin the installed version:
443
+ By default the copy-variant workflow installs `@agent-native/recap-cli@latest` at run time so every recap run automatically picks up the newest CLI. If your CI needs reproducible tooling, set the **`RECAP_CLI_VERSION`** repository variable to pin the installed version:
426
444
 
427
445
  1. Go to your repo's **Settings → Secrets and variables → Actions → Variables**.
428
446
  2. Create a variable named `RECAP_CLI_VERSION` with a value like `1.5.0`.
@@ -433,7 +451,7 @@ For the reusable-caller variant, use the `cli-version` input instead (see [Versi
433
451
 
434
452
  ## Secret-scan allowlist
435
453
 
436
- Before publishing a recap the workflow runs `npx @agent-native/core@latest recap scan` to detect likely secrets in the diff. Any PR whose diff matches a known-secret pattern is blocked with an explanatory comment — the recap is not published, and no diff content is sent to the coding agent.
454
+ Before publishing a recap the workflow runs `npx @agent-native/recap-cli@latest recap scan` to detect likely secrets in the diff. Any PR whose diff matches a known-secret pattern is blocked with an explanatory comment — the recap is not published, and no diff content is sent to the coding agent.
437
455
 
438
456
  In rare cases a repo has intentional test fixtures or non-secret strings that superficially resemble secret patterns (e.g., a fixture key in a test file). To suppress a false positive, create `.github/recap-scan-allowlist` in the root of your repository.
439
457
 
@@ -467,7 +485,7 @@ The allowlist is only consulted by the secret-scan gate. It does not affect what
467
485
 
468
486
  ### Why use the reusable variant?
469
487
 
470
- The default installer copies the full ~360-line workflow YAML into your repo (the **copy** option). This is the right choice for air-gapped repos or repos that need to audit every line of what runs. The downside is that bug fixes and improvements never reach you — you need to re-run `npx @agent-native/core@latest recap setup` manually after each release.
488
+ The default installer copies the full ~360-line workflow YAML into your repo (the **copy** option). This is the right choice for air-gapped repos or repos that need to audit every line of what runs. The downside is that bug fixes and improvements never reach you — you need to re-run `npx @agent-native/recap-cli@latest recap setup` manually after each release.
471
489
 
472
490
  The **reusable** option writes a thin ~20-line caller instead. It delegates to `BuilderIO/agent-native/.github/workflows/pr-visual-recap-reusable.yml` via `uses:`. Every caller automatically picks up the latest logic when the workflow runs, with no local update needed.
473
491
 
@@ -480,7 +498,7 @@ The **reusable** option writes a thin ~20-line caller instead. It delegates to `
480
498
 
481
499
  ### Caller snippet
482
500
 
483
- This is what `npx @agent-native/core@latest recap setup --reusable` writes (or you can paste it manually):
501
+ This is what `npx @agent-native/recap-cli@latest recap setup --reusable` writes (or you can paste it manually):
484
502
 
485
503
  ```yaml
486
504
  name: PR Visual Recap
@@ -517,7 +535,7 @@ jobs:
517
535
  skill-source: ${{ vars.VISUAL_RECAP_SKILL_SOURCE || 'auto' }}
518
536
  runs-on: ${{ vars.VISUAL_RECAP_RUNS_ON || '"ubuntu-latest"' }}
519
537
  gate-runs-on: ${{ vars.VISUAL_RECAP_GATE_RUNS_ON || 'ubuntu-latest' }}
520
- # cli-version: "latest" # pin to a specific @agent-native/core version
538
+ # cli-version: "latest" # pin to a specific @agent-native/recap-cli version
521
539
  ```
522
540
 
523
541
  The same secrets and variables described in [Secrets and variables](#secrets-and-variables) apply — set them in your repo settings the same way as for the copy variant. The reusable caller forwards `VISUAL_RECAP_RUNS_ON` through its JSON `runs-on` input for the full recap job and `VISUAL_RECAP_GATE_RUNS_ON` through its plain-label `gate-runs-on` input for the metadata-only gate. The latter is used only for trusted same-repository authors; other PRs use GitHub-hosted `ubuntu-latest`. Omitting either input preserves its `ubuntu-latest` default.
@@ -526,15 +544,15 @@ The same secrets and variables described in [Secrets and variables](#secrets-and
526
544
 
527
545
  ```bash
528
546
  # Write the thin caller instead of the full copy:
529
- npx @agent-native/core@latest recap setup --reusable
547
+ npx @agent-native/recap-cli@latest recap setup --reusable
530
548
 
531
549
  # Or with a pinned ref for reproducibility:
532
- npx @agent-native/core@latest recap setup --reusable --ref v1.2.3
550
+ npx @agent-native/recap-cli@latest recap setup --reusable --ref v1.2.3
533
551
  ```
534
552
 
535
553
  Both variants write the workflow to `.github/workflows/pr-visual-recap.yml`. If an existing workflow is already there and differs, the command refuses and tells you to pass `--force` to overwrite.
536
554
 
537
- After writing, run `npx @agent-native/core@latest recap doctor` as usual to confirm secrets are configured.
555
+ After writing, run `npx @agent-native/recap-cli@latest recap doctor` as usual to confirm secrets are configured.
538
556
 
539
557
  ### Version pinning
540
558
 
@@ -544,7 +562,7 @@ By default the caller references `@main`, which always uses the latest published
544
562
  uses: BuilderIO/agent-native/.github/workflows/pr-visual-recap-reusable.yml@v1.2.3
545
563
  ```
546
564
 
547
- The `cli-version` input controls which `@agent-native/core` CLI version runs inside the workflow — leave it at `"latest"` to track the newest release, or pin it to a version string (e.g. `"1.5.0"`) for full reproducibility.
565
+ The `cli-version` input controls which `@agent-native/recap-cli` version runs inside the workflow — leave it at `"latest"` to track the newest release, or pin it to a version string (e.g. `"1.5.0"`) for full reproducibility.
548
566
 
549
567
  ### workflow_call event context
550
568
 
@@ -226,6 +226,20 @@ If the first pass still has answerable decisions, the agent can place an
226
226
  **Open Questions** form at the bottom of the same plan. Answering it and sending
227
227
  it to the agent starts a revision turn against the existing plan.
228
228
 
229
+ ## Cost and model choice
230
+
231
+ Generating a plan or recap runs a full agentic session against your coding
232
+ agent's LLM, not a lightweight template fill, so cost scales with the size of
233
+ the diff or plan and the model you choose.
234
+
235
+ - The app's own default chat model is Sonnet 5; change it any time in
236
+ **Settings**. Haiku is the cheaper Claude option, and Luna is the cheaper
237
+ option in the GPT-5.6 family.
238
+ - Automated PR recaps from the GitHub Action run separately from the
239
+ interactive app and have their own model and cost knobs — see
240
+ [PR Visual Recap](/docs/pr-visual-recap) for `VISUAL_RECAP_MODEL`,
241
+ `VISUAL_RECAP_AGENT`, and `VISUAL_RECAP_REASONING`.
242
+
229
243
  ## What you can do with it
230
244
 
231
245
  - **Review before implementation.** React to diagrams, wireframes, option tabs,
@@ -24,9 +24,9 @@ status such as draft, review, approved, or needs changes.
24
24
  | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
25
25
  | `registerReviewableResource()` | Register a resource type and optional access resolver for review actions. |
26
26
  | Comment actions | `list-review-comments`, `create-review-comment`, `reply-review-comment`, `resolve-review-thread`, and `delete-review-comment`. |
27
- | Feedback actions | `get-review-feedback` and `consume-review-feedback` for agent-readable review queues. |
27
+ | Feedback actions | `get-review-feedback`, `send-review-thread-to-agent`, and `consume-review-feedback` for root-thread agent queues and human handoffs. |
28
28
  | Review status action | `set-review-status` for draft, in review, approved, and changes requested states. |
29
- | `ReviewThreadPanel` | Drop-in React panel with comment composer, replies, resolve, and delete controls. |
29
+ | `ReviewThreadPanel` | Drop-in React panel with capability-gated composer, reply, resolve, delete, and custom thread-action controls. |
30
30
  | `ReviewStatusBadge` | Controlled status badge for app headers, sidebars, and review panels. |
31
31
  | Review hooks | `useReviewComments()`, `useCreateReviewComment()`, `useReplyReviewComment()`, `useResolveReviewThread()`, `useDeleteReviewComment()`, and `useSetReviewStatus()`. |
32
32
  | Mentions helpers | `extractReviewMentions()` and `normalizeReviewMentions()` for `@[Label](mailto:email@example.com)` tokens. |
@@ -42,6 +42,13 @@ specialize anchor shapes, but the common model preserves:
42
42
  - `parentCommentId` for replies
43
43
  - optional `mentions`
44
44
  - optional `anchor` or `resolutionTarget`
45
+ - optional `resolutionNote` on a resolved root thread
46
+
47
+ `list-review-comments` supports anonymous reads for resources whose access
48
+ resolver grants public viewer access. Public viewer responses redact ownership,
49
+ organization, email, and actor metadata while preserving safe display names and
50
+ the caller-specific `canDelete` capability. Its `summary` reports unpaginated
51
+ open-root and agent-queue counts even when the returned comment page is bounded.
45
52
 
46
53
  ## Register A Resource {#register-resource}
47
54
 
@@ -76,6 +83,9 @@ export function DocumentReview({ documentId }: { documentId: string }) {
76
83
  resourceType="document"
77
84
  resourceId={documentId}
78
85
  targetId="intro-section"
86
+ canReply
87
+ canResolve={false}
88
+ canDeleteComment={(comment) => comment.canDelete === true}
79
89
  />
80
90
  );
81
91
  }
@@ -93,6 +103,10 @@ actions and thread UI.
93
103
  - Agents can read open review feedback before changing code or content.
94
104
  - `consumedAt` and `resolved` are separate. An agent can consume a piece of
95
105
  feedback without closing the reviewer-visible thread.
106
+ - The root comment owns routing. A human-targeted root is absent from the agent
107
+ queue; sending it back to the agent clears its previous consumption marker.
108
+ - Agents can pass `resolutionNote` to `resolve-review-thread` so verification
109
+ evidence remains attached to the resolved root.
96
110
 
97
111
  ## What's next
98
112
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.100.2",
3
+ "version": "0.101.3",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -156,6 +156,7 @@
156
156
  "./review/actions/consume-review-feedback": "./dist/review/actions/consume-review-feedback.js",
157
157
  "./review/actions/get-review-feedback": "./dist/review/actions/get-review-feedback.js",
158
158
  "./review/actions/set-review-status": "./dist/review/actions/set-review-status.js",
159
+ "./review/actions/send-review-thread-to-agent": "./dist/review/actions/send-review-thread-to-agent.js",
159
160
  "./comments-review/actions/list-review-comments": "./dist/review/actions/list-review-comments.js",
160
161
  "./comments-review/actions/create-review-comment": "./dist/review/actions/create-review-comment.js",
161
162
  "./comments-review/actions/reply-review-comment": "./dist/review/actions/reply-review-comment.js",
@@ -164,6 +165,7 @@
164
165
  "./comments-review/actions/consume-review-feedback": "./dist/review/actions/consume-review-feedback.js",
165
166
  "./comments-review/actions/get-review-feedback": "./dist/review/actions/get-review-feedback.js",
166
167
  "./comments-review/actions/set-review-status": "./dist/review/actions/set-review-status.js",
168
+ "./comments-review/actions/send-review-thread-to-agent": "./dist/review/actions/send-review-thread-to-agent.js",
167
169
  "./sharing": "./dist/sharing/index.js",
168
170
  "./sharing/actions/share-resource": "./dist/sharing/actions/share-resource.js",
169
171
  "./sharing/actions/unshare-resource": "./dist/sharing/actions/unshare-resource.js",
@@ -251,6 +253,7 @@
251
253
  "prepublishOnly": "npm run build"
252
254
  },
253
255
  "dependencies": {
256
+ "@agent-native/recap-cli": "workspace:*",
254
257
  "@agent-native/toolkit": "workspace:^",
255
258
  "@amplitude/analytics-browser": "^2.41.1",
256
259
  "@anthropic-ai/sdk": "^0.90.0",
@@ -1,5 +1,6 @@
1
1
  // Server (H3/Nitro)
2
- export { mountA2A } from "./server.js";
2
+ export { mountA2A, verifyA2AToken } from "./server.js";
3
+ export type { A2ATokenPayload } from "./server.js";
3
4
  export { generateAgentCard } from "./agent-card.js";
4
5
 
5
6
  // Client
@@ -38,10 +38,11 @@ function warnA2AUnauthOnce(): void {
38
38
  }
39
39
 
40
40
  /**
41
- * Verify an inbound A2A JWT signed with the shared A2A_SECRET.
42
- * Returns the caller's email (from `sub` claim) if valid, null otherwise.
41
+ * Result of verifying an inbound A2A JWT. `email` is the caller identity from
42
+ * the token's `sub` claim (null when verification fails), `orgDomain` mirrors
43
+ * the verified `org_domain` claim when present.
43
44
  */
44
- interface A2ATokenPayload {
45
+ export interface A2ATokenPayload {
45
46
  email: string | null;
46
47
  orgDomain: string | null;
47
48
  }
@@ -58,9 +59,11 @@ function addSecretCandidate(
58
59
  /**
59
60
  * Resolve the audience (`aud`) value to expect in an inbound JWT. We use the
60
61
  * receiver's app URL — it's the natural identifier of "who this token was
61
- * minted for". Falls back to undefined when no app URL is configured, in
62
- * which case the audience check is skipped (backward-compat with tokens
63
- * minted before the audience claim shipped).
62
+ * minted for". Returns undefined when no app URL is configured and no request
63
+ * host is derivable; `verifyA2AToken` then rejects any token that carries an
64
+ * `aud` claim (fail closed a correctly signed token minted for another
65
+ * service must not verify here). Only tokens without an `aud` claim (minted
66
+ * before the audience claim shipped) skip the audience check.
64
67
  */
65
68
  function expectedJwtAudience(event: any | undefined): string | undefined {
66
69
  const fromEnv =
@@ -80,9 +83,24 @@ function expectedJwtAudience(event: any | undefined): string | undefined {
80
83
  return undefined;
81
84
  }
82
85
 
83
- async function verifyA2AToken(
86
+ /**
87
+ * Verify an inbound A2A bearer token (HS256) exactly as the
88
+ * `/_agent-native/a2a` endpoint does: it peeks at the unverified `org_domain`
89
+ * claim to build an ordered candidate-secret set (`process.env.A2A_SECRET`
90
+ * plus any org-level secret for that domain), then verifies the JWT — checking
91
+ * `aud`/`iss` when the token carries them and `exp` always. Returns the
92
+ * caller's email (`sub`) and org domain on success, or `{ email: null,
93
+ * orgDomain: null }` on any failure (malformed, bad signature, expired, or no
94
+ * secret configured), never throwing.
95
+ *
96
+ * Exported so workspaces can accept A2A callers on the HTTP action route with
97
+ * the same routine — including org-level fallback secrets — instead of
98
+ * reimplementing a partial verifier. Pass the H3 `event` to enable org-domain →
99
+ * org-secret lookup and audience derivation; it is optional.
100
+ */
101
+ export async function verifyA2AToken(
84
102
  token: string,
85
- event: any | undefined,
103
+ event?: any,
86
104
  ): Promise<A2ATokenPayload> {
87
105
  // Step 1: Peek at JWT claims WITHOUT verification to get org_domain.
88
106
  // This is safe because we only use org_domain to look up the secret,
@@ -132,8 +150,15 @@ async function verifyA2AToken(
132
150
  try {
133
151
  const verifyOptions: jose.JWTVerifyOptions = {};
134
152
  if (unverifiedPayload && typeof unverifiedPayload.aud !== "undefined") {
153
+ // Fail closed: the token was minted for a specific audience, but this
154
+ // receiver can't derive its own expected audience (no APP_URL/URL and no
155
+ // usable request host). Accepting here would let a correctly-signed token
156
+ // whose `aud` targets ANOTHER service verify against a shared secret. A
157
+ // token that self-declares an audience must be checked against ours, so
158
+ // when we have nothing to check it against we reject rather than skip.
135
159
  const aud = expectedJwtAudience(event);
136
- if (aud) verifyOptions.audience = aud;
160
+ if (!aud) return { email: null, orgDomain: null };
161
+ verifyOptions.audience = aud;
137
162
  }
138
163
  if (
139
164
  unverifiedPayload &&
@@ -2659,7 +2659,7 @@ function rateLimitRecoveryHint(message: string): string {
2659
2659
  }
2660
2660
 
2661
2661
  const SOURCE_SWEEP_TOOL_NAME =
2662
- /\b(?:api|calls?|deals?|events?|issues?|messages?|metrics?|provider|query|records?|request|search|tickets?|transcripts?)\b/i;
2662
+ /\b(?:api|calls?|deals?|docs?|events?|issues?|messages?|metrics?|provider|query|records?|request|search|source|tickets?|transcripts?)\b/i;
2663
2663
 
2664
2664
  const SOURCE_SWEEP_PROVIDER_TOKEN =
2665
2665
  /\b(?:amplitude|apollo|bigquery|commonroom|data-source|ga4|github|gong|grafana|hubspot|jira|mixpanel|notion|posthog|postgres|postgresql|pylon|sentry|slack|stripe)\b/i;
@@ -2680,6 +2680,18 @@ const SOURCE_SWEEP_EXCLUDED_TOOLS = new Set([
2680
2680
  "view-screen",
2681
2681
  ]);
2682
2682
 
2683
+ // The Docs app intentionally exposes several small read-only lookup actions
2684
+ // rather than a bulk reader. Keep the per-tool guard for repeated lookups, but
2685
+ // do not combine this family into the cross-tool convergence budget.
2686
+ const SOURCE_SWEEP_AGGREGATE_EXCLUDED_TOOLS = new Set([
2687
+ "docs-search",
2688
+ "list-docs",
2689
+ "read-doc",
2690
+ "read-source-file",
2691
+ "search-docs",
2692
+ "search-source",
2693
+ ]);
2694
+
2683
2695
  function normalizeToolNameForHeuristics(name: string): string {
2684
2696
  return name.replace(/[_-]+/g, " ");
2685
2697
  }
@@ -2698,20 +2710,27 @@ function isLikelySourceSweepTool(
2698
2710
  );
2699
2711
  }
2700
2712
 
2713
+ function isLikelyAggregateSourceSweepTool(
2714
+ name: string,
2715
+ entry: ActionEntry | undefined,
2716
+ ): boolean {
2717
+ return (
2718
+ !SOURCE_SWEEP_AGGREGATE_EXCLUDED_TOOLS.has(name.toLowerCase()) &&
2719
+ isLikelySourceSweepTool(name, entry)
2720
+ );
2721
+ }
2722
+
2701
2723
  function hasExhaustedSourceSweepBudget(opts: {
2702
2724
  priorToolCalls: readonly AgentLoopToolCallSummary[];
2703
2725
  actions: Record<string, ActionEntry>;
2704
2726
  threshold?: number;
2705
2727
  }): boolean {
2706
2728
  const threshold = opts.threshold ?? SOURCE_SWEEP_TOOL_CALL_THRESHOLD;
2707
- const counts = new Map<string, number>();
2708
- for (const call of opts.priorToolCalls) {
2709
- if (!isLikelySourceSweepTool(call.name, opts.actions[call.name])) continue;
2710
- const next = (counts.get(call.name) ?? 0) + 1;
2711
- if (next >= threshold) return true;
2712
- counts.set(call.name, next);
2713
- }
2714
- return false;
2729
+ return (
2730
+ opts.priorToolCalls.filter((call) =>
2731
+ isLikelyAggregateSourceSweepTool(call.name, opts.actions[call.name]),
2732
+ ).length >= threshold
2733
+ );
2715
2734
  }
2716
2735
 
2717
2736
  function sourceSweepDelegationText(input: unknown): string {
@@ -2784,11 +2803,16 @@ export function repeatedSourceSweepGuardMessage(opts: {
2784
2803
  toolName: string;
2785
2804
  priorCalls: number;
2786
2805
  threshold?: number;
2806
+ scope?: "tool" | "aggregate";
2787
2807
  }): string {
2788
2808
  const threshold = opts.threshold ?? SOURCE_SWEEP_TOOL_CALL_THRESHOLD;
2809
+ const target =
2810
+ opts.scope === "aggregate"
2811
+ ? "read-only source/search tools"
2812
+ : "the same read-only source/search tool";
2789
2813
  return (
2790
2814
  `Skipped ${opts.toolName}: this turn already made ${opts.priorCalls} ` +
2791
- `call(s) to the same read-only source/search tool, which exceeds the ` +
2815
+ `call(s) to ${target}, which exceeds the ` +
2792
2816
  `${threshold}-call convergence budget. Stop calling ${opts.toolName} ` +
2793
2817
  `one item at a time and change strategy before answering. If a broader ` +
2794
2818
  `read-only bulk/source mechanism is available, use it now: provider API ` +
@@ -2812,6 +2836,7 @@ export function shouldGuardRepeatedSourceSweep(opts: {
2812
2836
  toolName: string;
2813
2837
  entry: ActionEntry | undefined;
2814
2838
  priorToolCalls: readonly AgentLoopToolCallSummary[];
2839
+ actions?: Record<string, ActionEntry>;
2815
2840
  threshold?: number;
2816
2841
  }): { toolName: string; priorCalls: number; message: string } | null {
2817
2842
  if (!isLikelySourceSweepTool(opts.toolName, opts.entry)) return null;
@@ -2819,6 +2844,25 @@ export function shouldGuardRepeatedSourceSweep(opts: {
2819
2844
  const priorCalls = opts.priorToolCalls.filter(
2820
2845
  (call) => call.name === opts.toolName,
2821
2846
  ).length;
2847
+ const priorSourceSweepCalls = opts.priorToolCalls.filter((call) =>
2848
+ isLikelyAggregateSourceSweepTool(
2849
+ call.name,
2850
+ opts.actions?.[call.name] ??
2851
+ (call.name === opts.toolName ? opts.entry : undefined),
2852
+ ),
2853
+ ).length;
2854
+ if (priorSourceSweepCalls >= threshold) {
2855
+ return {
2856
+ toolName: opts.toolName,
2857
+ priorCalls: priorSourceSweepCalls,
2858
+ message: repeatedSourceSweepGuardMessage({
2859
+ toolName: opts.toolName,
2860
+ priorCalls: priorSourceSweepCalls,
2861
+ threshold,
2862
+ scope: "aggregate",
2863
+ }),
2864
+ };
2865
+ }
2822
2866
  if (priorCalls < threshold) return null;
2823
2867
  return {
2824
2868
  toolName: opts.toolName,
@@ -2827,6 +2871,7 @@ export function shouldGuardRepeatedSourceSweep(opts: {
2827
2871
  toolName: opts.toolName,
2828
2872
  priorCalls,
2829
2873
  threshold,
2874
+ scope: "tool",
2830
2875
  }),
2831
2876
  };
2832
2877
  }
@@ -3831,6 +3876,7 @@ export async function runAgentLoop(opts: {
3831
3876
  toolName: toolCall.name,
3832
3877
  entry: actionEntry,
3833
3878
  priorToolCalls: sourceSweepToolCallHistory,
3879
+ actions,
3834
3880
  });
3835
3881
  const sourceSweepDelegationGuard =
3836
3882
  sourceSweepDelegationGuardActive &&
@@ -480,21 +480,7 @@ async function scaffoldWorkspaceRoot(
480
480
  }
481
481
  }
482
482
 
483
- const localToolkit = localToolkitOverride();
484
- if (localToolkit) {
485
- const wsPath = path.join(targetDir, "pnpm-workspace.yaml");
486
- const existing = fs.existsSync(wsPath)
487
- ? fs.readFileSync(wsPath, "utf-8")
488
- : "";
489
- const updated = mergeWorkspaceYamlSections(existing, {
490
- overrides: {
491
- '"@agent-native/toolkit"': JSON.stringify(localToolkit),
492
- },
493
- });
494
- if (updated !== existing) {
495
- fs.writeFileSync(wsPath, updated);
496
- }
497
- }
483
+ applyLocalWorkspaceOverrides(targetDir);
498
484
 
499
485
  const corePackageDir = path.join(targetDir, "packages", "shared");
500
486
  fs.mkdirSync(path.join(targetDir, "packages"), { recursive: true });
@@ -579,6 +565,8 @@ export async function addAppToWorkspace(
579
565
  process.exit(1);
580
566
  }
581
567
 
568
+ applyLocalWorkspaceOverrides(workspace.workspaceRoot);
569
+
582
570
  clack.intro("Add an app to your workspace");
583
571
 
584
572
  const installed = listInstalledApps(workspace.workspaceRoot);
@@ -1101,6 +1089,12 @@ function postProcessStandalone(
1101
1089
  sections.overrides['"@agent-native/toolkit"'] =
1102
1090
  JSON.stringify(localToolkit);
1103
1091
  }
1092
+ const localRecapCli = localRecapCliOverride();
1093
+ if (localRecapCli) {
1094
+ sections.overrides ??= {};
1095
+ sections.overrides['"@agent-native/recap-cli"'] =
1096
+ JSON.stringify(localRecapCli);
1097
+ }
1104
1098
  let updated = mergeWorkspaceYamlSections(existing, sections);
1105
1099
  updated = mergeWorkspaceYamlListItems(
1106
1100
  updated,
@@ -1399,6 +1393,11 @@ async function downloadGitHubSubdir(
1399
1393
  ): Promise<void> {
1400
1394
  validateRepoName(repo);
1401
1395
  const refs = getGitHubTemplateRefCandidates();
1396
+ if (refs.length === 0) {
1397
+ throw new Error(
1398
+ "Cannot download first-party scaffold files without a versioned @agent-native/core package.",
1399
+ );
1400
+ }
1402
1401
  const errors: string[] = [];
1403
1402
  for (const ref of refs) {
1404
1403
  const tarUrl = `https://api.github.com/repos/${repo}/tarball/${encodeURIComponent(ref)}`;
@@ -1660,6 +1659,34 @@ function localToolkitOverride(): string | null {
1660
1659
  return localToolkit ? pathToFileURL(localToolkit).href : null;
1661
1660
  }
1662
1661
 
1662
+ function localRecapCliOverride(): string | null {
1663
+ if (process.env.AGENT_NATIVE_CREATE_USE_LOCAL_CORE !== "1") return null;
1664
+ const localRecapCli = findLocalPackage("recap-cli");
1665
+ return localRecapCli ? pathToFileURL(localRecapCli).href : null;
1666
+ }
1667
+
1668
+ function applyLocalWorkspaceOverrides(targetDir: string): void {
1669
+ const localToolkit = localToolkitOverride();
1670
+ const localRecapCli = localRecapCliOverride();
1671
+ if (!localToolkit && !localRecapCli) return;
1672
+
1673
+ const wsPath = path.join(targetDir, "pnpm-workspace.yaml");
1674
+ const existing = fs.existsSync(wsPath)
1675
+ ? fs.readFileSync(wsPath, "utf-8")
1676
+ : "";
1677
+ const updated = mergeWorkspaceYamlSections(existing, {
1678
+ overrides: {
1679
+ ...(localToolkit
1680
+ ? { '"@agent-native/toolkit"': JSON.stringify(localToolkit) }
1681
+ : {}),
1682
+ ...(localRecapCli
1683
+ ? { '"@agent-native/recap-cli"': JSON.stringify(localRecapCli) }
1684
+ : {}),
1685
+ },
1686
+ });
1687
+ if (updated !== existing) fs.writeFileSync(wsPath, updated);
1688
+ }
1689
+
1663
1690
  function getCorePackageVersion(): string | undefined {
1664
1691
  try {
1665
1692
  const packageRoot = path.resolve(__dirname, "../..");
@@ -1680,9 +1707,11 @@ function getCorePackageVersion(): string | undefined {
1680
1707
  * - ≥ 0.8.0: changesets per-package tags
1681
1708
  * `@agent-native/core@<version>` (current).
1682
1709
  *
1683
- * `main` is the final fallback so dev builds and brand-new releases (where
1684
- * the tag has not propagated yet) still work at the cost of pulling
1685
- * potentially newer template code than the running CLI was built against.
1710
+ * Published CLIs intentionally use only immutable version tags. Falling back
1711
+ * to mutable `main` can copy a template that imports exports not present in
1712
+ * the installed core package, leaving a generated app broken at SSR startup.
1713
+ * Local framework development uses the checkout's templates and packages
1714
+ * before this downloader runs, so it does not need a mutable fallback.
1686
1715
  */
1687
1716
  function getGitHubTemplateRefCandidates(): string[] {
1688
1717
  const version = getCorePackageVersion();
@@ -1691,7 +1720,6 @@ function getGitHubTemplateRefCandidates(): string[] {
1691
1720
  candidates.push(`@agent-native/core@${version}`);
1692
1721
  candidates.push(`v${version}`);
1693
1722
  }
1694
- candidates.push("main");
1695
1723
  return candidates;
1696
1724
  }
1697
1725