@agent-native/core 0.97.0 → 0.98.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +32 -0
- package/corpus/core/docs/content/authentication.mdx +3 -3
- package/corpus/core/docs/content/doctor.mdx +170 -0
- package/corpus/core/docs/content/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/security.mdx +2 -0
- package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/security.mdx +2 -0
- package/corpus/core/docs/content/locales/es-ES/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/security.mdx +2 -0
- package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/security.mdx +2 -0
- package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/security.mdx +2 -0
- package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/security.mdx +2 -0
- package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/security.mdx +2 -0
- package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/security.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/security.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +8 -7
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/security.mdx +2 -0
- package/corpus/core/docs/content/mcp-protocol.mdx +1 -1
- package/corpus/core/docs/content/security.mdx +2 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/scripts/finalize-build.mjs +63 -3
- package/corpus/core/scripts/materialize-source-corpus.mjs +101 -15
- package/corpus/core/src/action.ts +42 -0
- package/corpus/core/src/agent/engine/builder-engine.ts +3 -0
- package/corpus/core/src/agent/engine/context-directives-transform.ts +69 -0
- package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +168 -0
- package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +85 -0
- package/corpus/core/src/agent/production-agent.ts +129 -244
- package/corpus/core/src/cli/doctor.ts +9 -3
- package/corpus/core/src/cli/plan-local.ts +10 -2
- package/corpus/core/src/cli/skills-content/assets-skill.ts +83 -0
- package/corpus/core/src/cli/skills-content/canvas.ts +153 -0
- package/corpus/core/src/cli/skills-content/connection.ts +52 -0
- package/corpus/core/src/cli/skills-content/content-skill.ts +109 -0
- package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +118 -0
- package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
- package/corpus/core/src/cli/skills-content/document-quality.ts +196 -0
- package/corpus/core/src/cli/skills-content/exemplar.ts +69 -0
- package/corpus/core/src/cli/skills-content/help.ts +77 -0
- package/corpus/core/src/cli/skills-content/index.ts +22 -0
- package/corpus/core/src/cli/skills-content/local-files.ts +95 -0
- package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +80 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +470 -0
- package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +547 -0
- package/corpus/core/src/cli/skills-content/visualize-repo-skill.ts +93 -0
- package/corpus/core/src/cli/skills-content/wireframe.ts +349 -0
- package/corpus/core/src/cli/skills.ts +27 -2733
- package/corpus/core/src/client/AgentPanel.tsx +6 -5
- package/corpus/core/src/client/CommandMenu.tsx +16 -5
- package/corpus/core/src/client/FeedbackButton.tsx +2 -2
- package/corpus/core/src/client/app-providers.tsx +18 -5
- package/corpus/core/src/client/chat/tool-call-display.tsx +3 -3
- package/corpus/core/src/client/composer/PastedTextChip.tsx +1 -1
- package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +143 -45
- package/corpus/core/src/client/composer/TiptapComposer.tsx +1 -1
- package/corpus/core/src/client/composer/VoiceButton.tsx +21 -5
- package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +107 -10
- package/corpus/core/src/client/context-xray/ContextXRayPanel.tsx +5 -2
- package/corpus/core/src/client/extensions/ExtensionEditor.tsx +37 -4
- package/corpus/core/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
- package/corpus/core/src/client/extensions/ExtensionSlot.tsx +39 -10
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +44 -6
- package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -3
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +49 -11
- package/corpus/core/src/client/index.ts +0 -13
- package/corpus/core/src/client/progress/RunsTray.tsx +10 -3
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +7 -0
- package/corpus/core/src/client/settings/useBuilderStatus.ts +6 -0
- package/corpus/core/src/client/tool-cells/EditCell.tsx +19 -16
- package/corpus/core/src/client/tool-cells/FilesChangedSummary.tsx +26 -23
- package/corpus/core/src/client/tool-cells/WriteCell.tsx +19 -16
- package/corpus/core/src/client/visual-style-controls.tsx +1 -1
- package/corpus/core/src/deploy/build.ts +36 -14
- package/corpus/core/src/integrations/google-docs-poller.ts +23 -2
- package/corpus/core/src/integrations/plugin.ts +10 -0
- package/corpus/core/src/integrations/webhook-handler.ts +27 -2
- package/corpus/core/src/jobs/scheduler.ts +28 -2
- package/corpus/core/src/localization/default-messages.ts +8 -1
- package/corpus/core/src/mcp/oauth-token.ts +6 -1
- package/corpus/core/src/observability/routes.ts +36 -0
- package/corpus/core/src/observability/sentiment.ts +261 -0
- package/corpus/core/src/observability/store.ts +23 -0
- package/corpus/core/src/observability/traces.ts +49 -63
- package/corpus/core/src/observability/tracking-identity.ts +55 -0
- package/corpus/core/src/observability/types.ts +13 -0
- package/corpus/core/src/secrets/storage.ts +67 -3
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +199 -0
- package/corpus/core/src/server/agent-chat/browser-team-tools.ts +510 -0
- package/corpus/core/src/server/agent-chat/context-tools.ts +595 -0
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +470 -0
- package/corpus/core/src/server/agent-chat/lazy-fs.ts +11 -0
- package/corpus/core/src/server/agent-chat/mcp-glue.ts +91 -0
- package/corpus/core/src/server/agent-chat/plugin-options.ts +350 -0
- package/corpus/core/src/server/agent-chat/process-run-failure.ts +62 -0
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +688 -0
- package/corpus/core/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
- package/corpus/core/src/server/agent-chat/request-surface.ts +71 -0
- package/corpus/core/src/server/agent-chat/run-code-tools.ts +67 -0
- package/corpus/core/src/server/agent-chat/script-entries.ts +779 -0
- package/corpus/core/src/server/agent-chat/shared-thread.ts +301 -0
- package/corpus/core/src/server/agent-chat/skill-frontmatter.ts +41 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +364 -4182
- package/corpus/core/src/server/agent-teams.ts +26 -3
- package/corpus/core/src/server/auth.ts +55 -57
- package/corpus/core/src/server/credential-provider.ts +22 -25
- package/corpus/core/src/server/edge.ts +1 -0
- package/corpus/core/src/server/onboarding-html.ts +1 -16
- package/corpus/core/src/server/realtime-voice.ts +40 -5
- package/corpus/core/src/server/request-origin.ts +6 -2
- package/corpus/core/src/server/ssr-handler.ts +55 -2
- package/corpus/core/src/sharing/access.ts +155 -11
- package/corpus/core/src/sharing/registry.ts +7 -0
- package/corpus/core/src/styles/agent-native.css +15 -14
- package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +6 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +6 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
- package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
- package/corpus/core/src/templates/workspace-core/src/server/index.ts +4 -2
- package/corpus/core/src/testing.ts +26 -0
- package/corpus/core/src/triggers/dispatcher.ts +23 -2
- package/corpus/core/src/vite/client.ts +126 -2
- package/corpus/core/tsconfig.cli.json +1 -1
- package/corpus/core/tsconfig.json +5 -1
- package/corpus/templates/analytics/.agents/skills/bigquery/SKILL.md +2 -2
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/analytics/AGENTS.md +19 -6
- package/corpus/templates/analytics/actions/install-dashboard-template.ts +79 -43
- package/corpus/templates/analytics/actions/list-explorer-dashboards.ts +3 -3
- package/corpus/templates/analytics/actions/list-sql-dashboards.ts +8 -3
- package/corpus/templates/analytics/actions/rename-analysis.ts +8 -2
- package/corpus/templates/analytics/actions/rename-dashboard.ts +8 -7
- package/corpus/templates/analytics/actions/view-screen.ts +4 -23
- package/corpus/templates/analytics/app/components/ResourceLoadError.tsx +42 -0
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +85 -70
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +107 -89
- package/corpus/templates/analytics/app/components/layout/SidebarLoadError.tsx +24 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +15 -5
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/analytics/app/i18n-data.ts +40 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +6 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +36 -20
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +34 -20
- package/corpus/templates/analytics/app/pages/adhoc/explorer/use-explorer-config.ts +42 -41
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +43 -36
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +11 -2
- package/corpus/templates/analytics/app/root.tsx +13 -1
- package/corpus/templates/analytics/app/routes/_index.tsx +14 -2
- package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +1 -1
- package/corpus/templates/analytics/changelog/2026-07-11-agent-feedback-sentiment-dashboard.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-analytics-chats-now-start-faster-by-loading-metric-definitio.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-command-and-sql-previews-now-respond-without-lag.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-command-search-now-reports-loading-failures-and-lets-you-ret.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-dashboard-navigation-now-loads-faster-and-reports-request-fa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-inferred-message-sentiment-dashboard.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-microphone-settings-from-realtime-voice-mode-now-open-the-vo.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-more-dashboard-edit-paths-are-now-safe-against-simultaneous-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-renaming-a-dashboard-is-now-safe-against-simultaneous-agent-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-renaming-an-analysis-is-now-safe-against-simultaneous-edits.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-workspace-mounted-analytics-now-opens-ask-reliably-and-route.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +37 -3
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +339 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -24
- package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +0 -5
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +289 -20
- package/corpus/templates/analytics/server/lib/data-dictionary-context.ts +106 -34
- package/corpus/templates/analytics/server/lib/demo-dashboards.ts +4 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -39
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +30 -4
- package/corpus/templates/assets/app/routes/library.tsx +49 -5
- package/corpus/templates/assets/changelog/2026-07-11-library-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/calendar/.env.example +5 -0
- package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +2 -2
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +37 -1
- package/corpus/templates/calendar/app/pages/BookingsList.tsx +20 -3
- package/corpus/templates/calendar/changelog/2026-07-11-booking-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-11-event-cards-give-subtle-press-feedback-and-smoother-hover.md +6 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/clips/actions/decline-invite.ts +8 -0
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +209 -187
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +2 -2
- package/corpus/templates/clips/app/components/player/reactions-tray.tsx +17 -5
- package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -3
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +2 -2
- package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +119 -95
- package/corpus/templates/clips/app/global.css +45 -0
- package/corpus/templates/clips/app/root.tsx +4 -0
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +23 -2
- package/corpus/templates/clips/app/routes/_app.trash.tsx +24 -2
- package/corpus/templates/clips/changelog/2026-07-11-controls-and-folders-now-move-more-smoothly.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-11-declining-an-invitation-now-requires-being-its-recipient.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-11-recording-overlays-are-lighter-weight-and-no-longer-cause-pa.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-11-workspace-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.css +34 -5
- package/corpus/templates/clips/chrome-extension/src/styles.css +2 -2
- package/corpus/templates/clips/desktop/src/styles.css +71 -26
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/content/actions/move-document.ts +34 -18
- package/corpus/templates/content/app/components/QueryErrorState.tsx +39 -0
- package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +225 -1435
- package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +368 -0
- package/corpus/templates/content/app/components/editor/database/ListView.tsx +353 -0
- package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +580 -0
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -2
- package/corpus/templates/content/app/global.css +19 -19
- package/corpus/templates/content/app/root.tsx +2 -2
- package/corpus/templates/content/app/routes/_app._index.tsx +11 -1
- package/corpus/templates/content/changelog/2026-07-11-document-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/content/changelog/2026-07-11-editor-toggle-feedback-now-feels-more-responsive.md +6 -0
- package/corpus/templates/content/changelog/2026-07-11-moving-documents-at-the-same-time-no-longer-scrambles-their-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-11-public-document-chats-now-start-faster-while-keeping-full-do.md +6 -0
- package/corpus/templates/content/changelog/2026-07-11-reopening-a-comment-now-uses-consistent-permissions-everywhe.md +6 -0
- package/corpus/templates/content/changelog/2026-07-11-sidebar-resizing-now-tracks-your-cursor-instantly-instead-of.md +6 -0
- package/corpus/templates/content/server/lib/public-documents.ts +47 -10
- package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +24 -24
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/design/app/components/QueryErrorState.tsx +24 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +5 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +326 -319
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +198 -193
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +11 -4
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +1 -1
- package/corpus/templates/design/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/design/app/pages/DesignSystems.tsx +7 -1
- package/corpus/templates/design/app/pages/Index.tsx +14 -2
- package/corpus/templates/design/app/pages/Present.tsx +16 -3
- package/corpus/templates/design/app/pages/Templates.tsx +10 -4
- package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +484 -0
- package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +378 -0
- package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +138 -0
- package/corpus/templates/design/app/pages/design-editor/dom-utils.ts +15 -0
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +180 -0
- package/corpus/templates/design/app/pages/design-editor/html-layer-positioning.ts +226 -0
- package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +348 -0
- package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +160 -0
- package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +238 -0
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +23 -1
- package/corpus/templates/design/app/pages/design-editor/types.ts +25 -0
- package/corpus/templates/design/app/root.tsx +10 -1
- package/corpus/templates/design/changelog/2026-07-11-canvas-context-menus-now-open-without-motion-jitter.md +6 -0
- package/corpus/templates/design/changelog/2026-07-11-design-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/design/changelog/2026-07-11-inspector-tooltips-appear-instantly-as-you-sweep-across-icon.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +10 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +123 -0
- package/corpus/templates/dispatch/app/routes/integrations.tsx +163 -144
- package/corpus/templates/dispatch/changelog/2026-07-11-dispatch-mcp-connections-now-start-with-safer-app-access-and.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-11-overview-and-chat-now-share-a-cleaner-more-stable-flow.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-11-query-errors-now-show-a-retry-option.md +6 -0
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
- package/corpus/templates/forms/app/root.tsx +34 -8
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/macros/app/components/DailyProgress.tsx +25 -5
- package/corpus/templates/macros/app/components/QueryErrorState.tsx +31 -0
- package/corpus/templates/macros/app/components/WeightTracker.tsx +5 -1
- package/corpus/templates/macros/app/components/ui/button.tsx +1 -1
- package/corpus/templates/macros/app/components/ui/progress.tsx +1 -1
- package/corpus/templates/macros/app/components/ui/tabs.tsx +1 -1
- package/corpus/templates/macros/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/macros/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/macros/app/i18n/en-US.ts +2 -0
- package/corpus/templates/macros/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/macros/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/macros/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/macros/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/macros/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/macros/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/macros/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/macros/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/macros/app/routes/_index.tsx +22 -12
- package/corpus/templates/macros/app/routes/analytics.tsx +31 -10
- package/corpus/templates/macros/changelog/2026-07-11-daily-tracking-now-loads-and-updates-more-quickly.md +6 -0
- package/corpus/templates/macros/changelog/2026-07-11-data-load-failures-now-show-a-clear-error-with-a-retry-actio.md +6 -0
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/mail/.env.example +16 -11
- package/corpus/templates/mail/actions/list-emails.ts +39 -35
- package/corpus/templates/mail/app/components/email/ComposeModal.tsx +58 -6
- package/corpus/templates/mail/app/components/email/EmailListItem.tsx +35 -2
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +113 -104
- package/corpus/templates/mail/app/root.tsx +8 -10
- package/corpus/templates/mail/changelog/2026-07-11-compose-and-navigation-motion-now-feel-faster-and-smoother.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-11-swipe-to-archive-or-snooze-now-responds-to-quick-flicks-not-.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-11-the-assistant-now-sees-the-same-inbox-you-do-snoozed-mail-st.md +6 -0
- package/corpus/templates/mail/server/handlers/emails.ts +25 -69
- package/corpus/templates/mail/server/lib/list-inbox-emails.ts +169 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/plan/.env.example +4 -0
- package/corpus/templates/plan/actions/create-plan-design.ts +89 -81
- package/corpus/templates/plan/actions/create-prototype-plan.ts +72 -59
- package/corpus/templates/plan/actions/create-ui-plan.ts +70 -55
- package/corpus/templates/plan/actions/create-visual-plan.ts +65 -51
- package/corpus/templates/plan/actions/update-local-plan-folder.ts +43 -30
- package/corpus/templates/plan/actions/update-visual-plan.ts +81 -64
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +17 -0
- package/corpus/templates/plan/app/components/ui/tabs.tsx +1 -1
- package/corpus/templates/plan/app/i18n/ar-SA.ts +10 -0
- package/corpus/templates/plan/app/i18n/de-DE.ts +10 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +10 -0
- package/corpus/templates/plan/app/i18n/es-ES.ts +10 -0
- package/corpus/templates/plan/app/i18n/fr-FR.ts +10 -0
- package/corpus/templates/plan/app/i18n/hi-IN.ts +10 -0
- package/corpus/templates/plan/app/i18n/ja-JP.ts +10 -0
- package/corpus/templates/plan/app/i18n/ko-KR.ts +10 -0
- package/corpus/templates/plan/app/i18n/pt-BR.ts +10 -0
- package/corpus/templates/plan/app/i18n/zh-CN.ts +10 -0
- package/corpus/templates/plan/app/i18n/zh-TW.ts +10 -0
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +80 -1
- package/corpus/templates/plan/app/pages/PlansPage.tsx +152 -4
- package/corpus/templates/plan/app/root.tsx +11 -0
- package/corpus/templates/plan/changelog/2026-07-11-local-plans-now-explain-and-recover-from-browser-permission-.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-11-plan-edits-now-save-atomically-and-can-no-longer-partially-a.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-11-plan-lists-now-show-a-clear-error-with-a-retry-action-when-t.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +546 -260
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +1 -1
- package/corpus/templates/slides/actions/delete-slide-comment.ts +49 -0
- package/corpus/templates/slides/actions/update-slide-comment.ts +93 -0
- package/corpus/templates/slides/actions/view-screen.ts +14 -6
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +33 -10
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +2 -2
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +4 -2
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +4 -3
- package/corpus/templates/slides/app/context/DeckContext.tsx +9 -0
- package/corpus/templates/slides/app/i18n/ar-SA.ts +6 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +6 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +6 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +6 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +6 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +6 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +6 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +6 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +5 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +5 -0
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +23 -2
- package/corpus/templates/slides/app/pages/Index.tsx +29 -1
- package/corpus/templates/slides/changelog/2026-07-11-comment-load-failures-now-show-a-retry-action-instead-of-say.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-11-comment-pins-now-clear-with-a-faster-smoother-confirmation.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-11-deck-and-design-system-load-failures-now-show-a-retry-action.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-11-editor-toggles-and-toolbar-menus-now-animate-smoothly.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-11-the-assistant-can-now-resolve-reopen-and-delete-slide-commen.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-11-viewing-slides-no-longer-loads-every-deck-s-full-contents-in.md +6 -0
- package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +29 -48
- package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +29 -65
- package/dist/action.d.ts +23 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +13 -0
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +3 -0
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/context-directives-transform.d.ts +25 -0
- package/dist/agent/engine/context-directives-transform.d.ts.map +1 -0
- package/dist/agent/engine/context-directives-transform.js +53 -0
- package/dist/agent/engine/context-directives-transform.js.map +1 -0
- package/dist/agent/engine/continuation-dispatch-retry.d.ts +40 -0
- package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -0
- package/dist/agent/engine/continuation-dispatch-retry.js +109 -0
- package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -0
- package/dist/agent/engine/tool-call-journal-seed.d.ts +46 -0
- package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -0
- package/dist/agent/engine/tool-call-journal-seed.js +60 -0
- package/dist/agent/engine/tool-call-journal-seed.js.map +1 -0
- package/dist/agent/production-agent.d.ts +7 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +102 -222
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +8 -2
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/skills-content/assets-skill.d.ts +2 -0
- package/dist/cli/skills-content/assets-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/assets-skill.js +84 -0
- package/dist/cli/skills-content/assets-skill.js.map +1 -0
- package/dist/cli/skills-content/canvas.d.ts +4 -0
- package/dist/cli/skills-content/canvas.d.ts.map +1 -0
- package/dist/cli/skills-content/canvas.js +152 -0
- package/dist/cli/skills-content/canvas.js.map +1 -0
- package/dist/cli/skills-content/connection.d.ts +2 -0
- package/dist/cli/skills-content/connection.d.ts.map +1 -0
- package/dist/cli/skills-content/connection.js +53 -0
- package/dist/cli/skills-content/connection.js.map +1 -0
- package/dist/cli/skills-content/content-skill.d.ts +2 -0
- package/dist/cli/skills-content/content-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/content-skill.js +110 -0
- package/dist/cli/skills-content/content-skill.js.map +1 -0
- package/dist/cli/skills-content/design-exploration-skill.d.ts +2 -0
- package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/design-exploration-skill.js +119 -0
- package/dist/cli/skills-content/design-exploration-skill.js.map +1 -0
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts +2 -0
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/design-visual-edit-skill.js +229 -0
- package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -0
- package/dist/cli/skills-content/document-quality.d.ts +4 -0
- package/dist/cli/skills-content/document-quality.d.ts.map +1 -0
- package/dist/cli/skills-content/document-quality.js +195 -0
- package/dist/cli/skills-content/document-quality.js.map +1 -0
- package/dist/cli/skills-content/exemplar.d.ts +4 -0
- package/dist/cli/skills-content/exemplar.d.ts.map +1 -0
- package/dist/cli/skills-content/exemplar.js +68 -0
- package/dist/cli/skills-content/exemplar.js.map +1 -0
- package/dist/cli/skills-content/help.d.ts +2 -0
- package/dist/cli/skills-content/help.d.ts.map +1 -0
- package/dist/cli/skills-content/help.js +78 -0
- package/dist/cli/skills-content/help.js.map +1 -0
- package/dist/cli/skills-content/index.d.ts +23 -0
- package/dist/cli/skills-content/index.d.ts.map +1 -0
- package/dist/cli/skills-content/index.js +23 -0
- package/dist/cli/skills-content/index.js.map +1 -0
- package/dist/cli/skills-content/local-files.d.ts +2 -0
- package/dist/cli/skills-content/local-files.d.ts.map +1 -0
- package/dist/cli/skills-content/local-files.js +96 -0
- package/dist/cli/skills-content/local-files.js.map +1 -0
- package/dist/cli/skills-content/plan-setup-auth.d.ts +9 -0
- package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -0
- package/dist/cli/skills-content/plan-setup-auth.js +81 -0
- package/dist/cli/skills-content/plan-setup-auth.js.map +1 -0
- package/dist/cli/skills-content/visual-plan-skill.d.ts +2 -0
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/visual-plan-skill.js +471 -0
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -0
- package/dist/cli/skills-content/visual-recap-skill.d.ts +2 -0
- package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/visual-recap-skill.js +548 -0
- package/dist/cli/skills-content/visual-recap-skill.js.map +1 -0
- package/dist/cli/skills-content/visualize-repo-skill.d.ts +2 -0
- package/dist/cli/skills-content/visualize-repo-skill.d.ts.map +1 -0
- package/dist/cli/skills-content/visualize-repo-skill.js +94 -0
- package/dist/cli/skills-content/visualize-repo-skill.js.map +1 -0
- package/dist/cli/skills-content/wireframe.d.ts +4 -0
- package/dist/cli/skills-content/wireframe.d.ts.map +1 -0
- package/dist/cli/skills-content/wireframe.js +347 -0
- package/dist/cli/skills-content/wireframe.js.map +1 -0
- package/dist/cli/skills.d.ts +2 -10
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +2 -2710
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +4 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +15 -3
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/FeedbackButton.js +2 -2
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/app-providers.d.ts +13 -5
- package/dist/client/app-providers.d.ts.map +1 -1
- package/dist/client/app-providers.js +9 -6
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +4 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +3 -3
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/composer/PastedTextChip.js +1 -1
- package/dist/client/composer/PastedTextChip.js.map +1 -1
- package/dist/client/composer/RealtimeVoiceMode.d.ts +3 -1
- package/dist/client/composer/RealtimeVoiceMode.d.ts.map +1 -1
- package/dist/client/composer/RealtimeVoiceMode.js +35 -14
- package/dist/client/composer/RealtimeVoiceMode.js.map +1 -1
- package/dist/client/composer/TiptapComposer.js +1 -1
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts +2 -0
- package/dist/client/composer/VoiceButton.d.ts.map +1 -1
- package/dist/client/composer/VoiceButton.js +9 -3
- package/dist/client/composer/VoiceButton.js.map +1 -1
- package/dist/client/composer/useRealtimeVoiceMode.d.ts +5 -0
- package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +1 -1
- package/dist/client/composer/useRealtimeVoiceMode.js +91 -12
- package/dist/client/composer/useRealtimeVoiceMode.js.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.js +4 -1
- package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
- package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionEditor.js +15 -5
- package/dist/client/extensions/ExtensionEditor.js.map +1 -1
- package/dist/client/extensions/ExtensionQueryErrorState.d.ts +8 -0
- package/dist/client/extensions/ExtensionQueryErrorState.d.ts.map +1 -0
- package/dist/client/extensions/ExtensionQueryErrorState.js +11 -0
- package/dist/client/extensions/ExtensionQueryErrorState.js.map +1 -0
- package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionSlot.js +17 -7
- package/dist/client/extensions/ExtensionSlot.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +17 -7
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +5 -3
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +21 -8
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/index.d.ts +0 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -5
- package/dist/client/index.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +7 -3
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +4 -0
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +2 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +4 -0
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/tool-cells/EditCell.d.ts.map +1 -1
- package/dist/client/tool-cells/EditCell.js +2 -1
- package/dist/client/tool-cells/EditCell.js.map +1 -1
- package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -1
- package/dist/client/tool-cells/FilesChangedSummary.js +2 -1
- package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -1
- package/dist/client/tool-cells/WriteCell.d.ts.map +1 -1
- package/dist/client/tool-cells/WriteCell.js +2 -1
- package/dist/client/tool-cells/WriteCell.js.map +1 -1
- package/dist/client/visual-style-controls.js +1 -1
- package/dist/client/visual-style-controls.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +36 -14
- package/dist/deploy/build.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts +7 -0
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +13 -3
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +10 -0
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +11 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +16 -4
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +12 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +13 -3
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +7 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +8 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/oauth-token.d.ts +1 -1
- package/dist/mcp/oauth-token.d.ts.map +1 -1
- package/dist/mcp/oauth-token.js +6 -1
- package/dist/mcp/oauth-token.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts.map +1 -1
- package/dist/observability/routes.js +32 -0
- package/dist/observability/routes.js.map +1 -1
- package/dist/observability/sentiment.d.ts +42 -0
- package/dist/observability/sentiment.d.ts.map +1 -0
- package/dist/observability/sentiment.js +196 -0
- package/dist/observability/sentiment.js.map +1 -0
- package/dist/observability/store.d.ts +5 -0
- package/dist/observability/store.d.ts.map +1 -1
- package/dist/observability/store.js +17 -0
- package/dist/observability/store.js.map +1 -1
- package/dist/observability/traces.d.ts +2 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +42 -57
- package/dist/observability/traces.js.map +1 -1
- package/dist/observability/tracking-identity.d.ts +3 -0
- package/dist/observability/tracking-identity.d.ts.map +1 -0
- package/dist/observability/tracking-identity.js +51 -0
- package/dist/observability/tracking-identity.js.map +1 -0
- package/dist/observability/types.d.ts +10 -0
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js +3 -0
- package/dist/observability/types.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/storage.d.ts +6 -0
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +61 -3
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.d.ts +50 -0
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -0
- package/dist/server/agent-chat/action-filters-a2a.js +127 -0
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -0
- package/dist/server/agent-chat/browser-team-tools.d.ts +21 -0
- package/dist/server/agent-chat/browser-team-tools.d.ts.map +1 -0
- package/dist/server/agent-chat/browser-team-tools.js +417 -0
- package/dist/server/agent-chat/browser-team-tools.js.map +1 -0
- package/dist/server/agent-chat/context-tools.d.ts +33 -0
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -0
- package/dist/server/agent-chat/context-tools.js +520 -0
- package/dist/server/agent-chat/context-tools.js.map +1 -0
- package/dist/server/agent-chat/framework-prompts.d.ts +65 -0
- package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -0
- package/dist/server/agent-chat/framework-prompts.js +403 -0
- package/dist/server/agent-chat/framework-prompts.js.map +1 -0
- package/dist/server/agent-chat/lazy-fs.d.ts +2 -0
- package/dist/server/agent-chat/lazy-fs.d.ts.map +1 -0
- package/dist/server/agent-chat/lazy-fs.js +11 -0
- package/dist/server/agent-chat/lazy-fs.js.map +1 -0
- package/dist/server/agent-chat/mcp-glue.d.ts +9 -0
- package/dist/server/agent-chat/mcp-glue.d.ts.map +1 -0
- package/dist/server/agent-chat/mcp-glue.js +63 -0
- package/dist/server/agent-chat/mcp-glue.js.map +1 -0
- package/dist/server/agent-chat/plugin-options.d.ts +322 -0
- package/dist/server/agent-chat/plugin-options.d.ts.map +1 -0
- package/dist/server/agent-chat/plugin-options.js +2 -0
- package/dist/server/agent-chat/plugin-options.js.map +1 -0
- package/dist/server/agent-chat/process-run-failure.d.ts +12 -0
- package/dist/server/agent-chat/process-run-failure.d.ts.map +1 -0
- package/dist/server/agent-chat/process-run-failure.js +24 -0
- package/dist/server/agent-chat/process-run-failure.js.map +1 -0
- package/dist/server/agent-chat/prompt-resources.d.ts +28 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -0
- package/dist/server/agent-chat/prompt-resources.js +514 -0
- package/dist/server/agent-chat/prompt-resources.js.map +1 -0
- package/dist/server/agent-chat/recurring-jobs-runtime.d.ts +5 -0
- package/dist/server/agent-chat/recurring-jobs-runtime.d.ts.map +1 -0
- package/dist/server/agent-chat/recurring-jobs-runtime.js +53 -0
- package/dist/server/agent-chat/recurring-jobs-runtime.js.map +1 -0
- package/dist/server/agent-chat/request-surface.d.ts +8 -0
- package/dist/server/agent-chat/request-surface.d.ts.map +1 -0
- package/dist/server/agent-chat/request-surface.js +56 -0
- package/dist/server/agent-chat/request-surface.js.map +1 -0
- package/dist/server/agent-chat/run-code-tools.d.ts +17 -0
- package/dist/server/agent-chat/run-code-tools.d.ts.map +1 -0
- package/dist/server/agent-chat/run-code-tools.js +55 -0
- package/dist/server/agent-chat/run-code-tools.js.map +1 -0
- package/dist/server/agent-chat/script-entries.d.ts +47 -0
- package/dist/server/agent-chat/script-entries.d.ts.map +1 -0
- package/dist/server/agent-chat/script-entries.js +633 -0
- package/dist/server/agent-chat/script-entries.js.map +1 -0
- package/dist/server/agent-chat/shared-thread.d.ts +33 -0
- package/dist/server/agent-chat/shared-thread.d.ts.map +1 -0
- package/dist/server/agent-chat/shared-thread.js +242 -0
- package/dist/server/agent-chat/shared-thread.js.map +1 -0
- package/dist/server/agent-chat/skill-frontmatter.d.ts +7 -0
- package/dist/server/agent-chat/skill-frontmatter.d.ts.map +1 -0
- package/dist/server/agent-chat/skill-frontmatter.js +26 -0
- package/dist/server/agent-chat/skill-frontmatter.js.map +1 -0
- package/dist/server/agent-chat-plugin.d.ts +45 -486
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +173 -3005
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-teams.d.ts +10 -0
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +13 -3
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +50 -52
- package/dist/server/auth.js.map +1 -1
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +22 -21
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/edge.d.ts +1 -0
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +1 -0
- package/dist/server/edge.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +1 -16
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/realtime-voice.d.ts +3 -0
- package/dist/server/realtime-voice.d.ts.map +1 -1
- package/dist/server/realtime-voice.js +29 -5
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/server/request-origin.d.ts.map +1 -1
- package/dist/server/request-origin.js +6 -3
- package/dist/server/request-origin.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +47 -2
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/sharing/access.d.ts +63 -3
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +53 -15
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/registry.d.ts +7 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/styles/agent-native.css +15 -14
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +6 -0
- package/dist/templates/default/app/i18n/de-DE.ts +6 -0
- package/dist/templates/default/app/i18n/en-US.ts +6 -0
- package/dist/templates/default/app/i18n/es-ES.ts +6 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +6 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +6 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +6 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +6 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +6 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +6 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +6 -0
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
- package/dist/templates/workspace-core/src/server/index.ts +4 -2
- package/dist/testing.d.ts +16 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +16 -0
- package/dist/testing.js.map +1 -0
- package/dist/triggers/dispatcher.d.ts +7 -0
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +13 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/client.d.ts +16 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +105 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/content/authentication.mdx +3 -3
- package/docs/content/doctor.mdx +170 -0
- package/docs/content/external-agents.mdx +8 -7
- package/docs/content/locales/ar-SA/authentication.mdx +2 -2
- package/docs/content/locales/ar-SA/external-agents.mdx +8 -7
- package/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
- package/docs/content/locales/ar-SA/security.mdx +2 -0
- package/docs/content/locales/de-DE/authentication.mdx +1 -1
- package/docs/content/locales/de-DE/external-agents.mdx +8 -7
- package/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
- package/docs/content/locales/de-DE/security.mdx +2 -0
- package/docs/content/locales/es-ES/authentication.mdx +2 -2
- package/docs/content/locales/es-ES/external-agents.mdx +8 -7
- package/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
- package/docs/content/locales/es-ES/security.mdx +2 -0
- package/docs/content/locales/fr-FR/authentication.mdx +1 -1
- package/docs/content/locales/fr-FR/external-agents.mdx +8 -7
- package/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
- package/docs/content/locales/fr-FR/security.mdx +2 -0
- package/docs/content/locales/hi-IN/authentication.mdx +2 -2
- package/docs/content/locales/hi-IN/external-agents.mdx +8 -7
- package/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
- package/docs/content/locales/hi-IN/security.mdx +2 -0
- package/docs/content/locales/ja-JP/authentication.mdx +2 -2
- package/docs/content/locales/ja-JP/external-agents.mdx +8 -7
- package/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
- package/docs/content/locales/ja-JP/security.mdx +2 -0
- package/docs/content/locales/ko-KR/authentication.mdx +2 -2
- package/docs/content/locales/ko-KR/external-agents.mdx +8 -7
- package/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
- package/docs/content/locales/ko-KR/security.mdx +2 -0
- package/docs/content/locales/pt-BR/authentication.mdx +2 -2
- package/docs/content/locales/pt-BR/external-agents.mdx +8 -7
- package/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
- package/docs/content/locales/pt-BR/security.mdx +2 -0
- package/docs/content/locales/zh-CN/authentication.mdx +2 -2
- package/docs/content/locales/zh-CN/external-agents.mdx +8 -7
- package/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
- package/docs/content/locales/zh-CN/security.mdx +2 -0
- package/docs/content/locales/zh-TW/authentication.mdx +2 -2
- package/docs/content/locales/zh-TW/external-agents.mdx +8 -7
- package/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
- package/docs/content/locales/zh-TW/security.mdx +2 -0
- package/docs/content/mcp-protocol.mdx +1 -1
- package/docs/content/security.mdx +2 -0
- package/package.json +6 -2
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +6 -0
- package/src/templates/default/app/i18n/de-DE.ts +6 -0
- package/src/templates/default/app/i18n/en-US.ts +6 -0
- package/src/templates/default/app/i18n/es-ES.ts +6 -0
- package/src/templates/default/app/i18n/fr-FR.ts +6 -0
- package/src/templates/default/app/i18n/hi-IN.ts +6 -0
- package/src/templates/default/app/i18n/ja-JP.ts +6 -0
- package/src/templates/default/app/i18n/ko-KR.ts +6 -0
- package/src/templates/default/app/i18n/pt-BR.ts +6 -0
- package/src/templates/default/app/i18n/zh-CN.ts +6 -0
- package/src/templates/default/app/i18n/zh-TW.ts +6 -0
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
- package/src/templates/workspace-core/src/server/index.ts +4 -2
- package/corpus/core/src/client/ProductionAgentPanel.tsx +0 -9
- package/corpus/core/src/client/auth-redirect-url.ts +0 -23
- package/corpus/core/src/client/useProductionAgent.ts +0 -253
- package/corpus/core/src/shared/auth-redirect-url.ts +0 -1
- package/corpus/templates/analytics/app/pages/Index.tsx +0 -16
- package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +0 -173
- package/dist/client/ProductionAgentPanel.d.ts +0 -6
- package/dist/client/ProductionAgentPanel.d.ts.map +0 -1
- package/dist/client/ProductionAgentPanel.js +0 -6
- package/dist/client/ProductionAgentPanel.js.map +0 -1
- package/dist/client/auth-redirect-url.d.ts +0 -2
- package/dist/client/auth-redirect-url.d.ts.map +0 -1
- package/dist/client/auth-redirect-url.js +0 -19
- package/dist/client/auth-redirect-url.js.map +0 -1
- package/dist/client/useProductionAgent.d.ts +0 -24
- package/dist/client/useProductionAgent.d.ts.map +0 -1
- package/dist/client/useProductionAgent.js +0 -179
- package/dist/client/useProductionAgent.js.map +0 -1
- package/dist/shared/auth-redirect-url.d.ts +0 -2
- package/dist/shared/auth-redirect-url.d.ts.map +0 -1
- package/dist/shared/auth-redirect-url.js +0 -2
- package/dist/shared/auth-redirect-url.js.map +0 -1
|
@@ -617,6 +617,13 @@ export function createIntegrationsPlugin(
|
|
|
617
617
|
...localActions,
|
|
618
618
|
...callAgentEntry,
|
|
619
619
|
} as typeof localActions;
|
|
620
|
+
// Keep the app's own actions visible on the first request to the model;
|
|
621
|
+
// defer the framework additions merged in above (integration memory,
|
|
622
|
+
// call-agent) behind the tool-search entry `handleWebhook` /
|
|
623
|
+
// `startGoogleDocsPoller` attach to `actions`. The run loop's mid-run
|
|
624
|
+
// tool expansion still lets the model discover and call them after a
|
|
625
|
+
// search — see `filterInitialEngineTools` / `expandActiveTools`.
|
|
626
|
+
const initialToolNames = Object.keys(localActions);
|
|
620
627
|
|
|
621
628
|
const h3 = getH3App(nitroApp);
|
|
622
629
|
const P = `${FRAMEWORK_ROUTE_PREFIX}/integrations`;
|
|
@@ -1544,6 +1551,7 @@ export function createIntegrationsPlugin(
|
|
|
1544
1551
|
adapter,
|
|
1545
1552
|
systemPrompt: baseSystemPrompt + resources,
|
|
1546
1553
|
actions,
|
|
1554
|
+
initialToolNames,
|
|
1547
1555
|
model,
|
|
1548
1556
|
apiKey: getApiKey(),
|
|
1549
1557
|
engine: options?.engine,
|
|
@@ -2385,6 +2393,7 @@ export function createIntegrationsPlugin(
|
|
|
2385
2393
|
// where providers such as Discord enforce a 3-second deadline.
|
|
2386
2394
|
systemPrompt: baseSystemPrompt,
|
|
2387
2395
|
actions,
|
|
2396
|
+
initialToolNames,
|
|
2388
2397
|
model,
|
|
2389
2398
|
apiKey: getApiKey(),
|
|
2390
2399
|
engine: options?.engine,
|
|
@@ -2509,6 +2518,7 @@ export function createIntegrationsPlugin(
|
|
|
2509
2518
|
void startGoogleDocsPoller({
|
|
2510
2519
|
systemPrompt: baseSystemPrompt,
|
|
2511
2520
|
actions,
|
|
2521
|
+
initialToolNames,
|
|
2512
2522
|
model: model ?? "",
|
|
2513
2523
|
apiKey: getApiKey(),
|
|
2514
2524
|
ownerEmail: "integration@google-docs",
|
|
@@ -21,6 +21,7 @@ import type { AgentEngine, EngineMessage } from "../agent/engine/types.js";
|
|
|
21
21
|
import {
|
|
22
22
|
runAgentLoop,
|
|
23
23
|
actionsToEngineTools,
|
|
24
|
+
filterInitialEngineTools,
|
|
24
25
|
getOwnerActiveApiKey,
|
|
25
26
|
getOwnerApiKey,
|
|
26
27
|
engineToProvider,
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
buildAssistantMessage,
|
|
36
37
|
extractThreadMeta,
|
|
37
38
|
} from "../agent/thread-data-builder.js";
|
|
39
|
+
import { attachToolSearch } from "../agent/tool-search.js";
|
|
38
40
|
import { createThread, getThread } from "../chat-threads/store.js";
|
|
39
41
|
import { updateThreadData } from "../chat-threads/store.js";
|
|
40
42
|
import { isLocalDatabase } from "../db/client.js";
|
|
@@ -113,6 +115,17 @@ export interface WebhookHandlerOptions {
|
|
|
113
115
|
systemPrompt: string;
|
|
114
116
|
/** Action entries for the agent */
|
|
115
117
|
actions: Record<string, ActionEntry>;
|
|
118
|
+
/**
|
|
119
|
+
* Tool names to expose on the FIRST engine request. When provided, every
|
|
120
|
+
* other name in `actions` (framework additions such as
|
|
121
|
+
* `list-integration-memory` / `call-agent` merged in by
|
|
122
|
+
* `createIntegrationsPlugin`) is deferred behind the attached `tool-search`
|
|
123
|
+
* entry instead of being serialized on every inbound message — the run
|
|
124
|
+
* loop's mid-run tool expansion (`expandActiveTools` in `runAgentLoop`)
|
|
125
|
+
* still lets the model discover and call them after a search. Omit to keep
|
|
126
|
+
* the full `actions` set visible up front (current behavior).
|
|
127
|
+
*/
|
|
128
|
+
initialToolNames?: string[];
|
|
116
129
|
/** Model to use. Defaults to the resolved engine's default model. */
|
|
117
130
|
model?: string;
|
|
118
131
|
/** Anthropic API key */
|
|
@@ -573,6 +586,7 @@ async function processIncomingMessage(
|
|
|
573
586
|
adapter,
|
|
574
587
|
systemPrompt,
|
|
575
588
|
actions,
|
|
589
|
+
initialToolNames,
|
|
576
590
|
model,
|
|
577
591
|
apiKey,
|
|
578
592
|
ownerEmail,
|
|
@@ -763,10 +777,20 @@ async function processIncomingMessage(
|
|
|
763
777
|
// A2A delegation. Without this, getRequestOrgId() returns undefined and
|
|
764
778
|
// call-agent can't look up the org's a2a_secret or org_domain.
|
|
765
779
|
let orgId: string | null | undefined;
|
|
780
|
+
let runnableActions: Record<string, ActionEntry>;
|
|
766
781
|
let tools: ReturnType<typeof actionsToEngineTools>;
|
|
782
|
+
let availableTools: ReturnType<typeof actionsToEngineTools>;
|
|
767
783
|
try {
|
|
768
784
|
orgId = opts.orgId ?? (await resolveOrgIdForEmail(ownerEmail));
|
|
769
|
-
|
|
785
|
+
// Attach tool-search on a shallow copy so framework additions merged in
|
|
786
|
+
// by `createIntegrationsPlugin` (integration memory, `call-agent`) can be
|
|
787
|
+
// deferred behind it without mutating the plugin's long-lived registry.
|
|
788
|
+
// `runAgentLoop`'s `expandActiveTools` re-expands from `availableTools`
|
|
789
|
+
// after a tool-search call, so anything filtered out of the initial
|
|
790
|
+
// `tools` list stays reachable.
|
|
791
|
+
runnableActions = attachToolSearch({ ...actions });
|
|
792
|
+
availableTools = actionsToEngineTools(runnableActions);
|
|
793
|
+
tools = filterInitialEngineTools(availableTools, initialToolNames);
|
|
770
794
|
} catch (error) {
|
|
771
795
|
await releaseApplicableIntegrationBudgets(budgetReservations.reservations);
|
|
772
796
|
throw error;
|
|
@@ -855,8 +879,9 @@ async function processIncomingMessage(
|
|
|
855
879
|
model: resolvedModel,
|
|
856
880
|
systemPrompt: effectiveSystemPrompt,
|
|
857
881
|
tools,
|
|
882
|
+
availableTools,
|
|
858
883
|
messages,
|
|
859
|
-
actions,
|
|
884
|
+
actions: runnableActions,
|
|
860
885
|
send: async (event) => {
|
|
861
886
|
if (progress) {
|
|
862
887
|
await Promise.resolve(progress.onEvent(event)).catch(
|
|
@@ -8,10 +8,12 @@ import type { AgentEngine } from "../agent/engine/types.js";
|
|
|
8
8
|
import {
|
|
9
9
|
runAgentLoop,
|
|
10
10
|
actionsToEngineTools,
|
|
11
|
+
filterInitialEngineTools,
|
|
11
12
|
getOwnerActiveApiKey,
|
|
12
13
|
type ActionEntry,
|
|
13
14
|
} from "../agent/production-agent.js";
|
|
14
15
|
import { startRun, resolveRunSoftTimeoutMs } from "../agent/run-manager.js";
|
|
16
|
+
import { attachToolSearch } from "../agent/tool-search.js";
|
|
15
17
|
import { createThread } from "../chat-threads/store.js";
|
|
16
18
|
import {
|
|
17
19
|
organizationIdFromResourceOwner,
|
|
@@ -175,6 +177,18 @@ export function buildJobContent(meta: JobFrontmatter, body: string): string {
|
|
|
175
177
|
export interface SchedulerDeps {
|
|
176
178
|
getActions: () => Record<string, ActionEntry>;
|
|
177
179
|
getSystemPrompt: (owner: string) => Promise<string>;
|
|
180
|
+
/**
|
|
181
|
+
* Tool names to expose on the FIRST engine request for a job run. When
|
|
182
|
+
* provided, every other action returned by `getActions()` is deferred
|
|
183
|
+
* behind an attached `tool-search` entry instead of being serialized on
|
|
184
|
+
* every scheduled tick — `runAgentLoop`'s mid-run tool expansion
|
|
185
|
+
* (`expandActiveTools`) still lets the model discover and call them after
|
|
186
|
+
* a search. Omit to keep the full `getActions()` set visible up front
|
|
187
|
+
* (current behavior). The caller (not this module) knows which of the
|
|
188
|
+
* merged actions are the app's own vs. framework additions, so this must
|
|
189
|
+
* be supplied explicitly rather than inferred here.
|
|
190
|
+
*/
|
|
191
|
+
getInitialToolNames?: () => string[] | undefined;
|
|
178
192
|
/** Optional engine override. Defaults to the resolved request engine. */
|
|
179
193
|
engine?: AgentEngine;
|
|
180
194
|
apiKey?: string;
|
|
@@ -463,9 +477,20 @@ async function executeJob(
|
|
|
463
477
|
},
|
|
464
478
|
async () => {
|
|
465
479
|
try {
|
|
466
|
-
const
|
|
480
|
+
const baseActions = deps.getActions();
|
|
467
481
|
const systemPrompt = await deps.getSystemPrompt(jobUserEmail);
|
|
468
|
-
const
|
|
482
|
+
const initialToolNames = deps.getInitialToolNames?.();
|
|
483
|
+
// Only attach tool-search (and pay its schema cost) when the caller
|
|
484
|
+
// actually supplied an initial subset to filter down to — otherwise
|
|
485
|
+
// this is byte-for-byte the prior unfiltered behavior.
|
|
486
|
+
const actions = initialToolNames
|
|
487
|
+
? attachToolSearch({ ...baseActions })
|
|
488
|
+
: baseActions;
|
|
489
|
+
const availableTools = actionsToEngineTools(actions);
|
|
490
|
+
const tools = filterInitialEngineTools(
|
|
491
|
+
availableTools,
|
|
492
|
+
initialToolNames,
|
|
493
|
+
);
|
|
469
494
|
|
|
470
495
|
// Prefer the job runner's saved Anthropic key so recurring jobs
|
|
471
496
|
// don't silently bill the shared platform key once a user has
|
|
@@ -537,6 +562,7 @@ async function executeJob(
|
|
|
537
562
|
model,
|
|
538
563
|
systemPrompt,
|
|
539
564
|
tools,
|
|
565
|
+
availableTools,
|
|
540
566
|
messages,
|
|
541
567
|
actions,
|
|
542
568
|
send,
|
|
@@ -218,7 +218,7 @@ const messages = {
|
|
|
218
218
|
"Voice mode keeps listening while the agent navigates and takes actions.",
|
|
219
219
|
setupTitle: "Set up voice mode",
|
|
220
220
|
setupDescription:
|
|
221
|
-
"Connect Builder to use managed voice with credits, or use your own OpenAI API key.",
|
|
221
|
+
"Connect Builder to use managed voice with free credits, or use your own OpenAI API key.",
|
|
222
222
|
connectBuilder: "Connect Builder",
|
|
223
223
|
useOpenAiKey: "Use OpenAI API key",
|
|
224
224
|
startWithOpenAiKey: "Start with OpenAI key",
|
|
@@ -227,6 +227,7 @@ const messages = {
|
|
|
227
227
|
showChat: "Show chat",
|
|
228
228
|
hideChat: "Hide chat",
|
|
229
229
|
end: "End voice mode",
|
|
230
|
+
microphoneSettings: "Microphone settings",
|
|
230
231
|
status: {
|
|
231
232
|
connecting: "Connecting",
|
|
232
233
|
listening: "Listening",
|
|
@@ -408,6 +409,12 @@ const messages = {
|
|
|
408
409
|
contentLabel: "Content",
|
|
409
410
|
previewTitle: "Extension preview",
|
|
410
411
|
previewEmpty: "Preview will appear here",
|
|
412
|
+
loadError: "Couldn't load extensions.",
|
|
413
|
+
widgetsLoadError: "Couldn't load widgets.",
|
|
414
|
+
widgetAreasLoadError: "Couldn't load widget areas.",
|
|
415
|
+
historyLoadError: "Couldn't load extension history.",
|
|
416
|
+
versionLoadError: "Couldn't load this extension version.",
|
|
417
|
+
retry: "Retry",
|
|
411
418
|
},
|
|
412
419
|
org: {
|
|
413
420
|
createTitle: "Create your organization",
|
|
@@ -10,7 +10,12 @@ import {
|
|
|
10
10
|
|
|
11
11
|
export { MCP_OAUTH_ACCESS_TOKEN_TTL, MCP_OAUTH_ACCESS_TOKEN_TTL_SECONDS };
|
|
12
12
|
|
|
13
|
-
export const MCP_OAUTH_SCOPES = [
|
|
13
|
+
export const MCP_OAUTH_SCOPES = [
|
|
14
|
+
"mcp:read",
|
|
15
|
+
"mcp:write",
|
|
16
|
+
"mcp:apps",
|
|
17
|
+
"offline_access",
|
|
18
|
+
] as const;
|
|
14
19
|
|
|
15
20
|
export const MCP_OAUTH_DEFAULT_SCOPE = MCP_OAUTH_SCOPES.join(" ");
|
|
16
21
|
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
|
|
31
31
|
import { getSession } from "../server/auth.js";
|
|
32
32
|
import { readBody } from "../server/h3-helpers.js";
|
|
33
|
+
import { track } from "../tracking/registry.js";
|
|
33
34
|
import {
|
|
34
35
|
getObservabilityOverview,
|
|
35
36
|
getTraceSummaries,
|
|
@@ -47,6 +48,7 @@ import {
|
|
|
47
48
|
updateExperiment,
|
|
48
49
|
getExperimentResults,
|
|
49
50
|
} from "./store.js";
|
|
51
|
+
import { trackingIdentityProperties } from "./tracking-identity.js";
|
|
50
52
|
import type { FeedbackType, ExperimentStatus } from "./types.js";
|
|
51
53
|
|
|
52
54
|
function nanoid(size = 21): string {
|
|
@@ -205,6 +207,40 @@ export function createObservabilityHandler() {
|
|
|
205
207
|
userId: owner,
|
|
206
208
|
createdAt: Date.now(),
|
|
207
209
|
});
|
|
210
|
+
// Emit one content-free analytics event for the explicit thumb itself.
|
|
211
|
+
// Category follow-ups intentionally do not emit: a thumbs-down followed
|
|
212
|
+
// by a category would otherwise double-count the same negative signal.
|
|
213
|
+
if (feedbackType === "thumbs_up" || feedbackType === "thumbs_down") {
|
|
214
|
+
const runId = body.runId ? String(body.runId) : null;
|
|
215
|
+
let model: string | undefined;
|
|
216
|
+
if (runId) {
|
|
217
|
+
try {
|
|
218
|
+
const summary = await getTraceSummary(runId, { userId: owner });
|
|
219
|
+
model = summary?.model || undefined;
|
|
220
|
+
} catch {
|
|
221
|
+
// Feedback persistence is authoritative; analytics enrichment is
|
|
222
|
+
// best-effort and must never make the submission fail.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const threadId = body.threadId ? String(body.threadId) : null;
|
|
227
|
+
track(
|
|
228
|
+
"$ai_feedback",
|
|
229
|
+
{
|
|
230
|
+
...trackingIdentityProperties(),
|
|
231
|
+
source: "agent_observability",
|
|
232
|
+
sentiment: feedbackType === "thumbs_up" ? "positive" : "negative",
|
|
233
|
+
feedback_type: feedbackType,
|
|
234
|
+
run_id: runId,
|
|
235
|
+
thread_id: threadId,
|
|
236
|
+
model,
|
|
237
|
+
$ai_trace_id: runId ?? undefined,
|
|
238
|
+
$ai_session_id: threadId ?? undefined,
|
|
239
|
+
$ai_model: model,
|
|
240
|
+
},
|
|
241
|
+
{ userId: owner },
|
|
242
|
+
);
|
|
243
|
+
}
|
|
208
244
|
// Fire-and-forget: recompute satisfaction score for the thread.
|
|
209
245
|
if (body.threadId) {
|
|
210
246
|
import("./feedback.js")
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import type { AgentEngine, EngineEvent } from "../agent/engine/types.js";
|
|
2
|
+
import { trackingIdentityProperties } from "./tracking-identity.js";
|
|
3
|
+
import type { ObservabilityConfig } from "./types.js";
|
|
4
|
+
import { DEFAULT_OBSERVABILITY_CONFIG } from "./types.js";
|
|
5
|
+
|
|
6
|
+
export const DEFAULT_INFERRED_SENTIMENT_MODEL = "gpt-5-6-luna";
|
|
7
|
+
export const HOSTED_INFERRED_SENTIMENT_SAMPLE_RATE = 1;
|
|
8
|
+
export const INFERRED_SENTIMENT_MAX_CHARS = 2_000;
|
|
9
|
+
export const INFERRED_SENTIMENT_TIMEOUT_MS = 5_000;
|
|
10
|
+
|
|
11
|
+
export type InferredSentiment = "positive" | "negative" | "neutral";
|
|
12
|
+
|
|
13
|
+
type SentimentEnv = Record<string, string | undefined>;
|
|
14
|
+
|
|
15
|
+
const ENABLED_VALUES = new Set(["1", "true", "on", "yes"]);
|
|
16
|
+
const DISABLED_VALUES = new Set(["0", "false", "off", "no"]);
|
|
17
|
+
const FIRST_PARTY_HOST_SUFFIX = ".agent-native.com";
|
|
18
|
+
|
|
19
|
+
function hostnameFromUrl(value: string | undefined): string | null {
|
|
20
|
+
const trimmed = value?.trim();
|
|
21
|
+
if (!trimmed) return null;
|
|
22
|
+
try {
|
|
23
|
+
const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
|
|
24
|
+
? new URL(trimmed)
|
|
25
|
+
: new URL(`https://${trimmed}`);
|
|
26
|
+
return url.hostname.toLowerCase();
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function isFirstPartyHostedAgentNative(
|
|
33
|
+
env: SentimentEnv = process.env,
|
|
34
|
+
): boolean {
|
|
35
|
+
return [
|
|
36
|
+
env.APP_URL,
|
|
37
|
+
env.BETTER_AUTH_URL,
|
|
38
|
+
env.URL,
|
|
39
|
+
env.DEPLOY_URL,
|
|
40
|
+
env.VERCEL_PROJECT_PRODUCTION_URL,
|
|
41
|
+
env.VERCEL_URL,
|
|
42
|
+
]
|
|
43
|
+
.map(hostnameFromUrl)
|
|
44
|
+
.some(
|
|
45
|
+
(hostname) =>
|
|
46
|
+
hostname === "agent-native.com" ||
|
|
47
|
+
Boolean(hostname?.endsWith(FIRST_PARTY_HOST_SUFFIX)),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function parseBooleanOverride(value: string | undefined): boolean | undefined {
|
|
52
|
+
const normalized = value?.trim().toLowerCase();
|
|
53
|
+
if (!normalized) return undefined;
|
|
54
|
+
if (ENABLED_VALUES.has(normalized)) return true;
|
|
55
|
+
if (DISABLED_VALUES.has(normalized)) return false;
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parseSampleRate(value: unknown): number | undefined {
|
|
60
|
+
if (value === "" || value === null || value === undefined) return undefined;
|
|
61
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
62
|
+
if (!Number.isFinite(parsed)) return undefined;
|
|
63
|
+
return Math.min(1, Math.max(0, parsed));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Resolve inference defaults without making self-hosted apps opt in silently.
|
|
68
|
+
* Explicit opt-out always wins. Otherwise stored app config and deployment
|
|
69
|
+
* env can override the first-party hosted default.
|
|
70
|
+
*/
|
|
71
|
+
export function resolveInferredSentimentConfig(
|
|
72
|
+
stored: Partial<ObservabilityConfig> | null | undefined,
|
|
73
|
+
env: SentimentEnv = process.env,
|
|
74
|
+
): Pick<
|
|
75
|
+
ObservabilityConfig,
|
|
76
|
+
| "inferredSentimentEnabled"
|
|
77
|
+
| "inferredSentimentSampleRate"
|
|
78
|
+
| "inferredSentimentModel"
|
|
79
|
+
> {
|
|
80
|
+
const hosted = isFirstPartyHostedAgentNative(env);
|
|
81
|
+
const storedRate = parseSampleRate(stored?.inferredSentimentSampleRate);
|
|
82
|
+
const envRate = parseSampleRate(
|
|
83
|
+
env.AGENT_NATIVE_INFERRED_SENTIMENT_SAMPLE_RATE,
|
|
84
|
+
);
|
|
85
|
+
const envEnabled = parseBooleanOverride(env.AGENT_NATIVE_INFERRED_SENTIMENT);
|
|
86
|
+
const storedModel = stored?.inferredSentimentModel?.trim();
|
|
87
|
+
const envModel = env.AGENT_NATIVE_INFERRED_SENTIMENT_MODEL?.trim();
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
inferredSentimentEnabled:
|
|
91
|
+
envEnabled === false || stored?.inferredSentimentEnabled === false
|
|
92
|
+
? false
|
|
93
|
+
: (envEnabled ?? stored?.inferredSentimentEnabled ?? hosted),
|
|
94
|
+
inferredSentimentSampleRate:
|
|
95
|
+
envRate ??
|
|
96
|
+
storedRate ??
|
|
97
|
+
(hosted ? HOSTED_INFERRED_SENTIMENT_SAMPLE_RATE : 0),
|
|
98
|
+
inferredSentimentModel:
|
|
99
|
+
envModel ||
|
|
100
|
+
storedModel ||
|
|
101
|
+
DEFAULT_OBSERVABILITY_CONFIG.inferredSentimentModel,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Stable deterministic sampling keeps retries for the same run consistent. */
|
|
106
|
+
export function shouldSampleInferredSentiment(
|
|
107
|
+
runId: string,
|
|
108
|
+
sampleRate: number,
|
|
109
|
+
): boolean {
|
|
110
|
+
if (sampleRate <= 0) return false;
|
|
111
|
+
if (sampleRate >= 1) return true;
|
|
112
|
+
let hash = 0x811c9dc5;
|
|
113
|
+
for (let index = 0; index < runId.length; index += 1) {
|
|
114
|
+
hash ^= runId.charCodeAt(index);
|
|
115
|
+
hash = Math.imul(hash, 0x01000193);
|
|
116
|
+
}
|
|
117
|
+
return (hash >>> 0) / 0x1_0000_0000 < sampleRate;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function shouldInferSentimentForTurn(args: {
|
|
121
|
+
internalContinuation: boolean;
|
|
122
|
+
isBackgroundWorker: boolean;
|
|
123
|
+
backgroundContinuationCount: number;
|
|
124
|
+
hasUserText: boolean;
|
|
125
|
+
}): boolean {
|
|
126
|
+
if (!args.hasUserText || args.internalContinuation) return false;
|
|
127
|
+
return !args.isBackgroundWorker || args.backgroundContinuationCount === 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function parseInferredSentiment(
|
|
131
|
+
output: string,
|
|
132
|
+
): InferredSentiment | null {
|
|
133
|
+
const normalized = output.trim().toLowerCase();
|
|
134
|
+
return normalized === "positive" ||
|
|
135
|
+
normalized === "negative" ||
|
|
136
|
+
normalized === "neutral"
|
|
137
|
+
? normalized
|
|
138
|
+
: null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function truncateInput(text: string): string {
|
|
142
|
+
return Array.from(text.trim())
|
|
143
|
+
.slice(0, INFERRED_SENTIMENT_MAX_CHARS)
|
|
144
|
+
.join("");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function classifySentiment(args: {
|
|
148
|
+
engine: AgentEngine;
|
|
149
|
+
model: string;
|
|
150
|
+
text: string;
|
|
151
|
+
}): Promise<InferredSentiment | null> {
|
|
152
|
+
if (
|
|
153
|
+
!args.engine.preserveCustomModels &&
|
|
154
|
+
args.engine.supportedModels.length > 0 &&
|
|
155
|
+
!args.engine.supportedModels.includes(args.model)
|
|
156
|
+
) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const input = truncateInput(args.text);
|
|
161
|
+
if (!input) return null;
|
|
162
|
+
|
|
163
|
+
const controller = new AbortController();
|
|
164
|
+
const timeout = setTimeout(
|
|
165
|
+
() => controller.abort(),
|
|
166
|
+
INFERRED_SENTIMENT_TIMEOUT_MS,
|
|
167
|
+
);
|
|
168
|
+
let output = "";
|
|
169
|
+
let finalOutput = "";
|
|
170
|
+
try {
|
|
171
|
+
for await (const event of args.engine.stream({
|
|
172
|
+
model: args.model,
|
|
173
|
+
systemPrompt:
|
|
174
|
+
"Classify the user's emotional sentiment. Reply with exactly one lowercase word: positive, negative, or neutral.",
|
|
175
|
+
messages: [{ role: "user", content: [{ type: "text", text: input }] }],
|
|
176
|
+
tools: [],
|
|
177
|
+
abortSignal: controller.signal,
|
|
178
|
+
maxOutputTokens: 8,
|
|
179
|
+
temperature: 0,
|
|
180
|
+
reasoningEffort: "low",
|
|
181
|
+
})) {
|
|
182
|
+
const typedEvent = event as EngineEvent;
|
|
183
|
+
if (typedEvent.type === "text-delta") output += typedEvent.text;
|
|
184
|
+
if (typedEvent.type === "assistant-content") {
|
|
185
|
+
finalOutput = typedEvent.parts
|
|
186
|
+
.filter((part) => part.type === "text")
|
|
187
|
+
.map((part) => part.text)
|
|
188
|
+
.join("");
|
|
189
|
+
}
|
|
190
|
+
if (typedEvent.type === "stop" && typedEvent.reason === "error") {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return parseInferredSentiment(finalOutput || output);
|
|
195
|
+
} catch {
|
|
196
|
+
return null;
|
|
197
|
+
} finally {
|
|
198
|
+
clearTimeout(timeout);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Best-effort classifier + content-free tracking emit. The main chat path
|
|
204
|
+
* awaits this only after the user-visible response has finished streaming.
|
|
205
|
+
*/
|
|
206
|
+
export async function inferAndTrackSentiment(args: {
|
|
207
|
+
/** Test/custom seam. Production intentionally uses the managed Builder engine. */
|
|
208
|
+
engine?: AgentEngine;
|
|
209
|
+
classifierModel: string;
|
|
210
|
+
precedingResponseModel: string;
|
|
211
|
+
text: string;
|
|
212
|
+
precedingRunId: string;
|
|
213
|
+
classificationTriggerRunId: string;
|
|
214
|
+
threadId: string | null;
|
|
215
|
+
userId: string | null;
|
|
216
|
+
sampleRate: number;
|
|
217
|
+
}): Promise<void> {
|
|
218
|
+
try {
|
|
219
|
+
if (
|
|
220
|
+
!shouldSampleInferredSentiment(
|
|
221
|
+
args.classificationTriggerRunId,
|
|
222
|
+
args.sampleRate,
|
|
223
|
+
)
|
|
224
|
+
) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const engine =
|
|
228
|
+
args.engine ??
|
|
229
|
+
(await import("../agent/engine/builder-engine.js")).createBuilderEngine();
|
|
230
|
+
const sentiment = await classifySentiment({
|
|
231
|
+
engine,
|
|
232
|
+
model: args.classifierModel,
|
|
233
|
+
text: args.text,
|
|
234
|
+
});
|
|
235
|
+
if (!sentiment) return;
|
|
236
|
+
|
|
237
|
+
const { track } = await import("../tracking/registry.js");
|
|
238
|
+
track(
|
|
239
|
+
"$ai_sentiment",
|
|
240
|
+
{
|
|
241
|
+
...trackingIdentityProperties(),
|
|
242
|
+
source: "agent_observability",
|
|
243
|
+
method: "llm",
|
|
244
|
+
sentiment,
|
|
245
|
+
model: args.precedingResponseModel,
|
|
246
|
+
classifier_model: args.classifierModel,
|
|
247
|
+
classifier_engine: engine.name,
|
|
248
|
+
attribution: "user_reaction_to_preceding_model",
|
|
249
|
+
run_id: args.precedingRunId,
|
|
250
|
+
classification_trigger_run_id: args.classificationTriggerRunId,
|
|
251
|
+
thread_id: args.threadId,
|
|
252
|
+
$ai_model: args.precedingResponseModel,
|
|
253
|
+
$ai_trace_id: args.precedingRunId,
|
|
254
|
+
$ai_session_id: args.threadId ?? undefined,
|
|
255
|
+
},
|
|
256
|
+
{ userId: args.userId ?? undefined },
|
|
257
|
+
);
|
|
258
|
+
} catch {
|
|
259
|
+
// Inference and analytics are both optional and must never affect chat.
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -263,6 +263,10 @@ export async function ensureObservabilityTables(): Promise<void> {
|
|
|
263
263
|
"idx_trace_summaries_user",
|
|
264
264
|
`CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,
|
|
265
265
|
);
|
|
266
|
+
await ensureIndexExists(
|
|
267
|
+
"idx_trace_summaries_thread_user_created",
|
|
268
|
+
`CREATE INDEX IF NOT EXISTS idx_trace_summaries_thread_user_created ON agent_trace_summaries (thread_id, user_id, created_at)`,
|
|
269
|
+
);
|
|
266
270
|
await ensureIndexExists(
|
|
267
271
|
"idx_trace_spans_user",
|
|
268
272
|
`CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,
|
|
@@ -360,6 +364,7 @@ export async function ensureObservabilityTables(): Promise<void> {
|
|
|
360
364
|
`CREATE INDEX IF NOT EXISTS idx_trace_spans_created ON agent_trace_spans (created_at)`,
|
|
361
365
|
`CREATE INDEX IF NOT EXISTS idx_trace_summaries_created ON agent_trace_summaries (created_at)`,
|
|
362
366
|
`CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,
|
|
367
|
+
`CREATE INDEX IF NOT EXISTS idx_trace_summaries_thread_user_created ON agent_trace_summaries (thread_id, user_id, created_at)`,
|
|
363
368
|
`CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,
|
|
364
369
|
`CREATE INDEX IF NOT EXISTS idx_feedback_thread ON agent_feedback (thread_id)`,
|
|
365
370
|
`CREATE INDEX IF NOT EXISTS idx_feedback_created ON agent_feedback (created_at)`,
|
|
@@ -594,6 +599,24 @@ export async function getTraceSummary(
|
|
|
594
599
|
return rowToTraceSummary(rows[0] as any);
|
|
595
600
|
}
|
|
596
601
|
|
|
602
|
+
/** Latest completed response in a thread, always scoped to its owner. */
|
|
603
|
+
export async function getLatestTraceSummaryForThread(
|
|
604
|
+
threadId: string,
|
|
605
|
+
opts: { userId: string; excludeRunId: string },
|
|
606
|
+
): Promise<TraceSummary | null> {
|
|
607
|
+
await ensureObservabilityTables();
|
|
608
|
+
const client = getDbExec();
|
|
609
|
+
const { rows } = await client.execute({
|
|
610
|
+
sql: `SELECT * FROM agent_trace_summaries
|
|
611
|
+
WHERE thread_id = ? AND user_id = ? AND run_id <> ?
|
|
612
|
+
ORDER BY created_at DESC
|
|
613
|
+
LIMIT 1`,
|
|
614
|
+
args: [threadId, opts.userId, opts.excludeRunId],
|
|
615
|
+
});
|
|
616
|
+
if (rows.length === 0) return null;
|
|
617
|
+
return rowToTraceSummary(rows[0] as any);
|
|
618
|
+
}
|
|
619
|
+
|
|
597
620
|
// ─── Feedback CRUD ───────────────────────────────────────────────────
|
|
598
621
|
|
|
599
622
|
export async function insertFeedback(entry: FeedbackEntry): Promise<void> {
|