@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
|
@@ -7,11 +7,14 @@ import path from "node:path";
|
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import * as Sentry from "@sentry/node";
|
|
9
9
|
import { extractOAuthStateAppId } from "../shared/oauth-state.js";
|
|
10
|
+
import { DEFAULT_WORKSPACE_APP_AUDIENCE, workspaceAppAudienceFromPackageJson, workspaceAppRouteAccessFromPackageJson, } from "../shared/workspace-app-audience.js";
|
|
10
11
|
const DEFAULT_GATEWAY_HOST = "127.0.0.1";
|
|
11
12
|
const DEFAULT_GATEWAY_PORT = 8080;
|
|
12
13
|
const DEFAULT_APP_PORT_START = 8100;
|
|
13
14
|
const PROXY_READY_RETRY_DELAY_MS = 250;
|
|
14
15
|
const APP_RESTART_MAX_DELAY_MS = 10_000;
|
|
16
|
+
const APP_OUTPUT_TAIL_BYTES = 8_000;
|
|
17
|
+
const POLLING_WATCH_INTERVAL_MS = "1000";
|
|
15
18
|
function normalizeOrigin(value) {
|
|
16
19
|
if (!value)
|
|
17
20
|
return undefined;
|
|
@@ -37,6 +40,72 @@ export function shouldEagerStartWorkspaceApps(args = [], env = process.env) {
|
|
|
37
40
|
env.WORKSPACE_EAGER === "1" ||
|
|
38
41
|
env.WORKSPACE_EAGER === "true");
|
|
39
42
|
}
|
|
43
|
+
function readBooleanEnv(value) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
const normalized = value.trim().toLowerCase();
|
|
47
|
+
if (["1", "true", "yes", "on"].includes(normalized))
|
|
48
|
+
return true;
|
|
49
|
+
if (["0", "false", "no", "off"].includes(normalized))
|
|
50
|
+
return false;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Three-way classification of the polling-watcher decision so callers can
|
|
55
|
+
* tell apart "the user explicitly turned this off" (where we want to override
|
|
56
|
+
* any inherited chokidar/TSC env vars from the parent shell) from "we just
|
|
57
|
+
* didn't auto-detect a Builder/Codespaces/Gitpod container" (where the user's
|
|
58
|
+
* own watcher vars should pass through untouched).
|
|
59
|
+
*/
|
|
60
|
+
export function pollingFileWatcherMode(env = process.env, root = process.cwd()) {
|
|
61
|
+
const explicit = readBooleanEnv(env.AGENT_NATIVE_DEV_USE_POLLING) ??
|
|
62
|
+
readBooleanEnv(env.WORKSPACE_USE_POLLING_WATCHER);
|
|
63
|
+
if (explicit === true)
|
|
64
|
+
return "enable";
|
|
65
|
+
if (explicit === false)
|
|
66
|
+
return "disable-explicit";
|
|
67
|
+
const chokidarExplicit = readBooleanEnv(env.CHOKIDAR_USEPOLLING);
|
|
68
|
+
if (chokidarExplicit === true)
|
|
69
|
+
return "enable";
|
|
70
|
+
if (chokidarExplicit === false)
|
|
71
|
+
return "disable-explicit";
|
|
72
|
+
const autoEnable = Boolean(env.BUILDER_IO_DEV_SERVER ||
|
|
73
|
+
env.BUILDER_PROJECT_ID ||
|
|
74
|
+
env.BUILDER_WORKSPACE_ID ||
|
|
75
|
+
env.CODESPACES ||
|
|
76
|
+
env.GITPOD_WORKSPACE_ID ||
|
|
77
|
+
env.REMOTE_CONTAINERS ||
|
|
78
|
+
env.DEVCONTAINER ||
|
|
79
|
+
root.startsWith("/root/app/"));
|
|
80
|
+
return autoEnable ? "enable" : "disable-default";
|
|
81
|
+
}
|
|
82
|
+
export function shouldUsePollingFileWatcher(env = process.env, root = process.cwd()) {
|
|
83
|
+
return pollingFileWatcherMode(env, root) === "enable";
|
|
84
|
+
}
|
|
85
|
+
function devWatcherEnv(env, mode) {
|
|
86
|
+
if (mode === "enable") {
|
|
87
|
+
return {
|
|
88
|
+
...env,
|
|
89
|
+
CHOKIDAR_USEPOLLING: "1",
|
|
90
|
+
CHOKIDAR_INTERVAL: env.CHOKIDAR_INTERVAL ?? POLLING_WATCH_INTERVAL_MS,
|
|
91
|
+
TSC_WATCHFILE: env.TSC_WATCHFILE ?? "DynamicPriorityPolling",
|
|
92
|
+
TSC_WATCHDIRECTORY: env.TSC_WATCHDIRECTORY ?? "DynamicPriorityPolling",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (mode === "disable-explicit") {
|
|
96
|
+
// The user explicitly turned polling off (AGENT_NATIVE_DEV_USE_POLLING=0
|
|
97
|
+
// / WORKSPACE_USE_POLLING_WATCHER=0 / CHOKIDAR_USEPOLLING=0). Strip the
|
|
98
|
+
// watcher vars from the child env so an inherited parent-shell
|
|
99
|
+
// CHOKIDAR_USEPOLLING=1 (or stale TSC_WATCH* override) can't silently
|
|
100
|
+
// re-enable polling against the user's explicit wish.
|
|
101
|
+
const { CHOKIDAR_USEPOLLING: _polling, CHOKIDAR_INTERVAL: _interval, TSC_WATCHFILE: _watchFile, TSC_WATCHDIRECTORY: _watchDir, ...rest } = env;
|
|
102
|
+
return rest;
|
|
103
|
+
}
|
|
104
|
+
// mode === "disable-default": no explicit signal either way. Pass the env
|
|
105
|
+
// through unchanged so legitimate user overrides like
|
|
106
|
+
// TSC_WATCHFILE=UseFsEventsWithFallbackDynamicPolling survive.
|
|
107
|
+
return env;
|
|
108
|
+
}
|
|
40
109
|
export function initialWorkspaceAppIds(apps, defaultApp, eager, startDefault = true) {
|
|
41
110
|
if (eager)
|
|
42
111
|
return apps.map((app) => app.id);
|
|
@@ -80,9 +149,15 @@ function discoverApps(appsDir, appPortStart) {
|
|
|
80
149
|
const pkg = readJson(path.join(dir, "package.json"));
|
|
81
150
|
if (!pkg)
|
|
82
151
|
return null;
|
|
152
|
+
const routeAccess = workspaceAppRouteAccessFromPackageJson(pkg);
|
|
83
153
|
return {
|
|
84
154
|
id: entry.name,
|
|
85
155
|
name: pkg.displayName || pkg.name || entry.name,
|
|
156
|
+
description: typeof pkg.description === "string" ? pkg.description : "",
|
|
157
|
+
audience: workspaceAppAudienceFromPackageJson(pkg) ??
|
|
158
|
+
DEFAULT_WORKSPACE_APP_AUDIENCE,
|
|
159
|
+
publicPaths: routeAccess.publicPaths ?? [],
|
|
160
|
+
protectedPaths: routeAccess.protectedPaths ?? [],
|
|
86
161
|
dir,
|
|
87
162
|
port: appPortStart,
|
|
88
163
|
};
|
|
@@ -101,14 +176,33 @@ function compareApps(a, b) {
|
|
|
101
176
|
function isChildDevServerUrlLine(line) {
|
|
102
177
|
return /^\s*->\s+(?:Local|Network):\s+https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):\d+(?:\/\S*)?\s*$/i.test(line.replace(/\u279c/g, "->"));
|
|
103
178
|
}
|
|
104
|
-
function
|
|
179
|
+
function formatAppOutput(chunk) {
|
|
105
180
|
const lines = String(chunk)
|
|
106
181
|
.split(/\r?\n/)
|
|
107
182
|
.filter(Boolean)
|
|
108
183
|
.filter((line) => !isChildDevServerUrlLine(line));
|
|
109
|
-
|
|
184
|
+
return lines.length === 0 ? "" : lines.join("\n") + "\n";
|
|
185
|
+
}
|
|
186
|
+
function appendAppOutputTail(app, output) {
|
|
187
|
+
if (!output)
|
|
110
188
|
return;
|
|
111
|
-
|
|
189
|
+
const next = `${app.outputTail ?? ""}${output}`;
|
|
190
|
+
app.outputTail =
|
|
191
|
+
next.length > APP_OUTPUT_TAIL_BYTES
|
|
192
|
+
? next.slice(-APP_OUTPUT_TAIL_BYTES)
|
|
193
|
+
: next;
|
|
194
|
+
}
|
|
195
|
+
function pipeAppOutput(prefix, chunk, write) {
|
|
196
|
+
const output = formatAppOutput(chunk);
|
|
197
|
+
if (!output)
|
|
198
|
+
return "";
|
|
199
|
+
const prefixed = output
|
|
200
|
+
.trimEnd()
|
|
201
|
+
.split(/\n/)
|
|
202
|
+
.map((line) => `${prefix} ${line}`)
|
|
203
|
+
.join("\n");
|
|
204
|
+
write(`${prefixed}\n`);
|
|
205
|
+
return output;
|
|
112
206
|
}
|
|
113
207
|
function firstPathSegment(url) {
|
|
114
208
|
if (!url)
|
|
@@ -125,6 +219,10 @@ function firstPathSegment(url) {
|
|
|
125
219
|
function appRestartDelay(attempts) {
|
|
126
220
|
return Math.min(1_000 * 2 ** Math.max(0, attempts - 1), APP_RESTART_MAX_DELAY_MS);
|
|
127
221
|
}
|
|
222
|
+
function formatProxyReadyTimeout(timeoutMs) {
|
|
223
|
+
const seconds = timeoutMs / 1_000;
|
|
224
|
+
return Number.isInteger(seconds) ? `${seconds}s` : `${timeoutMs}ms`;
|
|
225
|
+
}
|
|
128
226
|
function probePort(port, timeoutMs = 1_000) {
|
|
129
227
|
return new Promise((resolve) => {
|
|
130
228
|
const socket = new net.Socket();
|
|
@@ -160,34 +258,51 @@ function wantsHtml(req) {
|
|
|
160
258
|
}
|
|
161
259
|
function renderStartingApp(app) {
|
|
162
260
|
const escapedName = escapeHtml(app.name || app.id);
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
261
|
+
const failure = app.lastFailure;
|
|
262
|
+
const retryDelayMs = failure
|
|
263
|
+
? Math.max(1_000, failure.nextRetryAt - Date.now() + 250)
|
|
264
|
+
: 900;
|
|
265
|
+
const refreshSeconds = failure
|
|
266
|
+
? Math.max(1, Math.ceil(retryDelayMs / 1_000))
|
|
267
|
+
: 1;
|
|
268
|
+
const refreshScriptDelay = failure ? retryDelayMs : 900;
|
|
269
|
+
const title = failure
|
|
270
|
+
? `${failure.installing ? "Install failed" : "App failed to start"}: ${escapedName}`
|
|
271
|
+
: `Starting ${escapedName}`;
|
|
272
|
+
const message = failure
|
|
273
|
+
? `The workspace gateway will retry in ${Math.max(1, Math.ceil((failure.nextRetryAt - Date.now()) / 1_000))}s. Fix the error below or stop the server with Ctrl+C.`
|
|
274
|
+
: app.installing
|
|
275
|
+
? "The workspace gateway is installing this app's dependencies before starting it."
|
|
276
|
+
: "The workspace gateway is waking this app's dev server.";
|
|
277
|
+
const failureOutput = failure?.output.trim();
|
|
166
278
|
return `<!doctype html>
|
|
167
279
|
<html>
|
|
168
280
|
<head>
|
|
169
281
|
<meta charset="utf-8" />
|
|
170
282
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
171
|
-
<meta http-equiv="refresh" content="
|
|
172
|
-
<title
|
|
283
|
+
<meta http-equiv="refresh" content="${refreshSeconds}" />
|
|
284
|
+
<title>${title}</title>
|
|
173
285
|
<meta name="color-scheme" content="light dark" />
|
|
174
286
|
<style>
|
|
175
|
-
:root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; }
|
|
176
|
-
@media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; } }
|
|
287
|
+
:root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; --danger: #dc2626; --code-bg: #171717; --code-fg: #fafafa; }
|
|
288
|
+
@media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; --danger: #f87171; --code-bg: #171717; --code-fg: #f5f5f5; } }
|
|
177
289
|
body { min-height: 100vh; margin: 0; display: grid; place-items: center; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--fg); }
|
|
178
|
-
main { width: min(
|
|
290
|
+
main { width: min(680px, calc(100vw - 48px)); }
|
|
179
291
|
.bar { height: 3px; overflow: hidden; border-radius: 999px; background: var(--bar-bg); }
|
|
180
292
|
.bar::before { content: ""; display: block; height: 100%; width: 42%; border-radius: inherit; background: var(--bar-fill); animation: load 1s ease-in-out infinite; }
|
|
293
|
+
main.failed .bar::before { width: 100%; background: var(--danger); animation: none; }
|
|
181
294
|
p { color: var(--muted); }
|
|
295
|
+
pre { max-height: min(46vh, 360px); overflow: auto; margin-top: 20px; padding: 14px 16px; border-radius: 8px; background: var(--code-bg); color: var(--code-fg); font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; white-space: pre-wrap; word-break: break-word; }
|
|
182
296
|
@keyframes load { 0% { transform: translateX(-105%); } 100% { transform: translateX(245%); } }
|
|
183
297
|
</style>
|
|
184
|
-
<script>setTimeout(() => window.location.reload(),
|
|
298
|
+
<script>setTimeout(() => window.location.reload(), ${JSON.stringify(refreshScriptDelay)});</script>
|
|
185
299
|
</head>
|
|
186
300
|
<body>
|
|
187
|
-
<main>
|
|
301
|
+
<main class="${failure ? "failed" : ""}">
|
|
188
302
|
<div class="bar"></div>
|
|
189
|
-
<h1
|
|
303
|
+
<h1>${title}</h1>
|
|
190
304
|
<p>${escapeHtml(message)}</p>
|
|
305
|
+
${failureOutput ? `<pre>${escapeHtml(failureOutput)}</pre>` : ""}
|
|
191
306
|
</main>
|
|
192
307
|
</body>
|
|
193
308
|
</html>`;
|
|
@@ -246,7 +361,7 @@ function hasLocalBin(dir, command) {
|
|
|
246
361
|
fs.existsSync(path.join(binDir, `${command}.cmd`)) ||
|
|
247
362
|
fs.existsSync(path.join(binDir, `${command}.ps1`)));
|
|
248
363
|
}
|
|
249
|
-
export function runWorkspaceDev(options = {}) {
|
|
364
|
+
export async function runWorkspaceDev(options = {}) {
|
|
250
365
|
const args = options.args ?? process.argv.slice(2);
|
|
251
366
|
const env = options.env ?? process.env;
|
|
252
367
|
const root = options.root ?? process.cwd();
|
|
@@ -260,12 +375,50 @@ export function runWorkspaceDev(options = {}) {
|
|
|
260
375
|
const appPortStart = Number(env.WORKSPACE_APP_PORT_START || DEFAULT_APP_PORT_START);
|
|
261
376
|
const forceVite = env.WORKSPACE_VITE_FORCE === "1";
|
|
262
377
|
const eager = shouldEagerStartWorkspaceApps(args, env);
|
|
378
|
+
const pollingMode = pollingFileWatcherMode(env, root);
|
|
379
|
+
const usePollingFileWatcher = pollingMode === "enable";
|
|
263
380
|
const proxyReadyTimeoutMs = Number(env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000);
|
|
264
381
|
let gatewayUrl = `http://${gatewayHost}:${requestedPort}`;
|
|
265
382
|
const apps = discoverApps(appsDir, appPortStart);
|
|
266
383
|
if (apps.length === 0) {
|
|
267
384
|
throw new Error("[workspace] No apps found under ./apps");
|
|
268
385
|
}
|
|
386
|
+
// Probe each app's proposed port to see if something else on the host
|
|
387
|
+
// already owns it. Vite is spawned with `--strictPort` (so the gateway can
|
|
388
|
+
// route /<appId> to a known port), which fails hard on EADDRINUSE — without
|
|
389
|
+
// this probe a single conflicting process on 8100/8101/... kills the
|
|
390
|
+
// workspace before the dev server prints anything useful.
|
|
391
|
+
function probePortAvailable(port) {
|
|
392
|
+
return new Promise((resolve) => {
|
|
393
|
+
const probe = net.createServer();
|
|
394
|
+
probe.once("error", () => resolve(false));
|
|
395
|
+
probe.once("listening", () => {
|
|
396
|
+
probe.close(() => resolve(true));
|
|
397
|
+
});
|
|
398
|
+
probe.listen(port, gatewayHost);
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
async function reserveAppPort(start, excluded) {
|
|
402
|
+
for (let port = start; port < start + 100; port++) {
|
|
403
|
+
if (excluded.has(port))
|
|
404
|
+
continue;
|
|
405
|
+
if (port === requestedPort)
|
|
406
|
+
continue;
|
|
407
|
+
if (await probePortAvailable(port))
|
|
408
|
+
return port;
|
|
409
|
+
}
|
|
410
|
+
throw new Error(`[workspace] No available port found between ${start} and ${start + 100}`);
|
|
411
|
+
}
|
|
412
|
+
const reservedAppPorts = new Set();
|
|
413
|
+
for (const app of apps) {
|
|
414
|
+
const original = app.port;
|
|
415
|
+
const port = await reserveAppPort(original, reservedAppPorts);
|
|
416
|
+
if (port !== original) {
|
|
417
|
+
stdout.write(`[workspace] Port ${original} unavailable for /${app.id}, using ${port}\n`);
|
|
418
|
+
}
|
|
419
|
+
app.port = port;
|
|
420
|
+
reservedAppPorts.add(port);
|
|
421
|
+
}
|
|
269
422
|
const appById = new Map(apps.map((app) => [app.id, app]));
|
|
270
423
|
const explicitDefaultApp = env.WORKSPACE_DEFAULT_APP && appById.has(env.WORKSPACE_DEFAULT_APP)
|
|
271
424
|
? env.WORKSPACE_DEFAULT_APP
|
|
@@ -276,6 +429,9 @@ export function runWorkspaceDev(options = {}) {
|
|
|
276
429
|
let syncTimer;
|
|
277
430
|
let shuttingDown = false;
|
|
278
431
|
let workspaceStarted = false;
|
|
432
|
+
if (usePollingFileWatcher) {
|
|
433
|
+
stdout.write(`[workspace] Using polling file watchers (${POLLING_WATCH_INTERVAL_MS}ms) to avoid remote-container inotify limits.\n`);
|
|
434
|
+
}
|
|
279
435
|
let readyResolve;
|
|
280
436
|
const ready = new Promise((resolve) => {
|
|
281
437
|
readyResolve = resolve;
|
|
@@ -284,22 +440,29 @@ export function runWorkspaceDev(options = {}) {
|
|
|
284
440
|
return JSON.stringify(apps.map((workspaceApp) => ({
|
|
285
441
|
id: workspaceApp.id,
|
|
286
442
|
name: workspaceApp.name,
|
|
443
|
+
description: workspaceApp.description,
|
|
287
444
|
path: `/${workspaceApp.id}`,
|
|
445
|
+
audience: workspaceApp.audience,
|
|
446
|
+
publicPaths: workspaceApp.publicPaths,
|
|
447
|
+
protectedPaths: workspaceApp.protectedPaths,
|
|
288
448
|
})));
|
|
289
449
|
}
|
|
290
|
-
function syncApps() {
|
|
450
|
+
async function syncApps() {
|
|
291
451
|
const discovered = discoverApps(appsDir, appPortStart);
|
|
292
452
|
for (const app of discovered) {
|
|
293
453
|
const existing = appById.get(app.id);
|
|
294
454
|
if (existing) {
|
|
295
455
|
existing.name = app.name;
|
|
456
|
+
existing.description = app.description;
|
|
457
|
+
existing.audience = app.audience;
|
|
458
|
+
existing.publicPaths = app.publicPaths;
|
|
459
|
+
existing.protectedPaths = app.protectedPaths;
|
|
296
460
|
existing.dir = app.dir;
|
|
297
461
|
continue;
|
|
298
462
|
}
|
|
299
463
|
const usedPorts = new Set(apps.map((existingApp) => existingApp.port));
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
port++;
|
|
464
|
+
const port = await reserveAppPort(appPortStart, usedPorts);
|
|
465
|
+
reservedAppPorts.add(port);
|
|
303
466
|
const next = { ...app, port };
|
|
304
467
|
apps.push(next);
|
|
305
468
|
apps.sort(compareApps);
|
|
@@ -310,7 +473,11 @@ export function runWorkspaceDev(options = {}) {
|
|
|
310
473
|
function scheduleSync() {
|
|
311
474
|
if (syncTimer)
|
|
312
475
|
clearTimeout(syncTimer);
|
|
313
|
-
syncTimer = setTimeout(
|
|
476
|
+
syncTimer = setTimeout(() => {
|
|
477
|
+
void syncApps().catch((err) => {
|
|
478
|
+
stderr.write(`[workspace] App sync failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
479
|
+
});
|
|
480
|
+
}, 400);
|
|
314
481
|
}
|
|
315
482
|
function appForRequest(req) {
|
|
316
483
|
const params = new URL(req.url || "/", "http://workspace.local")
|
|
@@ -334,10 +501,10 @@ export function runWorkspaceDev(options = {}) {
|
|
|
334
501
|
function startApp(app) {
|
|
335
502
|
if (app.process && !app.process.killed)
|
|
336
503
|
return;
|
|
337
|
-
if (app.restartTimer)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
504
|
+
if (app.restartTimer)
|
|
505
|
+
return;
|
|
506
|
+
app.lastFailure = undefined;
|
|
507
|
+
app.outputTail = undefined;
|
|
341
508
|
const basePath = `/${app.id}`;
|
|
342
509
|
const shouldInstall = !app.installAttempted && !hasLocalBin(app.dir, "vite");
|
|
343
510
|
const childArgs = shouldInstall
|
|
@@ -360,19 +527,26 @@ export function runWorkspaceDev(options = {}) {
|
|
|
360
527
|
const child = spawnProcess("pnpm", childArgs, {
|
|
361
528
|
cwd: root,
|
|
362
529
|
stdio: ["ignore", "pipe", "pipe"],
|
|
363
|
-
env: {
|
|
530
|
+
env: devWatcherEnv({
|
|
364
531
|
...env,
|
|
365
532
|
APP_NAME: app.id,
|
|
366
533
|
AGENT_NATIVE_WORKSPACE: "1",
|
|
367
534
|
AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson(),
|
|
535
|
+
AGENT_NATIVE_WORKSPACE_APP_AUDIENCE: app.audience,
|
|
536
|
+
AGENT_NATIVE_WORKSPACE_APP_PUBLIC_PATHS: JSON.stringify(app.publicPaths),
|
|
537
|
+
AGENT_NATIVE_WORKSPACE_APP_PROTECTED_PATHS: JSON.stringify(app.protectedPaths),
|
|
368
538
|
APP_BASE_PATH: basePath,
|
|
369
539
|
VITE_AGENT_NATIVE_WORKSPACE: "1",
|
|
540
|
+
VITE_AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson(),
|
|
541
|
+
VITE_AGENT_NATIVE_WORKSPACE_APP_AUDIENCE: app.audience,
|
|
542
|
+
VITE_AGENT_NATIVE_WORKSPACE_APP_PUBLIC_PATHS: JSON.stringify(app.publicPaths),
|
|
543
|
+
VITE_AGENT_NATIVE_WORKSPACE_APP_PROTECTED_PATHS: JSON.stringify(app.protectedPaths),
|
|
370
544
|
VITE_APP_BASE_PATH: basePath,
|
|
371
545
|
VITE_WORKSPACE_OAUTH_ORIGIN: workspaceOAuthOrigin(env, gatewayUrl),
|
|
372
546
|
VITE_WORKSPACE_GATEWAY_URL: gatewayUrl,
|
|
373
547
|
PORT: String(app.port),
|
|
374
548
|
WORKSPACE_GATEWAY_URL: gatewayUrl,
|
|
375
|
-
},
|
|
549
|
+
}, pollingMode),
|
|
376
550
|
});
|
|
377
551
|
app.process = child;
|
|
378
552
|
app.installing = shouldInstall;
|
|
@@ -382,18 +556,20 @@ export function runWorkspaceDev(options = {}) {
|
|
|
382
556
|
}, 5_000);
|
|
383
557
|
stableTimer.unref();
|
|
384
558
|
child.stdout?.on("data", (chunk) => {
|
|
385
|
-
pipeAppOutput(prefix, chunk, (value) => stdout.write(value));
|
|
559
|
+
appendAppOutputTail(app, pipeAppOutput(prefix, chunk, (value) => stdout.write(value)));
|
|
386
560
|
});
|
|
387
561
|
child.stderr?.on("data", (chunk) => {
|
|
388
|
-
pipeAppOutput(prefix, chunk, (value) => stderr.write(value));
|
|
562
|
+
appendAppOutputTail(app, pipeAppOutput(prefix, chunk, (value) => stderr.write(value)));
|
|
389
563
|
});
|
|
390
|
-
child.on("exit", (code) => {
|
|
564
|
+
child.on("exit", (code, signal) => {
|
|
391
565
|
clearTimeout(stableTimer);
|
|
392
566
|
const wasInstalling = app.installing;
|
|
393
567
|
app.process = undefined;
|
|
394
568
|
app.installing = false;
|
|
395
569
|
app.ready = false;
|
|
396
570
|
app.readinessProbe = undefined;
|
|
571
|
+
if (app.restartTimer)
|
|
572
|
+
return;
|
|
397
573
|
if (code === 0 || shuttingDown) {
|
|
398
574
|
if (wasInstalling && code === 0 && !shuttingDown) {
|
|
399
575
|
app.installAttempted = true;
|
|
@@ -403,15 +579,57 @@ export function runWorkspaceDev(options = {}) {
|
|
|
403
579
|
}
|
|
404
580
|
if (wasInstalling)
|
|
405
581
|
app.installAttempted = false;
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
app.
|
|
411
|
-
|
|
412
|
-
}
|
|
413
|
-
|
|
582
|
+
scheduleAppRestart(app, {
|
|
583
|
+
code,
|
|
584
|
+
signal,
|
|
585
|
+
installing: wasInstalling,
|
|
586
|
+
output: app.outputTail ?? "",
|
|
587
|
+
logMessage: `exited with code ${code}`,
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
function scheduleAppRestart(app, input) {
|
|
592
|
+
if (shuttingDown || app.restartTimer)
|
|
593
|
+
return;
|
|
594
|
+
if (input.installing)
|
|
595
|
+
app.installAttempted = false;
|
|
596
|
+
app.restartAttempts = (app.restartAttempts ?? 0) + 1;
|
|
597
|
+
const delay = appRestartDelay(app.restartAttempts);
|
|
598
|
+
const nextRetryAt = Date.now() + delay;
|
|
599
|
+
app.lastFailure = {
|
|
600
|
+
code: input.code,
|
|
601
|
+
signal: input.signal,
|
|
602
|
+
at: Date.now(),
|
|
603
|
+
installing: input.installing,
|
|
604
|
+
output: input.output,
|
|
605
|
+
nextRetryAt,
|
|
606
|
+
};
|
|
607
|
+
stderr.write(`[${app.id}] ${input.logMessage}; retrying in ${Math.round(delay / 1000)}s\n`);
|
|
608
|
+
app.restartTimer = setTimeout(() => {
|
|
609
|
+
app.restartTimer = undefined;
|
|
610
|
+
startApp(app);
|
|
611
|
+
}, delay);
|
|
612
|
+
app.restartTimer.unref();
|
|
613
|
+
}
|
|
614
|
+
function failAppStartupTimeout(app) {
|
|
615
|
+
if (app.installing || app.ready || app.restartTimer)
|
|
616
|
+
return;
|
|
617
|
+
const timeout = formatProxyReadyTimeout(proxyReadyTimeoutMs);
|
|
618
|
+
const message = `Timed out waiting ${timeout} for /${app.id} to accept ` +
|
|
619
|
+
`connections on 127.0.0.1:${app.port}.`;
|
|
620
|
+
const output = [message, app.outputTail?.trim()]
|
|
621
|
+
.filter(Boolean)
|
|
622
|
+
.join("\n\nLast child output:\n");
|
|
623
|
+
app.ready = false;
|
|
624
|
+
app.readinessProbe = undefined;
|
|
625
|
+
scheduleAppRestart(app, {
|
|
626
|
+
code: null,
|
|
627
|
+
signal: null,
|
|
628
|
+
installing: false,
|
|
629
|
+
output,
|
|
630
|
+
logMessage: message,
|
|
414
631
|
});
|
|
632
|
+
app.process?.kill("SIGTERM");
|
|
415
633
|
}
|
|
416
634
|
function forwardedProto(req) {
|
|
417
635
|
return (firstHeaderValue(req.headers["x-forwarded-proto"]) ||
|
|
@@ -439,12 +657,15 @@ export function runWorkspaceDev(options = {}) {
|
|
|
439
657
|
return false;
|
|
440
658
|
}
|
|
441
659
|
function ensureReadinessProbe(app) {
|
|
442
|
-
if (app.ready || app.readinessProbe)
|
|
660
|
+
if (app.ready || app.readinessProbe || app.installing)
|
|
443
661
|
return;
|
|
444
662
|
app.readinessProbe = waitForPort(app.port, Date.now() + proxyReadyTimeoutMs)
|
|
445
663
|
.then((ready) => {
|
|
446
|
-
if (ready)
|
|
664
|
+
if (ready) {
|
|
447
665
|
app.ready = true;
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
failAppStartupTimeout(app);
|
|
448
669
|
})
|
|
449
670
|
.finally(() => {
|
|
450
671
|
app.readinessProbe = undefined;
|
|
@@ -496,6 +717,7 @@ export function runWorkspaceDev(options = {}) {
|
|
|
496
717
|
// Node keeps the request body paused until pipe() attaches.
|
|
497
718
|
void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then((ready) => {
|
|
498
719
|
if (!ready) {
|
|
720
|
+
failAppStartupTimeout(app);
|
|
499
721
|
if (!res.headersSent) {
|
|
500
722
|
res.writeHead(502, { "content-type": "text/plain" });
|
|
501
723
|
res.end(`App "${app.id}" is not ready yet: connect ECONNREFUSED 127.0.0.1:${app.port}`);
|
|
@@ -513,6 +735,7 @@ export function runWorkspaceDev(options = {}) {
|
|
|
513
735
|
startApp(app);
|
|
514
736
|
void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then((ready) => {
|
|
515
737
|
if (!ready) {
|
|
738
|
+
failAppStartupTimeout(app);
|
|
516
739
|
socket.destroy();
|
|
517
740
|
return;
|
|
518
741
|
}
|
|
@@ -572,7 +795,9 @@ export function runWorkspaceDev(options = {}) {
|
|
|
572
795
|
catch (err) {
|
|
573
796
|
handleWatcherError(err);
|
|
574
797
|
}
|
|
575
|
-
setInterval(
|
|
798
|
+
setInterval(() => {
|
|
799
|
+
void syncApps().catch(() => { });
|
|
800
|
+
}, 2_000).unref();
|
|
576
801
|
}
|
|
577
802
|
function openBrowser(url) {
|
|
578
803
|
if (options.openBrowser === false || env.WORKSPACE_NO_OPEN === "1")
|
|
@@ -589,11 +814,11 @@ export function runWorkspaceDev(options = {}) {
|
|
|
589
814
|
});
|
|
590
815
|
child.unref();
|
|
591
816
|
}
|
|
592
|
-
const server = http.createServer((req, res) => {
|
|
817
|
+
const server = http.createServer(async (req, res) => {
|
|
593
818
|
const parsedUrl = new URL(req.url || "/", "http://workspace.local");
|
|
594
819
|
const pathname = parsedUrl.pathname;
|
|
595
820
|
if (pathname === "/" || pathname === "/index.html") {
|
|
596
|
-
syncApps();
|
|
821
|
+
await syncApps().catch(() => { });
|
|
597
822
|
const currentDefaultApp = explicitDefaultApp && appById.has(explicitDefaultApp)
|
|
598
823
|
? explicitDefaultApp
|
|
599
824
|
: appById.has("dispatch")
|
|
@@ -613,12 +838,16 @@ export function runWorkspaceDev(options = {}) {
|
|
|
613
838
|
return;
|
|
614
839
|
}
|
|
615
840
|
if (pathname === "/_workspace/apps") {
|
|
616
|
-
syncApps();
|
|
841
|
+
await syncApps().catch(() => { });
|
|
617
842
|
res.writeHead(200, { "content-type": "application/json" });
|
|
618
843
|
res.end(JSON.stringify(apps.map((app) => ({
|
|
619
844
|
id: app.id,
|
|
620
845
|
name: app.name,
|
|
846
|
+
description: app.description,
|
|
621
847
|
path: `/${app.id}`,
|
|
848
|
+
audience: app.audience,
|
|
849
|
+
publicPaths: app.publicPaths,
|
|
850
|
+
protectedPaths: app.protectedPaths,
|
|
622
851
|
port: app.port,
|
|
623
852
|
running: Boolean(app.process && !app.process.killed),
|
|
624
853
|
}))));
|
|
@@ -626,7 +855,7 @@ export function runWorkspaceDev(options = {}) {
|
|
|
626
855
|
}
|
|
627
856
|
let app = appForRequest(req);
|
|
628
857
|
if (!app) {
|
|
629
|
-
syncApps();
|
|
858
|
+
await syncApps().catch(() => { });
|
|
630
859
|
app = appForRequest(req);
|
|
631
860
|
}
|
|
632
861
|
if (!app) {
|
|
@@ -707,12 +936,9 @@ function isDirectRun() {
|
|
|
707
936
|
}
|
|
708
937
|
}
|
|
709
938
|
if (isDirectRun()) {
|
|
710
|
-
|
|
711
|
-
runWorkspaceDev({ args: process.argv.slice(2) });
|
|
712
|
-
}
|
|
713
|
-
catch (err) {
|
|
939
|
+
runWorkspaceDev({ args: process.argv.slice(2) }).catch((err) => {
|
|
714
940
|
console.error(err instanceof Error ? err.message : String(err));
|
|
715
941
|
process.exit(1);
|
|
716
|
-
}
|
|
942
|
+
});
|
|
717
943
|
}
|
|
718
944
|
//# sourceMappingURL=workspace-dev.js.map
|