@amodalai/amodal 0.1.2
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/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/src/auth/index.d.ts +13 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +10 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/oauth2.d.ts +51 -0
- package/dist/src/auth/oauth2.d.ts.map +1 -0
- package/dist/src/auth/oauth2.js +196 -0
- package/dist/src/auth/oauth2.js.map +1 -0
- package/dist/src/auth/prompt.d.ts +21 -0
- package/dist/src/auth/prompt.d.ts.map +1 -0
- package/dist/src/auth/prompt.js +81 -0
- package/dist/src/auth/prompt.js.map +1 -0
- package/dist/src/auth/test-connection.d.ts +27 -0
- package/dist/src/auth/test-connection.d.ts.map +1 -0
- package/dist/src/auth/test-connection.js +153 -0
- package/dist/src/auth/test-connection.js.map +1 -0
- package/dist/src/auth/types.d.ts +32 -0
- package/dist/src/auth/types.d.ts.map +1 -0
- package/dist/src/auth/types.js +7 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/commands/audit.d.ts +18 -0
- package/dist/src/commands/audit.d.ts.map +1 -0
- package/dist/src/commands/audit.js +86 -0
- package/dist/src/commands/audit.js.map +1 -0
- package/dist/src/commands/automations.d.ts +28 -0
- package/dist/src/commands/automations.d.ts.map +1 -0
- package/dist/src/commands/automations.js +179 -0
- package/dist/src/commands/automations.js.map +1 -0
- package/dist/src/commands/build-manifest-types.d.ts +33 -0
- package/dist/src/commands/build-manifest-types.d.ts.map +1 -0
- package/dist/src/commands/build-manifest-types.js +30 -0
- package/dist/src/commands/build-manifest-types.js.map +1 -0
- package/dist/src/commands/build-tools.d.ts +33 -0
- package/dist/src/commands/build-tools.d.ts.map +1 -0
- package/dist/src/commands/build-tools.js +237 -0
- package/dist/src/commands/build-tools.js.map +1 -0
- package/dist/src/commands/build.d.ts +23 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +120 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/chat.d.ts +26 -0
- package/dist/src/commands/chat.d.ts.map +1 -0
- package/dist/src/commands/chat.js +123 -0
- package/dist/src/commands/chat.js.map +1 -0
- package/dist/src/commands/connect.d.ts +18 -0
- package/dist/src/commands/connect.d.ts.map +1 -0
- package/dist/src/commands/connect.js +198 -0
- package/dist/src/commands/connect.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +20 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/commands/deploy.js +137 -0
- package/dist/src/commands/deploy.js.map +1 -0
- package/dist/src/commands/deployments.d.ts +17 -0
- package/dist/src/commands/deployments.d.ts.map +1 -0
- package/dist/src/commands/deployments.js +77 -0
- package/dist/src/commands/deployments.js.map +1 -0
- package/dist/src/commands/dev.d.ts +17 -0
- package/dist/src/commands/dev.d.ts.map +1 -0
- package/dist/src/commands/dev.js +109 -0
- package/dist/src/commands/dev.js.map +1 -0
- package/dist/src/commands/diff.d.ts +19 -0
- package/dist/src/commands/diff.d.ts.map +1 -0
- package/dist/src/commands/diff.js +120 -0
- package/dist/src/commands/diff.js.map +1 -0
- package/dist/src/commands/docker.d.ts +21 -0
- package/dist/src/commands/docker.d.ts.map +1 -0
- package/dist/src/commands/docker.js +215 -0
- package/dist/src/commands/docker.js.map +1 -0
- package/dist/src/commands/eval.d.ts +20 -0
- package/dist/src/commands/eval.d.ts.map +1 -0
- package/dist/src/commands/eval.js +236 -0
- package/dist/src/commands/eval.js.map +1 -0
- package/dist/src/commands/experiment.d.ts +21 -0
- package/dist/src/commands/experiment.d.ts.map +1 -0
- package/dist/src/commands/experiment.js +133 -0
- package/dist/src/commands/experiment.js.map +1 -0
- package/dist/src/commands/index.d.ts +10 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +75 -0
- package/dist/src/commands/index.js.map +1 -0
- package/dist/src/commands/init.d.ts +17 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +73 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/inspect.d.ts +22 -0
- package/dist/src/commands/inspect.d.ts.map +1 -0
- package/dist/src/commands/inspect.js +131 -0
- package/dist/src/commands/inspect.js.map +1 -0
- package/dist/src/commands/install-pkg.d.ts +29 -0
- package/dist/src/commands/install-pkg.d.ts.map +1 -0
- package/dist/src/commands/install-pkg.js +202 -0
- package/dist/src/commands/install-pkg.js.map +1 -0
- package/dist/src/commands/link.d.ts +32 -0
- package/dist/src/commands/link.d.ts.map +1 -0
- package/dist/src/commands/link.js +227 -0
- package/dist/src/commands/link.js.map +1 -0
- package/dist/src/commands/list.d.ts +19 -0
- package/dist/src/commands/list.d.ts.map +1 -0
- package/dist/src/commands/list.js +78 -0
- package/dist/src/commands/list.js.map +1 -0
- package/dist/src/commands/login.d.ts +31 -0
- package/dist/src/commands/login.d.ts.map +1 -0
- package/dist/src/commands/login.js +205 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/promote.d.ts +16 -0
- package/dist/src/commands/promote.d.ts.map +1 -0
- package/dist/src/commands/promote.js +55 -0
- package/dist/src/commands/promote.js.map +1 -0
- package/dist/src/commands/publish.d.ts +18 -0
- package/dist/src/commands/publish.d.ts.map +1 -0
- package/dist/src/commands/publish.js +122 -0
- package/dist/src/commands/publish.js.map +1 -0
- package/dist/src/commands/rollback.d.ts +17 -0
- package/dist/src/commands/rollback.d.ts.map +1 -0
- package/dist/src/commands/rollback.js +62 -0
- package/dist/src/commands/rollback.js.map +1 -0
- package/dist/src/commands/search.d.ts +20 -0
- package/dist/src/commands/search.d.ts.map +1 -0
- package/dist/src/commands/search.js +133 -0
- package/dist/src/commands/search.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +20 -0
- package/dist/src/commands/secrets.d.ts.map +1 -0
- package/dist/src/commands/secrets.js +137 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/serve.d.ts +23 -0
- package/dist/src/commands/serve.d.ts.map +1 -0
- package/dist/src/commands/serve.js +144 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/status.d.ts +16 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +83 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/sync.d.ts +21 -0
- package/dist/src/commands/sync.d.ts.map +1 -0
- package/dist/src/commands/sync.js +94 -0
- package/dist/src/commands/sync.js.map +1 -0
- package/dist/src/commands/test-query.d.ts +19 -0
- package/dist/src/commands/test-query.d.ts.map +1 -0
- package/dist/src/commands/test-query.js +116 -0
- package/dist/src/commands/test-query.js.map +1 -0
- package/dist/src/commands/uninstall.d.ts +19 -0
- package/dist/src/commands/uninstall.d.ts.map +1 -0
- package/dist/src/commands/uninstall.js +84 -0
- package/dist/src/commands/uninstall.js.map +1 -0
- package/dist/src/commands/update.d.ts +21 -0
- package/dist/src/commands/update.d.ts.map +1 -0
- package/dist/src/commands/update.js +145 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/commands/validate.d.ts +19 -0
- package/dist/src/commands/validate.d.ts.map +1 -0
- package/dist/src/commands/validate.js +114 -0
- package/dist/src/commands/validate.js.map +1 -0
- package/dist/src/fixtures/incident-response.d.ts +91 -0
- package/dist/src/fixtures/incident-response.d.ts.map +1 -0
- package/dist/src/fixtures/incident-response.js +208 -0
- package/dist/src/fixtures/incident-response.js.map +1 -0
- package/dist/src/main.d.ts +8 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +30 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/shared/platform-client.d.ts +92 -0
- package/dist/src/shared/platform-client.d.ts.map +1 -0
- package/dist/src/shared/platform-client.js +155 -0
- package/dist/src/shared/platform-client.js.map +1 -0
- package/dist/src/shared/repo-discovery.d.ts +11 -0
- package/dist/src/shared/repo-discovery.d.ts.map +1 -0
- package/dist/src/shared/repo-discovery.js +33 -0
- package/dist/src/shared/repo-discovery.js.map +1 -0
- package/dist/src/templates/compose-template.d.ts +10 -0
- package/dist/src/templates/compose-template.d.ts.map +1 -0
- package/dist/src/templates/compose-template.js +30 -0
- package/dist/src/templates/compose-template.js.map +1 -0
- package/dist/src/templates/config-template.d.ts +14 -0
- package/dist/src/templates/config-template.d.ts.map +1 -0
- package/dist/src/templates/config-template.js +35 -0
- package/dist/src/templates/config-template.js.map +1 -0
- package/dist/src/templates/dockerfile-template.d.ts +10 -0
- package/dist/src/templates/dockerfile-template.d.ts.map +1 -0
- package/dist/src/templates/dockerfile-template.js +30 -0
- package/dist/src/templates/dockerfile-template.js.map +1 -0
- package/dist/src/templates/env-template.d.ts +12 -0
- package/dist/src/templates/env-template.d.ts.map +1 -0
- package/dist/src/templates/env-template.js +24 -0
- package/dist/src/templates/env-template.js.map +1 -0
- package/dist/src/templates/knowledge-template.d.ts +10 -0
- package/dist/src/templates/knowledge-template.d.ts.map +1 -0
- package/dist/src/templates/knowledge-template.js +24 -0
- package/dist/src/templates/knowledge-template.js.map +1 -0
- package/dist/src/templates/skill-template.d.ts +10 -0
- package/dist/src/templates/skill-template.d.ts.map +1 -0
- package/dist/src/templates/skill-template.js +27 -0
- package/dist/src/templates/skill-template.js.map +1 -0
- package/dist/src/ui/AskUserPrompt.d.ts +14 -0
- package/dist/src/ui/AskUserPrompt.d.ts.map +1 -0
- package/dist/src/ui/AskUserPrompt.js +17 -0
- package/dist/src/ui/AskUserPrompt.js.map +1 -0
- package/dist/src/ui/AssistantMessage.d.ts +14 -0
- package/dist/src/ui/AssistantMessage.d.ts.map +1 -0
- package/dist/src/ui/AssistantMessage.js +8 -0
- package/dist/src/ui/AssistantMessage.js.map +1 -0
- package/dist/src/ui/ChatApp.d.ts +15 -0
- package/dist/src/ui/ChatApp.d.ts.map +1 -0
- package/dist/src/ui/ChatApp.js +144 -0
- package/dist/src/ui/ChatApp.js.map +1 -0
- package/dist/src/ui/ConfirmationPrompt.d.ts +17 -0
- package/dist/src/ui/ConfirmationPrompt.d.ts.map +1 -0
- package/dist/src/ui/ConfirmationPrompt.js +21 -0
- package/dist/src/ui/ConfirmationPrompt.js.map +1 -0
- package/dist/src/ui/DiffRenderer.d.ts +32 -0
- package/dist/src/ui/DiffRenderer.d.ts.map +1 -0
- package/dist/src/ui/DiffRenderer.js +118 -0
- package/dist/src/ui/DiffRenderer.js.map +1 -0
- package/dist/src/ui/ExpandableContent.d.ts +15 -0
- package/dist/src/ui/ExpandableContent.d.ts.map +1 -0
- package/dist/src/ui/ExpandableContent.js +22 -0
- package/dist/src/ui/ExpandableContent.js.map +1 -0
- package/dist/src/ui/ExploreIndicator.d.ts +13 -0
- package/dist/src/ui/ExploreIndicator.d.ts.map +1 -0
- package/dist/src/ui/ExploreIndicator.js +14 -0
- package/dist/src/ui/ExploreIndicator.js.map +1 -0
- package/dist/src/ui/Footer.d.ts +19 -0
- package/dist/src/ui/Footer.d.ts.map +1 -0
- package/dist/src/ui/Footer.js +57 -0
- package/dist/src/ui/Footer.js.map +1 -0
- package/dist/src/ui/FullScreenLayout.d.ts +18 -0
- package/dist/src/ui/FullScreenLayout.d.ts.map +1 -0
- package/dist/src/ui/FullScreenLayout.js +14 -0
- package/dist/src/ui/FullScreenLayout.js.map +1 -0
- package/dist/src/ui/Header.d.ts +14 -0
- package/dist/src/ui/Header.d.ts.map +1 -0
- package/dist/src/ui/Header.js +11 -0
- package/dist/src/ui/Header.js.map +1 -0
- package/dist/src/ui/InputBar.d.ts +17 -0
- package/dist/src/ui/InputBar.d.ts.map +1 -0
- package/dist/src/ui/InputBar.js +49 -0
- package/dist/src/ui/InputBar.js.map +1 -0
- package/dist/src/ui/MessageList.d.ts +18 -0
- package/dist/src/ui/MessageList.d.ts.map +1 -0
- package/dist/src/ui/MessageList.js +9 -0
- package/dist/src/ui/MessageList.js.map +1 -0
- package/dist/src/ui/NotificationBar.d.ts +14 -0
- package/dist/src/ui/NotificationBar.d.ts.map +1 -0
- package/dist/src/ui/NotificationBar.js +38 -0
- package/dist/src/ui/NotificationBar.js.map +1 -0
- package/dist/src/ui/ScrollableMessageList.d.ts +27 -0
- package/dist/src/ui/ScrollableMessageList.d.ts.map +1 -0
- package/dist/src/ui/ScrollableMessageList.js +16 -0
- package/dist/src/ui/ScrollableMessageList.js.map +1 -0
- package/dist/src/ui/SessionBrowser.d.ts +20 -0
- package/dist/src/ui/SessionBrowser.d.ts.map +1 -0
- package/dist/src/ui/SessionBrowser.js +93 -0
- package/dist/src/ui/SessionBrowser.js.map +1 -0
- package/dist/src/ui/StatusMessage.d.ts +13 -0
- package/dist/src/ui/StatusMessage.d.ts.map +1 -0
- package/dist/src/ui/StatusMessage.js +17 -0
- package/dist/src/ui/StatusMessage.js.map +1 -0
- package/dist/src/ui/StreamingView.d.ts +19 -0
- package/dist/src/ui/StreamingView.d.ts.map +1 -0
- package/dist/src/ui/StreamingView.js +18 -0
- package/dist/src/ui/StreamingView.js.map +1 -0
- package/dist/src/ui/SubagentDisplay.d.ts +13 -0
- package/dist/src/ui/SubagentDisplay.d.ts.map +1 -0
- package/dist/src/ui/SubagentDisplay.js +22 -0
- package/dist/src/ui/SubagentDisplay.js.map +1 -0
- package/dist/src/ui/ThinkingDisplay.d.ts +13 -0
- package/dist/src/ui/ThinkingDisplay.d.ts.map +1 -0
- package/dist/src/ui/ThinkingDisplay.js +15 -0
- package/dist/src/ui/ThinkingDisplay.js.map +1 -0
- package/dist/src/ui/ToolCallDisplay.d.ts +16 -0
- package/dist/src/ui/ToolCallDisplay.d.ts.map +1 -0
- package/dist/src/ui/ToolCallDisplay.js +136 -0
- package/dist/src/ui/ToolCallDisplay.js.map +1 -0
- package/dist/src/ui/UserMessage.d.ts +12 -0
- package/dist/src/ui/UserMessage.d.ts.map +1 -0
- package/dist/src/ui/UserMessage.js +5 -0
- package/dist/src/ui/UserMessage.js.map +1 -0
- package/dist/src/ui/commands/clear.d.ts +7 -0
- package/dist/src/ui/commands/clear.d.ts.map +1 -0
- package/dist/src/ui/commands/clear.js +13 -0
- package/dist/src/ui/commands/clear.js.map +1 -0
- package/dist/src/ui/commands/help.d.ts +7 -0
- package/dist/src/ui/commands/help.d.ts.map +1 -0
- package/dist/src/ui/commands/help.js +26 -0
- package/dist/src/ui/commands/help.js.map +1 -0
- package/dist/src/ui/commands/index.d.ts +14 -0
- package/dist/src/ui/commands/index.d.ts.map +1 -0
- package/dist/src/ui/commands/index.js +15 -0
- package/dist/src/ui/commands/index.js.map +1 -0
- package/dist/src/ui/commands/model.d.ts +7 -0
- package/dist/src/ui/commands/model.d.ts.map +1 -0
- package/dist/src/ui/commands/model.js +16 -0
- package/dist/src/ui/commands/model.js.map +1 -0
- package/dist/src/ui/commands/registry.d.ts +30 -0
- package/dist/src/ui/commands/registry.d.ts.map +1 -0
- package/dist/src/ui/commands/registry.js +45 -0
- package/dist/src/ui/commands/registry.js.map +1 -0
- package/dist/src/ui/commands/sessions.d.ts +7 -0
- package/dist/src/ui/commands/sessions.d.ts.map +1 -0
- package/dist/src/ui/commands/sessions.js +13 -0
- package/dist/src/ui/commands/sessions.js.map +1 -0
- package/dist/src/ui/commands/stats.d.ts +7 -0
- package/dist/src/ui/commands/stats.d.ts.map +1 -0
- package/dist/src/ui/commands/stats.js +33 -0
- package/dist/src/ui/commands/stats.js.map +1 -0
- package/dist/src/ui/commands/theme.d.ts +7 -0
- package/dist/src/ui/commands/theme.d.ts.map +1 -0
- package/dist/src/ui/commands/theme.js +35 -0
- package/dist/src/ui/commands/theme.js.map +1 -0
- package/dist/src/ui/markdown/CodeBlock.d.ts +14 -0
- package/dist/src/ui/markdown/CodeBlock.d.ts.map +1 -0
- package/dist/src/ui/markdown/CodeBlock.js +55 -0
- package/dist/src/ui/markdown/CodeBlock.js.map +1 -0
- package/dist/src/ui/markdown/InlineRenderer.d.ts +12 -0
- package/dist/src/ui/markdown/InlineRenderer.d.ts.map +1 -0
- package/dist/src/ui/markdown/InlineRenderer.js +70 -0
- package/dist/src/ui/markdown/InlineRenderer.js.map +1 -0
- package/dist/src/ui/markdown/MarkdownDisplay.d.ts +17 -0
- package/dist/src/ui/markdown/MarkdownDisplay.d.ts.map +1 -0
- package/dist/src/ui/markdown/MarkdownDisplay.js +142 -0
- package/dist/src/ui/markdown/MarkdownDisplay.js.map +1 -0
- package/dist/src/ui/markdown/Table.d.ts +14 -0
- package/dist/src/ui/markdown/Table.d.ts.map +1 -0
- package/dist/src/ui/markdown/Table.js +31 -0
- package/dist/src/ui/markdown/Table.js.map +1 -0
- package/dist/src/ui/theme.d.ts +39 -0
- package/dist/src/ui/theme.d.ts.map +1 -0
- package/dist/src/ui/theme.js +39 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/themes/index.d.ts +45 -0
- package/dist/src/ui/themes/index.d.ts.map +1 -0
- package/dist/src/ui/themes/index.js +73 -0
- package/dist/src/ui/themes/index.js.map +1 -0
- package/dist/src/ui/themes/light.d.ts +8 -0
- package/dist/src/ui/themes/light.d.ts.map +1 -0
- package/dist/src/ui/themes/light.js +37 -0
- package/dist/src/ui/themes/light.js.map +1 -0
- package/dist/src/ui/themes/monochrome.d.ts +8 -0
- package/dist/src/ui/themes/monochrome.d.ts.map +1 -0
- package/dist/src/ui/themes/monochrome.js +37 -0
- package/dist/src/ui/themes/monochrome.js.map +1 -0
- package/dist/src/ui/types.d.ts +191 -0
- package/dist/src/ui/types.d.ts.map +1 -0
- package/dist/src/ui/types.js +7 -0
- package/dist/src/ui/types.js.map +1 -0
- package/dist/src/ui/useAlternateBuffer.d.ts +11 -0
- package/dist/src/ui/useAlternateBuffer.d.ts.map +1 -0
- package/dist/src/ui/useAlternateBuffer.js +25 -0
- package/dist/src/ui/useAlternateBuffer.js.map +1 -0
- package/dist/src/ui/useChat.d.ts +18 -0
- package/dist/src/ui/useChat.d.ts.map +1 -0
- package/dist/src/ui/useChat.js +599 -0
- package/dist/src/ui/useChat.js.map +1 -0
- package/dist/src/ui/useElapsedTime.d.ts +11 -0
- package/dist/src/ui/useElapsedTime.d.ts.map +1 -0
- package/dist/src/ui/useElapsedTime.js +39 -0
- package/dist/src/ui/useElapsedTime.js.map +1 -0
- package/dist/src/ui/useResponsiveLayout.d.ts +16 -0
- package/dist/src/ui/useResponsiveLayout.d.ts.map +1 -0
- package/dist/src/ui/useResponsiveLayout.js +24 -0
- package/dist/src/ui/useResponsiveLayout.js.map +1 -0
- package/dist/src/ui/useScroll.d.ts +20 -0
- package/dist/src/ui/useScroll.d.ts.map +1 -0
- package/dist/src/ui/useScroll.js +64 -0
- package/dist/src/ui/useScroll.js.map +1 -0
- package/dist/src/ui/useSessionResume.d.ts +20 -0
- package/dist/src/ui/useSessionResume.d.ts.map +1 -0
- package/dist/src/ui/useSessionResume.js +77 -0
- package/dist/src/ui/useSessionResume.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +60 -0
- package/src/auth/index.ts +13 -0
- package/src/auth/oauth2.test.ts +305 -0
- package/src/auth/oauth2.ts +269 -0
- package/src/auth/prompt.test.ts +205 -0
- package/src/auth/prompt.ts +111 -0
- package/src/auth/test-connection.test.ts +224 -0
- package/src/auth/test-connection.ts +196 -0
- package/src/auth/types.ts +34 -0
- package/src/commands/audit.test.ts +92 -0
- package/src/commands/audit.ts +113 -0
- package/src/commands/automations.test.ts +85 -0
- package/src/commands/automations.ts +205 -0
- package/src/commands/build-manifest-types.ts +35 -0
- package/src/commands/build-tools.ts +281 -0
- package/src/commands/build.test.ts +63 -0
- package/src/commands/build.ts +135 -0
- package/src/commands/chat.ts +147 -0
- package/src/commands/command-exports.test.ts +88 -0
- package/src/commands/connect.test.ts +343 -0
- package/src/commands/connect.ts +237 -0
- package/src/commands/deploy.test.ts +124 -0
- package/src/commands/deploy.ts +153 -0
- package/src/commands/deployments.ts +90 -0
- package/src/commands/dev.test.ts +63 -0
- package/src/commands/dev.ts +124 -0
- package/src/commands/diff.test.ts +183 -0
- package/src/commands/diff.ts +143 -0
- package/src/commands/docker.ts +232 -0
- package/src/commands/eval.test.ts +88 -0
- package/src/commands/eval.ts +268 -0
- package/src/commands/experiment.test.ts +125 -0
- package/src/commands/experiment.ts +153 -0
- package/src/commands/index.ts +76 -0
- package/src/commands/init.test.ts +109 -0
- package/src/commands/init.ts +98 -0
- package/src/commands/inspect.test.ts +234 -0
- package/src/commands/inspect.ts +157 -0
- package/src/commands/install-pkg.test.ts +265 -0
- package/src/commands/install-pkg.ts +234 -0
- package/src/commands/link.ts +270 -0
- package/src/commands/list.test.ts +152 -0
- package/src/commands/list.ts +95 -0
- package/src/commands/login.test.ts +195 -0
- package/src/commands/login.ts +258 -0
- package/src/commands/promote.ts +64 -0
- package/src/commands/publish.test.ts +203 -0
- package/src/commands/publish.ts +142 -0
- package/src/commands/rollback.ts +72 -0
- package/src/commands/search.test.ts +174 -0
- package/src/commands/search.ts +154 -0
- package/src/commands/secrets.test.ts +168 -0
- package/src/commands/secrets.ts +163 -0
- package/src/commands/serve.ts +166 -0
- package/src/commands/status.ts +94 -0
- package/src/commands/sync.test.ts +130 -0
- package/src/commands/sync.ts +119 -0
- package/src/commands/test-query.test.ts +42 -0
- package/src/commands/test-query.ts +129 -0
- package/src/commands/uninstall.test.ts +162 -0
- package/src/commands/uninstall.ts +107 -0
- package/src/commands/update.test.ts +281 -0
- package/src/commands/update.ts +180 -0
- package/src/commands/validate.test.ts +260 -0
- package/src/commands/validate.ts +139 -0
- package/src/e2e-automations.test.ts +305 -0
- package/src/e2e-commands.test.ts +587 -0
- package/src/e2e-incident-response.test.ts +345 -0
- package/src/e2e-plugin-connections.test.ts +415 -0
- package/src/e2e-plugins.test.ts +492 -0
- package/src/e2e.test.ts +602 -0
- package/src/fixtures/incident-response.ts +232 -0
- package/src/main.ts +35 -0
- package/src/shared/platform-client.test.ts +106 -0
- package/src/shared/platform-client.ts +193 -0
- package/src/shared/repo-discovery.test.ts +56 -0
- package/src/shared/repo-discovery.ts +40 -0
- package/src/templates/compose-template.ts +30 -0
- package/src/templates/config-template.ts +44 -0
- package/src/templates/deployment-templates.test.ts +99 -0
- package/src/templates/dockerfile-template.ts +30 -0
- package/src/templates/env-template.ts +27 -0
- package/src/templates/knowledge-template.ts +24 -0
- package/src/templates/skill-template.ts +27 -0
- package/src/ui/AskUserPrompt.tsx +58 -0
- package/src/ui/AssistantMessage.tsx +51 -0
- package/src/ui/ChatApp.tsx +283 -0
- package/src/ui/ConfirmationPrompt.tsx +75 -0
- package/src/ui/DiffRenderer.test.ts +104 -0
- package/src/ui/DiffRenderer.tsx +188 -0
- package/src/ui/ExpandableContent.tsx +68 -0
- package/src/ui/ExploreIndicator.tsx +44 -0
- package/src/ui/Footer.tsx +87 -0
- package/src/ui/FullScreenLayout.tsx +45 -0
- package/src/ui/Header.tsx +50 -0
- package/src/ui/InputBar.tsx +105 -0
- package/src/ui/MessageList.tsx +31 -0
- package/src/ui/NotificationBar.tsx +64 -0
- package/src/ui/ScrollableMessageList.tsx +82 -0
- package/src/ui/SessionBrowser.test.ts +49 -0
- package/src/ui/SessionBrowser.tsx +179 -0
- package/src/ui/StatusMessage.tsx +35 -0
- package/src/ui/StreamingView.tsx +87 -0
- package/src/ui/SubagentDisplay.tsx +57 -0
- package/src/ui/ThinkingDisplay.tsx +45 -0
- package/src/ui/ToolCallDisplay.tsx +268 -0
- package/src/ui/UserMessage.tsx +22 -0
- package/src/ui/chat-e2e.test.ts +581 -0
- package/src/ui/commands/clear.ts +15 -0
- package/src/ui/commands/help.ts +31 -0
- package/src/ui/commands/index.ts +22 -0
- package/src/ui/commands/model.ts +19 -0
- package/src/ui/commands/registry.test.ts +76 -0
- package/src/ui/commands/registry.ts +66 -0
- package/src/ui/commands/sessions.ts +16 -0
- package/src/ui/commands/stats.ts +35 -0
- package/src/ui/commands/theme.ts +41 -0
- package/src/ui/markdown/CodeBlock.tsx +118 -0
- package/src/ui/markdown/InlineRenderer.tsx +115 -0
- package/src/ui/markdown/MarkdownDisplay.tsx +223 -0
- package/src/ui/markdown/Table.tsx +75 -0
- package/src/ui/theme.ts +39 -0
- package/src/ui/themes/index.ts +113 -0
- package/src/ui/themes/light.ts +39 -0
- package/src/ui/themes/monochrome.ts +39 -0
- package/src/ui/types.ts +157 -0
- package/src/ui/useAlternateBuffer.ts +27 -0
- package/src/ui/useChat.test.ts +492 -0
- package/src/ui/useChat.ts +693 -0
- package/src/ui/useElapsedTime.test.ts +33 -0
- package/src/ui/useElapsedTime.ts +43 -0
- package/src/ui/useResponsiveLayout.test.ts +54 -0
- package/src/ui/useResponsiveLayout.ts +32 -0
- package/src/ui/useScroll.test.ts +99 -0
- package/src/ui/useScroll.ts +97 -0
- package/src/ui/useSessionResume.test.ts +80 -0
- package/src/ui/useSessionResume.ts +102 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {useState, useCallback} from 'react';
|
|
9
|
+
import {Box, Text} from 'ink';
|
|
10
|
+
import TextInput from 'ink-text-input';
|
|
11
|
+
import Spinner from 'ink-spinner';
|
|
12
|
+
import {theme} from './theme.js';
|
|
13
|
+
import {parseSlashCommand} from './commands/index.js';
|
|
14
|
+
|
|
15
|
+
interface InputBarProps {
|
|
16
|
+
onSubmit: (text: string) => void;
|
|
17
|
+
onSlashCommand?: (name: string, args: string) => void;
|
|
18
|
+
isStreaming: boolean;
|
|
19
|
+
elapsed?: number;
|
|
20
|
+
exploreQuery?: string;
|
|
21
|
+
activeToolName?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function formatElapsed(seconds: number): string {
|
|
25
|
+
if (seconds < 60) return `${seconds}s`;
|
|
26
|
+
const m = Math.floor(seconds / 60);
|
|
27
|
+
const s = seconds % 60;
|
|
28
|
+
return `${m}m${s}s`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const InputBar: React.FC<InputBarProps> = ({
|
|
32
|
+
onSubmit,
|
|
33
|
+
onSlashCommand,
|
|
34
|
+
isStreaming,
|
|
35
|
+
elapsed = 0,
|
|
36
|
+
exploreQuery,
|
|
37
|
+
activeToolName,
|
|
38
|
+
}) => {
|
|
39
|
+
const [value, setValue] = useState('');
|
|
40
|
+
|
|
41
|
+
const handleSubmit = useCallback(
|
|
42
|
+
(text: string) => {
|
|
43
|
+
const trimmed = text.trim();
|
|
44
|
+
if (!trimmed) return;
|
|
45
|
+
|
|
46
|
+
// Check for slash commands
|
|
47
|
+
if (onSlashCommand) {
|
|
48
|
+
const parsed = parseSlashCommand(trimmed);
|
|
49
|
+
if (parsed) {
|
|
50
|
+
onSlashCommand(parsed.name, parsed.args);
|
|
51
|
+
setValue('');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
onSubmit(trimmed);
|
|
57
|
+
setValue('');
|
|
58
|
+
},
|
|
59
|
+
[onSubmit, onSlashCommand],
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (isStreaming) {
|
|
63
|
+
const elapsedStr = elapsed > 0 ? ` (${formatElapsed(elapsed)})` : '';
|
|
64
|
+
|
|
65
|
+
let statusText: string;
|
|
66
|
+
if (exploreQuery) {
|
|
67
|
+
statusText = ` exploring "${exploreQuery}"${elapsedStr}`;
|
|
68
|
+
} else if (activeToolName) {
|
|
69
|
+
statusText = ` running ${activeToolName}${elapsedStr}`;
|
|
70
|
+
} else {
|
|
71
|
+
statusText = ` thinking${elapsedStr}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<Box marginTop={1}>
|
|
76
|
+
<Text color={theme.text.accent}>
|
|
77
|
+
<Spinner type="dots" />
|
|
78
|
+
</Text>
|
|
79
|
+
<Text color={theme.ui.dim}>{statusText}</Text>
|
|
80
|
+
</Box>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<Box flexDirection="column" marginTop={1}>
|
|
86
|
+
<Box>
|
|
87
|
+
<Text color={theme.border.default}>{'─'.repeat(process.stdout.columns || 80)}</Text>
|
|
88
|
+
</Box>
|
|
89
|
+
<Box>
|
|
90
|
+
<Text color={theme.text.accent} bold>
|
|
91
|
+
{'› '}
|
|
92
|
+
</Text>
|
|
93
|
+
<TextInput
|
|
94
|
+
value={value}
|
|
95
|
+
onChange={setValue}
|
|
96
|
+
onSubmit={handleSubmit}
|
|
97
|
+
placeholder="Type a message... (/help for commands)"
|
|
98
|
+
/>
|
|
99
|
+
</Box>
|
|
100
|
+
<Box>
|
|
101
|
+
<Text color={theme.border.default}>{'─'.repeat(process.stdout.columns || 80)}</Text>
|
|
102
|
+
</Box>
|
|
103
|
+
</Box>
|
|
104
|
+
);
|
|
105
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {UserMessage} from './UserMessage.js';
|
|
9
|
+
import {AssistantMessage} from './AssistantMessage.js';
|
|
10
|
+
import type {ChatMessage} from './types.js';
|
|
11
|
+
|
|
12
|
+
interface MessageListProps {
|
|
13
|
+
messages: ChatMessage[];
|
|
14
|
+
width?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Pure render component — maps messages to UserMessage/AssistantMessage.
|
|
19
|
+
* No longer uses <Static>; parent controls scrolling.
|
|
20
|
+
*/
|
|
21
|
+
export const MessageList: React.FC<MessageListProps> = ({messages, width}) => (
|
|
22
|
+
<>
|
|
23
|
+
{messages.map((message) =>
|
|
24
|
+
message.role === 'user' ? (
|
|
25
|
+
<UserMessage key={message.id} text={message.text} />
|
|
26
|
+
) : (
|
|
27
|
+
<AssistantMessage key={message.id} message={message} width={width} />
|
|
28
|
+
),
|
|
29
|
+
)}
|
|
30
|
+
</>
|
|
31
|
+
);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {useEffect} from 'react';
|
|
9
|
+
import {Box, Text} from 'ink';
|
|
10
|
+
import {theme} from './theme.js';
|
|
11
|
+
import type {NotificationInfo} from './types.js';
|
|
12
|
+
|
|
13
|
+
interface NotificationBarProps {
|
|
14
|
+
notifications: NotificationInfo[];
|
|
15
|
+
onDismiss: (id: string) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const notificationIcons: Record<NotificationInfo['type'], string> = {
|
|
19
|
+
credential_saved: '\uD83D\uDD11',
|
|
20
|
+
approved: '\u2713',
|
|
21
|
+
kb_proposal: '\uD83D\uDCCB',
|
|
22
|
+
field_scrub: '\uD83D\uDEE1\uFE0F',
|
|
23
|
+
info: '\u2139',
|
|
24
|
+
warning: '\u26A0',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const notificationColors: Record<NotificationInfo['type'], string> = {
|
|
28
|
+
credential_saved: theme.status.success,
|
|
29
|
+
approved: theme.status.success,
|
|
30
|
+
kb_proposal: theme.text.link,
|
|
31
|
+
field_scrub: theme.status.warning,
|
|
32
|
+
info: theme.text.link,
|
|
33
|
+
warning: theme.status.warning,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const NotificationBar: React.FC<NotificationBarProps> = ({notifications, onDismiss}) => {
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (notifications.length === 0) return;
|
|
39
|
+
const timers = notifications.map((n) =>
|
|
40
|
+
setTimeout(() => {
|
|
41
|
+
onDismiss(n.id);
|
|
42
|
+
}, 5000),
|
|
43
|
+
);
|
|
44
|
+
return () => {
|
|
45
|
+
timers.forEach((t) => {
|
|
46
|
+
clearTimeout(t);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}, [notifications, onDismiss]);
|
|
50
|
+
|
|
51
|
+
if (notifications.length === 0) return null;
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<Box flexDirection="column">
|
|
55
|
+
{notifications.map((n) => (
|
|
56
|
+
<Box key={n.id}>
|
|
57
|
+
<Text color={notificationColors[n.type]}>
|
|
58
|
+
{notificationIcons[n.type]} {n.message}
|
|
59
|
+
</Text>
|
|
60
|
+
</Box>
|
|
61
|
+
))}
|
|
62
|
+
</Box>
|
|
63
|
+
);
|
|
64
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {useMemo} from 'react';
|
|
9
|
+
import {Box, Text} from 'ink';
|
|
10
|
+
import {UserMessage} from './UserMessage.js';
|
|
11
|
+
import {AssistantMessage} from './AssistantMessage.js';
|
|
12
|
+
import {StreamingView} from './StreamingView.js';
|
|
13
|
+
import {theme} from './theme.js';
|
|
14
|
+
import type {ChatMessage, ToolCallInfo, ExplorePhase} from './types.js';
|
|
15
|
+
|
|
16
|
+
interface ScrollableMessageListProps {
|
|
17
|
+
messages: ChatMessage[];
|
|
18
|
+
width: number;
|
|
19
|
+
viewportHeight: number;
|
|
20
|
+
scrollTop: number;
|
|
21
|
+
isStreaming: boolean;
|
|
22
|
+
streamingText: string;
|
|
23
|
+
thinkingText: string;
|
|
24
|
+
toolCalls: ToolCallInfo[];
|
|
25
|
+
skills: string[];
|
|
26
|
+
explore: ExplorePhase | null;
|
|
27
|
+
error: string | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Renders messages and streaming content.
|
|
32
|
+
* Scroll viewport is handled by the terminal's native scrollback for now.
|
|
33
|
+
*/
|
|
34
|
+
export const ScrollableMessageList: React.FC<ScrollableMessageListProps> = ({
|
|
35
|
+
messages,
|
|
36
|
+
width,
|
|
37
|
+
isStreaming,
|
|
38
|
+
streamingText,
|
|
39
|
+
thinkingText,
|
|
40
|
+
toolCalls,
|
|
41
|
+
skills,
|
|
42
|
+
explore,
|
|
43
|
+
error,
|
|
44
|
+
}) => {
|
|
45
|
+
const messageElements = useMemo(
|
|
46
|
+
() =>
|
|
47
|
+
messages.map((message) =>
|
|
48
|
+
message.role === 'user' ? (
|
|
49
|
+
<UserMessage key={message.id} text={message.text} />
|
|
50
|
+
) : (
|
|
51
|
+
<AssistantMessage key={message.id} message={message} width={width} />
|
|
52
|
+
),
|
|
53
|
+
),
|
|
54
|
+
[messages, width],
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Box flexDirection="column">
|
|
59
|
+
{messageElements}
|
|
60
|
+
|
|
61
|
+
{/* Live streaming content */}
|
|
62
|
+
{isStreaming ? (
|
|
63
|
+
<StreamingView
|
|
64
|
+
text={streamingText}
|
|
65
|
+
thinkingText={thinkingText}
|
|
66
|
+
toolCalls={toolCalls}
|
|
67
|
+
skills={skills}
|
|
68
|
+
explore={explore}
|
|
69
|
+
error={error}
|
|
70
|
+
width={width}
|
|
71
|
+
/>
|
|
72
|
+
) : null}
|
|
73
|
+
|
|
74
|
+
{/* Error display (non-streaming errors) */}
|
|
75
|
+
{!isStreaming && error ? (
|
|
76
|
+
<Box marginTop={1}>
|
|
77
|
+
<Text color={theme.status.error}>[error] {error}</Text>
|
|
78
|
+
</Box>
|
|
79
|
+
) : null}
|
|
80
|
+
</Box>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {describe, it, expect} from 'vitest';
|
|
8
|
+
import type {SessionEntry} from './SessionBrowser.js';
|
|
9
|
+
|
|
10
|
+
// Test the filtering logic independently
|
|
11
|
+
function filterSessions(
|
|
12
|
+
sessions: SessionEntry[],
|
|
13
|
+
filter: string,
|
|
14
|
+
): SessionEntry[] {
|
|
15
|
+
if (!filter) return sessions;
|
|
16
|
+
return sessions.filter(
|
|
17
|
+
(s) =>
|
|
18
|
+
s.id.includes(filter) ||
|
|
19
|
+
s.preview.toLowerCase().includes(filter.toLowerCase()),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe('SessionBrowser filtering', () => {
|
|
24
|
+
const sessions: SessionEntry[] = [
|
|
25
|
+
{id: 'abc123', createdAt: '2025-01-01', messageCount: 5, preview: 'What is the error rate?'},
|
|
26
|
+
{id: 'def456', createdAt: '2025-01-02', messageCount: 3, preview: 'Deploy status check'},
|
|
27
|
+
{id: 'ghi789', createdAt: '2025-01-03', messageCount: 8, preview: 'Error investigation'},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
it('returns all sessions with empty filter', () => {
|
|
31
|
+
expect(filterSessions(sessions, '')).toHaveLength(3);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('filters by id', () => {
|
|
35
|
+
const result = filterSessions(sessions, 'abc');
|
|
36
|
+
expect(result).toHaveLength(1);
|
|
37
|
+
expect(result[0]?.id).toBe('abc123');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('filters by preview text (case-insensitive)', () => {
|
|
41
|
+
const result = filterSessions(sessions, 'error');
|
|
42
|
+
expect(result).toHaveLength(2);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('returns empty for no matches', () => {
|
|
46
|
+
const result = filterSessions(sessions, 'zzz');
|
|
47
|
+
expect(result).toHaveLength(0);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {useState, useEffect} from 'react';
|
|
9
|
+
import {Box, Text, useInput} from 'ink';
|
|
10
|
+
import http from 'node:http';
|
|
11
|
+
import https from 'node:https';
|
|
12
|
+
import {theme} from './theme.js';
|
|
13
|
+
|
|
14
|
+
export interface SessionEntry {
|
|
15
|
+
id: string;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
messageCount: number;
|
|
18
|
+
preview: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface SessionBrowserProps {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
onSelect: (sessionId: string) => void;
|
|
24
|
+
onClose: () => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const SessionBrowser: React.FC<SessionBrowserProps> = ({
|
|
28
|
+
baseUrl,
|
|
29
|
+
onSelect,
|
|
30
|
+
onClose,
|
|
31
|
+
}) => {
|
|
32
|
+
const [sessions, setSessions] = useState<SessionEntry[]>([]);
|
|
33
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
34
|
+
const [loading, setLoading] = useState(true);
|
|
35
|
+
const [error, setError] = useState<string | null>(null);
|
|
36
|
+
const [filter, setFilter] = useState('');
|
|
37
|
+
const [isSearching, setIsSearching] = useState(false);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
const url = new URL('/sessions', baseUrl);
|
|
41
|
+
const mod = url.protocol === 'https:' ? https : http;
|
|
42
|
+
const req = mod.request(
|
|
43
|
+
url,
|
|
44
|
+
{ method: 'GET' },
|
|
45
|
+
(res) => {
|
|
46
|
+
let data = '';
|
|
47
|
+
res.setEncoding('utf8');
|
|
48
|
+
res.on('data', (chunk: string) => {
|
|
49
|
+
data += chunk;
|
|
50
|
+
});
|
|
51
|
+
res.on('end', () => {
|
|
52
|
+
try {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
54
|
+
const parsed = JSON.parse(data) as {sessions: SessionEntry[]};
|
|
55
|
+
setSessions(parsed.sessions);
|
|
56
|
+
} catch {
|
|
57
|
+
setError('Failed to load sessions');
|
|
58
|
+
} finally {
|
|
59
|
+
setLoading(false);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
req.on('error', (err) => {
|
|
65
|
+
setError(err.message);
|
|
66
|
+
setLoading(false);
|
|
67
|
+
});
|
|
68
|
+
req.end();
|
|
69
|
+
}, [baseUrl]);
|
|
70
|
+
|
|
71
|
+
const filtered = filter
|
|
72
|
+
? sessions.filter(
|
|
73
|
+
(s) =>
|
|
74
|
+
s.id.includes(filter) || s.preview.toLowerCase().includes(filter.toLowerCase()),
|
|
75
|
+
)
|
|
76
|
+
: sessions;
|
|
77
|
+
|
|
78
|
+
useInput((input, key) => {
|
|
79
|
+
if (isSearching) {
|
|
80
|
+
if (key.escape) {
|
|
81
|
+
setIsSearching(false);
|
|
82
|
+
setFilter('');
|
|
83
|
+
} else if (key.return) {
|
|
84
|
+
setIsSearching(false);
|
|
85
|
+
} else if (key.backspace || key.delete) {
|
|
86
|
+
setFilter((prev) => prev.slice(0, -1));
|
|
87
|
+
} else if (input && !key.ctrl) {
|
|
88
|
+
setFilter((prev) => prev + input);
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (key.escape) {
|
|
94
|
+
onClose();
|
|
95
|
+
} else if (input === 'j' || key.downArrow) {
|
|
96
|
+
setSelectedIndex((prev) => Math.min(prev + 1, filtered.length - 1));
|
|
97
|
+
} else if (input === 'k' || key.upArrow) {
|
|
98
|
+
setSelectedIndex((prev) => Math.max(prev - 1, 0));
|
|
99
|
+
} else if (key.return) {
|
|
100
|
+
const session = filtered[selectedIndex];
|
|
101
|
+
if (session) {
|
|
102
|
+
onSelect(session.id);
|
|
103
|
+
}
|
|
104
|
+
} else if (input === '/') {
|
|
105
|
+
setIsSearching(true);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
if (loading) {
|
|
110
|
+
return (
|
|
111
|
+
<Box marginTop={1}>
|
|
112
|
+
<Text color={theme.ui.dim}>Loading sessions...</Text>
|
|
113
|
+
</Box>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (error) {
|
|
118
|
+
return (
|
|
119
|
+
<Box marginTop={1} flexDirection="column">
|
|
120
|
+
<Text color={theme.status.error}>Error: {error}</Text>
|
|
121
|
+
<Text color={theme.ui.dim}>Press Esc to close</Text>
|
|
122
|
+
</Box>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<Box flexDirection="column" marginTop={1}>
|
|
128
|
+
<Box marginBottom={1}>
|
|
129
|
+
<Text bold color={theme.text.accent}>
|
|
130
|
+
Sessions
|
|
131
|
+
</Text>
|
|
132
|
+
<Text color={theme.ui.dim}>
|
|
133
|
+
{' '}({filtered.length} of {sessions.length})
|
|
134
|
+
</Text>
|
|
135
|
+
</Box>
|
|
136
|
+
|
|
137
|
+
{isSearching ? (
|
|
138
|
+
<Box marginBottom={1}>
|
|
139
|
+
<Text color={theme.text.accent}>/ </Text>
|
|
140
|
+
<Text>{filter}</Text>
|
|
141
|
+
<Text color={theme.ui.dim}>_</Text>
|
|
142
|
+
</Box>
|
|
143
|
+
) : filter ? (
|
|
144
|
+
<Box marginBottom={1}>
|
|
145
|
+
<Text color={theme.ui.dim}>filter: {filter}</Text>
|
|
146
|
+
</Box>
|
|
147
|
+
) : null}
|
|
148
|
+
|
|
149
|
+
{filtered.length === 0 ? (
|
|
150
|
+
<Text color={theme.ui.dim}>No sessions found</Text>
|
|
151
|
+
) : (
|
|
152
|
+
filtered.slice(0, 10).map((session, i) => {
|
|
153
|
+
const isSelected = i === selectedIndex;
|
|
154
|
+
return (
|
|
155
|
+
<Box key={session.id} gap={1}>
|
|
156
|
+
<Text color={isSelected ? theme.text.accent : theme.ui.dim}>
|
|
157
|
+
{isSelected ? '>' : ' '}
|
|
158
|
+
</Text>
|
|
159
|
+
<Text bold={isSelected} color={isSelected ? theme.text.primary : theme.text.secondary}>
|
|
160
|
+
{session.id.slice(0, 8)}
|
|
161
|
+
</Text>
|
|
162
|
+
<Text color={theme.ui.dim}>{session.createdAt}</Text>
|
|
163
|
+
<Text color={theme.text.secondary} wrap="truncate-end">
|
|
164
|
+
{session.preview}
|
|
165
|
+
</Text>
|
|
166
|
+
</Box>
|
|
167
|
+
);
|
|
168
|
+
})
|
|
169
|
+
)}
|
|
170
|
+
|
|
171
|
+
<Box marginTop={1} gap={2}>
|
|
172
|
+
<Text color={theme.ui.dim}>j/k navigate</Text>
|
|
173
|
+
<Text color={theme.ui.dim}>Enter select</Text>
|
|
174
|
+
<Text color={theme.ui.dim}>/ search</Text>
|
|
175
|
+
<Text color={theme.ui.dim}>Esc close</Text>
|
|
176
|
+
</Box>
|
|
177
|
+
</Box>
|
|
178
|
+
);
|
|
179
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {Box, Text} from 'ink';
|
|
9
|
+
import {theme} from './theme.js';
|
|
10
|
+
|
|
11
|
+
interface StatusMessageProps {
|
|
12
|
+
type: 'info' | 'warning' | 'error' | 'success';
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const icons: Record<StatusMessageProps['type'], string> = {
|
|
17
|
+
info: '\u2139',
|
|
18
|
+
warning: '\u26A0',
|
|
19
|
+
error: '\u2717',
|
|
20
|
+
success: '\u2713',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const colors: Record<StatusMessageProps['type'], string> = {
|
|
24
|
+
info: theme.text.link,
|
|
25
|
+
warning: theme.status.warning,
|
|
26
|
+
error: theme.status.error,
|
|
27
|
+
success: theme.status.success,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const StatusMessage: React.FC<StatusMessageProps> = ({type, children}) => (
|
|
31
|
+
<Box>
|
|
32
|
+
<Text color={colors[type]}>{icons[type]} </Text>
|
|
33
|
+
<Text color={colors[type]}>{children}</Text>
|
|
34
|
+
</Box>
|
|
35
|
+
);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {Box, Text} from 'ink';
|
|
9
|
+
import {theme} from './theme.js';
|
|
10
|
+
import {ToolCallDisplay} from './ToolCallDisplay.js';
|
|
11
|
+
import {ThinkingDisplay} from './ThinkingDisplay.js';
|
|
12
|
+
import {ExploreIndicator} from './ExploreIndicator.js';
|
|
13
|
+
import type {ToolCallInfo, ExplorePhase} from './types.js';
|
|
14
|
+
|
|
15
|
+
interface StreamingViewProps {
|
|
16
|
+
text: string;
|
|
17
|
+
thinkingText?: string;
|
|
18
|
+
toolCalls: ToolCallInfo[];
|
|
19
|
+
skills: string[];
|
|
20
|
+
explore?: ExplorePhase | null;
|
|
21
|
+
error: string | null;
|
|
22
|
+
width?: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const StreamingView: React.FC<StreamingViewProps> = ({
|
|
26
|
+
text,
|
|
27
|
+
thinkingText,
|
|
28
|
+
toolCalls,
|
|
29
|
+
skills,
|
|
30
|
+
explore,
|
|
31
|
+
error,
|
|
32
|
+
width,
|
|
33
|
+
}) => {
|
|
34
|
+
if (
|
|
35
|
+
!text &&
|
|
36
|
+
!thinkingText &&
|
|
37
|
+
toolCalls.length === 0 &&
|
|
38
|
+
!error &&
|
|
39
|
+
skills.length === 0 &&
|
|
40
|
+
!explore
|
|
41
|
+
) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Box flexDirection="column" marginTop={1}>
|
|
47
|
+
{/* Activated skills */}
|
|
48
|
+
{skills.map((skill, i) => (
|
|
49
|
+
<Text key={i} color={theme.status.warning}>
|
|
50
|
+
{' \u26A1 '}
|
|
51
|
+
{skill}
|
|
52
|
+
</Text>
|
|
53
|
+
))}
|
|
54
|
+
|
|
55
|
+
{/* Explore phase indicator */}
|
|
56
|
+
{explore ? <ExploreIndicator phase={explore} /> : null}
|
|
57
|
+
|
|
58
|
+
{/* Thinking display */}
|
|
59
|
+
{thinkingText ? <ThinkingDisplay text={thinkingText} /> : null}
|
|
60
|
+
|
|
61
|
+
{/* Streaming text (raw, no markdown rendering mid-stream) */}
|
|
62
|
+
{text ? (
|
|
63
|
+
<Box>
|
|
64
|
+
<Text color={theme.text.accent}>{'\u2726 '}</Text>
|
|
65
|
+
<Text wrap="wrap">{text}</Text>
|
|
66
|
+
</Box>
|
|
67
|
+
) : null}
|
|
68
|
+
|
|
69
|
+
{/* Active tool calls — running tools get full view, completed get compact */}
|
|
70
|
+
{toolCalls.map((tool) => (
|
|
71
|
+
<ToolCallDisplay
|
|
72
|
+
key={tool.toolId}
|
|
73
|
+
tool={tool}
|
|
74
|
+
width={width}
|
|
75
|
+
compact={tool.status !== 'running'}
|
|
76
|
+
/>
|
|
77
|
+
))}
|
|
78
|
+
|
|
79
|
+
{/* Error */}
|
|
80
|
+
{error ? (
|
|
81
|
+
<Box marginTop={1}>
|
|
82
|
+
<Text color={theme.status.error}>[error] {error}</Text>
|
|
83
|
+
</Box>
|
|
84
|
+
) : null}
|
|
85
|
+
</Box>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {Box, Text} from 'ink';
|
|
9
|
+
import {theme} from './theme.js';
|
|
10
|
+
import type {SubagentEventInfo} from './types.js';
|
|
11
|
+
|
|
12
|
+
interface SubagentDisplayProps {
|
|
13
|
+
events: SubagentEventInfo[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const SubagentDisplay: React.FC<SubagentDisplayProps> = ({events}) => {
|
|
17
|
+
if (events.length === 0) return null;
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Box flexDirection="column" paddingLeft={2}>
|
|
21
|
+
{events.map((event, i) => {
|
|
22
|
+
const isLast = i === events.length - 1;
|
|
23
|
+
const prefix = isLast ? '└─' : '├─';
|
|
24
|
+
|
|
25
|
+
if (event.error) {
|
|
26
|
+
return (
|
|
27
|
+
<Text key={i} color={theme.status.error}>
|
|
28
|
+
{prefix} {event.agentName}: {event.error}
|
|
29
|
+
</Text>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (event.text) {
|
|
34
|
+
return (
|
|
35
|
+
<Text key={i} color={theme.text.secondary}>
|
|
36
|
+
{prefix} {event.agentName}: {event.text}
|
|
37
|
+
</Text>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (event.toolName) {
|
|
42
|
+
return (
|
|
43
|
+
<Text key={i} color={theme.ui.dim}>
|
|
44
|
+
{prefix} {event.agentName} › {event.toolName}
|
|
45
|
+
</Text>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<Text key={i} color={theme.ui.dim}>
|
|
51
|
+
{prefix} {event.agentName} [{event.eventType}]
|
|
52
|
+
</Text>
|
|
53
|
+
);
|
|
54
|
+
})}
|
|
55
|
+
</Box>
|
|
56
|
+
);
|
|
57
|
+
};
|