@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,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loading State Manager for Coder CLI
|
|
3
|
+
* Tracks global loading state across the application
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
// ============================================
|
|
7
|
+
// LOADING STATE CLASS
|
|
8
|
+
// ============================================
|
|
9
|
+
export class LoadingState extends EventEmitter {
|
|
10
|
+
state;
|
|
11
|
+
static instance = null;
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
this.state = {
|
|
15
|
+
isLoading: false,
|
|
16
|
+
phase: "idle",
|
|
17
|
+
message: "",
|
|
18
|
+
startTime: 0,
|
|
19
|
+
activeTools: new Set(),
|
|
20
|
+
activeToolCount: 0,
|
|
21
|
+
hasActiveTools: false,
|
|
22
|
+
responseLength: 0,
|
|
23
|
+
paused: false,
|
|
24
|
+
pausedTime: 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get singleton instance
|
|
29
|
+
*/
|
|
30
|
+
static getInstance() {
|
|
31
|
+
if (!LoadingState.instance) {
|
|
32
|
+
LoadingState.instance = new LoadingState();
|
|
33
|
+
}
|
|
34
|
+
return LoadingState.instance;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reset singleton (for testing)
|
|
38
|
+
*/
|
|
39
|
+
static reset() {
|
|
40
|
+
if (LoadingState.instance) {
|
|
41
|
+
LoadingState.instance.removeAllListeners();
|
|
42
|
+
LoadingState.instance = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Start loading
|
|
47
|
+
*/
|
|
48
|
+
start(phase = "processing", message = "") {
|
|
49
|
+
const previousPhase = this.state.phase;
|
|
50
|
+
this.state.isLoading = true;
|
|
51
|
+
this.state.phase = phase;
|
|
52
|
+
this.state.message = message;
|
|
53
|
+
this.state.startTime = Date.now();
|
|
54
|
+
this.emit("state-change", this.getState());
|
|
55
|
+
if (previousPhase !== phase) {
|
|
56
|
+
this.emit("phase-change", phase, previousPhase);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stop loading
|
|
61
|
+
*/
|
|
62
|
+
stop() {
|
|
63
|
+
const previousPhase = this.state.phase;
|
|
64
|
+
this.state.isLoading = false;
|
|
65
|
+
this.state.phase = "idle";
|
|
66
|
+
this.state.message = "";
|
|
67
|
+
this.state.activeTools.clear();
|
|
68
|
+
this.state.activeToolCount = 0;
|
|
69
|
+
this.state.responseLength = 0;
|
|
70
|
+
this.emit("state-change", this.getState());
|
|
71
|
+
this.emit("phase-change", "idle", previousPhase);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update phase
|
|
75
|
+
*/
|
|
76
|
+
setPhase(phase) {
|
|
77
|
+
const previousPhase = this.state.phase;
|
|
78
|
+
this.state.phase = phase;
|
|
79
|
+
this.emit("phase-change", phase, previousPhase);
|
|
80
|
+
this.emit("state-change", this.getState());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Update message
|
|
84
|
+
*/
|
|
85
|
+
setMessage(message) {
|
|
86
|
+
this.state.message = message;
|
|
87
|
+
this.emit("state-change", this.getState());
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Update both phase and message
|
|
91
|
+
*/
|
|
92
|
+
update(phase, message) {
|
|
93
|
+
const previousPhase = this.state.phase;
|
|
94
|
+
this.state.phase = phase;
|
|
95
|
+
this.state.message = message;
|
|
96
|
+
this.emit("phase-change", phase, previousPhase);
|
|
97
|
+
this.emit("state-change", this.getState());
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Report progress
|
|
101
|
+
*/
|
|
102
|
+
progress(message) {
|
|
103
|
+
this.state.message = message;
|
|
104
|
+
this.emit("progress", message);
|
|
105
|
+
this.emit("state-change", this.getState());
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Mark tool as started
|
|
109
|
+
*/
|
|
110
|
+
toolStart(toolName) {
|
|
111
|
+
this.state.activeTools.add(toolName);
|
|
112
|
+
this.state.activeToolCount = this.state.activeTools.size;
|
|
113
|
+
this.state.hasActiveTools = true;
|
|
114
|
+
this.emit("tool-start", toolName);
|
|
115
|
+
this.emit("state-change", this.getState());
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Mark tool as completed
|
|
119
|
+
*/
|
|
120
|
+
toolEnd(toolName) {
|
|
121
|
+
this.state.activeTools.delete(toolName);
|
|
122
|
+
this.state.activeToolCount = this.state.activeTools.size;
|
|
123
|
+
if (this.state.activeTools.size === 0) {
|
|
124
|
+
this.state.hasActiveTools = false;
|
|
125
|
+
}
|
|
126
|
+
this.emit("tool-end", toolName);
|
|
127
|
+
this.emit("state-change", this.getState());
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Update response length (for streaming)
|
|
131
|
+
*/
|
|
132
|
+
setResponseLength(length) {
|
|
133
|
+
this.state.responseLength = length;
|
|
134
|
+
this.emit("state-change", this.getState());
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Pause loading state
|
|
138
|
+
*/
|
|
139
|
+
pause() {
|
|
140
|
+
if (!this.state.paused) {
|
|
141
|
+
this.state.paused = true;
|
|
142
|
+
this.state.pausedTime = Date.now();
|
|
143
|
+
this.emit("state-change", this.getState());
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Resume loading state
|
|
148
|
+
*/
|
|
149
|
+
resume() {
|
|
150
|
+
if (this.state.paused) {
|
|
151
|
+
this.state.paused = false;
|
|
152
|
+
this.state.pausedTime = 0;
|
|
153
|
+
this.emit("state-change", this.getState());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get current state (copy)
|
|
158
|
+
*/
|
|
159
|
+
getState() {
|
|
160
|
+
return {
|
|
161
|
+
...this.state,
|
|
162
|
+
activeTools: new Set(this.state.activeTools),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if loading
|
|
167
|
+
*/
|
|
168
|
+
isLoading() {
|
|
169
|
+
return this.state.isLoading;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get current phase
|
|
173
|
+
*/
|
|
174
|
+
getPhase() {
|
|
175
|
+
return this.state.phase;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get elapsed time in ms
|
|
179
|
+
*/
|
|
180
|
+
getElapsedMs() {
|
|
181
|
+
if (this.state.startTime === 0) {
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
return Date.now() - this.state.startTime;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get active tool names
|
|
188
|
+
*/
|
|
189
|
+
getActiveTools() {
|
|
190
|
+
return Array.from(this.state.activeTools);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if specific tool is active
|
|
194
|
+
*/
|
|
195
|
+
isToolActive(toolName) {
|
|
196
|
+
return this.state.activeTools.has(toolName);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get formatted state for display
|
|
200
|
+
*/
|
|
201
|
+
getFormattedState() {
|
|
202
|
+
if (!this.state.isLoading) {
|
|
203
|
+
return "Ready";
|
|
204
|
+
}
|
|
205
|
+
const parts = [];
|
|
206
|
+
if (this.state.message) {
|
|
207
|
+
parts.push(this.state.message);
|
|
208
|
+
}
|
|
209
|
+
if (this.state.activeToolCount > 0) {
|
|
210
|
+
parts.push(`(${this.state.activeToolCount} tool${this.state.activeToolCount > 1 ? "s" : ""} active)`);
|
|
211
|
+
}
|
|
212
|
+
const elapsed = Math.floor(this.getElapsedMs() / 1000);
|
|
213
|
+
if (elapsed > 0) {
|
|
214
|
+
parts.push(`[${elapsed}s]`);
|
|
215
|
+
}
|
|
216
|
+
return parts.join(" ") || this.state.phase;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// ============================================
|
|
220
|
+
// CONVENIENCE EXPORTS
|
|
221
|
+
// ============================================
|
|
222
|
+
/**
|
|
223
|
+
* Get the global loading state instance
|
|
224
|
+
*/
|
|
225
|
+
export function getLoadingState() {
|
|
226
|
+
return LoadingState.getInstance();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Quick access to loading state methods
|
|
230
|
+
* These call getInstance() each time to handle reset() properly
|
|
231
|
+
*/
|
|
232
|
+
export const setLoading = (phase, message) => {
|
|
233
|
+
LoadingState.getInstance().start(phase, message);
|
|
234
|
+
};
|
|
235
|
+
export const stopLoading = () => {
|
|
236
|
+
LoadingState.getInstance().stop();
|
|
237
|
+
};
|
|
238
|
+
export const updateLoading = (message) => {
|
|
239
|
+
LoadingState.getInstance().progress(message);
|
|
240
|
+
};
|
|
241
|
+
export const startTool = (toolName) => {
|
|
242
|
+
LoadingState.getInstance().toolStart(toolName);
|
|
243
|
+
};
|
|
244
|
+
export const endTool = (toolName) => {
|
|
245
|
+
LoadingState.getInstance().toolEnd(toolName);
|
|
246
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single Query Execution
|
|
3
|
+
* Shared query runner for CLI -q mode
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition, GitStatus } from "../../../../types/index.js";
|
|
6
|
+
import { HookManager } from "../../../../ecosystem/hooks/index.js";
|
|
7
|
+
import { SessionStore } from "../../../../core/session-store.js";
|
|
8
|
+
import type { CLIArgs } from "./args.js";
|
|
9
|
+
export interface QueryOptions {
|
|
10
|
+
apiKey: string;
|
|
11
|
+
args: CLIArgs;
|
|
12
|
+
systemPrompt: string;
|
|
13
|
+
tools: ToolDefinition[];
|
|
14
|
+
query: string;
|
|
15
|
+
sessionStore: SessionStore;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
hookManager: HookManager;
|
|
18
|
+
workingDirectory: string;
|
|
19
|
+
gitStatus?: GitStatus | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function runSingleQuery(options: QueryOptions): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/shared/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAW,cAAc,EAA0B,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE7G,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAOjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B;AAMD,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GzE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single Query Execution
|
|
3
|
+
* Shared query runner for CLI -q mode
|
|
4
|
+
*/
|
|
5
|
+
import { agentLoop, formatCost, formatCostBrief } from "../../../../core/agent-loop.js";
|
|
6
|
+
import { HookManager } from "../../../../ecosystem/hooks/index.js";
|
|
7
|
+
import { SessionStore } from "../../../../core/session-store.js";
|
|
8
|
+
import { createStreamHighlighter } from "../../../../core/stream-highlighter.js";
|
|
9
|
+
import { renderStatusLine, getContextWindow, } from "./status-line.js";
|
|
10
|
+
// ============================================
|
|
11
|
+
// SINGLE QUERY RUNNER
|
|
12
|
+
// ============================================
|
|
13
|
+
export async function runSingleQuery(options) {
|
|
14
|
+
const { apiKey, args, systemPrompt, tools, query, sessionStore, sessionId, hookManager, workingDirectory, gitStatus, } = options;
|
|
15
|
+
// Show initial status line
|
|
16
|
+
const initialStatusOptions = {
|
|
17
|
+
permissionMode: args.permissionMode,
|
|
18
|
+
tokensUsed: 0,
|
|
19
|
+
maxTokens: getContextWindow(args.model),
|
|
20
|
+
model: args.model,
|
|
21
|
+
isLoading: true,
|
|
22
|
+
};
|
|
23
|
+
console.log(`\x1b[90m${renderStatusLine(initialStatusOptions)}\x1b[0m\n`);
|
|
24
|
+
// Track tokens for final status
|
|
25
|
+
let totalTokens = 0;
|
|
26
|
+
const messages = [
|
|
27
|
+
{
|
|
28
|
+
role: "user",
|
|
29
|
+
content: [{ type: "text", text: query }],
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
// Save user message to session
|
|
33
|
+
await sessionStore.saveMessage(messages[0]);
|
|
34
|
+
// Create stream highlighter for code blocks
|
|
35
|
+
const highlighter = createStreamHighlighter();
|
|
36
|
+
// Build extended thinking config
|
|
37
|
+
const extendedThinkingConfig = args.extendedThinking
|
|
38
|
+
? {
|
|
39
|
+
enabled: true,
|
|
40
|
+
effort: args.effort ?? "medium",
|
|
41
|
+
interleaved: args.interleaved ?? true,
|
|
42
|
+
}
|
|
43
|
+
: undefined;
|
|
44
|
+
try {
|
|
45
|
+
const result = await agentLoop(messages, {
|
|
46
|
+
apiKey,
|
|
47
|
+
model: args.model,
|
|
48
|
+
maxTokens: args.maxTokens,
|
|
49
|
+
systemPrompt,
|
|
50
|
+
tools,
|
|
51
|
+
permissionMode: args.permissionMode,
|
|
52
|
+
workingDirectory,
|
|
53
|
+
gitStatus: gitStatus ?? undefined,
|
|
54
|
+
extendedThinking: extendedThinkingConfig,
|
|
55
|
+
hookManager,
|
|
56
|
+
sessionId,
|
|
57
|
+
onText: (text) => {
|
|
58
|
+
const highlighted = highlighter.process(text);
|
|
59
|
+
if (highlighted) {
|
|
60
|
+
process.stdout.write(highlighted);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
onThinking: (thinking) => {
|
|
64
|
+
process.stdout.write(`\x1b[90m${thinking}\x1b[0m`);
|
|
65
|
+
},
|
|
66
|
+
onMetrics: async (metrics) => {
|
|
67
|
+
// Track tokens for final status
|
|
68
|
+
totalTokens = metrics.usage.input_tokens + metrics.usage.output_tokens;
|
|
69
|
+
console.log(`\n\x1b[90m${formatCostBrief(metrics)}\x1b[0m`);
|
|
70
|
+
await sessionStore.saveMetrics(metrics);
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// Flush any remaining highlighted content
|
|
74
|
+
const remaining = highlighter.flush();
|
|
75
|
+
if (remaining) {
|
|
76
|
+
process.stdout.write(remaining);
|
|
77
|
+
}
|
|
78
|
+
// Save assistant message to session
|
|
79
|
+
const lastMessage = result.messages[result.messages.length - 1];
|
|
80
|
+
if (lastMessage && lastMessage.role === "assistant") {
|
|
81
|
+
await sessionStore.saveMessage(lastMessage);
|
|
82
|
+
}
|
|
83
|
+
// Show final status line
|
|
84
|
+
const finalStatusOptions = {
|
|
85
|
+
permissionMode: args.permissionMode,
|
|
86
|
+
tokensUsed: totalTokens,
|
|
87
|
+
maxTokens: getContextWindow(args.model),
|
|
88
|
+
model: args.model,
|
|
89
|
+
isLoading: false,
|
|
90
|
+
};
|
|
91
|
+
console.log(`\n\x1b[90m${renderStatusLine(finalStatusOptions)}\x1b[0m`);
|
|
92
|
+
console.log(`\x1b[90mSession: ${sessionId}\x1b[0m`);
|
|
93
|
+
console.log(`\x1b[90mTotal cost: ${formatCost(result.totalCost)}\x1b[0m`);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
97
|
+
console.error(`Error: ${errorMessage}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Setup
|
|
3
|
+
* Shared initialization logic for CLI and TUI modes
|
|
4
|
+
*/
|
|
5
|
+
import type { MCPServerConfig, ToolDefinition, PermissionMode } from "../../../../types/index.js";
|
|
6
|
+
import { MCPClientImpl } from "../../../mcp/client.js";
|
|
7
|
+
import { HookManager } from "../../../../ecosystem/hooks/index.js";
|
|
8
|
+
import { SkillManager } from "../../../../ecosystem/skills/index.js";
|
|
9
|
+
import { TeammateManager } from "../../../../teammates/index.js";
|
|
10
|
+
import { type LoadedConfig, type SettingsConfig } from "../../../../core/config-loader.js";
|
|
11
|
+
import type { CLIArgs } from "./args.js";
|
|
12
|
+
export interface SessionSetup {
|
|
13
|
+
loadedConfig: LoadedConfig;
|
|
14
|
+
mergedSettings: SettingsConfig;
|
|
15
|
+
hookManager: HookManager;
|
|
16
|
+
skillManager: SkillManager;
|
|
17
|
+
teammateManager: TeammateManager;
|
|
18
|
+
mcpClients: Map<string, MCPClientImpl>;
|
|
19
|
+
tools: ToolDefinition[];
|
|
20
|
+
permissionMode: PermissionMode;
|
|
21
|
+
allowedTools: Set<string>;
|
|
22
|
+
disallowedTools: Set<string>;
|
|
23
|
+
}
|
|
24
|
+
export interface SetupOptions {
|
|
25
|
+
args: CLIArgs;
|
|
26
|
+
apiKey: string;
|
|
27
|
+
workingDirectory: string;
|
|
28
|
+
onProgress?: (message: string) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function loadMCPConfig(configPath: string): Promise<Record<string, MCPServerConfig>>;
|
|
31
|
+
export declare function mcpToolsToToolDefinitions(mcpClients: Map<string, MCPClientImpl>): ToolDefinition[];
|
|
32
|
+
export declare function setupSession(options: SetupOptions): Promise<SessionSetup>;
|
|
33
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/shared/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,aAAa,EAAoB,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAMD,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CA0BhG;AAMD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,cAAc,EAAE,CAuBlG;AAMD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAoL/E"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Setup
|
|
3
|
+
* Shared initialization logic for CLI and TUI modes
|
|
4
|
+
*/
|
|
5
|
+
import { MCPClientImpl, createMCPClients } from "../../../mcp/client.js";
|
|
6
|
+
import { HookManager } from "../../../../ecosystem/hooks/index.js";
|
|
7
|
+
import { createPromptEvaluator } from "../../../../ecosystem/hooks/prompt-evaluator.js";
|
|
8
|
+
import { SkillManager } from "../../../../ecosystem/skills/index.js";
|
|
9
|
+
import { TeammateManager } from "../../../../teammates/index.js";
|
|
10
|
+
import { loadAllConfigs, getMergedSettings, getPermissionMode, getAllowedTools, getDisallowedTools, getAllMCPServers, settingsToHookDefinitions, } from "../../../../core/config-loader.js";
|
|
11
|
+
import { createSecurityHookHandlers } from "../../../../core/cognitive-security/hooks.js";
|
|
12
|
+
// ============================================
|
|
13
|
+
// MCP CONFIG LOADER
|
|
14
|
+
// ============================================
|
|
15
|
+
export async function loadMCPConfig(configPath) {
|
|
16
|
+
try {
|
|
17
|
+
const file = Bun.file(configPath);
|
|
18
|
+
const content = await file.text();
|
|
19
|
+
const config = JSON.parse(content);
|
|
20
|
+
// Support both formats:
|
|
21
|
+
// 1. { "servers": { "name": {...} } }
|
|
22
|
+
// 2. { "name": {...} } (direct server config)
|
|
23
|
+
if ("servers" in config && typeof config.servers === "object" && config.servers !== null) {
|
|
24
|
+
return config.servers;
|
|
25
|
+
}
|
|
26
|
+
// Check if it looks like direct server config (has "type" at top level)
|
|
27
|
+
if ("type" in config) {
|
|
28
|
+
// Single server config without "servers" wrapper
|
|
29
|
+
const servers = {};
|
|
30
|
+
servers["default"] = config;
|
|
31
|
+
return servers;
|
|
32
|
+
}
|
|
33
|
+
return config;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
37
|
+
throw new Error(`Failed to load MCP config from ${configPath}: ${errorMessage}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ============================================
|
|
41
|
+
// MCP TOOLS CONVERTER
|
|
42
|
+
// ============================================
|
|
43
|
+
export function mcpToolsToToolDefinitions(mcpClients) {
|
|
44
|
+
const tools = [];
|
|
45
|
+
for (const [serverName, client] of mcpClients) {
|
|
46
|
+
for (const mcpTool of client.tools) {
|
|
47
|
+
tools.push({
|
|
48
|
+
name: `mcp__${serverName}__${mcpTool.name}`,
|
|
49
|
+
description: mcpTool.description,
|
|
50
|
+
input_schema: mcpTool.inputSchema,
|
|
51
|
+
handler: async (args, context) => {
|
|
52
|
+
if (!client.connected) {
|
|
53
|
+
return {
|
|
54
|
+
content: `Error: MCP server "${serverName}" is not connected`,
|
|
55
|
+
is_error: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return client.callTool(mcpTool.name, args);
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return tools;
|
|
64
|
+
}
|
|
65
|
+
// ============================================
|
|
66
|
+
// SESSION SETUP
|
|
67
|
+
// ============================================
|
|
68
|
+
export async function setupSession(options) {
|
|
69
|
+
const { args, apiKey, workingDirectory, onProgress } = options;
|
|
70
|
+
const log = (msg) => {
|
|
71
|
+
if (onProgress)
|
|
72
|
+
onProgress(msg);
|
|
73
|
+
else
|
|
74
|
+
console.log(`\x1b[90m${msg}\x1b[0m`);
|
|
75
|
+
};
|
|
76
|
+
// ============================================
|
|
77
|
+
// LOAD CONFIGURATION
|
|
78
|
+
// ============================================
|
|
79
|
+
log("Loading configuration...");
|
|
80
|
+
let loadedConfig;
|
|
81
|
+
try {
|
|
82
|
+
loadedConfig = await loadAllConfigs(workingDirectory);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
86
|
+
log(`Warning: Failed to load config: ${errorMessage}`);
|
|
87
|
+
// Use empty defaults
|
|
88
|
+
loadedConfig = {
|
|
89
|
+
main: {},
|
|
90
|
+
settings: {},
|
|
91
|
+
keybindings: { bindings: [] },
|
|
92
|
+
projectSettings: {},
|
|
93
|
+
sources: [],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Get merged settings (project overrides global)
|
|
97
|
+
const mergedSettings = getMergedSettings(loadedConfig.settings, loadedConfig.projectSettings);
|
|
98
|
+
// Log loaded config sources
|
|
99
|
+
if (loadedConfig.sources.length > 0) {
|
|
100
|
+
log(` Config sources: ${loadedConfig.sources.length} files`);
|
|
101
|
+
}
|
|
102
|
+
// Determine permission mode
|
|
103
|
+
let permissionMode = args.permissionMode;
|
|
104
|
+
if (permissionMode === "default") {
|
|
105
|
+
const configMode = getPermissionMode(mergedSettings);
|
|
106
|
+
if (configMode !== "default") {
|
|
107
|
+
permissionMode = configMode;
|
|
108
|
+
log(` Permission mode: ${configMode} (from config)`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Get allowed/disallowed tools from config
|
|
112
|
+
const allowedTools = getAllowedTools(mergedSettings);
|
|
113
|
+
const disallowedTools = getDisallowedTools(mergedSettings);
|
|
114
|
+
// ============================================
|
|
115
|
+
// INITIALIZE MANAGERS
|
|
116
|
+
// ============================================
|
|
117
|
+
// Create prompt evaluator for LLM-based hooks
|
|
118
|
+
const promptEvaluator = createPromptEvaluator({
|
|
119
|
+
apiKey,
|
|
120
|
+
model: "claude-haiku-4-5", // Fast model for hook evaluation
|
|
121
|
+
maxTokens: 256,
|
|
122
|
+
});
|
|
123
|
+
// Initialize components
|
|
124
|
+
const hookManager = new HookManager(60000, promptEvaluator);
|
|
125
|
+
const skillManager = new SkillManager();
|
|
126
|
+
const teammateManager = new TeammateManager();
|
|
127
|
+
// ============================================
|
|
128
|
+
// REGISTER HOOKS
|
|
129
|
+
// ============================================
|
|
130
|
+
// Register hooks from config
|
|
131
|
+
const hookDefinitions = settingsToHookDefinitions(mergedSettings);
|
|
132
|
+
for (const [event, definitions] of Object.entries(hookDefinitions)) {
|
|
133
|
+
for (const def of definitions) {
|
|
134
|
+
hookManager.register(event, def);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (Object.keys(hookDefinitions).length > 0) {
|
|
138
|
+
log(` Hooks registered: ${Object.keys(hookDefinitions).length} events`);
|
|
139
|
+
}
|
|
140
|
+
// Register cognitive security hooks (in-process handlers)
|
|
141
|
+
// When bypassPermissions is set, disable all security checks
|
|
142
|
+
const isBypassMode = permissionMode === "bypassPermissions";
|
|
143
|
+
const securityHandlers = createSecurityHookHandlers({
|
|
144
|
+
enabled: !isBypassMode, // Disable entirely in bypass mode
|
|
145
|
+
checkIntentAlignment: !isBypassMode,
|
|
146
|
+
enforceFlowPolicies: !isBypassMode,
|
|
147
|
+
preventLeaks: !isBypassMode,
|
|
148
|
+
trackTaints: !isBypassMode,
|
|
149
|
+
logEvents: true, // Always log for audit trail
|
|
150
|
+
blockOnViolation: false, // Never block - log only
|
|
151
|
+
minAlignmentScore: 0.3,
|
|
152
|
+
approvalRequiredSensitivities: ["secret", "top_secret"],
|
|
153
|
+
});
|
|
154
|
+
hookManager.registerHandler("SessionStart", securityHandlers.SessionStart);
|
|
155
|
+
hookManager.registerHandler("PreToolUse", securityHandlers.PreToolUse);
|
|
156
|
+
hookManager.registerHandler("PostToolUse", securityHandlers.PostToolUse);
|
|
157
|
+
hookManager.registerHandler("UserPromptSubmit", securityHandlers.UserPromptSubmit);
|
|
158
|
+
hookManager.registerHandler("SessionEnd", securityHandlers.SessionEnd);
|
|
159
|
+
// Load skills from project
|
|
160
|
+
const skillsDir = workingDirectory + "/.claude/skills";
|
|
161
|
+
skillManager.loadFromDirectory(skillsDir, "project");
|
|
162
|
+
// ============================================
|
|
163
|
+
// MCP SETUP
|
|
164
|
+
// ============================================
|
|
165
|
+
const mcpClients = new Map();
|
|
166
|
+
// Get MCP servers from loaded config
|
|
167
|
+
const configServers = getAllMCPServers(loadedConfig.main, workingDirectory);
|
|
168
|
+
// If --mcp-config is specified, it overrides config file servers
|
|
169
|
+
let servers = configServers;
|
|
170
|
+
if (args.mcpConfig) {
|
|
171
|
+
try {
|
|
172
|
+
log(`Loading MCP config from ${args.mcpConfig}...`);
|
|
173
|
+
const fileServers = await loadMCPConfig(args.mcpConfig);
|
|
174
|
+
servers = fileServers;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
|
+
log(`Warning: Failed to load MCP config file: ${errorMessage}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Connect to MCP servers
|
|
182
|
+
if (Object.keys(servers).length > 0) {
|
|
183
|
+
// Only count enabled servers
|
|
184
|
+
const enabledServers = Object.entries(servers).filter(([_, config]) => !config.disabled);
|
|
185
|
+
const serverCount = enabledServers.length;
|
|
186
|
+
if (serverCount > 0) {
|
|
187
|
+
log(` Connecting to ${serverCount} MCP server(s)...`);
|
|
188
|
+
const connectedClients = await createMCPClients(servers, (message) => {
|
|
189
|
+
log(` ${message}`);
|
|
190
|
+
});
|
|
191
|
+
for (const [name, client] of connectedClients) {
|
|
192
|
+
mcpClients.set(name, client);
|
|
193
|
+
}
|
|
194
|
+
if (mcpClients.size > 0) {
|
|
195
|
+
log(` Connected to ${mcpClients.size} MCP server(s)`);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
log(` Warning: No MCP servers connected successfully`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (Object.keys(servers).length > 0) {
|
|
202
|
+
log(` MCP config loaded but all ${Object.keys(servers).length} server(s) are disabled`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ============================================
|
|
206
|
+
// BUILD TOOLS
|
|
207
|
+
// ============================================
|
|
208
|
+
// Import built-in tools dynamically to avoid circular deps
|
|
209
|
+
const { builtInTools } = await import("../../../../ecosystem/tools/index.js");
|
|
210
|
+
const tools = [
|
|
211
|
+
...builtInTools,
|
|
212
|
+
...mcpToolsToToolDefinitions(mcpClients),
|
|
213
|
+
];
|
|
214
|
+
return {
|
|
215
|
+
loadedConfig,
|
|
216
|
+
mergedSettings,
|
|
217
|
+
hookManager,
|
|
218
|
+
skillManager,
|
|
219
|
+
teammateManager,
|
|
220
|
+
mcpClients,
|
|
221
|
+
tools,
|
|
222
|
+
permissionMode,
|
|
223
|
+
allowedTools,
|
|
224
|
+
disallowedTools,
|
|
225
|
+
};
|
|
226
|
+
}
|