@ebowwa/coder 0.7.63 → 0.7.65
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/core/__tests__/permissions.test.d.ts +12 -0
- package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/core/__tests__/permissions.test.js +851 -0
- package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
- package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
- package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/index.test.js +121 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
- package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
- package/dist/core/agent-loop/compaction.d.ts +39 -0
- package/dist/core/agent-loop/compaction.d.ts.map +1 -0
- package/dist/core/agent-loop/compaction.js +51 -0
- package/dist/core/agent-loop/formatters.d.ts +21 -0
- package/dist/core/agent-loop/formatters.d.ts.map +1 -0
- package/dist/core/agent-loop/formatters.js +42 -0
- package/dist/core/agent-loop/index.d.ts +25 -0
- package/dist/core/agent-loop/index.d.ts.map +1 -0
- package/dist/core/agent-loop/index.js +83 -0
- package/dist/core/agent-loop/loop-state.d.ts +74 -0
- package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
- package/dist/core/agent-loop/loop-state.js +147 -0
- package/dist/core/agent-loop/message-builder.d.ts +13 -0
- package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
- package/dist/core/agent-loop/message-builder.js +49 -0
- package/dist/core/agent-loop/tool-executor.d.ts +23 -0
- package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
- package/dist/core/agent-loop/tool-executor.js +152 -0
- package/dist/core/agent-loop/turn-executor.d.ts +57 -0
- package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
- package/dist/core/agent-loop/turn-executor.js +124 -0
- package/dist/core/agent-loop/types.d.ts +141 -0
- package/dist/core/agent-loop/types.d.ts.map +1 -0
- package/dist/core/agent-loop/types.js +4 -0
- package/dist/core/agent-loop.d.ts +17 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +16 -0
- package/dist/core/api-client-impl.d.ts +62 -0
- package/dist/core/api-client-impl.d.ts.map +1 -0
- package/dist/core/api-client-impl.js +479 -0
- package/dist/core/api-client.d.ts +6 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +5 -0
- package/dist/core/checkpoints.d.ts +128 -0
- package/dist/core/checkpoints.d.ts.map +1 -0
- package/dist/core/checkpoints.js +438 -0
- package/dist/core/claude-md.d.ts +71 -0
- package/dist/core/claude-md.d.ts.map +1 -0
- package/dist/core/claude-md.js +198 -0
- package/dist/core/cognitive-security/hooks.d.ts +138 -0
- package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
- package/dist/core/cognitive-security/hooks.js +389 -0
- package/dist/core/cognitive-security/index.d.ts +751 -0
- package/dist/core/cognitive-security/index.d.ts.map +1 -0
- package/dist/core/cognitive-security/index.js +1123 -0
- package/dist/core/cognitive-security/middleware.d.ts +136 -0
- package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
- package/dist/core/cognitive-security/middleware.js +376 -0
- package/dist/core/config-loader.d.ts +127 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +219 -0
- package/dist/core/context-compaction.d.ts +87 -0
- package/dist/core/context-compaction.d.ts.map +1 -0
- package/dist/core/context-compaction.js +428 -0
- package/dist/core/git-status.d.ts +25 -0
- package/dist/core/git-status.d.ts.map +1 -0
- package/dist/core/git-status.js +204 -0
- package/dist/core/image.d.ts +69 -0
- package/dist/core/image.d.ts.map +1 -0
- package/dist/core/image.js +290 -0
- package/dist/core/image.test.d.ts +2 -0
- package/dist/core/image.test.d.ts.map +1 -0
- package/dist/core/image.test.js +149 -0
- package/dist/core/models.d.ts +123 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +325 -0
- package/dist/core/permissions.d.ts +81 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +327 -0
- package/dist/core/retry.d.ts +25 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +121 -0
- package/dist/core/session-store.d.ts +9 -0
- package/dist/core/session-store.d.ts.map +1 -0
- package/dist/core/session-store.js +10 -0
- package/dist/core/sessions/export.d.ts +47 -0
- package/dist/core/sessions/export.d.ts.map +1 -0
- package/dist/core/sessions/export.js +256 -0
- package/dist/core/sessions/index.d.ts +132 -0
- package/dist/core/sessions/index.d.ts.map +1 -0
- package/dist/core/sessions/index.js +442 -0
- package/dist/core/sessions/metadata.d.ts +77 -0
- package/dist/core/sessions/metadata.d.ts.map +1 -0
- package/dist/core/sessions/metadata.js +233 -0
- package/dist/core/sessions/persistence.d.ts +72 -0
- package/dist/core/sessions/persistence.d.ts.map +1 -0
- package/dist/core/sessions/persistence.js +201 -0
- package/dist/core/sessions/types.d.ts +110 -0
- package/dist/core/sessions/types.d.ts.map +1 -0
- package/dist/core/sessions/types.js +4 -0
- package/dist/core/stream-highlighter.d.ts +18 -0
- package/dist/core/stream-highlighter.d.ts.map +1 -0
- package/dist/core/stream-highlighter.js +916 -0
- package/dist/core/system-reminders.d.ts +89 -0
- package/dist/core/system-reminders.d.ts.map +1 -0
- package/dist/core/system-reminders.js +285 -0
- package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
- package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
- package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
- package/dist/ecosystem/hooks/index.d.ts +59 -0
- package/dist/ecosystem/hooks/index.d.ts.map +1 -0
- package/dist/ecosystem/hooks/index.js +294 -0
- package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
- package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
- package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
- package/dist/ecosystem/skills/index.d.ts +55 -0
- package/dist/ecosystem/skills/index.d.ts.map +1 -0
- package/dist/ecosystem/skills/index.js +258 -0
- package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
- package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
- package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
- package/dist/ecosystem/tools/index.d.ts +24 -0
- package/dist/ecosystem/tools/index.d.ts.map +1 -0
- package/dist/ecosystem/tools/index.js +1709 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33688 -49712
- package/dist/interfaces/mcp/client.d.ts +40 -0
- package/dist/interfaces/mcp/client.d.ts.map +1 -0
- package/dist/interfaces/mcp/client.js +309 -0
- package/dist/interfaces/ui/index.d.ts +36 -0
- package/dist/interfaces/ui/index.d.ts.map +1 -0
- package/dist/interfaces/ui/index.js +61 -0
- package/dist/interfaces/ui/spinner.d.ts +140 -0
- package/dist/interfaces/ui/spinner.d.ts.map +1 -0
- package/dist/interfaces/ui/spinner.js +342 -0
- package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
- package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/cli/index.js +32012 -50526
- package/dist/interfaces/ui/terminal/native/README.md +53 -0
- package/dist/interfaces/ui/terminal/native/claude_code_native.darwin-x64.node +0 -0
- package/dist/interfaces/ui/terminal/native/claude_code_native.dylib +0 -0
- package/dist/interfaces/ui/terminal/native/index.d.ts +0 -0
- package/dist/interfaces/ui/terminal/native/index.darwin-arm64.node +0 -0
- package/dist/interfaces/ui/terminal/native/index.js +43 -0
- package/dist/interfaces/ui/terminal/native/index.node +0 -0
- package/dist/interfaces/ui/terminal/native/package.json +34 -0
- package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
- package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/args.js +176 -0
- package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
- package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/index.js +16 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
- package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
- package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/query.js +100 -0
- package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
- package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
- package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
- package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
- package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
- package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
- package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
- package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
- package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
- package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
- package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
- package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/console.js +46 -0
- package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
- package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/index.js +28 -0
- package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
- package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/run.js +31 -0
- package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
- package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
- package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
- package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/types.js +5 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
- package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
- package/dist/native/README.md +53 -0
- package/dist/native/claude_code_native.darwin-x64.node +0 -0
- package/dist/native/claude_code_native.dylib +0 -0
- package/dist/native/index.d.ts +0 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.darwin-arm64.node +0 -0
- package/dist/native/index.js +43 -0
- package/dist/native/index.node +0 -0
- package/dist/native/package.json +34 -0
- package/dist/teammates/index.d.ts +161 -0
- package/dist/teammates/index.d.ts.map +1 -0
- package/dist/teammates/index.js +827 -0
- package/dist/types/index.d.ts +482 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +52 -0
- package/native/index.darwin-arm64.node +0 -0
- package/native/index.js +33 -19
- package/package.json +6 -3
- package/packages/src/core/__tests__/permissions.test.ts +1091 -0
- package/packages/src/core/agent-loop/__tests__/compaction.test.ts +283 -0
- package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
- package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
- package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
- package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
- package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
- package/packages/src/core/agent-loop/compaction.ts +92 -0
- package/packages/src/core/agent-loop/formatters.ts +50 -0
- package/packages/src/core/agent-loop/index.ts +137 -0
- package/packages/src/core/agent-loop/loop-state.ts +187 -0
- package/packages/src/core/agent-loop/message-builder.ts +62 -0
- package/packages/src/core/agent-loop/tool-executor.ts +211 -0
- package/packages/src/core/agent-loop/turn-executor.ts +226 -0
- package/packages/src/core/agent-loop/types.ts +152 -0
- package/packages/src/core/agent-loop.ts +18 -0
- package/packages/src/core/api-client-impl.ts +729 -0
- package/packages/src/core/api-client.ts +6 -0
- package/packages/src/core/checkpoints.ts +606 -0
- package/packages/src/core/claude-md.ts +272 -0
- package/packages/src/core/cognitive-security/hooks.ts +591 -0
- package/packages/src/core/cognitive-security/index.ts +2041 -0
- package/packages/src/core/cognitive-security/middleware.ts +536 -0
- package/packages/src/core/config/todo +7 -0
- package/packages/src/core/config-loader.ts +324 -0
- package/packages/src/core/context/__tests__/integration.test.ts +334 -0
- package/packages/src/core/context/compaction.ts +170 -0
- package/packages/src/core/context/constants.ts +58 -0
- package/packages/src/core/context/extraction.ts +85 -0
- package/packages/src/core/context/index.ts +66 -0
- package/packages/src/core/context/summarization.ts +251 -0
- package/packages/src/core/context/token-estimation.ts +98 -0
- package/packages/src/core/context/types.ts +59 -0
- package/packages/src/core/git-status.ts +262 -0
- package/packages/src/core/image.test.ts +180 -0
- package/packages/src/core/image.ts +350 -0
- package/packages/src/core/lmdb.db +0 -0
- package/packages/src/core/lmdb.db-lock +0 -0
- package/packages/src/core/models.ts +507 -0
- package/packages/src/core/normalizers/todo +8 -0
- package/packages/src/core/permissions.ts +431 -0
- package/packages/src/core/providers/README.md +230 -0
- package/packages/src/core/providers/__tests__/providers.test.ts +135 -0
- package/packages/src/core/providers/index.ts +419 -0
- package/packages/src/core/providers/types.ts +132 -0
- package/packages/src/core/retry.ts +180 -0
- package/packages/src/core/session-store.ts +36 -0
- package/packages/src/core/sessions/export.ts +329 -0
- package/packages/src/core/sessions/index.ts +587 -0
- package/packages/src/core/sessions/metadata.ts +309 -0
- package/packages/src/core/sessions/persistence.ts +244 -0
- package/packages/src/core/sessions/types.ts +169 -0
- package/packages/src/core/stream-highlighter.ts +1123 -0
- package/packages/src/core/system-reminders.ts +402 -0
- package/packages/src/core/todo +8 -0
- package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
- package/packages/src/ecosystem/hooks/index.ts +341 -0
- package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
- package/packages/src/ecosystem/skills/index.ts +295 -0
- package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
- package/packages/src/ecosystem/tools/index.ts +2051 -0
- package/packages/src/index.ts +141 -0
- package/packages/src/interfaces/mcp/client.ts +389 -0
- package/packages/src/interfaces/ui/index.ts +158 -0
- package/packages/src/interfaces/ui/lmdb.db +0 -0
- package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
- package/packages/src/interfaces/ui/spinner.ts +451 -0
- package/packages/src/interfaces/ui/terminal/bridge/index.ts +370 -0
- package/packages/src/interfaces/ui/terminal/bridge/ipc.ts +829 -0
- package/packages/src/interfaces/ui/terminal/bridge/screen-export.ts +968 -0
- package/packages/src/interfaces/ui/terminal/bridge/types.ts +226 -0
- package/packages/src/interfaces/ui/terminal/bridge/useBridge.ts +210 -0
- package/packages/src/interfaces/ui/terminal/cli/bootstrap.ts +132 -0
- package/packages/src/interfaces/ui/terminal/cli/index.ts +415 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/index.ts +110 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/input-handler.ts +393 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/interactive-runner.ts +820 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/message-store.ts +299 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/types.ts +274 -0
- package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
- package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
- package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
- package/packages/src/interfaces/ui/terminal/shared/index.ts +84 -0
- package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
- package/packages/src/interfaces/ui/terminal/shared/query.ts +152 -0
- package/packages/src/interfaces/ui/terminal/shared/setup.ts +299 -0
- package/packages/src/interfaces/ui/terminal/shared/spinner-frames.ts +73 -0
- package/packages/src/interfaces/ui/terminal/shared/status-line.ts +366 -0
- package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
- package/packages/src/lmdb.db +0 -0
- package/packages/src/lmdb.db-lock +0 -0
- package/packages/src/native/index.ts +2722 -0
- package/packages/src/native/tui_v2_types.ts +39 -0
- package/packages/src/teammates/coordination.test.ts +279 -0
- package/packages/src/teammates/coordination.ts +646 -0
- package/packages/src/teammates/index.ts +1052 -0
- package/packages/src/teammates/integration.test.ts +272 -0
- package/packages/src/teammates/runner.test.ts +235 -0
- package/packages/src/teammates/runner.ts +750 -0
- package/packages/src/teammates/schemas.ts +673 -0
- package/packages/src/types/index.ts +723 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for teammate coordination
|
|
3
|
+
* Tests: long horizon, cohesion, assignment completion
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
|
7
|
+
import { TeammateManager } from "./index.js";
|
|
8
|
+
import { TeammateModeRunner, setTeammateRunner } from "./runner.js";
|
|
9
|
+
import * as fs from "fs";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
import * as os from "os";
|
|
12
|
+
|
|
13
|
+
const TEAMS_DIR = path.join(os.homedir(), ".claude", "teams");
|
|
14
|
+
const TEST_TEAM = `integration-test-${Date.now()}`;
|
|
15
|
+
|
|
16
|
+
function cleanupTestTeam() {
|
|
17
|
+
const teamPath = path.join(TEAMS_DIR, TEST_TEAM);
|
|
18
|
+
if (fs.existsSync(teamPath)) {
|
|
19
|
+
fs.rmSync(teamPath, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe("Teammate Integration Tests", () => {
|
|
24
|
+
let manager: TeammateManager;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
cleanupTestTeam();
|
|
28
|
+
manager = new TeammateManager();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
cleanupTestTeam();
|
|
33
|
+
setTeammateRunner(null);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe("Long Horizon - Extended Operation", () => {
|
|
37
|
+
it("should maintain state over multiple operations", async () => {
|
|
38
|
+
// Create team
|
|
39
|
+
const team = manager.createTeam({
|
|
40
|
+
name: TEST_TEAM,
|
|
41
|
+
description: "Long horizon test team",
|
|
42
|
+
teammates: [],
|
|
43
|
+
taskListId: `${TEST_TEAM}-tasks`,
|
|
44
|
+
coordination: {
|
|
45
|
+
dependencyOrder: [],
|
|
46
|
+
communicationProtocol: "broadcast",
|
|
47
|
+
taskAssignmentStrategy: "manual",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Create teammate
|
|
52
|
+
const runner = new TeammateModeRunner({
|
|
53
|
+
teamName: TEST_TEAM,
|
|
54
|
+
agentName: "long-horizon-agent",
|
|
55
|
+
agentColor: "green",
|
|
56
|
+
workingDirectory: process.cwd(),
|
|
57
|
+
pollInterval: 100,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await runner.start();
|
|
61
|
+
setTeammateRunner(runner);
|
|
62
|
+
|
|
63
|
+
// Simulate long horizon: multiple status updates
|
|
64
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
65
|
+
|
|
66
|
+
runner.reportActivity();
|
|
67
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
68
|
+
|
|
69
|
+
// Complete a task
|
|
70
|
+
runner.reportTaskComplete("task-1", "First task");
|
|
71
|
+
expect(runner.getStatus()).toBe("completed");
|
|
72
|
+
|
|
73
|
+
// Request new task (resets to idle)
|
|
74
|
+
runner.requestTask();
|
|
75
|
+
expect(runner.getStatus()).toBe("idle");
|
|
76
|
+
|
|
77
|
+
// Report activity again (should flip to in_progress)
|
|
78
|
+
runner.reportActivity();
|
|
79
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
80
|
+
|
|
81
|
+
// Fail a task
|
|
82
|
+
runner.reportTaskFailed("task-2", "Second task", "Test failure");
|
|
83
|
+
expect(runner.getStatus()).toBe("failed");
|
|
84
|
+
|
|
85
|
+
await runner.stop();
|
|
86
|
+
expect(runner.getStatus()).toBe("idle");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should persist team state across operations", async () => {
|
|
90
|
+
const runner = new TeammateModeRunner({
|
|
91
|
+
teamName: TEST_TEAM,
|
|
92
|
+
agentName: "persist-agent",
|
|
93
|
+
workingDirectory: process.cwd(),
|
|
94
|
+
pollInterval: 100,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
await runner.start();
|
|
98
|
+
|
|
99
|
+
// Verify teammate was added to team
|
|
100
|
+
const teammate = runner.getTeammate();
|
|
101
|
+
expect(teammate).not.toBe(null);
|
|
102
|
+
expect(teammate?.name).toBe("persist-agent");
|
|
103
|
+
|
|
104
|
+
// Stop and restart
|
|
105
|
+
await runner.stop();
|
|
106
|
+
|
|
107
|
+
// Create new runner with same team
|
|
108
|
+
const runner2 = new TeammateModeRunner({
|
|
109
|
+
teamName: TEST_TEAM,
|
|
110
|
+
agentName: "persist-agent-2",
|
|
111
|
+
workingDirectory: process.cwd(),
|
|
112
|
+
pollInterval: 100,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
await runner2.start();
|
|
116
|
+
|
|
117
|
+
// Team should have both teammates now
|
|
118
|
+
const members = runner2.getTeamMembers();
|
|
119
|
+
expect(members.length).toBe(2);
|
|
120
|
+
|
|
121
|
+
await runner2.stop();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe("Cohesion - Multi-Agent Coordination", () => {
|
|
126
|
+
it("should support multiple teammates in same team", async () => {
|
|
127
|
+
// Create first teammate
|
|
128
|
+
const runner1 = new TeammateModeRunner({
|
|
129
|
+
teamName: TEST_TEAM,
|
|
130
|
+
agentName: "coordinator",
|
|
131
|
+
agentColor: "blue",
|
|
132
|
+
workingDirectory: process.cwd(),
|
|
133
|
+
pollInterval: 100,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
await runner1.start();
|
|
137
|
+
|
|
138
|
+
// Wait for persistence to complete
|
|
139
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
140
|
+
|
|
141
|
+
// Create second teammate (will load team from disk)
|
|
142
|
+
const runner2 = new TeammateModeRunner({
|
|
143
|
+
teamName: TEST_TEAM,
|
|
144
|
+
agentName: "worker",
|
|
145
|
+
agentColor: "orange",
|
|
146
|
+
workingDirectory: process.cwd(),
|
|
147
|
+
pollInterval: 100,
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
await runner2.start();
|
|
151
|
+
|
|
152
|
+
// Wait for persistence
|
|
153
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
154
|
+
|
|
155
|
+
// Both should see each other
|
|
156
|
+
const members1 = runner1.getTeamMembers();
|
|
157
|
+
const members2 = runner2.getTeamMembers();
|
|
158
|
+
|
|
159
|
+
// runner1 sees itself (in memory) + runner2 (loaded from disk)
|
|
160
|
+
expect(members1.length).toBeGreaterThanOrEqual(1);
|
|
161
|
+
// runner2 sees itself (in memory) + runner1 (loaded from disk)
|
|
162
|
+
expect(members2.length).toBeGreaterThanOrEqual(1);
|
|
163
|
+
|
|
164
|
+
// Verify coordinator and worker are both in the team
|
|
165
|
+
const allNames = new Set([...members1, ...members2].map(m => m.name));
|
|
166
|
+
expect(allNames.has("coordinator")).toBe(true);
|
|
167
|
+
expect(allNames.has("worker")).toBe(true);
|
|
168
|
+
|
|
169
|
+
await runner1.stop();
|
|
170
|
+
await runner2.stop();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it("should support broadcast messages", async () => {
|
|
174
|
+
const runner1 = new TeammateModeRunner({
|
|
175
|
+
teamName: TEST_TEAM,
|
|
176
|
+
agentName: "broadcaster",
|
|
177
|
+
workingDirectory: process.cwd(),
|
|
178
|
+
pollInterval: 100,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
await runner1.start();
|
|
182
|
+
|
|
183
|
+
// Broadcast should not throw
|
|
184
|
+
runner1.broadcast("Attention all teammates!");
|
|
185
|
+
|
|
186
|
+
await runner1.stop();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe("Assignment Completion", () => {
|
|
191
|
+
it("should track task completion workflow", async () => {
|
|
192
|
+
const runner = new TeammateModeRunner({
|
|
193
|
+
teamName: TEST_TEAM,
|
|
194
|
+
agentName: "task-worker",
|
|
195
|
+
workingDirectory: process.cwd(),
|
|
196
|
+
pollInterval: 100,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
await runner.start();
|
|
200
|
+
|
|
201
|
+
// Initial status
|
|
202
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
203
|
+
|
|
204
|
+
// Complete task
|
|
205
|
+
runner.reportTaskComplete("assignment-1", "Complete integration tests");
|
|
206
|
+
expect(runner.getStatus()).toBe("completed");
|
|
207
|
+
|
|
208
|
+
// Request new assignment
|
|
209
|
+
runner.requestTask();
|
|
210
|
+
expect(runner.getStatus()).toBe("idle");
|
|
211
|
+
|
|
212
|
+
await runner.stop();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("should track task failure and recovery", async () => {
|
|
216
|
+
const runner = new TeammateModeRunner({
|
|
217
|
+
teamName: TEST_TEAM,
|
|
218
|
+
agentName: "failing-worker",
|
|
219
|
+
workingDirectory: process.cwd(),
|
|
220
|
+
pollInterval: 100,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
await runner.start();
|
|
224
|
+
|
|
225
|
+
// Fail task
|
|
226
|
+
runner.reportTaskFailed("assignment-2", "Risky task", "Dependencies not met");
|
|
227
|
+
expect(runner.getStatus()).toBe("failed");
|
|
228
|
+
|
|
229
|
+
// Recover by requesting new task
|
|
230
|
+
runner.requestTask();
|
|
231
|
+
expect(runner.getStatus()).toBe("idle");
|
|
232
|
+
|
|
233
|
+
await runner.stop();
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
describe("Inbox Management", () => {
|
|
238
|
+
it("should track inbox stats", async () => {
|
|
239
|
+
const runner = new TeammateModeRunner({
|
|
240
|
+
teamName: TEST_TEAM,
|
|
241
|
+
agentName: "inbox-worker",
|
|
242
|
+
workingDirectory: process.cwd(),
|
|
243
|
+
pollInterval: 100,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
await runner.start();
|
|
247
|
+
|
|
248
|
+
const stats = runner.getInboxStats();
|
|
249
|
+
expect(stats).toHaveProperty("pending");
|
|
250
|
+
expect(stats).toHaveProperty("processed");
|
|
251
|
+
|
|
252
|
+
await runner.stop();
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it("should check for pending messages", async () => {
|
|
256
|
+
const runner = new TeammateModeRunner({
|
|
257
|
+
teamName: TEST_TEAM,
|
|
258
|
+
agentName: "message-checker",
|
|
259
|
+
workingDirectory: process.cwd(),
|
|
260
|
+
pollInterval: 100,
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
await runner.start();
|
|
264
|
+
|
|
265
|
+
expect(runner.hasPendingMessages()).toBe(false);
|
|
266
|
+
expect(runner.getPendingMessages()).toEqual([]);
|
|
267
|
+
expect(runner.peekPendingMessages()).toEqual([]);
|
|
268
|
+
|
|
269
|
+
await runner.stop();
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
});
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for TeammateModeRunner
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "bun:test";
|
|
6
|
+
import { TeammateModeRunner, getTeammateRunner, setTeammateRunner, isTeammateModeActive } from "./runner.js";
|
|
7
|
+
import type { TeammateModeConfig } from "./runner.js";
|
|
8
|
+
|
|
9
|
+
// Mock TeammateManager
|
|
10
|
+
vi.mock("./index.js", () => ({
|
|
11
|
+
TeammateManager: vi.fn().mockImplementation(() => ({
|
|
12
|
+
getTeam: vi.fn(() => null),
|
|
13
|
+
createTeam: vi.fn((config) => ({ ...config, teammates: [] })),
|
|
14
|
+
getTeammate: vi.fn(() => null),
|
|
15
|
+
addTeammate: vi.fn(),
|
|
16
|
+
updateTeammateStatus: vi.fn(),
|
|
17
|
+
persistAllTeams: vi.fn(),
|
|
18
|
+
getMessages: vi.fn(() => []),
|
|
19
|
+
sendDirect: vi.fn(),
|
|
20
|
+
broadcast: vi.fn(),
|
|
21
|
+
injectUserMessageToTeammate: vi.fn(),
|
|
22
|
+
getInboxStats: vi.fn(() => ({ pending: 0, processed: 0 })),
|
|
23
|
+
waitForTeammatesToBecomeIdle: vi.fn(() => ({ success: true, timedOut: false, statuses: {} })),
|
|
24
|
+
})),
|
|
25
|
+
generateTeammateId: vi.fn(() => "test-teammate-id"),
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
describe("TeammateModeRunner", () => {
|
|
29
|
+
let runner: TeammateModeRunner;
|
|
30
|
+
let config: TeammateModeConfig;
|
|
31
|
+
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
config = {
|
|
34
|
+
teamName: "test-team",
|
|
35
|
+
workingDirectory: "/tmp/test",
|
|
36
|
+
pollInterval: 100, // Fast polling for tests
|
|
37
|
+
};
|
|
38
|
+
runner = new TeammateModeRunner(config);
|
|
39
|
+
vi.useFakeTimers();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(async () => {
|
|
43
|
+
if (runner.isActive()) {
|
|
44
|
+
await runner.stop();
|
|
45
|
+
}
|
|
46
|
+
vi.useRealTimers();
|
|
47
|
+
vi.clearAllMocks();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("constructor", () => {
|
|
51
|
+
it("should initialize with correct default state", () => {
|
|
52
|
+
expect(runner.isActive()).toBe(false);
|
|
53
|
+
expect(runner.getStatus()).toBe("pending");
|
|
54
|
+
expect(runner.getTeammate()).toBe(null);
|
|
55
|
+
expect(runner.getTeam()).toBe(null);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe("start", () => {
|
|
60
|
+
it("should start teammate mode successfully", async () => {
|
|
61
|
+
const teammate = await runner.start();
|
|
62
|
+
|
|
63
|
+
expect(runner.isActive()).toBe(true);
|
|
64
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
65
|
+
expect(teammate.teamName).toBe("test-team");
|
|
66
|
+
// Status comes from local state, not the returned teammate object
|
|
67
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should throw if already active", async () => {
|
|
71
|
+
await runner.start();
|
|
72
|
+
|
|
73
|
+
await expect(runner.start()).rejects.toThrow("Teammate mode already active");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should use provided agent config", async () => {
|
|
77
|
+
const customConfig: TeammateModeConfig = {
|
|
78
|
+
...config,
|
|
79
|
+
// Don't provide agentId - that requires an existing teammate
|
|
80
|
+
agentName: "Custom Agent",
|
|
81
|
+
agentColor: "red",
|
|
82
|
+
prompt: "Test prompt",
|
|
83
|
+
};
|
|
84
|
+
const customRunner = new TeammateModeRunner(customConfig);
|
|
85
|
+
|
|
86
|
+
const teammate = await customRunner.start();
|
|
87
|
+
|
|
88
|
+
expect(teammate.name).toBe("Custom Agent");
|
|
89
|
+
expect(teammate.color).toBe("red");
|
|
90
|
+
expect(teammate.prompt).toBe("Test prompt");
|
|
91
|
+
|
|
92
|
+
await customRunner.stop();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe("stop", () => {
|
|
97
|
+
it("should stop teammate mode", async () => {
|
|
98
|
+
await runner.start();
|
|
99
|
+
await runner.stop();
|
|
100
|
+
|
|
101
|
+
expect(runner.isActive()).toBe(false);
|
|
102
|
+
expect(runner.getStatus()).toBe("idle");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should be idempotent", async () => {
|
|
106
|
+
await runner.start();
|
|
107
|
+
await runner.stop();
|
|
108
|
+
await runner.stop(); // Should not throw
|
|
109
|
+
|
|
110
|
+
expect(runner.isActive()).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe("message polling", () => {
|
|
115
|
+
it("should have pending messages methods", async () => {
|
|
116
|
+
await runner.start();
|
|
117
|
+
|
|
118
|
+
expect(runner.hasPendingMessages()).toBe(false);
|
|
119
|
+
expect(runner.getPendingMessages()).toEqual([]);
|
|
120
|
+
expect(runner.peekPendingMessages()).toEqual([]);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("idle detection", () => {
|
|
125
|
+
it("should start with non-idle status", async () => {
|
|
126
|
+
await runner.start();
|
|
127
|
+
|
|
128
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("should report activity", async () => {
|
|
132
|
+
await runner.start();
|
|
133
|
+
|
|
134
|
+
runner.reportActivity();
|
|
135
|
+
|
|
136
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe("messaging", () => {
|
|
141
|
+
it("should throw when sending without active teammate", async () => {
|
|
142
|
+
expect(() => runner.sendDirectMessage("target", "hello")).toThrow("Teammate mode not active");
|
|
143
|
+
expect(() => runner.broadcast("hello")).toThrow("Teammate mode not active");
|
|
144
|
+
expect(() => runner.injectUserMessage("hello")).toThrow("Teammate mode not active");
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe("status & info", () => {
|
|
149
|
+
it("should return teammate after start", async () => {
|
|
150
|
+
await runner.start();
|
|
151
|
+
|
|
152
|
+
const teammate = runner.getTeammate();
|
|
153
|
+
expect(teammate).not.toBe(null);
|
|
154
|
+
expect(teammate?.teamName).toBe("test-team");
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("should return team after start", async () => {
|
|
158
|
+
await runner.start();
|
|
159
|
+
|
|
160
|
+
const team = runner.getTeam();
|
|
161
|
+
expect(team).not.toBe(null);
|
|
162
|
+
expect(team?.name).toBe("test-team");
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("should return inbox stats", async () => {
|
|
166
|
+
await runner.start();
|
|
167
|
+
|
|
168
|
+
const stats = runner.getInboxStats();
|
|
169
|
+
expect(stats).toEqual({ pending: 0, processed: 0 });
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("should return team members", async () => {
|
|
173
|
+
await runner.start();
|
|
174
|
+
|
|
175
|
+
const members = runner.getTeamMembers();
|
|
176
|
+
expect(Array.isArray(members)).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
describe("task integration", () => {
|
|
181
|
+
it("should report task complete", async () => {
|
|
182
|
+
await runner.start();
|
|
183
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
184
|
+
|
|
185
|
+
// reportTaskComplete calls updateStatus("completed")
|
|
186
|
+
runner.reportTaskComplete("task-123", "Test Task");
|
|
187
|
+
|
|
188
|
+
// Verify status changed to completed
|
|
189
|
+
const status = runner.getStatus();
|
|
190
|
+
expect(status).toBe("completed");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("should report task failed", async () => {
|
|
194
|
+
await runner.start();
|
|
195
|
+
expect(runner.getStatus()).toBe("in_progress");
|
|
196
|
+
|
|
197
|
+
runner.reportTaskFailed("task-123", "Test Task", "Something went wrong");
|
|
198
|
+
|
|
199
|
+
const status = runner.getStatus();
|
|
200
|
+
expect(status).toBe("failed");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("should request task", async () => {
|
|
204
|
+
await runner.start();
|
|
205
|
+
|
|
206
|
+
runner.requestTask();
|
|
207
|
+
|
|
208
|
+
expect(runner.getStatus()).toBe("idle");
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe("Global runner functions", () => {
|
|
214
|
+
afterEach(() => {
|
|
215
|
+
setTeammateRunner(null);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it("should return null when no global runner set", () => {
|
|
219
|
+
expect(getTeammateRunner()).toBe(null);
|
|
220
|
+
expect(isTeammateModeActive()).toBe(false);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("should set and get global runner", () => {
|
|
224
|
+
const config: TeammateModeConfig = {
|
|
225
|
+
teamName: "global-test",
|
|
226
|
+
workingDirectory: "/tmp/test",
|
|
227
|
+
};
|
|
228
|
+
const runner = new TeammateModeRunner(config);
|
|
229
|
+
|
|
230
|
+
setTeammateRunner(runner);
|
|
231
|
+
|
|
232
|
+
expect(getTeammateRunner()).toBe(runner);
|
|
233
|
+
expect(isTeammateModeActive()).toBe(false); // Not started yet
|
|
234
|
+
});
|
|
235
|
+
});
|