@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,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {useState, useEffect, useRef} from 'react';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Returns elapsed seconds since mount or last reset.
|
|
11
|
+
* Resets when `isStreaming` flips to true.
|
|
12
|
+
*/
|
|
13
|
+
export function useElapsedTime(isStreaming: boolean): number {
|
|
14
|
+
const [elapsed, setElapsed] = useState(0);
|
|
15
|
+
const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
16
|
+
const wasStreamingRef = useRef(false);
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
// Reset when streaming starts
|
|
20
|
+
if (isStreaming && !wasStreamingRef.current) {
|
|
21
|
+
setElapsed(0);
|
|
22
|
+
}
|
|
23
|
+
wasStreamingRef.current = isStreaming;
|
|
24
|
+
|
|
25
|
+
if (isStreaming) {
|
|
26
|
+
intervalRef.current = setInterval(() => {
|
|
27
|
+
setElapsed((prev) => prev + 1);
|
|
28
|
+
}, 1000);
|
|
29
|
+
} else if (intervalRef.current) {
|
|
30
|
+
clearInterval(intervalRef.current);
|
|
31
|
+
intervalRef.current = null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return () => {
|
|
35
|
+
if (intervalRef.current) {
|
|
36
|
+
clearInterval(intervalRef.current);
|
|
37
|
+
intervalRef.current = null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}, [isStreaming]);
|
|
41
|
+
|
|
42
|
+
return elapsed;
|
|
43
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 {getResponsiveLayout} from './useResponsiveLayout.js';
|
|
9
|
+
|
|
10
|
+
describe('getResponsiveLayout', () => {
|
|
11
|
+
it('narrow terminal (40 cols)', () => {
|
|
12
|
+
const layout = getResponsiveLayout(40);
|
|
13
|
+
expect(layout.isNarrow).toBe(true);
|
|
14
|
+
expect(layout.contentWidth).toBe(40);
|
|
15
|
+
expect(layout.toolCardWidth).toBe(36); // 40 - 4
|
|
16
|
+
expect(layout.showGutter).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('medium terminal (70 cols)', () => {
|
|
20
|
+
const layout = getResponsiveLayout(70);
|
|
21
|
+
expect(layout.isNarrow).toBe(false);
|
|
22
|
+
expect(layout.contentWidth).toBe(70);
|
|
23
|
+
expect(layout.toolCardWidth).toBe(66); // 70 - 4
|
|
24
|
+
expect(layout.showGutter).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('wide terminal (120 cols)', () => {
|
|
28
|
+
const layout = getResponsiveLayout(120);
|
|
29
|
+
expect(layout.isNarrow).toBe(false);
|
|
30
|
+
expect(layout.contentWidth).toBe(120);
|
|
31
|
+
expect(layout.toolCardWidth).toBe(80); // capped at 80
|
|
32
|
+
expect(layout.showGutter).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('exact narrow threshold (60 cols)', () => {
|
|
36
|
+
const layout = getResponsiveLayout(60);
|
|
37
|
+
expect(layout.isNarrow).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('below narrow threshold (59 cols)', () => {
|
|
41
|
+
const layout = getResponsiveLayout(59);
|
|
42
|
+
expect(layout.isNarrow).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('exact gutter threshold (80 cols)', () => {
|
|
46
|
+
const layout = getResponsiveLayout(80);
|
|
47
|
+
expect(layout.showGutter).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('narrow terminal caps tool width at 50', () => {
|
|
51
|
+
const layout = getResponsiveLayout(58);
|
|
52
|
+
expect(layout.toolCardWidth).toBe(50); // min(58-4, 50)
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export interface ResponsiveLayout {
|
|
8
|
+
isNarrow: boolean;
|
|
9
|
+
contentWidth: number;
|
|
10
|
+
toolCardWidth: number;
|
|
11
|
+
showGutter: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const NARROW_THRESHOLD = 60;
|
|
15
|
+
const GUTTER_THRESHOLD = 80;
|
|
16
|
+
const MAX_TOOL_WIDTH = 80;
|
|
17
|
+
const NARROW_TOOL_WIDTH = 50;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns layout parameters based on terminal column width.
|
|
21
|
+
*/
|
|
22
|
+
export function getResponsiveLayout(cols: number): ResponsiveLayout {
|
|
23
|
+
const isNarrow = cols < NARROW_THRESHOLD;
|
|
24
|
+
return {
|
|
25
|
+
isNarrow,
|
|
26
|
+
contentWidth: cols,
|
|
27
|
+
toolCardWidth: isNarrow
|
|
28
|
+
? Math.min(cols - 4, NARROW_TOOL_WIDTH)
|
|
29
|
+
: Math.min(cols - 4, MAX_TOOL_WIDTH),
|
|
30
|
+
showGutter: cols >= GUTTER_THRESHOLD,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {describe, it, expect} from 'vitest';
|
|
8
|
+
|
|
9
|
+
// Test scroll clamping logic independently from the React hook
|
|
10
|
+
function clampScroll(
|
|
11
|
+
scrollTop: number,
|
|
12
|
+
contentHeight: number,
|
|
13
|
+
viewportHeight: number,
|
|
14
|
+
): number {
|
|
15
|
+
const maxScroll = Math.max(0, contentHeight - viewportHeight);
|
|
16
|
+
return Math.max(0, Math.min(scrollTop, maxScroll));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function isAtBottom(
|
|
20
|
+
scrollTop: number,
|
|
21
|
+
contentHeight: number,
|
|
22
|
+
viewportHeight: number,
|
|
23
|
+
): boolean {
|
|
24
|
+
const maxScroll = Math.max(0, contentHeight - viewportHeight);
|
|
25
|
+
return scrollTop >= maxScroll || contentHeight <= viewportHeight;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function autoScrollTarget(
|
|
29
|
+
currentTop: number,
|
|
30
|
+
wasAtBottom: boolean,
|
|
31
|
+
contentHeight: number,
|
|
32
|
+
viewportHeight: number,
|
|
33
|
+
): number {
|
|
34
|
+
if (!wasAtBottom) return currentTop;
|
|
35
|
+
return Math.max(0, contentHeight - viewportHeight);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe('scroll clamping', () => {
|
|
39
|
+
it('clamps to zero minimum', () => {
|
|
40
|
+
expect(clampScroll(-10, 100, 50)).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('clamps to max scroll', () => {
|
|
44
|
+
// max = 100 - 50 = 50
|
|
45
|
+
expect(clampScroll(60, 100, 50)).toBe(50);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('allows valid scroll positions', () => {
|
|
49
|
+
expect(clampScroll(25, 100, 50)).toBe(25);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('handles content smaller than viewport', () => {
|
|
53
|
+
expect(clampScroll(10, 30, 50)).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('handles equal content and viewport', () => {
|
|
57
|
+
expect(clampScroll(5, 50, 50)).toBe(0);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('isAtBottom', () => {
|
|
62
|
+
it('is true when scrolled to max', () => {
|
|
63
|
+
expect(isAtBottom(50, 100, 50)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('is true when content fits viewport', () => {
|
|
67
|
+
expect(isAtBottom(0, 30, 50)).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('is false when not at max', () => {
|
|
71
|
+
expect(isAtBottom(25, 100, 50)).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('is true at exact max', () => {
|
|
75
|
+
expect(isAtBottom(50, 100, 50)).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('is true beyond max', () => {
|
|
79
|
+
expect(isAtBottom(60, 100, 50)).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('autoScrollTarget', () => {
|
|
84
|
+
it('auto-scrolls when at bottom', () => {
|
|
85
|
+
expect(autoScrollTarget(50, true, 120, 50)).toBe(70);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('stays put when not at bottom', () => {
|
|
89
|
+
expect(autoScrollTarget(25, false, 120, 50)).toBe(25);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('handles growing content from empty', () => {
|
|
93
|
+
expect(autoScrollTarget(0, true, 60, 50)).toBe(10);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('stays at 0 when content fits', () => {
|
|
97
|
+
expect(autoScrollTarget(0, true, 30, 50)).toBe(0);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {useState, useCallback, useEffect, useRef} from 'react';
|
|
8
|
+
|
|
9
|
+
export interface ScrollState {
|
|
10
|
+
scrollTop: number;
|
|
11
|
+
isAtBottom: boolean;
|
|
12
|
+
scrollToBottom: () => void;
|
|
13
|
+
scrollBy: (delta: number) => void;
|
|
14
|
+
scrollToTop: () => void;
|
|
15
|
+
setContentHeight: (height: number) => void;
|
|
16
|
+
setViewportHeight: (height: number) => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Manages scroll state for a virtual viewport.
|
|
21
|
+
* Auto-scrolls to bottom when new content arrives while already at bottom.
|
|
22
|
+
*/
|
|
23
|
+
export function useScroll(autoScrollOnContent: boolean): ScrollState {
|
|
24
|
+
const [scrollTop, setScrollTop] = useState(0);
|
|
25
|
+
const contentHeightRef = useRef(0);
|
|
26
|
+
const viewportHeightRef = useRef(0);
|
|
27
|
+
const isAtBottomRef = useRef(true);
|
|
28
|
+
|
|
29
|
+
const getMaxScroll = useCallback(
|
|
30
|
+
() => Math.max(0, contentHeightRef.current - viewportHeightRef.current),
|
|
31
|
+
[],
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const clamp = useCallback(
|
|
35
|
+
(value: number) => Math.max(0, Math.min(value, getMaxScroll())),
|
|
36
|
+
[getMaxScroll],
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const scrollToBottom = useCallback(() => {
|
|
40
|
+
const max = getMaxScroll();
|
|
41
|
+
setScrollTop(max);
|
|
42
|
+
isAtBottomRef.current = true;
|
|
43
|
+
}, [getMaxScroll]);
|
|
44
|
+
|
|
45
|
+
const scrollToTop = useCallback(() => {
|
|
46
|
+
setScrollTop(0);
|
|
47
|
+
isAtBottomRef.current = contentHeightRef.current <= viewportHeightRef.current;
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
const scrollBy = useCallback(
|
|
51
|
+
(delta: number) => {
|
|
52
|
+
setScrollTop((prev) => {
|
|
53
|
+
const next = clamp(prev + delta);
|
|
54
|
+
isAtBottomRef.current = next >= getMaxScroll();
|
|
55
|
+
return next;
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
[clamp, getMaxScroll],
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const setContentHeight = useCallback(
|
|
62
|
+
(height: number) => {
|
|
63
|
+
contentHeightRef.current = height;
|
|
64
|
+
// Auto-scroll if we were at bottom
|
|
65
|
+
if (autoScrollOnContent && isAtBottomRef.current) {
|
|
66
|
+
const max = Math.max(0, height - viewportHeightRef.current);
|
|
67
|
+
setScrollTop(max);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
[autoScrollOnContent],
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const setViewportHeight = useCallback((height: number) => {
|
|
74
|
+
viewportHeightRef.current = height;
|
|
75
|
+
}, []);
|
|
76
|
+
|
|
77
|
+
// Keep isAtBottom in sync
|
|
78
|
+
const isAtBottom = scrollTop >= getMaxScroll() || contentHeightRef.current <= viewportHeightRef.current;
|
|
79
|
+
isAtBottomRef.current = isAtBottom;
|
|
80
|
+
|
|
81
|
+
// Auto-scroll to bottom on initial render
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (autoScrollOnContent && isAtBottomRef.current) {
|
|
84
|
+
scrollToBottom();
|
|
85
|
+
}
|
|
86
|
+
}, [autoScrollOnContent, scrollToBottom]);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
scrollTop,
|
|
90
|
+
isAtBottom,
|
|
91
|
+
scrollToBottom,
|
|
92
|
+
scrollBy,
|
|
93
|
+
scrollToTop,
|
|
94
|
+
setContentHeight,
|
|
95
|
+
setViewportHeight,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
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 {convertSessionMessages} from './useSessionResume.js';
|
|
9
|
+
import type {SessionMessage} from './types.js';
|
|
10
|
+
|
|
11
|
+
describe('convertSessionMessages', () => {
|
|
12
|
+
it('converts user messages', () => {
|
|
13
|
+
const input: SessionMessage[] = [
|
|
14
|
+
{role: 'user', text: 'hello'},
|
|
15
|
+
];
|
|
16
|
+
const result = convertSessionMessages(input);
|
|
17
|
+
expect(result).toHaveLength(1);
|
|
18
|
+
expect(result[0]?.role).toBe('user');
|
|
19
|
+
expect(result[0]?.text).toBe('hello');
|
|
20
|
+
expect(result[0]?.id).toMatch(/^resume-/);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('converts assistant messages with tool calls', () => {
|
|
24
|
+
const input: SessionMessage[] = [
|
|
25
|
+
{
|
|
26
|
+
role: 'assistant',
|
|
27
|
+
text: 'Found the data',
|
|
28
|
+
tool_calls: [
|
|
29
|
+
{
|
|
30
|
+
tool_name: 'request',
|
|
31
|
+
tool_id: 't1',
|
|
32
|
+
args: {url: '/api/data'},
|
|
33
|
+
status: 'success',
|
|
34
|
+
result: '{"ok": true}',
|
|
35
|
+
duration_ms: 120,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
skills: ['triage'],
|
|
39
|
+
thinking: 'Analyzing the query',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
const result = convertSessionMessages(input);
|
|
43
|
+
expect(result).toHaveLength(1);
|
|
44
|
+
expect(result[0]?.toolCalls).toHaveLength(1);
|
|
45
|
+
expect(result[0]?.toolCalls?.[0]?.toolName).toBe('request');
|
|
46
|
+
expect(result[0]?.toolCalls?.[0]?.durationMs).toBe(120);
|
|
47
|
+
expect(result[0]?.skills).toContain('triage');
|
|
48
|
+
expect(result[0]?.thinking).toBe('Analyzing the query');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('handles messages without optional fields', () => {
|
|
52
|
+
const input: SessionMessage[] = [
|
|
53
|
+
{role: 'assistant', text: 'Simple response'},
|
|
54
|
+
];
|
|
55
|
+
const result = convertSessionMessages(input);
|
|
56
|
+
expect(result[0]?.toolCalls).toBeUndefined();
|
|
57
|
+
expect(result[0]?.skills).toBeUndefined();
|
|
58
|
+
expect(result[0]?.thinking).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('converts a full conversation', () => {
|
|
62
|
+
const input: SessionMessage[] = [
|
|
63
|
+
{role: 'user', text: 'What is the error rate?'},
|
|
64
|
+
{role: 'assistant', text: 'The error rate is 2.3%'},
|
|
65
|
+
{role: 'user', text: 'Why?'},
|
|
66
|
+
{role: 'assistant', text: 'Due to timeout issues'},
|
|
67
|
+
];
|
|
68
|
+
const result = convertSessionMessages(input);
|
|
69
|
+
expect(result).toHaveLength(4);
|
|
70
|
+
expect(result[0]?.role).toBe('user');
|
|
71
|
+
expect(result[1]?.role).toBe('assistant');
|
|
72
|
+
expect(result[2]?.role).toBe('user');
|
|
73
|
+
expect(result[3]?.role).toBe('assistant');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('handles empty array', () => {
|
|
77
|
+
const result = convertSessionMessages([]);
|
|
78
|
+
expect(result).toHaveLength(0);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {useState, useEffect} from 'react';
|
|
8
|
+
import http from 'node:http';
|
|
9
|
+
import https from 'node:https';
|
|
10
|
+
import type {ChatMessage, SessionMessage} from './types.js';
|
|
11
|
+
|
|
12
|
+
let nextResumeId = 0;
|
|
13
|
+
function genResumeId(): string {
|
|
14
|
+
return `resume-${++nextResumeId}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Convert server SessionMessage[] to ChatMessage[].
|
|
19
|
+
*/
|
|
20
|
+
export function convertSessionMessages(
|
|
21
|
+
sessionMessages: SessionMessage[],
|
|
22
|
+
): ChatMessage[] {
|
|
23
|
+
return sessionMessages.map((msg) => ({
|
|
24
|
+
id: genResumeId(),
|
|
25
|
+
role: msg.role,
|
|
26
|
+
text: msg.text,
|
|
27
|
+
toolCalls: msg.tool_calls?.map((tc) => ({
|
|
28
|
+
toolId: tc.tool_id,
|
|
29
|
+
toolName: tc.tool_name,
|
|
30
|
+
args: tc.args,
|
|
31
|
+
status: tc.status,
|
|
32
|
+
result: tc.result,
|
|
33
|
+
error: tc.error,
|
|
34
|
+
durationMs: tc.duration_ms,
|
|
35
|
+
})),
|
|
36
|
+
skills: msg.skills,
|
|
37
|
+
thinking: msg.thinking,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface UseSessionResumeResult {
|
|
42
|
+
messages: ChatMessage[] | null;
|
|
43
|
+
loading: boolean;
|
|
44
|
+
error: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Fetches a session from the runtime server and converts messages.
|
|
49
|
+
*/
|
|
50
|
+
export function useSessionResume(
|
|
51
|
+
sessionId: string | null,
|
|
52
|
+
baseUrl: string,
|
|
53
|
+
): UseSessionResumeResult {
|
|
54
|
+
const [messages, setMessages] = useState<ChatMessage[] | null>(null);
|
|
55
|
+
const [loading, setLoading] = useState(false);
|
|
56
|
+
const [error, setError] = useState<string | null>(null);
|
|
57
|
+
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!sessionId) return;
|
|
60
|
+
|
|
61
|
+
setLoading(true);
|
|
62
|
+
setError(null);
|
|
63
|
+
|
|
64
|
+
const url = new URL(`/session/${encodeURIComponent(sessionId)}`, baseUrl);
|
|
65
|
+
const mod = url.protocol === 'https:' ? https : http;
|
|
66
|
+
const req = mod.request(
|
|
67
|
+
url,
|
|
68
|
+
{ method: 'GET' },
|
|
69
|
+
(res) => {
|
|
70
|
+
let data = '';
|
|
71
|
+
res.setEncoding('utf8');
|
|
72
|
+
res.on('data', (chunk: string) => {
|
|
73
|
+
data += chunk;
|
|
74
|
+
});
|
|
75
|
+
res.on('end', () => {
|
|
76
|
+
try {
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
78
|
+
const parsed = JSON.parse(data) as {
|
|
79
|
+
session_id: string;
|
|
80
|
+
messages: SessionMessage[];
|
|
81
|
+
};
|
|
82
|
+
const converted = convertSessionMessages(parsed.messages);
|
|
83
|
+
setMessages(converted);
|
|
84
|
+
} catch {
|
|
85
|
+
setError('Failed to parse session data');
|
|
86
|
+
} finally {
|
|
87
|
+
setLoading(false);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
req.on('error', (err) => {
|
|
94
|
+
setError(err.message);
|
|
95
|
+
setLoading(false);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
req.end();
|
|
99
|
+
}, [sessionId, baseUrl]);
|
|
100
|
+
|
|
101
|
+
return {messages, loading, error};
|
|
102
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "dist",
|
|
5
|
+
"rootDir": ".",
|
|
6
|
+
"composite": true,
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"declarationMap": true,
|
|
9
|
+
"sourceMap": true
|
|
10
|
+
},
|
|
11
|
+
"include": ["src/**/*.ts", "src/**/*.tsx"],
|
|
12
|
+
"exclude": ["src/**/*.test.ts", "dist"],
|
|
13
|
+
"references": [
|
|
14
|
+
{ "path": "../core" },
|
|
15
|
+
{ "path": "../runtime" }
|
|
16
|
+
]
|
|
17
|
+
}
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/// <reference types="vitest" />
|
|
8
|
+
import {defineConfig} from 'vitest/config';
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
test: {
|
|
12
|
+
include: ['src/**/*.test.ts'],
|
|
13
|
+
exclude: ['**/node_modules/**', '**/dist/**'],
|
|
14
|
+
environment: 'node',
|
|
15
|
+
globals: true,
|
|
16
|
+
testTimeout: 60000,
|
|
17
|
+
hookTimeout: 60000,
|
|
18
|
+
pool: 'forks',
|
|
19
|
+
},
|
|
20
|
+
});
|