@agent-native/core 0.169.0 → 0.170.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/agent-native.eject.json +4 -1
- package/bin/agent-native.js +23 -5
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/analytics/actions/bigquery-table-info.ts +3 -2
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/search-bigquery-schema.ts +130 -4
- package/corpus/templates/analytics/agent-native.config.ts +1 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +36 -23
- package/corpus/templates/analytics/app/i18n-data.ts +28 -0
- package/corpus/templates/analytics/app/lib/dashboard-visibility.ts +41 -0
- package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
- package/corpus/templates/analytics/app/pages/DashboardOverview.tsx +34 -9
- package/corpus/templates/analytics/app/routes/$.tsx +10 -0
- package/corpus/templates/analytics/app/routes.ts +3 -1
- package/corpus/templates/analytics/changelog/2026-08-21-dashboard-filters-keep-other-users-dashboards-out-of-mine.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
- package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
- package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
- package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +14 -3
- package/corpus/templates/analytics/server/lib/slack.ts +4 -2
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +33 -3
- package/corpus/templates/analytics/vitest.config.ts +6 -1
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/assets/app/routes/library.tsx +5 -3
- package/corpus/templates/assets/app/routes.ts +3 -1
- package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
- package/corpus/templates/assets/vitest.config.ts +6 -1
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/brain/app/routes/sources.tsx +8 -3
- package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
- package/corpus/templates/brain/server/lib/brain.ts +27 -2
- package/corpus/templates/brain/vitest.config.ts +1 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
- package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
- package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
- package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
- package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
- package/corpus/templates/calendar/app/routes.ts +3 -1
- package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
- package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
- package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
- package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
- package/corpus/templates/calendar/server/onboarding.ts +85 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/calendar/shared/api.ts +9 -1
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/chat/app/routes.ts +3 -1
- package/corpus/templates/chat/vitest.config.ts +8 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/clips/actions/get-meeting.ts +9 -4
- package/corpus/templates/clips/actions/list-recordings.ts +16 -3
- package/corpus/templates/clips/actions/search-meetings.ts +1 -0
- package/corpus/templates/clips/actions/stop-meeting-recording.ts +87 -6
- package/corpus/templates/clips/actions/view-screen.ts +8 -1
- package/corpus/templates/clips/app/components/library/search-bar.tsx +1 -1
- package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
- package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
- package/corpus/templates/clips/desktop/src/app.tsx +53 -24
- package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
- package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
- package/corpus/templates/clips/server/lib/emails.ts +17 -33
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
- package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
- package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
- package/corpus/templates/content/app/i18n-data.ts +25 -0
- package/corpus/templates/content/app/routes.ts +3 -1
- package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
- package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
- package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
- package/corpus/templates/content/vitest.config.ts +7 -1
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1386 -92
- package/corpus/templates/design/actions/generate-design.ts +98 -47
- package/corpus/templates/design/actions/get-design-system.ts +6 -1
- package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
- package/corpus/templates/design/app/components/design/EditPanel.tsx +15 -47
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2060 -144
- package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
- package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -8
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
- package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +13 -8
- package/corpus/templates/design/app/i18n-data.ts +11 -10
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
- package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +99 -57
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +39 -8
- package/corpus/templates/design/app/pages/DesignSystems.tsx +137 -43
- package/corpus/templates/design/app/pages/Index.tsx +3 -1
- package/corpus/templates/design/app/pages/Templates.tsx +0 -10
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
- package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
- package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
- package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
- package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
- package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
- package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
- package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
- package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
- package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
- package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
- package/corpus/templates/design/app/pages/design-editor/preview-navigation.ts +25 -0
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
- package/corpus/templates/design/app/routes.ts +3 -1
- package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
- package/corpus/templates/design/shared/canvas-math.ts +612 -206
- package/corpus/templates/design/shared/pen-path.ts +37 -0
- package/corpus/templates/design/vitest.config.ts +7 -1
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
- package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
- package/corpus/templates/dispatch/app/routes.ts +3 -1
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/factory/.env.example +2 -7
- package/corpus/templates/factory/AGENTS.md +3 -0
- package/corpus/templates/factory/README.md +5 -3
- package/corpus/templates/factory/actions/create-factory.ts +16 -3
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
- package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
- package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
- package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
- package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
- package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
- package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
- package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
- package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
- package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
- package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
- package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
- package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
- package/corpus/templates/factory/app/routes/factory.tsx +84 -11
- package/corpus/templates/factory/app/routes.ts +3 -1
- package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
- package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
- package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
- package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
- package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
- package/corpus/templates/factory/vitest.config.ts +17 -2
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
- package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
- package/corpus/templates/forms/vitest.config.ts +1 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/macros/app/routes.ts +3 -1
- package/corpus/templates/macros/vitest.config.ts +6 -1
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
- package/corpus/templates/mail/app/hooks/use-emails.ts +13 -3
- package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
- package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
- package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
- package/corpus/templates/mail/app/routes/$.tsx +9 -0
- package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
- package/corpus/templates/mail/app/routes/$view.tsx +47 -1
- package/corpus/templates/mail/app/routes.ts +3 -1
- package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
- package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
- package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
- package/corpus/templates/mail/server/onboarding.ts +66 -18
- package/corpus/templates/mail/vitest.config.ts +6 -1
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/plan/app/routes/settings.tsx +4 -1
- package/corpus/templates/plan/app/routes.ts +3 -1
- package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/plan/netlify.toml +1 -1
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/slides/actions/patch-deck.ts +79 -10
- package/corpus/templates/slides/actions/update-slide.ts +11 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
- package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
- package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/slides/app/routes.ts +3 -1
- package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
- package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/slides/tsconfig.json +5 -0
- package/corpus/templates/slides/vitest.config.ts +6 -1
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
- package/corpus/templates/tasks/app/routes.ts +3 -1
- package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/tasks/vitest.config.ts +7 -1
- package/dist/action.d.ts +91 -0
- package/dist/action.js +50 -0
- package/dist/agent/abort-reasons.d.ts +38 -0
- package/dist/agent/abort-reasons.js +49 -0
- package/dist/agent/engine/ai-sdk-engine.js +8 -5
- package/dist/agent/engine/anthropic-engine.js +7 -5
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/engine/first-event-timeout.d.ts +42 -17
- package/dist/agent/engine/first-event-timeout.js +67 -25
- package/dist/agent/production-agent.d.ts +23 -0
- package/dist/agent/production-agent.js +107 -102
- package/dist/agent/run-loop-with-resume.d.ts +2 -28
- package/dist/agent/run-loop-with-resume.js +25 -40
- package/dist/agent/run-manager.js +5 -4
- package/dist/agent/run-store.d.ts +55 -0
- package/dist/agent/run-store.js +124 -1
- package/dist/agent/tool-search.js +2 -1
- package/dist/agent/types.d.ts +9 -4
- package/dist/app-config/configuration-error.d.ts +11 -0
- package/dist/app-config/configuration-error.js +14 -0
- package/dist/app-config/index.d.ts +1 -0
- package/dist/app-config/index.js +1 -0
- package/dist/app-config/integrations.d.ts +1 -0
- package/dist/app-config/integrations.js +10 -0
- package/dist/app-config/plugins.d.ts +34 -0
- package/dist/app-config/plugins.js +39 -0
- package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
- package/dist/app-config/run-lifecycle-invariants.js +18 -25
- package/dist/app-config/schema.d.ts +16 -0
- package/dist/app-config/schema.js +2 -0
- package/dist/chat-threads/schema-migrations.js +20 -0
- package/dist/chat-threads/store.js +21 -4
- package/dist/cli/native-dependencies.d.ts +4 -0
- package/dist/cli/native-dependencies.js +15 -0
- package/dist/client/AssistantChat.js +47 -15
- package/dist/client/ConnectBuilderCard.d.ts +3 -1
- package/dist/client/ConnectBuilderCard.js +6 -3
- package/dist/client/EnvironmentBadge.d.ts +1 -1
- package/dist/client/EnvironmentBadge.js +40 -5
- package/dist/client/MultiTabAssistantChat.d.ts +1 -1
- package/dist/client/MultiTabAssistantChat.js +35 -14
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat/index.js +1 -1
- package/dist/client/agent-page/use-jobs.d.ts +2 -1
- package/dist/client/agent-page/use-jobs.js +3 -5
- package/dist/client/agent-sidebar-state.js +3 -1
- package/dist/client/blocks/library/code-tabs.js +5 -0
- package/dist/client/blocks/library/code.js +1 -0
- package/dist/client/chat/message-components.d.ts +7 -0
- package/dist/client/chat/message-components.js +1 -1
- package/dist/client/chat/run-recovery.js +5 -2
- package/dist/client/chat/tool-call-display.js +9 -3
- package/dist/client/chat-first/apps-rail.js +2 -2
- package/dist/client/chat-model-groups.d.ts +12 -0
- package/dist/client/chat-model-groups.js +3 -2
- package/dist/client/error-format.js +12 -0
- package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
- package/dist/client/integrations/GoogleProductLogo.js +45 -0
- package/dist/client/integrations/index.d.ts +2 -0
- package/dist/client/integrations/index.js +2 -0
- package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
- package/dist/client/integrations/workspace-provider-oauth.js +13 -0
- package/dist/client/navigation/index.d.ts +1 -0
- package/dist/client/navigation/index.js +1 -0
- package/dist/client/resources/mcp-integration-catalog.js +0 -29
- package/dist/client/route-state.js +6 -0
- package/dist/client/settings/SettingsTabsPage.js +10 -6
- package/dist/client/sharing/ShareButton.js +11 -2
- package/dist/client/use-chat-models.d.ts +6 -0
- package/dist/client/use-chat-models.js +10 -0
- package/dist/client/use-db-sync.js +27 -9
- package/dist/client/workspace-app-navigation.d.ts +10 -0
- package/dist/client/workspace-app-navigation.js +38 -0
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +111 -9
- package/dist/connections/catalog.js +86 -30
- package/dist/db/create-get-db.js +18 -0
- package/dist/db/ddl-guard.d.ts +0 -4
- package/dist/db/ddl-guard.js +46 -0
- package/dist/deploy/build.d.ts +32 -0
- package/dist/deploy/build.js +241 -16
- package/dist/deploy/function-bundle.d.ts +45 -0
- package/dist/deploy/function-bundle.js +337 -0
- package/dist/deploy/workspace-deploy.js +19 -1
- package/dist/eject/workspace-connections.js +4 -0
- package/dist/email-catalog/registry.d.ts +4 -0
- package/dist/email-catalog/registry.js +79 -14
- package/dist/extensions/content-patch.js +14 -2
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/plugin.d.ts +10 -0
- package/dist/integrations/plugin.js +40 -6
- package/dist/jobs/actions/run-automation-now.d.ts +2 -1
- package/dist/jobs/actions/run-automation-now.js +11 -5
- package/dist/jobs/frontmatter.js +53 -2
- package/dist/jobs/run-now.d.ts +11 -1
- package/dist/jobs/run-now.js +42 -7
- package/dist/jobs/scheduler.d.ts +1 -0
- package/dist/jobs/scheduler.js +2 -1
- package/dist/localization/core-messages/ar-SA.js +4 -1
- package/dist/localization/core-messages/de-DE.js +4 -1
- package/dist/localization/core-messages/en-US.d.ts +4 -1
- package/dist/localization/core-messages/en-US.js +4 -1
- package/dist/localization/core-messages/es-ES.js +4 -1
- package/dist/localization/core-messages/fr-FR.js +4 -1
- package/dist/localization/core-messages/hi-IN.js +4 -1
- package/dist/localization/core-messages/ja-JP.js +4 -1
- package/dist/localization/core-messages/ko-KR.js +4 -1
- package/dist/localization/core-messages/pt-BR.js +4 -1
- package/dist/localization/core-messages/zh-CN.js +4 -1
- package/dist/localization/core-messages/zh-TW.js +4 -1
- package/dist/localization/core-messages.d.ts +4 -1
- package/dist/localization/default-messages.d.ts +2 -5
- package/dist/localization/default-messages.js +2 -5
- package/dist/mcp/build-server.d.ts +9 -0
- package/dist/mcp/build-server.js +37 -8
- package/dist/mcp-client/oauth-client.d.ts +7 -0
- package/dist/mcp-client/oauth-client.js +12 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/oauth-tokens/index.d.ts +1 -1
- package/dist/oauth-tokens/index.js +1 -1
- package/dist/oauth-tokens/lifecycle.d.ts +11 -0
- package/dist/oauth-tokens/lifecycle.js +17 -0
- package/dist/oauth-tokens/store.js +7 -0
- package/dist/observability/posthog-ai.d.ts +15 -1
- package/dist/observability/posthog-ai.js +24 -12
- package/dist/observability/traces.js +158 -28
- package/dist/onboarding/app-profile.js +2 -2
- package/dist/onboarding/plugin.js +10 -2
- package/dist/onboarding/types.d.ts +2 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/provider-api/index.js +2 -0
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/resources/store.js +13 -4
- package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
- package/dist/scripts/db/check-scoping.js +9 -6
- package/dist/secrets/register-framework-secrets.js +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
- package/dist/server/agent-chat/action-filters-a2a.js +48 -9
- package/dist/server/agent-chat-plugin.js +36 -9
- package/dist/server/agent-discovery.js +43 -20
- package/dist/server/auth.js +18 -16
- package/dist/server/beta-opt-out-html.js +45 -4
- package/dist/server/better-auth-instance.d.ts +2 -1
- package/dist/server/better-auth-instance.js +23 -7
- package/dist/server/builder-browser.d.ts +4 -0
- package/dist/server/builder-browser.js +23 -1
- package/dist/server/builder-design-systems.d.ts +4 -1
- package/dist/server/builder-design-systems.js +87 -6
- package/dist/server/builder-oauth.d.ts +1 -7
- package/dist/server/builder-oauth.js +80 -163
- package/dist/server/core-routes-plugin.d.ts +29 -0
- package/dist/server/core-routes-plugin.js +113 -21
- package/dist/server/default-plugins.d.ts +18 -0
- package/dist/server/default-plugins.js +22 -0
- package/dist/server/edge.d.ts +1 -0
- package/dist/server/edge.js +1 -0
- package/dist/server/framework-request-handler.js +31 -3
- package/dist/server/google-oauth.d.ts +3 -0
- package/dist/server/google-oauth.js +3 -0
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/onboarding-html.js +37 -3
- package/dist/server/workspace-provider-oauth.d.ts +6 -1
- package/dist/server/workspace-provider-oauth.js +72 -20
- package/dist/shared/agent-sidebar-url.d.ts +1 -0
- package/dist/shared/agent-sidebar-url.js +1 -0
- package/dist/shared/environment-lanes.d.ts +2 -0
- package/dist/shared/environment-lanes.js +3 -1
- package/dist/shared/index.d.ts +3 -1
- package/dist/shared/index.js +3 -1
- package/dist/shared/surface-visibility.d.ts +31 -0
- package/dist/shared/surface-visibility.js +57 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/chat/app/routes.ts +3 -1
- package/dist/templates/chat/vitest.config.ts +8 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/default/app/routes.ts +3 -1
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/tracking/registry.d.ts +11 -0
- package/dist/tracking/registry.js +5 -2
- package/dist/triggers/actions.js +10 -3
- package/dist/usage/store.js +23 -3
- package/dist/user-profile/actions/get-auth-methods.js +18 -5
- package/dist/vite/client.js +24 -5
- package/docs/content/actions-access-control.mdx +43 -4
- package/docs/content/actions-defining.mdx +16 -0
- package/docs/content/template-clips-capture-everywhere.mdx +29 -30
- package/docs/content/template-clips-developers.mdx +4 -4
- package/docs/content/template-clips.mdx +3 -1
- package/package.json +3 -3
- package/src/eject/workspace-connections.ts +4 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/chat/app/routes.ts +3 -1
- package/src/templates/chat/vitest.config.ts +8 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/default/app/routes.ts +3 -1
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
- /package/corpus/templates/dispatch/app/routes/{apps.$appId.tsx → apps.$appId.$.tsx} +0 -0
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Copiar diagnósticos",
|
|
32
32
|
"aboutAgentNative.unknown": "Desconhecida",
|
|
33
33
|
"common.agent": "Agente",
|
|
34
|
+
"agentPanel.mode": "Modo",
|
|
35
|
+
"agentPanel.uiMode": "Interface",
|
|
34
36
|
"common.cancel": "Cancelar",
|
|
35
37
|
"common.collapse": "Recolher",
|
|
36
38
|
"common.connect": "Conectar",
|
|
@@ -406,7 +408,7 @@ const messages = {
|
|
|
406
408
|
"errorMessages.gatewayNoDetails": "O gateway do modelo não retornou detalhes do erro, e o chat não pôde ser recuperado. Aguarde um momento e tente novamente. Se o problema persistir, inicie um novo chat.",
|
|
407
409
|
"errorMessages.inactivityTimeout": "A conexão com o agente expirou antes da conclusão. Você pode continuar a partir do trabalho parcial ou tentar novamente.",
|
|
408
410
|
"errorMessages.invalidToolSchema": "O esquema de uma ferramenta era inválido, então o modelo rejeitou a solicitação antes de iniciá-la. Você pode ignorar a ferramenta inválida e tentar novamente.",
|
|
409
|
-
"errorMessages.noProviderConnected": "Nenhum provedor de LLM está conectado. Abra
|
|
411
|
+
"errorMessages.noProviderConnected": "Nenhum provedor de LLM está conectado. Abra Configurações > Agente > Provedores de IA e conecte o Builder.io (nível gratuito disponível) ou adicione uma chave de provedor.",
|
|
410
412
|
"errorMessages.openBuilderSpaceSettings": "Abrir as configurações do espaço do Builder",
|
|
411
413
|
"errorMessages.providerAuthentication": "O provedor do modelo rejeitou a chave de API salva. Atualize-a em Configurações → Integrações → Chaves de API e tente novamente.",
|
|
412
414
|
"errorMessages.providerConfiguration": "Este modelo não pode usar ferramentas com as configurações atuais. Troque de modelo em Configurações e tente novamente.",
|
|
@@ -505,6 +507,7 @@ const messages = {
|
|
|
505
507
|
"share.linkCanStillOpen": "Pessoas com o link ainda podem abrir isto.",
|
|
506
508
|
"share.loading": "Carregando...",
|
|
507
509
|
"share.loadMore": "Ver mais",
|
|
510
|
+
"share.loadFailed": "Não foi possível carregar as configurações de compartilhamento.",
|
|
508
511
|
"share.loadPeopleFailed": "Não foi possível carregar pessoas.",
|
|
509
512
|
"share.noAccess": "Ninguém tem acesso ainda.",
|
|
510
513
|
"share.noMatches": "Nenhuma correspondência.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "复制诊断信息",
|
|
32
32
|
"aboutAgentNative.unknown": "未知",
|
|
33
33
|
"common.agent": "智能体",
|
|
34
|
+
"agentPanel.mode": "模式",
|
|
35
|
+
"agentPanel.uiMode": "界面",
|
|
34
36
|
"common.cancel": "取消",
|
|
35
37
|
"common.collapse": "收起",
|
|
36
38
|
"common.connect": "连接",
|
|
@@ -260,7 +262,7 @@ const messages = {
|
|
|
260
262
|
"errorMessages.gatewayNoDetails": "模型网关未返回错误详情,聊天无法恢复。请稍等片刻后重试;如果问题持续出现,请开始新聊天。",
|
|
261
263
|
"errorMessages.inactivityTimeout": "智能体连接在完成前超时。您可以从已完成的部分继续,也可以重试。",
|
|
262
264
|
"errorMessages.invalidToolSchema": "工具架构无效,因此模型在请求开始前拒绝了该请求。可以跳过无效工具并重试请求。",
|
|
263
|
-
"errorMessages.noProviderConnected": "尚未连接任何 LLM
|
|
265
|
+
"errorMessages.noProviderConnected": "尚未连接任何 LLM 提供商。打开设置 > 智能体 > AI 提供商,然后连接 Builder.io(提供免费套餐)或添加提供商密钥。",
|
|
264
266
|
"errorMessages.openBuilderSpaceSettings": "打开 Builder 空间设置",
|
|
265
267
|
"errorMessages.providerAuthentication": "模型提供商拒绝了已保存的 API 密钥。请在设置 → 集成 → API 密钥中更新密钥,然后重试。",
|
|
266
268
|
"errorMessages.providerConfiguration": "此模型无法在当前设置下使用工具。请在设置中切换模型,然后重试。",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "在搜索中隐藏",
|
|
443
445
|
"share.linkCanStillOpen": "拥有链接的人员仍可打开此内容。",
|
|
444
446
|
"share.loadMore": "加载更多",
|
|
447
|
+
"share.loadFailed": "无法加载共享设置。",
|
|
445
448
|
"share.loadPeopleFailed": "无法加载人员。",
|
|
446
449
|
"share.loading": "正在加载...",
|
|
447
450
|
"share.noAccess": "尚无任何人拥有访问权限。",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "複製診斷資訊",
|
|
32
32
|
"aboutAgentNative.unknown": "未知",
|
|
33
33
|
"common.agent": "代理",
|
|
34
|
+
"agentPanel.mode": "模式",
|
|
35
|
+
"agentPanel.uiMode": "介面",
|
|
34
36
|
"common.cancel": "取消",
|
|
35
37
|
"common.collapse": "收合",
|
|
36
38
|
"common.connect": "連線",
|
|
@@ -260,7 +262,7 @@ const messages = {
|
|
|
260
262
|
"errorMessages.gatewayNoDetails": "模型閘道未傳回錯誤詳細資訊,聊天無法復原。請稍候再試;如果問題持續發生,請開始新聊天。",
|
|
261
263
|
"errorMessages.inactivityTimeout": "代理連線在完成前逾時。您可以從已完成的部分繼續,也可以重試。",
|
|
262
264
|
"errorMessages.invalidToolSchema": "工具結構描述無效,因此模型在要求開始前便拒絕了要求。您可以略過無效工具並重試要求。",
|
|
263
|
-
"errorMessages.noProviderConnected": "尚未連接任何 LLM
|
|
265
|
+
"errorMessages.noProviderConnected": "尚未連接任何 LLM 提供商。開啟設定 > 代理程式 > AI 提供商,然後連接 Builder.io(提供免費方案)或新增提供商金鑰。",
|
|
264
266
|
"errorMessages.openBuilderSpaceSettings": "開啟 Builder 空間設定",
|
|
265
267
|
"errorMessages.providerAuthentication": "模型供應商拒絕了已儲存的 API 金鑰。請在設定 → 整合 → API 金鑰中更新金鑰,然後重試。",
|
|
266
268
|
"errorMessages.providerConfiguration": "這個模型無法在目前設定下使用工具。請在設定中切換模型,然後重試。",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "在搜尋中隱藏",
|
|
443
445
|
"share.linkCanStillOpen": "擁有連結的人員仍可開啟這個項目。",
|
|
444
446
|
"share.loadMore": "載入更多",
|
|
447
|
+
"share.loadFailed": "無法載入分享設定。",
|
|
445
448
|
"share.loadPeopleFailed": "無法載入人員。",
|
|
446
449
|
"share.loading": "載入中...",
|
|
447
450
|
"share.noAccess": "尚無任何人擁有存取權。",
|
|
@@ -33,6 +33,8 @@ export declare const englishAgentChatMessages: {
|
|
|
33
33
|
readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
|
|
34
34
|
readonly "aboutAgentNative.unknown": "Unknown";
|
|
35
35
|
readonly "common.agent": "Agent";
|
|
36
|
+
readonly "agentPanel.mode": "Mode";
|
|
37
|
+
readonly "agentPanel.uiMode": "UI";
|
|
36
38
|
readonly "common.cancel": "Cancel";
|
|
37
39
|
readonly "common.collapse": "Collapse";
|
|
38
40
|
readonly "common.connect": "Connect";
|
|
@@ -264,7 +266,7 @@ export declare const englishAgentChatMessages: {
|
|
|
264
266
|
readonly "errorMessages.gatewayNoDetails": "The model gateway returned no error details and the chat couldn't recover. Wait a moment and retry, or start a new chat if it keeps happening.";
|
|
265
267
|
readonly "errorMessages.inactivityTimeout": "The agent connection timed out before it could finish. You can continue from the partial work or retry.";
|
|
266
268
|
readonly "errorMessages.invalidToolSchema": "A tool schema was invalid, so the model rejected the request before it started. The invalid tool can be skipped and the request retried.";
|
|
267
|
-
readonly "errorMessages.noProviderConnected": "No LLM provider is connected. Open
|
|
269
|
+
readonly "errorMessages.noProviderConnected": "No LLM provider is connected. Open Settings > Agent > AI providers, then connect Builder.io (free tier available) or add a provider key.";
|
|
268
270
|
readonly "errorMessages.openBuilderSpaceSettings": "Open Builder space settings";
|
|
269
271
|
readonly "errorMessages.providerAuthentication": "The model provider rejected the saved API key. Update the key in Settings → Integrations → API keys, then retry.";
|
|
270
272
|
readonly "errorMessages.providerConfiguration": "This model can't use tools with the current settings. Switch models in Settings, then retry.";
|
|
@@ -449,6 +451,7 @@ export declare const englishAgentChatMessages: {
|
|
|
449
451
|
readonly "share.linkCanStillOpen": "People with the link can still open this.";
|
|
450
452
|
readonly "share.loading": "Loading...";
|
|
451
453
|
readonly "share.loadMore": "Load more";
|
|
454
|
+
readonly "share.loadFailed": "Couldn't load sharing settings.";
|
|
452
455
|
readonly "share.loadPeopleFailed": "Could not load people.";
|
|
453
456
|
readonly "share.noAccess": "No one has access yet.";
|
|
454
457
|
readonly "share.noMatches": "No matches.";
|
|
@@ -422,6 +422,8 @@ declare const messages: {
|
|
|
422
422
|
downloadDesktop: string;
|
|
423
423
|
chatMode: string;
|
|
424
424
|
chat: string;
|
|
425
|
+
mode: string;
|
|
426
|
+
uiMode: string;
|
|
425
427
|
cliTerminalMode: string;
|
|
426
428
|
cli: string;
|
|
427
429
|
workspaceMode: string;
|
|
@@ -1126,11 +1128,6 @@ declare const messages: {
|
|
|
1126
1128
|
useCase: string;
|
|
1127
1129
|
setupNote: string;
|
|
1128
1130
|
};
|
|
1129
|
-
googleWorkspace: {
|
|
1130
|
-
description: string;
|
|
1131
|
-
useCase: string;
|
|
1132
|
-
setupNote: string;
|
|
1133
|
-
};
|
|
1134
1131
|
gitlab: {
|
|
1135
1132
|
description: string;
|
|
1136
1133
|
useCase: string;
|
|
@@ -428,6 +428,8 @@ const messages = {
|
|
|
428
428
|
downloadDesktop: "Download Desktop",
|
|
429
429
|
chatMode: "Chat mode",
|
|
430
430
|
chat: "Chat",
|
|
431
|
+
mode: "Mode",
|
|
432
|
+
uiMode: "UI",
|
|
431
433
|
cliTerminalMode: "CLI terminal mode",
|
|
432
434
|
cli: "CLI",
|
|
433
435
|
workspaceMode: "Files, agents, skills, and tasks",
|
|
@@ -1132,11 +1134,6 @@ const messages = {
|
|
|
1132
1134
|
useCase: "Observability, metrics, logs, traces, dashboards",
|
|
1133
1135
|
setupNote: "Grafana Cloud MCP is in public preview and requires Grafana Cloud Assistant MCP access. It is hosted Grafana Cloud only; self-hosted Grafana needs the local MCP server.",
|
|
1134
1136
|
},
|
|
1135
|
-
googleWorkspace: {
|
|
1136
|
-
description: "Search Google Workspace data through its remote MCP server.",
|
|
1137
|
-
useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
|
|
1138
|
-
setupNote: "Google Workspace MCP is in Developer Preview. Enable the relevant Google Workspace and MCP APIs, configure an OAuth consent screen and client, then authorize the products you want to use.",
|
|
1139
|
-
},
|
|
1140
1137
|
gitlab: {
|
|
1141
1138
|
description: "Read and manage GitLab projects, issues, and merge requests.",
|
|
1142
1139
|
useCase: "Repositories, issues, merge requests, CI/CD, code analytics",
|
|
@@ -189,6 +189,15 @@ export interface MCPRequestMeta {
|
|
|
189
189
|
* results simply fall back to their deep-link text.
|
|
190
190
|
*/
|
|
191
191
|
export declare function isMcpAppsInlineEnabled(identity: MCPCallerIdentity | undefined): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Connector-catalog membership declared on the actions themselves.
|
|
194
|
+
*
|
|
195
|
+
* This is `mcp.connectorCatalog` with the list inverted into the action files,
|
|
196
|
+
* so a rename moves the declaration with the action instead of stranding a
|
|
197
|
+
* dead string in a plugin config. Both forms feed the same set and an app can
|
|
198
|
+
* run either or both while it migrates.
|
|
199
|
+
*/
|
|
200
|
+
export declare function declaredMcpToolNames(actions: Record<string, ActionEntry>): string[];
|
|
192
201
|
export declare function isAuthenticatedReadAction(entry: ActionEntry): boolean;
|
|
193
202
|
export declare function isAutoReadExcludedActionName(name: string): boolean;
|
|
194
203
|
/**
|
package/dist/mcp/build-server.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* — it can be bundled into the serverless function alongside `mountMCP`.
|
|
19
19
|
*/
|
|
20
20
|
import { MCP_APP_EXTENSION_ID, MCP_APP_MIME_TYPE, MCP_APP_RESOURCE_URI_META_KEY, } from "../action.js";
|
|
21
|
+
import { isActionExposedToExternalAgents } from "../action.js";
|
|
21
22
|
import { isMcpActionResult } from "../mcp-client/app-result.js";
|
|
22
23
|
import { getConfiguredAppBasePath } from "../server/app-base-path.js";
|
|
23
24
|
import { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, } from "../server/deep-link.js";
|
|
@@ -177,6 +178,34 @@ function scopeToolSearchToAdvertised(advertised) {
|
|
|
177
178
|
},
|
|
178
179
|
};
|
|
179
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Drop every action this request's surface must not reach at all.
|
|
183
|
+
*
|
|
184
|
+
* Applied to `actions` — the whole surface this request can reach — and not
|
|
185
|
+
* just to the advertised listing, because on the `--full-catalog` tier
|
|
186
|
+
* `actions` IS the callable set (see the `tools/call` handler below). An
|
|
187
|
+
* external-agent opt-out that only hid the schema would leave the action
|
|
188
|
+
* callable by name, which is the same "hidden but reachable" bug the
|
|
189
|
+
* `withoutToolSearch` comment above exists to prevent.
|
|
190
|
+
*
|
|
191
|
+
* The in-app agent never comes through here, so its tool list is unaffected.
|
|
192
|
+
*/
|
|
193
|
+
function withoutExternalOptOuts(actions) {
|
|
194
|
+
return Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionExposedToExternalAgents(entry)));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Connector-catalog membership declared on the actions themselves.
|
|
198
|
+
*
|
|
199
|
+
* This is `mcp.connectorCatalog` with the list inverted into the action files,
|
|
200
|
+
* so a rename moves the declaration with the action instead of stranding a
|
|
201
|
+
* dead string in a plugin config. Both forms feed the same set and an app can
|
|
202
|
+
* run either or both while it migrates.
|
|
203
|
+
*/
|
|
204
|
+
export function declaredMcpToolNames(actions) {
|
|
205
|
+
return Object.entries(actions)
|
|
206
|
+
.filter(([, entry]) => entry.mcpTool === true)
|
|
207
|
+
.map(([name]) => name);
|
|
208
|
+
}
|
|
180
209
|
const COMPACT_MCP_APP_CATALOG_BUILTINS = new Set([
|
|
181
210
|
"list_apps",
|
|
182
211
|
"open_app",
|
|
@@ -1170,9 +1199,7 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1170
1199
|
// Strip from `actions`, not just the advertised set: on the full-catalog tier
|
|
1171
1200
|
// `actions` IS the callable surface, so filtering only the listing would
|
|
1172
1201
|
// leave `tool-search` callable but invisible.
|
|
1173
|
-
const actions = flatCatalog
|
|
1174
|
-
? withoutToolSearch(mergedActions)
|
|
1175
|
-
: mergedActions;
|
|
1202
|
+
const actions = withoutExternalOptOuts(flatCatalog ? withoutToolSearch(mergedActions) : mergedActions);
|
|
1176
1203
|
const visibleActions = Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionVisibleForOAuthScope(entry, effectiveIdentity?.oauthScopes)));
|
|
1177
1204
|
// Compact/connector is the DEFAULT for every caller — hosted connectors,
|
|
1178
1205
|
// code clients (Claude Code / Cursor / Codex), and the local CLI alike. The
|
|
@@ -1187,15 +1214,17 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1187
1214
|
const autoReadNames = autoAuthenticatedReadNames(visibleActions, config);
|
|
1188
1215
|
const connectorNames = new Set([
|
|
1189
1216
|
...(config.connectorCatalog ?? []),
|
|
1217
|
+
...declaredMcpToolNames(visibleActions),
|
|
1190
1218
|
...autoReadNames,
|
|
1191
1219
|
]);
|
|
1192
1220
|
const denyNames = externalAgentDenySet(config);
|
|
1193
1221
|
const automaticConnectorPolicyActive = config.externalAgents?.authenticatedReads === "auto";
|
|
1194
|
-
// Connector-catalog tier: when a template declares a connector allow-list
|
|
1195
|
-
//
|
|
1196
|
-
//
|
|
1197
|
-
//
|
|
1198
|
-
//
|
|
1222
|
+
// Connector-catalog tier: when a template declares a connector allow-list —
|
|
1223
|
+
// as `mcp.connectorCatalog` names or as `mcpTool: true` on the actions
|
|
1224
|
+
// themselves — serve exactly that curated surface plus any explicitly
|
|
1225
|
+
// annotated authenticated reads from `externalAgents.authenticatedReads:
|
|
1226
|
+
// "auto"`. This stays compact by default and keeps db-exec / seed-* /
|
|
1227
|
+
// extension / browser-session footguns off the external surface.
|
|
1199
1228
|
const connectorCatalogActive = !appCatalog &&
|
|
1200
1229
|
(connectorNames.size > 0 || automaticConnectorPolicyActive) &&
|
|
1201
1230
|
!fullCatalogRequested;
|
|
@@ -74,6 +74,7 @@ export declare class McpOAuthClientProvider implements OAuthClientProvider {
|
|
|
74
74
|
}
|
|
75
75
|
export declare function startMcpOAuthAuthorization(options: McpOAuthProviderOptions & {
|
|
76
76
|
scope?: string;
|
|
77
|
+
resourceMetadataUrl?: string;
|
|
77
78
|
}): Promise<McpOAuthStartResult>;
|
|
78
79
|
export declare function finishMcpOAuthAuthorization(options: McpOAuthProviderOptions & {
|
|
79
80
|
authorizationCode: string;
|
|
@@ -99,6 +100,12 @@ export declare function getMcpOAuthConnectionState(options: {
|
|
|
99
100
|
scopeId: string;
|
|
100
101
|
serverUrl: string;
|
|
101
102
|
}): Promise<OAuthCredentialState<McpOAuthCredentialBundle>>;
|
|
103
|
+
export declare function markMcpOAuthReconnectRequired(options: {
|
|
104
|
+
key: string;
|
|
105
|
+
scope: "user" | "org";
|
|
106
|
+
scopeId: string;
|
|
107
|
+
serverUrl: string;
|
|
108
|
+
}): Promise<boolean>;
|
|
102
109
|
export declare function deleteMcpOAuthCredentials(options: {
|
|
103
110
|
key: string;
|
|
104
111
|
scope: "user" | "org";
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { auth, refreshAuthorization, validateAuthorizationResponseIssuer, } from "@modelcontextprotocol/client";
|
|
10
10
|
import { ssrfSafeFetch } from "../extensions/url-safety.js";
|
|
11
|
-
import { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, } from "../oauth-tokens/lifecycle.js";
|
|
11
|
+
import { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, } from "../oauth-tokens/lifecycle.js";
|
|
12
12
|
import { validateRemoteUrl } from "./remote-url.js";
|
|
13
13
|
const TOKEN_EXPIRY_SKEW_MS = 60_000;
|
|
14
14
|
const MAX_OAUTH_REDIRECTS = 5;
|
|
@@ -312,6 +312,9 @@ export async function startMcpOAuthAuthorization(options) {
|
|
|
312
312
|
const result = await auth(provider, {
|
|
313
313
|
serverUrl: options.serverUrl,
|
|
314
314
|
scope: options.scope,
|
|
315
|
+
...(options.resourceMetadataUrl
|
|
316
|
+
? { resourceMetadataUrl: new URL(options.resourceMetadataUrl) }
|
|
317
|
+
: {}),
|
|
315
318
|
fetchFn: guardedOAuthFetch(),
|
|
316
319
|
});
|
|
317
320
|
if (result !== "REDIRECT" || !provider.authorizationRedirect) {
|
|
@@ -408,6 +411,14 @@ export async function getMcpOAuthConnectionState(options) {
|
|
|
408
411
|
validateCredential: (credential) => serverUrlsMatch(credential.serverUrl, serverUrl),
|
|
409
412
|
});
|
|
410
413
|
}
|
|
414
|
+
export async function markMcpOAuthReconnectRequired(options) {
|
|
415
|
+
const serverUrl = canonicalServerUrl(options.serverUrl);
|
|
416
|
+
return markOAuthReconnectRequired(credentialIdentity({ ...options, serverUrl }), {
|
|
417
|
+
allowLegacy: true,
|
|
418
|
+
legacyAccountKey: true,
|
|
419
|
+
validateCredential: (credential) => serverUrlsMatch(credential.serverUrl, serverUrl),
|
|
420
|
+
});
|
|
421
|
+
}
|
|
411
422
|
export async function deleteMcpOAuthCredentials(options) {
|
|
412
423
|
if (!options.serverUrl)
|
|
413
424
|
return false;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { getOAuthTokens, getOAuthTokenSnapshot, OAuthAccountOwnedByOtherUserError, saveOAuthTokens, replaceOAuthTokensIfRevision, deleteOAuthTokens, deleteOAuthTokensIfRevision, listOAuthAccounts, listOAuthAccountsByOwner, hasOAuthTokens, setOAuthDisplayName, } from "./store.js";
|
|
2
|
-
export { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, type OAuthCredential, type OAuthCredentialIdentity, type OAuthCredentialOwner, type OAuthCredentialState, type OAuthRevocationResult, } from "./lifecycle.js";
|
|
2
|
+
export { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, type OAuthCredential, type OAuthCredentialIdentity, type OAuthCredentialOwner, type OAuthCredentialState, type OAuthRevocationResult, } from "./lifecycle.js";
|
|
3
3
|
export { refreshExpiringGoogleTokens, startGoogleTokenRefreshLoop, } from "./google-refresh.js";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { getOAuthTokens, getOAuthTokenSnapshot, OAuthAccountOwnedByOtherUserError, saveOAuthTokens, replaceOAuthTokensIfRevision, deleteOAuthTokens, deleteOAuthTokensIfRevision, listOAuthAccounts, listOAuthAccountsByOwner, hasOAuthTokens, setOAuthDisplayName, } from "./store.js";
|
|
2
|
-
export { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, } from "./lifecycle.js";
|
|
2
|
+
export { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, } from "./lifecycle.js";
|
|
3
3
|
export { refreshExpiringGoogleTokens, startGoogleTokenRefreshLoop, } from "./google-refresh.js";
|
|
@@ -67,6 +67,17 @@ export declare function readOAuthCredentialState<T extends OAuthCredential = OAu
|
|
|
67
67
|
now?: number;
|
|
68
68
|
validateCredential?: (credential: T) => boolean;
|
|
69
69
|
}): Promise<OAuthCredentialState<T>>;
|
|
70
|
+
/**
|
|
71
|
+
* Force a stored credential into `reconnect_required` without a refresh attempt.
|
|
72
|
+
* For a token the provider rejected server-side (e.g. a 401/403) while it still
|
|
73
|
+
* looks valid locally, so the credential itself carries the reconnect signal
|
|
74
|
+
* instead of a side channel. Returns false when there is nothing to mark.
|
|
75
|
+
*/
|
|
76
|
+
export declare function markOAuthReconnectRequired<T extends OAuthCredential = OAuthCredential>(identity: OAuthCredentialIdentity, options?: {
|
|
77
|
+
allowLegacy?: boolean;
|
|
78
|
+
legacyAccountKey?: boolean;
|
|
79
|
+
validateCredential?: (credential: T) => boolean;
|
|
80
|
+
}): Promise<boolean>;
|
|
70
81
|
export declare function resolveOAuthCredentialAccess<T extends OAuthCredential = OAuthCredential>(identity: OAuthCredentialIdentity, options: {
|
|
71
82
|
refresh: (context: OAuthRefreshContext<T>) => Promise<T>;
|
|
72
83
|
allowLegacy?: boolean;
|
|
@@ -232,6 +232,23 @@ export async function readOAuthCredentialState(identity, options = {}) {
|
|
|
232
232
|
async function markReconnectRequired(identity, snapshot, legacyAccountKey) {
|
|
233
233
|
await replaceOAuthTokensIfRevision(identity.provider, storageAccountId(identity, legacyAccountKey), snapshot.storageOwner, snapshot.revision, snapshot.legacyRevision, snapshot.storageVersion, withLifecycle(identity, snapshot.credential, "refresh_failed"));
|
|
234
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Force a stored credential into `reconnect_required` without a refresh attempt.
|
|
237
|
+
* For a token the provider rejected server-side (e.g. a 401/403) while it still
|
|
238
|
+
* looks valid locally, so the credential itself carries the reconnect signal
|
|
239
|
+
* instead of a side channel. Returns false when there is nothing to mark.
|
|
240
|
+
*/
|
|
241
|
+
export async function markOAuthReconnectRequired(identity, options = {}) {
|
|
242
|
+
const stored = await readStoredOAuthCredentialState(identity, {
|
|
243
|
+
allowLegacy: options.allowLegacy,
|
|
244
|
+
legacyAccountKey: options.legacyAccountKey,
|
|
245
|
+
validateCredential: options.validateCredential,
|
|
246
|
+
});
|
|
247
|
+
if (stored.kind === "missing" || stored.kind === "malformed")
|
|
248
|
+
return false;
|
|
249
|
+
await markReconnectRequired(identity, stored, options.legacyAccountKey === true);
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
235
252
|
export async function resolveOAuthCredentialAccess(identity, options) {
|
|
236
253
|
assertIdentity(identity);
|
|
237
254
|
const dependencies = { ...defaultDependencies, ...options.dependencies };
|
|
@@ -318,6 +318,13 @@ export async function saveOAuthTokens(provider, accountId, tokens, owner) {
|
|
|
318
318
|
...(existingTokens ?? {}),
|
|
319
319
|
...cleanedIncomingTokens,
|
|
320
320
|
};
|
|
321
|
+
const existingScope = existingTokens?.scope;
|
|
322
|
+
const incomingScope = cleanedIncomingTokens.scope;
|
|
323
|
+
if (typeof existingScope === "string" && typeof incomingScope === "string") {
|
|
324
|
+
tokensToStore.scope = Array.from(new Set(`${existingScope} ${incomingScope}`
|
|
325
|
+
.split(/[\s,]+/)
|
|
326
|
+
.filter((scope) => scope.length > 0))).join(" ");
|
|
327
|
+
}
|
|
321
328
|
const result = await client.execute({
|
|
322
329
|
sql: isPostgres()
|
|
323
330
|
? `INSERT INTO ${table} (provider, account_id, owner, display_name, tokens, updated_at, revision) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT (provider, account_id) DO UPDATE SET owner=EXCLUDED.owner, display_name=COALESCE(EXCLUDED.display_name, ${table}.display_name), tokens=EXCLUDED.tokens, updated_at=EXCLUDED.updated_at, revision=GREATEST(COALESCE(${table}.revision, 0) + 1, EXCLUDED.revision) WHERE ${table}.owner = EXCLUDED.owner OR (LOWER(${table}.owner) = LOWER(EXCLUDED.owner) AND LOWER(${table}.owner) LIKE 'user:%' AND LOWER(EXCLUDED.owner) LIKE 'user:%')`
|
|
@@ -12,6 +12,18 @@
|
|
|
12
12
|
* PostHog's `$session_id`: the latter is the browser session used for session
|
|
13
13
|
* replay, and the two are different lifetimes.
|
|
14
14
|
*
|
|
15
|
+
* PostHog DERIVES a trace's latency, tokens and cost from its children — its
|
|
16
|
+
* trace query sums `$ai_latency` over every event whose `$ai_parent_id` is the
|
|
17
|
+
* trace or absent, and sums tokens/cost over `$ai_generation` / `$ai_embedding`
|
|
18
|
+
* only. So the `$ai_trace` event carries none of those: an `$ai_latency` here
|
|
19
|
+
* was counted *in addition to* the generation's and reported roughly twice the
|
|
20
|
+
* real duration. Run totals ride along under plain names for the non-PostHog
|
|
21
|
+
* backends, which have no such aggregation.
|
|
22
|
+
*
|
|
23
|
+
* Custom properties do NOT take an `$ai_` prefix. That namespace is PostHog's
|
|
24
|
+
* schema, and a name it does not define today it may define tomorrow with
|
|
25
|
+
* different meaning — `input_truncated` / `spans_dropped` cannot collide.
|
|
26
|
+
*
|
|
15
27
|
* Content (`$ai_input` / `$ai_output_choices` / `$ai_input_state` /
|
|
16
28
|
* `$ai_output_state`) is gated on config and always OMITTED when disabled.
|
|
17
29
|
* Sending `[]` instead would be indistinguishable from a run that genuinely had
|
|
@@ -49,7 +61,9 @@ export interface AiTraceEventInput {
|
|
|
49
61
|
spanName: string;
|
|
50
62
|
model: string;
|
|
51
63
|
provider: string;
|
|
52
|
-
|
|
64
|
+
/** Wall-clock duration of the whole run. Reported under `duration_ms`, not
|
|
65
|
+
* `$ai_latency` — see the aggregation note at the top of this file. */
|
|
66
|
+
durationMs: number;
|
|
53
67
|
isError: boolean;
|
|
54
68
|
error?: AiErrorDetail;
|
|
55
69
|
inputTokens?: number;
|
|
@@ -12,6 +12,18 @@
|
|
|
12
12
|
* PostHog's `$session_id`: the latter is the browser session used for session
|
|
13
13
|
* replay, and the two are different lifetimes.
|
|
14
14
|
*
|
|
15
|
+
* PostHog DERIVES a trace's latency, tokens and cost from its children — its
|
|
16
|
+
* trace query sums `$ai_latency` over every event whose `$ai_parent_id` is the
|
|
17
|
+
* trace or absent, and sums tokens/cost over `$ai_generation` / `$ai_embedding`
|
|
18
|
+
* only. So the `$ai_trace` event carries none of those: an `$ai_latency` here
|
|
19
|
+
* was counted *in addition to* the generation's and reported roughly twice the
|
|
20
|
+
* real duration. Run totals ride along under plain names for the non-PostHog
|
|
21
|
+
* backends, which have no such aggregation.
|
|
22
|
+
*
|
|
23
|
+
* Custom properties do NOT take an `$ai_` prefix. That namespace is PostHog's
|
|
24
|
+
* schema, and a name it does not define today it may define tomorrow with
|
|
25
|
+
* different meaning — `input_truncated` / `spans_dropped` cannot collide.
|
|
26
|
+
*
|
|
15
27
|
* Content (`$ai_input` / `$ai_output_choices` / `$ai_input_state` /
|
|
16
28
|
* `$ai_output_state`) is gated on config and always OMITTED when disabled.
|
|
17
29
|
* Sending `[]` instead would be indistinguishable from a run that genuinely had
|
|
@@ -26,7 +38,7 @@ import { boundedText } from "../tracking/redaction.js";
|
|
|
26
38
|
export const MAX_AI_CONTENT_BYTES = 128 * 1024;
|
|
27
39
|
/** Hard ceiling on emitted `$ai_span` events per run. */
|
|
28
40
|
export const MAX_AI_SPANS_PER_RUN = 100;
|
|
29
|
-
function trackAiEvent(name, properties, userId) {
|
|
41
|
+
function trackAiEvent(name, properties, userId, occurredAt) {
|
|
30
42
|
for (const key of Object.keys(properties)) {
|
|
31
43
|
if (properties[key] === undefined)
|
|
32
44
|
delete properties[key];
|
|
@@ -34,7 +46,7 @@ function trackAiEvent(name, properties, userId) {
|
|
|
34
46
|
try {
|
|
35
47
|
void import("../tracking/registry.js")
|
|
36
48
|
.then(({ track }) => {
|
|
37
|
-
track(name, properties, { userId: userId ?? undefined });
|
|
49
|
+
track(name, properties, { userId: userId ?? undefined, occurredAt });
|
|
38
50
|
})
|
|
39
51
|
.catch(() => { });
|
|
40
52
|
// coercion-ok: a throw here would break the run it is observing
|
|
@@ -84,19 +96,19 @@ export function emitAiTraceEvent(input) {
|
|
|
84
96
|
$ai_span_name: input.spanName,
|
|
85
97
|
$ai_model: input.model,
|
|
86
98
|
$ai_provider: input.provider,
|
|
87
|
-
$ai_latency: input.latencySeconds,
|
|
88
99
|
$ai_is_error: input.isError,
|
|
89
100
|
$ai_error: input.error,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
101
|
+
duration_ms: Math.round(input.durationMs),
|
|
102
|
+
input_tokens: input.inputTokens,
|
|
103
|
+
output_tokens: input.outputTokens,
|
|
104
|
+
cost_usd: input.costUsd,
|
|
93
105
|
$ai_input_state: inputContent?.value,
|
|
94
106
|
$ai_output_state: outputContent?.value,
|
|
95
|
-
|
|
96
|
-
|
|
107
|
+
input_truncated: inputContent?.truncated || undefined,
|
|
108
|
+
output_truncated: outputContent?.truncated || undefined,
|
|
97
109
|
$session_id: input.browserSessionId,
|
|
98
110
|
created_at: new Date(input.createdAt).toISOString(),
|
|
99
|
-
}, input.userId);
|
|
111
|
+
}, input.userId, input.createdAt);
|
|
100
112
|
}
|
|
101
113
|
export function emitAiSpanEvent(input) {
|
|
102
114
|
const inputContent = input.inputState === undefined
|
|
@@ -117,11 +129,11 @@ export function emitAiSpanEvent(input) {
|
|
|
117
129
|
$ai_error: input.error,
|
|
118
130
|
$ai_input_state: inputContent?.value,
|
|
119
131
|
$ai_output_state: outputContent?.value,
|
|
120
|
-
|
|
121
|
-
|
|
132
|
+
input_truncated: inputContent?.truncated || undefined,
|
|
133
|
+
output_truncated: outputContent?.truncated || undefined,
|
|
122
134
|
$session_id: input.browserSessionId,
|
|
123
135
|
created_at: new Date(input.createdAt).toISOString(),
|
|
124
|
-
}, input.userId);
|
|
136
|
+
}, input.userId, input.createdAt);
|
|
125
137
|
}
|
|
126
138
|
/**
|
|
127
139
|
* Emit PostHog's documented manual feedback event for an LLM trace.
|