@agent-native/core 0.90.1 → 0.90.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +26 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
- package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
- package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
- package/corpus/core/docs/content/toolkit-history.mdx +95 -0
- package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
- package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
- package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
- package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
- package/corpus/core/package.json +35 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
- package/corpus/core/src/agent/engine/registry.ts +23 -16
- package/corpus/core/src/agent/production-agent.ts +37 -6
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/command-navigation/index.ts +15 -0
- package/corpus/core/src/client/comments-review/index.ts +1 -0
- package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
- package/corpus/core/src/client/history/index.ts +18 -0
- package/corpus/core/src/client/history/use-history.ts +86 -0
- package/corpus/core/src/client/index.ts +76 -9
- package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
- package/corpus/core/src/client/org/TeamPage.tsx +3 -3
- package/corpus/core/src/client/org/hooks.ts +32 -0
- package/corpus/core/src/client/org/index.ts +30 -1
- package/corpus/core/src/client/org-team/index.ts +1 -0
- package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
- package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
- package/corpus/core/src/client/review/index.ts +25 -0
- package/corpus/core/src/client/review/use-review.ts +114 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
- package/corpus/core/src/client/settings/index.ts +11 -1
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
- package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
- package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
- package/corpus/core/src/client/setup-connections/index.ts +46 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
- package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
- package/corpus/core/src/client/use-action.ts +39 -2
- package/corpus/core/src/client/use-db-sync.ts +44 -18
- package/corpus/core/src/command-navigation/actions.ts +100 -0
- package/corpus/core/src/command-navigation/index.ts +12 -0
- package/corpus/core/src/comments-review/index.ts +1 -0
- package/corpus/core/src/db/create-get-db.ts +32 -2
- package/corpus/core/src/file-upload/builder.ts +24 -3
- package/corpus/core/src/file-upload/types.ts +3 -1
- package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
- package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
- package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
- package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
- package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
- package/corpus/core/src/history/index.ts +27 -0
- package/corpus/core/src/history/registry.ts +99 -0
- package/corpus/core/src/history/store.ts +348 -0
- package/corpus/core/src/history/types.ts +69 -0
- package/corpus/core/src/index.ts +10 -0
- package/corpus/core/src/navigation/index.ts +170 -0
- package/corpus/core/src/org/index.ts +8 -0
- package/corpus/core/src/org/permissions.ts +30 -0
- package/corpus/core/src/org-team/index.ts +1 -0
- package/corpus/core/src/private-blob/registry.ts +1 -0
- package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
- package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
- package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
- package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
- package/corpus/core/src/review/actions/set-review-status.ts +58 -0
- package/corpus/core/src/review/index.ts +36 -0
- package/corpus/core/src/review/mentions.ts +44 -0
- package/corpus/core/src/review/registry.ts +99 -0
- package/corpus/core/src/review/store.ts +687 -0
- package/corpus/core/src/review/types.ts +97 -0
- package/corpus/core/src/server/action-discovery.ts +54 -0
- package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
- package/corpus/core/src/server/credential-provider.ts +108 -0
- package/corpus/core/src/server/framework-request-handler.ts +52 -4
- package/corpus/core/src/setup-connections/index.ts +89 -0
- package/corpus/core/src/setup-connections/onboarding.ts +47 -0
- package/corpus/core/src/transcription/builder-transcription.ts +9 -2
- package/corpus/core/src/vite/action-types-plugin.ts +52 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/analytics/app/global.css +22 -10
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/analytics/app/i18n-data.ts +81 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
- package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
- package/corpus/templates/assets/AGENTS.md +23 -4
- package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
- package/corpus/templates/assets/actions/_helpers.ts +8 -1
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
- package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
- package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
- package/corpus/templates/assets/actions/generate-image.ts +342 -25
- package/corpus/templates/assets/actions/get-library.ts +4 -3
- package/corpus/templates/assets/actions/navigate.ts +2 -1
- package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
- package/corpus/templates/assets/actions/update-asset.ts +1 -0
- package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
- package/corpus/templates/assets/actions/view-screen.ts +8 -1
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
- package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
- package/corpus/templates/assets/app/i18n-data.ts +650 -0
- package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
- package/corpus/templates/assets/app/routes/library.tsx +43 -1
- package/corpus/templates/assets/server/lib/generation.ts +366 -44
- package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
- package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
- package/corpus/templates/assets/shared/api.ts +47 -0
- package/corpus/templates/brain/app/routes/settings.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
- package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
- package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
- package/corpus/templates/clips/actions/create-recording.ts +5 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
- package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
- package/corpus/templates/clips/actions/request-transcript.ts +31 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
- package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
- package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
- package/corpus/templates/clips/app/routes/record.tsx +178 -80
- package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
- package/corpus/templates/clips/desktop/src/app.tsx +40 -3
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +23 -6
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +28 -3
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
- package/corpus/templates/clips/shared/finalize-recovery.ts +35 -3
- package/corpus/templates/content/AGENTS.md +52 -52
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
- package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
- package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
- package/corpus/templates/content/actions/_database-utils.ts +44 -4
- package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
- package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
- package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
- package/corpus/templates/content/actions/delete-content-database.ts +1 -0
- package/corpus/templates/content/actions/delete-document.ts +337 -52
- package/corpus/templates/content/actions/get-document.ts +11 -2
- package/corpus/templates/content/actions/list-content-databases.ts +57 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
- package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
- package/corpus/templates/content/actions/restore-content-database.ts +1 -0
- package/corpus/templates/content/actions/update-document.ts +43 -0
- package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
- package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
- package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
- package/corpus/templates/content/app/global.css +41 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
- package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
- package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
- package/corpus/templates/content/app/i18n-data.ts +355 -0
- package/corpus/templates/content/app/root.tsx +22 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
- package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
- package/corpus/templates/content/shared/api.ts +13 -0
- package/corpus/templates/content/shared/builder-mdx.ts +16 -3
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
- package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
- package/corpus/templates/design/AGENTS.md +9 -2
- package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
- package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
- package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
- package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
- package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
- package/corpus/templates/design/actions/create-component.ts +29 -60
- package/corpus/templates/design/actions/create-file.ts +9 -2
- package/corpus/templates/design/actions/duplicate-design.ts +31 -2
- package/corpus/templates/design/actions/edit-design.ts +36 -38
- package/corpus/templates/design/actions/generate-design-title.ts +87 -0
- package/corpus/templates/design/actions/generate-design.ts +53 -18
- package/corpus/templates/design/actions/generate-screens.ts +108 -4
- package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
- package/corpus/templates/design/actions/insert-asset.ts +34 -29
- package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
- package/corpus/templates/design/actions/update-file.ts +190 -75
- package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
- package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
- package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
- package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
- package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
- package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
- package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
- package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
- package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
- package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
- package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
- package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
- package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
- package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
- package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
- package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
- package/corpus/templates/design/app/components/design/types.ts +15 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
- package/corpus/templates/design/app/global.css +8 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
- package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
- package/corpus/templates/design/app/i18n-data.ts +1664 -152
- package/corpus/templates/design/app/i18n-motion.ts +563 -0
- package/corpus/templates/design/app/lib/design-import.ts +73 -0
- package/corpus/templates/design/app/pages/Index.tsx +41 -22
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
- package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
- package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
- package/corpus/templates/design/server/source-workspace.ts +139 -59
- package/corpus/templates/design/shared/board-file.ts +11 -2
- package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
- package/corpus/templates/design/shared/canvas-math.ts +354 -35
- package/corpus/templates/design/shared/code-layer.ts +277 -8
- package/corpus/templates/design/shared/design-state.ts +11 -4
- package/corpus/templates/design/shared/interaction-states.ts +548 -0
- package/corpus/templates/design/shared/motion-compiler.ts +186 -23
- package/corpus/templates/design/shared/motion-easing.ts +294 -0
- package/corpus/templates/design/shared/motion-timeline.ts +400 -34
- package/corpus/templates/design/shared/prompt-title.ts +95 -0
- package/corpus/templates/design/shared/responsive-classes.ts +448 -10
- package/corpus/templates/design/shared/screen-annotation.ts +46 -0
- package/corpus/templates/design/shared/shader-fills.ts +1009 -0
- package/corpus/templates/design/shared/shader-presets.ts +852 -4
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
- package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +15 -1
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +20 -1
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +22 -14
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +27 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/command-navigation/index.d.ts +4 -0
- package/dist/client/command-navigation/index.d.ts.map +1 -0
- package/dist/client/command-navigation/index.js +4 -0
- package/dist/client/command-navigation/index.js.map +1 -0
- package/dist/client/comments-review/index.d.ts +2 -0
- package/dist/client/comments-review/index.d.ts.map +1 -0
- package/dist/client/comments-review/index.js +2 -0
- package/dist/client/comments-review/index.js.map +1 -0
- package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
- package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/client/history/VersionHistoryPanel.js +24 -0
- package/dist/client/history/VersionHistoryPanel.js.map +1 -0
- package/dist/client/history/index.d.ts +3 -0
- package/dist/client/history/index.d.ts.map +1 -0
- package/dist/client/history/index.js +3 -0
- package/dist/client/history/index.js.map +1 -0
- package/dist/client/history/use-history.d.ts +46 -0
- package/dist/client/history/use-history.d.ts.map +1 -0
- package/dist/client/history/use-history.js +18 -0
- package/dist/client/history/use-history.js.map +1 -0
- package/dist/client/index.d.ts +6 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.js +5 -5
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.js +3 -3
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +12 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +15 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +4 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +3 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/org-team/index.d.ts +2 -0
- package/dist/client/org-team/index.d.ts.map +1 -0
- package/dist/client/org-team/index.js +2 -0
- package/dist/client/org-team/index.js.map +1 -0
- package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
- package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
- package/dist/client/review/ReviewStatusBadge.js +19 -0
- package/dist/client/review/ReviewStatusBadge.js.map +1 -0
- package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
- package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
- package/dist/client/review/ReviewThreadPanel.js +84 -0
- package/dist/client/review/ReviewThreadPanel.js.map +1 -0
- package/dist/client/review/index.d.ts +4 -0
- package/dist/client/review/index.d.ts.map +1 -0
- package/dist/client/review/index.js +4 -0
- package/dist/client/review/index.js.map +1 -0
- package/dist/client/review/use-review.d.ts +68 -0
- package/dist/client/review/use-review.d.ts.map +1 -0
- package/dist/client/review/use-review.js +22 -0
- package/dist/client/review/use-review.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
- package/dist/client/setup-connections/index.d.ts +7 -0
- package/dist/client/setup-connections/index.d.ts.map +1 -0
- package/dist/client/setup-connections/index.js +7 -0
- package/dist/client/setup-connections/index.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +4 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +13 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.js +3 -3
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/use-action.d.ts +3 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +34 -3
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +37 -18
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/command-navigation/actions.d.ts +25 -0
- package/dist/command-navigation/actions.d.ts.map +1 -0
- package/dist/command-navigation/actions.js +64 -0
- package/dist/command-navigation/actions.js.map +1 -0
- package/dist/command-navigation/index.d.ts +4 -0
- package/dist/command-navigation/index.d.ts.map +1 -0
- package/dist/command-navigation/index.js +4 -0
- package/dist/command-navigation/index.js.map +1 -0
- package/dist/comments-review/index.d.ts +2 -0
- package/dist/comments-review/index.d.ts.map +1 -0
- package/dist/comments-review/index.js +2 -0
- package/dist/comments-review/index.js.map +1 -0
- package/dist/db/create-get-db.d.ts +25 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +25 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +18 -2
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/file-upload/types.d.ts +3 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/history/actions/create-resource-version.d.ts +10 -0
- package/dist/history/actions/create-resource-version.d.ts.map +1 -0
- package/dist/history/actions/create-resource-version.js +65 -0
- package/dist/history/actions/create-resource-version.js.map +1 -0
- package/dist/history/actions/get-resource-version.d.ts +10 -0
- package/dist/history/actions/get-resource-version.d.ts.map +1 -0
- package/dist/history/actions/get-resource-version.js +38 -0
- package/dist/history/actions/get-resource-version.js.map +1 -0
- package/dist/history/actions/list-resource-history.d.ts +10 -0
- package/dist/history/actions/list-resource-history.d.ts.map +1 -0
- package/dist/history/actions/list-resource-history.js +45 -0
- package/dist/history/actions/list-resource-history.js.map +1 -0
- package/dist/history/actions/list-resource-versions.d.ts +10 -0
- package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
- package/dist/history/actions/list-resource-versions.js +35 -0
- package/dist/history/actions/list-resource-versions.js.map +1 -0
- package/dist/history/actions/restore-resource-version.d.ts +11 -0
- package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
- package/dist/history/actions/restore-resource-version.js +59 -0
- package/dist/history/actions/restore-resource-version.js.map +1 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/registry.d.ts +10 -0
- package/dist/history/registry.d.ts.map +1 -0
- package/dist/history/registry.js +61 -0
- package/dist/history/registry.js.map +1 -0
- package/dist/history/store.d.ts +34 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +265 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +55 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/navigation/index.d.ts +53 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +105 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/permissions.d.ts +7 -0
- package/dist/org/permissions.d.ts.map +1 -0
- package/dist/org/permissions.js +21 -0
- package/dist/org/permissions.js.map +1 -0
- package/dist/org-team/index.d.ts +2 -0
- package/dist/org-team/index.d.ts.map +1 -0
- package/dist/org-team/index.js +2 -0
- package/dist/org-team/index.js.map +1 -0
- package/dist/private-blob/registry.d.ts.map +1 -1
- package/dist/private-blob/registry.js +1 -0
- package/dist/private-blob/registry.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/review/actions/consume-review-feedback.d.ts +9 -0
- package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/consume-review-feedback.js +29 -0
- package/dist/review/actions/consume-review-feedback.js.map +1 -0
- package/dist/review/actions/create-review-comment.d.ts +18 -0
- package/dist/review/actions/create-review-comment.d.ts.map +1 -0
- package/dist/review/actions/create-review-comment.js +81 -0
- package/dist/review/actions/create-review-comment.js.map +1 -0
- package/dist/review/actions/delete-review-comment.d.ts +10 -0
- package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
- package/dist/review/actions/delete-review-comment.js +45 -0
- package/dist/review/actions/delete-review-comment.js.map +1 -0
- package/dist/review/actions/get-review-feedback.d.ts +10 -0
- package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/get-review-feedback.js +45 -0
- package/dist/review/actions/get-review-feedback.js.map +1 -0
- package/dist/review/actions/list-review-comments.d.ts +13 -0
- package/dist/review/actions/list-review-comments.d.ts.map +1 -0
- package/dist/review/actions/list-review-comments.js +44 -0
- package/dist/review/actions/list-review-comments.js.map +1 -0
- package/dist/review/actions/reply-review-comment.d.ts +16 -0
- package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
- package/dist/review/actions/reply-review-comment.js +84 -0
- package/dist/review/actions/reply-review-comment.js.map +1 -0
- package/dist/review/actions/resolve-review-thread.d.ts +11 -0
- package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
- package/dist/review/actions/resolve-review-thread.js +46 -0
- package/dist/review/actions/resolve-review-thread.js.map +1 -0
- package/dist/review/actions/set-review-status.d.ts +9 -0
- package/dist/review/actions/set-review-status.d.ts.map +1 -0
- package/dist/review/actions/set-review-status.js +43 -0
- package/dist/review/actions/set-review-status.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/mentions.d.ts +4 -0
- package/dist/review/mentions.d.ts.map +1 -0
- package/dist/review/mentions.js +39 -0
- package/dist/review/mentions.js.map +1 -0
- package/dist/review/registry.d.ts +10 -0
- package/dist/review/registry.d.ts.map +1 -0
- package/dist/review/registry.js +61 -0
- package/dist/review/registry.js.map +1 -0
- package/dist/review/store.d.ts +63 -0
- package/dist/review/store.d.ts.map +1 -0
- package/dist/review/store.js +558 -0
- package/dist/review/store.js.map +1 -0
- package/dist/review/types.d.ts +77 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +2 -0
- package/dist/review/types.js.map +1 -0
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +54 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
- package/dist/server/agent-engine-api-key-route.js +5 -0
- package/dist/server/agent-engine-api-key-route.js.map +1 -1
- package/dist/server/credential-provider.d.ts +26 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +82 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +37 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/setup-connections/index.d.ts +6 -0
- package/dist/setup-connections/index.d.ts.map +1 -0
- package/dist/setup-connections/index.js +6 -0
- package/dist/setup-connections/index.js.map +1 -0
- package/dist/setup-connections/onboarding.d.ts +14 -0
- package/dist/setup-connections/onboarding.d.ts.map +1 -0
- package/dist/setup-connections/onboarding.js +23 -0
- package/dist/setup-connections/onboarding.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +5 -2
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +52 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -80
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/docs/content/toolkit-agent-ux.mdx +43 -0
- package/docs/content/toolkit-app-adapters.mdx +9 -0
- package/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/docs/content/toolkit-collaboration.mdx +74 -0
- package/docs/content/toolkit-command-navigation.mdx +106 -0
- package/docs/content/toolkit-comments-review.mdx +98 -0
- package/docs/content/toolkit-history.mdx +95 -0
- package/docs/content/toolkit-observability.mdx +41 -0
- package/docs/content/toolkit-org-team.mdx +80 -0
- package/docs/content/toolkit-resources.mdx +57 -0
- package/docs/content/toolkit-settings.mdx +65 -0
- package/docs/content/toolkit-setup-connections.mdx +109 -0
- package/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/docs/content/toolkit-sharing.mdx +81 -0
- package/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/docs/content/toolkit-ui.mdx +9 -0
- package/package.json +36 -2
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
- package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n ensureEmbedAuthFetchInterceptor,\n isEmbedAuthActive,\n} from \"./embed-auth.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\n\ninterface Query {\n queryKey: readonly unknown[];\n}\n\ninterface QueryClient {\n invalidateQueries(opts?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }): void;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\nconst SSE_FALLBACK_INTERVAL_MS = 15_000;\nconst POLL_AUTH_FAILURE_COOLDOWN_MS = 60_000;\n\nclass HttpStatusError extends Error {\n status: number;\n\n constructor(status: number) {\n super(\"HTTP \" + status);\n this.status = status;\n }\n}\n\nexport type SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\n/** Callback delivered to each transport subscriber for every batch of events. */\ntype EventSubscriber = (\n events: SyncEvent[],\n version: number | undefined,\n) => void;\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n if (isEmbedAuthActive()) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction isAuthFailure(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n ((error as { status?: unknown }).status === 401 ||\n (error as { status?: unknown }).status === 403)\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n try {\n const res = await fetch(\n `${pollUrl}?since=${since}`,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new HttpStatusError(res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared SSE + poll transport\n//\n// One SyncTransport per (pollUrl, sseUrl) pair is held in a module-level\n// registry. Both `useDbSync` and `useScreenRefreshKey` subscribe to it, so a\n// single browser tab opens exactly ONE SSE connection and ONE poll loop\n// regardless of how many hook instances are mounted.\n//\n// Lifecycle: the transport starts when the first subscriber joins and shuts\n// down when the last subscriber leaves. This makes it safe to SSR and to\n// mount/unmount hooks independently.\n// ---------------------------------------------------------------------------\n\ninterface TransportSubscription {\n onEvents: EventSubscriber;\n /**\n * Whether this subscriber wants the transport to pause when the tab is\n * hidden. The transport pauses only when ALL subscribers request it — any\n * subscriber with `pauseWhenHidden: false` keeps the connection alive.\n */\n pauseWhenHidden: boolean;\n /**\n * Requested poll interval in ms. The transport uses the minimum across all\n * subscribers so the most-frequent caller is satisfied.\n */\n interval: number;\n /** Requested fallback interval while SSE is connected. */\n fallbackInterval: number;\n /**\n * Optional: notified when the shared SSE connection opens or closes (also\n * fired once with the current state when the subscriber joins). Lets\n * subscribers with their own fallback loops (e.g. the collab doc poll)\n * relax their cadence while the push path is healthy.\n */\n onSseStateChange?: (connected: boolean) => void;\n}\n\nclass SyncTransport {\n private subscribers = new Map<symbol, TransportSubscription>();\n private versionRef = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private stopped = false;\n private inFlight = false;\n private eventSource: EventSource | null = null;\n private sseConnected = false;\n private authFailureUntil = 0;\n private consecutiveFailures = 0;\n\n constructor(\n private readonly pollUrl: string,\n private readonly sseUrl: string | false,\n ) {}\n\n // -------------------------------------------------------------------------\n // Subscriber management\n // -------------------------------------------------------------------------\n\n add(id: symbol, sub: TransportSubscription): void {\n const wasEmpty = this.subscribers.size === 0;\n this.subscribers.set(id, sub);\n if (wasEmpty) {\n this.stopped = false;\n this.start();\n }\n sub.onSseStateChange?.(this.sseConnected);\n }\n\n remove(id: symbol): void {\n this.subscribers.delete(id);\n if (this.subscribers.size === 0) {\n this.teardown();\n } else {\n // Recalculate poll interval in case the leaving subscriber was the\n // fastest caller; reschedule with the updated cadence.\n this.reschedule();\n }\n }\n\n // -------------------------------------------------------------------------\n // Derived settings (aggregate over active subscribers)\n // -------------------------------------------------------------------------\n\n private get effectivePauseWhenHidden(): boolean {\n // Pause only if every subscriber has opted in.\n for (const sub of this.subscribers.values()) {\n if (!sub.pauseWhenHidden) return false;\n }\n return true;\n }\n\n private get effectiveInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.interval < min) min = sub.interval;\n }\n return isFinite(min) ? min : 2000;\n }\n\n private get effectiveFallbackInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.fallbackInterval < min) min = sub.fallbackInterval;\n }\n return isFinite(min) ? min : SSE_FALLBACK_INTERVAL_MS;\n }\n\n // -------------------------------------------------------------------------\n // Event fan-out\n // -------------------------------------------------------------------------\n\n private fan(events: SyncEvent[], version: number | undefined): void {\n for (const sub of this.subscribers.values()) {\n sub.onEvents(events, version);\n }\n }\n\n private setSseConnected(connected: boolean): void {\n if (this.sseConnected === connected) return;\n this.sseConnected = connected;\n for (const sub of this.subscribers.values()) {\n sub.onSseStateChange?.(connected);\n }\n }\n\n // -------------------------------------------------------------------------\n // SSE + poll loop (mirrors the original per-hook logic exactly)\n // -------------------------------------------------------------------------\n\n private authFailureDelayMs(): number {\n return Math.max(0, this.authFailureUntil - Date.now());\n }\n\n private schedulePoll(): void {\n if (this.stopped) return;\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.timer) clearTimeout(this.timer);\n const authDelay = this.authFailureDelayMs();\n if (authDelay > 0) {\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, authDelay);\n return;\n }\n const base = this.sseConnected\n ? this.effectiveFallbackInterval\n : this.effectiveInterval;\n // Exponential backoff while polls keep failing (500s during a deploy,\n // DNS blips, a struggling DB). Auth failures have their own cooldown\n // above; this covers everything else so a down server isn't hammered at\n // full cadence. Resets on the first successful poll.\n const delay =\n this.consecutiveFailures > 0\n ? Math.min(base * 2 ** Math.min(this.consecutiveFailures, 5), 30_000)\n : base;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, delay);\n }\n\n private reschedule(): void {\n // Only need to act if a timer is already pending; next natural tick will\n // pick up the new effective interval otherwise.\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n this.schedulePoll();\n }\n }\n\n private closeEvents(): void {\n if (!this.eventSource) return;\n this.eventSource.close();\n this.eventSource = null;\n this.setSseConnected(false);\n }\n\n private connectEvents(): void {\n if (\n this.stopped ||\n !this.sseUrl ||\n this.eventSource ||\n typeof EventSource === \"undefined\" ||\n (this.effectivePauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(this.sseUrl);\n this.eventSource = source;\n source.onopen = () => {\n this.setSseConnected(true);\n this.schedulePoll();\n };\n source.onerror = () => {\n this.setSseConnected(false);\n // When the browser gives up permanently (HTTP error → readyState\n // CLOSED), it won't auto-reconnect. Drop the ref so a later\n // connectEvents() (on focus/visibility) can establish a fresh stream;\n // otherwise the non-null closed `eventSource` blocks reconnection and\n // we'd be stuck on polling-only forever.\n if (source.readyState === EventSource.CLOSED) {\n this.eventSource = null;\n }\n this.schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n this.applyVersion(events, version);\n this.fan(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n }\n\n /**\n * Advance the transport's shared version cursor. Subscribers receive the\n * raw events and decide independently which ones are \"fresh\" relative to\n * their own cursor, but the transport-level cursor ensures the poll\n * `?since=` parameter always advances.\n */\n private applyVersion(events: SyncEvent[], version: number | undefined): void {\n let max = typeof version === \"number\" ? version : 0;\n for (const evt of events) {\n const v = typeof evt.version === \"number\" ? evt.version : 0;\n if (v > max) max = v;\n }\n if (max > this.versionRef) this.versionRef = max;\n }\n\n private async poll(): Promise<void> {\n if (this.stopped || this.inFlight) return;\n this.inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n this.pollUrl,\n this.versionRef,\n this.effectiveInterval,\n );\n if (this.stopped) return;\n this.consecutiveFailures = 0;\n const events = data.events ?? [];\n this.applyVersion(events, data.version);\n this.fan(events, data.version);\n } catch (err) {\n if (this.stopped) return;\n this.consecutiveFailures++;\n if (isAuthFailure(err)) {\n this.authFailureUntil = Date.now() + POLL_AUTH_FAILURE_COOLDOWN_MS;\n this.closeEvents();\n }\n // Network error — retried on the next (backed-off) interval.\n } finally {\n this.inFlight = false;\n this.schedulePoll();\n }\n }\n\n private pollNow(): void {\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.authFailureDelayMs() > 0) {\n this.schedulePoll();\n return;\n }\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.connectEvents();\n void this.poll();\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"visible\") {\n this.connectEvents();\n this.pollNow();\n } else if (this.effectivePauseWhenHidden) {\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n };\n\n private handleFocus = (): void => {\n this.pollNow();\n };\n\n private start(): void {\n // Universal demo-mode redaction for the UI. Idempotent + browser-only +\n // a no-op until demo mode is on. Lives here because every template root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureEmbedAuthFetchInterceptor();\n ensureDemoModeFetchInterceptor();\n\n if (!this.effectivePauseWhenHidden || !isDocumentHidden()) {\n this.connectEvents();\n void this.poll();\n }\n window.addEventListener(\"focus\", this.handleFocus);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n }\n\n private teardown(): void {\n this.stopped = true;\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n window.removeEventListener(\"focus\", this.handleFocus);\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n }\n}\n\n/**\n * Registry of active transports keyed by \"<pollUrl>\\0<sseUrl>\".\n * Module-level singleton: survives React render cycles, shared across all\n * hook instances in the same browser tab.\n */\nconst transportRegistry = new Map<string, SyncTransport>();\n\nfunction getOrCreateTransport(\n pollUrl: string,\n sseUrl: string | false,\n): SyncTransport {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n let transport = transportRegistry.get(key);\n if (!transport) {\n transport = new SyncTransport(pollUrl, sseUrl);\n transportRegistry.set(key, transport);\n }\n return transport;\n}\n\n/** Remove a transport from the registry once torn down (last subscriber left). */\nfunction releaseTransport(pollUrl: string, sseUrl: string | false): void {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n // Leave the entry in place: SSE/poll is already stopped inside the class;\n // the next subscriber will re-start it via `add()`. Clearing the map entry\n // prevents any dangling reference from the old SyncTransport instance.\n transportRegistry.delete(key);\n}\n\n// ---------------------------------------------------------------------------\n// Internal test helper — reset transport registry between tests.\n// ---------------------------------------------------------------------------\n/** @internal */\nexport function _resetSyncTransportRegistryForTests(): void {\n transportRegistry.clear();\n}\n\nexport interface SubscribeSyncEventsOptions {\n /** Receives every batch of change events (SSE push or poll). */\n onEvents: (events: SyncEvent[], version: number | undefined) => void;\n /** Notified when the shared SSE connection opens/closes (and once on join). */\n onSseStateChange?: (connected: boolean) => void;\n pollUrl?: string;\n sseUrl?: string | false;\n pauseWhenHidden?: boolean;\n /**\n * Poll cadence this subscriber requests from the SHARED poll loop. The\n * transport uses the minimum across subscribers, so the defaults here are\n * deliberately high: subscribing must not speed up the shared poll —\n * useDbSync (mounted by every template root) already sets the pace.\n */\n interval?: number;\n fallbackInterval?: number;\n}\n\n/**\n * Subscribe to the shared SSE + poll transport without the React Query\n * invalidation behavior of `useDbSync`. Use this instead of opening another\n * `EventSource` to `/_agent-native/events` — a browser tab should hold ONE\n * SSE connection no matter how many features listen to it (extra streams eat\n * the per-origin connection budget and starve data fetches, especially on\n * HTTP/1.1 dev servers).\n *\n * Returns an unsubscribe function. Safe to call only in browser contexts.\n */\nexport function subscribeSyncEvents(\n options: SubscribeSyncEventsOptions,\n): () => void {\n const pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\");\n const sseUrl = resolveSseUrl(options.sseUrl);\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n const id = Symbol(\"subscribeSyncEvents\");\n transport.add(id, {\n onEvents: options.onEvents,\n onSseStateChange: options.onSseStateChange,\n pauseWhenHidden: options.pauseWhenHidden ?? true,\n interval: options.interval ?? 60_000,\n fallbackInterval: options.fallbackInterval ?? 60_000,\n });\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook uses\n * framework-owned fixed prefixes plus per-source change counters instead of\n * caller-supplied key lists. Kept in the type signature for backward\n * compatibility — existing call sites that still pass this option keep\n * working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 15000\n * @param options.pauseWhenHidden - Pause polling while the tab is hidden.\n * Default: true\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n * @param options.actionInvalidatePredicate - Optional filter for the broad\n * compatibility invalidate triggered by `action` events. Use this to keep\n * expensive active queries on explicit-refresh semantics while still letting\n * normal source-versioned queries react through `useChangeVersion`.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n actionInvalidatePredicate?: (query: Query) => boolean;\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n const actionInvalidatePredicateRef = useRef(\n options.actionInvalidatePredicate,\n );\n actionInvalidatePredicateRef.current = options.actionInvalidatePredicate;\n\n useEffect(() => {\n const id = Symbol(\"useDbSync\");\n // Per-subscriber version cursor: tracks which events have already been\n // processed by THIS subscriber so stale poll re-deliveries are ignored.\n let subscriberVersion = 0;\n\n function hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const relevant = ignore\n ? events.filter((e) => e.requestSource !== ignore)\n : events;\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) bumpChangeVersion(src, ver);\n }\n\n // Awareness (cursor/presence) events never change action/extension/\n // app-state query results, but they arrive on every peer keystroke and\n // carry no version (so the freshness filter always passes them). Keep\n // them out of the invalidate block or an idle collaborative doc turns\n // every peer's cursor move into a framework-wide refetch storm; they\n // still reach onEvent below for callers that render presence.\n const invalidating = relevant.filter((e) => e.source !== \"awareness\");\n\n if (invalidating.length > 0 && queryClient) {\n const hasActionEvent = invalidating.some(\n (evt) => evt.source === \"action\",\n );\n if (hasActionEvent) {\n // Custom apps frequently start with raw `useQuery` calls before\n // graduating to `useActionQuery` or source-versioned query keys.\n // A successful mutating action is the core \"agent changed app data\"\n // signal, so refresh active queries broadly as a compatibility\n // safety net. Other event sources stay targeted to avoid request\n // storms from noisy domain-specific writes.\n const predicate = actionInvalidatePredicateRef.current;\n queryClient.invalidateQueries(predicate ? { predicate } : undefined);\n }\n\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n queryClient.invalidateQueries({ queryKey: [\"action\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\"] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension-slots\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-available\"] });\n queryClient.invalidateQueries({ queryKey: [\"tool\"] });\n queryClient.invalidateQueries({ queryKey: [\"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"app-state\"] });\n if (hasAppStateEvent(invalidating, \"navigate\")) {\n queryClient.invalidateQueries({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(invalidating, \"show-questions\")) {\n queryClient.invalidateQueries({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(invalidating, \"__set_url__\")) {\n queryClient.invalidateQueries({ queryKey: [\"__set_url__\"] });\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n\n if (freshEvents.length > 0) {\n invalidateForEvents(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n // If the registry still holds this transport, and the transport is now\n // empty, evict it so the next mount gets a fresh instance rather than a\n // stopped-but-still-registered one (the registry entry being cleared by\n // releaseTransport is the signal to rebuild state).\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n const id = Symbol(\"useScreenRefreshKey\");\n // Per-subscriber version cursor (same freshness logic as useDbSync).\n let subscriberVersion = 0;\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [pollUrl, sseUrl, interval, fallbackInterval, pauseWhenHidden]);\n\n return key;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n ensureEmbedAuthFetchInterceptor,\n isEmbedAuthActive,\n} from \"./embed-auth.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\n\ninterface Query {\n queryKey: readonly unknown[];\n}\n\ninterface QueryClient {\n invalidateQueries(opts?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }): void;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\nconst SSE_FALLBACK_INTERVAL_MS = 15_000;\nconst POLL_AUTH_FAILURE_COOLDOWN_MS = 60_000;\n\nclass HttpStatusError extends Error {\n status: number;\n\n constructor(status: number) {\n super(\"HTTP \" + status);\n this.status = status;\n }\n}\n\nexport type SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\n/** Callback delivered to each transport subscriber for every batch of events. */\ntype EventSubscriber = (\n events: SyncEvent[],\n version: number | undefined,\n) => void;\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n if (isEmbedAuthActive()) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction isAuthFailure(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n ((error as { status?: unknown }).status === 401 ||\n (error as { status?: unknown }).status === 403)\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n try {\n const res = await fetch(\n `${pollUrl}?since=${since}`,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new HttpStatusError(res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared SSE + poll transport\n//\n// One SyncTransport per (pollUrl, sseUrl) pair is held in a module-level\n// registry. Both `useDbSync` and `useScreenRefreshKey` subscribe to it, so a\n// single browser tab opens exactly ONE SSE connection and ONE poll loop\n// regardless of how many hook instances are mounted.\n//\n// Lifecycle: the transport starts when the first subscriber joins and shuts\n// down when the last subscriber leaves. This makes it safe to SSR and to\n// mount/unmount hooks independently.\n// ---------------------------------------------------------------------------\n\ninterface TransportSubscription {\n onEvents: EventSubscriber;\n /**\n * Whether this subscriber wants the transport to pause when the tab is\n * hidden. The transport pauses only when ALL subscribers request it — any\n * subscriber with `pauseWhenHidden: false` keeps the connection alive.\n */\n pauseWhenHidden: boolean;\n /**\n * Requested poll interval in ms. The transport uses the minimum across all\n * subscribers so the most-frequent caller is satisfied.\n */\n interval: number;\n /** Requested fallback interval while SSE is connected. */\n fallbackInterval: number;\n /**\n * Optional: notified when the shared SSE connection opens or closes (also\n * fired once with the current state when the subscriber joins). Lets\n * subscribers with their own fallback loops (e.g. the collab doc poll)\n * relax their cadence while the push path is healthy.\n */\n onSseStateChange?: (connected: boolean) => void;\n}\n\nclass SyncTransport {\n private subscribers = new Map<symbol, TransportSubscription>();\n private versionRef = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private stopped = false;\n private inFlight = false;\n private eventSource: EventSource | null = null;\n private sseConnected = false;\n private authFailureUntil = 0;\n private consecutiveFailures = 0;\n\n constructor(\n private readonly pollUrl: string,\n private readonly sseUrl: string | false,\n ) {}\n\n // -------------------------------------------------------------------------\n // Subscriber management\n // -------------------------------------------------------------------------\n\n add(id: symbol, sub: TransportSubscription): void {\n const wasEmpty = this.subscribers.size === 0;\n this.subscribers.set(id, sub);\n if (wasEmpty) {\n this.stopped = false;\n this.start();\n }\n sub.onSseStateChange?.(this.sseConnected);\n }\n\n remove(id: symbol): void {\n this.subscribers.delete(id);\n if (this.subscribers.size === 0) {\n this.teardown();\n } else {\n // Recalculate poll interval in case the leaving subscriber was the\n // fastest caller; reschedule with the updated cadence.\n this.reschedule();\n }\n }\n\n // -------------------------------------------------------------------------\n // Derived settings (aggregate over active subscribers)\n // -------------------------------------------------------------------------\n\n private get effectivePauseWhenHidden(): boolean {\n // Pause only if every subscriber has opted in.\n for (const sub of this.subscribers.values()) {\n if (!sub.pauseWhenHidden) return false;\n }\n return true;\n }\n\n private get effectiveInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.interval < min) min = sub.interval;\n }\n return isFinite(min) ? min : 2000;\n }\n\n private get effectiveFallbackInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.fallbackInterval < min) min = sub.fallbackInterval;\n }\n return isFinite(min) ? min : SSE_FALLBACK_INTERVAL_MS;\n }\n\n // -------------------------------------------------------------------------\n // Event fan-out\n // -------------------------------------------------------------------------\n\n private fan(events: SyncEvent[], version: number | undefined): void {\n for (const sub of this.subscribers.values()) {\n sub.onEvents(events, version);\n }\n }\n\n private setSseConnected(connected: boolean): void {\n if (this.sseConnected === connected) return;\n this.sseConnected = connected;\n for (const sub of this.subscribers.values()) {\n sub.onSseStateChange?.(connected);\n }\n }\n\n // -------------------------------------------------------------------------\n // SSE + poll loop (mirrors the original per-hook logic exactly)\n // -------------------------------------------------------------------------\n\n private authFailureDelayMs(): number {\n return Math.max(0, this.authFailureUntil - Date.now());\n }\n\n private schedulePoll(): void {\n if (this.stopped) return;\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.timer) clearTimeout(this.timer);\n const authDelay = this.authFailureDelayMs();\n if (authDelay > 0) {\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, authDelay);\n return;\n }\n const base = this.sseConnected\n ? this.effectiveFallbackInterval\n : this.effectiveInterval;\n // Exponential backoff while polls keep failing (500s during a deploy,\n // DNS blips, a struggling DB). Auth failures have their own cooldown\n // above; this covers everything else so a down server isn't hammered at\n // full cadence. Resets on the first successful poll.\n const delay =\n this.consecutiveFailures > 0\n ? Math.min(base * 2 ** Math.min(this.consecutiveFailures, 5), 30_000)\n : base;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, delay);\n }\n\n private reschedule(): void {\n // Only need to act if a timer is already pending; next natural tick will\n // pick up the new effective interval otherwise.\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n this.schedulePoll();\n }\n }\n\n private closeEvents(): void {\n if (!this.eventSource) return;\n this.eventSource.close();\n this.eventSource = null;\n this.setSseConnected(false);\n }\n\n private connectEvents(): void {\n if (\n this.stopped ||\n !this.sseUrl ||\n this.eventSource ||\n typeof EventSource === \"undefined\" ||\n (this.effectivePauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(this.sseUrl);\n this.eventSource = source;\n source.onopen = () => {\n this.setSseConnected(true);\n this.schedulePoll();\n };\n source.onerror = () => {\n this.setSseConnected(false);\n // When the browser gives up permanently (HTTP error → readyState\n // CLOSED), it won't auto-reconnect. Drop the ref so a later\n // connectEvents() (on focus/visibility) can establish a fresh stream;\n // otherwise the non-null closed `eventSource` blocks reconnection and\n // we'd be stuck on polling-only forever.\n if (source.readyState === EventSource.CLOSED) {\n this.eventSource = null;\n }\n this.schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n this.applyVersion(events, version);\n this.fan(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n }\n\n /**\n * Advance the transport's shared version cursor. Subscribers receive the\n * raw events and decide independently which ones are \"fresh\" relative to\n * their own cursor, but the transport-level cursor ensures the poll\n * `?since=` parameter always advances.\n */\n private applyVersion(events: SyncEvent[], version: number | undefined): void {\n let max = typeof version === \"number\" ? version : 0;\n for (const evt of events) {\n const v = typeof evt.version === \"number\" ? evt.version : 0;\n if (v > max) max = v;\n }\n if (max > this.versionRef) this.versionRef = max;\n }\n\n private async poll(): Promise<void> {\n if (this.stopped || this.inFlight) return;\n this.inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n this.pollUrl,\n this.versionRef,\n this.effectiveInterval,\n );\n if (this.stopped) return;\n this.consecutiveFailures = 0;\n const events = data.events ?? [];\n this.applyVersion(events, data.version);\n this.fan(events, data.version);\n } catch (err) {\n if (this.stopped) return;\n this.consecutiveFailures++;\n if (isAuthFailure(err)) {\n this.authFailureUntil = Date.now() + POLL_AUTH_FAILURE_COOLDOWN_MS;\n this.closeEvents();\n }\n // Network error — retried on the next (backed-off) interval.\n } finally {\n this.inFlight = false;\n this.schedulePoll();\n }\n }\n\n private pollNow(): void {\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.authFailureDelayMs() > 0) {\n this.schedulePoll();\n return;\n }\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.connectEvents();\n void this.poll();\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"visible\") {\n this.connectEvents();\n this.pollNow();\n } else if (this.effectivePauseWhenHidden) {\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n };\n\n private handleFocus = (): void => {\n this.pollNow();\n };\n\n private start(): void {\n // Universal demo-mode redaction for the UI. Idempotent + browser-only +\n // a no-op until demo mode is on. Lives here because every template root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureEmbedAuthFetchInterceptor();\n ensureDemoModeFetchInterceptor();\n\n if (!this.effectivePauseWhenHidden || !isDocumentHidden()) {\n this.connectEvents();\n void this.poll();\n }\n window.addEventListener(\"focus\", this.handleFocus);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n }\n\n private teardown(): void {\n this.stopped = true;\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n window.removeEventListener(\"focus\", this.handleFocus);\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n }\n}\n\n/**\n * Registry of active transports keyed by \"<pollUrl>\\0<sseUrl>\".\n * Module-level singleton: survives React render cycles, shared across all\n * hook instances in the same browser tab.\n */\nconst transportRegistry = new Map<string, SyncTransport>();\n\nfunction getOrCreateTransport(\n pollUrl: string,\n sseUrl: string | false,\n): SyncTransport {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n let transport = transportRegistry.get(key);\n if (!transport) {\n transport = new SyncTransport(pollUrl, sseUrl);\n transportRegistry.set(key, transport);\n }\n return transport;\n}\n\n/** Remove a transport from the registry once torn down (last subscriber left). */\nfunction releaseTransport(pollUrl: string, sseUrl: string | false): void {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n // Leave the entry in place: SSE/poll is already stopped inside the class;\n // the next subscriber will re-start it via `add()`. Clearing the map entry\n // prevents any dangling reference from the old SyncTransport instance.\n transportRegistry.delete(key);\n}\n\n// ---------------------------------------------------------------------------\n// Internal test helper — reset transport registry between tests.\n// ---------------------------------------------------------------------------\n/** @internal */\nexport function _resetSyncTransportRegistryForTests(): void {\n transportRegistry.clear();\n}\n\nexport interface SubscribeSyncEventsOptions {\n /** Receives every batch of change events (SSE push or poll). */\n onEvents: (events: SyncEvent[], version: number | undefined) => void;\n /** Notified when the shared SSE connection opens/closes (and once on join). */\n onSseStateChange?: (connected: boolean) => void;\n pollUrl?: string;\n sseUrl?: string | false;\n pauseWhenHidden?: boolean;\n /**\n * Poll cadence this subscriber requests from the SHARED poll loop. The\n * transport uses the minimum across subscribers, so the defaults here are\n * deliberately high: subscribing must not speed up the shared poll —\n * useDbSync (mounted by every template root) already sets the pace.\n */\n interval?: number;\n fallbackInterval?: number;\n}\n\n/**\n * Subscribe to the shared SSE + poll transport without the React Query\n * invalidation behavior of `useDbSync`. Use this instead of opening another\n * `EventSource` to `/_agent-native/events` — a browser tab should hold ONE\n * SSE connection no matter how many features listen to it (extra streams eat\n * the per-origin connection budget and starve data fetches, especially on\n * HTTP/1.1 dev servers).\n *\n * Returns an unsubscribe function. Safe to call only in browser contexts.\n */\nexport function subscribeSyncEvents(\n options: SubscribeSyncEventsOptions,\n): () => void {\n const pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\");\n const sseUrl = resolveSseUrl(options.sseUrl);\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n const id = Symbol(\"subscribeSyncEvents\");\n transport.add(id, {\n onEvents: options.onEvents,\n onSseStateChange: options.onSseStateChange,\n pauseWhenHidden: options.pauseWhenHidden ?? true,\n interval: options.interval ?? 60_000,\n fallbackInterval: options.fallbackInterval ?? 60_000,\n });\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook uses\n * framework-owned fixed prefixes plus per-source change counters instead of\n * caller-supplied key lists. Kept in the type signature for backward\n * compatibility — existing call sites that still pass this option keep\n * working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 15000\n * @param options.pauseWhenHidden - Pause polling while the tab is hidden.\n * Default: true\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n * @param options.actionInvalidatePredicate - Optional filter for the broad\n * compatibility invalidate triggered by `action` events. Use this to keep\n * expensive active queries on explicit-refresh semantics while still letting\n * normal source-versioned queries react through `useChangeVersion`.\n * @param options.suppressActionInvalidationFor - Action names whose sync events\n * should not invalidate all action queries. Use only for high-volume\n * background actions that perform their own narrow client invalidation.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n actionInvalidatePredicate?: (query: Query) => boolean;\n suppressActionInvalidationFor?: string[];\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n const actionInvalidatePredicateRef = useRef(\n options.actionInvalidatePredicate,\n );\n actionInvalidatePredicateRef.current = options.actionInvalidatePredicate;\n const suppressActionInvalidationForRef = useRef(\n options.suppressActionInvalidationFor,\n );\n suppressActionInvalidationForRef.current =\n options.suppressActionInvalidationFor;\n\n useEffect(() => {\n const id = Symbol(\"useDbSync\");\n // Per-subscriber version cursor: tracks which events have already been\n // processed by THIS subscriber so stale poll re-deliveries are ignored.\n let subscriberVersion = 0;\n\n function hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const relevant = ignore\n ? events.filter((e) => e.requestSource !== ignore)\n : events;\n const suppressedActions = new Set(\n suppressActionInvalidationForRef.current ?? [],\n );\n const isSuppressedActionEvent = (evt: SyncEvent) =>\n evt.source === \"action\" &&\n typeof evt.key === \"string\" &&\n suppressedActions.has(evt.key);\n const nonAwareness = relevant.filter((e) => e.source !== \"awareness\");\n const suppressesWholeBatch =\n nonAwareness.length > 0 &&\n nonAwareness.every((evt) => evt.source === \"action\") &&\n nonAwareness.every(isSuppressedActionEvent);\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) bumpChangeVersion(src, ver);\n }\n\n // Awareness (cursor/presence) events never change action/extension/\n // app-state query results, but they arrive on every peer keystroke and\n // carry no version (so the freshness filter always passes them). Keep\n // them out of the invalidate block or an idle collaborative doc turns\n // every peer's cursor move into a framework-wide refetch storm; they\n // still reach onEvent below for callers that render presence.\n const invalidating = relevant.filter((e) => e.source !== \"awareness\");\n\n if (invalidating.length > 0 && queryClient) {\n const hasActionEvent = invalidating.some(\n (evt) => evt.source === \"action\" && !isSuppressedActionEvent(evt),\n );\n if (hasActionEvent) {\n // Custom apps frequently start with raw `useQuery` calls before\n // graduating to `useActionQuery` or source-versioned query keys.\n // A successful mutating action is the core \"agent changed app data\"\n // signal, so refresh active queries broadly as a compatibility\n // safety net. Other event sources stay targeted to avoid request\n // storms from noisy domain-specific writes.\n const predicate = actionInvalidatePredicateRef.current;\n queryClient.invalidateQueries(predicate ? { predicate } : undefined);\n }\n\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n // Suppressed-action-only batches skip this whole list (their\n // mutations perform their own narrow invalidation) — but events must\n // STILL reach the onEvent forwarding below, so guard, don't return.\n if (!suppressesWholeBatch) {\n queryClient.invalidateQueries({ queryKey: [\"action\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\"] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension-slots\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-available\"] });\n queryClient.invalidateQueries({ queryKey: [\"tool\"] });\n queryClient.invalidateQueries({ queryKey: [\"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"app-state\"] });\n if (hasAppStateEvent(invalidating, \"navigate\")) {\n queryClient.invalidateQueries({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(invalidating, \"show-questions\")) {\n queryClient.invalidateQueries({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(invalidating, \"__set_url__\")) {\n queryClient.invalidateQueries({ queryKey: [\"__set_url__\"] });\n }\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n\n if (freshEvents.length > 0) {\n invalidateForEvents(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n // If the registry still holds this transport, and the transport is now\n // empty, evict it so the next mount gets a fresh instance rather than a\n // stopped-but-still-registered one (the registry entry being cleared by\n // releaseTransport is the signal to rebuild state).\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n const id = Symbol(\"useScreenRefreshKey\");\n // Per-subscriber version cursor (same freshness logic as useDbSync).\n let subscriberVersion = 0;\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(pollUrl, sseUrl);\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [pollUrl, sseUrl, interval, fallbackInterval, pauseWhenHidden]);\n\n return key;\n}\n"]}
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
|
|
|
26
26
|
* Body: { update: string (base64), requestSource?: string }
|
|
27
27
|
*/
|
|
28
28
|
export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
29
|
-
ok?: undefined;
|
|
30
29
|
error: string;
|
|
30
|
+
ok?: undefined;
|
|
31
31
|
} | {
|
|
32
32
|
error?: undefined;
|
|
33
33
|
ok: boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const navigateSchema: z.ZodObject<{
|
|
3
|
+
view: z.ZodOptional<z.ZodString>;
|
|
4
|
+
path: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, z.core.$loose>;
|
|
6
|
+
export interface CreateNavigateActionOptions {
|
|
7
|
+
description?: string;
|
|
8
|
+
stateKey?: string;
|
|
9
|
+
normalize?: (args: z.infer<typeof navigateSchema>) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
10
|
+
describeResult?: (navigation: Record<string, unknown>, args: z.infer<typeof navigateSchema>) => string;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateViewScreenActionOptions {
|
|
13
|
+
description?: string;
|
|
14
|
+
navigationStateKey?: string;
|
|
15
|
+
extraStateKeys?: string[];
|
|
16
|
+
describeResult?: (screen: Record<string, unknown>) => Record<string, unknown> | string | Promise<Record<string, unknown> | string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function createNavigateAction(options?: CreateNavigateActionOptions): import("../action.js").ActionDefinition<{
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
view?: string | undefined;
|
|
21
|
+
path?: string | undefined;
|
|
22
|
+
}, string>;
|
|
23
|
+
export declare function createViewScreenAction(options?: CreateViewScreenActionOptions): import("../action.js").ActionDefinition<Record<string, never>, string | Record<string, unknown>>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/command-navigation/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,cAAc;;;iBAKJ,CAAC;AAEjB,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,KACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,cAAc,CAAC,EAAE,CACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,KACjC,MAAM,CAAC;CACb;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAE7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;CAC/C;AAMD,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC;;;;WA2B1C;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,6BAAkC,oGA4B5C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineAction } from "../action.js";
|
|
3
|
+
import { readAppState, writeAppState } from "../application-state/index.js";
|
|
4
|
+
const navigateSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
view: z.string().optional().describe("View name to navigate to"),
|
|
7
|
+
path: z.string().optional().describe("URL path to navigate to"),
|
|
8
|
+
})
|
|
9
|
+
.passthrough();
|
|
10
|
+
function writeId() {
|
|
11
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
12
|
+
}
|
|
13
|
+
export function createNavigateAction(options = {}) {
|
|
14
|
+
const stateKey = options.stateKey ?? "navigate";
|
|
15
|
+
return defineAction({
|
|
16
|
+
description: options.description ??
|
|
17
|
+
"Navigate the UI to a specific view or path. Writes a navigate command to application state which the UI reads and auto-deletes.",
|
|
18
|
+
schema: navigateSchema,
|
|
19
|
+
http: false,
|
|
20
|
+
run: async (args) => {
|
|
21
|
+
if (!args.view && !args.path) {
|
|
22
|
+
throw new Error("At least --view or --path is required.");
|
|
23
|
+
}
|
|
24
|
+
const navigation = options.normalize
|
|
25
|
+
? await options.normalize(args)
|
|
26
|
+
: {
|
|
27
|
+
...(args.view ? { view: args.view } : null),
|
|
28
|
+
...(args.path ? { path: args.path } : null),
|
|
29
|
+
};
|
|
30
|
+
navigation._writeId = writeId();
|
|
31
|
+
await writeAppState(stateKey, navigation);
|
|
32
|
+
return (options.describeResult?.(navigation, args) ??
|
|
33
|
+
`Navigating to ${String(args.view || args.path)}`);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function createViewScreenAction(options = {}) {
|
|
38
|
+
const navigationStateKey = options.navigationStateKey ?? "navigation";
|
|
39
|
+
return defineAction({
|
|
40
|
+
description: options.description ??
|
|
41
|
+
"See what the user is currently looking at on screen. Returns the current navigation state.",
|
|
42
|
+
schema: z.object({}),
|
|
43
|
+
http: false,
|
|
44
|
+
readOnly: true,
|
|
45
|
+
run: async () => {
|
|
46
|
+
const screen = {};
|
|
47
|
+
const navigation = await readAppState(navigationStateKey);
|
|
48
|
+
if (navigation)
|
|
49
|
+
screen.navigation = navigation;
|
|
50
|
+
for (const key of options.extraStateKeys ?? []) {
|
|
51
|
+
const value = await readAppState(key);
|
|
52
|
+
if (value !== null && value !== undefined)
|
|
53
|
+
screen[key] = value;
|
|
54
|
+
}
|
|
55
|
+
if (Object.keys(screen).length === 0) {
|
|
56
|
+
return "No application state found. Is the app running?";
|
|
57
|
+
}
|
|
58
|
+
return options.describeResult
|
|
59
|
+
? await options.describeResult(screen)
|
|
60
|
+
: screen;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/command-navigation/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../action.js\";\nimport { readAppState, writeAppState } from \"../application-state/index.js\";\n\nconst navigateSchema = z\n .object({\n view: z.string().optional().describe(\"View name to navigate to\"),\n path: z.string().optional().describe(\"URL path to navigate to\"),\n })\n .passthrough();\n\nexport interface CreateNavigateActionOptions {\n description?: string;\n stateKey?: string;\n normalize?: (\n args: z.infer<typeof navigateSchema>,\n ) => Record<string, unknown> | Promise<Record<string, unknown>>;\n describeResult?: (\n navigation: Record<string, unknown>,\n args: z.infer<typeof navigateSchema>,\n ) => string;\n}\n\nexport interface CreateViewScreenActionOptions {\n description?: string;\n navigationStateKey?: string;\n extraStateKeys?: string[];\n describeResult?: (\n screen: Record<string, unknown>,\n ) =>\n | Record<string, unknown>\n | string\n | Promise<Record<string, unknown> | string>;\n}\n\nfunction writeId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function createNavigateAction(\n options: CreateNavigateActionOptions = {},\n) {\n const stateKey = options.stateKey ?? \"navigate\";\n return defineAction({\n description:\n options.description ??\n \"Navigate the UI to a specific view or path. Writes a navigate command to application state which the UI reads and auto-deletes.\",\n schema: navigateSchema,\n http: false,\n run: async (args) => {\n if (!args.view && !args.path) {\n throw new Error(\"At least --view or --path is required.\");\n }\n const navigation = options.normalize\n ? await options.normalize(args)\n : ({\n ...(args.view ? { view: args.view } : null),\n ...(args.path ? { path: args.path } : null),\n } as Record<string, unknown>);\n navigation._writeId = writeId();\n await writeAppState(stateKey, navigation);\n return (\n options.describeResult?.(navigation, args) ??\n `Navigating to ${String(args.view || args.path)}`\n );\n },\n });\n}\n\nexport function createViewScreenAction(\n options: CreateViewScreenActionOptions = {},\n) {\n const navigationStateKey = options.navigationStateKey ?? \"navigation\";\n return defineAction({\n description:\n options.description ??\n \"See what the user is currently looking at on screen. Returns the current navigation state.\",\n schema: z.object({}),\n http: false,\n readOnly: true,\n run: async () => {\n const screen: Record<string, unknown> = {};\n const navigation = await readAppState(navigationStateKey);\n if (navigation) screen.navigation = navigation;\n\n for (const key of options.extraStateKeys ?? []) {\n const value = await readAppState(key);\n if (value !== null && value !== undefined) screen[key] = value;\n }\n\n if (Object.keys(screen).length === 0) {\n return \"No application state found. Is the app running?\";\n }\n return options.describeResult\n ? await options.describeResult(screen)\n : screen;\n },\n });\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from "../navigation/index.js";
|
|
2
|
+
export * from "./actions.js";
|
|
3
|
+
export { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, DESKTOP_OPEN_URL, OPEN_ROUTE_SUBPATH, VSCODE_OPEN_URL, type DeepLinkInput, } from "../server/deep-link.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command-navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from "../navigation/index.js";
|
|
2
|
+
export * from "./actions.js";
|
|
3
|
+
export { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, DESKTOP_OPEN_URL, OPEN_ROUTE_SUBPATH, VSCODE_OPEN_URL, } from "../server/deep-link.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command-navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAEhB,MAAM,wBAAwB,CAAC","sourcesContent":["export * from \"../navigation/index.js\";\nexport * from \"./actions.js\";\nexport {\n buildDeepLink,\n toAbsoluteOpenUrl,\n toDesktopOpenUrl,\n toVsCodeOpenUrl,\n DESKTOP_OPEN_URL,\n OPEN_ROUTE_SUBPATH,\n VSCODE_OPEN_URL,\n type DeepLinkInput,\n} from \"../server/deep-link.js\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/comments-review/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/comments-review/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"../review/index.js\";\n"]}
|
|
@@ -70,5 +70,30 @@ export declare function buildResilientPostgresJsClient<T extends {
|
|
|
70
70
|
* runtime we deploy to, so we prefer it whenever the URL points at Neon.
|
|
71
71
|
*/
|
|
72
72
|
export declare function isNeonUrl(url: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)
|
|
75
|
+
* works. The native better-sqlite3 Transaction wrapper is sync-only — passing
|
|
76
|
+
* an async callback throws "Transaction function cannot return a promise".
|
|
77
|
+
*
|
|
78
|
+
* This wrapper bypasses the native path by issuing raw SQL control statements
|
|
79
|
+
* on the single better-sqlite3 connection, which is safe because:
|
|
80
|
+
* - better-sqlite3 is single-connection (no concurrency inside one process)
|
|
81
|
+
* - the framework serialises all async work through one Database instance
|
|
82
|
+
*
|
|
83
|
+
* Nesting: if a transaction is already open (sqlite.inTransaction === true),
|
|
84
|
+
* SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /
|
|
85
|
+
* ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().
|
|
86
|
+
*
|
|
87
|
+
* The patched transaction also patches the tx object it passes to the callback
|
|
88
|
+
* so that nested async calls (tx.transaction(async …)) work recursively.
|
|
89
|
+
*/
|
|
90
|
+
/** @internal exported for the async-tx concurrency spec */
|
|
91
|
+
export declare function patchBetterSqliteTransactions<DB extends {
|
|
92
|
+
transaction: (...args: any[]) => any;
|
|
93
|
+
session: any;
|
|
94
|
+
}>(db: DB, sqlite: {
|
|
95
|
+
inTransaction: boolean;
|
|
96
|
+
exec: (sql: string) => void;
|
|
97
|
+
}): DB;
|
|
73
98
|
export declare function createGetDb<T extends Record<string, unknown>>(schema: T): () => LibSQLDatabase<T>;
|
|
74
99
|
//# sourceMappingURL=create-get-db.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkDzD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE,GAAG,OAAO,IAAI,CAyFd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,CAAC,SAAS;IACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CAC3D,EACD,MAAM,EAAE,CAAC,GAAG,CAAC,CAyDd;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C;AA0BD;;;;;;;;;;;;;;;;GAgBG;AACH,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAC3C,EAAE,SAAS;IAAE,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,EACjE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,EAAE,CAsG7E;AAKD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SA6HpD,cAAc,CAAC,CAAC,CAAC,CASpC"}
|
package/dist/db/create-get-db.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { drizzle as drizzleD1 } from "drizzle-orm/d1";
|
|
2
3
|
import { getDialect, getDatabaseUrl, getDatabaseAuthToken, isLocalSqliteUrl, isPgliteUrl, isConnectionError, getPgliteClient, loadPgliteDrizzle, prepareLocalSqliteUrl, sqliteFilenameFromUrl, pgPoolOptions, neonPoolMax, attachNeonPoolErrorLogger, withDbTimeout, retryOnConnectionError, dbOpTimeoutMs, } from "./client.js";
|
|
3
4
|
// Lazy driver loaders — cached promises so dynamic import only runs once.
|
|
@@ -250,10 +251,21 @@ function getBetterSqliteDrizzle() {
|
|
|
250
251
|
* The patched transaction also patches the tx object it passes to the callback
|
|
251
252
|
* so that nested async calls (tx.transaction(async …)) work recursively.
|
|
252
253
|
*/
|
|
253
|
-
|
|
254
|
+
/** @internal exported for the async-tx concurrency spec */
|
|
255
|
+
export function patchBetterSqliteTransactions(db, sqlite) {
|
|
254
256
|
let savepointSeq = 0;
|
|
257
|
+
// Concurrent TOP-LEVEL async transactions on the single better-sqlite3
|
|
258
|
+
// connection must not interleave: a second transaction starting while the
|
|
259
|
+
// first is open would see `inTransaction` and open a savepoint INSIDE the
|
|
260
|
+
// first transaction, which then commits out from under it ("no such
|
|
261
|
+
// savepoint"). Serialize top-level transactions through a promise chain;
|
|
262
|
+
// genuine same-task nesting (tx.transaction or db.transaction inside an
|
|
263
|
+
// open callback) is detected via AsyncLocalStorage and keeps the direct
|
|
264
|
+
// savepoint path so it cannot deadlock on the queue.
|
|
265
|
+
const txContext = new AsyncLocalStorage();
|
|
266
|
+
let txChain = Promise.resolve();
|
|
255
267
|
function makeAsyncTransaction(originalTransaction) {
|
|
256
|
-
|
|
268
|
+
async function runTransactionBody(cb) {
|
|
257
269
|
// Extract the drizzle tx proxy synchronously — call the original with a
|
|
258
270
|
// stub that captures the tx arg then immediately throws a sentinel so
|
|
259
271
|
// better-sqlite3's native wrapper rolls back the stub and re-throws.
|
|
@@ -318,6 +330,17 @@ function patchBetterSqliteTransactions(db, sqlite) {
|
|
|
318
330
|
}
|
|
319
331
|
throw err;
|
|
320
332
|
}
|
|
333
|
+
}
|
|
334
|
+
return function asyncTransaction(cb) {
|
|
335
|
+
if (txContext.getStore()) {
|
|
336
|
+
// Same-task nesting: run directly (savepoint path inside the open
|
|
337
|
+
// transaction). Queueing here would deadlock behind the outer tx.
|
|
338
|
+
return runTransactionBody(cb);
|
|
339
|
+
}
|
|
340
|
+
const run = () => txContext.run(true, () => runTransactionBody(cb));
|
|
341
|
+
const next = txChain.then(run, run);
|
|
342
|
+
txChain = next.then(() => undefined, () => undefined);
|
|
343
|
+
return next;
|
|
321
344
|
};
|
|
322
345
|
}
|
|
323
346
|
db.transaction = makeAsyncTransaction(db.transaction.bind(db));
|