@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-near-bottom-autoscroll.d.ts","sourceRoot":"","sources":["../../../src/client/conversation/use-near-bottom-autoscroll.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,SAAS,WAAW,EAAE,EACpE,SAAS,EACT,SAAiB,EACjB,SAAa,EACb,OAAc,GACf,EAAE,8BAA8B;;;;;;;
|
|
1
|
+
{"version":3,"file":"use-near-bottom-autoscroll.d.ts","sourceRoot":"","sources":["../../../src/client/conversation/use-near-bottom-autoscroll.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,SAAS,WAAW,EAAE,EACpE,SAAS,EACT,SAAiB,EACjB,SAAa,EACb,OAAc,GACf,EAAE,8BAA8B;;;;;;;EAqNhC"}
|
|
@@ -53,6 +53,7 @@ export function useNearBottomAutoscroll({ followKey, streaming = false, threshol
|
|
|
53
53
|
if (!el || !enabled)
|
|
54
54
|
return;
|
|
55
55
|
lastScrollTopRef.current = el.scrollTop;
|
|
56
|
+
let lastScrollHeight = el.scrollHeight;
|
|
56
57
|
const onWheel = (event) => {
|
|
57
58
|
if (event.deltaY < 0)
|
|
58
59
|
detachFromBottom();
|
|
@@ -76,8 +77,20 @@ export function useNearBottomAutoscroll({ followKey, streaming = false, threshol
|
|
|
76
77
|
const onScroll = () => {
|
|
77
78
|
const previousScrollTop = lastScrollTopRef.current;
|
|
78
79
|
const nextScrollTop = el.scrollTop;
|
|
80
|
+
const nextScrollHeight = el.scrollHeight;
|
|
81
|
+
// When the message list briefly shrinks (a re-render swaps content, a
|
|
82
|
+
// streaming/reconnect placeholder collapses, images unload, the message
|
|
83
|
+
// list remounts as a new run starts, etc.) the browser is forced to clamp
|
|
84
|
+
// scrollTop downward and fires a scroll event. That clamp is not the user
|
|
85
|
+
// scrolling up — treating it as such detaches auto-follow and strands the
|
|
86
|
+
// conversation scrolled up, sometimes all the way at the top. Only treat a
|
|
87
|
+
// downward jump as user intent when the content did not shrink underneath
|
|
88
|
+
// it. Genuine user scroll-ups (wheel/touch/keys, scrollbar drag at a
|
|
89
|
+
// stable height) are unaffected.
|
|
90
|
+
const contentShrank = nextScrollHeight < lastScrollHeight;
|
|
79
91
|
lastScrollTopRef.current = nextScrollTop;
|
|
80
|
-
|
|
92
|
+
lastScrollHeight = nextScrollHeight;
|
|
93
|
+
if (nextScrollTop < previousScrollTop && !contentShrank) {
|
|
81
94
|
detachFromBottom();
|
|
82
95
|
return;
|
|
83
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-near-bottom-autoscroll.js","sourceRoot":"","sources":["../../../src/client/conversation/use-near-bottom-autoscroll.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseNearBottomAutoscrollOptions {\n followKey: unknown;\n streaming?: boolean;\n threshold?: number;\n enabled?: boolean;\n}\n\nexport function useNearBottomAutoscroll<TElement extends HTMLElement>({\n followKey,\n streaming = false,\n threshold = 4,\n enabled = true,\n}: UseNearBottomAutoscrollOptions) {\n const scrollRef = useRef<TElement | null>(null);\n const isNearBottomRef = useRef(true);\n const followGenerationRef = useRef(0);\n const lastScrollTopRef = useRef(0);\n const lastTouchYRef = useRef<number | null>(null);\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n\n const isAtBottom = useCallback(\n (el: HTMLElement) =>\n el.scrollHeight - el.scrollTop - el.clientHeight <= threshold,\n [threshold],\n );\n\n const setFollowingBottom = useCallback(\n (following: boolean, forceGeneration = false, el?: HTMLElement) => {\n if (forceGeneration || isNearBottomRef.current !== following) {\n followGenerationRef.current += 1;\n }\n isNearBottomRef.current = following;\n const canScroll = !el || el.scrollHeight > el.clientHeight + threshold;\n setShowScrollToBottom(!following && canScroll);\n },\n [threshold],\n );\n\n const detachFromBottom = useCallback(() => {\n setFollowingBottom(false, true, scrollRef.current ?? undefined);\n }, [setFollowingBottom]);\n\n const updateBottomState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (isAtBottom(el)) setFollowingBottom(true, false, el);\n else if (!isNearBottomRef.current) {\n setShowScrollToBottom(el.scrollHeight > el.clientHeight + threshold);\n }\n }, [isAtBottom, setFollowingBottom, threshold]);\n\n const scrollToBottomIfFollowing = useCallback(\n (generation: number) => {\n if (\n followGenerationRef.current !== generation ||\n !isNearBottomRef.current\n ) {\n return;\n }\n const el = scrollRef.current;\n if (!el) return;\n el.scrollTop = Math.max(0, el.scrollHeight - el.clientHeight);\n lastScrollTopRef.current = el.scrollTop;\n setFollowingBottom(true, false, el);\n },\n [setFollowingBottom],\n );\n\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n setFollowingBottom(true, true, el);\n el.scrollTop = Math.max(0, el.scrollHeight - el.clientHeight);\n lastScrollTopRef.current = el.scrollTop;\n }, [setFollowingBottom]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el || !enabled) return;\n lastScrollTopRef.current = el.scrollTop;\n\n const onWheel = (event: WheelEvent) => {\n if (event.deltaY < 0) detachFromBottom();\n };\n\n const onTouchStart = (event: TouchEvent) => {\n lastTouchYRef.current = event.touches[0]?.clientY ?? null;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n const nextTouchY = event.touches[0]?.clientY;\n if (nextTouchY == null) return;\n const lastTouchY = lastTouchYRef.current;\n if (lastTouchY != null && nextTouchY > lastTouchY) {\n detachFromBottom();\n }\n lastTouchYRef.current = nextTouchY;\n };\n\n const onTouchEnd = () => {\n lastTouchYRef.current = null;\n };\n\n const onScroll = () => {\n const previousScrollTop = lastScrollTopRef.current;\n const nextScrollTop = el.scrollTop;\n lastScrollTopRef.current = nextScrollTop;\n if (nextScrollTop < previousScrollTop) {\n detachFromBottom();\n return;\n }\n updateBottomState();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === \"ArrowUp\" ||\n event.key === \"PageUp\" ||\n event.key === \"Home\" ||\n (event.key === \" \" && event.shiftKey)\n ) {\n detachFromBottom();\n }\n };\n el.addEventListener(\"wheel\", onWheel, { passive: true });\n el.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n el.addEventListener(\"touchmove\", onTouchMove, { passive: true });\n el.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n el.addEventListener(\"touchcancel\", onTouchEnd, { passive: true });\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n el.addEventListener(\"keydown\", onKeyDown);\n updateBottomState();\n\n // Re-check near-bottom whenever the scroll container's content grows\n // (e.g. new messages appended, images loaded, tool-call details expanded).\n // Without this the \"near bottom\" flag can get stuck as `false` even though\n // the user never scrolled away — the container just grew taller.\n let ro: ResizeObserver | null = null;\n let mo: MutationObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n const observeResizeTargets = () => {\n ro?.disconnect();\n ro = new ResizeObserver(() => {\n if (isNearBottomRef.current) {\n scrollToBottomIfFollowing(followGenerationRef.current);\n } else {\n updateBottomState();\n }\n });\n ro.observe(el);\n // Also watch direct children so inline content changes are caught.\n for (const child of Array.from(el.children)) ro.observe(child);\n };\n observeResizeTargets();\n if (typeof MutationObserver !== \"undefined\") {\n mo = new MutationObserver(() => {\n observeResizeTargets();\n if (isNearBottomRef.current) {\n scrollToBottomIfFollowing(followGenerationRef.current);\n }\n });\n mo.observe(el, { childList: true });\n }\n }\n\n return () => {\n el.removeEventListener(\"wheel\", onWheel);\n el.removeEventListener(\"touchstart\", onTouchStart);\n el.removeEventListener(\"touchmove\", onTouchMove);\n el.removeEventListener(\"touchend\", onTouchEnd);\n el.removeEventListener(\"touchcancel\", onTouchEnd);\n el.removeEventListener(\"scroll\", onScroll);\n el.removeEventListener(\"keydown\", onKeyDown);\n ro?.disconnect();\n mo?.disconnect();\n };\n }, [detachFromBottom, enabled, scrollToBottomIfFollowing, updateBottomState]);\n\n const scrollToBottomAfterPaint = useCallback(() => {\n const generation = followGenerationRef.current;\n scrollToBottomIfFollowing(generation);\n requestAnimationFrame(() => {\n scrollToBottomIfFollowing(generation);\n requestAnimationFrame(() => scrollToBottomIfFollowing(generation));\n });\n window.setTimeout(() => scrollToBottomIfFollowing(generation), 80);\n }, [scrollToBottomIfFollowing]);\n\n const markNearBottom = useCallback(() => {\n setFollowingBottom(true, true, scrollRef.current ?? undefined);\n }, [setFollowingBottom]);\n\n useEffect(() => {\n if (!enabled || !isNearBottomRef.current) return;\n scrollToBottomAfterPaint();\n }, [enabled, followKey, scrollToBottomAfterPaint]);\n\n useEffect(() => {\n if (!enabled || !streaming) return;\n const id = window.setInterval(() => {\n scrollToBottomIfFollowing(followGenerationRef.current);\n }, 100);\n return () => window.clearInterval(id);\n }, [enabled, scrollToBottomIfFollowing, streaming]);\n\n return {\n scrollRef,\n isNearBottomRef,\n showScrollToBottom,\n markNearBottom,\n scrollToBottom,\n scrollToBottomAfterPaint,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-near-bottom-autoscroll.js","sourceRoot":"","sources":["../../../src/client/conversation/use-near-bottom-autoscroll.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseNearBottomAutoscrollOptions {\n followKey: unknown;\n streaming?: boolean;\n threshold?: number;\n enabled?: boolean;\n}\n\nexport function useNearBottomAutoscroll<TElement extends HTMLElement>({\n followKey,\n streaming = false,\n threshold = 4,\n enabled = true,\n}: UseNearBottomAutoscrollOptions) {\n const scrollRef = useRef<TElement | null>(null);\n const isNearBottomRef = useRef(true);\n const followGenerationRef = useRef(0);\n const lastScrollTopRef = useRef(0);\n const lastTouchYRef = useRef<number | null>(null);\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n\n const isAtBottom = useCallback(\n (el: HTMLElement) =>\n el.scrollHeight - el.scrollTop - el.clientHeight <= threshold,\n [threshold],\n );\n\n const setFollowingBottom = useCallback(\n (following: boolean, forceGeneration = false, el?: HTMLElement) => {\n if (forceGeneration || isNearBottomRef.current !== following) {\n followGenerationRef.current += 1;\n }\n isNearBottomRef.current = following;\n const canScroll = !el || el.scrollHeight > el.clientHeight + threshold;\n setShowScrollToBottom(!following && canScroll);\n },\n [threshold],\n );\n\n const detachFromBottom = useCallback(() => {\n setFollowingBottom(false, true, scrollRef.current ?? undefined);\n }, [setFollowingBottom]);\n\n const updateBottomState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (isAtBottom(el)) setFollowingBottom(true, false, el);\n else if (!isNearBottomRef.current) {\n setShowScrollToBottom(el.scrollHeight > el.clientHeight + threshold);\n }\n }, [isAtBottom, setFollowingBottom, threshold]);\n\n const scrollToBottomIfFollowing = useCallback(\n (generation: number) => {\n if (\n followGenerationRef.current !== generation ||\n !isNearBottomRef.current\n ) {\n return;\n }\n const el = scrollRef.current;\n if (!el) return;\n el.scrollTop = Math.max(0, el.scrollHeight - el.clientHeight);\n lastScrollTopRef.current = el.scrollTop;\n setFollowingBottom(true, false, el);\n },\n [setFollowingBottom],\n );\n\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n setFollowingBottom(true, true, el);\n el.scrollTop = Math.max(0, el.scrollHeight - el.clientHeight);\n lastScrollTopRef.current = el.scrollTop;\n }, [setFollowingBottom]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el || !enabled) return;\n lastScrollTopRef.current = el.scrollTop;\n let lastScrollHeight = el.scrollHeight;\n\n const onWheel = (event: WheelEvent) => {\n if (event.deltaY < 0) detachFromBottom();\n };\n\n const onTouchStart = (event: TouchEvent) => {\n lastTouchYRef.current = event.touches[0]?.clientY ?? null;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n const nextTouchY = event.touches[0]?.clientY;\n if (nextTouchY == null) return;\n const lastTouchY = lastTouchYRef.current;\n if (lastTouchY != null && nextTouchY > lastTouchY) {\n detachFromBottom();\n }\n lastTouchYRef.current = nextTouchY;\n };\n\n const onTouchEnd = () => {\n lastTouchYRef.current = null;\n };\n\n const onScroll = () => {\n const previousScrollTop = lastScrollTopRef.current;\n const nextScrollTop = el.scrollTop;\n const nextScrollHeight = el.scrollHeight;\n // When the message list briefly shrinks (a re-render swaps content, a\n // streaming/reconnect placeholder collapses, images unload, the message\n // list remounts as a new run starts, etc.) the browser is forced to clamp\n // scrollTop downward and fires a scroll event. That clamp is not the user\n // scrolling up — treating it as such detaches auto-follow and strands the\n // conversation scrolled up, sometimes all the way at the top. Only treat a\n // downward jump as user intent when the content did not shrink underneath\n // it. Genuine user scroll-ups (wheel/touch/keys, scrollbar drag at a\n // stable height) are unaffected.\n const contentShrank = nextScrollHeight < lastScrollHeight;\n lastScrollTopRef.current = nextScrollTop;\n lastScrollHeight = nextScrollHeight;\n if (nextScrollTop < previousScrollTop && !contentShrank) {\n detachFromBottom();\n return;\n }\n updateBottomState();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === \"ArrowUp\" ||\n event.key === \"PageUp\" ||\n event.key === \"Home\" ||\n (event.key === \" \" && event.shiftKey)\n ) {\n detachFromBottom();\n }\n };\n el.addEventListener(\"wheel\", onWheel, { passive: true });\n el.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n el.addEventListener(\"touchmove\", onTouchMove, { passive: true });\n el.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n el.addEventListener(\"touchcancel\", onTouchEnd, { passive: true });\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n el.addEventListener(\"keydown\", onKeyDown);\n updateBottomState();\n\n // Re-check near-bottom whenever the scroll container's content grows\n // (e.g. new messages appended, images loaded, tool-call details expanded).\n // Without this the \"near bottom\" flag can get stuck as `false` even though\n // the user never scrolled away — the container just grew taller.\n let ro: ResizeObserver | null = null;\n let mo: MutationObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n const observeResizeTargets = () => {\n ro?.disconnect();\n ro = new ResizeObserver(() => {\n if (isNearBottomRef.current) {\n scrollToBottomIfFollowing(followGenerationRef.current);\n } else {\n updateBottomState();\n }\n });\n ro.observe(el);\n // Also watch direct children so inline content changes are caught.\n for (const child of Array.from(el.children)) ro.observe(child);\n };\n observeResizeTargets();\n if (typeof MutationObserver !== \"undefined\") {\n mo = new MutationObserver(() => {\n observeResizeTargets();\n if (isNearBottomRef.current) {\n scrollToBottomIfFollowing(followGenerationRef.current);\n }\n });\n mo.observe(el, { childList: true });\n }\n }\n\n return () => {\n el.removeEventListener(\"wheel\", onWheel);\n el.removeEventListener(\"touchstart\", onTouchStart);\n el.removeEventListener(\"touchmove\", onTouchMove);\n el.removeEventListener(\"touchend\", onTouchEnd);\n el.removeEventListener(\"touchcancel\", onTouchEnd);\n el.removeEventListener(\"scroll\", onScroll);\n el.removeEventListener(\"keydown\", onKeyDown);\n ro?.disconnect();\n mo?.disconnect();\n };\n }, [detachFromBottom, enabled, scrollToBottomIfFollowing, updateBottomState]);\n\n const scrollToBottomAfterPaint = useCallback(() => {\n const generation = followGenerationRef.current;\n scrollToBottomIfFollowing(generation);\n requestAnimationFrame(() => {\n scrollToBottomIfFollowing(generation);\n requestAnimationFrame(() => scrollToBottomIfFollowing(generation));\n });\n window.setTimeout(() => scrollToBottomIfFollowing(generation), 80);\n }, [scrollToBottomIfFollowing]);\n\n const markNearBottom = useCallback(() => {\n setFollowingBottom(true, true, scrollRef.current ?? undefined);\n }, [setFollowingBottom]);\n\n useEffect(() => {\n if (!enabled || !isNearBottomRef.current) return;\n scrollToBottomAfterPaint();\n }, [enabled, followKey, scrollToBottomAfterPaint]);\n\n useEffect(() => {\n if (!enabled || !streaming) return;\n const id = window.setInterval(() => {\n scrollToBottomIfFollowing(followGenerationRef.current);\n }, 100);\n return () => window.clearInterval(id);\n }, [enabled, scrollToBottomIfFollowing, streaming]);\n\n return {\n scrollRef,\n isNearBottomRef,\n showScrollToBottom,\n markNearBottom,\n scrollToBottom,\n scrollToBottomAfterPaint,\n };\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared QueryClient factory for agent-native apps.
|
|
3
|
+
*
|
|
4
|
+
* Exports a single `createAgentNativeQueryClient(overrides?)` so every
|
|
5
|
+
* template root uses the same house defaults rather than a bare
|
|
6
|
+
* `new QueryClient()` (which ships with staleTime=0 and
|
|
7
|
+
* refetchOnWindowFocus=true, causing unnecessary network requests because the
|
|
8
|
+
* useDbSync layer already pushes real-time invalidations on actual changes).
|
|
9
|
+
*
|
|
10
|
+
* House defaults:
|
|
11
|
+
* - staleTime 30s — data is considered fresh for 30 s; useDbSync invalidates
|
|
12
|
+
* on real changes so this only affects the window between sync events.
|
|
13
|
+
* - retry — never retry 401/403; allow one retry for transient errors.
|
|
14
|
+
* - refetchOnWindowFocus false — useDbSync already runs its own focus poll
|
|
15
|
+
* (use-db-sync.ts) so unconditional refetch on focus would double-fetch.
|
|
16
|
+
*
|
|
17
|
+
* Callers may pass deep overrides for intentional deviations (e.g. a template
|
|
18
|
+
* that uses a domain-specific staleTime for a particular query category).
|
|
19
|
+
*/
|
|
20
|
+
import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
|
|
21
|
+
/**
|
|
22
|
+
* Creates a QueryClient pre-configured with agent-native house defaults.
|
|
23
|
+
*
|
|
24
|
+
* Pass `overrides` for intentional template-specific deviations — only what
|
|
25
|
+
* actually differs from the house defaults should be specified.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createAgentNativeQueryClient(overrides?: QueryClientConfig): QueryClient;
|
|
28
|
+
//# sourceMappingURL=create-query-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-query-client.d.ts","sourceRoot":"","sources":["../../src/client/create-query-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAgC5E;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,iBAAiB,GAC5B,WAAW,CA0Bb"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared QueryClient factory for agent-native apps.
|
|
3
|
+
*
|
|
4
|
+
* Exports a single `createAgentNativeQueryClient(overrides?)` so every
|
|
5
|
+
* template root uses the same house defaults rather than a bare
|
|
6
|
+
* `new QueryClient()` (which ships with staleTime=0 and
|
|
7
|
+
* refetchOnWindowFocus=true, causing unnecessary network requests because the
|
|
8
|
+
* useDbSync layer already pushes real-time invalidations on actual changes).
|
|
9
|
+
*
|
|
10
|
+
* House defaults:
|
|
11
|
+
* - staleTime 30s — data is considered fresh for 30 s; useDbSync invalidates
|
|
12
|
+
* on real changes so this only affects the window between sync events.
|
|
13
|
+
* - retry — never retry 401/403; allow one retry for transient errors.
|
|
14
|
+
* - refetchOnWindowFocus false — useDbSync already runs its own focus poll
|
|
15
|
+
* (use-db-sync.ts) so unconditional refetch on focus would double-fetch.
|
|
16
|
+
*
|
|
17
|
+
* Callers may pass deep overrides for intentional deviations (e.g. a template
|
|
18
|
+
* that uses a domain-specific staleTime for a particular query category).
|
|
19
|
+
*/
|
|
20
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
21
|
+
/** Returns true for HTTP 401 / 403 responses wrapped as { status: number }. */
|
|
22
|
+
function isAuthFailure(error) {
|
|
23
|
+
return (!!error &&
|
|
24
|
+
typeof error === "object" &&
|
|
25
|
+
"status" in error &&
|
|
26
|
+
(error.status === 401 ||
|
|
27
|
+
error.status === 403));
|
|
28
|
+
}
|
|
29
|
+
/** House defaults merged into every template QueryClient. */
|
|
30
|
+
const HOUSE_DEFAULTS = {
|
|
31
|
+
defaultOptions: {
|
|
32
|
+
queries: {
|
|
33
|
+
// 30 s matches the mail template's battle-tested value; useDbSync
|
|
34
|
+
// invalidates caches on real DB changes so this gap is only relevant
|
|
35
|
+
// for the window between two sync events.
|
|
36
|
+
staleTime: 30_000,
|
|
37
|
+
// Never retry auth failures — they will not succeed on retry.
|
|
38
|
+
// Allow one retry for transient network/server errors.
|
|
39
|
+
retry: (failureCount, error) => !isAuthFailure(error) && failureCount < 1,
|
|
40
|
+
// The useDbSync hook already runs a focus-aware event poll, so
|
|
41
|
+
// React Query's own refetchOnWindowFocus would cause duplicate
|
|
42
|
+
// refetches on every window-focus event.
|
|
43
|
+
refetchOnWindowFocus: false,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Creates a QueryClient pre-configured with agent-native house defaults.
|
|
49
|
+
*
|
|
50
|
+
* Pass `overrides` for intentional template-specific deviations — only what
|
|
51
|
+
* actually differs from the house defaults should be specified.
|
|
52
|
+
*/
|
|
53
|
+
export function createAgentNativeQueryClient(overrides) {
|
|
54
|
+
if (!overrides) {
|
|
55
|
+
return new QueryClient(HOUSE_DEFAULTS);
|
|
56
|
+
}
|
|
57
|
+
// Deep-merge only the defaultOptions.queries layer so callers can override
|
|
58
|
+
// individual fields without having to replicate the full config.
|
|
59
|
+
const mergedQueries = {
|
|
60
|
+
...HOUSE_DEFAULTS.defaultOptions?.queries,
|
|
61
|
+
...overrides.defaultOptions?.queries,
|
|
62
|
+
};
|
|
63
|
+
const mergedMutations = {
|
|
64
|
+
...HOUSE_DEFAULTS.defaultOptions?.mutations,
|
|
65
|
+
...overrides.defaultOptions?.mutations,
|
|
66
|
+
};
|
|
67
|
+
return new QueryClient({
|
|
68
|
+
...HOUSE_DEFAULTS,
|
|
69
|
+
...overrides,
|
|
70
|
+
defaultOptions: {
|
|
71
|
+
...HOUSE_DEFAULTS.defaultOptions,
|
|
72
|
+
...overrides.defaultOptions,
|
|
73
|
+
queries: mergedQueries,
|
|
74
|
+
mutations: mergedMutations,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=create-query-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-query-client.js","sourceRoot":"","sources":["../../src/client/create-query-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,WAAW,EAA0B,MAAM,uBAAuB,CAAC;AAE5E,+EAA+E;AAC/E,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,CAAC,CAAC,KAAK;QACP,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QACjB,CAAE,KAA8B,CAAC,MAAM,KAAK,GAAG;YAC5C,KAA8B,CAAC,MAAM,KAAK,GAAG,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,cAAc,GAAsB;IACxC,cAAc,EAAE;QACd,OAAO,EAAE;YACP,kEAAkE;YAClE,qEAAqE;YACrE,0CAA0C;YAC1C,SAAS,EAAE,MAAM;YACjB,8DAA8D;YAC9D,uDAAuD;YACvD,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC;YACzE,+DAA+D;YAC/D,+DAA+D;YAC/D,yCAAyC;YACzC,oBAAoB,EAAE,KAAK;SAC5B;KACF;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,SAA6B;IAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,aAAa,GAAG;QACpB,GAAG,cAAc,CAAC,cAAc,EAAE,OAAO;QACzC,GAAG,SAAS,CAAC,cAAc,EAAE,OAAO;KACrC,CAAC;IACF,MAAM,eAAe,GAAG;QACtB,GAAG,cAAc,CAAC,cAAc,EAAE,SAAS;QAC3C,GAAG,SAAS,CAAC,cAAc,EAAE,SAAS;KACvC,CAAC;IAEF,OAAO,IAAI,WAAW,CAAC;QACrB,GAAG,cAAc;QACjB,GAAG,SAAS;QACZ,cAAc,EAAE;YACd,GAAG,cAAc,CAAC,cAAc;YAChC,GAAG,SAAS,CAAC,cAAc;YAC3B,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,eAAe;SAC3B;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Shared QueryClient factory for agent-native apps.\n *\n * Exports a single `createAgentNativeQueryClient(overrides?)` so every\n * template root uses the same house defaults rather than a bare\n * `new QueryClient()` (which ships with staleTime=0 and\n * refetchOnWindowFocus=true, causing unnecessary network requests because the\n * useDbSync layer already pushes real-time invalidations on actual changes).\n *\n * House defaults:\n * - staleTime 30s — data is considered fresh for 30 s; useDbSync invalidates\n * on real changes so this only affects the window between sync events.\n * - retry — never retry 401/403; allow one retry for transient errors.\n * - refetchOnWindowFocus false — useDbSync already runs its own focus poll\n * (use-db-sync.ts) so unconditional refetch on focus would double-fetch.\n *\n * Callers may pass deep overrides for intentional deviations (e.g. a template\n * that uses a domain-specific staleTime for a particular query category).\n */\nimport { QueryClient, type QueryClientConfig } from \"@tanstack/react-query\";\n\n/** Returns true for HTTP 401 / 403 responses wrapped as { status: number }. */\nfunction isAuthFailure(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n ((error as { status?: unknown }).status === 401 ||\n (error as { status?: unknown }).status === 403)\n );\n}\n\n/** House defaults merged into every template QueryClient. */\nconst HOUSE_DEFAULTS: QueryClientConfig = {\n defaultOptions: {\n queries: {\n // 30 s matches the mail template's battle-tested value; useDbSync\n // invalidates caches on real DB changes so this gap is only relevant\n // for the window between two sync events.\n staleTime: 30_000,\n // Never retry auth failures — they will not succeed on retry.\n // Allow one retry for transient network/server errors.\n retry: (failureCount, error) => !isAuthFailure(error) && failureCount < 1,\n // The useDbSync hook already runs a focus-aware event poll, so\n // React Query's own refetchOnWindowFocus would cause duplicate\n // refetches on every window-focus event.\n refetchOnWindowFocus: false,\n },\n },\n};\n\n/**\n * Creates a QueryClient pre-configured with agent-native house defaults.\n *\n * Pass `overrides` for intentional template-specific deviations — only what\n * actually differs from the house defaults should be specified.\n */\nexport function createAgentNativeQueryClient(\n overrides?: QueryClientConfig,\n): QueryClient {\n if (!overrides) {\n return new QueryClient(HOUSE_DEFAULTS);\n }\n\n // Deep-merge only the defaultOptions.queries layer so callers can override\n // individual fields without having to replicate the full config.\n const mergedQueries = {\n ...HOUSE_DEFAULTS.defaultOptions?.queries,\n ...overrides.defaultOptions?.queries,\n };\n const mergedMutations = {\n ...HOUSE_DEFAULTS.defaultOptions?.mutations,\n ...overrides.defaultOptions?.mutations,\n };\n\n return new QueryClient({\n ...HOUSE_DEFAULTS,\n ...overrides,\n defaultOptions: {\n ...HOUSE_DEFAULTS.defaultOptions,\n ...overrides.defaultOptions,\n queries: mergedQueries,\n mutations: mergedMutations,\n },\n });\n}\n"]}
|
|
@@ -15,5 +15,5 @@ export interface DevDatabaseLinkProps {
|
|
|
15
15
|
* gated on the server, so this is purely a convenience affordance — never a
|
|
16
16
|
* security boundary.
|
|
17
17
|
*/
|
|
18
|
-
export declare function DevDatabaseLink({ className, to, }: DevDatabaseLinkProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare function DevDatabaseLink({ className, to, }: DevDatabaseLinkProps): import("react/jsx-runtime").JSX.Element | null;
|
|
19
19
|
//# sourceMappingURL=DevDatabaseLink.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevDatabaseLink.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/DevDatabaseLink.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,EAAgB,GACjB,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"DevDatabaseLink.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/DevDatabaseLink.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,EAAgB,GACjB,EAAE,oBAAoB,kDAmBtB"}
|
|
@@ -14,5 +14,5 @@ export interface RowSidePanelProps {
|
|
|
14
14
|
*/
|
|
15
15
|
onSave: (values: Record<string, unknown>) => void;
|
|
16
16
|
}
|
|
17
|
-
export declare function RowSidePanel({ schema, mode, row, staged, onClose, onSave, }: RowSidePanelProps):
|
|
17
|
+
export declare function RowSidePanel({ schema, mode, row, staged, onClose, onSave, }: RowSidePanelProps): import("react").ReactPortal | null;
|
|
18
18
|
//# sourceMappingURL=RowSidePanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RowSidePanel.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/RowSidePanel.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACnD;AA2BD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,GAAG,EACH,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"RowSidePanel.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/RowSidePanel.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACnD;AA2BD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,GAAG,EACH,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,iBAAiB,sCA4InB"}
|
|
@@ -4,7 +4,7 @@ import { createPortal } from "react-dom";
|
|
|
4
4
|
import { IconKey, IconX, IconRefresh, IconCircleX } from "@tabler/icons-react";
|
|
5
5
|
import { cn } from "../utils.js";
|
|
6
6
|
import { inferEditorKind, inferEnumValues, valueToEditString, parseEditValue, ParseError, } from "./cell-format.js";
|
|
7
|
-
function initialFieldState(
|
|
7
|
+
function initialFieldState(_col, kind, value, isInsert) {
|
|
8
8
|
const isNull = value === null || value === undefined;
|
|
9
9
|
return {
|
|
10
10
|
text: isNull ? "" : valueToEditString(value, kind),
|
|
@@ -89,7 +89,7 @@ export function RowSidePanel({ schema, mode, row, staged, onClose, onSave, }) {
|
|
|
89
89
|
return null;
|
|
90
90
|
return createPortal(panel, document.body);
|
|
91
91
|
}
|
|
92
|
-
function RowField({ column, state, isInsert, onChange, }) {
|
|
92
|
+
function RowField({ column, state, isInsert: _isInsert, onChange, }) {
|
|
93
93
|
const kind = inferEditorKind(column);
|
|
94
94
|
const enumValues = inferEnumValues(column);
|
|
95
95
|
const isGenerated = column.pk && column.autoIncrement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RowSidePanel.js","sourceRoot":"","sources":["../../../src/client/db-admin/RowSidePanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconKey, IconX, IconRefresh, IconCircleX } from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport {\n inferEditorKind,\n inferEnumValues,\n valueToEditString,\n parseEditValue,\n ParseError,\n type EditorKind,\n} from \"./cell-format.js\";\nimport type {\n DbAdminColumn,\n DbAdminTableSchema,\n} from \"../../db-admin/types.js\";\n\nexport type RowSidePanelMode = \"insert\" | \"edit\";\n\nexport interface RowSidePanelProps {\n schema: DbAdminTableSchema;\n mode: RowSidePanelMode;\n /** For edit mode: the original row values. */\n row?: Record<string, unknown>;\n /** For edit mode: staged overrides already in the changeset. */\n staged?: Record<string, unknown>;\n onClose: () => void;\n /**\n * Persist into the changeset. For insert mode `values` is the full new-row\n * object; for edit mode it is only the changed columns.\n */\n onSave: (values: Record<string, unknown>) => void;\n}\n\ntype FieldState = {\n /** Raw text in the input. */\n text: string;\n /** Whether the field is explicitly set to NULL. */\n isNull: boolean;\n /** Parse error, if any. */\n error?: string | null;\n /** Whether the user has touched this field (insert) — drives \"blank = skip\". */\n touched: boolean;\n};\n\nfunction initialFieldState(\n col: DbAdminColumn,\n kind: EditorKind,\n value: unknown,\n isInsert: boolean,\n): FieldState {\n const isNull = value === null || value === undefined;\n return {\n text: isNull ? \"\" : valueToEditString(value, kind),\n isNull: isInsert ? false : isNull,\n touched: false,\n };\n}\n\nexport function RowSidePanel({\n schema,\n mode,\n row,\n staged,\n onClose,\n onSave,\n}: RowSidePanelProps) {\n const isInsert = mode === \"insert\";\n const [fields, setFields] = useState<Record<string, FieldState>>(() => {\n const init: Record<string, FieldState> = {};\n for (const col of schema.columns) {\n const kind = inferEditorKind(col);\n const original = row?.[col.name];\n const value =\n staged && Object.prototype.hasOwnProperty.call(staged, col.name)\n ? staged[col.name]\n : original;\n init[col.name] = initialFieldState(col, kind, value, isInsert);\n }\n return init;\n });\n\n // Close on Escape.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const update = (name: string, patch: Partial<FieldState>) =>\n setFields((prev) => ({\n ...prev,\n [name]: { ...prev[name], ...patch, touched: true },\n }));\n\n const save = () => {\n const out: Record<string, unknown> = {};\n let hadError = false;\n const nextFields = { ...fields };\n\n for (const col of schema.columns) {\n const kind = inferEditorKind(col);\n const fs = fields[col.name];\n const isGenerated = col.pk && col.autoIncrement;\n\n if (fs.isNull) {\n // Explicit NULL.\n if (!isInsert || fs.touched) out[col.name] = null;\n continue;\n }\n\n // Insert: blank, untouched, auto/pk/default columns are left out entirely.\n if (isInsert && fs.text === \"\" && !fs.touched) {\n continue;\n }\n if (isInsert && fs.text === \"\" && (isGenerated || col.defaultValue)) {\n continue;\n }\n\n // Edit: only include columns the user touched.\n if (!isInsert && !fs.touched) continue;\n\n try {\n const parsed = parseEditValue(fs.text, kind, {\n allowEmptyString: kind === \"text\",\n });\n out[col.name] = parsed;\n } catch (err) {\n hadError = true;\n nextFields[col.name] = {\n ...fs,\n error: err instanceof ParseError ? err.message : String(err),\n };\n }\n }\n\n if (hadError) {\n setFields(nextFields);\n return;\n }\n onSave(out);\n onClose();\n };\n\n const panel = (\n <div className=\"fixed inset-0 z-[400] flex justify-end\">\n <div\n className=\"absolute inset-0 bg-black/30 backdrop-blur-[1px]\"\n onClick={onClose}\n />\n <div className=\"relative flex h-full w-full max-w-md flex-col border-l border-border bg-card shadow-xl\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <div>\n <h2 className=\"text-sm font-semibold text-foreground\">\n {isInsert ? \"Insert row\" : \"Edit row\"}\n </h2>\n <p className=\"text-xs text-muted-foreground\">{schema.name}</p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label=\"Close\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <div className=\"flex flex-col gap-4\">\n {schema.columns.map((col) => (\n <RowField\n key={col.name}\n column={col}\n state={fields[col.name]}\n isInsert={isInsert}\n onChange={(patch) => update(col.name, patch)}\n />\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 border-t border-border px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={save}\n className=\"rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {isInsert ? \"Stage insert\" : \"Stage changes\"}\n </button>\n </div>\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(panel, document.body);\n}\n\nfunction RowField({\n column,\n state,\n isInsert,\n onChange,\n}: {\n column: DbAdminColumn;\n state: FieldState;\n isInsert: boolean;\n onChange: (patch: Partial<FieldState>) => void;\n}) {\n const kind = inferEditorKind(column);\n const enumValues = inferEnumValues(column);\n const isGenerated = column.pk && column.autoIncrement;\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n {column.pk && <IconKey className=\"h-3 w-3 text-amber-500\" />}\n <label className=\"text-xs font-medium text-foreground\">\n {column.name}\n </label>\n <span className=\"rounded bg-muted px-1 py-0.5 font-mono text-[10px] text-muted-foreground\">\n {column.type}\n </span>\n {!column.nullable && (\n <span className=\"text-[10px] text-destructive\">required</span>\n )}\n {column.nullable && (\n <button\n type=\"button\"\n onClick={() => onChange({ isNull: !state.isNull })}\n className={cn(\n \"ml-auto rounded px-1.5 py-0.5 text-[10px]\",\n state.isNull\n ? \"bg-muted text-foreground ring-1 ring-inset ring-border\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {state.isNull ? \"NULL\" : \"set null\"}\n </button>\n )}\n </div>\n\n {state.isNull ? (\n <div className=\"flex items-center gap-2 rounded-md border border-dashed border-border bg-muted/30 px-2 py-1.5 text-xs italic text-muted-foreground/70\">\n NULL\n <button\n type=\"button\"\n onClick={() => onChange({ isNull: false })}\n className=\"ml-auto text-muted-foreground hover:text-foreground\"\n aria-label=\"Clear NULL\"\n >\n <IconCircleX className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ) : enumValues ? (\n <select\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n <option value=\"\">—</option>\n {enumValues.map((v) => (\n <option key={v} value={v}>\n {v}\n </option>\n ))}\n </select>\n ) : kind === \"boolean\" ? (\n <select\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : kind === \"json\" ? (\n <textarea\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n rows={4}\n spellCheck={false}\n placeholder={isGenerated ? \"(auto-generated)\" : \"{ }\"}\n className={cn(\n \"resize-y rounded-md border border-border bg-background p-2 font-mono text-xs outline-none focus:ring-1 focus:ring-ring\",\n state.error && \"border-destructive\",\n )}\n />\n ) : (\n <input\n type=\"text\"\n inputMode={kind === \"number\" ? \"decimal\" : undefined}\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n placeholder={\n isGenerated\n ? \"(auto-generated)\"\n : column.defaultValue\n ? `default: ${column.defaultValue}`\n : \"\"\n }\n className={cn(\n \"h-8 rounded-md border border-border bg-background px-2 font-mono text-xs outline-none focus:ring-1 focus:ring-ring\",\n state.error && \"border-destructive\",\n )}\n />\n )}\n\n {column.defaultValue && !isGenerated && !state.isNull && (\n <span className=\"text-[10px] text-muted-foreground/70\">\n default: {column.defaultValue}\n </span>\n )}\n {isGenerated && (\n <span className=\"flex items-center gap-1 text-[10px] text-muted-foreground/70\">\n <IconRefresh className=\"h-3 w-3\" />\n auto-generated — leave blank\n </span>\n )}\n {state.error && (\n <span className=\"text-[10px] text-destructive\">{state.error}</span>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RowSidePanel.js","sourceRoot":"","sources":["../../../src/client/db-admin/RowSidePanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconKey, IconX, IconRefresh, IconCircleX } from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport {\n inferEditorKind,\n inferEnumValues,\n valueToEditString,\n parseEditValue,\n ParseError,\n type EditorKind,\n} from \"./cell-format.js\";\nimport type {\n DbAdminColumn,\n DbAdminTableSchema,\n} from \"../../db-admin/types.js\";\n\nexport type RowSidePanelMode = \"insert\" | \"edit\";\n\nexport interface RowSidePanelProps {\n schema: DbAdminTableSchema;\n mode: RowSidePanelMode;\n /** For edit mode: the original row values. */\n row?: Record<string, unknown>;\n /** For edit mode: staged overrides already in the changeset. */\n staged?: Record<string, unknown>;\n onClose: () => void;\n /**\n * Persist into the changeset. For insert mode `values` is the full new-row\n * object; for edit mode it is only the changed columns.\n */\n onSave: (values: Record<string, unknown>) => void;\n}\n\ntype FieldState = {\n /** Raw text in the input. */\n text: string;\n /** Whether the field is explicitly set to NULL. */\n isNull: boolean;\n /** Parse error, if any. */\n error?: string | null;\n /** Whether the user has touched this field (insert) — drives \"blank = skip\". */\n touched: boolean;\n};\n\nfunction initialFieldState(\n _col: DbAdminColumn,\n kind: EditorKind,\n value: unknown,\n isInsert: boolean,\n): FieldState {\n const isNull = value === null || value === undefined;\n return {\n text: isNull ? \"\" : valueToEditString(value, kind),\n isNull: isInsert ? false : isNull,\n touched: false,\n };\n}\n\nexport function RowSidePanel({\n schema,\n mode,\n row,\n staged,\n onClose,\n onSave,\n}: RowSidePanelProps) {\n const isInsert = mode === \"insert\";\n const [fields, setFields] = useState<Record<string, FieldState>>(() => {\n const init: Record<string, FieldState> = {};\n for (const col of schema.columns) {\n const kind = inferEditorKind(col);\n const original = row?.[col.name];\n const value =\n staged && Object.prototype.hasOwnProperty.call(staged, col.name)\n ? staged[col.name]\n : original;\n init[col.name] = initialFieldState(col, kind, value, isInsert);\n }\n return init;\n });\n\n // Close on Escape.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const update = (name: string, patch: Partial<FieldState>) =>\n setFields((prev) => ({\n ...prev,\n [name]: { ...prev[name], ...patch, touched: true },\n }));\n\n const save = () => {\n const out: Record<string, unknown> = {};\n let hadError = false;\n const nextFields = { ...fields };\n\n for (const col of schema.columns) {\n const kind = inferEditorKind(col);\n const fs = fields[col.name];\n const isGenerated = col.pk && col.autoIncrement;\n\n if (fs.isNull) {\n // Explicit NULL.\n if (!isInsert || fs.touched) out[col.name] = null;\n continue;\n }\n\n // Insert: blank, untouched, auto/pk/default columns are left out entirely.\n if (isInsert && fs.text === \"\" && !fs.touched) {\n continue;\n }\n if (isInsert && fs.text === \"\" && (isGenerated || col.defaultValue)) {\n continue;\n }\n\n // Edit: only include columns the user touched.\n if (!isInsert && !fs.touched) continue;\n\n try {\n const parsed = parseEditValue(fs.text, kind, {\n allowEmptyString: kind === \"text\",\n });\n out[col.name] = parsed;\n } catch (err) {\n hadError = true;\n nextFields[col.name] = {\n ...fs,\n error: err instanceof ParseError ? err.message : String(err),\n };\n }\n }\n\n if (hadError) {\n setFields(nextFields);\n return;\n }\n onSave(out);\n onClose();\n };\n\n const panel = (\n <div className=\"fixed inset-0 z-[400] flex justify-end\">\n <div\n className=\"absolute inset-0 bg-black/30 backdrop-blur-[1px]\"\n onClick={onClose}\n />\n <div className=\"relative flex h-full w-full max-w-md flex-col border-l border-border bg-card shadow-xl\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <div>\n <h2 className=\"text-sm font-semibold text-foreground\">\n {isInsert ? \"Insert row\" : \"Edit row\"}\n </h2>\n <p className=\"text-xs text-muted-foreground\">{schema.name}</p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label=\"Close\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <div className=\"flex flex-col gap-4\">\n {schema.columns.map((col) => (\n <RowField\n key={col.name}\n column={col}\n state={fields[col.name]}\n isInsert={isInsert}\n onChange={(patch) => update(col.name, patch)}\n />\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 border-t border-border px-4 py-3\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={save}\n className=\"rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {isInsert ? \"Stage insert\" : \"Stage changes\"}\n </button>\n </div>\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(panel, document.body);\n}\n\nfunction RowField({\n column,\n state,\n isInsert: _isInsert,\n onChange,\n}: {\n column: DbAdminColumn;\n state: FieldState;\n isInsert: boolean;\n onChange: (patch: Partial<FieldState>) => void;\n}) {\n const kind = inferEditorKind(column);\n const enumValues = inferEnumValues(column);\n const isGenerated = column.pk && column.autoIncrement;\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n {column.pk && <IconKey className=\"h-3 w-3 text-amber-500\" />}\n <label className=\"text-xs font-medium text-foreground\">\n {column.name}\n </label>\n <span className=\"rounded bg-muted px-1 py-0.5 font-mono text-[10px] text-muted-foreground\">\n {column.type}\n </span>\n {!column.nullable && (\n <span className=\"text-[10px] text-destructive\">required</span>\n )}\n {column.nullable && (\n <button\n type=\"button\"\n onClick={() => onChange({ isNull: !state.isNull })}\n className={cn(\n \"ml-auto rounded px-1.5 py-0.5 text-[10px]\",\n state.isNull\n ? \"bg-muted text-foreground ring-1 ring-inset ring-border\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {state.isNull ? \"NULL\" : \"set null\"}\n </button>\n )}\n </div>\n\n {state.isNull ? (\n <div className=\"flex items-center gap-2 rounded-md border border-dashed border-border bg-muted/30 px-2 py-1.5 text-xs italic text-muted-foreground/70\">\n NULL\n <button\n type=\"button\"\n onClick={() => onChange({ isNull: false })}\n className=\"ml-auto text-muted-foreground hover:text-foreground\"\n aria-label=\"Clear NULL\"\n >\n <IconCircleX className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ) : enumValues ? (\n <select\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n <option value=\"\">—</option>\n {enumValues.map((v) => (\n <option key={v} value={v}>\n {v}\n </option>\n ))}\n </select>\n ) : kind === \"boolean\" ? (\n <select\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : kind === \"json\" ? (\n <textarea\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n rows={4}\n spellCheck={false}\n placeholder={isGenerated ? \"(auto-generated)\" : \"{ }\"}\n className={cn(\n \"resize-y rounded-md border border-border bg-background p-2 font-mono text-xs outline-none focus:ring-1 focus:ring-ring\",\n state.error && \"border-destructive\",\n )}\n />\n ) : (\n <input\n type=\"text\"\n inputMode={kind === \"number\" ? \"decimal\" : undefined}\n value={state.text}\n onChange={(e) => onChange({ text: e.target.value, error: null })}\n placeholder={\n isGenerated\n ? \"(auto-generated)\"\n : column.defaultValue\n ? `default: ${column.defaultValue}`\n : \"\"\n }\n className={cn(\n \"h-8 rounded-md border border-border bg-background px-2 font-mono text-xs outline-none focus:ring-1 focus:ring-ring\",\n state.error && \"border-destructive\",\n )}\n />\n )}\n\n {column.defaultValue && !isGenerated && !state.isNull && (\n <span className=\"text-[10px] text-muted-foreground/70\">\n default: {column.defaultValue}\n </span>\n )}\n {isGenerated && (\n <span className=\"flex items-center gap-1 text-[10px] text-muted-foreground/70\">\n <IconRefresh className=\"h-3 w-3\" />\n auto-generated — leave blank\n </span>\n )}\n {state.error && (\n <span className=\"text-[10px] text-destructive\">{state.error}</span>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -5,5 +5,5 @@ export interface TableEditorProps {
|
|
|
5
5
|
initialFilters?: DbAdminFilter[];
|
|
6
6
|
onNavigateToRow: (table: string, filters: DbAdminFilter[]) => void;
|
|
7
7
|
}
|
|
8
|
-
export declare function TableEditor({ table, dialect, initialFilters, onNavigateToRow, }: TableEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function TableEditor({ table, dialect: _dialect, initialFilters, onNavigateToRow, }: TableEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
//# sourceMappingURL=TableEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CACpE;AAKD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,
|
|
1
|
+
{"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CACpE;AAKD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EAAE,QAAQ,EACjB,cAAc,EACd,eAAe,GAChB,EAAE,gBAAgB,2CAqelB"}
|
|
@@ -12,7 +12,7 @@ import { FilterBar } from "./FilterBar.js";
|
|
|
12
12
|
import { RowSidePanel } from "./RowSidePanel.js";
|
|
13
13
|
const DEFAULT_PAGE_SIZE = 100;
|
|
14
14
|
const PAGE_SIZES = [25, 50, 100, 250, 500];
|
|
15
|
-
export function TableEditor({ table, dialect, initialFilters, onNavigateToRow, }) {
|
|
15
|
+
export function TableEditor({ table, dialect: _dialect, initialFilters, onNavigateToRow, }) {
|
|
16
16
|
// ─── Persisted view state ──────────────────────────────────────────────
|
|
17
17
|
const persisted = useMemo(() => loadGridState(table), [table]);
|
|
18
18
|
const [page, setPage] = useState(1);
|