@agent-native/core 0.92.7 → 0.92.9
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 +1 -1
- package/corpus/core/CHANGELOG.md +18 -0
- package/corpus/core/docs/content/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/ar-SA/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/ar-SA/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/de-DE/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/de-DE/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/es-ES/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/es-ES/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/fr-FR/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/fr-FR/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/hi-IN/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/hi-IN/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/ja-JP/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/ja-JP/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/ko-KR/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/ko-KR/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/pt-BR/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/pt-BR/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/zh-CN/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-CN/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.mdx +12 -0
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.mdx +4 -0
- package/corpus/core/docs/content/pr-visual-recap.mdx +3 -3
- package/corpus/core/docs/content/pure-agent-apps.mdx +22 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/builtin.ts +1 -1
- package/corpus/core/src/agent/model-config.ts +30 -30
- package/corpus/core/src/agent/production-agent.ts +129 -7
- package/corpus/core/src/cli/design-connect.ts +438 -83
- package/corpus/core/src/cli/recap.ts +17 -3
- package/corpus/core/src/client/AgentPanel.tsx +8 -1
- package/corpus/core/src/client/agent-chat-adapter.ts +12 -7
- package/corpus/core/src/client/composer/TiptapComposer.tsx +1 -1
- package/corpus/core/src/client/index.ts +4 -0
- package/corpus/core/src/client/org/TeamPage.tsx +41 -26
- package/corpus/core/src/client/use-action.ts +113 -1
- package/corpus/core/src/db/client.ts +12 -2
- package/corpus/core/src/db/create-get-db.ts +4 -1
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
- package/corpus/core/src/server/ssr-handler.ts +7 -0
- package/corpus/core/src/server/transcribe-voice.ts +1 -1
- package/corpus/core/src/usage/store.ts +13 -4
- package/corpus/core/src/vite/client.ts +38 -1
- package/corpus/templates/analytics/AGENTS.md +3 -0
- package/corpus/templates/analytics/actions/get-data-program.ts +78 -0
- package/corpus/templates/analytics/actions/list-data-programs.ts +49 -0
- package/corpus/templates/analytics/app/global.css +11 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +163 -17
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/analytics/app/i18n-data.ts +20 -0
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +96 -3
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +61 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +40 -2
- package/corpus/templates/analytics/changelog/2026-07-09-analytics-no-longer-forgets-successful-data-queries-when-a-l.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-09-dashboard-charts-keep-consistent-spacing-when-they-stack-ver.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-09-dashboard-charts-tables-and-extensions-can-be-selected-and-d.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-09-long-running-analytics-requests-now-recover-automatically-wh.md +6 -0
- package/corpus/templates/analytics/server/db/index.ts +6 -0
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +1 -7
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +102 -15
- package/corpus/templates/content/app/hooks/use-content-database.ts +52 -0
- package/corpus/templates/content/app/hooks/use-document-properties.ts +50 -6
- package/corpus/templates/content/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/content/app/i18n-data.ts +28 -0
- package/corpus/templates/content/changelog/2026-07-09-notion-conflict-warnings-no-longer-flash-during-normal-synce.md +6 -0
- package/corpus/templates/content/changelog/2026-07-09-property-menus-and-delete-confirmations-now-open-visibly-and.md +6 -0
- package/corpus/templates/content/server/lib/notion-sync.ts +130 -28
- package/corpus/templates/design/actions/add-breakpoint.ts +48 -68
- package/corpus/templates/design/actions/add-localhost-screens.ts +496 -61
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +2 -18
- package/corpus/templates/design/actions/apply-design-token-edit.ts +51 -82
- package/corpus/templates/design/actions/apply-tweaks.ts +63 -41
- package/corpus/templates/design/actions/capture-design-state.ts +2 -2
- package/corpus/templates/design/actions/connect-localhost.ts +58 -12
- package/corpus/templates/design/actions/create-component.ts +2 -18
- package/corpus/templates/design/actions/create-design-branch.ts +38 -18
- package/corpus/templates/design/actions/create-fusion-app.ts +15 -11
- package/corpus/templates/design/actions/delete-file.ts +19 -34
- package/corpus/templates/design/actions/deploy-design-preview.ts +59 -27
- package/corpus/templates/design/actions/deploy-fusion-app.ts +22 -15
- package/corpus/templates/design/actions/export-pdf.ts +2 -1
- package/corpus/templates/design/actions/export-zip.ts +9 -3
- package/corpus/templates/design/actions/generate-design.ts +107 -70
- package/corpus/templates/design/actions/get-component-details.ts +2 -18
- package/corpus/templates/design/actions/get-design-branch-diff.ts +2 -3
- package/corpus/templates/design/actions/get-design-surface-index.ts +2 -18
- package/corpus/templates/design/actions/get-design.ts +2 -1
- package/corpus/templates/design/actions/grant-localhost-write-consent.ts +7 -1
- package/corpus/templates/design/actions/import-design-tokens.ts +114 -76
- package/corpus/templates/design/actions/index-components.ts +2 -18
- package/corpus/templates/design/actions/list-design-source-capabilities.ts +23 -28
- package/corpus/templates/design/actions/list-local-files.ts +9 -2
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +82 -98
- package/corpus/templates/design/actions/open-component-source.ts +2 -18
- package/corpus/templates/design/actions/open-visual-edit.ts +19 -1
- package/corpus/templates/design/actions/present-design-variants.ts +70 -70
- package/corpus/templates/design/actions/preview-component-prop-edit.ts +4 -14
- package/corpus/templates/design/actions/read-local-file.ts +9 -2
- package/corpus/templates/design/actions/remove-breakpoint.ts +40 -61
- package/corpus/templates/design/actions/rename-screen.ts +425 -0
- package/corpus/templates/design/actions/request-localhost-write-consent.ts +12 -2
- package/corpus/templates/design/actions/revoke-localhost-write-consent.ts +9 -2
- package/corpus/templates/design/actions/sync-fusion-app.ts +56 -39
- package/corpus/templates/design/actions/update-design.ts +376 -61
- package/corpus/templates/design/actions/update-file.ts +455 -188
- package/corpus/templates/design/actions/write-local-file.ts +10 -2
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +685 -608
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +43 -15
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +576 -2015
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +62 -14
- package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +263 -25
- package/corpus/templates/design/app/components/design/design-canvas/annotation-submit.ts +34 -0
- package/corpus/templates/design/app/components/design/design-canvas/coordinate-transforms.ts +40 -0
- package/corpus/templates/design/app/components/design/design-canvas/creation.ts +47 -0
- package/corpus/templates/design/app/components/design/design-canvas/element-payload.ts +27 -0
- package/corpus/templates/design/app/components/design/design-canvas/embedded-frame.ts +62 -0
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +137 -0
- package/corpus/templates/design/app/components/design/design-canvas/file-drop.ts +10 -0
- package/corpus/templates/design/app/components/design/design-canvas/hit-test.ts +23 -0
- package/corpus/templates/design/app/components/design/design-canvas/iframe-events.ts +23 -0
- package/corpus/templates/design/app/components/design/design-canvas/iframe-pan.ts +177 -0
- package/corpus/templates/design/app/components/design/design-canvas/motion-types.ts +7 -0
- package/corpus/templates/design/app/components/design/design-canvas/pending-text-edit.ts +62 -0
- package/corpus/templates/design/app/components/design/index.ts +2 -2
- package/corpus/templates/design/app/components/design/multi-screen/canvas-tools.ts +100 -0
- package/corpus/templates/design/app/components/design/multi-screen/coordinate-transforms.ts +81 -0
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +23 -13
- package/corpus/templates/design/app/components/design/multi-screen/culling.ts +238 -19
- package/corpus/templates/design/app/components/design/multi-screen/draft-primitives.ts +424 -0
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +341 -0
- package/corpus/templates/design/app/components/design/multi-screen/iframe-targeting.ts +52 -0
- package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +62 -0
- package/corpus/templates/design/app/components/design/multi-screen/primitive-drop-target.ts +283 -0
- package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +272 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +5 -1
- package/corpus/templates/design/app/components/design/multi-screen/wheel-gesture-state.ts +12 -0
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +325 -84
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +15 -1
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +119 -47
- package/corpus/templates/design/app/i18n/zh-TW.ts +9 -0
- package/corpus/templates/design/app/i18n-data.ts +223 -0
- package/corpus/templates/design/app/lib/design-save-outbox.ts +379 -0
- package/corpus/templates/design/app/lib/png-clipboard.ts +113 -0
- package/corpus/templates/design/app/pages/design-editor/canvas-primitives.ts +229 -0
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +918 -0
- package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +43 -0
- package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +336 -0
- package/corpus/templates/design/app/pages/design-editor/data-operations.ts +270 -0
- package/corpus/templates/design/app/pages/design-editor/dom-guards.ts +24 -0
- package/corpus/templates/design/app/pages/design-editor/dom-utils.ts +11 -0
- package/corpus/templates/design/app/pages/design-editor/editor-session.ts +20 -0
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +408 -0
- package/corpus/templates/design/app/pages/design-editor/export-capture.ts +115 -0
- package/corpus/templates/design/app/pages/design-editor/geometry-persistence.ts +93 -0
- package/corpus/templates/design/app/pages/design-editor/history.ts +169 -0
- package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +185 -0
- package/corpus/templates/design/app/pages/design-editor/motion-state.ts +309 -0
- package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +438 -0
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +510 -0
- package/corpus/templates/design/app/pages/design-editor/portable-style.ts +115 -0
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +337 -0
- package/corpus/templates/design/app/pages/design-editor/style-utils.ts +5 -0
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +92 -0
- package/corpus/templates/design/app/pages/design-editor/tweak-save.ts +87 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +36 -0
- package/corpus/templates/design/app/routes/design.$id.tsx +11 -1
- package/corpus/templates/design/changelog/2026-07-09-design-edits-canvas-positions-tools-and-tab-context-now-pers.md +6 -0
- package/corpus/templates/design/changelog/2026-07-09-figma-style-shortcuts-drawing-annotations-and-cross-screen-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-09-hand-and-scale-tools-now-keep-their-active-toolbar-identity-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-09-large-multi-screen-designs-now-stay-responsive-during-long-c.md +6 -0
- package/corpus/templates/design/changelog/2026-07-09-layer-drags-now-land-exactly-where-the-insertion-indicator-s.md +6 -0
- package/corpus/templates/design/server/db/index.ts +2 -52
- package/corpus/templates/design/server/db/schema.ts +16 -0
- package/corpus/templates/design/server/lib/design-data-access.ts +70 -0
- package/corpus/templates/design/server/lib/design-data-mutation.ts +249 -0
- package/corpus/templates/design/server/lib/fusion-screens.ts +89 -76
- package/corpus/templates/design/server/lib/import-design-files.ts +76 -35
- package/corpus/templates/design/server/lib/verify-write-grant.ts +7 -2
- package/corpus/templates/design/server/plugins/db.ts +19 -0
- package/corpus/templates/design/server/source-workspace.ts +12 -13
- package/corpus/templates/design/shared/resolve-tweaks.ts +15 -0
- package/corpus/templates/design/shared/screen-rename.ts +42 -0
- package/corpus/templates/design/shared/source-mode.ts +84 -4
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/model-config.d.ts +9 -9
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +30 -30
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +60 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +106 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/design-connect.d.ts +30 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +359 -75
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +13 -3
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +10 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/composer/TiptapComposer.js +1 -1
- package/dist/client/composer/TiptapComposer.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/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +6 -5
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/use-action.d.ts +32 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +68 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/client.d.ts +3 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +7 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +2 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +7 -0
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.js +1 -1
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +13 -4
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +36 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.mdx +12 -0
- package/docs/content/locales/ar-SA/a2a-protocol.mdx +12 -0
- package/docs/content/locales/ar-SA/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/ar-SA/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/de-DE/a2a-protocol.mdx +12 -0
- package/docs/content/locales/de-DE/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/de-DE/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/es-ES/a2a-protocol.mdx +12 -0
- package/docs/content/locales/es-ES/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/es-ES/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/fr-FR/a2a-protocol.mdx +12 -0
- package/docs/content/locales/fr-FR/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/fr-FR/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/hi-IN/a2a-protocol.mdx +12 -0
- package/docs/content/locales/hi-IN/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/hi-IN/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/ja-JP/a2a-protocol.mdx +12 -0
- package/docs/content/locales/ja-JP/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/ja-JP/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/ko-KR/a2a-protocol.mdx +12 -0
- package/docs/content/locales/ko-KR/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/ko-KR/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/pt-BR/a2a-protocol.mdx +12 -0
- package/docs/content/locales/pt-BR/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/pt-BR/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/zh-CN/a2a-protocol.mdx +12 -0
- package/docs/content/locales/zh-CN/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/zh-CN/pure-agent-apps.mdx +4 -0
- package/docs/content/locales/zh-TW/a2a-protocol.mdx +12 -0
- package/docs/content/locales/zh-TW/pr-visual-recap.mdx +3 -3
- package/docs/content/locales/zh-TW/pure-agent-apps.mdx +4 -0
- package/docs/content/pr-visual-recap.mdx +3 -3
- package/docs/content/pure-agent-apps.mdx +22 -0
- package/package.json +2 -2
|
@@ -99,7 +99,7 @@ export const PR_VISUAL_RECAP_SETUP: string[] = [
|
|
|
99
99
|
" ANTHROPIC_API_KEY — the LLM key for the default Claude Code backend",
|
|
100
100
|
"Optional (only if you change defaults):",
|
|
101
101
|
" OPENAI_API_KEY (secret) + VISUAL_RECAP_AGENT=codex (variable) — use Codex instead of Claude",
|
|
102
|
-
" VISUAL_RECAP_MODEL / VISUAL_RECAP_REASONING (variables) — pin the model (e.g. gpt-5.
|
|
102
|
+
" VISUAL_RECAP_MODEL / VISUAL_RECAP_REASONING (variables) — pin the model (e.g. gpt-5.6-sol) and reasoning depth (none|minimal|low|medium|high|xhigh; Codex only)",
|
|
103
103
|
" VISUAL_RECAP_SKILL_SOURCE=repo (variable) — pin CI to the repo-local visual-recap skill instead of latest bundled guidance",
|
|
104
104
|
" VISUAL_RECAP_SECRET_SCAN=off|high-confidence|strict (variable) — default high-confidence; strict restores generic TOKEN/SECRET assignment suppression",
|
|
105
105
|
" PLAN_RECAP_APP_URL (secret) — only when self-hosting the plan app (defaults to https://plan.agent-native.com)",
|
|
@@ -2987,10 +2987,24 @@ export async function runShot(
|
|
|
2987
2987
|
});
|
|
2988
2988
|
}
|
|
2989
2989
|
const page = await context.newPage();
|
|
2990
|
-
await page.goto(captureUrl, {
|
|
2990
|
+
const navigationResponse = await page.goto(captureUrl, {
|
|
2991
2991
|
waitUntil: "domcontentloaded",
|
|
2992
2992
|
timeout: 45_000,
|
|
2993
2993
|
});
|
|
2994
|
+
if (!navigationResponse) {
|
|
2995
|
+
throw new Error("recap page did not return an HTTP response");
|
|
2996
|
+
}
|
|
2997
|
+
if (!navigationResponse.ok()) {
|
|
2998
|
+
throw new Error(
|
|
2999
|
+
`recap page returned HTTP ${navigationResponse.status()} while loading ${navigationResponse.url()}`,
|
|
3000
|
+
);
|
|
3001
|
+
}
|
|
3002
|
+
const contentType = navigationResponse.headers()["content-type"] ?? "";
|
|
3003
|
+
if (contentType && !/\btext\/html\b/i.test(contentType)) {
|
|
3004
|
+
throw new Error(
|
|
3005
|
+
`recap page returned unexpected content type ${contentType} while loading ${navigationResponse.url()}`,
|
|
3006
|
+
);
|
|
3007
|
+
}
|
|
2994
3008
|
await page.waitForLoadState("load", { timeout: 15_000 }).catch(() => {
|
|
2995
3009
|
// The selectors below are the real readiness signal for screenshots.
|
|
2996
3010
|
// Some recap pages keep long-lived/background requests open.
|
|
@@ -4135,7 +4149,7 @@ async function runUsage(args: Record<string, string | boolean>): Promise<void> {
|
|
|
4135
4149
|
const model =
|
|
4136
4150
|
parsed.model ??
|
|
4137
4151
|
optionalArg(args, "model") ??
|
|
4138
|
-
(agent === "codex" ? "gpt-5.
|
|
4152
|
+
(agent === "codex" ? "gpt-5.6-sol" : "claude");
|
|
4139
4153
|
const body: Record<string, unknown> = {
|
|
4140
4154
|
planId,
|
|
4141
4155
|
...(agent === "codex" || agent === "claude" ? { agent } : {}),
|
|
@@ -1274,7 +1274,14 @@ function AgentPanelInner({
|
|
|
1274
1274
|
{t("agentPanel.settings")}
|
|
1275
1275
|
</DropdownMenuItem>
|
|
1276
1276
|
)}
|
|
1277
|
-
<DropdownMenuItem
|
|
1277
|
+
<DropdownMenuItem
|
|
1278
|
+
onSelect={() => {
|
|
1279
|
+
// Defer past the closing DropdownMenu's focus-restore/dismiss-layer
|
|
1280
|
+
// teardown, otherwise it can immediately dismiss the Popover we're
|
|
1281
|
+
// opening in the same tick (Radix nested-overlay race).
|
|
1282
|
+
setTimeout(() => setFeedbackOpen(true), 0);
|
|
1283
|
+
}}
|
|
1284
|
+
>
|
|
1278
1285
|
<IconMessageDots size={14} className="shrink-0" />
|
|
1279
1286
|
{t("agentPanel.feedback")}
|
|
1280
1287
|
</DropdownMenuItem>
|
|
@@ -751,7 +751,7 @@ function hasContinuationProgress(content: ContentPart[]): boolean {
|
|
|
751
751
|
}
|
|
752
752
|
|
|
753
753
|
const COMPLETED_TOOL_TIMEOUT_NAME_RE =
|
|
754
|
-
/^(add|apply|archive|capture|create|delete|deploy|duplicate|edit|generate|grant|insert|migrate|move|present|publish|remove|rename|reorder|revoke|save|send|set|sync|trash|update|write)(-|$)/;
|
|
754
|
+
/^(add|apply|archive|capture|compose|create|delete|deploy|duplicate|edit|generate|grant|insert|install|migrate|move|mutate|present|publish|remove|rename|reorder|revoke|save|send|set|sync|trash|update|write)(-|$)/;
|
|
755
755
|
const COMPLETED_TOOL_TIMEOUT_NAME_ALLOWLIST = new Set([
|
|
756
756
|
"connect-assets-mcp",
|
|
757
757
|
"import-design-tokens",
|
|
@@ -1728,8 +1728,10 @@ export function createAgentChatAdapter(
|
|
|
1728
1728
|
|
|
1729
1729
|
// Mode switch for recovery ownership: durable/background-dispatched runs
|
|
1730
1730
|
// are always recovered by the server. Foreground self-chain follows the
|
|
1731
|
-
// server on healthy handoffs
|
|
1732
|
-
// to the client POST path
|
|
1731
|
+
// server on healthy handoffs. A loud continuation-dispatch failure falls
|
|
1732
|
+
// back to the client POST path in either mode because the server has
|
|
1733
|
+
// already marked the unclaimed successor terminal; the per-turn tool
|
|
1734
|
+
// journal keeps that retry from replaying completed side effects.
|
|
1733
1735
|
const isDurableBackgroundDispatch = () =>
|
|
1734
1736
|
currentRunDispatchMode?.startsWith("background") === true;
|
|
1735
1737
|
const isForegroundSelfChainDispatch = () =>
|
|
@@ -1737,12 +1739,15 @@ export function createAgentChatAdapter(
|
|
|
1737
1739
|
const shouldFollowServerContinuation = (
|
|
1738
1740
|
signal?: AgentAutoContinueSignal,
|
|
1739
1741
|
) => {
|
|
1742
|
+
if (
|
|
1743
|
+
signal?.errorInfo?.errorCode ===
|
|
1744
|
+
"background_continuation_dispatch_failed"
|
|
1745
|
+
) {
|
|
1746
|
+
return false;
|
|
1747
|
+
}
|
|
1740
1748
|
if (isDurableBackgroundDispatch()) return true;
|
|
1741
1749
|
if (!isForegroundSelfChainDispatch()) return false;
|
|
1742
|
-
return
|
|
1743
|
-
signal?.errorInfo?.errorCode !==
|
|
1744
|
-
"background_continuation_dispatch_failed"
|
|
1745
|
-
);
|
|
1750
|
+
return true;
|
|
1746
1751
|
};
|
|
1747
1752
|
|
|
1748
1753
|
const rememberRunSeq = (seq: number) => {
|
|
@@ -835,7 +835,7 @@ function latestModelsOnly(models: string[]): string[] {
|
|
|
835
835
|
seen.add(claude[1]);
|
|
836
836
|
return true;
|
|
837
837
|
}
|
|
838
|
-
// GPT: family = gpt-{major} (e.g. gpt-5.
|
|
838
|
+
// GPT: family = gpt-{major} (e.g. gpt-5.6-sol and gpt-5.6-luna are different)
|
|
839
839
|
// OpenAI reasoning: each is its own family
|
|
840
840
|
// Gemini: family = gemini-{major} + variant
|
|
841
841
|
const gemini = m.match(/^gemini-(\d+(?:\.\d+)?)-(.+?)(?:-preview)?$/);
|
|
@@ -920,12 +920,16 @@ export {
|
|
|
920
920
|
type DevOptionValue,
|
|
921
921
|
} from "./dev-overlay/index.js";
|
|
922
922
|
export {
|
|
923
|
+
ACTION_KEEPALIVE_BODY_BUDGET_BYTES,
|
|
923
924
|
callAction,
|
|
925
|
+
tryCallActionKeepalive,
|
|
924
926
|
useActionQuery,
|
|
925
927
|
useActionMutation,
|
|
926
928
|
type ActionRegistry,
|
|
927
929
|
type ClientActionCallOptions,
|
|
928
930
|
type ClientActionMethod,
|
|
931
|
+
type KeepaliveActionCallRejectionReason,
|
|
932
|
+
type KeepaliveActionCallResult,
|
|
929
933
|
} from "./use-action.js";
|
|
930
934
|
export { createAgentNativeQueryClient } from "./create-query-client.js";
|
|
931
935
|
export { AppProviders, type AppProvidersProps } from "./app-providers.js";
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
IconPlus,
|
|
27
27
|
IconAlertTriangle,
|
|
28
28
|
IconUsersGroup,
|
|
29
|
+
IconHelpCircle,
|
|
29
30
|
} from "@tabler/icons-react";
|
|
30
31
|
import { useMemo, useRef, useState, type ReactNode } from "react";
|
|
31
32
|
|
|
@@ -327,8 +328,6 @@ function MembersCard() {
|
|
|
327
328
|
const { data: invitationsData } = useOrgInvitations();
|
|
328
329
|
const switchOrg = useSwitchOrg();
|
|
329
330
|
|
|
330
|
-
const [showInviteForm, setShowInviteForm] = useState(false);
|
|
331
|
-
|
|
332
331
|
if (!org?.orgId) return null;
|
|
333
332
|
|
|
334
333
|
const isOwner = org.role === "owner";
|
|
@@ -372,26 +371,6 @@ function MembersCard() {
|
|
|
372
371
|
)}
|
|
373
372
|
</div>
|
|
374
373
|
|
|
375
|
-
{isOwnerOrAdmin && (
|
|
376
|
-
<div className="border-t border-border pt-4">
|
|
377
|
-
{!showInviteForm ? (
|
|
378
|
-
<button
|
|
379
|
-
type="button"
|
|
380
|
-
onClick={() => setShowInviteForm(true)}
|
|
381
|
-
className="inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90"
|
|
382
|
-
>
|
|
383
|
-
<IconUserPlus className="h-3.5 w-3.5" />
|
|
384
|
-
{t("org.inviteMembers")}
|
|
385
|
-
</button>
|
|
386
|
-
) : (
|
|
387
|
-
<BulkInviteForm
|
|
388
|
-
currentUserRole={org.role}
|
|
389
|
-
onClose={() => setShowInviteForm(false)}
|
|
390
|
-
/>
|
|
391
|
-
)}
|
|
392
|
-
</div>
|
|
393
|
-
)}
|
|
394
|
-
|
|
395
374
|
{isOwnerOrAdmin && (
|
|
396
375
|
<div className="grid gap-5 border-t border-border pt-4 lg:grid-cols-2">
|
|
397
376
|
<DomainSettingsSection
|
|
@@ -431,17 +410,37 @@ function MembersTableCard({
|
|
|
431
410
|
currentUserRole: string | null;
|
|
432
411
|
}) {
|
|
433
412
|
const t = useT();
|
|
413
|
+
const [showInviteForm, setShowInviteForm] = useState(false);
|
|
414
|
+
const canInvite = currentUserRole === "owner" || currentUserRole === "admin";
|
|
434
415
|
|
|
435
416
|
return (
|
|
436
417
|
<section className="rounded-lg border border-border bg-card">
|
|
437
|
-
<div className="flex flex-col gap-
|
|
418
|
+
<div className="flex flex-col gap-3 border-b border-border px-4 py-3 sm:flex-row sm:items-center sm:justify-between">
|
|
438
419
|
<div>
|
|
439
420
|
<h3 className="text-sm font-medium">{t("org.members")}</h3>
|
|
440
421
|
<p className="text-xs text-muted-foreground">
|
|
441
422
|
{t("org.memberCount", { count: members.length })}
|
|
442
423
|
</p>
|
|
443
424
|
</div>
|
|
425
|
+
{canInvite && !showInviteForm && (
|
|
426
|
+
<button
|
|
427
|
+
type="button"
|
|
428
|
+
onClick={() => setShowInviteForm(true)}
|
|
429
|
+
className="inline-flex items-center justify-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90"
|
|
430
|
+
>
|
|
431
|
+
<IconUserPlus className="h-3.5 w-3.5" />
|
|
432
|
+
{t("org.inviteMembers")}
|
|
433
|
+
</button>
|
|
434
|
+
)}
|
|
444
435
|
</div>
|
|
436
|
+
{canInvite && showInviteForm && (
|
|
437
|
+
<div className="border-b border-border p-4">
|
|
438
|
+
<BulkInviteForm
|
|
439
|
+
currentUserRole={currentUserRole}
|
|
440
|
+
onClose={() => setShowInviteForm(false)}
|
|
441
|
+
/>
|
|
442
|
+
</div>
|
|
443
|
+
)}
|
|
445
444
|
<Table>
|
|
446
445
|
<TableHeader>
|
|
447
446
|
<TableRow>
|
|
@@ -1181,9 +1180,25 @@ function A2ASecretSection({ secret }: { secret: string | null | undefined }) {
|
|
|
1181
1180
|
const masked = secret ? "****" + secret.slice(-8) : "Not set";
|
|
1182
1181
|
|
|
1183
1182
|
return (
|
|
1184
|
-
<div className="space-y-2
|
|
1185
|
-
<div className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
|
|
1186
|
-
Cross-app authentication
|
|
1183
|
+
<div className="space-y-2">
|
|
1184
|
+
<div className="flex items-center gap-1 text-xs font-medium text-muted-foreground uppercase tracking-wide">
|
|
1185
|
+
<span>Cross-app authentication</span>
|
|
1186
|
+
<Tooltip>
|
|
1187
|
+
<TooltipTrigger asChild>
|
|
1188
|
+
<a
|
|
1189
|
+
href="/docs/a2a-protocol#organization-secret-sync"
|
|
1190
|
+
target="_blank"
|
|
1191
|
+
rel="noopener noreferrer"
|
|
1192
|
+
aria-label="Read the cross-app authentication documentation"
|
|
1193
|
+
className="inline-flex size-3.5 items-center justify-center rounded-full text-muted-foreground hover:text-foreground"
|
|
1194
|
+
>
|
|
1195
|
+
<IconHelpCircle className="size-3" />
|
|
1196
|
+
</a>
|
|
1197
|
+
</TooltipTrigger>
|
|
1198
|
+
<TooltipContent>
|
|
1199
|
+
Read the cross-app authentication documentation
|
|
1200
|
+
</TooltipContent>
|
|
1201
|
+
</Tooltip>
|
|
1187
1202
|
</div>
|
|
1188
1203
|
<p className="text-[11px] text-muted-foreground">
|
|
1189
1204
|
This secret authenticates cross-app delegation (e.g. Dispatch to
|
|
@@ -212,6 +212,40 @@ export interface ActionFetchOptions {
|
|
|
212
212
|
signal?: AbortSignal;
|
|
213
213
|
/** Per-call override for the fetch timeout. */
|
|
214
214
|
timeoutMs?: number;
|
|
215
|
+
/** Keep the request alive while the document is being unloaded. */
|
|
216
|
+
keepalive?: boolean;
|
|
217
|
+
/** Pre-serialized mutation body used by the keepalive budget coordinator. */
|
|
218
|
+
serializedBody?: string;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Conservative per-document keepalive body budget. Browsers commonly enforce
|
|
223
|
+
* an approximately 64 KiB aggregate limit across every in-flight keepalive
|
|
224
|
+
* request; leaving headroom for other framework traffic prevents a request
|
|
225
|
+
* that passed our guard from being rejected by the browser at send time.
|
|
226
|
+
*/
|
|
227
|
+
export const ACTION_KEEPALIVE_BODY_BUDGET_BYTES = 48_000;
|
|
228
|
+
|
|
229
|
+
let reservedKeepaliveBodyBytes = 0;
|
|
230
|
+
|
|
231
|
+
function utf8ByteLength(value: string): number {
|
|
232
|
+
if (typeof TextEncoder !== "undefined") {
|
|
233
|
+
return new TextEncoder().encode(value).byteLength;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
let bytes = 0;
|
|
237
|
+
for (const character of value) {
|
|
238
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
239
|
+
bytes +=
|
|
240
|
+
codePoint <= 0x7f
|
|
241
|
+
? 1
|
|
242
|
+
: codePoint <= 0x7ff
|
|
243
|
+
? 2
|
|
244
|
+
: codePoint <= 0xffff
|
|
245
|
+
? 3
|
|
246
|
+
: 4;
|
|
247
|
+
}
|
|
248
|
+
return bytes;
|
|
215
249
|
}
|
|
216
250
|
|
|
217
251
|
async function actionFetch<T>(
|
|
@@ -237,6 +271,7 @@ async function actionFetch<T>(
|
|
|
237
271
|
method,
|
|
238
272
|
headers,
|
|
239
273
|
cache: "no-store",
|
|
274
|
+
keepalive: options?.keepalive,
|
|
240
275
|
};
|
|
241
276
|
|
|
242
277
|
if (method === "GET" && params && Object.keys(params).length > 0) {
|
|
@@ -245,7 +280,7 @@ async function actionFetch<T>(
|
|
|
245
280
|
const qs = serializeActionQueryParams(params);
|
|
246
281
|
if (qs) url += `?${qs}`;
|
|
247
282
|
} else if (method !== "GET" && params) {
|
|
248
|
-
init.body = JSON.stringify(params);
|
|
283
|
+
init.body = options?.serializedBody ?? JSON.stringify(params);
|
|
249
284
|
}
|
|
250
285
|
|
|
251
286
|
// One controller drives both cancellation sources: the caller's signal
|
|
@@ -394,6 +429,83 @@ export function callAction<
|
|
|
394
429
|
});
|
|
395
430
|
}
|
|
396
431
|
|
|
432
|
+
export type KeepaliveActionCallRejectionReason =
|
|
433
|
+
| "body-too-large"
|
|
434
|
+
| "budget-exhausted";
|
|
435
|
+
|
|
436
|
+
export type KeepaliveActionCallResult<TResult> =
|
|
437
|
+
| {
|
|
438
|
+
accepted: true;
|
|
439
|
+
bodyBytes: number;
|
|
440
|
+
completion: Promise<TResult>;
|
|
441
|
+
}
|
|
442
|
+
| {
|
|
443
|
+
accepted: false;
|
|
444
|
+
bodyBytes: number;
|
|
445
|
+
reason: KeepaliveActionCallRejectionReason;
|
|
446
|
+
completion: null;
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Attempts an unload-safe action call without exceeding the browser's shared
|
|
451
|
+
* keepalive request budget. The reservation remains held until the response
|
|
452
|
+
* body has completed, because browsers count every in-flight keepalive body
|
|
453
|
+
* against the same per-document quota.
|
|
454
|
+
*
|
|
455
|
+
* A rejected attempt is deliberately synchronous so callers can fall back to
|
|
456
|
+
* a durable outbox before returning from `pagehide`.
|
|
457
|
+
*/
|
|
458
|
+
export function tryCallActionKeepalive<
|
|
459
|
+
TResult = undefined,
|
|
460
|
+
TName extends ActionName = ActionName,
|
|
461
|
+
>(
|
|
462
|
+
actionName: TName,
|
|
463
|
+
params?: ActionParams<TName>,
|
|
464
|
+
options: Omit<ClientActionCallOptions, "method"> = {},
|
|
465
|
+
): KeepaliveActionCallResult<
|
|
466
|
+
TResult extends undefined ? ActionResult<TName> : TResult
|
|
467
|
+
> {
|
|
468
|
+
type R = TResult extends undefined ? ActionResult<TName> : TResult;
|
|
469
|
+
const serializedBody = JSON.stringify(params ?? {});
|
|
470
|
+
const bodyBytes = utf8ByteLength(serializedBody);
|
|
471
|
+
|
|
472
|
+
if (bodyBytes > ACTION_KEEPALIVE_BODY_BUDGET_BYTES) {
|
|
473
|
+
return {
|
|
474
|
+
accepted: false,
|
|
475
|
+
bodyBytes,
|
|
476
|
+
reason: "body-too-large",
|
|
477
|
+
completion: null,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (
|
|
482
|
+
reservedKeepaliveBodyBytes + bodyBytes >
|
|
483
|
+
ACTION_KEEPALIVE_BODY_BUDGET_BYTES
|
|
484
|
+
) {
|
|
485
|
+
return {
|
|
486
|
+
accepted: false,
|
|
487
|
+
bodyBytes,
|
|
488
|
+
reason: "budget-exhausted",
|
|
489
|
+
completion: null,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
reservedKeepaliveBodyBytes += bodyBytes;
|
|
494
|
+
const completion = actionFetch<R>(actionName, "POST", params, {
|
|
495
|
+
signal: options.signal,
|
|
496
|
+
timeoutMs: options.timeoutMs,
|
|
497
|
+
keepalive: true,
|
|
498
|
+
serializedBody,
|
|
499
|
+
}).finally(() => {
|
|
500
|
+
reservedKeepaliveBodyBytes = Math.max(
|
|
501
|
+
0,
|
|
502
|
+
reservedKeepaliveBodyBytes - bodyBytes,
|
|
503
|
+
);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
return { accepted: true, bodyBytes, completion };
|
|
507
|
+
}
|
|
508
|
+
|
|
397
509
|
// ---------------------------------------------------------------------------
|
|
398
510
|
// Query hook
|
|
399
511
|
// ---------------------------------------------------------------------------
|
|
@@ -39,6 +39,16 @@ export interface DbExecConfig {
|
|
|
39
39
|
d1Binding?: any;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/** Read the request-scoped Cloudflare binding without requiring every
|
|
43
|
+
* consuming app's TypeScript program to include core's ambient Worker globals. */
|
|
44
|
+
export function getCloudflareD1Binding(): unknown {
|
|
45
|
+
return (
|
|
46
|
+
globalThis as typeof globalThis & {
|
|
47
|
+
__cf_env?: { DB?: unknown };
|
|
48
|
+
}
|
|
49
|
+
).__cf_env?.DB;
|
|
50
|
+
}
|
|
51
|
+
|
|
42
52
|
// ---------------------------------------------------------------------------
|
|
43
53
|
// Per-app DATABASE_URL resolution
|
|
44
54
|
// ---------------------------------------------------------------------------
|
|
@@ -412,7 +422,7 @@ export function getDialect(): Dialect {
|
|
|
412
422
|
return _dialect;
|
|
413
423
|
}
|
|
414
424
|
|
|
415
|
-
const d1 =
|
|
425
|
+
const d1 = getCloudflareD1Binding();
|
|
416
426
|
if (d1) {
|
|
417
427
|
_dialect = "d1";
|
|
418
428
|
return _dialect;
|
|
@@ -1447,7 +1457,7 @@ async function initClient(): Promise<void> {
|
|
|
1447
1457
|
{
|
|
1448
1458
|
url,
|
|
1449
1459
|
authToken: getDatabaseAuthToken(),
|
|
1450
|
-
d1Binding: dialect === "d1" ?
|
|
1460
|
+
d1Binding: dialect === "d1" ? getCloudflareD1Binding() : undefined,
|
|
1451
1461
|
},
|
|
1452
1462
|
true,
|
|
1453
1463
|
);
|
|
@@ -5,6 +5,7 @@ import type { LibSQLDatabase } from "drizzle-orm/libsql";
|
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
getDialect,
|
|
8
|
+
getCloudflareD1Binding,
|
|
8
9
|
getDatabaseUrl,
|
|
9
10
|
getDatabaseAuthToken,
|
|
10
11
|
isLocalSqliteUrl,
|
|
@@ -444,7 +445,9 @@ export function createGetDb<T extends Record<string, unknown>>(schema: T) {
|
|
|
444
445
|
|
|
445
446
|
// D1 only if dialect detected it (DATABASE_URL takes priority)
|
|
446
447
|
if (dialect === "d1") {
|
|
447
|
-
const d1 =
|
|
448
|
+
const d1 = getCloudflareD1Binding() as
|
|
449
|
+
| Parameters<typeof drizzleD1>[0]
|
|
450
|
+
| undefined;
|
|
448
451
|
if (d1) {
|
|
449
452
|
_db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;
|
|
450
453
|
_dbReady = Promise.resolve(_db);
|
|
@@ -54,7 +54,7 @@ export const tool: ActionTool = {
|
|
|
54
54
|
model: {
|
|
55
55
|
type: "string",
|
|
56
56
|
description:
|
|
57
|
-
"Model ID (e.g. 'gpt-5.
|
|
57
|
+
"Model ID (e.g. 'gpt-5.6-sol', 'claude-sonnet-5', 'gemini-3-1-pro'). Required for \"set-app-default\"; optional for \"set\" and \"test\" where it defaults to the engine's default model.",
|
|
58
58
|
},
|
|
59
59
|
baseUrl: {
|
|
60
60
|
type: "string",
|
|
@@ -27,7 +27,7 @@ export const tool: ActionTool = {
|
|
|
27
27
|
model: {
|
|
28
28
|
type: "string",
|
|
29
29
|
description:
|
|
30
|
-
"Model ID to use with this engine (e.g. 'gpt-5.
|
|
30
|
+
"Model ID to use with this engine (e.g. 'gpt-5.6-sol', 'claude-sonnet-5'). Defaults to the engine's default model if omitted.",
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
required: ["engine"],
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
getAppBasePathFromViteEnv,
|
|
35
35
|
stripAppBasePath as canonicalStripAppBasePath,
|
|
36
36
|
} from "./app-base-path.js";
|
|
37
|
+
import { captureError } from "./capture-error.js";
|
|
37
38
|
import { runWithRequestContext } from "./request-context.js";
|
|
38
39
|
import { getSentryClientConfigScript } from "./sentry-config.js";
|
|
39
40
|
|
|
@@ -391,6 +392,12 @@ export function createH3SSRHandler(getBuild: () => Promise<unknown> | unknown) {
|
|
|
391
392
|
// that aid reconnaissance attacks. In dev we surface the message text
|
|
392
393
|
// so devtools shows something useful; in prod we return a bare 500.
|
|
393
394
|
console.error("[ssr-handler] SSR error:", err);
|
|
395
|
+
captureError(err, {
|
|
396
|
+
route: p,
|
|
397
|
+
method: event.req.method,
|
|
398
|
+
userAgent: event.req.headers.get("user-agent") ?? undefined,
|
|
399
|
+
tags: { renderMode: "anonymous-public", surface: "ssr" },
|
|
400
|
+
});
|
|
394
401
|
const isProd = process.env.NODE_ENV === "production";
|
|
395
402
|
const body = isProd
|
|
396
403
|
? "Internal Server Error"
|
|
@@ -51,7 +51,7 @@ const GROQ_MODEL = "whisper-large-v3-turbo";
|
|
|
51
51
|
const GROQ_CLEANUP_MODEL = "llama-3.3-70b-versatile";
|
|
52
52
|
const OPENAI_MODEL = "whisper-1";
|
|
53
53
|
const OPENAI_CHAT_URL = "https://api.openai.com/v1/chat/completions";
|
|
54
|
-
const OPENAI_CLEANUP_MODEL = "gpt-5.
|
|
54
|
+
const OPENAI_CLEANUP_MODEL = "gpt-5.6-luna";
|
|
55
55
|
const MAX_AUDIO_BYTES = 25 * 1024 * 1024; // Whisper hard limit.
|
|
56
56
|
// Hard cap for the dictation-cleanup text path (`sanitizeTranscriptText`
|
|
57
57
|
// below). This endpoint has no `task` field — it's always the Hold-Fn
|
|
@@ -98,13 +98,22 @@ const PRICING: Array<{ match: RegExp; pricing: ModelPricing }> = [
|
|
|
98
98
|
pricing: { input: 100, output: 500, cacheRead: 10, cacheWrite: 125 },
|
|
99
99
|
},
|
|
100
100
|
// ── OpenAI / Codex ──────────────────────────────────────────────────────────
|
|
101
|
-
// Published rates as of 2026-
|
|
102
|
-
// and has no separate cache-write token charge, so cacheWrite is 0.
|
|
103
|
-
//
|
|
101
|
+
// Published rates as of 2026-07; OpenAI bills cached input at a discount
|
|
102
|
+
// and has no separate cache-write token charge, so cacheWrite is 0. Sol and
|
|
103
|
+
// Terra have higher large-context rates after 272K tokens; this table tracks
|
|
104
|
+
// the standard rate because usage rows do not preserve request context size.
|
|
104
105
|
{
|
|
105
|
-
match: /gpt-5
|
|
106
|
+
match: /gpt-5[.-]6-sol/i,
|
|
106
107
|
pricing: { input: 500, output: 3000, cacheRead: 50, cacheWrite: 0 },
|
|
107
108
|
},
|
|
109
|
+
{
|
|
110
|
+
match: /gpt-5[.-]6-terra/i,
|
|
111
|
+
pricing: { input: 250, output: 1500, cacheRead: 25, cacheWrite: 0 },
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
match: /gpt-5[.-]6-luna/i,
|
|
115
|
+
pricing: { input: 100, output: 600, cacheRead: 10, cacheWrite: 0 },
|
|
116
|
+
},
|
|
108
117
|
{
|
|
109
118
|
match: /gpt-5/i,
|
|
110
119
|
pricing: { input: 125, output: 1000, cacheRead: 12.5, cacheWrite: 0 },
|
|
@@ -762,12 +762,15 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
762
762
|
{ specifier: "@libsql/client" },
|
|
763
763
|
{ specifier: "@amplitude/analytics-browser" },
|
|
764
764
|
{ specifier: "@assistant-ui/react" },
|
|
765
|
+
{ specifier: "@codemirror/lang-sql" },
|
|
766
|
+
{ specifier: "@codemirror/theme-one-dark" },
|
|
765
767
|
{ specifier: "@excalidraw/excalidraw" },
|
|
766
768
|
{ specifier: "@excalidraw/mermaid-to-excalidraw" },
|
|
767
769
|
{
|
|
768
770
|
specifier: "@modelcontextprotocol/ext-apps/app-bridge",
|
|
769
771
|
packageName: "@modelcontextprotocol/ext-apps",
|
|
770
772
|
},
|
|
773
|
+
{ specifier: "@paper-design/shaders-react" },
|
|
771
774
|
{ specifier: "@radix-ui/react-accordion" },
|
|
772
775
|
{ specifier: "@radix-ui/react-alert-dialog" },
|
|
773
776
|
{ specifier: "@radix-ui/react-aspect-ratio" },
|
|
@@ -795,6 +798,11 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
795
798
|
{ specifier: "@radix-ui/react-toggle" },
|
|
796
799
|
{ specifier: "@radix-ui/react-toggle-group" },
|
|
797
800
|
{ specifier: "@radix-ui/react-tooltip" },
|
|
801
|
+
{ specifier: "@sentry/browser" },
|
|
802
|
+
{
|
|
803
|
+
specifier: "@shadcn/react/message-scroller",
|
|
804
|
+
packageName: "@shadcn/react",
|
|
805
|
+
},
|
|
798
806
|
{ specifier: "@tanstack/react-query" },
|
|
799
807
|
{ specifier: "@tabler/icons-react" },
|
|
800
808
|
{ specifier: "@tiptap/core" },
|
|
@@ -813,6 +821,7 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
813
821
|
{ specifier: "@tiptap/pm/state", packageName: "@tiptap/pm" },
|
|
814
822
|
{ specifier: "@tiptap/react" },
|
|
815
823
|
{ specifier: "@tiptap/starter-kit" },
|
|
824
|
+
{ specifier: "@uiw/react-codemirror" },
|
|
816
825
|
{ specifier: "@xterm/addon-fit" },
|
|
817
826
|
{ specifier: "@xterm/addon-web-links" },
|
|
818
827
|
{ specifier: "@xterm/xterm" },
|
|
@@ -865,6 +874,8 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
865
874
|
specifier: "highlight.js/lib/languages/yaml",
|
|
866
875
|
packageName: "highlight.js",
|
|
867
876
|
},
|
|
877
|
+
{ specifier: "html2canvas" },
|
|
878
|
+
{ specifier: "i18next" },
|
|
868
879
|
{ specifier: "input-otp" },
|
|
869
880
|
{ specifier: "lowlight" },
|
|
870
881
|
{ specifier: "mermaid" },
|
|
@@ -872,6 +883,7 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
872
883
|
{ specifier: "next-themes" },
|
|
873
884
|
{ specifier: "react-hook-form" },
|
|
874
885
|
{ specifier: "react-day-picker" },
|
|
886
|
+
{ specifier: "react-i18next" },
|
|
875
887
|
{ specifier: "react-markdown" },
|
|
876
888
|
{ specifier: "react-resizable-panels" },
|
|
877
889
|
{ specifier: "recharts" },
|
|
@@ -916,7 +928,24 @@ function getDefaultOptimizeDeps(cwd: string): string[] {
|
|
|
916
928
|
.filter(({ specifier, packageName }) =>
|
|
917
929
|
hasOptimizeDep(packageName ?? specifier, cwd),
|
|
918
930
|
)
|
|
919
|
-
.map(({ specifier }) =>
|
|
931
|
+
.map(({ specifier, packageName }) => {
|
|
932
|
+
const dependencyName = packageName ?? specifier;
|
|
933
|
+
// In the monorepo, core is source-aliased and its dependencies live
|
|
934
|
+
// under packages/core/node_modules. A bare optimizeDeps.include entry
|
|
935
|
+
// is resolved from the template root, so core-only dependencies fail
|
|
936
|
+
// the initial prebundle and are rediscovered after the page loads. Vite
|
|
937
|
+
// then rebundles and reloads the editor. Its documented nested-dependency
|
|
938
|
+
// syntax resolves the right-hand package from core's package directory,
|
|
939
|
+
// while app-owned dependencies should remain direct entries.
|
|
940
|
+
if (
|
|
941
|
+
inMonorepo &&
|
|
942
|
+
!hasDep(dependencyName, cwd) &&
|
|
943
|
+
hasCoreDep(dependencyName, cwd)
|
|
944
|
+
) {
|
|
945
|
+
return `@agent-native/core > ${specifier}`;
|
|
946
|
+
}
|
|
947
|
+
return specifier;
|
|
948
|
+
});
|
|
920
949
|
}
|
|
921
950
|
|
|
922
951
|
/**
|
|
@@ -2590,6 +2619,14 @@ function createAgentNativeConfig(
|
|
|
2590
2619
|
...(userConfig.ssr ?? {}),
|
|
2591
2620
|
noExternal: /^(?!node:)/,
|
|
2592
2621
|
external: [
|
|
2622
|
+
// Yjs is used by both server-side collaboration actions and the
|
|
2623
|
+
// client SSR graph. If Vite inlines it here, Nitro also emits its
|
|
2624
|
+
// own server copy and a single request imports Yjs twice, breaking
|
|
2625
|
+
// Yjs constructor identity. This externalizes only Vite's
|
|
2626
|
+
// intermediate React Router SSR graph; Nitro's final Node/edge
|
|
2627
|
+
// bundle still owns and bundles the dependency, so both paths
|
|
2628
|
+
// share one portable module instance.
|
|
2629
|
+
"yjs",
|
|
2593
2630
|
...NODE_SSR_NATIVE_EXTERNALS,
|
|
2594
2631
|
...arrayFrom((userConfig.ssr as { external?: any })?.external),
|
|
2595
2632
|
],
|
|
@@ -175,6 +175,9 @@ details live in `.agents/skills/`.
|
|
|
175
175
|
|
|
176
176
|
- `navigation` exposes current dashboard, analysis, source, chart, and selected
|
|
177
177
|
context.
|
|
178
|
+
- Clicking a dashboard chart, table, or extension stages that panel as a chat
|
|
179
|
+
context chip and writes `selected-object` with `type="dashboard-panel"`.
|
|
180
|
+
Use its dashboard and panel ids to scope inspection and edits to that panel.
|
|
178
181
|
- `navigate` moves the user to the relevant analytics view, including
|
|
179
182
|
`view="catalog"` for the template catalog, `view="sessions"` for session
|
|
180
183
|
replay, `view="monitoring"` with `monitoringView="uptime|errors"` (plus the
|