@agent-native/core 0.14.8 → 0.15.1
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/README.md +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +30 -9
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +14 -4
- 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 +71 -4
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +9 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/appearance/actions/change-appearance.d.ts +3 -0
- package/dist/appearance/actions/change-appearance.d.ts.map +1 -0
- package/dist/appearance/actions/change-appearance.js +29 -0
- package/dist/appearance/actions/change-appearance.js.map +1 -0
- package/dist/chat-threads/store.d.ts +53 -2
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +172 -12
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +114 -37
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +30 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts +25 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +275 -49
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +23 -4
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +276 -53
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AppearancePicker.d.ts +11 -0
- package/dist/client/AppearancePicker.d.ts.map +1 -0
- package/dist/client/AppearancePicker.js +16 -0
- package/dist/client/AppearancePicker.js.map +1 -0
- package/dist/client/AssistantChat.d.ts +35 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +315 -32
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +5 -2
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +8 -10
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +1 -1
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +13 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +217 -38
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +37 -14
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +5 -0
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +4 -0
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-sidebar-state.d.ts +12 -0
- package/dist/client/agent-sidebar-state.d.ts.map +1 -1
- package/dist/client/agent-sidebar-state.js +8 -0
- package/dist/client/agent-sidebar-state.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +175 -3
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/appearance.d.ts +40 -0
- package/dist/client/appearance.d.ts.map +1 -0
- package/dist/client/appearance.js +114 -0
- package/dist/client/appearance.js.map +1 -0
- package/dist/client/builder-frame.d.ts +1 -0
- package/dist/client/builder-frame.d.ts.map +1 -1
- package/dist/client/builder-frame.js +19 -9
- package/dist/client/builder-frame.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +10 -2
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/ui/dropdown-menu.js +2 -2
- package/dist/client/components/ui/dropdown-menu.js.map +1 -1
- package/dist/client/components/ui/hover-card.js +1 -1
- package/dist/client/components/ui/hover-card.js.map +1 -1
- package/dist/client/components/ui/popover.js +1 -1
- package/dist/client/components/ui/popover.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts +7 -0
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +63 -32
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +5 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +36 -6
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +13 -1
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/dev-mode.d.ts +14 -0
- package/dist/client/dev-mode.d.ts.map +1 -0
- package/dist/client/dev-mode.js +14 -0
- package/dist/client/dev-mode.js.map +1 -0
- package/dist/client/error-format.d.ts +3 -2
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +9 -2
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/extensions/EmbeddedTool.d.ts +20 -0
- package/dist/client/extensions/EmbeddedTool.d.ts.map +1 -0
- package/dist/client/extensions/EmbeddedTool.js +199 -0
- package/dist/client/extensions/EmbeddedTool.js.map +1 -0
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +24 -2
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ToolEditor.d.ts +5 -0
- package/dist/client/extensions/ToolEditor.d.ts.map +1 -0
- package/dist/client/extensions/ToolEditor.js +129 -0
- package/dist/client/extensions/ToolEditor.js.map +1 -0
- package/dist/client/extensions/ToolViewer.d.ts +5 -0
- package/dist/client/extensions/ToolViewer.d.ts.map +1 -0
- package/dist/client/extensions/ToolViewer.js +400 -0
- package/dist/client/extensions/ToolViewer.js.map +1 -0
- package/dist/client/extensions/ToolViewerPage.d.ts +2 -0
- package/dist/client/extensions/ToolViewerPage.d.ts.map +1 -0
- package/dist/client/extensions/ToolViewerPage.js +24 -0
- package/dist/client/extensions/ToolViewerPage.js.map +1 -0
- package/dist/client/extensions/ToolsListPage.d.ts +2 -0
- package/dist/client/extensions/ToolsListPage.d.ts.map +1 -0
- package/dist/client/extensions/ToolsListPage.js +67 -0
- package/dist/client/extensions/ToolsListPage.js.map +1 -0
- package/dist/client/extensions/ToolsSidebarSection.d.ts +2 -0
- package/dist/client/extensions/ToolsSidebarSection.d.ts.map +1 -0
- package/dist/client/extensions/ToolsSidebarSection.js +236 -0
- package/dist/client/extensions/ToolsSidebarSection.js.map +1 -0
- package/dist/client/extensions/tool-order.d.ts +7 -0
- package/dist/client/extensions/tool-order.d.ts.map +1 -0
- package/dist/client/extensions/tool-order.js +47 -0
- package/dist/client/extensions/tool-order.js.map +1 -0
- package/dist/client/index.d.ts +8 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +1 -0
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/InvitationBanner.d.ts.map +1 -1
- package/dist/client/org/InvitationBanner.js +23 -2
- package/dist/client/org/InvitationBanner.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +5 -4
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +57 -9
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +10 -6
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/workspace-app-links.d.ts +31 -0
- package/dist/client/org/workspace-app-links.d.ts.map +1 -0
- package/dist/client/org/workspace-app-links.js +268 -0
- package/dist/client/org/workspace-app-links.js.map +1 -0
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +18 -5
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/use-resources.d.ts +18 -13
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +24 -6
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.js +9 -1
- package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.d.ts.map +1 -1
- package/dist/client/settings/BrowserSection.js +16 -1
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +4 -1
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +5 -5
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +8 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +50 -13
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.spec.d.ts +2 -0
- package/dist/client/settings/useBuilderStatus.spec.d.ts.map +1 -0
- package/dist/client/settings/useBuilderStatus.spec.js +64 -0
- package/dist/client/settings/useBuilderStatus.spec.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +5 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +60 -6
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/theme.js +1 -1
- package/dist/client/theme.js.map +1 -1
- package/dist/client/tools/EmbeddedTool.d.ts +20 -0
- package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
- package/dist/client/tools/EmbeddedTool.js +199 -0
- package/dist/client/tools/EmbeddedTool.js.map +1 -0
- package/dist/client/tools/ExtensionSlot.d.ts +27 -0
- package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
- package/dist/client/tools/ExtensionSlot.js +96 -0
- package/dist/client/tools/ExtensionSlot.js.map +1 -0
- package/dist/client/tools/ToolEditor.d.ts +5 -0
- package/dist/client/tools/ToolEditor.d.ts.map +1 -0
- package/dist/client/tools/ToolEditor.js +129 -0
- package/dist/client/tools/ToolEditor.js.map +1 -0
- package/dist/client/tools/ToolViewer.d.ts +5 -0
- package/dist/client/tools/ToolViewer.d.ts.map +1 -0
- package/dist/client/tools/ToolViewer.js +400 -0
- package/dist/client/tools/ToolViewer.js.map +1 -0
- package/dist/client/tools/ToolViewerPage.d.ts +2 -0
- package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
- package/dist/client/tools/ToolViewerPage.js +24 -0
- package/dist/client/tools/ToolViewerPage.js.map +1 -0
- package/dist/client/tools/ToolsListPage.d.ts +2 -0
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
- package/dist/client/tools/ToolsListPage.js +67 -0
- package/dist/client/tools/ToolsListPage.js.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.js +236 -0
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
- package/dist/client/tools/iframe-bridge.d.ts +38 -0
- package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
- package/dist/client/tools/iframe-bridge.js +207 -0
- package/dist/client/tools/iframe-bridge.js.map +1 -0
- package/dist/client/tools/index.d.ts +8 -0
- package/dist/client/tools/index.d.ts.map +1 -0
- package/dist/client/tools/index.js +8 -0
- package/dist/client/tools/index.js.map +1 -0
- package/dist/client/tools/tool-order.d.ts +7 -0
- package/dist/client/tools/tool-order.d.ts.map +1 -0
- package/dist/client/tools/tool-order.js +47 -0
- package/dist/client/tools/tool-order.js.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js +2 -3
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/client/use-change-version.d.ts +46 -0
- package/dist/client/use-change-version.d.ts.map +1 -0
- package/dist/client/use-change-version.js +135 -0
- package/dist/client/use-change-version.js.map +1 -0
- package/dist/client/use-chat-threads.d.ts +16 -2
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +87 -12
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-chat-threads.spec.d.ts +2 -0
- package/dist/client/use-chat-threads.spec.d.ts.map +1 -0
- package/dist/client/use-chat-threads.spec.js +85 -0
- package/dist/client/use-chat-threads.spec.js.map +1 -0
- package/dist/client/use-db-sync.d.ts +5 -2
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +41 -16
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-pinch-zoom.d.ts +35 -0
- package/dist/client/use-pinch-zoom.d.ts.map +1 -0
- package/dist/client/use-pinch-zoom.js +105 -0
- package/dist/client/use-pinch-zoom.js.map +1 -0
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +99 -5
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +3 -0
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/store.d.ts +5 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +16 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +3 -0
- package/dist/file-upload/actions/upload-image.d.ts.map +1 -0
- package/dist/file-upload/actions/upload-image.js +145 -0
- package/dist/file-upload/actions/upload-image.js.map +1 -0
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +31 -11
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/file-upload/index.d.ts +1 -0
- package/dist/file-upload/index.d.ts.map +1 -1
- package/dist/file-upload/index.js +1 -0
- package/dist/file-upload/index.js.map +1 -1
- package/dist/file-upload/pre-upload-attachments.d.ts +39 -0
- package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -0
- package/dist/file-upload/pre-upload-attachments.js +110 -0
- package/dist/file-upload/pre-upload-attachments.js.map +1 -0
- package/dist/file-upload/registry.d.ts.map +1 -1
- package/dist/file-upload/registry.js +8 -7
- package/dist/file-upload/registry.js.map +1 -1
- package/dist/onboarding/default-steps.js +1 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/org/context.d.ts +15 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +25 -0
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +2 -2
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +3 -17
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/index.d.ts +1 -1
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -1
- package/dist/org/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +6 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +30 -6
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts +11 -2
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +20 -3
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +28 -3
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +170 -20
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/resources/list.d.ts +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +16 -4
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/write.d.ts +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +47 -3
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +8 -3
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +214 -25
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts +35 -0
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +139 -8
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/app-url.d.ts +12 -6
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +58 -11
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +22 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +316 -65
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +0 -4
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +0 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +23 -0
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +29 -14
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +14 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +88 -11
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +65 -17
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +47 -17
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/local-migration.d.ts +41 -0
- package/dist/server/local-migration.d.ts.map +1 -0
- package/dist/server/local-migration.js +235 -0
- package/dist/server/local-migration.js.map +1 -0
- package/dist/server/oauth-public-origin.d.ts.map +1 -1
- package/dist/server/oauth-public-origin.js +19 -1
- package/dist/server/oauth-public-origin.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +74 -19
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +20 -5
- package/dist/server/poll.js.map +1 -1
- package/dist/server/request-context.d.ts +8 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +2 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/llm-connection.d.ts +10 -0
- package/dist/shared/llm-connection.d.ts.map +1 -0
- package/dist/shared/llm-connection.js +29 -0
- package/dist/shared/llm-connection.js.map +1 -0
- package/dist/shared/workspace-app-audience.d.ts +25 -0
- package/dist/shared/workspace-app-audience.d.ts.map +1 -0
- package/dist/shared/workspace-app-audience.js +126 -0
- package/dist/shared/workspace-app-audience.js.map +1 -0
- package/dist/shared/workspace-app-id.d.ts +1 -1
- package/dist/shared/workspace-app-id.d.ts.map +1 -1
- package/dist/shared/workspace-app-id.js +1 -0
- package/dist/shared/workspace-app-id.js.map +1 -1
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +46 -5
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
- package/dist/sharing/actions/list-resource-shares.js +8 -1
- package/dist/sharing/actions/list-resource-shares.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +12 -3
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +50 -1
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/registry.d.ts +26 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/styles/agent-native.css +91 -0
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
- package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
- package/dist/templates/default/AGENTS.md +22 -19
- package/dist/templates/default/actions/navigate.ts +3 -0
- package/dist/templates/default/app/hooks/use-navigation-state.ts +29 -5
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
- package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
- package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
- package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
- package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
- package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
- package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
- package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
- package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
- package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
- package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
- package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
- package/dist/templates/workspace-core/AGENTS.md +16 -1
- package/dist/templates/workspace-root/AGENTS.md +35 -0
- package/dist/templates/workspace-root/README.md +7 -0
- package/dist/tools/actions.d.ts +3 -0
- package/dist/tools/actions.d.ts.map +1 -0
- package/dist/tools/actions.js +272 -0
- package/dist/tools/actions.js.map +1 -0
- package/dist/tools/fetch-tool.d.ts +23 -0
- package/dist/tools/fetch-tool.d.ts.map +1 -0
- package/dist/tools/fetch-tool.js +178 -0
- package/dist/tools/fetch-tool.js.map +1 -0
- package/dist/tools/html-shell.d.ts +45 -0
- package/dist/tools/html-shell.d.ts.map +1 -0
- package/dist/tools/html-shell.js +514 -0
- package/dist/tools/html-shell.js.map +1 -0
- package/dist/tools/proxy-security.d.ts +12 -0
- package/dist/tools/proxy-security.d.ts.map +1 -0
- package/dist/tools/proxy-security.js +158 -0
- package/dist/tools/proxy-security.js.map +1 -0
- package/dist/tools/routes.d.ts +2 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +627 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +664 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +146 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/slots/routes.d.ts +15 -0
- package/dist/tools/slots/routes.d.ts.map +1 -0
- package/dist/tools/slots/routes.js +94 -0
- package/dist/tools/slots/routes.js.map +1 -0
- package/dist/tools/slots/schema.d.ts +303 -0
- package/dist/tools/slots/schema.d.ts.map +1 -0
- package/dist/tools/slots/schema.js +76 -0
- package/dist/tools/slots/schema.js.map +1 -0
- package/dist/tools/slots/store.d.ts +66 -0
- package/dist/tools/slots/store.d.ts.map +1 -0
- package/dist/tools/slots/store.js +227 -0
- package/dist/tools/slots/store.js.map +1 -0
- package/dist/tools/store.d.ts +40 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +193 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/theme.d.ts +2 -0
- package/dist/tools/theme.d.ts.map +1 -0
- package/dist/tools/theme.js +67 -0
- package/dist/tools/theme.js.map +1 -0
- package/dist/tools/url-safety.d.ts +24 -0
- package/dist/tools/url-safety.d.ts.map +1 -0
- package/dist/tools/url-safety.js +224 -0
- package/dist/tools/url-safety.js.map +1 -0
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +4 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/authentication.md +36 -0
- package/docs/content/creating-templates.md +15 -0
- package/docs/content/dispatch.md +3 -3
- package/docs/content/multi-app-workspace.md +5 -0
- package/docs/content/tracking.md +12 -0
- package/docs/content/workspace-management.md +39 -4
- package/package.json +15 -12
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
- package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
- package/src/templates/default/AGENTS.md +22 -19
- package/src/templates/default/actions/navigate.ts +3 -0
- package/src/templates/default/app/hooks/use-navigation-state.ts +29 -5
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
- package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
- package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
- package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
- package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
- package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
- package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
- package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
- package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
- package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
- package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
- package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
- package/src/templates/workspace-core/AGENTS.md +16 -1
- package/src/templates/workspace-root/AGENTS.md +35 -0
- package/src/templates/workspace-root/README.md +7 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ToolsSidebarSection } from "./ToolsSidebarSection.js";
|
|
2
|
+
export { ToolViewer, type ToolViewerProps } from "./ToolViewer.js";
|
|
3
|
+
export { ToolEditor, type ToolEditorProps } from "./ToolEditor.js";
|
|
4
|
+
export { ToolsListPage } from "./ToolsListPage.js";
|
|
5
|
+
export { ToolViewerPage } from "./ToolViewerPage.js";
|
|
6
|
+
export { EmbeddedTool, type EmbeddedToolProps } from "./EmbeddedTool.js";
|
|
7
|
+
export { ExtensionSlot, type ExtensionSlotProps } from "./ExtensionSlot.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ToolsSidebarSection } from "./ToolsSidebarSection.js";
|
|
2
|
+
export { ToolViewer } from "./ToolViewer.js";
|
|
3
|
+
export { ToolEditor } from "./ToolEditor.js";
|
|
4
|
+
export { ToolsListPage } from "./ToolsListPage.js";
|
|
5
|
+
export { ToolViewerPage } from "./ToolViewerPage.js";
|
|
6
|
+
export { EmbeddedTool } from "./EmbeddedTool.js";
|
|
7
|
+
export { ExtensionSlot } from "./ExtensionSlot.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC","sourcesContent":["export { ToolsSidebarSection } from \"./ToolsSidebarSection.js\";\nexport { ToolViewer, type ToolViewerProps } from \"./ToolViewer.js\";\nexport { ToolEditor, type ToolEditorProps } from \"./ToolEditor.js\";\nexport { ToolsListPage } from \"./ToolsListPage.js\";\nexport { ToolViewerPage } from \"./ToolViewerPage.js\";\nexport { EmbeddedTool, type EmbeddedToolProps } from \"./EmbeddedTool.js\";\nexport { ExtensionSlot, type ExtensionSlotProps } from \"./ExtensionSlot.js\";\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const TOOLS_ORDER_CHANGE_EVENT = "tools-order-change";
|
|
2
|
+
export declare function getToolsOrder(): string[];
|
|
3
|
+
export declare function setToolsOrder(order: string[]): void;
|
|
4
|
+
export declare function applyToolsOrder<T extends {
|
|
5
|
+
id: string;
|
|
6
|
+
}>(items: T[], savedOrder: string[]): T[];
|
|
7
|
+
//# sourceMappingURL=tool-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-order.d.ts","sourceRoot":"","sources":["../../../src/client/tools/tool-order.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAI7D,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAYxC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAU5C;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACtD,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAAE,GACnB,CAAC,EAAE,CAeL"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const TOOLS_ORDER_CHANGE_EVENT = "tools-order-change";
|
|
2
|
+
const TOOLS_ORDER_KEY = "tools-order";
|
|
3
|
+
export function getToolsOrder() {
|
|
4
|
+
if (typeof window === "undefined")
|
|
5
|
+
return [];
|
|
6
|
+
try {
|
|
7
|
+
const raw = window.localStorage.getItem(TOOLS_ORDER_KEY);
|
|
8
|
+
if (!raw)
|
|
9
|
+
return [];
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
return Array.isArray(parsed)
|
|
12
|
+
? parsed.filter((id) => typeof id === "string")
|
|
13
|
+
: [];
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function setToolsOrder(order) {
|
|
20
|
+
if (typeof window === "undefined")
|
|
21
|
+
return;
|
|
22
|
+
try {
|
|
23
|
+
window.localStorage.setItem(TOOLS_ORDER_KEY, JSON.stringify(order));
|
|
24
|
+
window.dispatchEvent(new CustomEvent(TOOLS_ORDER_CHANGE_EVENT, { detail: order }));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// localStorage unavailable / quota — ignore, order is best-effort
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function applyToolsOrder(items, savedOrder) {
|
|
31
|
+
if (savedOrder.length === 0)
|
|
32
|
+
return items;
|
|
33
|
+
const idToItem = new Map(items.map((item) => [item.id, item]));
|
|
34
|
+
const ordered = [];
|
|
35
|
+
for (const id of savedOrder) {
|
|
36
|
+
const item = idToItem.get(id);
|
|
37
|
+
if (item) {
|
|
38
|
+
ordered.push(item);
|
|
39
|
+
idToItem.delete(id);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const item of idToItem.values()) {
|
|
43
|
+
ordered.push(item);
|
|
44
|
+
}
|
|
45
|
+
return ordered;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=tool-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-order.js","sourceRoot":"","sources":["../../../src/client/tools/tool-order.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAE7D,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAU,EACV,UAAoB;IAEpB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["export const TOOLS_ORDER_CHANGE_EVENT = \"tools-order-change\";\n\nconst TOOLS_ORDER_KEY = \"tools-order\";\n\nexport function getToolsOrder(): string[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = window.localStorage.getItem(TOOLS_ORDER_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed)\n ? parsed.filter((id) => typeof id === \"string\")\n : [];\n } catch {\n return [];\n }\n}\n\nexport function setToolsOrder(order: string[]) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(TOOLS_ORDER_KEY, JSON.stringify(order));\n window.dispatchEvent(\n new CustomEvent(TOOLS_ORDER_CHANGE_EVENT, { detail: order }),\n );\n } catch {\n // localStorage unavailable / quota — ignore, order is best-effort\n }\n}\n\nexport function applyToolsOrder<T extends { id: string }>(\n items: T[],\n savedOrder: string[],\n): T[] {\n if (savedOrder.length === 0) return items;\n const idToItem = new Map(items.map((item) => [item.id, item]));\n const ordered: T[] = [];\n for (const id of savedOrder) {\n const item = idToItem.get(id);\n if (item) {\n ordered.push(item);\n idToItem.delete(id);\n }\n }\n for (const item of idToItem.values()) {\n ordered.push(item);\n }\n return ordered;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,4CA+FtC"}
|
|
@@ -9,7 +9,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
10
10
|
import { IconBolt, IconExternalLink, IconLoader2 } from "@tabler/icons-react";
|
|
11
11
|
import { agentNativePath } from "../api-path.js";
|
|
12
|
-
import {
|
|
12
|
+
import { openBuilderConnectPopup } from "../settings/useBuilderStatus.js";
|
|
13
13
|
export function BuilderTranscriptionCta() {
|
|
14
14
|
const [configured, setConfigured] = useState(null);
|
|
15
15
|
const [connecting, setConnecting] = useState(false);
|
|
@@ -44,8 +44,7 @@ export function BuilderTranscriptionCta() {
|
|
|
44
44
|
clearInterval(pollRef.current);
|
|
45
45
|
setConnecting(true);
|
|
46
46
|
setError(null);
|
|
47
|
-
|
|
48
|
-
window.open(new URL(agentNativePath("/_agent-native/builder/connect"), origin).href, "_blank", "noopener,noreferrer");
|
|
47
|
+
openBuilderConnectPopup({ source: "builder_transcription_cta" });
|
|
49
48
|
const start = Date.now();
|
|
50
49
|
pollRef.current = setInterval(async () => {
|
|
51
50
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuilderTranscriptionCta.js","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"BuilderTranscriptionCta.js","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lightweight inline CTA that nudges users to connect Builder.io for\n * higher-quality transcription. Renders nothing when Builder is already\n * connected.\n *\n * Drop this next to transcript displays in any template.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconBolt, IconExternalLink, IconLoader2 } from \"@tabler/icons-react\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { openBuilderConnectPopup } from \"../settings/useBuilderStatus.js\";\n\nexport function BuilderTranscriptionCta() {\n const [configured, setConfigured] = useState<boolean | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) =>\n r.ok\n ? (r.json() as Promise<{ configured: boolean; envManaged?: boolean }>)\n : null,\n )\n .then((s) => {\n if (!mountedRef.current) return;\n // Env-managed mode counts as configured for the CTA — the deploy\n // already routes transcription through Builder, no per-user prompt.\n setConfigured(!!(s?.configured || s?.envManaged));\n })\n .catch(() => {\n if (mountedRef.current) setConfigured(false);\n });\n return () => {\n mountedRef.current = false;\n if (pollRef.current) clearInterval(pollRef.current);\n };\n }, []);\n\n const handleConnect = useCallback(() => {\n if (pollRef.current) clearInterval(pollRef.current);\n setConnecting(true);\n setError(null);\n\n openBuilderConnectPopup({ source: \"builder_transcription_cta\" });\n\n const start = Date.now();\n pollRef.current = setInterval(async () => {\n try {\n const r = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!r.ok) return;\n const s = (await r.json()) as { configured: boolean };\n if (!mountedRef.current) {\n clearInterval(pollRef.current!);\n return;\n }\n if (s.configured) {\n clearInterval(pollRef.current!);\n setConfigured(true);\n setConnecting(false);\n } else if (Date.now() - start > 5 * 60 * 1000) {\n clearInterval(pollRef.current!);\n setConnecting(false);\n setError(\n \"Didn't hear back from Builder. Allow popups and try again.\",\n );\n }\n } catch {\n // transient — keep polling\n }\n }, 2000);\n }, []);\n\n // Already connected or still loading — render nothing\n if (configured === null || configured) return null;\n\n return (\n <div className=\"flex items-center gap-2 rounded-md border border-border/50 bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <IconBolt\n size={14}\n className=\"shrink-0 text-muted-foreground/70\"\n aria-hidden=\"true\"\n />\n <span className=\"flex-1\">\n {connecting\n ? \"Waiting for Builder.io…\"\n : \"Connect Builder.io for higher-quality transcription — free credits, no API key needed.\"}\n </span>\n {error ? (\n <span className=\"text-destructive text-[10px]\">{error}</span>\n ) : connecting ? (\n <IconLoader2 size={12} className=\"shrink-0 animate-spin\" />\n ) : (\n <button\n type=\"button\"\n onClick={handleConnect}\n className=\"ml-auto shrink-0 inline-flex items-center gap-1 rounded bg-foreground px-2 py-1 text-[10px] font-semibold text-background hover:opacity-90 transition-opacity\"\n >\n Connect\n <IconExternalLink size={10} />\n </button>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advance a source counter. Called by `useDbSync` for every change event;
|
|
3
|
+
* may also be called from templates that learn of a server-side change via
|
|
4
|
+
* a custom path (e.g. an in-process mutation that already happened — bump
|
|
5
|
+
* the counter so other components refetch without waiting for the poll
|
|
6
|
+
* cycle).
|
|
7
|
+
*/
|
|
8
|
+
export declare function bumpChangeVersion(source: string, version: number): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Get the current counter for a source without subscribing. Use inside
|
|
11
|
+
* event handlers / callbacks; in render code use `useChangeVersion`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getChangeVersion(source: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Subscribe to a source's change counter. Returns an integer that
|
|
16
|
+
* increments every time the server emits an event with `source === <source>`
|
|
17
|
+
* — including (by design) the agent's own action calls, since the agent
|
|
18
|
+
* runner emits `source: "action"` after every successful mutating action.
|
|
19
|
+
*
|
|
20
|
+
* Fold the return value into a React Query `queryKey` to make the query
|
|
21
|
+
* refetch whenever that source advances:
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const v = useChangeVersion("dashboards");
|
|
25
|
+
* useQuery({
|
|
26
|
+
* queryKey: ["dashboard", id, v],
|
|
27
|
+
* queryFn: () => fetchDashboard(id),
|
|
28
|
+
* placeholderData: keepPreviousData,
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function useChangeVersion(source: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Convenience for queries that should refetch on multiple sources — returns
|
|
35
|
+
* the sum of each source's counter so React Query treats every advance as a
|
|
36
|
+
* key change.
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* const v = useChangeVersions(["dashboards", "action"]);
|
|
40
|
+
* useQuery({ queryKey: ["dashboard", id, v], ... });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function useChangeVersions(sources: readonly string[]): number;
|
|
44
|
+
/** Internal test helper — reset all counters. Do not use in app code. */
|
|
45
|
+
export declare function _resetChangeVersionStoreForTests(): void;
|
|
46
|
+
//# sourceMappingURL=use-change-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-change-version.d.ts","sourceRoot":"","sources":["../../src/client/use-change-version.ts"],"names":[],"mappings":"AAgFA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,IAAI,IAAI,CAKvD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-source change counters — the framework's "agent writes show up
|
|
3
|
+
* immediately" primitive.
|
|
4
|
+
*
|
|
5
|
+
* Every server-side mutation emits a `recordChange({ source, ... })` event.
|
|
6
|
+
* `useDbSync` (in this folder) calls `bumpChangeVersion(source, version)` for
|
|
7
|
+
* each event it sees over SSE or `/poll`. Hooks `useChangeVersion(source)`
|
|
8
|
+
* and `useChangeVersions(sources)` expose a per-source integer that
|
|
9
|
+
* advances every time that source has new activity.
|
|
10
|
+
*
|
|
11
|
+
* Templates fold these counters into their React Query `queryKey` — when the
|
|
12
|
+
* counter advances, the key changes, and React Query refetches that one
|
|
13
|
+
* query. No template needs to enumerate query keys in `useDbSync`; no full
|
|
14
|
+
* cache invalidate is required.
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const v = useChangeVersion("dashboards");
|
|
18
|
+
* const dashboard = useQuery({
|
|
19
|
+
* queryKey: ["dashboard", id, v],
|
|
20
|
+
* queryFn: () => fetchDashboard(id),
|
|
21
|
+
* placeholderData: keepPreviousData, // no flicker on refetch
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* The agent's `update-dashboard` action emits `{ source: "dashboards" }`
|
|
26
|
+
* (from `upsertDashboard`'s `recordChange` call) AND
|
|
27
|
+
* `{ source: "action" }` (from the agent runner's post-tool emit). Either
|
|
28
|
+
* triggers a refetch when the relevant counter is in the query key.
|
|
29
|
+
*
|
|
30
|
+
* **Cost is bounded:** only queries that opted into a specific source
|
|
31
|
+
* refetch when that source fires. A poll heartbeat with no event does
|
|
32
|
+
* nothing.
|
|
33
|
+
*/
|
|
34
|
+
import { useSyncExternalStore } from "react";
|
|
35
|
+
class ChangeVersionStore {
|
|
36
|
+
versions = new Map();
|
|
37
|
+
listeners = new Set();
|
|
38
|
+
cachedSnapshots = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* Advance the counter for `source` to at least `version`. Returns true if
|
|
41
|
+
* the counter actually moved (so callers can avoid spurious work).
|
|
42
|
+
*/
|
|
43
|
+
bump(source, version) {
|
|
44
|
+
if (!source)
|
|
45
|
+
return false;
|
|
46
|
+
const current = this.versions.get(source) ?? 0;
|
|
47
|
+
if (version > current) {
|
|
48
|
+
this.versions.set(source, version);
|
|
49
|
+
this.cachedSnapshots.set(source, version);
|
|
50
|
+
this.notify();
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
get(source) {
|
|
56
|
+
// useSyncExternalStore requires reference-stable snapshots for unchanged
|
|
57
|
+
// values, so we serve from a cached map that we only update inside
|
|
58
|
+
// `bump`.
|
|
59
|
+
const cached = this.cachedSnapshots.get(source);
|
|
60
|
+
if (cached !== undefined)
|
|
61
|
+
return cached;
|
|
62
|
+
this.cachedSnapshots.set(source, 0);
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
subscribe(listener) {
|
|
66
|
+
this.listeners.add(listener);
|
|
67
|
+
return () => {
|
|
68
|
+
this.listeners.delete(listener);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
notify() {
|
|
72
|
+
for (const listener of this.listeners)
|
|
73
|
+
listener();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const store = new ChangeVersionStore();
|
|
77
|
+
/**
|
|
78
|
+
* Advance a source counter. Called by `useDbSync` for every change event;
|
|
79
|
+
* may also be called from templates that learn of a server-side change via
|
|
80
|
+
* a custom path (e.g. an in-process mutation that already happened — bump
|
|
81
|
+
* the counter so other components refetch without waiting for the poll
|
|
82
|
+
* cycle).
|
|
83
|
+
*/
|
|
84
|
+
export function bumpChangeVersion(source, version) {
|
|
85
|
+
return store.bump(source, version);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the current counter for a source without subscribing. Use inside
|
|
89
|
+
* event handlers / callbacks; in render code use `useChangeVersion`.
|
|
90
|
+
*/
|
|
91
|
+
export function getChangeVersion(source) {
|
|
92
|
+
return store.get(source);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to a source's change counter. Returns an integer that
|
|
96
|
+
* increments every time the server emits an event with `source === <source>`
|
|
97
|
+
* — including (by design) the agent's own action calls, since the agent
|
|
98
|
+
* runner emits `source: "action"` after every successful mutating action.
|
|
99
|
+
*
|
|
100
|
+
* Fold the return value into a React Query `queryKey` to make the query
|
|
101
|
+
* refetch whenever that source advances:
|
|
102
|
+
*
|
|
103
|
+
* ```ts
|
|
104
|
+
* const v = useChangeVersion("dashboards");
|
|
105
|
+
* useQuery({
|
|
106
|
+
* queryKey: ["dashboard", id, v],
|
|
107
|
+
* queryFn: () => fetchDashboard(id),
|
|
108
|
+
* placeholderData: keepPreviousData,
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function useChangeVersion(source) {
|
|
113
|
+
return useSyncExternalStore((cb) => store.subscribe(cb), () => store.get(source), () => 0);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convenience for queries that should refetch on multiple sources — returns
|
|
117
|
+
* the sum of each source's counter so React Query treats every advance as a
|
|
118
|
+
* key change.
|
|
119
|
+
*
|
|
120
|
+
* ```ts
|
|
121
|
+
* const v = useChangeVersions(["dashboards", "action"]);
|
|
122
|
+
* useQuery({ queryKey: ["dashboard", id, v], ... });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export function useChangeVersions(sources) {
|
|
126
|
+
return useSyncExternalStore((cb) => store.subscribe(cb), () => sources.reduce((sum, src) => sum + store.get(src), 0), () => 0);
|
|
127
|
+
}
|
|
128
|
+
/** Internal test helper — reset all counters. Do not use in app code. */
|
|
129
|
+
export function _resetChangeVersionStoreForTests() {
|
|
130
|
+
// @ts-expect-error reaching past private to clear state in tests
|
|
131
|
+
store.versions.clear();
|
|
132
|
+
// @ts-expect-error reaching past private to clear state in tests
|
|
133
|
+
store.cachedSnapshots.clear();
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=use-change-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-change-version.js","sourceRoot":"","sources":["../../src/client/use-change-version.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Per-source change counters — the framework's \"agent writes show up\n * immediately\" primitive.\n *\n * Every server-side mutation emits a `recordChange({ source, ... })` event.\n * `useDbSync` (in this folder) calls `bumpChangeVersion(source, version)` for\n * each event it sees over SSE or `/poll`. Hooks `useChangeVersion(source)`\n * and `useChangeVersions(sources)` expose a per-source integer that\n * advances every time that source has new activity.\n *\n * Templates fold these counters into their React Query `queryKey` — when the\n * counter advances, the key changes, and React Query refetches that one\n * query. No template needs to enumerate query keys in `useDbSync`; no full\n * cache invalidate is required.\n *\n * ```ts\n * const v = useChangeVersion(\"dashboards\");\n * const dashboard = useQuery({\n * queryKey: [\"dashboard\", id, v],\n * queryFn: () => fetchDashboard(id),\n * placeholderData: keepPreviousData, // no flicker on refetch\n * });\n * ```\n *\n * The agent's `update-dashboard` action emits `{ source: \"dashboards\" }`\n * (from `upsertDashboard`'s `recordChange` call) AND\n * `{ source: \"action\" }` (from the agent runner's post-tool emit). Either\n * triggers a refetch when the relevant counter is in the query key.\n *\n * **Cost is bounded:** only queries that opted into a specific source\n * refetch when that source fires. A poll heartbeat with no event does\n * nothing.\n */\nimport { useSyncExternalStore } from \"react\";\n\nclass ChangeVersionStore {\n private versions = new Map<string, number>();\n private listeners = new Set<() => void>();\n private cachedSnapshots = new Map<string, number>();\n\n /**\n * Advance the counter for `source` to at least `version`. Returns true if\n * the counter actually moved (so callers can avoid spurious work).\n */\n bump(source: string, version: number): boolean {\n if (!source) return false;\n const current = this.versions.get(source) ?? 0;\n if (version > current) {\n this.versions.set(source, version);\n this.cachedSnapshots.set(source, version);\n this.notify();\n return true;\n }\n return false;\n }\n\n get(source: string): number {\n // useSyncExternalStore requires reference-stable snapshots for unchanged\n // values, so we serve from a cached map that we only update inside\n // `bump`.\n const cached = this.cachedSnapshots.get(source);\n if (cached !== undefined) return cached;\n this.cachedSnapshots.set(source, 0);\n return 0;\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n for (const listener of this.listeners) listener();\n }\n}\n\nconst store = new ChangeVersionStore();\n\n/**\n * Advance a source counter. Called by `useDbSync` for every change event;\n * may also be called from templates that learn of a server-side change via\n * a custom path (e.g. an in-process mutation that already happened — bump\n * the counter so other components refetch without waiting for the poll\n * cycle).\n */\nexport function bumpChangeVersion(source: string, version: number): boolean {\n return store.bump(source, version);\n}\n\n/**\n * Get the current counter for a source without subscribing. Use inside\n * event handlers / callbacks; in render code use `useChangeVersion`.\n */\nexport function getChangeVersion(source: string): number {\n return store.get(source);\n}\n\n/**\n * Subscribe to a source's change counter. Returns an integer that\n * increments every time the server emits an event with `source === <source>`\n * — including (by design) the agent's own action calls, since the agent\n * runner emits `source: \"action\"` after every successful mutating action.\n *\n * Fold the return value into a React Query `queryKey` to make the query\n * refetch whenever that source advances:\n *\n * ```ts\n * const v = useChangeVersion(\"dashboards\");\n * useQuery({\n * queryKey: [\"dashboard\", id, v],\n * queryFn: () => fetchDashboard(id),\n * placeholderData: keepPreviousData,\n * });\n * ```\n */\nexport function useChangeVersion(source: string): number {\n return useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.get(source),\n () => 0,\n );\n}\n\n/**\n * Convenience for queries that should refetch on multiple sources — returns\n * the sum of each source's counter so React Query treats every advance as a\n * key change.\n *\n * ```ts\n * const v = useChangeVersions([\"dashboards\", \"action\"]);\n * useQuery({ queryKey: [\"dashboard\", id, v], ... });\n * ```\n */\nexport function useChangeVersions(sources: readonly string[]): number {\n return useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => sources.reduce((sum, src) => sum + store.get(src), 0),\n () => 0,\n );\n}\n\n/** Internal test helper — reset all counters. Do not use in app code. */\nexport function _resetChangeVersionStoreForTests(): void {\n // @ts-expect-error reaching past private to clear state in tests\n store.versions.clear();\n // @ts-expect-error reaching past private to clear state in tests\n store.cachedSnapshots.clear();\n}\n"]}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export interface ChatThreadScope {
|
|
2
|
+
type: string;
|
|
3
|
+
id: string;
|
|
4
|
+
label?: string;
|
|
5
|
+
}
|
|
1
6
|
export interface ChatThreadSummary {
|
|
2
7
|
id: string;
|
|
3
8
|
title: string;
|
|
@@ -5,6 +10,7 @@ export interface ChatThreadSummary {
|
|
|
5
10
|
messageCount: number;
|
|
6
11
|
createdAt: number;
|
|
7
12
|
updatedAt: number;
|
|
13
|
+
scope: ChatThreadScope | null;
|
|
8
14
|
}
|
|
9
15
|
export interface ChatThreadData {
|
|
10
16
|
id: string;
|
|
@@ -15,15 +21,23 @@ export interface ChatThreadData {
|
|
|
15
21
|
messageCount: number;
|
|
16
22
|
createdAt: number;
|
|
17
23
|
updatedAt: number;
|
|
24
|
+
scope: ChatThreadScope | null;
|
|
25
|
+
}
|
|
26
|
+
export interface ChatThreadSnapshot {
|
|
27
|
+
threadData: string;
|
|
28
|
+
title: string;
|
|
29
|
+
preview: string;
|
|
30
|
+
messageCount: number;
|
|
18
31
|
}
|
|
19
|
-
export declare function useChatThreads(apiUrl?: string, storageKey?: string): {
|
|
32
|
+
export declare function useChatThreads(apiUrl?: string, storageKey?: string, scope?: ChatThreadScope | null): {
|
|
20
33
|
threads: ChatThreadSummary[];
|
|
21
34
|
activeThreadId: string;
|
|
22
35
|
isLoading: boolean;
|
|
23
36
|
createThread: (preferredId?: string) => Promise<string | null>;
|
|
24
37
|
switchThread: (id: string) => void;
|
|
25
38
|
deleteThread: (id: string) => Promise<void>;
|
|
26
|
-
|
|
39
|
+
detachThread: (threadId: string) => Promise<void>;
|
|
40
|
+
forkThread: (sourceId: string, sourceSnapshot?: ChatThreadSnapshot | null) => Promise<string | null>;
|
|
27
41
|
saveThreadData: (id: string, data: {
|
|
28
42
|
threadData: string;
|
|
29
43
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI;;;;iCAyMb,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;uBAuCV,MAAM;uBAK/B,MAAM;6BAzBA,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;2BA6I3B,MAAM,mBACC,kBAAkB,GAAG,IAAI,KACzC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;yBApFnB,MAAM,QACJ;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;8BAmDc,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;2BA2EnD,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;;sBA/K9C,MAAM;EAiNd"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import { useState, useEffect, useCallback, useRef } from "react";
|
|
1
|
+
import { useState, useEffect, useCallback, useRef, useMemo } from "react";
|
|
2
2
|
import { agentNativePath } from "./api-path.js";
|
|
3
3
|
const ACTIVE_THREAD_KEY = "agent-chat-active-thread";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
function scopeKeySegment(scope) {
|
|
5
|
+
if (!scope)
|
|
6
|
+
return "";
|
|
7
|
+
return `:scope:${scope.type}:${scope.id}`;
|
|
8
|
+
}
|
|
9
|
+
export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-chat"), storageKey, scope) {
|
|
10
|
+
// Each (storageKey, scope) pair gets its own active-thread localStorage
|
|
11
|
+
// key, so navigating between decks/designs/dashboards lands on whatever
|
|
12
|
+
// thread the user had open last *for that resource* — not whichever
|
|
13
|
+
// thread was active globally.
|
|
14
|
+
const activeThreadKey = useMemo(() => {
|
|
15
|
+
const scopePart = scopeKeySegment(scope);
|
|
16
|
+
return storageKey
|
|
17
|
+
? `${ACTIVE_THREAD_KEY}:${storageKey}${scopePart}`
|
|
18
|
+
: `${ACTIVE_THREAD_KEY}${scopePart}`;
|
|
19
|
+
}, [storageKey, scope?.type, scope?.id]);
|
|
8
20
|
const [threads, setThreads] = useState([]);
|
|
9
21
|
// IDs we generated client-side this session — consumers use this to know
|
|
10
22
|
// whether to skip the per-thread restore skeleton, and we use it to
|
|
@@ -33,8 +45,24 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
33
45
|
const fetchedRef = useRef(false);
|
|
34
46
|
const activeThreadIdRef = useRef(activeThreadId);
|
|
35
47
|
activeThreadIdRef.current = activeThreadId;
|
|
36
|
-
// Persist active thread ID
|
|
48
|
+
// Persist active thread ID — and rehydrate on scope flips. When the
|
|
49
|
+
// user navigates from deck A to deck B, `activeThreadKey` changes; we
|
|
50
|
+
// need to re-read whatever thread was last active for B *before*
|
|
51
|
+
// persisting back, otherwise we'd write A's id under B's key on the
|
|
52
|
+
// very next render. The ref-and-branch pattern below keeps the two
|
|
53
|
+
// concerns in one effect without racing them.
|
|
54
|
+
const persistedKeyRef = useRef(activeThreadKey);
|
|
37
55
|
useEffect(() => {
|
|
56
|
+
if (persistedKeyRef.current !== activeThreadKey) {
|
|
57
|
+
persistedKeyRef.current = activeThreadKey;
|
|
58
|
+
try {
|
|
59
|
+
setActiveThreadId(localStorage.getItem(activeThreadKey));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
setActiveThreadId(null);
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
38
66
|
try {
|
|
39
67
|
if (activeThreadId) {
|
|
40
68
|
localStorage.setItem(activeThreadKey, activeThreadId);
|
|
@@ -79,6 +107,15 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
79
107
|
if (local.title)
|
|
80
108
|
next.title = local.title;
|
|
81
109
|
}
|
|
110
|
+
// Preserve optimistic scope: when the server creates the row
|
|
111
|
+
// on first message it does so without scope, and the next PUT
|
|
112
|
+
// (saveThreadData) writes the local scope back. In the brief
|
|
113
|
+
// window between those, the server list returns scope: null
|
|
114
|
+
// while the user is clearly working inside a deck — keep the
|
|
115
|
+
// local value so the tab bar doesn't blink unscoped.
|
|
116
|
+
if (local.scope && !server.scope) {
|
|
117
|
+
next.scope = local.scope;
|
|
118
|
+
}
|
|
82
119
|
return next;
|
|
83
120
|
});
|
|
84
121
|
return [...optimisticOnly, ...merged];
|
|
@@ -89,6 +126,12 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
89
126
|
return undefined;
|
|
90
127
|
}
|
|
91
128
|
}, [apiUrl]);
|
|
129
|
+
// Latest scope as a ref so `createThread` (a useCallback that we don't
|
|
130
|
+
// want to depend on scope identity) reads the current value at call
|
|
131
|
+
// time. The scope a new chat inherits is the one in effect when the +
|
|
132
|
+
// button is clicked, not when the hook first mounted.
|
|
133
|
+
const scopeRef = useRef(scope);
|
|
134
|
+
scopeRef.current = scope;
|
|
92
135
|
// Add a client-generated thread to the local list optimistically.
|
|
93
136
|
//
|
|
94
137
|
// Critically, this does NOT `POST /threads` to the server — that path was
|
|
@@ -98,7 +141,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
98
141
|
// sends their first message (`persistSubmittedUserMessage` →
|
|
99
142
|
// `createThread`), so the client doesn't need to pre-create it. This
|
|
100
143
|
// makes the threads table reflect real conversations only.
|
|
101
|
-
const addOptimisticThread = useCallback((id) => {
|
|
144
|
+
const addOptimisticThread = useCallback((id, threadScope) => {
|
|
102
145
|
const now = Date.now();
|
|
103
146
|
const optimistic = {
|
|
104
147
|
id,
|
|
@@ -107,6 +150,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
107
150
|
messageCount: 0,
|
|
108
151
|
createdAt: now,
|
|
109
152
|
updatedAt: now,
|
|
153
|
+
scope: threadScope,
|
|
110
154
|
};
|
|
111
155
|
setThreads((prev) => prev.some((t) => t.id === id) ? prev : [optimistic, ...prev]);
|
|
112
156
|
}, []);
|
|
@@ -148,7 +192,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
148
192
|
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
149
193
|
const id = crypto.randomUUID();
|
|
150
194
|
newlyCreatedRef.current.add(id);
|
|
151
|
-
addOptimisticThread(id);
|
|
195
|
+
addOptimisticThread(id, scopeRef.current ?? null);
|
|
152
196
|
setActiveThreadId(id);
|
|
153
197
|
}
|
|
154
198
|
}
|
|
@@ -162,10 +206,25 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
162
206
|
// clicks "+" but never chats.
|
|
163
207
|
const id = preferredId || crypto.randomUUID();
|
|
164
208
|
newlyCreatedRef.current.add(id);
|
|
165
|
-
addOptimisticThread(id);
|
|
209
|
+
addOptimisticThread(id, scopeRef.current ?? null);
|
|
166
210
|
setActiveThreadId(id);
|
|
167
211
|
return Promise.resolve(id);
|
|
168
212
|
}, [addOptimisticThread]);
|
|
213
|
+
// Drop a thread's scope so it becomes a general (cross-resource) chat.
|
|
214
|
+
// This is the "Detach from <deck>" escape hatch in the UI. The PUT
|
|
215
|
+
// also bumps the thread's updatedAt so it surfaces in the All Chats
|
|
216
|
+
// list right away.
|
|
217
|
+
const detachThread = useCallback(async (threadId) => {
|
|
218
|
+
try {
|
|
219
|
+
await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`, {
|
|
220
|
+
method: "PUT",
|
|
221
|
+
headers: { "Content-Type": "application/json" },
|
|
222
|
+
body: JSON.stringify({ scope: null }),
|
|
223
|
+
});
|
|
224
|
+
setThreads((prev) => prev.map((t) => (t.id === threadId ? { ...t, scope: null } : t)));
|
|
225
|
+
}
|
|
226
|
+
catch { }
|
|
227
|
+
}, [apiUrl]);
|
|
169
228
|
const isNewThread = useCallback((id) => newlyCreatedRef.current.has(id), []);
|
|
170
229
|
const switchThread = useCallback((id) => {
|
|
171
230
|
setActiveThreadId(id);
|
|
@@ -192,12 +251,21 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
192
251
|
return next;
|
|
193
252
|
});
|
|
194
253
|
}, [apiUrl, activeThreadId, createThread]);
|
|
254
|
+
// Ref to look up the latest scope of a known thread inside
|
|
255
|
+
// saveThreadData without making the callback re-create on every
|
|
256
|
+
// setThreads. The thread's scope is owned by createThread /
|
|
257
|
+
// detachThread / fetchThreads — saveThreadData just mirrors it on
|
|
258
|
+
// every save so the server eventually catches up after
|
|
259
|
+
// persistSubmittedUserMessage creates the row sans scope.
|
|
260
|
+
const threadsRef = useRef(threads);
|
|
261
|
+
threadsRef.current = threads;
|
|
195
262
|
const saveThreadData = useCallback(async (id, data) => {
|
|
196
263
|
try {
|
|
264
|
+
const localScope = threadsRef.current.find((t) => t.id === id)?.scope ?? null;
|
|
197
265
|
await fetch(`${apiUrl}/threads/${encodeURIComponent(id)}`, {
|
|
198
266
|
method: "PUT",
|
|
199
267
|
headers: { "Content-Type": "application/json" },
|
|
200
|
-
body: JSON.stringify(data),
|
|
268
|
+
body: JSON.stringify({ ...data, scope: localScope }),
|
|
201
269
|
});
|
|
202
270
|
// Update local thread list metadata. If the thread isn't in our
|
|
203
271
|
// local list yet (an optimistic-only thread that the server just
|
|
@@ -227,6 +295,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
227
295
|
messageCount: data.messageCount ?? 0,
|
|
228
296
|
createdAt: now,
|
|
229
297
|
updatedAt: now,
|
|
298
|
+
scope: scopeRef.current ?? null,
|
|
230
299
|
},
|
|
231
300
|
...prev,
|
|
232
301
|
];
|
|
@@ -255,13 +324,17 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
255
324
|
return null;
|
|
256
325
|
}
|
|
257
326
|
}, [apiUrl]);
|
|
258
|
-
const forkThread = useCallback(async (sourceId) => {
|
|
327
|
+
const forkThread = useCallback(async (sourceId, sourceSnapshot) => {
|
|
259
328
|
const id = crypto.randomUUID();
|
|
260
329
|
try {
|
|
330
|
+
const localScope = threadsRef.current.find((t) => t.id === sourceId)?.scope ?? null;
|
|
331
|
+
const source = sourceSnapshot && sourceSnapshot.messageCount > 0
|
|
332
|
+
? { ...sourceSnapshot, scope: localScope }
|
|
333
|
+
: undefined;
|
|
261
334
|
const res = await fetch(`${apiUrl}/threads/${encodeURIComponent(sourceId)}/fork`, {
|
|
262
335
|
method: "POST",
|
|
263
336
|
headers: { "Content-Type": "application/json" },
|
|
264
|
-
body: JSON.stringify({ id }),
|
|
337
|
+
body: JSON.stringify({ id, ...(source ? { source } : {}) }),
|
|
265
338
|
});
|
|
266
339
|
if (!res.ok) {
|
|
267
340
|
// Surface failures so a click on the Fork button isn't a silent
|
|
@@ -278,6 +351,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
278
351
|
messageCount: thread.messageCount,
|
|
279
352
|
createdAt: thread.createdAt,
|
|
280
353
|
updatedAt: thread.updatedAt,
|
|
354
|
+
scope: thread.scope ?? null,
|
|
281
355
|
},
|
|
282
356
|
...prev,
|
|
283
357
|
]);
|
|
@@ -310,6 +384,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
310
384
|
createThread,
|
|
311
385
|
switchThread,
|
|
312
386
|
deleteThread: removeThread,
|
|
387
|
+
detachThread,
|
|
313
388
|
forkThread,
|
|
314
389
|
saveThreadData,
|
|
315
390
|
generateTitle,
|