@agent-native/core 0.47.1 → 0.48.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/bin/agent-native.js +41 -0
- package/dist/a2a/handlers.js +2 -2
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.js +2 -2
- package/dist/a2a/server.js.map +1 -1
- package/dist/action.d.ts +43 -2
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/context-xray/actions/context-evict.d.ts +7 -1
- package/dist/agent/context-xray/actions/context-evict.d.ts.map +1 -1
- package/dist/agent/context-xray/actions/context-manifest-get.d.ts +4 -1
- package/dist/agent/context-xray/actions/context-manifest-get.d.ts.map +1 -1
- package/dist/agent/context-xray/actions/context-pin.d.ts +7 -1
- package/dist/agent/context-xray/actions/context-pin.d.ts.map +1 -1
- package/dist/agent/context-xray/actions/context-report.d.ts +12 -1
- package/dist/agent/context-xray/actions/context-report.d.ts.map +1 -1
- package/dist/agent/context-xray/actions/context-restore.d.ts +7 -1
- package/dist/agent/context-xray/actions/context-restore.d.ts.map +1 -1
- package/dist/agent/context-xray/apply-directives.d.ts.map +1 -1
- package/dist/agent/context-xray/apply-directives.js.map +1 -1
- package/dist/agent/context-xray/schema.d.ts +10 -10
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +26 -3
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +47 -8
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/output-tokens.d.ts +1 -1
- package/dist/agent/engine/output-tokens.d.ts.map +1 -1
- package/dist/agent/engine/output-tokens.js +6 -2
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +7 -4
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +19 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js +6 -0
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +22 -14
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +113 -8
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +19 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +253 -39
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +10 -0
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +1 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +36 -9
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +47 -4
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +154 -4
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +57 -2
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +3 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent-web/generator.d.ts +3 -3
- package/dist/appearance/actions/change-appearance.d.ts +6 -1
- package/dist/appearance/actions/change-appearance.d.ts.map +1 -1
- package/dist/application-state/handlers.d.ts +2 -2
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +17 -0
- package/dist/application-state/store.js.map +1 -1
- package/dist/catalog.json +2 -1
- package/dist/cli/code-agent-commands.d.ts.map +1 -1
- package/dist/cli/code-agent-commands.js +2 -0
- package/dist/cli/code-agent-commands.js.map +1 -1
- package/dist/cli/code-agent-connector.js +7 -13
- package/dist/cli/code-agent-connector.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts +54 -2
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +504 -48
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/code-agent-runs.d.ts +13 -0
- package/dist/cli/code-agent-runs.d.ts.map +1 -1
- package/dist/cli/code-agent-runs.js +36 -0
- package/dist/cli/code-agent-runs.js.map +1 -1
- package/dist/cli/code.js +59 -5
- package/dist/cli/code.js.map +1 -1
- package/dist/cli/connect.js +141 -3
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.js +476 -46
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.js +298 -179
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +29 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +17 -2
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +310 -1732
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +1 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +1 -1
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/HighlightedCodeBlock.d.ts +40 -0
- package/dist/client/HighlightedCodeBlock.d.ts.map +1 -0
- package/dist/client/HighlightedCodeBlock.js +110 -0
- package/dist/client/HighlightedCodeBlock.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +8 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/PoweredByBadge.d.ts +2 -2
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +1 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/StarfieldBackground.d.ts.map +1 -1
- package/dist/client/StarfieldBackground.js +10 -5
- package/dist/client/StarfieldBackground.js.map +1 -1
- package/dist/client/Turnstile.d.ts +1 -1
- package/dist/client/Turnstile.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +3 -2
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +13 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts +99 -0
- package/dist/client/app-providers.d.ts.map +1 -0
- package/dist/client/app-providers.js +19 -0
- package/dist/client/app-providers.js.map +1 -0
- package/dist/client/assistant-ui-recovery.d.ts +1 -1
- package/dist/client/auth-redirect-url.d.ts +1 -1
- package/dist/client/auth-redirect-url.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +0 -19
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +141 -55
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +1 -1
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/FileTreeBlock.js +1 -1
- package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.js +5 -3
- package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/client/blocks/library/annotation-rail.d.ts +5 -4
- package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
- package/dist/client/blocks/library/annotation-rail.js +22 -3
- package/dist/client/blocks/library/annotation-rail.js.map +1 -1
- package/dist/client/blocks/library/diagram.js +1 -1
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/diff.config.d.ts +3 -2
- package/dist/client/blocks/library/diff.config.d.ts.map +1 -1
- package/dist/client/blocks/library/diff.config.js +4 -3
- package/dist/client/blocks/library/diff.config.js.map +1 -1
- package/dist/client/blocks/library/question-form.d.ts.map +1 -1
- package/dist/client/blocks/library/question-form.js +2 -1
- package/dist/client/blocks/library/question-form.js.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.d.ts +1 -1
- package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe.js +1 -1
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/chat/attachment-adapters.d.ts +58 -0
- package/dist/client/chat/attachment-adapters.d.ts.map +1 -0
- package/dist/client/chat/attachment-adapters.js +331 -0
- package/dist/client/chat/attachment-adapters.js.map +1 -0
- package/dist/client/chat/index.d.ts +13 -0
- package/dist/client/chat/index.d.ts.map +1 -0
- package/dist/client/chat/index.js +13 -0
- package/dist/client/chat/index.js.map +1 -0
- package/dist/client/chat/markdown-renderer.d.ts +49 -0
- package/dist/client/chat/markdown-renderer.d.ts.map +1 -0
- package/dist/client/chat/markdown-renderer.js +391 -0
- package/dist/client/chat/markdown-renderer.js.map +1 -0
- package/dist/client/chat/message-components.d.ts +35 -0
- package/dist/client/chat/message-components.d.ts.map +1 -0
- package/dist/client/chat/message-components.js +452 -0
- package/dist/client/chat/message-components.js.map +1 -0
- package/dist/client/chat/repo-helpers.d.ts +41 -0
- package/dist/client/chat/repo-helpers.d.ts.map +1 -0
- package/dist/client/chat/repo-helpers.js +61 -0
- package/dist/client/chat/repo-helpers.js.map +1 -0
- package/dist/client/chat/run-recovery.d.ts +41 -0
- package/dist/client/chat/run-recovery.d.ts.map +1 -0
- package/dist/client/chat/run-recovery.js +348 -0
- package/dist/client/chat/run-recovery.js.map +1 -0
- package/dist/client/chat/tool-call-display.d.ts +34 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -0
- package/dist/client/chat/tool-call-display.js +284 -0
- package/dist/client/chat/tool-call-display.js.map +1 -0
- package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/code-agent-chat-adapter.js +20 -0
- package/dist/client/code-agent-chat-adapter.js.map +1 -1
- package/dist/client/collab/index.d.ts +10 -0
- package/dist/client/collab/index.d.ts.map +1 -0
- package/dist/client/collab/index.js +10 -0
- package/dist/client/collab/index.js.map +1 -0
- package/dist/client/components/AgentPresenceChip.d.ts +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
- package/dist/client/components/ApiKeySettings.d.ts +1 -1
- package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
- package/dist/client/components/CodeAgentIndicator.d.ts +1 -1
- package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts +1 -1
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +6 -26
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +8 -2
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +21 -9
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts +2 -2
- package/dist/client/composer/VoiceButton.d.ts.map +1 -1
- package/dist/client/composer/index.d.ts +1 -1
- package/dist/client/composer/index.d.ts.map +1 -1
- package/dist/client/composer/index.js +1 -1
- package/dist/client/composer/index.js.map +1 -1
- package/dist/client/composer/use-skills.d.ts +1 -1
- package/dist/client/context-xray/ContextMeter.d.ts +1 -1
- package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
- package/dist/client/context-xray/ContextMeter.js +3 -3
- package/dist/client/context-xray/ContextMeter.js.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.js +4 -3
- package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
- package/dist/client/context-xray/format.d.ts +11 -0
- package/dist/client/context-xray/format.d.ts.map +1 -1
- package/dist/client/context-xray/format.js +16 -0
- package/dist/client/context-xray/format.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +8 -53
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
- package/dist/client/create-query-client.d.ts +28 -0
- package/dist/client/create-query-client.d.ts.map +1 -0
- package/dist/client/create-query-client.js +78 -0
- package/dist/client/create-query-client.js.map +1 -0
- package/dist/client/db-admin/DevDatabaseLink.d.ts +1 -1
- package/dist/client/db-admin/DevDatabaseLink.d.ts.map +1 -1
- package/dist/client/db-admin/RowSidePanel.d.ts +1 -1
- package/dist/client/db-admin/RowSidePanel.d.ts.map +1 -1
- package/dist/client/db-admin/RowSidePanel.js +2 -2
- package/dist/client/db-admin/RowSidePanel.js.map +1 -1
- package/dist/client/db-admin/TableEditor.d.ts +1 -1
- package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
- package/dist/client/db-admin/TableEditor.js +1 -1
- package/dist/client/db-admin/TableEditor.js.map +1 -1
- package/dist/client/db-admin/cell-format.d.ts +1 -1
- package/dist/client/db-admin/cell-format.d.ts.map +1 -1
- package/dist/client/dev-overlay/DevOverlay.d.ts +1 -1
- package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
- package/dist/client/editor/index.d.ts +2 -0
- package/dist/client/editor/index.d.ts.map +1 -0
- package/dist/client/editor/index.js +2 -0
- package/dist/client/editor/index.js.map +1 -0
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +4 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionSlot.d.ts +1 -1
- package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewerPage.d.ts +1 -1
- package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -1
- package/dist/client/guided-questions.d.ts +6 -6
- package/dist/client/host-bridge.d.ts.map +1 -1
- package/dist/client/host-bridge.js +2 -0
- package/dist/client/host-bridge.js.map +1 -1
- package/dist/client/index.d.ts +7 -6
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -3
- package/dist/client/index.js.map +1 -1
- package/dist/client/onboarding/OnboardingBanner.d.ts +1 -1
- package/dist/client/onboarding/OnboardingBanner.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.d.ts +1 -1
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/SetupButton.d.ts +1 -1
- package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
- package/dist/client/org/InvitationBanner.d.ts +1 -1
- package/dist/client/org/InvitationBanner.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/hooks.d.ts +3 -3
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.d.ts +2 -2
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +34 -9
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +1 -1
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -0
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +1 -1
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/CodeBlockNode.js +2 -1
- package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +1 -1
- package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/ImageExtension.js +2 -1
- package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -3
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +1 -1
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -1
- package/dist/client/route-state.d.ts +12 -2
- package/dist/client/route-state.d.ts.map +1 -1
- package/dist/client/route-state.js +1 -1
- package/dist/client/route-state.js.map +1 -1
- package/dist/client/route-warmup.d.ts +1 -1
- package/dist/client/route-warmup.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +2 -2
- package/dist/client/sharing/ShareDialog.d.ts +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sse-event-processor.d.ts +8 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +33 -10
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
- package/dist/client/terminal/AgentTerminal.js +4 -2
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/tool-cells/BashCell.d.ts +25 -0
- package/dist/client/tool-cells/BashCell.d.ts.map +1 -0
- package/dist/client/tool-cells/BashCell.js +49 -0
- package/dist/client/tool-cells/BashCell.js.map +1 -0
- package/dist/client/tool-cells/EditCell.d.ts +24 -0
- package/dist/client/tool-cells/EditCell.d.ts.map +1 -0
- package/dist/client/tool-cells/EditCell.js +126 -0
- package/dist/client/tool-cells/EditCell.js.map +1 -0
- package/dist/client/tool-cells/FilesChangedSummary.d.ts +13 -0
- package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -0
- package/dist/client/tool-cells/FilesChangedSummary.js +98 -0
- package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -0
- package/dist/client/tool-cells/WriteCell.d.ts +17 -0
- package/dist/client/tool-cells/WriteCell.d.ts.map +1 -0
- package/dist/client/tool-cells/WriteCell.js +26 -0
- package/dist/client/tool-cells/WriteCell.js.map +1 -0
- package/dist/client/tool-cells/index.d.ts +8 -0
- package/dist/client/tool-cells/index.d.ts.map +1 -0
- package/dist/client/tool-cells/index.js +5 -0
- package/dist/client/tool-cells/index.js.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/client/use-chat-threads.d.ts +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +11 -8
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +2 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +329 -302
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.d.ts +15 -1
- package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +47 -0
- package/dist/code-agents/transcript-normalizer.js.map +1 -1
- package/dist/coding-tools/index.d.ts +75 -0
- package/dist/coding-tools/index.d.ts.map +1 -1
- package/dist/coding-tools/index.js +137 -10
- package/dist/coding-tools/index.js.map +1 -1
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +15 -9
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/ydoc-manager.d.ts +1 -1
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +1 -1
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/db/client.d.ts +9 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +204 -48
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts +38 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +204 -4
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +159 -67
- package/dist/db/migrations.js.map +1 -1
- package/dist/demo/actions/toggle-demo-mode.d.ts +6 -1
- package/dist/demo/actions/toggle-demo-mode.d.ts.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +80 -39
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.js +20 -10
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/extensions/schema.d.ts +51 -51
- package/dist/extensions/slots/schema.d.ts +13 -13
- package/dist/file-upload/actions/upload-image.d.ts +26 -1
- package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
- package/dist/file-upload/index.d.ts +1 -1
- package/dist/file-upload/index.d.ts.map +1 -1
- package/dist/file-upload/index.js +1 -1
- package/dist/file-upload/index.js.map +1 -1
- package/dist/file-upload/pre-upload-attachments.d.ts +37 -0
- package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -1
- package/dist/file-upload/pre-upload-attachments.js +79 -19
- package/dist/file-upload/pre-upload-attachments.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapters/slack.js +1 -1
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/plugin.js +1 -1
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/jobs/scheduler.js +70 -21
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/mcp/actions/create-org-service-token.d.ts +14 -0
- package/dist/mcp/actions/create-org-service-token.d.ts.map +1 -0
- package/dist/mcp/actions/create-org-service-token.js +74 -0
- package/dist/mcp/actions/create-org-service-token.js.map +1 -0
- package/dist/mcp/actions/list-org-service-tokens.d.ts +17 -0
- package/dist/mcp/actions/list-org-service-tokens.d.ts.map +1 -0
- package/dist/mcp/actions/list-org-service-tokens.js +42 -0
- package/dist/mcp/actions/list-org-service-tokens.js.map +1 -0
- package/dist/mcp/actions/revoke-org-service-token.d.ts +7 -0
- package/dist/mcp/actions/revoke-org-service-token.d.ts.map +1 -0
- package/dist/mcp/actions/revoke-org-service-token.js +28 -0
- package/dist/mcp/actions/revoke-org-service-token.js.map +1 -0
- package/dist/mcp/actions/service-token-access.d.ts +24 -0
- package/dist/mcp/actions/service-token-access.d.ts.map +1 -0
- package/dist/mcp/actions/service-token-access.js +63 -0
- package/dist/mcp/actions/service-token-access.js.map +1 -0
- package/dist/mcp/build-server.d.ts +42 -11
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +53 -3
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/connect-route.d.ts +35 -0
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +57 -2
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/mcp/connect-store.d.ts +43 -0
- package/dist/mcp/connect-store.d.ts.map +1 -1
- package/dist/mcp/connect-store.js +129 -12
- package/dist/mcp/connect-store.js.map +1 -1
- package/dist/mcp/oauth-token.d.ts +10 -0
- package/dist/mcp/oauth-token.d.ts.map +1 -1
- package/dist/mcp/oauth-token.js +2 -0
- package/dist/mcp/oauth-token.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +3 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp-client/routes.js +1 -1
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/org/context.d.ts +4 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +10 -0
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +11 -7
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +0 -8
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +8 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/schema.d.ts +15 -15
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +13 -5
- package/dist/progress/actions.js.map +1 -1
- package/dist/provider-api/actions/delete-staged-dataset.d.ts +9 -0
- package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -0
- package/dist/provider-api/actions/delete-staged-dataset.js +35 -0
- package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -0
- package/dist/provider-api/actions/list-staged-datasets.d.ts +15 -0
- package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -0
- package/dist/provider-api/actions/list-staged-datasets.js +41 -0
- package/dist/provider-api/actions/list-staged-datasets.js.map +1 -0
- package/dist/provider-api/actions/query-staged-dataset.d.ts +29 -0
- package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -0
- package/dist/provider-api/actions/query-staged-dataset.js +116 -0
- package/dist/provider-api/actions/query-staged-dataset.js.map +1 -0
- package/dist/provider-api/custom-registry.d.ts.map +1 -1
- package/dist/provider-api/custom-registry.js.map +1 -1
- package/dist/provider-api/index.d.ts +10 -10
- package/dist/provider-api/index.js +0 -5
- package/dist/provider-api/index.js.map +1 -1
- package/dist/provider-api/staged-datasets-aggregate.d.ts +46 -0
- package/dist/provider-api/staged-datasets-aggregate.d.ts.map +1 -0
- package/dist/provider-api/staged-datasets-aggregate.js +209 -0
- package/dist/provider-api/staged-datasets-aggregate.js.map +1 -0
- package/dist/provider-api/staged-datasets-store.d.ts +76 -0
- package/dist/provider-api/staged-datasets-store.d.ts.map +1 -0
- package/dist/provider-api/staged-datasets-store.js +319 -0
- package/dist/provider-api/staged-datasets-store.js.map +1 -0
- package/dist/provider-api/staging.d.ts +100 -0
- package/dist/provider-api/staging.d.ts.map +1 -0
- package/dist/provider-api/staging.js +281 -0
- package/dist/provider-api/staging.js.map +1 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +13 -1
- package/dist/resources/handlers.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +1 -2
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +1 -1
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/secrets/schema.d.ts +7 -7
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +14 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +3 -2
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +33 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +251 -180
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +13 -16
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/agent-teams-run-queue.d.ts +31 -8
- package/dist/server/agent-teams-run-queue.d.ts.map +1 -1
- package/dist/server/agent-teams-run-queue.js +61 -18
- package/dist/server/agent-teams-run-queue.js.map +1 -1
- package/dist/server/agent-teams.d.ts +27 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +214 -14
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/app-base-path.d.ts +20 -0
- package/dist/server/app-base-path.d.ts.map +1 -1
- package/dist/server/app-base-path.js +36 -0
- package/dist/server/app-base-path.js.map +1 -1
- package/dist/server/attachment-actions.d.ts +43 -0
- package/dist/server/attachment-actions.d.ts.map +1 -0
- package/dist/server/attachment-actions.js +214 -0
- package/dist/server/attachment-actions.js.map +1 -0
- package/dist/server/auth.js +1 -1
- package/dist/server/auth.js.map +1 -1
- package/dist/server/complete-text.d.ts +56 -0
- package/dist/server/complete-text.d.ts.map +1 -0
- package/dist/server/complete-text.js +147 -0
- package/dist/server/complete-text.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +37 -27
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/cors-origins.d.ts.map +1 -1
- package/dist/server/cors-origins.js +6 -1
- package/dist/server/cors-origins.js.map +1 -1
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +2 -1
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/csrf.d.ts +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/email-actions.d.ts +19 -0
- package/dist/server/email-actions.d.ts.map +1 -0
- package/dist/server/email-actions.js +191 -0
- package/dist/server/email-actions.js.map +1 -0
- package/dist/server/embed-route.js +1 -1
- package/dist/server/embed-route.js.map +1 -1
- package/dist/server/embed-session.d.ts.map +1 -1
- package/dist/server/embed-session.js +5 -1
- package/dist/server/embed-session.js.map +1 -1
- package/dist/server/entry-server.d.ts +24 -0
- package/dist/server/entry-server.d.ts.map +1 -0
- package/dist/server/entry-server.js +54 -0
- package/dist/server/entry-server.js.map +1 -0
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +2 -10
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +2 -9
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/google-realtime-session.d.ts.map +1 -1
- package/dist/server/google-realtime-session.js +6 -4
- package/dist/server/google-realtime-session.js.map +1 -1
- package/dist/server/h3-helpers.d.ts +39 -0
- package/dist/server/h3-helpers.d.ts.map +1 -1
- package/dist/server/h3-helpers.js +104 -1
- package/dist/server/h3-helpers.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +1 -8
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +1 -0
- package/dist/server/open-route.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts +19 -0
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -0
- package/dist/server/prompts/framework-core-compact.js +69 -0
- package/dist/server/prompts/framework-core-compact.js.map +1 -0
- package/dist/server/prompts/framework-core.d.ts +26 -0
- package/dist/server/prompts/framework-core.d.ts.map +1 -0
- package/dist/server/prompts/framework-core.js +130 -0
- package/dist/server/prompts/framework-core.js.map +1 -0
- package/dist/server/prompts/index.d.ts +9 -0
- package/dist/server/prompts/index.d.ts.map +1 -0
- package/dist/server/prompts/index.js +9 -0
- package/dist/server/prompts/index.js.map +1 -0
- package/dist/server/prompts/model-overlays.d.ts +18 -0
- package/dist/server/prompts/model-overlays.d.ts.map +1 -0
- package/dist/server/prompts/model-overlays.js +46 -0
- package/dist/server/prompts/model-overlays.js.map +1 -0
- package/dist/server/prompts/shared-rules.d.ts +29 -0
- package/dist/server/prompts/shared-rules.d.ts.map +1 -0
- package/dist/server/prompts/shared-rules.js +54 -0
- package/dist/server/prompts/shared-rules.js.map +1 -0
- package/dist/server/security-headers.d.ts +7 -1
- package/dist/server/security-headers.d.ts.map +1 -1
- package/dist/server/security-headers.js +11 -0
- package/dist/server/security-headers.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +135 -46
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +7 -4
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +9 -0
- package/dist/settings/store.js.map +1 -1
- package/dist/shared/markdown-block-split.d.ts +39 -0
- package/dist/shared/markdown-block-split.d.ts.map +1 -0
- package/dist/shared/markdown-block-split.js +97 -0
- package/dist/shared/markdown-block-split.js.map +1 -0
- package/dist/shared/reasoning-effort.js +13 -1
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/shared/streaming-text-smoothing.d.ts +18 -0
- package/dist/shared/streaming-text-smoothing.d.ts.map +1 -1
- package/dist/shared/streaming-text-smoothing.js +70 -4
- package/dist/shared/streaming-text-smoothing.js.map +1 -1
- package/dist/sharing/actions/list-resource-shares.d.ts +24 -1
- package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts +8 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts +12 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/unshare-resource.d.ts +8 -1
- package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
- package/dist/sharing/schema.d.ts +10 -10
- package/dist/styles/agent-conversation.css +239 -0
- package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
- package/dist/templates/default/AGENTS.md +1 -1
- package/dist/templates/default/DEVELOPING.md +19 -0
- package/dist/templates/default/app/entry.client.tsx +4 -1
- package/dist/templates/default/app/entry.server.tsx +4 -56
- package/dist/templates/default/app/global.css +3 -2
- package/dist/templates/default/app/root.tsx +8 -24
- package/dist/templates/default/app/routes/_index.tsx +0 -13
- package/dist/templates/default/package.json +6 -5
- package/dist/templates/default/tsconfig.json +2 -1
- package/dist/templates/starter-shell-sync.spec.ts +118 -0
- package/dist/templates/ui-primitives-sync.spec.ts +399 -0
- package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
- package/dist/terminal/pty-server.js +1 -1
- package/dist/terminal/pty-server.js.map +1 -1
- package/dist/triggers/dispatcher.js +1 -1
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +60 -7
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +44 -12
- package/dist/vite/client.js.map +1 -1
- package/dist/workspace-files/schema.d.ts +8 -8
- package/dist/workspace-files/tool.d.ts.map +1 -1
- package/dist/workspace-files/tool.js +0 -1
- package/dist/workspace-files/tool.js.map +1 -1
- package/docs/content/a2a-protocol.md +18 -12
- package/docs/content/actions.md +42 -10
- package/docs/content/agent-mentions.md +7 -8
- package/docs/content/agent-teams.md +23 -37
- package/docs/content/agent-web-surfaces.md +18 -9
- package/docs/content/authentication.md +6 -17
- package/docs/content/automations.md +43 -15
- package/docs/content/cli-adapters.md +25 -24
- package/docs/content/client.md +66 -17
- package/docs/content/cloneable-saas.md +19 -23
- package/docs/content/code-agents-ui.md +3 -31
- package/docs/content/components.md +308 -0
- package/docs/content/context-awareness.md +4 -0
- package/docs/content/creating-templates.md +4 -2
- package/docs/content/cross-app-sso.md +45 -19
- package/docs/content/database.md +26 -1
- package/docs/content/deployment.md +3 -1
- package/docs/content/dispatch.md +9 -37
- package/docs/content/drop-in-agent.md +123 -2
- package/docs/content/embedding-sdk.md +35 -0
- package/docs/content/extensions.md +2 -2
- package/docs/content/external-agents.md +86 -171
- package/docs/content/faq.md +6 -27
- package/docs/content/frames.md +9 -12
- package/docs/content/getting-started.md +80 -77
- package/docs/content/key-concepts.md +29 -19
- package/docs/content/mcp-apps.md +103 -0
- package/docs/content/mcp-clients.md +2 -2
- package/docs/content/mcp-protocol.md +40 -17
- package/docs/content/messaging.md +11 -4
- package/docs/content/migration-workbench.md +4 -47
- package/docs/content/multi-app-workspace.md +48 -17
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/notifications.md +8 -6
- package/docs/content/observability.md +26 -15
- package/docs/content/onboarding.md +7 -1
- package/docs/content/pr-visual-recap.md +203 -23
- package/docs/content/progress.md +5 -5
- package/docs/content/pure-agent-apps.md +3 -1
- package/docs/content/real-time-collaboration.md +106 -0
- package/docs/content/recurring-jobs.md +17 -1
- package/docs/content/security.md +17 -3
- package/docs/content/server.md +39 -3
- package/docs/content/sharing.md +20 -1
- package/docs/content/skills-guide.md +151 -125
- package/docs/content/template-analytics.md +8 -0
- package/docs/content/template-assets.md +2 -0
- package/docs/content/template-brain.md +59 -3
- package/docs/content/template-calendar.md +8 -0
- package/docs/content/template-clips.md +11 -2
- package/docs/content/template-content.md +24 -4
- package/docs/content/template-design.md +19 -17
- package/docs/content/template-dispatch.md +2 -0
- package/docs/content/template-forms.md +28 -1
- package/docs/content/template-mail.md +17 -0
- package/docs/content/template-plan.md +177 -10
- package/docs/content/template-slides.md +51 -12
- package/docs/content/template-videos.md +17 -0
- package/docs/content/tracking.md +17 -13
- package/docs/content/using-your-agent.md +15 -5
- package/docs/content/voice-input.md +1 -1
- package/docs/content/what-is-agent-native.md +5 -6
- package/docs/content/workspace-connections.md +138 -424
- package/docs/content/workspace-management.md +12 -128
- package/docs/content/workspace.md +125 -199
- package/docs/content/writing-agent-instructions.md +17 -1
- package/package.json +25 -6
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
- package/src/templates/default/AGENTS.md +1 -1
- package/src/templates/default/DEVELOPING.md +19 -0
- package/src/templates/default/app/entry.client.tsx +4 -1
- package/src/templates/default/app/entry.server.tsx +4 -56
- package/src/templates/default/app/global.css +3 -2
- package/src/templates/default/app/root.tsx +8 -24
- package/src/templates/default/app/routes/_index.tsx +0 -13
- package/src/templates/default/package.json +6 -5
- package/src/templates/default/tsconfig.json +2 -1
- package/src/templates/starter-shell-sync.spec.ts +118 -0
- package/src/templates/ui-primitives-sync.spec.ts +399 -0
- package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
- package/tsconfig.base.json +2 -10
- package/dist/cli/app-skill.d.ts +0 -157
- package/dist/cli/app-skill.d.ts.map +0 -1
- package/dist/cli/audit-agent-web.d.ts +0 -2
- package/dist/cli/audit-agent-web.d.ts.map +0 -1
- package/dist/cli/code-agent-connector.d.ts +0 -17
- package/dist/cli/code-agent-connector.d.ts.map +0 -1
- package/dist/cli/code.d.ts +0 -66
- package/dist/cli/code.d.ts.map +0 -1
- package/dist/cli/connect.d.ts +0 -140
- package/dist/cli/connect.d.ts.map +0 -1
- package/dist/cli/context-xray-local.d.ts +0 -16
- package/dist/cli/context-xray-local.d.ts.map +0 -1
- package/dist/cli/create-workspace.d.ts +0 -8
- package/dist/cli/create-workspace.d.ts.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/info.d.ts +0 -2
- package/dist/cli/info.d.ts.map +0 -1
- package/dist/cli/mcp-config-writers.d.ts +0 -82
- package/dist/cli/mcp-config-writers.d.ts.map +0 -1
- package/dist/cli/mcp.d.ts +0 -16
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/migrate.d.ts +0 -38
- package/dist/cli/migrate.d.ts.map +0 -1
- package/dist/cli/plan-local.d.ts +0 -43
- package/dist/cli/plan-local.d.ts.map +0 -1
- package/dist/cli/plan-publish-store.d.ts +0 -62
- package/dist/cli/plan-publish-store.d.ts.map +0 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +0 -11
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +0 -1
- package/dist/cli/recap.d.ts +0 -297
- package/dist/cli/recap.d.ts.map +0 -1
- package/dist/cli/skills.d.ts +0 -162
- package/dist/cli/skills.d.ts.map +0 -1
- package/dist/cli/workspace-dev.d.ts +0 -96
- package/dist/cli/workspace-dev.d.ts.map +0 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
// Guard: all templates/<name>/app/components/ui/*.tsx files that share the
|
|
7
|
+
// same primitive name must be byte-identical, OR must be listed in the
|
|
8
|
+
// ALLOW_LIST below with a documented reason.
|
|
9
|
+
//
|
|
10
|
+
// If you update a primitive, update it in EVERY template that holds it (or
|
|
11
|
+
// use the canonical template as the source and copy with:
|
|
12
|
+
//
|
|
13
|
+
// cp templates/analytics/app/components/ui/<file>.tsx \
|
|
14
|
+
// templates/<other>/app/components/ui/<file>.tsx
|
|
15
|
+
//
|
|
16
|
+
// If a template genuinely needs a behaviorally different variant, add it here
|
|
17
|
+
// with a comment explaining why the deviation is intentional.
|
|
18
|
+
|
|
19
|
+
// Each entry: [primitive filename, template name, reason for deviation]
|
|
20
|
+
const ALLOW_LIST: Array<[string, string, string]> = [
|
|
21
|
+
// scroll-area.tsx — content always renders a horizontal ScrollBar so deeply
|
|
22
|
+
// nested page rows in the document sidebar stay reachable; guarded by
|
|
23
|
+
// templates/content/app/components/sidebar/DocumentSidebar.layout.test.ts.
|
|
24
|
+
[
|
|
25
|
+
"scroll-area.tsx",
|
|
26
|
+
"content",
|
|
27
|
+
"always renders horizontal ScrollBar for nested sidebar rows",
|
|
28
|
+
],
|
|
29
|
+
|
|
30
|
+
// button.tsx — macros has a fully custom design theme (bg-foreground primary,
|
|
31
|
+
// rounded-2xl, active:scale press feedback, custom ghost/link palette).
|
|
32
|
+
// The canonical 13-template version uses standard bg-primary, rounded-md.
|
|
33
|
+
[
|
|
34
|
+
"button.tsx",
|
|
35
|
+
"macros",
|
|
36
|
+
"custom-themed: bg-foreground, rounded-lg, active:scale",
|
|
37
|
+
],
|
|
38
|
+
|
|
39
|
+
// calendar.tsx — DayPicker v9 class-name API split across templates.
|
|
40
|
+
// The majority (7 templates) use the older v9 API (caption, nav_button, …).
|
|
41
|
+
// Two templates are ahead of this:
|
|
42
|
+
// • analytics: new v9 renamed API (month_caption, button_previous, day_button)
|
|
43
|
+
// • forms/mail: newest shadcn with getDefaultClassNames + DayButton + captionLayout
|
|
44
|
+
// Unifying these requires a coordinated DayPicker API migration; defer until
|
|
45
|
+
// the 7-template group catches up.
|
|
46
|
+
[
|
|
47
|
+
"calendar.tsx",
|
|
48
|
+
"analytics",
|
|
49
|
+
"ahead of majority: new v9 renamed classname API (month_caption, button_previous)",
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"calendar.tsx",
|
|
53
|
+
"forms",
|
|
54
|
+
"newest shadcn: getDefaultClassNames + DayButton + captionLayout",
|
|
55
|
+
],
|
|
56
|
+
[
|
|
57
|
+
"calendar.tsx",
|
|
58
|
+
"mail",
|
|
59
|
+
"newest shadcn: getDefaultClassNames + DayButton + captionLayout",
|
|
60
|
+
],
|
|
61
|
+
|
|
62
|
+
// card.tsx — macros uses rounded-2xl, border-border/40, and a custom
|
|
63
|
+
// transition. The canonical 12-template version uses rounded-lg, border.
|
|
64
|
+
[
|
|
65
|
+
"card.tsx",
|
|
66
|
+
"macros",
|
|
67
|
+
"custom-themed: rounded-2xl, border-border/40, custom transition",
|
|
68
|
+
],
|
|
69
|
+
|
|
70
|
+
// chart.tsx — analytics adds the useChartTooltipFlip hook (which only exists
|
|
71
|
+
// in the analytics template's hooks/ dir) and uses `[_, config]` destructuring.
|
|
72
|
+
// forms/mail have a shared variant without that hook and with `[, config]`.
|
|
73
|
+
// The canonical 8-template version (calendar/clips/design/macros/plan/slides/
|
|
74
|
+
// starter/videos) has neither analytics-specific hook nor forms/mail style.
|
|
75
|
+
[
|
|
76
|
+
"chart.tsx",
|
|
77
|
+
"analytics",
|
|
78
|
+
"analytics-specific: useChartTooltipFlip hook (only exists in analytics hooks/)",
|
|
79
|
+
],
|
|
80
|
+
[
|
|
81
|
+
"chart.tsx",
|
|
82
|
+
"forms",
|
|
83
|
+
"no useChartTooltipFlip hook (analytics-specific); minor style differences",
|
|
84
|
+
],
|
|
85
|
+
[
|
|
86
|
+
"chart.tsx",
|
|
87
|
+
"mail",
|
|
88
|
+
"no useChartTooltipFlip hook (analytics-specific); minor style differences",
|
|
89
|
+
],
|
|
90
|
+
|
|
91
|
+
// command.tsx — forms/mail were scaffolded with "use client" (Next.js artifact)
|
|
92
|
+
// and use `const CommandDialog = ({ children, ...props }: DialogProps)` instead
|
|
93
|
+
// of the interface-wrapped variant. Behaviorally equivalent; clean up on next
|
|
94
|
+
// major template refresh.
|
|
95
|
+
[
|
|
96
|
+
"command.tsx",
|
|
97
|
+
"forms",
|
|
98
|
+
'"use client" artifact + inline type (no interface wrapper)',
|
|
99
|
+
],
|
|
100
|
+
[
|
|
101
|
+
"command.tsx",
|
|
102
|
+
"mail",
|
|
103
|
+
'"use client" artifact + inline type (no interface wrapper)',
|
|
104
|
+
],
|
|
105
|
+
|
|
106
|
+
// context-menu.tsx — forms/mail add origin-[--radix-context-menu-content-
|
|
107
|
+
// transform-origin] and max-h CSS variables from a newer shadcn snapshot.
|
|
108
|
+
// Not harmful but haven't been audited for all usage sites yet.
|
|
109
|
+
[
|
|
110
|
+
"context-menu.tsx",
|
|
111
|
+
"forms",
|
|
112
|
+
"newer shadcn: origin CSS var + max-h constraint on sub-content",
|
|
113
|
+
],
|
|
114
|
+
[
|
|
115
|
+
"context-menu.tsx",
|
|
116
|
+
"mail",
|
|
117
|
+
"newer shadcn: origin CSS var + max-h constraint on sub-content",
|
|
118
|
+
],
|
|
119
|
+
|
|
120
|
+
// dialog.tsx — macros has a mobile-optimized layout: top-4 positioned (not
|
|
121
|
+
// centered), max-h with overflow-y-auto for tall forms, backdrop-blur-sm overlay.
|
|
122
|
+
[
|
|
123
|
+
"dialog.tsx",
|
|
124
|
+
"macros",
|
|
125
|
+
"mobile-optimized: top-positioned, scrollable, backdrop-blur overlay",
|
|
126
|
+
],
|
|
127
|
+
|
|
128
|
+
// dropdown-menu.tsx — brain was rewritten with the new shadcn v2 function-
|
|
129
|
+
// component API (data-slot attributes, variant prop on MenuItem, gap-2 layout,
|
|
130
|
+
// overflow-x-hidden content). The canonical 13-template version uses the older
|
|
131
|
+
// React.forwardRef style.
|
|
132
|
+
[
|
|
133
|
+
"dropdown-menu.tsx",
|
|
134
|
+
"brain",
|
|
135
|
+
"shadcn v2 function-component API with data-slot + variant prop",
|
|
136
|
+
],
|
|
137
|
+
|
|
138
|
+
// input.tsx — three intentional variants beyond the canonical 11-template version:
|
|
139
|
+
// • macros: adds transition-all hover:border-ring/50 (custom visual polish)
|
|
140
|
+
// • mail: uses h-9 instead of h-10 (intentional compact sizing for dense UI)
|
|
141
|
+
// • videos: adds text-foreground class (explicit foreground color)
|
|
142
|
+
[
|
|
143
|
+
"input.tsx",
|
|
144
|
+
"macros",
|
|
145
|
+
"custom: transition-all hover:border-ring/50 animation",
|
|
146
|
+
],
|
|
147
|
+
["input.tsx", "mail", "intentional compact sizing: h-9 vs canonical h-10"],
|
|
148
|
+
["input.tsx", "videos", "adds explicit text-foreground class"],
|
|
149
|
+
|
|
150
|
+
// menubar.tsx — macros uses a different trigger style. forms/mail use a newer
|
|
151
|
+
// shadcn snapshot with improved data-[state=open] focus/hover handling and
|
|
152
|
+
// function-component wrappers for MenubarMenu.
|
|
153
|
+
["menubar.tsx", "macros", "custom-themed trigger style"],
|
|
154
|
+
[
|
|
155
|
+
"menubar.tsx",
|
|
156
|
+
"forms",
|
|
157
|
+
"newer shadcn: improved data-[state=open] states + function-component wrappers",
|
|
158
|
+
],
|
|
159
|
+
[
|
|
160
|
+
"menubar.tsx",
|
|
161
|
+
"mail",
|
|
162
|
+
"newer shadcn: improved data-[state=open] states + function-component wrappers",
|
|
163
|
+
],
|
|
164
|
+
|
|
165
|
+
// progress.tsx — macros uses h-1.5 (slim) instead of h-4 and bg-foreground/80
|
|
166
|
+
// instead of bg-primary. Custom design language for the macros app.
|
|
167
|
+
["progress.tsx", "macros", "custom-themed: h-1.5 slim bar, bg-foreground/80"],
|
|
168
|
+
|
|
169
|
+
// sonner.tsx — two intentional variants:
|
|
170
|
+
// • mail: heavily custom-styled toasts (bg-card, rounded-lg, text-13px,
|
|
171
|
+
// custom action/cancel button styles)
|
|
172
|
+
// • calendar: uses w-fit instead of w-[var(--width)] for a compact toast
|
|
173
|
+
[
|
|
174
|
+
"sonner.tsx",
|
|
175
|
+
"mail",
|
|
176
|
+
"heavily custom-styled toasts (bg-card, 13px, custom action styles)",
|
|
177
|
+
],
|
|
178
|
+
["sonner.tsx", "calendar", "compact variant: w-fit instead of fixed-width"],
|
|
179
|
+
|
|
180
|
+
// tabs.tsx — two intentional variants:
|
|
181
|
+
// • plan: adds border border-transparent to TabsTrigger for layout stability
|
|
182
|
+
// • macros: adds duration-200 transition and hover:text-foreground
|
|
183
|
+
[
|
|
184
|
+
"tabs.tsx",
|
|
185
|
+
"plan",
|
|
186
|
+
"border border-transparent on trigger for layout stability",
|
|
187
|
+
],
|
|
188
|
+
[
|
|
189
|
+
"tabs.tsx",
|
|
190
|
+
"macros",
|
|
191
|
+
"adds duration-200 transition + hover:text-foreground",
|
|
192
|
+
],
|
|
193
|
+
|
|
194
|
+
// textarea.tsx — three intentional variants beyond the canonical 10-template version:
|
|
195
|
+
// • assets: adds autoGrow prop for auto-expanding textareas (used at call sites)
|
|
196
|
+
// • macros: adds transition-all hover:border-ring/50 (custom visual polish)
|
|
197
|
+
// • mail: minor whitespace/style difference; same functional behaviour
|
|
198
|
+
[
|
|
199
|
+
"textarea.tsx",
|
|
200
|
+
"assets",
|
|
201
|
+
"autoGrow prop: auto-expanding textarea, used at call sites",
|
|
202
|
+
],
|
|
203
|
+
[
|
|
204
|
+
"textarea.tsx",
|
|
205
|
+
"macros",
|
|
206
|
+
"custom: transition-all hover:border-ring/50 animation",
|
|
207
|
+
],
|
|
208
|
+
["textarea.tsx", "mail", "minor whitespace/style difference from canonical"],
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
function workspaceRoot(): string {
|
|
212
|
+
let current = process.cwd();
|
|
213
|
+
while (current !== path.dirname(current)) {
|
|
214
|
+
if (fs.existsSync(path.join(current, "pnpm-workspace.yaml"))) {
|
|
215
|
+
return current;
|
|
216
|
+
}
|
|
217
|
+
current = path.dirname(current);
|
|
218
|
+
}
|
|
219
|
+
throw new Error("Could not locate workspace root.");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const ROOT = workspaceRoot();
|
|
223
|
+
|
|
224
|
+
function md5(content: string): string {
|
|
225
|
+
return crypto.createHash("md5").update(content).digest("hex");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function readUiFile(template: string, filename: string): string {
|
|
229
|
+
return fs.readFileSync(
|
|
230
|
+
path.join(ROOT, "templates", template, "app", "components", "ui", filename),
|
|
231
|
+
"utf-8",
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function getTemplates(): string[] {
|
|
236
|
+
return fs
|
|
237
|
+
.readdirSync(path.join(ROOT, "templates"))
|
|
238
|
+
.filter((t) =>
|
|
239
|
+
fs.existsSync(path.join(ROOT, "templates", t, "app", "components", "ui")),
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function getPrimitives(template: string): string[] {
|
|
244
|
+
const dir = path.join(ROOT, "templates", template, "app", "components", "ui");
|
|
245
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(".tsx"));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
describe("ui-primitives sync guard", () => {
|
|
249
|
+
it("keeps shared ui primitives byte-identical across templates, except documented allow-list", () => {
|
|
250
|
+
const templates = getTemplates();
|
|
251
|
+
|
|
252
|
+
// Build map: primitive → (hash → [templates])
|
|
253
|
+
const hashes = new Map<string, Map<string, string[]>>();
|
|
254
|
+
|
|
255
|
+
for (const template of templates) {
|
|
256
|
+
for (const primitive of getPrimitives(template)) {
|
|
257
|
+
const content = readUiFile(template, primitive);
|
|
258
|
+
const h = md5(content);
|
|
259
|
+
|
|
260
|
+
if (!hashes.has(primitive)) hashes.set(primitive, new Map());
|
|
261
|
+
const byHash = hashes.get(primitive)!;
|
|
262
|
+
if (!byHash.has(h)) byHash.set(h, []);
|
|
263
|
+
byHash.get(h)!.push(template);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Build allow-list set for fast lookup: "primitive:template"
|
|
268
|
+
const allowed = new Set(ALLOW_LIST.map(([p, t]) => `${p}:${t}`));
|
|
269
|
+
|
|
270
|
+
const violations: string[] = [];
|
|
271
|
+
|
|
272
|
+
for (const [primitive, byHash] of hashes) {
|
|
273
|
+
if (byHash.size <= 1) continue; // all identical — fine
|
|
274
|
+
|
|
275
|
+
// Determine the canonical hash: the one held by the most templates.
|
|
276
|
+
let canonicalHash = "";
|
|
277
|
+
let canonicalCount = 0;
|
|
278
|
+
for (const [h, templates] of byHash) {
|
|
279
|
+
if (templates.length > canonicalCount) {
|
|
280
|
+
canonicalCount = templates.length;
|
|
281
|
+
canonicalHash = h;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
for (const [h, templates] of byHash) {
|
|
286
|
+
if (h === canonicalHash) continue;
|
|
287
|
+
for (const template of templates) {
|
|
288
|
+
const key = `${primitive}:${template}`;
|
|
289
|
+
if (!allowed.has(key)) {
|
|
290
|
+
violations.push(
|
|
291
|
+
`${primitive} in "${template}" differs from canonical (held by ${canonicalCount} templates) and is not in ALLOW_LIST`,
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
expect(
|
|
299
|
+
violations,
|
|
300
|
+
[
|
|
301
|
+
"Some ui primitives have drifted from the canonical version.",
|
|
302
|
+
"Either update the drifted template(s) to match the canonical,",
|
|
303
|
+
"or add an entry to ALLOW_LIST in ui-primitives-sync.spec.ts",
|
|
304
|
+
"with a comment explaining why the deviation is intentional.",
|
|
305
|
+
"",
|
|
306
|
+
...violations,
|
|
307
|
+
].join("\n"),
|
|
308
|
+
).toEqual([]);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it("every allow-list entry references an existing template+primitive pair", () => {
|
|
312
|
+
const templates = getTemplates();
|
|
313
|
+
const templateSet = new Set(templates);
|
|
314
|
+
|
|
315
|
+
for (const [primitive, template, reason] of ALLOW_LIST) {
|
|
316
|
+
expect(
|
|
317
|
+
reason,
|
|
318
|
+
`ALLOW_LIST entry ${primitive}:${template} has no reason`,
|
|
319
|
+
).toBeTruthy();
|
|
320
|
+
expect(
|
|
321
|
+
templateSet.has(template),
|
|
322
|
+
`ALLOW_LIST entry ${primitive}:${template} — template "${template}" does not exist`,
|
|
323
|
+
).toBe(true);
|
|
324
|
+
|
|
325
|
+
const primitiveExists = fs.existsSync(
|
|
326
|
+
path.join(
|
|
327
|
+
ROOT,
|
|
328
|
+
"templates",
|
|
329
|
+
template,
|
|
330
|
+
"app",
|
|
331
|
+
"components",
|
|
332
|
+
"ui",
|
|
333
|
+
primitive,
|
|
334
|
+
),
|
|
335
|
+
);
|
|
336
|
+
expect(
|
|
337
|
+
primitiveExists,
|
|
338
|
+
`ALLOW_LIST entry ${primitive}:${template} — file does not exist; remove stale entry`,
|
|
339
|
+
).toBe(true);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it("every allow-listed template actually diverges from canonical (no stale allow-list entries)", () => {
|
|
344
|
+
const templates = getTemplates();
|
|
345
|
+
|
|
346
|
+
// Compute hashes for all primitives
|
|
347
|
+
const hashes = new Map<string, Map<string, string[]>>();
|
|
348
|
+
for (const template of templates) {
|
|
349
|
+
for (const primitive of getPrimitives(template)) {
|
|
350
|
+
const content = readUiFile(template, primitive);
|
|
351
|
+
const h = md5(content);
|
|
352
|
+
if (!hashes.has(primitive)) hashes.set(primitive, new Map());
|
|
353
|
+
const byHash = hashes.get(primitive)!;
|
|
354
|
+
if (!byHash.has(h)) byHash.set(h, []);
|
|
355
|
+
byHash.get(h)!.push(template);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const stale: string[] = [];
|
|
360
|
+
for (const [primitive, template] of ALLOW_LIST) {
|
|
361
|
+
const byHash = hashes.get(primitive);
|
|
362
|
+
if (!byHash) continue; // file doesn't exist, caught by other test
|
|
363
|
+
|
|
364
|
+
// Find canonical hash (most templates)
|
|
365
|
+
let canonicalHash = "";
|
|
366
|
+
let canonicalCount = 0;
|
|
367
|
+
for (const [h, ts] of byHash) {
|
|
368
|
+
if (ts.length > canonicalCount) {
|
|
369
|
+
canonicalCount = ts.length;
|
|
370
|
+
canonicalHash = h;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Find this template's hash
|
|
375
|
+
let templateHash = "";
|
|
376
|
+
for (const [h, ts] of byHash) {
|
|
377
|
+
if (ts.includes(template)) {
|
|
378
|
+
templateHash = h;
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
if (templateHash === canonicalHash) {
|
|
384
|
+
stale.push(
|
|
385
|
+
`${primitive}:${template} is in ALLOW_LIST but is now identical to canonical; remove the stale entry`,
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
expect(
|
|
391
|
+
stale,
|
|
392
|
+
[
|
|
393
|
+
"Stale ALLOW_LIST entries detected (template now matches canonical).",
|
|
394
|
+
"Remove them from ui-primitives-sync.spec.ts:",
|
|
395
|
+
...stale,
|
|
396
|
+
].join("\n"),
|
|
397
|
+
).toEqual([]);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
@@ -13,7 +13,11 @@ metadata:
|
|
|
13
13
|
|
|
14
14
|
## Rule
|
|
15
15
|
|
|
16
|
-
The UI
|
|
16
|
+
The UI never calls an LLM directly. Product workflows are delegated to the
|
|
17
|
+
agent through the chat bridge so users can see, steer, and audit the work.
|
|
18
|
+
Server-side one-shot model calls are an explicit escape hatch for narrow text
|
|
19
|
+
transforms only; use `completeText()` from `@agent-native/core/server` when the
|
|
20
|
+
work intentionally does not need tools, chat history, or run state.
|
|
17
21
|
|
|
18
22
|
## Why
|
|
19
23
|
|
|
@@ -33,6 +37,24 @@ sendToAgentChat({
|
|
|
33
37
|
});
|
|
34
38
|
```
|
|
35
39
|
|
|
40
|
+
**From the UI, in the background:**
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { sendToAgentChat } from "@agent-native/core";
|
|
44
|
+
|
|
45
|
+
sendToAgentChat({
|
|
46
|
+
message: "Analyze this import and create any missing records",
|
|
47
|
+
context: `Import batch id: ${batchId}`,
|
|
48
|
+
submit: true,
|
|
49
|
+
newTab: true,
|
|
50
|
+
background: true,
|
|
51
|
+
openSidebar: false,
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This is still a full agent run: tools, actions, thread state, and run tracking
|
|
56
|
+
all remain active. It simply does not focus or open the sidebar.
|
|
57
|
+
|
|
36
58
|
**From scripts (Node):**
|
|
37
59
|
|
|
38
60
|
```ts
|
|
@@ -41,6 +63,22 @@ import { agentChat } from "@agent-native/core";
|
|
|
41
63
|
agentChat.submit("Process the uploaded images and create thumbnails");
|
|
42
64
|
```
|
|
43
65
|
|
|
66
|
+
**For narrow server-side text transforms:**
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { completeText } from "@agent-native/core/server";
|
|
70
|
+
|
|
71
|
+
const result = await completeText({
|
|
72
|
+
systemPrompt: "Return exactly one sentiment label.",
|
|
73
|
+
input: messageBody,
|
|
74
|
+
maxOutputTokens: 12,
|
|
75
|
+
temperature: 0,
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Wrap user-facing uses in actions so the UI and agent share the same operation.
|
|
80
|
+
Do not call provider SDKs directly.
|
|
81
|
+
|
|
44
82
|
**From the UI, detecting when agent is done:**
|
|
45
83
|
|
|
46
84
|
```ts
|
|
@@ -183,10 +221,20 @@ rather than ad-hoc LLM calls.
|
|
|
183
221
|
- Don't use AI SDK functions like `generateText()`, `streamText()`, etc.
|
|
184
222
|
- Don't build "AI features" that bypass the agent chat
|
|
185
223
|
- Don't auto-submit a hardcoded prompt for generative actions — capture user input first (see above)
|
|
224
|
+
- Don't use `completeText()` for workflows that need tools, database writes,
|
|
225
|
+
auditability, user steering, or multi-step reasoning. Use the agent chat
|
|
226
|
+
instead, optionally with `background: true`.
|
|
186
227
|
|
|
187
228
|
## Exception
|
|
188
229
|
|
|
189
|
-
Scripts may call external APIs (image generation, search, etc.) — but the AI
|
|
230
|
+
Scripts may call external APIs (image generation, search, etc.) — but the AI
|
|
231
|
+
reasoning and orchestration still goes through the agent. A script is a tool
|
|
232
|
+
the agent uses, not a replacement for the agent.
|
|
233
|
+
|
|
234
|
+
`completeText()` is allowed for small server-side transforms such as
|
|
235
|
+
classification, extraction, rewriting a short string, or normalizing messy
|
|
236
|
+
provider text. It deliberately runs with `tools: []` and does not create chat
|
|
237
|
+
thread state.
|
|
190
238
|
|
|
191
239
|
## When to Use A2A Instead
|
|
192
240
|
|
|
@@ -30,7 +30,7 @@ async function getFs() {
|
|
|
30
30
|
* node-pty's kill() only sends a signal to the shell, but child processes
|
|
31
31
|
* (like `builder`) may be in their own process group and survive as orphans.
|
|
32
32
|
*/
|
|
33
|
-
async function killProcessTree(pid,
|
|
33
|
+
async function killProcessTree(pid, _logPrefix) {
|
|
34
34
|
const cp = await getChildProcess();
|
|
35
35
|
if (os.platform() === "win32") {
|
|
36
36
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-server.js","sourceRoot":"","sources":["../../src/terminal/pty-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PTY WebSocket Server\n *\n * Creates an HTTP server with WebSocket support that spawns PTY processes\n * for AI CLI tools. Each WebSocket connection gets its own PTY.\n *\n * Used by both the embedded AgentTerminal component and the CLI frame.\n */\n\nimport {\n createServer as createHttpServer,\n type IncomingMessage,\n type Server as HttpServer,\n} from \"http\";\nimport os from \"os\";\nimport path from \"path\";\nimport {\n CLI_REGISTRY,\n commandExists,\n isAllowedCommand,\n} from \"./cli-registry.js\";\n\n// Lazy singletons for Node-only modules (only available in Node.js)\nlet _cp: typeof import(\"child_process\") | undefined;\nasync function getChildProcess(): Promise<typeof import(\"child_process\")> {\n if (!_cp) {\n _cp = await import(\"node:child_process\");\n }\n return _cp;\n}\n\nlet _fs: typeof import(\"fs\") | undefined;\nasync function getFs(): Promise<typeof import(\"fs\")> {\n if (!_fs) {\n _fs = await import(\"node:fs\");\n }\n return _fs;\n}\n\n/**\n * Kill a process and all its descendants.\n * node-pty's kill() only sends a signal to the shell, but child processes\n * (like `builder`) may be in their own process group and survive as orphans.\n */\nasync function killProcessTree(pid: number, logPrefix: string): Promise<void> {\n const cp = await getChildProcess();\n\n if (os.platform() === \"win32\") {\n try {\n cp.execSync(`taskkill /pid ${pid} /T /F`, { stdio: \"ignore\" });\n } catch {}\n return;\n }\n\n // Find all descendant PIDs (children, grandchildren, etc.)\n const descendants: number[] = [];\n function findDescendants(parentPid: number) {\n try {\n const output = cp\n .execSync(`pgrep -P ${parentPid}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n })\n .trim();\n if (output) {\n for (const line of output.split(\"\\n\")) {\n const childPid = parseInt(line, 10);\n if (childPid && !isNaN(childPid)) {\n descendants.push(childPid);\n findDescendants(childPid);\n }\n }\n }\n } catch {\n // pgrep returns non-zero when no children found\n }\n }\n findDescendants(pid);\n\n // Kill descendants first (deepest first), then the parent\n for (const childPid of descendants.reverse()) {\n try {\n process.kill(childPid, \"SIGTERM\");\n } catch {}\n }\n\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {}\n\n // Force-kill any survivors after a short delay\n setTimeout(() => {\n for (const childPid of descendants) {\n try {\n process.kill(childPid, \"SIGKILL\");\n } catch {}\n }\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {}\n }, 500);\n}\n\nexport interface PtyServerOptions {\n /** Working directory for PTY processes. Defaults to process.cwd() */\n appDir?: string;\n /** Default CLI command. Defaults to 'claude' */\n command?: string;\n /** Port to listen on. Defaults to 0 (random available port) */\n port?: number;\n /** Auth check for WebSocket upgrade requests. Return false to reject. */\n authCheck?: (req: IncomingMessage) => boolean | Promise<boolean>;\n /** Log prefix for console output. Defaults to '[terminal]' */\n logPrefix?: string;\n}\n\nexport interface PtyServerResult {\n /** The underlying HTTP server */\n server: HttpServer;\n /** The actual port the server is listening on */\n port: number;\n /** Shut down the server and kill all PTY processes */\n close: () => void;\n}\n\nexport async function createPtyWebSocketServer(\n options: PtyServerOptions = {},\n): Promise<PtyServerResult> {\n const {\n appDir = process.cwd(),\n command: defaultCommand = \"claude\",\n port = 0,\n authCheck,\n logPrefix = \"[terminal]\",\n } = options;\n\n // Dynamic imports for optional native dependencies\n const { WebSocketServer, WebSocket } = await import(\"ws\");\n const pty = await import(\"node-pty\");\n\n const resolvedAppDir = path.resolve(appDir);\n const shell =\n os.platform() === \"win32\" ? \"cmd.exe\" : process.env.SHELL || \"/bin/zsh\";\n\n const server = createHttpServer((req, res) => {\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n res.writeHead(404);\n res.end();\n });\n\n const wss = new WebSocketServer({ noServer: true });\n\n // Handle WebSocket upgrades with optional auth\n server.on(\"upgrade\", async (req, socket, head) => {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n if (url.pathname !== \"/ws\") {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n\n if (authCheck) {\n try {\n const allowed = await authCheck(req);\n if (!allowed) {\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n } catch {\n socket.write(\"HTTP/1.1 500 Internal Server Error\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n }\n\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit(\"connection\", ws, req);\n });\n });\n\n // Track active PTY processes for cleanup\n const activePtys = new Set<ReturnType<typeof pty.spawn>>();\n\n wss.on(\"connection\", async (ws: InstanceType<typeof WebSocket>, req) => {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const command = url.searchParams.get(\"command\") || defaultCommand;\n const extraFlags = url.searchParams.get(\"flags\") || \"\";\n console.log(`${logPrefix} WebSocket connected for command: ${command}`);\n\n const sendStatus = (status: string, message: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: \"setup-status\", status, message }));\n }\n };\n\n // Validate command against allowlist to prevent injection\n if (!isAllowedCommand(command)) {\n sendStatus(\n \"not-found\",\n `\"${command}\" is not a recognized CLI. Allowed: ${Object.keys(CLI_REGISTRY).join(\", \")}`,\n );\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n\n // Reject flags containing shell metacharacters\n if (extraFlags && /[;&|`$(){}\\n\\r<>]/.test(extraFlags)) {\n sendStatus(\"failed\", \"Invalid flags: shell metacharacters not allowed\");\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n\n // Check if CLI is installed; if not, use npx to run it\n let useNpx = false;\n if (!(await commandExists(command))) {\n const registry = CLI_REGISTRY[command];\n if (registry?.installPackage) {\n console.log(`${logPrefix} ${command} CLI not found, will use npx`);\n useNpx = true;\n } else {\n sendStatus(\n \"not-found\",\n `\"${command}\" not found on PATH. Please install it manually.`,\n );\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n }\n\n // Build the command — use npx if CLI not found locally\n const baseCommand = useNpx\n ? `npx --yes ${CLI_REGISTRY[command].installPackage}`\n : command;\n const fullCommand = extraFlags\n ? `${baseCommand} ${extraFlags}`\n : baseCommand;\n console.log(`${logPrefix} Spawning PTY: ${fullCommand}`);\n\n // Build env, stripping CLI-specific nesting vars\n const registry = CLI_REGISTRY[command];\n const env: Record<string, string | undefined> = {\n ...process.env,\n TERM: \"xterm-256color\",\n };\n if (registry) {\n for (const v of registry.stripEnv) delete env[v];\n }\n\n let ptyProcess: ReturnType<typeof pty.spawn>;\n try {\n ptyProcess = pty.spawn(shell, [\"-l\", \"-c\", fullCommand], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 40,\n cwd: resolvedAppDir,\n env: env as Record<string, string>,\n });\n } catch (err) {\n console.error(`${logPrefix} Failed to spawn PTY:`, err);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(\n `\\r\\n\\x1b[31m${logPrefix} Failed to spawn PTY: ${err}\\x1b[0m\\r\\n`,\n );\n ws.close();\n }\n return;\n }\n\n activePtys.add(ptyProcess);\n console.log(`${logPrefix} PTY spawned (pid: ${ptyProcess.pid})`);\n\n ptyProcess.onData((data: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n });\n\n ptyProcess.onExit(({ exitCode }) => {\n console.log(`${logPrefix} PTY exited with code ${exitCode}`);\n activePtys.delete(ptyProcess);\n if (exitCode === 127 && ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"setup-status\",\n status: \"not-found\",\n message: `Command \"${command}\" not found. Please install it first.`,\n }),\n );\n }\n if (ws.readyState === WebSocket.OPEN) {\n ws.close();\n }\n });\n\n ws.on(\"message\", async (data: Buffer | string) => {\n const str = typeof data === \"string\" ? data : data.toString();\n\n try {\n const msg = JSON.parse(str);\n\n if (\n msg.type === \"agentNative.setEnvVars\" &&\n Array.isArray(msg.data?.vars)\n ) {\n const envPath = path.join(resolvedAppDir, \".env\");\n const vars: Array<{ key: string; value: string }> = msg.data.vars;\n\n // Validate env var names and sanitize values\n const validKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;\n const sanitizedVars = vars.filter(({ key }) => {\n if (!validKeyPattern.test(key)) {\n console.warn(`${logPrefix} Rejected invalid env var key: ${key}`);\n return false;\n }\n return true;\n });\n\n const fs = await getFs();\n let lines: string[] = [];\n try {\n lines = fs.readFileSync(envPath, \"utf-8\").split(\"\\n\");\n } catch {}\n\n for (const { key, value } of sanitizedVars) {\n // Strip newlines/null bytes to prevent line injection\n const safeValue = value.replace(/[\\r\\n\\0]/g, \"\");\n // Quote values containing #, spaces, or quotes so dotenv parses correctly\n const needsQuoting = /[# \"']/.test(safeValue);\n const quotedValue = needsQuoting\n ? `\"${safeValue.replace(/\"/g, '\\\\\"')}\"`\n : safeValue;\n const idx = lines.findIndex((l) => l.startsWith(`${key}=`));\n const entry = `${key}=${quotedValue}`;\n if (idx !== -1) {\n lines[idx] = entry;\n } else {\n lines.push(entry);\n }\n }\n\n while (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n fs.writeFileSync(envPath, lines.join(\"\\n\") + \"\\n\", \"utf-8\");\n\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"env-vars-saved\",\n keys: sanitizedVars.map((v) => v.key),\n }),\n );\n }\n return;\n }\n\n if (msg.type === \"resize\" && msg.cols != null && msg.rows != null) {\n const cols = Math.max(\n 1,\n Math.min(65535, Math.trunc(Number(msg.cols))),\n );\n const rows = Math.max(\n 1,\n Math.min(65535, Math.trunc(Number(msg.rows))),\n );\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return;\n ptyProcess.resize(cols, rows);\n return;\n }\n } catch {\n // Not JSON — regular terminal input\n }\n\n ptyProcess.write(str);\n });\n\n ws.on(\"close\", () => {\n console.log(\n `${logPrefix} WebSocket closed, killing PTY tree (pid: ${ptyProcess.pid})`,\n );\n activePtys.delete(ptyProcess);\n killProcessTree(ptyProcess.pid, logPrefix);\n });\n });\n\n return new Promise((resolve, reject) => {\n server.once(\"error\", (err) => {\n reject(err);\n });\n server.listen(port, \"127.0.0.1\", () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n if (process.env.DEBUG)\n console.log(\n `${logPrefix} PTY WebSocket server on ws://localhost:${actualPort}/ws`,\n );\n\n resolve({\n server,\n port: actualPort,\n close: () => {\n for (const p of activePtys) {\n killProcessTree(p.pid, logPrefix);\n }\n activePtys.clear();\n wss.close();\n server.close();\n },\n });\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pty-server.js","sourceRoot":"","sources":["../../src/terminal/pty-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PTY WebSocket Server\n *\n * Creates an HTTP server with WebSocket support that spawns PTY processes\n * for AI CLI tools. Each WebSocket connection gets its own PTY.\n *\n * Used by both the embedded AgentTerminal component and the CLI frame.\n */\n\nimport {\n createServer as createHttpServer,\n type IncomingMessage,\n type Server as HttpServer,\n} from \"http\";\nimport os from \"os\";\nimport path from \"path\";\nimport {\n CLI_REGISTRY,\n commandExists,\n isAllowedCommand,\n} from \"./cli-registry.js\";\n\n// Lazy singletons for Node-only modules (only available in Node.js)\nlet _cp: typeof import(\"child_process\") | undefined;\nasync function getChildProcess(): Promise<typeof import(\"child_process\")> {\n if (!_cp) {\n _cp = await import(\"node:child_process\");\n }\n return _cp;\n}\n\nlet _fs: typeof import(\"fs\") | undefined;\nasync function getFs(): Promise<typeof import(\"fs\")> {\n if (!_fs) {\n _fs = await import(\"node:fs\");\n }\n return _fs;\n}\n\n/**\n * Kill a process and all its descendants.\n * node-pty's kill() only sends a signal to the shell, but child processes\n * (like `builder`) may be in their own process group and survive as orphans.\n */\nasync function killProcessTree(pid: number, _logPrefix: string): Promise<void> {\n const cp = await getChildProcess();\n\n if (os.platform() === \"win32\") {\n try {\n cp.execSync(`taskkill /pid ${pid} /T /F`, { stdio: \"ignore\" });\n } catch {}\n return;\n }\n\n // Find all descendant PIDs (children, grandchildren, etc.)\n const descendants: number[] = [];\n function findDescendants(parentPid: number) {\n try {\n const output = cp\n .execSync(`pgrep -P ${parentPid}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n })\n .trim();\n if (output) {\n for (const line of output.split(\"\\n\")) {\n const childPid = parseInt(line, 10);\n if (childPid && !isNaN(childPid)) {\n descendants.push(childPid);\n findDescendants(childPid);\n }\n }\n }\n } catch {\n // pgrep returns non-zero when no children found\n }\n }\n findDescendants(pid);\n\n // Kill descendants first (deepest first), then the parent\n for (const childPid of descendants.reverse()) {\n try {\n process.kill(childPid, \"SIGTERM\");\n } catch {}\n }\n\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {}\n\n // Force-kill any survivors after a short delay\n setTimeout(() => {\n for (const childPid of descendants) {\n try {\n process.kill(childPid, \"SIGKILL\");\n } catch {}\n }\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {}\n }, 500);\n}\n\nexport interface PtyServerOptions {\n /** Working directory for PTY processes. Defaults to process.cwd() */\n appDir?: string;\n /** Default CLI command. Defaults to 'claude' */\n command?: string;\n /** Port to listen on. Defaults to 0 (random available port) */\n port?: number;\n /** Auth check for WebSocket upgrade requests. Return false to reject. */\n authCheck?: (req: IncomingMessage) => boolean | Promise<boolean>;\n /** Log prefix for console output. Defaults to '[terminal]' */\n logPrefix?: string;\n}\n\nexport interface PtyServerResult {\n /** The underlying HTTP server */\n server: HttpServer;\n /** The actual port the server is listening on */\n port: number;\n /** Shut down the server and kill all PTY processes */\n close: () => void;\n}\n\nexport async function createPtyWebSocketServer(\n options: PtyServerOptions = {},\n): Promise<PtyServerResult> {\n const {\n appDir = process.cwd(),\n command: defaultCommand = \"claude\",\n port = 0,\n authCheck,\n logPrefix = \"[terminal]\",\n } = options;\n\n // Dynamic imports for optional native dependencies\n const { WebSocketServer, WebSocket } = await import(\"ws\");\n const pty = await import(\"node-pty\");\n\n const resolvedAppDir = path.resolve(appDir);\n const shell =\n os.platform() === \"win32\" ? \"cmd.exe\" : process.env.SHELL || \"/bin/zsh\";\n\n const server = createHttpServer((req, res) => {\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n res.writeHead(404);\n res.end();\n });\n\n const wss = new WebSocketServer({ noServer: true });\n\n // Handle WebSocket upgrades with optional auth\n server.on(\"upgrade\", async (req, socket, head) => {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n if (url.pathname !== \"/ws\") {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n\n if (authCheck) {\n try {\n const allowed = await authCheck(req);\n if (!allowed) {\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n } catch {\n socket.write(\"HTTP/1.1 500 Internal Server Error\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n }\n\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit(\"connection\", ws, req);\n });\n });\n\n // Track active PTY processes for cleanup\n const activePtys = new Set<ReturnType<typeof pty.spawn>>();\n\n wss.on(\"connection\", async (ws: InstanceType<typeof WebSocket>, req) => {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const command = url.searchParams.get(\"command\") || defaultCommand;\n const extraFlags = url.searchParams.get(\"flags\") || \"\";\n console.log(`${logPrefix} WebSocket connected for command: ${command}`);\n\n const sendStatus = (status: string, message: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: \"setup-status\", status, message }));\n }\n };\n\n // Validate command against allowlist to prevent injection\n if (!isAllowedCommand(command)) {\n sendStatus(\n \"not-found\",\n `\"${command}\" is not a recognized CLI. Allowed: ${Object.keys(CLI_REGISTRY).join(\", \")}`,\n );\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n\n // Reject flags containing shell metacharacters\n if (extraFlags && /[;&|`$(){}\\n\\r<>]/.test(extraFlags)) {\n sendStatus(\"failed\", \"Invalid flags: shell metacharacters not allowed\");\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n\n // Check if CLI is installed; if not, use npx to run it\n let useNpx = false;\n if (!(await commandExists(command))) {\n const registry = CLI_REGISTRY[command];\n if (registry?.installPackage) {\n console.log(`${logPrefix} ${command} CLI not found, will use npx`);\n useNpx = true;\n } else {\n sendStatus(\n \"not-found\",\n `\"${command}\" not found on PATH. Please install it manually.`,\n );\n if (ws.readyState === WebSocket.OPEN) ws.close();\n return;\n }\n }\n\n // Build the command — use npx if CLI not found locally\n const baseCommand = useNpx\n ? `npx --yes ${CLI_REGISTRY[command].installPackage}`\n : command;\n const fullCommand = extraFlags\n ? `${baseCommand} ${extraFlags}`\n : baseCommand;\n console.log(`${logPrefix} Spawning PTY: ${fullCommand}`);\n\n // Build env, stripping CLI-specific nesting vars\n const registry = CLI_REGISTRY[command];\n const env: Record<string, string | undefined> = {\n ...process.env,\n TERM: \"xterm-256color\",\n };\n if (registry) {\n for (const v of registry.stripEnv) delete env[v];\n }\n\n let ptyProcess: ReturnType<typeof pty.spawn>;\n try {\n ptyProcess = pty.spawn(shell, [\"-l\", \"-c\", fullCommand], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 40,\n cwd: resolvedAppDir,\n env: env as Record<string, string>,\n });\n } catch (err) {\n console.error(`${logPrefix} Failed to spawn PTY:`, err);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(\n `\\r\\n\\x1b[31m${logPrefix} Failed to spawn PTY: ${err}\\x1b[0m\\r\\n`,\n );\n ws.close();\n }\n return;\n }\n\n activePtys.add(ptyProcess);\n console.log(`${logPrefix} PTY spawned (pid: ${ptyProcess.pid})`);\n\n ptyProcess.onData((data: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n });\n\n ptyProcess.onExit(({ exitCode }) => {\n console.log(`${logPrefix} PTY exited with code ${exitCode}`);\n activePtys.delete(ptyProcess);\n if (exitCode === 127 && ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"setup-status\",\n status: \"not-found\",\n message: `Command \"${command}\" not found. Please install it first.`,\n }),\n );\n }\n if (ws.readyState === WebSocket.OPEN) {\n ws.close();\n }\n });\n\n ws.on(\"message\", async (data: Buffer | string) => {\n const str = typeof data === \"string\" ? data : data.toString();\n\n try {\n const msg = JSON.parse(str);\n\n if (\n msg.type === \"agentNative.setEnvVars\" &&\n Array.isArray(msg.data?.vars)\n ) {\n const envPath = path.join(resolvedAppDir, \".env\");\n const vars: Array<{ key: string; value: string }> = msg.data.vars;\n\n // Validate env var names and sanitize values\n const validKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;\n const sanitizedVars = vars.filter(({ key }) => {\n if (!validKeyPattern.test(key)) {\n console.warn(`${logPrefix} Rejected invalid env var key: ${key}`);\n return false;\n }\n return true;\n });\n\n const fs = await getFs();\n let lines: string[] = [];\n try {\n lines = fs.readFileSync(envPath, \"utf-8\").split(\"\\n\");\n } catch {}\n\n for (const { key, value } of sanitizedVars) {\n // Strip newlines/null bytes to prevent line injection\n const safeValue = value.replace(/[\\r\\n\\0]/g, \"\");\n // Quote values containing #, spaces, or quotes so dotenv parses correctly\n const needsQuoting = /[# \"']/.test(safeValue);\n const quotedValue = needsQuoting\n ? `\"${safeValue.replace(/\"/g, '\\\\\"')}\"`\n : safeValue;\n const idx = lines.findIndex((l) => l.startsWith(`${key}=`));\n const entry = `${key}=${quotedValue}`;\n if (idx !== -1) {\n lines[idx] = entry;\n } else {\n lines.push(entry);\n }\n }\n\n while (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n fs.writeFileSync(envPath, lines.join(\"\\n\") + \"\\n\", \"utf-8\");\n\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"env-vars-saved\",\n keys: sanitizedVars.map((v) => v.key),\n }),\n );\n }\n return;\n }\n\n if (msg.type === \"resize\" && msg.cols != null && msg.rows != null) {\n const cols = Math.max(\n 1,\n Math.min(65535, Math.trunc(Number(msg.cols))),\n );\n const rows = Math.max(\n 1,\n Math.min(65535, Math.trunc(Number(msg.rows))),\n );\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return;\n ptyProcess.resize(cols, rows);\n return;\n }\n } catch {\n // Not JSON — regular terminal input\n }\n\n ptyProcess.write(str);\n });\n\n ws.on(\"close\", () => {\n console.log(\n `${logPrefix} WebSocket closed, killing PTY tree (pid: ${ptyProcess.pid})`,\n );\n activePtys.delete(ptyProcess);\n killProcessTree(ptyProcess.pid, logPrefix);\n });\n });\n\n return new Promise((resolve, reject) => {\n server.once(\"error\", (err) => {\n reject(err);\n });\n server.listen(port, \"127.0.0.1\", () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n if (process.env.DEBUG)\n console.log(\n `${logPrefix} PTY WebSocket server on ws://localhost:${actualPort}/ws`,\n );\n\n resolve({\n server,\n port: actualPort,\n close: () => {\n for (const p of activePtys) {\n killProcessTree(p.pid, logPrefix);\n }\n activePtys.clear();\n wss.close();\n server.close();\n },\n });\n });\n });\n}\n"]}
|
|
@@ -324,7 +324,7 @@ async function dispatchAgentic(resource, meta, body, payload, eventMeta, apiKey)
|
|
|
324
324
|
const model = _deps.model ??
|
|
325
325
|
(await getStoredModelForEngine(engine, { appId: _deps.appId })) ??
|
|
326
326
|
engine.defaultModel;
|
|
327
|
-
|
|
327
|
+
await createThread(jobUserEmail, {
|
|
328
328
|
title: `Trigger: ${triggerName} — ${now.toLocaleDateString()}`,
|
|
329
329
|
});
|
|
330
330
|
let payloadStr;
|