@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +83 -0
- package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +14 -0
- package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +14 -0
- package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +7 -0
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +48 -30
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +7 -0
- package/corpus/core/docs/content/pr-visual-recap.mdx +50 -32
- package/corpus/core/docs/content/template-plan.mdx +14 -0
- package/corpus/core/docs/content/toolkit-comments-review.mdx +16 -2
- package/corpus/core/package.json +4 -1
- package/corpus/core/src/a2a/index.ts +2 -1
- package/corpus/core/src/a2a/server.ts +34 -9
- package/corpus/core/src/agent/production-agent.ts +56 -10
- package/corpus/core/src/cli/create.ts +47 -19
- package/corpus/core/src/cli/pr-visual-recap-workflow.ts +2 -3
- package/corpus/core/src/cli/recap.ts +3 -4932
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +6 -4
- package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +7 -1
- package/corpus/core/src/client/AgentPanel.tsx +19 -17
- package/corpus/core/src/client/analytics.ts +8 -1
- package/corpus/core/src/client/chat/markdown-renderer.tsx +54 -8
- package/corpus/core/src/client/chat/message-components.tsx +8 -2
- package/corpus/core/src/client/clipboard.ts +28 -1
- package/corpus/core/src/client/guided-questions.tsx +4 -0
- package/corpus/core/src/client/i18n.tsx +2 -1
- package/corpus/core/src/client/index.ts +4 -0
- package/corpus/core/src/client/review/ReviewCommentComposer.tsx +108 -0
- package/corpus/core/src/client/review/ReviewThreadPanel.tsx +482 -150
- package/corpus/core/src/client/review/index.ts +8 -0
- package/corpus/core/src/client/review/use-review.ts +35 -1
- package/corpus/core/src/client/use-agent-chat-context.ts +3 -2
- package/corpus/core/src/credentials/index.ts +41 -8
- package/corpus/core/src/extensions/fetch-tool.ts +33 -3
- package/corpus/core/src/notifications/channels.ts +20 -6
- package/corpus/core/src/review/actions/create-review-comment.ts +2 -1
- package/corpus/core/src/review/actions/get-review-feedback.ts +6 -11
- package/corpus/core/src/review/actions/list-review-comments.ts +38 -4
- package/corpus/core/src/review/actions/reply-review-comment.ts +33 -22
- package/corpus/core/src/review/actions/resolve-review-thread.ts +29 -2
- package/corpus/core/src/review/actions/send-review-thread-to-agent.ts +62 -0
- package/corpus/core/src/review/identity.ts +101 -0
- package/corpus/core/src/review/index.ts +14 -0
- package/corpus/core/src/review/store.ts +315 -8
- package/corpus/core/src/review/types.ts +4 -0
- package/corpus/core/src/secrets/crypto.ts +26 -10
- package/corpus/core/src/secrets/storage.ts +16 -3
- package/corpus/core/src/server/action-discovery.ts +4 -0
- package/corpus/core/src/server/action-routes.ts +125 -4
- package/corpus/core/src/server/agent-chat/plugin-options.ts +16 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +61 -7
- package/corpus/core/src/server/derived-secret.ts +5 -1
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/vite/action-types-plugin.ts +4 -0
- package/corpus/templates/analytics/changelog/2026-07-14-daily-dashboard-email-captures-authenticate-with-a-sessi.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-14-long-running-cross-app-analyses-now-continue-reliably-in-the.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +156 -3
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +8 -4
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +402 -142
- package/corpus/templates/assets/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/assets/app/i18n-data.ts +1 -0
- package/corpus/templates/assets/app/routes/library.tsx +187 -48
- package/corpus/templates/assets/changelog/2026-07-13-merged-the-candidates-panel-into-the-library-as-a-drafts-tab.md +6 -0
- package/corpus/templates/chat/app/lib/agent-page.tsx +40 -0
- package/corpus/templates/chat/app/routes/agent.tsx +5 -3
- package/corpus/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +5 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/get-feature-flags.ts +30 -0
- package/corpus/templates/clips/actions/lib/transcript-preview.ts +48 -0
- package/corpus/templates/clips/actions/request-transcript.ts +41 -1
- package/corpus/templates/clips/actions/view-screen.ts +5 -9
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +44 -81
- package/corpus/templates/clips/app/components/player/video-player.tsx +39 -1
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +6 -12
- package/corpus/templates/clips/app/hooks/use-mse-video-source.ts +146 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +0 -8
- package/corpus/templates/clips/app/i18n/de-DE.ts +0 -9
- package/corpus/templates/clips/app/i18n/en-US.ts +0 -8
- package/corpus/templates/clips/app/i18n/es-ES.ts +0 -9
- package/corpus/templates/clips/app/i18n/fr-FR.ts +0 -9
- package/corpus/templates/clips/app/i18n/hi-IN.ts +0 -8
- package/corpus/templates/clips/app/i18n/ja-JP.ts +0 -9
- package/corpus/templates/clips/app/i18n/ko-KR.ts +0 -9
- package/corpus/templates/clips/app/i18n/pt-BR.ts +0 -9
- package/corpus/templates/clips/app/i18n/zh-CN.ts +0 -7
- package/corpus/templates/clips/app/i18n/zh-TW.ts +0 -7
- package/corpus/templates/clips/app/lib/capture-install-options.ts +21 -0
- package/corpus/templates/clips/app/lib/fmp4.ts +271 -0
- package/corpus/templates/clips/app/lib/mse-video-loader.ts +585 -0
- package/corpus/templates/clips/app/routes/_app.dictate.tsx +0 -4
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +5 -13
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +2 -37
- package/corpus/templates/clips/app/routes/download.tsx +3 -2
- package/corpus/templates/clips/changelog/2026-07-10-shared-clips-now-start-playing-instantly-instead-of-showing-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-14-clips-now-distinguishes-transcript-previews-from-incomplete-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-14-desktop-app-prompts-stay-hidden-after-you-download-the-insta.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-14-share-dialogs-show-separate-links-for-people-and-agents.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +5 -0
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +2518 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +353 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +558 -67
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +11 -1
- package/corpus/templates/clips/desktop/src-tauri/src/remote_flags.rs +188 -0
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +1 -1
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +1 -0
- package/corpus/templates/clips/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +5 -1
- package/corpus/templates/clips/shared/feature-flags.ts +41 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +3 -0
- package/corpus/templates/design/.agents/skills/design-review-feedback/SKILL.md +42 -0
- package/corpus/templates/design/AGENTS.md +6 -0
- package/corpus/templates/design/README.md +1 -0
- package/corpus/templates/design/actions/navigate.ts +4 -4
- package/corpus/templates/design/actions/view-screen.ts +116 -2
- package/corpus/templates/design/agent-native.app-skill.json +5 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +52 -59
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +13 -9
- package/corpus/templates/design/app/components/design/EditPanel.tsx +79 -11
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +78 -65
- package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +161 -0
- package/corpus/templates/design/app/components/design/ReviewStatusControl.tsx +96 -0
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +166 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +1 -0
- package/corpus/templates/design/app/components/visual-editor/ReviewCanvasPins.tsx +1077 -0
- package/corpus/templates/design/app/components/visual-editor/index.ts +1 -0
- package/corpus/templates/design/app/components/visual-editor/review-canvas-state.ts +42 -0
- package/corpus/templates/design/app/hooks/use-design-systems.ts +2 -2
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +9 -6
- package/corpus/templates/design/app/hooks/use-question-flow.ts +7 -1
- package/corpus/templates/design/app/i18n/ar-SA.ts +56 -1
- package/corpus/templates/design/app/i18n/de-DE.ts +57 -1
- package/corpus/templates/design/app/i18n/en-US.ts +56 -1
- package/corpus/templates/design/app/i18n/es-ES.ts +56 -1
- package/corpus/templates/design/app/i18n/fr-FR.ts +57 -1
- package/corpus/templates/design/app/i18n/hi-IN.ts +56 -1
- package/corpus/templates/design/app/i18n/ja-JP.ts +56 -1
- package/corpus/templates/design/app/i18n/ko-KR.ts +56 -1
- package/corpus/templates/design/app/i18n/pt-BR.ts +57 -1
- package/corpus/templates/design/app/i18n/zh-CN.ts +56 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +51 -0
- package/corpus/templates/design/app/pages/Present.tsx +172 -14
- package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +23 -0
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +10 -0
- package/corpus/templates/design/app/pages/present-review-state.ts +18 -0
- package/corpus/templates/design/app/public-routes.ts +8 -0
- package/corpus/templates/design/app/root.tsx +7 -6
- package/corpus/templates/design/changelog/2026-07-13-dragged-design-assets-now-appear-at-the-visible-drop-locatio.md +6 -0
- package/corpus/templates/design/changelog/2026-07-13-reviewers-can-pin-comments-on-shared-designs-and-apply-verif.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +10 -0
- package/corpus/templates/design/server/plugins/auth.ts +7 -5
- package/corpus/templates/design/server/plugins/review.ts +9 -0
- package/corpus/templates/design/shared/review-anchor.ts +83 -0
- package/corpus/templates/design/shared/review-summary.ts +25 -0
- package/corpus/templates/dispatch/changelog/2026-07-14-dispatch-now-distinguishes-connected-agents-from-locally-mou.md +6 -0
- package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +2 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/actions/create-form.ts +2 -1
- package/corpus/templates/forms/actions/update-form.ts +5 -2
- package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +19 -0
- package/corpus/templates/forms/changelog/2026-07-14-fixed-the-ask-forms-loading-input-appearing-above-the-welcom.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-14-form-social-previews-now-show-the-form-title-description-and.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-14-forms-can-email-the-form-owner-when-new-responses-arrive.md +6 -0
- package/corpus/templates/forms/server/handlers/submissions.ts +17 -0
- package/corpus/templates/forms/server/lib/form-og-image.ts +64 -6
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +6 -2
- package/corpus/templates/forms/server/lib/response-email.ts +65 -0
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/forms/server/routes/api/forms/og/[...slug]/og.png.get.ts +184 -0
- package/corpus/templates/forms/shared/types.ts +2 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +6 -4
- package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +7 -1
- package/dist/a2a/index.d.ts +2 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -1
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/server.d.ts +25 -0
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +30 -6
- package/dist/a2a/server.js.map +1 -1
- package/dist/agent/production-agent.d.ts +2 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +37 -12
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/create.d.ts +5 -3
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +44 -19
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +2 -2
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +2 -2
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +3 -562
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +3 -3875
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +6 -4
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-recap-skill.js +7 -1
- package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +3 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/analytics.d.ts +5 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +3 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/markdown-renderer.d.ts +1 -0
- package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/client/chat/markdown-renderer.js +36 -1
- package/dist/client/chat/markdown-renderer.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +5 -2
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/clipboard.d.ts +3 -1
- package/dist/client/clipboard.d.ts.map +1 -1
- package/dist/client/clipboard.js +24 -1
- package/dist/client/clipboard.js.map +1 -1
- package/dist/client/guided-questions.d.ts +3 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +2 -1
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/review/ReviewCommentComposer.d.ts +18 -0
- package/dist/client/review/ReviewCommentComposer.d.ts.map +1 -0
- package/dist/client/review/ReviewCommentComposer.js +30 -0
- package/dist/client/review/ReviewCommentComposer.js.map +1 -0
- package/dist/client/review/ReviewThreadPanel.d.ts +28 -1
- package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -1
- package/dist/client/review/ReviewThreadPanel.js +151 -39
- package/dist/client/review/ReviewThreadPanel.js.map +1 -1
- package/dist/client/review/index.d.ts +3 -2
- package/dist/client/review/index.d.ts.map +1 -1
- package/dist/client/review/index.js +2 -1
- package/dist/client/review/index.js.map +1 -1
- package/dist/client/review/use-review.d.ts +23 -0
- package/dist/client/review/use-review.d.ts.map +1 -1
- package/dist/client/review/use-review.js +3 -0
- package/dist/client/review/use-review.js.map +1 -1
- package/dist/client/use-agent-chat-context.d.ts +1 -1
- package/dist/client/use-agent-chat-context.d.ts.map +1 -1
- package/dist/client/use-agent-chat-context.js +4 -2
- package/dist/client/use-agent-chat-context.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/credentials/index.d.ts +12 -7
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +33 -8
- package/dist/credentials/index.js.map +1 -1
- package/dist/extensions/fetch-tool.d.ts +13 -1
- package/dist/extensions/fetch-tool.d.ts.map +1 -1
- package/dist/extensions/fetch-tool.js +9 -2
- package/dist/extensions/fetch-tool.js.map +1 -1
- package/dist/notifications/channels.js +20 -4
- package/dist/notifications/channels.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/review/actions/create-review-comment.js +2 -1
- package/dist/review/actions/create-review-comment.js.map +1 -1
- package/dist/review/actions/get-review-feedback.js +6 -11
- package/dist/review/actions/get-review-feedback.js.map +1 -1
- package/dist/review/actions/list-review-comments.d.ts +1 -0
- package/dist/review/actions/list-review-comments.js +25 -4
- package/dist/review/actions/list-review-comments.js.map +1 -1
- package/dist/review/actions/reply-review-comment.js +12 -5
- package/dist/review/actions/reply-review-comment.js.map +1 -1
- package/dist/review/actions/resolve-review-thread.d.ts +3 -0
- package/dist/review/actions/resolve-review-thread.js +20 -3
- package/dist/review/actions/resolve-review-thread.js.map +1 -1
- package/dist/review/actions/send-review-thread-to-agent.d.ts +17 -0
- package/dist/review/actions/send-review-thread-to-agent.d.ts.map +1 -0
- package/dist/review/actions/send-review-thread-to-agent.js +49 -0
- package/dist/review/actions/send-review-thread-to-agent.js.map +1 -0
- package/dist/review/identity.d.ts +6 -0
- package/dist/review/identity.d.ts.map +1 -0
- package/dist/review/identity.js +68 -0
- package/dist/review/identity.js.map +1 -0
- package/dist/review/index.d.ts +3 -1
- package/dist/review/index.d.ts.map +1 -1
- package/dist/review/index.js +2 -1
- package/dist/review/index.js.map +1 -1
- package/dist/review/store.d.ts +36 -0
- package/dist/review/store.d.ts.map +1 -1
- package/dist/review/store.js +223 -8
- package/dist/review/store.js.map +1 -1
- package/dist/review/types.d.ts +4 -0
- package/dist/review/types.d.ts.map +1 -1
- package/dist/review/types.js.map +1 -1
- package/dist/secrets/crypto.d.ts +15 -7
- package/dist/secrets/crypto.d.ts.map +1 -1
- package/dist/secrets/crypto.js +23 -10
- package/dist/secrets/crypto.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +16 -3
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +4 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts +45 -0
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +71 -5
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat/plugin-options.d.ts +16 -0
- package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
- package/dist/server/agent-chat/plugin-options.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +20 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +39 -4
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/derived-secret.d.ts +1 -1
- package/dist/server/derived-secret.d.ts.map +1 -1
- package/dist/server/derived-secret.js.map +1 -1
- package/dist/server/index.d.ts +3 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +4 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/locales/ar-SA/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/ar-SA/template-plan.mdx +7 -0
- package/docs/content/locales/de-DE/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/de-DE/template-plan.mdx +7 -0
- package/docs/content/locales/es-ES/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/es-ES/template-plan.mdx +14 -0
- package/docs/content/locales/fr-FR/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/fr-FR/template-plan.mdx +7 -0
- package/docs/content/locales/hi-IN/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/hi-IN/template-plan.mdx +7 -0
- package/docs/content/locales/ja-JP/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/ja-JP/template-plan.mdx +7 -0
- package/docs/content/locales/ko-KR/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/ko-KR/template-plan.mdx +7 -0
- package/docs/content/locales/pt-BR/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/pt-BR/template-plan.mdx +14 -0
- package/docs/content/locales/zh-CN/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/zh-CN/template-plan.mdx +7 -0
- package/docs/content/locales/zh-TW/pr-visual-recap.mdx +48 -30
- package/docs/content/locales/zh-TW/template-plan.mdx +7 -0
- package/docs/content/pr-visual-recap.mdx +50 -32
- package/docs/content/template-plan.mdx +14 -0
- package/docs/content/toolkit-comments-review.mdx +16 -2
- package/package.json +4 -1
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +0 -68
- 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/
|
|
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/
|
|
111
|
-
npx @agent-native/
|
|
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/
|
|
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/
|
|
144
|
-
npx @agent-native/
|
|
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-
|
|
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/
|
|
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/
|
|
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
|
|
242
|
-
| ------------------------ |
|
|
243
|
-
| `OPENAI_API_KEY` | —
|
|
244
|
-
| `VISUAL_RECAP_API_KEY` | —
|
|
245
|
-
| `VISUAL_RECAP_AGENT` | `claude`
|
|
246
|
-
| `VISUAL_RECAP_BASE_URL` | required for compatible backend
|
|
247
|
-
| `VISUAL_RECAP_MODEL` | required for compatible backend | Variable. Provider model id for OpenAI-compatible backends
|
|
248
|
-
| `VISUAL_RECAP_REASONING` | each model's default
|
|
249
|
-
| `RECAP_CLI_VERSION` | `latest`
|
|
250
|
-
| `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com`
|
|
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/
|
|
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/
|
|
394
|
-
npx @agent-native/
|
|
395
|
-
npx @agent-native/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
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",
|
|
@@ -38,10 +38,11 @@ function warnA2AUnauthOnce(): void {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
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".
|
|
62
|
-
*
|
|
63
|
-
*
|
|
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
|
-
|
|
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
|
|
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)
|
|
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
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
1684
|
-
*
|
|
1685
|
-
*
|
|
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
|
|