@agent-native/core 0.169.1 → 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/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +28 -0
- package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
- 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-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/slack.ts +4 -2
- 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/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/view-screen.ts +8 -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 +1383 -88
- 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/MultiScreenCanvas.tsx +284 -136
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
- 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 -1
- 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 +11 -4
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- 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 +77 -35
- package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
- package/corpus/templates/design/app/pages/Index.tsx +2 -0
- 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/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-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/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/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-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/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/resources/mcp-integration-catalog.js +0 -29
- 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/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 +19 -0
- package/dist/deploy/build.js +190 -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 +3 -0
- package/dist/localization/core-messages/de-DE.js +3 -0
- package/dist/localization/core-messages/en-US.d.ts +3 -0
- package/dist/localization/core-messages/en-US.js +3 -0
- package/dist/localization/core-messages/es-ES.js +3 -0
- package/dist/localization/core-messages/fr-FR.js +3 -0
- package/dist/localization/core-messages/hi-IN.js +3 -0
- package/dist/localization/core-messages/ja-JP.js +3 -0
- package/dist/localization/core-messages/ko-KR.js +3 -0
- package/dist/localization/core-messages/pt-BR.js +3 -0
- package/dist/localization/core-messages/zh-CN.js +3 -0
- package/dist/localization/core-messages/zh-TW.js +3 -0
- package/dist/localization/core-messages.d.ts +3 -0
- 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/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/routes.d.ts +3 -3
- 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 +1 -1
- package/dist/provider-api/actions/provider-api.d.ts +2 -2
- package/dist/provider-api/index.js +2 -0
- package/dist/resources/store.js +13 -4
- package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
- package/dist/secrets/register-framework-secrets.js +1 -1
- 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-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 +100 -20
- 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/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- 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 +2 -2
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDbExec } from "@agent-native/core/db";
|
|
1
|
+
import { getDbExec, isPostgres } from "@agent-native/core/db";
|
|
2
2
|
import { runWithRequestContext } from "@agent-native/core/server";
|
|
3
3
|
import { and, eq, isNull, lt, or } from "drizzle-orm";
|
|
4
4
|
|
|
@@ -1072,6 +1072,130 @@ export function scopedAnalyticsSql(
|
|
|
1072
1072
|
return { sql: rewritten, args };
|
|
1073
1073
|
}
|
|
1074
1074
|
|
|
1075
|
+
/**
|
|
1076
|
+
* Dashboard panel SQL (seeded and agent/user-authored) is written against
|
|
1077
|
+
* PostgreSQL date/JSON syntax — `to_char`/`INTERVAL`/`::date`/`::jsonb ->>` —
|
|
1078
|
+
* because that's the dialect this app runs against in production. A local
|
|
1079
|
+
* SQLite dev database doesn't understand any of that and throws a syntax
|
|
1080
|
+
* error before a row is ever read. Rather than hand-rewrite every seeded
|
|
1081
|
+
* panel's SQL (this app also lets the agent/UI author new first-party SQL
|
|
1082
|
+
* panels through this exact same execution path), translate the handful of
|
|
1083
|
+
* Postgres-only shapes this query surface actually produces into SQLite
|
|
1084
|
+
* equivalents right here at the execution boundary. PostgreSQL SQL is never
|
|
1085
|
+
* touched: this only runs when the active database is not Postgres.
|
|
1086
|
+
*/
|
|
1087
|
+
export function toSqliteCompatibleFirstPartySql(sql: string): string {
|
|
1088
|
+
let out = sql;
|
|
1089
|
+
|
|
1090
|
+
// properties::jsonb ->> 'key' -> json_extract(properties, '$."key"')
|
|
1091
|
+
// (a quoted JSON path member tolerates keys like "$ai_model" that start
|
|
1092
|
+
// with a character SQLite's unquoted path syntax can't lead with).
|
|
1093
|
+
out = out.replace(
|
|
1094
|
+
/([A-Za-z_][A-Za-z0-9_.]*)::jsonb\s*->>\s*'([^']*)'/g,
|
|
1095
|
+
(_match, column: string, key: string) =>
|
|
1096
|
+
`json_extract(${column}, '$."${key}"')`,
|
|
1097
|
+
);
|
|
1098
|
+
|
|
1099
|
+
// Postgres chr(N) -> SQLite char(N).
|
|
1100
|
+
out = out.replace(/\bchr\(/g, "char(");
|
|
1101
|
+
|
|
1102
|
+
// Any other Postgres type cast (::date, ::float, ::timestamptz, ...) is a
|
|
1103
|
+
// no-op on SQLite's dynamically-typed columns.
|
|
1104
|
+
out = out.replace(/::[A-Za-z_][A-Za-z0-9_]*/g, "");
|
|
1105
|
+
|
|
1106
|
+
// to_char(date_trunc('week', X), 'YYYY-MM-DD') -> Monday of X's week.
|
|
1107
|
+
// ('weekday 0' finds the next Sunday, '-6 days' steps back to that week's
|
|
1108
|
+
// Monday, matching Postgres's ISO week truncation.)
|
|
1109
|
+
out = out.replace(
|
|
1110
|
+
/to_char\(\s*date_trunc\(\s*'week'\s*,\s*([^()]+?)\s*\)\s*,\s*'YYYY-MM-DD'\s*\)/g,
|
|
1111
|
+
(_match, expr: string) => `date(${expr}, 'weekday 0', '-6 days')`,
|
|
1112
|
+
);
|
|
1113
|
+
|
|
1114
|
+
// <dateish-expr> (+|-) INTERVAL 'N days' -> the same day count applied
|
|
1115
|
+
// through SQLite's julian-day arithmetic, immediately reformatted back to
|
|
1116
|
+
// 'YYYY-MM-DD' text. Re-wrapping right away (instead of leaving a bare
|
|
1117
|
+
// julian-day number) matters: this expression sometimes appears outside
|
|
1118
|
+
// any to_char() call, compared directly against a text date column, and
|
|
1119
|
+
// SQLite treats any numeric value as less than any text value — a bare
|
|
1120
|
+
// number here would make that comparison silently always-true.
|
|
1121
|
+
out = out.replace(
|
|
1122
|
+
/([A-Za-z_][A-Za-z0-9_.]*|CURRENT_DATE)\s*(\+|-)\s*INTERVAL\s*'(\d+)\s*days?'/g,
|
|
1123
|
+
(_match, base: string, op: string, days: string) => {
|
|
1124
|
+
const juliandayBase = base === "CURRENT_DATE" ? "'now'" : base;
|
|
1125
|
+
return `date(julianday(${juliandayBase}) ${op} ${days})`;
|
|
1126
|
+
},
|
|
1127
|
+
);
|
|
1128
|
+
|
|
1129
|
+
// <dateish-expr ending in "date"> (+|-) <identifier> (no INTERVAL
|
|
1130
|
+
// keyword) — e.g. `bounds.start_date + offsets.n` in a generated date
|
|
1131
|
+
// series. Scoped to identifiers ending in "date" so unrelated integer
|
|
1132
|
+
// arithmetic (e.g. building the offsets themselves) is left alone.
|
|
1133
|
+
out = out.replace(
|
|
1134
|
+
/([A-Za-z_][A-Za-z0-9_.]*date)\s*(\+|-)\s*([A-Za-z_][A-Za-z0-9_.]*)/g,
|
|
1135
|
+
(_match, base: string, op: string, rhs: string) =>
|
|
1136
|
+
`date(julianday(${base}) ${op} ${rhs})`,
|
|
1137
|
+
);
|
|
1138
|
+
|
|
1139
|
+
// Every surviving to_char(expr, 'YYYY-MM-DD') now wraps an expr that
|
|
1140
|
+
// already evaluates to 'YYYY-MM-DD' text (a bare CURRENT_DATE, or one of
|
|
1141
|
+
// the date(...) forms produced above) — unwrap the call instead of
|
|
1142
|
+
// re-wrapping it. A regex can't balance the arbitrarily nested parens
|
|
1143
|
+
// `date(julianday(...) ...)` can produce, so walk the string instead.
|
|
1144
|
+
out = unwrapPostgresToChar(out);
|
|
1145
|
+
|
|
1146
|
+
return out;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
/**
|
|
1150
|
+
* Finds each top-level `to_char(expr, 'YYYY-MM-DD')` call and replaces it
|
|
1151
|
+
* with `expr` alone. Balances parens by hand rather than by regex so nested
|
|
1152
|
+
* calls (`date(julianday(...) - 7)`) unwrap correctly regardless of depth.
|
|
1153
|
+
*/
|
|
1154
|
+
function unwrapPostgresToChar(sql: string): string {
|
|
1155
|
+
const marker = "to_char(";
|
|
1156
|
+
let out = "";
|
|
1157
|
+
let i = 0;
|
|
1158
|
+
while (i < sql.length) {
|
|
1159
|
+
const idx = sql.indexOf(marker, i);
|
|
1160
|
+
if (idx === -1) {
|
|
1161
|
+
out += sql.slice(i);
|
|
1162
|
+
break;
|
|
1163
|
+
}
|
|
1164
|
+
out += sql.slice(i, idx);
|
|
1165
|
+
const openParen = idx + marker.length - 1;
|
|
1166
|
+
let depth = 0;
|
|
1167
|
+
let closeParen = openParen;
|
|
1168
|
+
for (; closeParen < sql.length; closeParen++) {
|
|
1169
|
+
if (sql[closeParen] === "(") depth++;
|
|
1170
|
+
else if (sql[closeParen] === ")") {
|
|
1171
|
+
depth--;
|
|
1172
|
+
if (depth === 0) break;
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
const inner = sql.slice(openParen + 1, closeParen);
|
|
1176
|
+
let innerDepth = 0;
|
|
1177
|
+
let topLevelCommaIdx = -1;
|
|
1178
|
+
for (let k = 0; k < inner.length; k++) {
|
|
1179
|
+
if (inner[k] === "(") innerDepth++;
|
|
1180
|
+
else if (inner[k] === ")") innerDepth--;
|
|
1181
|
+
else if (inner[k] === "," && innerDepth === 0) topLevelCommaIdx = k;
|
|
1182
|
+
}
|
|
1183
|
+
const expr =
|
|
1184
|
+
topLevelCommaIdx === -1 ? inner : inner.slice(0, topLevelCommaIdx);
|
|
1185
|
+
const format =
|
|
1186
|
+
topLevelCommaIdx === -1 ? "" : inner.slice(topLevelCommaIdx + 1).trim();
|
|
1187
|
+
if (format === "'YYYY-MM-DD'") {
|
|
1188
|
+
out += expr.trim();
|
|
1189
|
+
} else {
|
|
1190
|
+
// Not the to_char(expr, 'YYYY-MM-DD') shape this app's SQL uses;
|
|
1191
|
+
// leave it untouched rather than guess at unfamiliar formats.
|
|
1192
|
+
out += sql.slice(idx, closeParen + 1);
|
|
1193
|
+
}
|
|
1194
|
+
i = closeParen + 1;
|
|
1195
|
+
}
|
|
1196
|
+
return out;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1075
1199
|
function valueType(value: unknown): string {
|
|
1076
1200
|
if (typeof value === "number") return "number";
|
|
1077
1201
|
if (typeof value === "boolean") return "boolean";
|
|
@@ -1141,7 +1265,13 @@ export async function queryFirstPartyAnalytics(
|
|
|
1141
1265
|
return queryFirstPartyAnalyticsInBigQuery(scoped.sql, scoped.args, table);
|
|
1142
1266
|
}
|
|
1143
1267
|
const scoped = scopedAnalyticsSql(sql, scope);
|
|
1144
|
-
|
|
1268
|
+
// Dashboard SQL is authored against Postgres date/JSON syntax; translate
|
|
1269
|
+
// it for a non-Postgres sql-store (local SQLite dev) at the last possible
|
|
1270
|
+
// moment so Postgres itself never sees a rewritten query.
|
|
1271
|
+
const dialectSql = isPostgres()
|
|
1272
|
+
? scoped.sql
|
|
1273
|
+
: toSqliteCompatibleFirstPartySql(scoped.sql);
|
|
1274
|
+
const wrappedSql = `SELECT * FROM (${dialectSql}) AS first_party_analytics_query LIMIT ${MAX_QUERY_ROWS}`;
|
|
1145
1275
|
const timeoutMs = Math.max(
|
|
1146
1276
|
1,
|
|
1147
1277
|
options.timeoutMs ?? FIRST_PARTY_ANALYTICS_QUERY_TIMEOUT_MS,
|
|
@@ -466,8 +466,10 @@ export async function resolveUsersWithCoverage(
|
|
|
466
466
|
}
|
|
467
467
|
|
|
468
468
|
const unresolvedUserIds = [...unresolvedUsers];
|
|
469
|
-
|
|
470
|
-
|
|
469
|
+
if (!directoryError) {
|
|
470
|
+
for (const id of unresolvedUserIds) {
|
|
471
|
+
results[id] = fallbackSlackUser(id);
|
|
472
|
+
}
|
|
471
473
|
}
|
|
472
474
|
|
|
473
475
|
// Resolve bot users from messages that have bot_id but no user
|
|
@@ -14,7 +14,12 @@ export default mergeConfig(
|
|
|
14
14
|
},
|
|
15
15
|
test: {
|
|
16
16
|
include: ["**/*.{test,spec}.?(c|m)[jt]s?(x)"],
|
|
17
|
-
exclude: [
|
|
17
|
+
exclude: [
|
|
18
|
+
"**/node_modules/**",
|
|
19
|
+
"**/.git/**",
|
|
20
|
+
"**/dist/**",
|
|
21
|
+
"**/.react-router/**",
|
|
22
|
+
],
|
|
18
23
|
},
|
|
19
24
|
}),
|
|
20
25
|
);
|
|
@@ -19,10 +19,17 @@ data, and generated extension/app content may mention credential **names** such
|
|
|
19
19
|
as `OPENAI_API_KEY`, but must not contain real API keys, tokens, webhook URLs,
|
|
20
20
|
signing secrets, OAuth refresh tokens, or private Builder/customer data.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`${keys.NAME}` substitution.
|
|
25
|
-
|
|
22
|
+
Provider secret values are supplied at runtime through the encrypted
|
|
23
|
+
`app_secrets` vault, `saveCredential` / `resolveCredential`, OAuth, or
|
|
24
|
+
`${keys.NAME}` substitution. Deployment configuration is reserved for
|
|
25
|
+
deploy-level secrets and non-provider configuration. Examples must use obvious
|
|
26
|
+
placeholders such as `<OPENAI_API_KEY>` or `${keys.SLACK_WEBHOOK}`, not
|
|
27
|
+
real-looking copied values.
|
|
28
|
+
|
|
29
|
+
Provider credentials and provider account identifiers are workspace data. Use
|
|
30
|
+
standard workspace connections and org/workspace vault scopes; never put them
|
|
31
|
+
in `.env` or deployment environment variables, and never add a provider-specific
|
|
32
|
+
action or startup bootstrap just to write a credential for one organization.
|
|
26
33
|
|
|
27
34
|
## Credential Modeling Preflight
|
|
28
35
|
|
|
@@ -20,11 +20,13 @@ import {
|
|
|
20
20
|
} from "@agent-native/core/client/host";
|
|
21
21
|
import { useT } from "@agent-native/core/client/i18n";
|
|
22
22
|
import {
|
|
23
|
-
AGENT_NATIVE_EMBED_MESSAGE_TYPES,
|
|
24
|
-
createAgentNativeEmbedEnvelope,
|
|
25
23
|
createEmbeddedAppBridge,
|
|
26
24
|
type EmbeddedAppBridge,
|
|
27
|
-
} from "@agent-native/core/embedding";
|
|
25
|
+
} from "@agent-native/core/embedding/bridge";
|
|
26
|
+
import {
|
|
27
|
+
AGENT_NATIVE_EMBED_MESSAGE_TYPES,
|
|
28
|
+
createAgentNativeEmbedEnvelope,
|
|
29
|
+
} from "@agent-native/core/embedding/protocol";
|
|
28
30
|
import {
|
|
29
31
|
EMBED_MODE_QUERY_PARAM,
|
|
30
32
|
EMBED_TOKEN_QUERY_PARAM,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type RouteConfig } from "@react-router/dev/routes";
|
|
2
2
|
import { flatRoutes } from "@react-router/fs-routes";
|
|
3
3
|
|
|
4
|
-
export default flatRoutes(
|
|
4
|
+
export default flatRoutes({
|
|
5
|
+
ignoredRouteFiles: ["**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}"],
|
|
6
|
+
}) satisfies RouteConfig;
|
|
@@ -14,7 +14,12 @@ export default mergeConfig(
|
|
|
14
14
|
},
|
|
15
15
|
test: {
|
|
16
16
|
include: ["**/*.{test,spec}.?(c|m)[jt]s?(x)"],
|
|
17
|
-
exclude: [
|
|
17
|
+
exclude: [
|
|
18
|
+
"**/node_modules/**",
|
|
19
|
+
"**/.git/**",
|
|
20
|
+
"**/dist/**",
|
|
21
|
+
"**/.react-router/**",
|
|
22
|
+
],
|
|
18
23
|
},
|
|
19
24
|
}),
|
|
20
25
|
);
|
|
@@ -19,10 +19,17 @@ data, and generated extension/app content may mention credential **names** such
|
|
|
19
19
|
as `OPENAI_API_KEY`, but must not contain real API keys, tokens, webhook URLs,
|
|
20
20
|
signing secrets, OAuth refresh tokens, or private Builder/customer data.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`${keys.NAME}` substitution.
|
|
25
|
-
|
|
22
|
+
Provider secret values are supplied at runtime through the encrypted
|
|
23
|
+
`app_secrets` vault, `saveCredential` / `resolveCredential`, OAuth, or
|
|
24
|
+
`${keys.NAME}` substitution. Deployment configuration is reserved for
|
|
25
|
+
deploy-level secrets and non-provider configuration. Examples must use obvious
|
|
26
|
+
placeholders such as `<OPENAI_API_KEY>` or `${keys.SLACK_WEBHOOK}`, not
|
|
27
|
+
real-looking copied values.
|
|
28
|
+
|
|
29
|
+
Provider credentials and provider account identifiers are workspace data. Use
|
|
30
|
+
standard workspace connections and org/workspace vault scopes; never put them
|
|
31
|
+
in `.env` or deployment environment variables, and never add a provider-specific
|
|
32
|
+
action or startup bootstrap just to write a credential for one organization.
|
|
26
33
|
|
|
27
34
|
## Credential Modeling Preflight
|
|
28
35
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@agent-native/toolkit/ui/pointer-lock";
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
} from "@/components/ui/dropdown-menu";
|
|
68
68
|
import { Input } from "@/components/ui/input";
|
|
69
69
|
import { Label } from "@/components/ui/label";
|
|
70
|
+
import { afterBodyPointerUnlock } from "@/components/ui/pointer-lock";
|
|
70
71
|
import { Progress } from "@/components/ui/progress";
|
|
71
72
|
import {
|
|
72
73
|
Select,
|
|
@@ -2253,7 +2254,11 @@ export default function SourcesRoute() {
|
|
|
2253
2254
|
result,
|
|
2254
2255
|
sourceKey: form.sourceKey,
|
|
2255
2256
|
});
|
|
2256
|
-
|
|
2257
|
+
setSetupOpen(false);
|
|
2258
|
+
if (handoff) {
|
|
2259
|
+
afterBodyPointerUnlock(() => setIngestHandoff(handoff));
|
|
2260
|
+
}
|
|
2261
|
+
return;
|
|
2257
2262
|
}
|
|
2258
2263
|
setSetupOpen(false);
|
|
2259
2264
|
}
|
|
@@ -2360,7 +2365,7 @@ export default function SourcesRoute() {
|
|
|
2360
2365
|
: undefined
|
|
2361
2366
|
}
|
|
2362
2367
|
onSync={() => syncSource.mutate({ sourceId: source.id })}
|
|
2363
|
-
onTune={() => openEdit(source)}
|
|
2368
|
+
onTune={() => afterBodyPointerUnlock(() => openEdit(source))}
|
|
2364
2369
|
onImportMarkdown={() => setMarkdownImportSource(source)}
|
|
2365
2370
|
onArchive={() => setArchiveSource(source)}
|
|
2366
2371
|
/>
|
|
@@ -2451,7 +2456,7 @@ export default function SourcesRoute() {
|
|
|
2451
2456
|
}
|
|
2452
2457
|
onAddSource={(provider) => {
|
|
2453
2458
|
setAdvancedOpen(false);
|
|
2454
|
-
openCreate(provider);
|
|
2459
|
+
afterBodyPointerUnlock(() => openCreate(provider));
|
|
2455
2460
|
}}
|
|
2456
2461
|
/>
|
|
2457
2462
|
</div>
|
|
@@ -19,10 +19,17 @@ data, and generated extension/app content may mention credential **names** such
|
|
|
19
19
|
as `OPENAI_API_KEY`, but must not contain real API keys, tokens, webhook URLs,
|
|
20
20
|
signing secrets, OAuth refresh tokens, or private Builder/customer data.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`${keys.NAME}` substitution.
|
|
25
|
-
|
|
22
|
+
Provider secret values are supplied at runtime through the encrypted
|
|
23
|
+
`app_secrets` vault, `saveCredential` / `resolveCredential`, OAuth, or
|
|
24
|
+
`${keys.NAME}` substitution. Deployment configuration is reserved for
|
|
25
|
+
deploy-level secrets and non-provider configuration. Examples must use obvious
|
|
26
|
+
placeholders such as `<OPENAI_API_KEY>` or `${keys.SLACK_WEBHOOK}`, not
|
|
27
|
+
real-looking copied values.
|
|
28
|
+
|
|
29
|
+
Provider credentials and provider account identifiers are workspace data. Use
|
|
30
|
+
standard workspace connections and org/workspace vault scopes; never put them
|
|
31
|
+
in `.env` or deployment environment variables, and never add a provider-specific
|
|
32
|
+
action or startup bootstrap just to write a credential for one organization.
|
|
26
33
|
|
|
27
34
|
## Credential Modeling Preflight
|
|
28
35
|
|
|
@@ -1,21 +1,100 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
getRequestOrgId,
|
|
4
|
+
getRequestUserEmail,
|
|
5
|
+
} from "@agent-native/core/server/request-context";
|
|
6
|
+
import {
|
|
7
|
+
accessFilter,
|
|
8
|
+
ROLE_RANK,
|
|
9
|
+
type ShareRole,
|
|
10
|
+
} from "@agent-native/core/sharing";
|
|
11
|
+
import { and, desc, eq, inArray, or, sql } from "drizzle-orm";
|
|
4
12
|
import { z } from "zod";
|
|
5
13
|
|
|
6
14
|
import { getDb, schema } from "../server/db/index.js";
|
|
7
15
|
import { rowToBookingLink } from "../server/lib/booking-link-utils.js";
|
|
8
16
|
|
|
17
|
+
type EffectiveRole = "owner" | ShareRole;
|
|
18
|
+
|
|
19
|
+
function normalizeEmail(email: string | undefined): string | null {
|
|
20
|
+
const normalized = email?.trim().toLowerCase();
|
|
21
|
+
return normalized || null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function strongerRole(current: ShareRole | null, next: ShareRole): ShareRole {
|
|
25
|
+
if (!current || ROLE_RANK[next] > ROLE_RANK[current]) return next;
|
|
26
|
+
return current;
|
|
27
|
+
}
|
|
28
|
+
|
|
9
29
|
export default defineAction({
|
|
10
30
|
description: "List all booking links",
|
|
11
31
|
schema: z.object({}),
|
|
12
32
|
http: { method: "GET" },
|
|
13
33
|
run: async () => {
|
|
14
|
-
const
|
|
34
|
+
const db = getDb();
|
|
35
|
+
const userEmail = normalizeEmail(getRequestUserEmail());
|
|
36
|
+
const orgId = getRequestOrgId();
|
|
37
|
+
const rows = await db
|
|
15
38
|
.select()
|
|
16
39
|
.from(schema.bookingLinks)
|
|
17
40
|
.where(accessFilter(schema.bookingLinks, schema.bookingLinkShares))
|
|
18
41
|
.orderBy(desc(schema.bookingLinks.updatedAt));
|
|
19
|
-
|
|
42
|
+
|
|
43
|
+
if (rows.length === 0) return [];
|
|
44
|
+
|
|
45
|
+
const principalClauses: NonNullable<ReturnType<typeof and>>[] = [];
|
|
46
|
+
if (userEmail) {
|
|
47
|
+
principalClauses.push(
|
|
48
|
+
and(
|
|
49
|
+
eq(schema.bookingLinkShares.principalType, "user"),
|
|
50
|
+
sql`lower(${schema.bookingLinkShares.principalId}) = ${userEmail}`,
|
|
51
|
+
)!,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (orgId) {
|
|
55
|
+
principalClauses.push(
|
|
56
|
+
and(
|
|
57
|
+
eq(schema.bookingLinkShares.principalType, "org"),
|
|
58
|
+
eq(schema.bookingLinkShares.principalId, orgId),
|
|
59
|
+
)!,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const shareRoleById = new Map<string, ShareRole>();
|
|
64
|
+
if (principalClauses.length > 0) {
|
|
65
|
+
const shareRows = await db
|
|
66
|
+
.select({
|
|
67
|
+
resourceId: schema.bookingLinkShares.resourceId,
|
|
68
|
+
role: schema.bookingLinkShares.role,
|
|
69
|
+
})
|
|
70
|
+
.from(schema.bookingLinkShares)
|
|
71
|
+
.where(
|
|
72
|
+
and(
|
|
73
|
+
inArray(
|
|
74
|
+
schema.bookingLinkShares.resourceId,
|
|
75
|
+
rows.map((row) => row.id),
|
|
76
|
+
),
|
|
77
|
+
or(...principalClauses),
|
|
78
|
+
),
|
|
79
|
+
);
|
|
80
|
+
for (const share of shareRows) {
|
|
81
|
+
shareRoleById.set(
|
|
82
|
+
share.resourceId,
|
|
83
|
+
strongerRole(shareRoleById.get(share.resourceId) ?? null, share.role),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return rows.map((row) => {
|
|
89
|
+
let role: EffectiveRole = shareRoleById.get(row.id) ?? "viewer";
|
|
90
|
+
if (
|
|
91
|
+
userEmail &&
|
|
92
|
+
normalizeEmail(row.ownerEmail) === userEmail &&
|
|
93
|
+
(!row.orgId || row.orgId === orgId)
|
|
94
|
+
) {
|
|
95
|
+
role = "owner";
|
|
96
|
+
}
|
|
97
|
+
return { ...rowToBookingLink(row), accessRole: role };
|
|
98
|
+
});
|
|
20
99
|
},
|
|
21
100
|
});
|
|
@@ -57,7 +57,7 @@ export default defineAction({
|
|
|
57
57
|
isActive: z.boolean().optional().describe("Whether the link is active"),
|
|
58
58
|
}),
|
|
59
59
|
run: async (args) => {
|
|
60
|
-
await assertAccess("booking-link", args.id, "editor");
|
|
60
|
+
const access = await assertAccess("booking-link", args.id, "editor");
|
|
61
61
|
|
|
62
62
|
const durationInput = normalizeBookingDurationInput({
|
|
63
63
|
duration: args.duration,
|
|
@@ -90,6 +90,7 @@ export default defineAction({
|
|
|
90
90
|
.select({
|
|
91
91
|
slug: schema.bookingLinks.slug,
|
|
92
92
|
ownerEmail: schema.bookingLinks.ownerEmail,
|
|
93
|
+
isActive: schema.bookingLinks.isActive,
|
|
93
94
|
})
|
|
94
95
|
.from(schema.bookingLinks)
|
|
95
96
|
.where(eq(schema.bookingLinks.id, args.id));
|
|
@@ -116,7 +117,7 @@ export default defineAction({
|
|
|
116
117
|
? JSON.stringify(args.conferencing)
|
|
117
118
|
: null,
|
|
118
119
|
color: args.color ? args.color.trim() : null,
|
|
119
|
-
isActive: args.isActive ??
|
|
120
|
+
isActive: args.isActive ?? current.isActive,
|
|
120
121
|
updatedAt: new Date().toISOString(),
|
|
121
122
|
})
|
|
122
123
|
.where(eq(schema.bookingLinks.id, args.id));
|
|
@@ -140,6 +141,6 @@ export default defineAction({
|
|
|
140
141
|
.where(eq(schema.bookingLinks.id, args.id));
|
|
141
142
|
|
|
142
143
|
if (!updated) throw new Error("Booking link not found");
|
|
143
|
-
return rowToBookingLink(updated);
|
|
144
|
+
return { ...rowToBookingLink(updated), accessRole: access.role };
|
|
144
145
|
},
|
|
145
146
|
});
|
|
@@ -74,6 +74,7 @@ interface EventDetailPanelProps {
|
|
|
74
74
|
onClose: () => void;
|
|
75
75
|
onDelete: (eventId: string) => void;
|
|
76
76
|
onTitleSave?: (eventId: string, title: string, accountEmail?: string) => void;
|
|
77
|
+
timezone?: string;
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
function formatDuration(start: string, end: string): string {
|
|
@@ -121,6 +122,7 @@ export function EventDetailPanel({
|
|
|
121
122
|
onClose,
|
|
122
123
|
onDelete,
|
|
123
124
|
onTitleSave,
|
|
125
|
+
timezone,
|
|
124
126
|
}: EventDetailPanelProps) {
|
|
125
127
|
const t = useT();
|
|
126
128
|
const workingLocationLabels = createWorkingLocationDisplayLabels(t);
|
|
@@ -451,7 +453,9 @@ export function EventDetailPanel({
|
|
|
451
453
|
{format(
|
|
452
454
|
getDisplayDateInTimezone(
|
|
453
455
|
event.start,
|
|
454
|
-
|
|
456
|
+
timezone ??
|
|
457
|
+
event.startTimeZone ??
|
|
458
|
+
event.endTimeZone,
|
|
455
459
|
),
|
|
456
460
|
"h:mm a",
|
|
457
461
|
)}
|
|
@@ -459,7 +463,9 @@ export function EventDetailPanel({
|
|
|
459
463
|
{format(
|
|
460
464
|
getDisplayDateInTimezone(
|
|
461
465
|
event.end,
|
|
462
|
-
|
|
466
|
+
timezone ??
|
|
467
|
+
event.endTimeZone ??
|
|
468
|
+
event.startTimeZone,
|
|
463
469
|
),
|
|
464
470
|
"h:mm a",
|
|
465
471
|
)}
|
|
@@ -471,7 +477,9 @@ export function EventDetailPanel({
|
|
|
471
477
|
{format(
|
|
472
478
|
getDisplayDateInTimezone(
|
|
473
479
|
event.start,
|
|
474
|
-
|
|
480
|
+
timezone ??
|
|
481
|
+
event.startTimeZone ??
|
|
482
|
+
event.endTimeZone,
|
|
475
483
|
),
|
|
476
484
|
"EEE MMM d",
|
|
477
485
|
)}
|
|
@@ -489,7 +489,7 @@ export function EventDetailPopover({
|
|
|
489
489
|
const t = useT();
|
|
490
490
|
const workingLocationLabels = createWorkingLocationDisplayLabels(t);
|
|
491
491
|
const isMobile = useIsMobile();
|
|
492
|
-
const eventTimezone = event.startTimeZone ||
|
|
492
|
+
const eventTimezone = timezone || event.startTimeZone || getLocalTimezone();
|
|
493
493
|
const [open, setOpen] = useState(defaultOpen);
|
|
494
494
|
const [editingTitle, setEditingTitle] = useState(
|
|
495
495
|
defaultOpen ? getEditableEventTitle(event) : "",
|