@agent-native/core 0.4.5 → 0.5.0-dev.b51eaae
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/dist/a2a/client.d.ts +7 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +24 -3
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts +6 -3
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +45 -39
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/index.d.ts +1 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +2 -2
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/server.d.ts +7 -2
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +54 -14
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +6 -6
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +102 -42
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/a2a/types.d.ts +2 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/action.d.ts +46 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +35 -0
- package/dist/action.js.map +1 -0
- package/dist/adapters/sync/file-sync.js +1 -1
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/production-agent.d.ts +22 -6
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +336 -123
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +43 -0
- package/dist/agent/run-manager.d.ts.map +1 -0
- package/dist/agent/run-manager.js +358 -0
- package/dist/agent/run-manager.js.map +1 -0
- package/dist/agent/run-store.d.ts +26 -0
- package/dist/agent/run-store.d.ts.map +1 -0
- package/dist/agent/run-store.js +145 -0
- package/dist/agent/run-store.js.map +1 -0
- package/dist/agent/thread-data-builder.d.ts +30 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -0
- package/dist/agent/thread-data-builder.js +88 -0
- package/dist/agent/thread-data-builder.js.map +1 -0
- package/dist/agent/types.d.ts +52 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/application-state/emitter.d.ts +3 -2
- package/dist/application-state/emitter.d.ts.map +1 -1
- package/dist/application-state/emitter.js +14 -4
- package/dist/application-state/emitter.js.map +1 -1
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/handlers.js +13 -16
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/application-state/script-helpers.d.ts +1 -1
- package/dist/application-state/script-helpers.d.ts.map +1 -1
- package/dist/application-state/script-helpers.js +15 -5
- package/dist/application-state/script-helpers.js.map +1 -1
- package/dist/application-state/store.d.ts +4 -3
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +31 -59
- package/dist/application-state/store.js.map +1 -1
- package/dist/chat-threads/emitter.d.ts +9 -0
- package/dist/chat-threads/emitter.d.ts.map +1 -0
- package/dist/chat-threads/emitter.js +14 -0
- package/dist/chat-threads/emitter.js.map +1 -0
- package/dist/chat-threads/store.d.ts +28 -0
- package/dist/chat-threads/store.d.ts.map +1 -0
- package/dist/chat-threads/store.js +124 -0
- package/dist/chat-threads/store.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +4 -18
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +30 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup-agents.d.ts +11 -0
- package/dist/cli/setup-agents.d.ts.map +1 -0
- package/dist/cli/setup-agents.js +123 -0
- package/dist/cli/setup-agents.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +9 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +466 -29
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +25 -3
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +613 -83
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ClientOnly.d.ts +14 -0
- package/dist/client/ClientOnly.d.ts.map +1 -0
- package/dist/client/ClientOnly.js +17 -0
- package/dist/client/ClientOnly.js.map +1 -0
- package/dist/client/CommandMenu.d.ts +71 -0
- package/dist/client/CommandMenu.d.ts.map +1 -0
- package/dist/client/CommandMenu.js +257 -0
- package/dist/client/CommandMenu.js.map +1 -0
- package/dist/client/DefaultSpinner.d.ts +7 -0
- package/dist/client/DefaultSpinner.d.ts.map +1 -0
- package/dist/client/DefaultSpinner.js +28 -0
- package/dist/client/DefaultSpinner.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts +34 -2
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +346 -57
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +2 -1
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/active-run-state.d.ts +10 -0
- package/dist/client/active-run-state.d.ts.map +1 -0
- package/dist/client/active-run-state.js +32 -0
- package/dist/client/active-run-state.js.map +1 -0
- package/dist/client/agent-chat-adapter.d.ts +2 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +83 -129
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.js +2 -2
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/components/ApiKeySettings.d.ts +2 -2
- package/dist/client/components/ApiKeySettings.js +4 -4
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +4 -3
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/composer/MentionPopover.d.ts +26 -0
- package/dist/client/composer/MentionPopover.d.ts.map +1 -0
- package/dist/client/composer/MentionPopover.js +130 -0
- package/dist/client/composer/MentionPopover.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts +19 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -0
- package/dist/client/composer/TiptapComposer.js +415 -0
- package/dist/client/composer/TiptapComposer.js.map +1 -0
- package/dist/client/composer/extensions/FileReference.d.ts +3 -0
- package/dist/client/composer/extensions/FileReference.d.ts.map +1 -0
- package/dist/client/composer/extensions/FileReference.js +36 -0
- package/dist/client/composer/extensions/FileReference.js.map +1 -0
- package/dist/client/composer/extensions/MentionReference.d.ts +3 -0
- package/dist/client/composer/extensions/MentionReference.d.ts.map +1 -0
- package/dist/client/composer/extensions/MentionReference.js +63 -0
- package/dist/client/composer/extensions/MentionReference.js.map +1 -0
- package/dist/client/composer/extensions/SkillReference.d.ts +3 -0
- package/dist/client/composer/extensions/SkillReference.d.ts.map +1 -0
- package/dist/client/composer/extensions/SkillReference.js +40 -0
- package/dist/client/composer/extensions/SkillReference.js.map +1 -0
- package/dist/client/composer/index.d.ts +8 -0
- package/dist/client/composer/index.d.ts.map +1 -0
- package/dist/client/composer/index.js +7 -0
- package/dist/client/composer/index.js.map +1 -0
- package/dist/client/composer/types.d.ts +32 -0
- package/dist/client/composer/types.d.ts.map +1 -0
- package/dist/client/composer/types.js +2 -0
- package/dist/client/composer/types.js.map +1 -0
- package/dist/client/composer/use-file-search.d.ts +6 -0
- package/dist/client/composer/use-file-search.d.ts.map +1 -0
- package/dist/client/composer/use-file-search.js +40 -0
- package/dist/client/composer/use-file-search.js.map +1 -0
- package/dist/client/composer/use-mention-search.d.ts +6 -0
- package/dist/client/composer/use-mention-search.d.ts.map +1 -0
- package/dist/client/composer/use-mention-search.js +39 -0
- package/dist/client/composer/use-mention-search.js.map +1 -0
- package/dist/client/composer/use-skills.d.ts +7 -0
- package/dist/client/composer/use-skills.d.ts.map +1 -0
- package/dist/client/composer/use-skills.js +38 -0
- package/dist/client/composer/use-skills.js.map +1 -0
- package/dist/client/index.d.ts +9 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +8 -3
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts +7 -0
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -0
- package/dist/client/resources/ResourceEditor.js +851 -0
- package/dist/client/resources/ResourceEditor.js.map +1 -0
- package/dist/client/resources/ResourceTree.d.ts +13 -0
- package/dist/client/resources/ResourceTree.d.ts.map +1 -0
- package/dist/client/resources/ResourceTree.js +122 -0
- package/dist/client/resources/ResourceTree.js.map +1 -0
- package/dist/client/resources/ResourcesPanel.d.ts +2 -0
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -0
- package/dist/client/resources/ResourcesPanel.js +341 -0
- package/dist/client/resources/ResourcesPanel.js.map +1 -0
- package/dist/client/resources/index.d.ts +5 -0
- package/dist/client/resources/index.d.ts.map +1 -0
- package/dist/client/resources/index.js +5 -0
- package/dist/client/resources/index.js.map +1 -0
- package/dist/client/resources/use-resources.d.ts +45 -0
- package/dist/client/resources/use-resources.d.ts.map +1 -0
- package/dist/client/resources/use-resources.js +102 -0
- package/dist/client/resources/use-resources.js.map +1 -0
- package/dist/client/sse-event-processor.d.ts +50 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -0
- package/dist/client/sse-event-processor.js +267 -0
- package/dist/client/sse-event-processor.js.map +1 -0
- 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 +11 -6
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/use-agent-chat.d.ts +1 -1
- package/dist/client/use-agent-chat.d.ts.map +1 -1
- package/dist/client/use-agent-chat.js +3 -3
- package/dist/client/use-agent-chat.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +36 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -0
- package/dist/client/use-chat-threads.js +175 -0
- package/dist/client/use-chat-threads.js.map +1 -0
- package/dist/client/use-db-sync.d.ts +35 -0
- package/dist/client/use-db-sync.d.ts.map +1 -0
- package/dist/client/use-db-sync.js +74 -0
- package/dist/client/use-db-sync.js.map +1 -0
- package/dist/client/use-dev-mode.d.ts +4 -2
- package/dist/client/use-dev-mode.d.ts.map +1 -1
- package/dist/client/use-dev-mode.js +39 -12
- package/dist/client/use-dev-mode.js.map +1 -1
- package/dist/client/use-file-sync-status.d.ts +1 -1
- package/dist/client/use-file-sync-status.js +3 -3
- package/dist/client/use-file-sync-status.js.map +1 -1
- package/dist/client/use-session.d.ts +1 -1
- package/dist/client/use-session.js +2 -2
- package/dist/client/use-session.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +38 -3
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/credentials/index.d.ts +18 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +32 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/db/client.d.ts +35 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +248 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +103 -16
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/index.d.ts +10 -6
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +10 -4
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +31 -30
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +45 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +61 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/deploy/build.js +35 -6
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/route-discovery.d.ts +9 -0
- package/dist/deploy/route-discovery.d.ts.map +1 -1
- package/dist/deploy/route-discovery.js +30 -1
- package/dist/deploy/route-discovery.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +43 -81
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/resources/emitter.d.ts +13 -0
- package/dist/resources/emitter.d.ts.map +1 -0
- package/dist/resources/emitter.js +32 -0
- package/dist/resources/emitter.js.map +1 -0
- package/dist/resources/handlers.d.ts +45 -0
- package/dist/resources/handlers.d.ts.map +1 -0
- package/dist/resources/handlers.js +219 -0
- package/dist/resources/handlers.js.map +1 -0
- package/dist/resources/index.d.ts +5 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +5 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/script-helpers.d.ts +24 -0
- package/dist/resources/script-helpers.d.ts.map +1 -0
- package/dist/resources/script-helpers.js +36 -0
- package/dist/resources/script-helpers.js.map +1 -0
- package/dist/resources/store.d.ts +35 -0
- package/dist/resources/store.d.ts.map +1 -0
- package/dist/resources/store.js +453 -0
- package/dist/resources/store.js.map +1 -0
- package/dist/scripts/call-agent.d.ts +5 -0
- package/dist/scripts/call-agent.d.ts.map +1 -0
- package/dist/scripts/call-agent.js +107 -0
- package/dist/scripts/call-agent.js.map +1 -0
- package/dist/scripts/core-scripts.d.ts.map +1 -1
- package/dist/scripts/core-scripts.js +2 -0
- package/dist/scripts/core-scripts.js.map +1 -1
- package/dist/scripts/db/exec.d.ts +6 -2
- package/dist/scripts/db/exec.d.ts.map +1 -1
- package/dist/scripts/db/exec.js +127 -36
- package/dist/scripts/db/exec.js.map +1 -1
- package/dist/scripts/db/query.d.ts +7 -2
- package/dist/scripts/db/query.d.ts.map +1 -1
- package/dist/scripts/db/query.js +89 -45
- package/dist/scripts/db/query.js.map +1 -1
- package/dist/scripts/db/schema.d.ts +2 -2
- package/dist/scripts/db/schema.d.ts.map +1 -1
- package/dist/scripts/db/schema.js +145 -6
- package/dist/scripts/db/schema.js.map +1 -1
- package/dist/scripts/db/scoping.d.ts +36 -0
- package/dist/scripts/db/scoping.d.ts.map +1 -0
- package/dist/scripts/db/scoping.js +198 -0
- package/dist/scripts/db/scoping.js.map +1 -0
- package/dist/scripts/dev/index.d.ts +2 -2
- package/dist/scripts/dev/index.js +1 -1
- package/dist/scripts/dev/list-files.d.ts +2 -2
- package/dist/scripts/dev/read-file.d.ts +2 -2
- package/dist/scripts/dev/read-file.js +1 -1
- package/dist/scripts/dev/read-file.js.map +1 -1
- package/dist/scripts/dev/search-files.d.ts +2 -2
- package/dist/scripts/dev/search-files.js +1 -1
- package/dist/scripts/dev/search-files.js.map +1 -1
- package/dist/scripts/dev/shell.d.ts +2 -2
- package/dist/scripts/dev/shell.js +1 -1
- package/dist/scripts/dev/shell.js.map +1 -1
- package/dist/scripts/dev/write-file.d.ts +2 -2
- package/dist/scripts/dev/write-file.js +1 -1
- package/dist/scripts/dev/write-file.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts +10 -0
- package/dist/scripts/resources/delete.d.ts.map +1 -0
- package/dist/scripts/resources/delete.js +38 -0
- package/dist/scripts/resources/delete.js.map +1 -0
- package/dist/scripts/resources/index.d.ts +2 -0
- package/dist/scripts/resources/index.d.ts.map +1 -0
- package/dist/scripts/resources/index.js +8 -0
- package/dist/scripts/resources/index.js.map +1 -0
- package/dist/scripts/resources/list.d.ts +10 -0
- package/dist/scripts/resources/list.d.ts.map +1 -0
- package/dist/scripts/resources/list.js +57 -0
- package/dist/scripts/resources/list.js.map +1 -0
- package/dist/scripts/resources/migrate-learnings.d.ts +10 -0
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -0
- package/dist/scripts/resources/migrate-learnings.js +23 -0
- package/dist/scripts/resources/migrate-learnings.js.map +1 -0
- package/dist/scripts/resources/read.d.ts +10 -0
- package/dist/scripts/resources/read.d.ts.map +1 -0
- package/dist/scripts/resources/read.js +59 -0
- package/dist/scripts/resources/read.js.map +1 -0
- package/dist/scripts/resources/write.d.ts +10 -0
- package/dist/scripts/resources/write.d.ts.map +1 -0
- package/dist/scripts/resources/write.js +67 -0
- package/dist/scripts/resources/write.js.map +1 -0
- package/dist/scripts/runner.d.ts +7 -7
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +68 -27
- package/dist/scripts/runner.js.map +1 -1
- package/dist/scripts/utils.d.ts +4 -1
- package/dist/scripts/utils.d.ts.map +1 -1
- package/dist/scripts/utils.js +5 -3
- package/dist/scripts/utils.js.map +1 -1
- package/dist/server/action-discovery.d.ts +40 -0
- package/dist/server/action-discovery.d.ts.map +1 -0
- package/dist/server/action-discovery.js +189 -0
- package/dist/server/action-discovery.js.map +1 -0
- package/dist/server/agent-chat-plugin.d.ts +12 -23
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +1087 -36
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts +16 -0
- package/dist/server/agent-discovery.d.ts.map +1 -0
- package/dist/server/agent-discovery.js +136 -0
- package/dist/server/agent-discovery.js.map +1 -0
- package/dist/server/auth-plugin.d.ts +5 -0
- package/dist/server/auth-plugin.d.ts.map +1 -1
- package/dist/server/auth-plugin.js +12 -1
- package/dist/server/auth-plugin.js.map +1 -1
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +576 -117
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +57 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -0
- package/dist/server/core-routes-plugin.js +125 -0
- package/dist/server/core-routes-plugin.js.map +1 -0
- package/dist/server/create-server.d.ts +4 -4
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +5 -5
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/default-watcher.d.ts +9 -3
- package/dist/server/default-watcher.d.ts.map +1 -1
- package/dist/server/default-watcher.js +26 -6
- package/dist/server/default-watcher.js.map +1 -1
- package/dist/server/google-auth-plugin.js +3 -3
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts +72 -0
- package/dist/server/google-oauth.d.ts.map +1 -0
- package/dist/server/google-oauth.js +187 -0
- package/dist/server/google-oauth.js.map +1 -0
- package/dist/server/index.d.ts +9 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts +16 -0
- package/dist/server/oauth-helpers.d.ts.map +1 -0
- package/dist/server/oauth-helpers.js +25 -0
- package/dist/server/oauth-helpers.js.map +1 -0
- package/dist/server/poll.d.ts +40 -0
- package/dist/server/poll.d.ts.map +1 -0
- package/dist/server/poll.js +49 -0
- package/dist/server/poll.js.map +1 -0
- package/dist/server/resources-plugin.d.ts +27 -0
- package/dist/server/resources-plugin.d.ts.map +1 -0
- package/dist/server/resources-plugin.js +74 -0
- package/dist/server/resources-plugin.js.map +1 -0
- package/dist/server/script-discovery.d.ts +6 -0
- package/dist/server/script-discovery.d.ts.map +1 -0
- package/dist/server/script-discovery.js +6 -0
- package/dist/server/script-discovery.js.map +1 -0
- package/dist/server/sse.d.ts +1 -1
- package/dist/server/sse.js +1 -1
- package/dist/settings/handlers.d.ts +3 -3
- package/dist/settings/handlers.d.ts.map +1 -1
- package/dist/settings/handlers.js +8 -6
- package/dist/settings/handlers.js.map +1 -1
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/store.d.ts +6 -2
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +26 -63
- package/dist/settings/store.js.map +1 -1
- package/dist/settings/user-settings.d.ts +3 -2
- package/dist/settings/user-settings.d.ts.map +1 -1
- package/dist/settings/user-settings.js +5 -5
- package/dist/settings/user-settings.js.map +1 -1
- package/dist/tailwind.preset.d.ts +7 -6
- package/dist/tailwind.preset.d.ts.map +1 -1
- package/dist/tailwind.preset.js +18 -1
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/terminal/cli-registry.d.ts +1 -1
- package/dist/terminal/cli-registry.js +3 -3
- package/dist/terminal/cli-registry.js.map +1 -1
- package/dist/terminal/pty-server.d.ts.map +1 -1
- package/dist/terminal/pty-server.js +65 -11
- package/dist/terminal/pty-server.js.map +1 -1
- package/dist/terminal/terminal-plugin.d.ts +2 -2
- package/dist/terminal/terminal-plugin.d.ts.map +1 -1
- package/dist/terminal/terminal-plugin.js +27 -21
- package/dist/terminal/terminal-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +114 -8
- package/dist/vite/client.js.map +1 -1
- package/dist/vite/dev-api-server.d.ts +1 -1
- package/dist/vite/dev-api-server.d.ts.map +1 -1
- package/dist/vite/dev-api-server.js +105 -22
- package/dist/vite/dev-api-server.js.map +1 -1
- package/package.json +22 -6
- package/src/templates/default/.agents/skills/actions/SKILL.md +136 -0
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/files-as-database/SKILL.md +2 -2
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
- package/src/templates/default/AGENTS.md +56 -164
- package/src/templates/default/DEVELOPING.md +117 -0
- package/src/templates/default/{scripts → actions}/hello.ts +1 -1
- package/src/templates/default/actions/navigate.ts +53 -0
- package/src/templates/default/actions/view-screen.ts +39 -0
- package/src/templates/default/app/global.css +2 -2
- package/src/templates/default/app/root.tsx +19 -16
- package/src/templates/default/app/routes/_index.tsx +1 -1
- package/src/templates/default/package.json +4 -0
- package/src/templates/default/server/plugins/.gitkeep +0 -0
- package/dist/a2a/middleware.d.ts +0 -3
- package/dist/a2a/middleware.d.ts.map +0 -1
- package/dist/a2a/middleware.js +0 -36
- package/dist/a2a/middleware.js.map +0 -1
- package/dist/client/use-file-watcher.d.ts +0 -23
- package/dist/client/use-file-watcher.d.ts.map +0 -1
- package/dist/client/use-file-watcher.js +0 -50
- package/dist/client/use-file-watcher.js.map +0 -1
- package/src/templates/default/.agents/skills/scripts/SKILL.md +0 -121
- package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +0 -80
- package/src/templates/default/server/plugins/agent-chat.ts +0 -1
- package/src/templates/default/server/plugins/auth.ts +0 -1
- package/src/templates/default/server/plugins/file-sync.ts +0 -1
- package/src/templates/default/server/plugins/terminal.ts +0 -1
- package/src/templates/default/server/routes/api/events.get.ts +0 -3
- package/src/templates/default/server/routes/api/file-sync/status.get.ts +0 -4
- /package/src/templates/default/{scripts → actions}/run.ts +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* AgentPanel — unified agent component with chat and CLI terminal modes.
|
|
4
4
|
*
|
|
@@ -21,17 +21,44 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
21
21
|
* // Full page
|
|
22
22
|
* <AgentPanel className="h-screen" />
|
|
23
23
|
*/
|
|
24
|
-
import
|
|
25
|
-
import {
|
|
24
|
+
import ReactDOM from "react-dom";
|
|
25
|
+
import { useState, useEffect, useRef, useCallback, lazy, Suspense, startTransition, } from "react";
|
|
26
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
27
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
28
|
+
import { IconMessage, IconTerminal2, IconSettings, IconLayoutSidebarRightCollapse, IconChevronDown, IconCheck, IconPlus, IconFolder, IconX, IconPencil, IconDotsVertical, IconHistory, } from "@tabler/icons-react";
|
|
29
|
+
import { MultiTabAssistantChat, } from "./MultiTabAssistantChat.js";
|
|
30
|
+
import { useDevMode } from "./use-dev-mode.js";
|
|
26
31
|
import { cn } from "./utils.js";
|
|
27
32
|
// Lazy-load AgentTerminal to avoid bundling xterm.js when not needed
|
|
28
33
|
const AgentTerminal = lazy(() => import("./terminal/index.js").then((m) => ({ default: m.AgentTerminal })));
|
|
34
|
+
// Lazy-load ResourcesPanel to avoid bundling when not needed
|
|
35
|
+
const ResourcesPanel = lazy(() => import("./resources/ResourcesPanel.js").then((m) => ({
|
|
36
|
+
default: m.ResourcesPanel,
|
|
37
|
+
})));
|
|
29
38
|
const CLI_STORAGE_KEY = "agent-native-cli-command";
|
|
30
|
-
const CLI_DEFAULT = "
|
|
39
|
+
const CLI_DEFAULT = "builder";
|
|
40
|
+
const EXEC_MODE_KEY = "agent-native-exec-mode";
|
|
41
|
+
const AGENT_PANEL_FONT_FAMILY = 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif';
|
|
42
|
+
const AGENT_PANEL_ROOT_STYLE = {
|
|
43
|
+
fontFamily: AGENT_PANEL_FONT_FAMILY,
|
|
44
|
+
fontSize: 13,
|
|
45
|
+
lineHeight: 1.2,
|
|
46
|
+
};
|
|
47
|
+
const AGENT_PANEL_HEADER_CLASS = "relative z-[240] flex h-11 shrink-0 items-center justify-between gap-2 border-b border-border";
|
|
48
|
+
const AGENT_PANEL_HEADER_STYLE = {
|
|
49
|
+
paddingLeft: 12,
|
|
50
|
+
paddingRight: 8,
|
|
51
|
+
};
|
|
52
|
+
const AGENT_PANEL_CONTROL_STYLE = {
|
|
53
|
+
fontSize: 12,
|
|
54
|
+
lineHeight: 1,
|
|
55
|
+
};
|
|
31
56
|
function useAvailableClis() {
|
|
32
57
|
const [clis, setClis] = useState([]);
|
|
33
58
|
useEffect(() => {
|
|
34
|
-
fetch
|
|
59
|
+
// Try to fetch available CLIs — endpoint is provided by the terminal plugin.
|
|
60
|
+
// Returns 404 gracefully when the plugin isn't loaded.
|
|
61
|
+
fetch("/_agent-native/available-clis")
|
|
35
62
|
.then((r) => (r.ok ? r.json() : []))
|
|
36
63
|
.then((data) => setClis(data))
|
|
37
64
|
.catch(() => { });
|
|
@@ -39,12 +66,15 @@ function useAvailableClis() {
|
|
|
39
66
|
return clis;
|
|
40
67
|
}
|
|
41
68
|
function useCliSelection() {
|
|
42
|
-
const [selected, setSelected] = useState(
|
|
43
|
-
|
|
44
|
-
|
|
69
|
+
const [selected, setSelected] = useState(CLI_DEFAULT);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
try {
|
|
72
|
+
const saved = localStorage.getItem(CLI_STORAGE_KEY);
|
|
73
|
+
if (saved)
|
|
74
|
+
setSelected(saved);
|
|
45
75
|
}
|
|
46
|
-
|
|
47
|
-
});
|
|
76
|
+
catch { }
|
|
77
|
+
}, []);
|
|
48
78
|
const select = (cmd) => {
|
|
49
79
|
setSelected(cmd);
|
|
50
80
|
try {
|
|
@@ -58,47 +88,454 @@ function useCliSelection() {
|
|
|
58
88
|
const IS_DEV = typeof import.meta !== "undefined" &&
|
|
59
89
|
typeof import.meta.env !== "undefined" &&
|
|
60
90
|
import.meta.env.DEV === true;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return (
|
|
91
|
+
function SettingsSelect({ label, value, options, onValueChange, }) {
|
|
92
|
+
const selected = options.find((option) => option.value === value);
|
|
93
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: label }), _jsxs(SelectPrimitive.Root, { value: value, onValueChange: onValueChange, children: [_jsxs(SelectPrimitive.Trigger, { className: "flex h-9 w-full items-center justify-between rounded-md border border-border bg-background px-3 text-left text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground", "aria-label": label, style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(SelectPrimitive.Value, { children: selected?.label ?? value }), _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(IconChevronDown, { size: 14, className: "text-muted-foreground" }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Content, { position: "popper", sideOffset: 6, className: "z-[9999] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-popover shadow-lg", children: _jsx(SelectPrimitive.Viewport, { className: "p-1", children: options.map((option) => (_jsxs(SelectPrimitive.Item, { value: option.value, className: "relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 py-2.5 text-[12px] outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40", style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx("span", { className: "absolute left-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(IconCheck, { size: 14 }) }) }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx(SelectPrimitive.ItemText, { children: _jsx("span", { className: "text-foreground", children: option.label }) }), option.description ? (_jsx("span", { className: "mt-0.5 text-[11px] leading-relaxed text-muted-foreground", children: option.description })) : null] })] }, option.value))) }) }) })] })] }));
|
|
64
94
|
}
|
|
65
|
-
function
|
|
66
|
-
return (
|
|
95
|
+
function IconTooltip({ content, children, }) {
|
|
96
|
+
return (_jsx(TooltipPrimitive.Provider, { delayDuration: 250, children: _jsxs(TooltipPrimitive.Root, { children: [_jsx(TooltipPrimitive.Trigger, { asChild: true, children: children }), _jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { side: "bottom", sideOffset: 8, className: "z-[230] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md", children: [content, _jsx(TooltipPrimitive.Arrow, { className: "fill-popover" })] }) })] }) }));
|
|
67
97
|
}
|
|
68
|
-
|
|
69
|
-
|
|
98
|
+
// ─── Agent Settings Popover ──────────────────────────────────────────────────
|
|
99
|
+
function AgentSettingsPopover({ isDevMode, onToggle, }) {
|
|
100
|
+
const [open, setOpen] = useState(false);
|
|
101
|
+
const popoverRef = useRef(null);
|
|
102
|
+
const buttonRef = useRef(null);
|
|
103
|
+
// Close on outside click
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (!open)
|
|
106
|
+
return;
|
|
107
|
+
function handleClick(e) {
|
|
108
|
+
const target = e.target;
|
|
109
|
+
// Ignore clicks inside the popover itself or its trigger button
|
|
110
|
+
if (popoverRef.current?.contains(target))
|
|
111
|
+
return;
|
|
112
|
+
if (buttonRef.current?.contains(target))
|
|
113
|
+
return;
|
|
114
|
+
// Ignore clicks inside portaled Radix Select content (rendered outside the popover DOM)
|
|
115
|
+
if (target.closest?.("[data-radix-popper-content-wrapper], [data-radix-select-viewport], [role='listbox']"))
|
|
116
|
+
return;
|
|
117
|
+
setOpen(false);
|
|
118
|
+
}
|
|
119
|
+
document.addEventListener("mousedown", handleClick);
|
|
120
|
+
return () => document.removeEventListener("mousedown", handleClick);
|
|
121
|
+
}, [open]);
|
|
122
|
+
// Close on Escape
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (!open)
|
|
125
|
+
return;
|
|
126
|
+
function handleKey(e) {
|
|
127
|
+
if (e.key === "Escape")
|
|
128
|
+
setOpen(false);
|
|
129
|
+
}
|
|
130
|
+
document.addEventListener("keydown", handleKey);
|
|
131
|
+
return () => document.removeEventListener("keydown", handleKey);
|
|
132
|
+
}, [open]);
|
|
133
|
+
const environmentOptions = [
|
|
134
|
+
{
|
|
135
|
+
value: "production",
|
|
136
|
+
label: "Production",
|
|
137
|
+
description: "Restricted to app tools only.",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
value: "development",
|
|
141
|
+
label: "Development",
|
|
142
|
+
description: "Full access to code editing, shell, and files.",
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
// Compute fixed position from the button so the popover escapes all
|
|
146
|
+
// stacking contexts (the CLI terminal otherwise paints over it).
|
|
147
|
+
const [pos, setPos] = useState(null);
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
if (!open || !buttonRef.current)
|
|
150
|
+
return;
|
|
151
|
+
const rect = buttonRef.current.getBoundingClientRect();
|
|
152
|
+
setPos({
|
|
153
|
+
top: rect.bottom + 6,
|
|
154
|
+
right: window.innerWidth - rect.right,
|
|
155
|
+
});
|
|
156
|
+
}, [open]);
|
|
157
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("button", { ref: buttonRef, onClick: () => setOpen(!open), className: cn("flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50", open && "bg-accent/50 text-foreground"), title: "Agent settings", children: _jsx(IconSettings, { size: 14 }) }), open &&
|
|
158
|
+
pos &&
|
|
159
|
+
ReactDOM.createPortal(_jsx("div", { ref: popoverRef, className: "fixed z-[9990] w-72 rounded-lg border border-border bg-popover shadow-md animate-in fade-in-0 zoom-in-95 duration-100", style: { top: pos.top, right: pos.right }, children: _jsx("div", { className: "space-y-3 p-3", children: _jsx(SettingsSelect, { label: "Environment", value: isDevMode ? "development" : "production", options: environmentOptions, onValueChange: (next) => {
|
|
160
|
+
const nextIsDev = next === "development";
|
|
161
|
+
if (nextIsDev !== isDevMode)
|
|
162
|
+
onToggle();
|
|
163
|
+
} }) }) }), document.body)] }));
|
|
164
|
+
}
|
|
165
|
+
function useClientOnly() {
|
|
166
|
+
const [mounted, setMounted] = useState(false);
|
|
167
|
+
useEffect(() => setMounted(true), []);
|
|
168
|
+
return mounted;
|
|
169
|
+
}
|
|
170
|
+
export function AgentPanel({ defaultMode = "chat", className, apiUrl, emptyStateText, suggestions, showHeader = true, onCollapse, }) {
|
|
171
|
+
const mounted = useClientOnly();
|
|
172
|
+
const [execMode, setExecMode] = useState(() => {
|
|
173
|
+
try {
|
|
174
|
+
const saved = localStorage.getItem(EXEC_MODE_KEY);
|
|
175
|
+
if (saved === "build" || saved === "plan")
|
|
176
|
+
return saved;
|
|
177
|
+
}
|
|
178
|
+
catch { }
|
|
179
|
+
return "build";
|
|
180
|
+
});
|
|
181
|
+
const switchExecMode = useCallback((next) => {
|
|
182
|
+
setExecMode(next);
|
|
183
|
+
try {
|
|
184
|
+
localStorage.setItem(EXEC_MODE_KEY, next);
|
|
185
|
+
}
|
|
186
|
+
catch { }
|
|
187
|
+
window.dispatchEvent(new CustomEvent("agent-panel:exec-mode-change", {
|
|
188
|
+
detail: { mode: next },
|
|
189
|
+
}));
|
|
190
|
+
}, []);
|
|
191
|
+
const [mode, setMode] = useState(() => {
|
|
192
|
+
try {
|
|
193
|
+
const saved = localStorage.getItem("agent-native-panel-mode");
|
|
194
|
+
if (saved === "chat" || saved === "cli" || saved === "resources")
|
|
195
|
+
return saved;
|
|
196
|
+
}
|
|
197
|
+
catch { }
|
|
198
|
+
return defaultMode;
|
|
199
|
+
});
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
try {
|
|
202
|
+
localStorage.setItem("agent-native-panel-mode", mode);
|
|
203
|
+
}
|
|
204
|
+
catch { }
|
|
205
|
+
}, [mode]);
|
|
206
|
+
const switchMode = useCallback((m) => {
|
|
207
|
+
startTransition(() => setMode(m));
|
|
208
|
+
}, []);
|
|
209
|
+
// CLI terminal tabs (ephemeral — not persisted to SQL)
|
|
210
|
+
const [cliTabs, setCliTabs] = useState(["cli-1"]);
|
|
211
|
+
const [activeCliTab, setActiveCliTab] = useState("cli-1");
|
|
212
|
+
const cliCounter = useRef(1);
|
|
213
|
+
const addCliTab = useCallback(() => {
|
|
214
|
+
const id = `cli-${++cliCounter.current}`;
|
|
215
|
+
setCliTabs((prev) => [...prev, id]);
|
|
216
|
+
setActiveCliTab(id);
|
|
217
|
+
}, []);
|
|
218
|
+
const closeCliTab = useCallback((id) => {
|
|
219
|
+
setCliTabs((prev) => {
|
|
220
|
+
if (prev.length <= 1)
|
|
221
|
+
return prev;
|
|
222
|
+
const next = prev.filter((t) => t !== id);
|
|
223
|
+
if (id === activeCliTab) {
|
|
224
|
+
const idx = prev.indexOf(id);
|
|
225
|
+
setActiveCliTab(next[Math.min(idx, next.length - 1)]);
|
|
226
|
+
}
|
|
227
|
+
return next;
|
|
228
|
+
});
|
|
229
|
+
}, [activeCliTab]);
|
|
230
|
+
const closeOtherCliTabs = useCallback((id) => {
|
|
231
|
+
setCliTabs([id]);
|
|
232
|
+
setActiveCliTab(id);
|
|
233
|
+
}, []);
|
|
234
|
+
const closeAllCliTabs = useCallback(() => {
|
|
235
|
+
const id = `cli-${++cliCounter.current}`;
|
|
236
|
+
setCliTabs([id]);
|
|
237
|
+
setActiveCliTab(id);
|
|
238
|
+
}, []);
|
|
70
239
|
const availableClis = useAvailableClis();
|
|
71
240
|
const [selectedCli, selectCli] = useCliSelection();
|
|
72
241
|
const selectedLabel = availableClis.find((c) => c.command === selectedCli)?.label || selectedCli;
|
|
73
|
-
|
|
242
|
+
const { isDevMode, canToggle, setDevMode } = useDevMode(apiUrl);
|
|
243
|
+
const isLocalhost = mounted &&
|
|
244
|
+
typeof window !== "undefined" &&
|
|
245
|
+
(window.location.hostname === "localhost" ||
|
|
246
|
+
window.location.hostname === "127.0.0.1" ||
|
|
247
|
+
window.location.hostname === "::1");
|
|
248
|
+
const showDevToggle = canToggle && isLocalhost;
|
|
249
|
+
const renderModeButtons = useCallback((activeMode) => (_jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs("button", { onClick: () => switchMode("chat"), className: cn("flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none", activeMode === "chat"
|
|
250
|
+
? "bg-accent text-foreground"
|
|
251
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), title: "Chat mode", style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconMessage, { size: 14 }), "Chat"] }), isDevMode && (_jsxs("button", { onClick: () => switchMode("cli"), className: cn("flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none", activeMode === "cli"
|
|
252
|
+
? "bg-accent text-foreground"
|
|
253
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), title: "CLI terminal mode", style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconTerminal2, { size: 14 }), "CLI"] })), _jsxs("button", { onClick: () => switchMode("resources"), className: cn("flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none", activeMode === "resources"
|
|
254
|
+
? "bg-accent text-foreground"
|
|
255
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), title: "Files & resources", style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx(IconFolder, { size: 14 }), "Files"] })] })), [isDevMode]);
|
|
256
|
+
const renderHeaderActions = useCallback(() => (_jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [showDevToggle && (_jsx(IconTooltip, { content: "Agent settings", children: _jsx("div", { children: _jsx(AgentSettingsPopover, { isDevMode: isDevMode, onToggle: () => setDevMode(!isDevMode) }) }) })), onCollapse && (_jsx(IconTooltip, { content: "Collapse sidebar", children: _jsx("button", { onClick: onCollapse, className: "flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconLayoutSidebarRightCollapse, { size: 14 }) }) }))] })), [isDevMode, onCollapse, setDevMode, showDevToggle]);
|
|
257
|
+
const [tabMenuOpen, setTabMenuOpen] = useState(null);
|
|
258
|
+
const [cliPickerOpen, setCliPickerOpen] = useState(false);
|
|
259
|
+
// Ref callback: scroll the active tab into view in the overflow container.
|
|
260
|
+
// Manually calculates scroll position to avoid scrollIntoView moving outer containers.
|
|
261
|
+
const activeTabRefCb = useCallback((el) => {
|
|
262
|
+
if (!el)
|
|
263
|
+
return;
|
|
264
|
+
const container = el.parentElement;
|
|
265
|
+
if (!container)
|
|
266
|
+
return;
|
|
267
|
+
// Use rAF so layout is settled after React commit
|
|
268
|
+
requestAnimationFrame(() => {
|
|
269
|
+
const tabLeft = el.offsetLeft;
|
|
270
|
+
const tabRight = tabLeft + el.offsetWidth;
|
|
271
|
+
const scrollLeft = container.scrollLeft;
|
|
272
|
+
const viewWidth = container.clientWidth;
|
|
273
|
+
if (tabLeft < scrollLeft) {
|
|
274
|
+
container.scrollLeft = tabLeft;
|
|
275
|
+
}
|
|
276
|
+
else if (tabRight > scrollLeft + viewWidth) {
|
|
277
|
+
container.scrollLeft = tabRight - viewWidth;
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}, []);
|
|
281
|
+
const renderChatHeader = useCallback(({ tabs, activeTabId, setActiveTabId, addTab, closeTab, closeOtherTabs, closeAllTabs, showHistory, toggleHistory, }) => (_jsxs("div", { className: "flex flex-col shrink-0", children: [_jsxs("div", { className: AGENT_PANEL_HEADER_CLASS, style: AGENT_PANEL_HEADER_STYLE, children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-1 overflow-hidden", children: renderModeButtons(mode) }), _jsx("div", { className: "flex items-center gap-0.5", children: renderHeaderActions() })] }), (mode === "chat" || mode === "cli") && (_jsxs("div", { className: "flex items-center px-1 py-1 border-b border-border gap-0.5", children: [_jsx("div", { className: "flex items-center gap-0.5 min-w-0 overflow-x-auto scrollbar-none flex-1", children: mode === "chat"
|
|
282
|
+
? tabs.map((tab) => (_jsxs("div", { role: "button", tabIndex: 0, ref: tab.id === activeTabId ? activeTabRefCb : undefined, onClick: () => setActiveTabId(tab.id), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]", tab.id === activeTabId
|
|
74
283
|
? "bg-accent text-foreground"
|
|
75
|
-
: "text-muted-foreground hover:
|
|
284
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsx("span", { className: "truncate pr-1", children: tab.label }), tab.status === "running" && (_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" })), tabs.length > 1 && (_jsx("button", { type: "button", onClick: (e) => {
|
|
285
|
+
e.stopPropagation();
|
|
286
|
+
closeTab(tab.id);
|
|
287
|
+
}, className: "agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground", style: {
|
|
288
|
+
position: "absolute",
|
|
289
|
+
right: 0,
|
|
290
|
+
top: 0,
|
|
291
|
+
bottom: 0,
|
|
292
|
+
width: 28,
|
|
293
|
+
paddingRight: 6,
|
|
294
|
+
borderRadius: "0 6px 6px 0",
|
|
295
|
+
background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
296
|
+
}, children: _jsx(IconX, { size: 10 }) }))] }, tab.id)))
|
|
297
|
+
: cliTabs.map((id, i) => (_jsxs("div", { role: "button", tabIndex: 0, ref: id === activeCliTab ? activeTabRefCb : undefined, onClick: () => setActiveCliTab(id), className: cn("agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer", id === activeCliTab
|
|
76
298
|
? "bg-accent text-foreground"
|
|
77
|
-
: "text-muted-foreground hover:
|
|
299
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsxs("span", { children: ["Terminal ", i + 1] }), cliTabs.length > 1 && (_jsx("button", { type: "button", onClick: (e) => {
|
|
300
|
+
e.stopPropagation();
|
|
301
|
+
closeCliTab(id);
|
|
302
|
+
}, className: "agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground", style: {
|
|
303
|
+
position: "absolute",
|
|
304
|
+
right: 0,
|
|
305
|
+
top: 0,
|
|
306
|
+
bottom: 0,
|
|
307
|
+
width: 28,
|
|
308
|
+
paddingRight: 6,
|
|
309
|
+
borderRadius: "0 6px 6px 0",
|
|
310
|
+
background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
311
|
+
}, children: _jsx(IconX, { size: 10 }) }))] }, id))) }), _jsxs("div", { className: "flex items-center gap-0.5 shrink-0 ml-auto", children: [mode === "chat" && (_jsxs(_Fragment, { children: [_jsx(IconTooltip, { content: "New chat", children: _jsx("button", { onClick: addTab, className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) }), toggleHistory && (_jsx(IconTooltip, { content: "Chat history", children: _jsx("button", { onClick: toggleHistory, className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", showHistory && "bg-accent text-foreground"), children: _jsx(IconHistory, { size: 14 }) }) })), _jsxs("div", { className: "relative", children: [_jsx(IconTooltip, { content: "Tab options", children: _jsx("button", { onClick: () => setTabMenuOpen(tabMenuOpen === "__chat_global"
|
|
312
|
+
? null
|
|
313
|
+
: "__chat_global"), className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", tabMenuOpen === "__chat_global" &&
|
|
314
|
+
"bg-accent text-foreground"), children: _jsx(IconDotsVertical, { size: 14 }) }) }), tabMenuOpen === "__chat_global" && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: () => setTabMenuOpen(null) }), _jsxs("div", { className: "absolute right-0 top-full mt-1 z-50 w-44 rounded-md border border-border bg-popover py-1 shadow-lg", children: [_jsxs("button", { className: "flex w-full items-center justify-between px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
315
|
+
closeTab(activeTabId);
|
|
316
|
+
setTabMenuOpen(null);
|
|
317
|
+
}, children: ["Close Tab", _jsxs("kbd", { className: "text-[10px] text-muted-foreground", children: ["\u2318", "W"] })] }), _jsx("button", { className: "flex w-full items-center px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
318
|
+
closeOtherTabs(activeTabId);
|
|
319
|
+
setTabMenuOpen(null);
|
|
320
|
+
}, children: "Close Other Tabs" }), _jsx("button", { className: "flex w-full items-center px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
321
|
+
closeAllTabs();
|
|
322
|
+
setTabMenuOpen(null);
|
|
323
|
+
}, children: "Close All Tabs" })] })] }))] })] })), mode === "cli" && (_jsxs(_Fragment, { children: [_jsx(IconTooltip, { content: "New terminal", children: _jsx("button", { onClick: addCliTab, className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 14 }) }) }), availableClis.length > 0 && (_jsxs("div", { className: "relative", children: [_jsx(IconTooltip, { content: `CLI: ${selectedLabel}`, children: _jsx("button", { onClick: () => setCliPickerOpen(!cliPickerOpen), className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", cliPickerOpen && "bg-accent text-foreground"), children: _jsx(IconSettings, { size: 14 }) }) }), cliPickerOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: () => setCliPickerOpen(false) }), _jsx("div", { className: "absolute right-0 top-full mt-1 z-50 w-48 rounded-md border border-border bg-popover py-1 shadow-lg", children: availableClis.map((cli) => (_jsxs("button", { className: cn("flex w-full items-center gap-2 px-3 py-1.5 text-xs hover:bg-accent", cli.command === selectedCli
|
|
324
|
+
? "text-foreground font-medium"
|
|
325
|
+
: "text-muted-foreground"), onClick: () => {
|
|
326
|
+
selectCli(cli.command);
|
|
327
|
+
setCliPickerOpen(false);
|
|
328
|
+
}, children: [cli.command === selectedCli && (_jsx(IconCheck, { size: 12, className: "shrink-0" })), _jsx("span", { className: cli.command !== selectedCli ? "ml-5" : "", children: cli.label })] }, cli.command))) })] }))] })), _jsxs("div", { className: "relative", children: [_jsx(IconTooltip, { content: "Tab options", children: _jsx("button", { onClick: () => setTabMenuOpen(tabMenuOpen === "__cli_global"
|
|
329
|
+
? null
|
|
330
|
+
: "__cli_global"), className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", tabMenuOpen === "__cli_global" &&
|
|
331
|
+
"bg-accent text-foreground"), children: _jsx(IconDotsVertical, { size: 14 }) }) }), tabMenuOpen === "__cli_global" && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: () => setTabMenuOpen(null) }), _jsxs("div", { className: "absolute right-0 top-full mt-1 z-50 w-44 rounded-md border border-border bg-popover py-1 shadow-lg", children: [_jsxs("button", { className: "flex w-full items-center justify-between px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
332
|
+
closeCliTab(activeCliTab);
|
|
333
|
+
setTabMenuOpen(null);
|
|
334
|
+
}, children: ["Close Tab", _jsxs("kbd", { className: "text-[10px] text-muted-foreground", children: ["\u2318", "W"] })] }), _jsx("button", { className: "flex w-full items-center px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
335
|
+
closeOtherCliTabs(activeCliTab);
|
|
336
|
+
setTabMenuOpen(null);
|
|
337
|
+
}, children: "Close Other Tabs" }), _jsx("button", { className: "flex w-full items-center px-3 py-1.5 text-xs text-foreground hover:bg-accent", onClick: () => {
|
|
338
|
+
closeAllCliTabs();
|
|
339
|
+
setTabMenuOpen(null);
|
|
340
|
+
}, children: "Close All Tabs" })] })] }))] })] }))] })] }))] })), [
|
|
341
|
+
mode,
|
|
342
|
+
renderHeaderActions,
|
|
343
|
+
renderModeButtons,
|
|
344
|
+
cliTabs,
|
|
345
|
+
activeCliTab,
|
|
346
|
+
addCliTab,
|
|
347
|
+
closeCliTab,
|
|
348
|
+
closeOtherCliTabs,
|
|
349
|
+
closeAllCliTabs,
|
|
350
|
+
tabMenuOpen,
|
|
351
|
+
availableClis,
|
|
352
|
+
selectedCli,
|
|
353
|
+
selectedLabel,
|
|
354
|
+
selectCli,
|
|
355
|
+
cliPickerOpen,
|
|
356
|
+
]);
|
|
357
|
+
return (_jsxs("div", { className: cn("agent-panel-root flex flex-1 flex-col min-h-0 h-full text-[13px] leading-[1.2] antialiased", className), style: AGENT_PANEL_ROOT_STYLE, children: [_jsx("style", { dangerouslySetInnerHTML: {
|
|
358
|
+
__html: ".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}",
|
|
359
|
+
} }), _jsx("div", { className: cn("flex flex-col min-h-0", mode === "chat" ? "flex-1" : "shrink-0"), children: mounted && (_jsx(MultiTabAssistantChat, { apiUrl: apiUrl, showHeader: false, renderHeader: showHeader ? renderChatHeader : undefined, renderOverlay: undefined, contentHidden: mode !== "chat", emptyStateText: emptyStateText, suggestions: suggestions, onSwitchToCli: isDevMode ? () => switchMode("cli") : undefined, composerSlot: _jsxs("div", { className: "shrink-0 px-3 pt-1.5 pb-0 flex items-center justify-between gap-2", children: [execMode === "plan" ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] text-amber-700 dark:text-amber-400 min-w-0 truncate", children: [_jsx(IconPencil, { size: 12, className: "shrink-0" }), _jsx("span", { className: "truncate", children: "Plan mode \u2014 will plan before executing" })] })) : (_jsx("div", {})), _jsxs("div", { className: "flex shrink-0 items-center rounded-md border border-border overflow-hidden", style: AGENT_PANEL_CONTROL_STYLE, children: [_jsx("button", { onClick: () => switchExecMode("build"), className: cn("px-2 py-1 text-[11px] leading-none", execMode === "build"
|
|
360
|
+
? "bg-accent text-foreground"
|
|
361
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), title: "Build mode \u2014 agent executes immediately", children: "Build" }), _jsx("button", { onClick: () => switchExecMode("plan"), className: cn("px-2 py-1 text-[11px] leading-none", execMode === "plan"
|
|
362
|
+
? "bg-amber-500/20 text-amber-700 dark:text-amber-400"
|
|
363
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), title: "Plan mode \u2014 agent plans before executing", children: "Plan" })] })] }) })) }), isDevMode &&
|
|
364
|
+
cliTabs.map((id) => (_jsx("div", { className: cn("min-h-0 relative", mode === "cli" ? "flex-1" : "hidden"), style: {
|
|
365
|
+
display: mode === "cli" && id === activeCliTab ? undefined : "none",
|
|
366
|
+
}, children: _jsx(Suspense, { fallback: _jsx("div", { className: "flex items-center justify-center h-full text-muted-foreground text-sm", children: "Loading terminal..." }), children: _jsx(AgentTerminal, { command: selectedCli, hideInHarness: false, className: "h-full", style: { background: "transparent" } }) }) }, id))), mode === "resources" && (_jsx("div", { className: "flex-1 min-h-0", children: _jsx(Suspense, { fallback: _jsx("div", { className: "flex h-full flex-col min-h-0", children: _jsx("div", { className: "flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5", children: _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("div", { className: "h-5 w-16 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-5 w-14 rounded bg-muted animate-pulse" })] }) }) }), children: _jsx(ResourcesPanel, {}) }) }))] }));
|
|
367
|
+
}
|
|
368
|
+
// ─── Resize handle ──────────────────────────────────────────────────────────
|
|
369
|
+
const SIDEBAR_STORAGE_KEY = "agent-native-sidebar-width";
|
|
370
|
+
const SIDEBAR_OPEN_KEY = "agent-native-sidebar-open";
|
|
371
|
+
const SIDEBAR_MIN = 280;
|
|
372
|
+
const SIDEBAR_MAX = 700;
|
|
373
|
+
function ResizeHandle({ position, onDrag, }) {
|
|
374
|
+
const ref = useRef(null);
|
|
375
|
+
const dragging = useRef(false);
|
|
376
|
+
const lastX = useRef(0);
|
|
377
|
+
const onDragRef = useRef(onDrag);
|
|
378
|
+
onDragRef.current = onDrag;
|
|
379
|
+
const GRAB_ZONE = 5; // px on each side of the border
|
|
380
|
+
// All drag logic runs via document-level listeners so the 1px-wide
|
|
381
|
+
// element doesn't need to capture pointer events itself.
|
|
382
|
+
useEffect(() => {
|
|
383
|
+
const el = ref.current;
|
|
384
|
+
if (!el)
|
|
385
|
+
return;
|
|
386
|
+
let cursorActive = false;
|
|
387
|
+
function onMouseDown(e) {
|
|
388
|
+
const rect = el.getBoundingClientRect();
|
|
389
|
+
const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));
|
|
390
|
+
if (dist > GRAB_ZONE)
|
|
391
|
+
return;
|
|
392
|
+
e.preventDefault();
|
|
393
|
+
dragging.current = true;
|
|
394
|
+
lastX.current = e.clientX;
|
|
395
|
+
document.body.style.cursor = "col-resize";
|
|
396
|
+
document.body.style.userSelect = "none";
|
|
397
|
+
}
|
|
398
|
+
function onMouseMove(e) {
|
|
399
|
+
if (dragging.current) {
|
|
400
|
+
const delta = e.clientX - lastX.current;
|
|
401
|
+
lastX.current = e.clientX;
|
|
402
|
+
onDragRef.current(position === "left" ? delta : -delta);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
// Hover cursor
|
|
406
|
+
const rect = el.getBoundingClientRect();
|
|
407
|
+
const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));
|
|
408
|
+
const near = dist <= GRAB_ZONE;
|
|
409
|
+
if (near && !cursorActive) {
|
|
410
|
+
cursorActive = true;
|
|
411
|
+
document.body.style.cursor = "col-resize";
|
|
412
|
+
}
|
|
413
|
+
else if (!near && cursorActive) {
|
|
414
|
+
cursorActive = false;
|
|
415
|
+
document.body.style.cursor = "";
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function onMouseUp() {
|
|
419
|
+
if (!dragging.current)
|
|
420
|
+
return;
|
|
421
|
+
dragging.current = false;
|
|
422
|
+
document.body.style.cursor = "";
|
|
423
|
+
document.body.style.userSelect = "";
|
|
424
|
+
}
|
|
425
|
+
document.addEventListener("mousedown", onMouseDown);
|
|
426
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
427
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
428
|
+
return () => {
|
|
429
|
+
document.removeEventListener("mousedown", onMouseDown);
|
|
430
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
431
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
432
|
+
if (cursorActive)
|
|
433
|
+
document.body.style.cursor = "";
|
|
434
|
+
};
|
|
435
|
+
}, [position]);
|
|
436
|
+
return (_jsx("div", { ref: ref, className: cn("relative z-20 shrink-0 w-px touch-none select-none transition-colors", "bg-border hover:bg-accent active:bg-accent"), style: { cursor: "col-resize" } }));
|
|
78
437
|
}
|
|
79
438
|
/**
|
|
80
439
|
* Wraps app content with a toggleable agent sidebar.
|
|
81
440
|
* Use AgentToggleButton in your header to open/close it.
|
|
82
441
|
*/
|
|
83
442
|
export function AgentSidebar({ children, emptyStateText = "How can I help you?", suggestions, sidebarWidth = 380, position = "right", defaultOpen = false, }) {
|
|
84
|
-
const [open, setOpen] = useState(
|
|
443
|
+
const [open, setOpen] = useState(() => {
|
|
444
|
+
try {
|
|
445
|
+
const saved = localStorage.getItem(SIDEBAR_OPEN_KEY);
|
|
446
|
+
if (saved !== null)
|
|
447
|
+
return saved === "true";
|
|
448
|
+
}
|
|
449
|
+
catch { }
|
|
450
|
+
return defaultOpen;
|
|
451
|
+
});
|
|
452
|
+
const [width, setWidth] = useState(sidebarWidth);
|
|
85
453
|
useEffect(() => {
|
|
86
|
-
|
|
87
|
-
|
|
454
|
+
try {
|
|
455
|
+
const saved = localStorage.getItem(SIDEBAR_STORAGE_KEY);
|
|
456
|
+
if (saved) {
|
|
457
|
+
const n = parseInt(saved, 10);
|
|
458
|
+
if (n >= SIDEBAR_MIN && n <= SIDEBAR_MAX)
|
|
459
|
+
setWidth(n);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
catch { }
|
|
463
|
+
}, []);
|
|
464
|
+
const setOpenPersisted = useCallback((next) => {
|
|
465
|
+
setOpen((prev) => {
|
|
466
|
+
const value = typeof next === "function" ? next(prev) : next;
|
|
467
|
+
try {
|
|
468
|
+
localStorage.setItem(SIDEBAR_OPEN_KEY, String(value));
|
|
469
|
+
}
|
|
470
|
+
catch { }
|
|
471
|
+
return value;
|
|
472
|
+
});
|
|
473
|
+
}, []);
|
|
474
|
+
useEffect(() => {
|
|
475
|
+
const toggleHandler = () => {
|
|
476
|
+
setOpenPersisted((prev) => !prev);
|
|
477
|
+
};
|
|
478
|
+
const openHandler = () => {
|
|
479
|
+
setOpenPersisted(true);
|
|
480
|
+
};
|
|
481
|
+
window.addEventListener("agent-panel:toggle", toggleHandler);
|
|
482
|
+
window.addEventListener("agent-panel:open", openHandler);
|
|
483
|
+
return () => {
|
|
484
|
+
window.removeEventListener("agent-panel:toggle", toggleHandler);
|
|
485
|
+
window.removeEventListener("agent-panel:open", openHandler);
|
|
486
|
+
};
|
|
487
|
+
}, [setOpenPersisted]);
|
|
488
|
+
// Cmd+I / Ctrl+I to focus the agent chat
|
|
489
|
+
useEffect(() => {
|
|
490
|
+
const handleKeyDown = (e) => {
|
|
491
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "i") {
|
|
492
|
+
e.preventDefault();
|
|
493
|
+
focusAgentChat();
|
|
494
|
+
}
|
|
88
495
|
};
|
|
89
|
-
|
|
90
|
-
return () =>
|
|
496
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
497
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
498
|
+
}, []);
|
|
499
|
+
const handleDrag = useCallback((delta) => {
|
|
500
|
+
setWidth((prev) => {
|
|
501
|
+
const next = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, prev + delta));
|
|
502
|
+
try {
|
|
503
|
+
localStorage.setItem(SIDEBAR_STORAGE_KEY, String(next));
|
|
504
|
+
}
|
|
505
|
+
catch { }
|
|
506
|
+
return next;
|
|
507
|
+
});
|
|
91
508
|
}, []);
|
|
92
509
|
const isLeft = position === "left";
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
510
|
+
const sidebar = (_jsxs(_Fragment, { children: [isLeft ? null : _jsx(ResizeHandle, { position: position, onDrag: handleDrag }), _jsx("div", { className: "agent-sidebar-panel flex shrink-0 flex-col overflow-hidden text-[13px] leading-[1.2] antialiased", style: { ...AGENT_PANEL_ROOT_STYLE, width, maxHeight: "100vh" }, children: _jsx(AgentPanel, { emptyStateText: emptyStateText, suggestions: suggestions, onCollapse: () => setOpenPersisted(false) }) }), isLeft ? _jsx(ResizeHandle, { position: position, onDrag: handleDrag }) : null] }));
|
|
511
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-1 overflow-hidden", children: [isLeft && open ? sidebar : null, _jsx("div", { className: "flex flex-1 flex-col overflow-hidden min-w-0", children: children }), !isLeft && open ? sidebar : null] }));
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Focus the agent chat composer input.
|
|
515
|
+
* Opens the sidebar if closed, then focuses the text input.
|
|
516
|
+
*/
|
|
517
|
+
export function focusAgentChat() {
|
|
518
|
+
window.dispatchEvent(new Event("agent-panel:open"));
|
|
519
|
+
// Wait for sidebar to render, then focus the composer
|
|
520
|
+
requestAnimationFrame(() => {
|
|
521
|
+
const panel = document.querySelector(".agent-sidebar-panel");
|
|
522
|
+
if (!panel)
|
|
523
|
+
return;
|
|
524
|
+
const prosemirror = panel.querySelector(".ProseMirror");
|
|
525
|
+
if (prosemirror) {
|
|
526
|
+
prosemirror.focus();
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
const textarea = panel.querySelector("textarea");
|
|
530
|
+
if (textarea)
|
|
531
|
+
textarea.focus();
|
|
532
|
+
});
|
|
96
533
|
}
|
|
97
534
|
/**
|
|
98
535
|
* Button to toggle the agent sidebar. Place this in your app's header/toolbar.
|
|
99
536
|
* Dispatches a custom event that AgentSidebar listens for.
|
|
100
537
|
*/
|
|
101
538
|
export function AgentToggleButton({ className }) {
|
|
102
|
-
return (_jsx("button", { onClick: () => window.dispatchEvent(new Event("agent-panel:toggle")), className: cn("flex h-
|
|
539
|
+
return (_jsx("button", { onClick: () => window.dispatchEvent(new Event("agent-panel:toggle")), className: cn("flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50", className), title: "Toggle agent", children: _jsx(IconMessage, { size: 16 }) }));
|
|
103
540
|
}
|
|
104
541
|
//# sourceMappingURL=AgentPanel.js.map
|