@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 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/compaction.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction Tests - Context compaction strategies
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach } from "bun:test";
|
|
5
|
+
import { handleProactiveCompaction, handleReactiveCompaction, needsCompaction, DEFAULT_PROACTIVE_OPTIONS, DEFAULT_REACTIVE_OPTIONS, } from "../compaction.js";
|
|
6
|
+
import { LoopState } from "../loop-state.js";
|
|
7
|
+
// Helper to create messages with specific token counts
|
|
8
|
+
function createMessages(count, tokensPerMessage = 100) {
|
|
9
|
+
const messages = [];
|
|
10
|
+
const charsPerMessage = tokensPerMessage * 4; // ~4 chars per token
|
|
11
|
+
for (let i = 0; i < count; i++) {
|
|
12
|
+
messages.push({
|
|
13
|
+
role: i % 2 === 0 ? "user" : "assistant",
|
|
14
|
+
content: [{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: "x".repeat(charsPerMessage) + ` Message ${i}`,
|
|
17
|
+
}],
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return messages;
|
|
21
|
+
}
|
|
22
|
+
describe("DEFAULT_PROACTIVE_OPTIONS", () => {
|
|
23
|
+
it("should have correct default values", () => {
|
|
24
|
+
expect(DEFAULT_PROACTIVE_OPTIONS.keepFirst).toBe(0);
|
|
25
|
+
expect(DEFAULT_PROACTIVE_OPTIONS.keepLast).toBe(3);
|
|
26
|
+
expect(DEFAULT_PROACTIVE_OPTIONS.preserveToolPairs).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("DEFAULT_REACTIVE_OPTIONS", () => {
|
|
30
|
+
it("should have correct default values", () => {
|
|
31
|
+
expect(DEFAULT_REACTIVE_OPTIONS.keepFirst).toBe(0);
|
|
32
|
+
expect(DEFAULT_REACTIVE_OPTIONS.keepLast).toBe(3);
|
|
33
|
+
expect(DEFAULT_REACTIVE_OPTIONS.preserveToolPairs).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("needsCompaction", () => {
|
|
37
|
+
it("should return false for small message sets", () => {
|
|
38
|
+
const messages = createMessages(5, 1000); // 5 messages, high tokens
|
|
39
|
+
// Should not need compaction because not enough messages
|
|
40
|
+
expect(needsCompaction(messages, 4096)).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it("should return false when under threshold", () => {
|
|
43
|
+
const messages = createMessages(10, 50); // 10 messages, low tokens each
|
|
44
|
+
// Under 90% threshold
|
|
45
|
+
expect(needsCompaction(messages, 4096)).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
it("should return true when over threshold", () => {
|
|
48
|
+
const messages = createMessages(10, 500); // 10 messages, high tokens
|
|
49
|
+
// Over 90% threshold
|
|
50
|
+
expect(needsCompaction(messages, 4096)).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it("should respect custom threshold", () => {
|
|
53
|
+
// Create messages that are exactly at a specific token count
|
|
54
|
+
// 10 messages * 200 tokens = 2000 tokens total
|
|
55
|
+
const messages = createMessages(10, 200);
|
|
56
|
+
// Total ~2000 tokens, at 90% of 2000 = 1800 threshold
|
|
57
|
+
// 2000 >= 1800, so needs compaction at 0.9 threshold
|
|
58
|
+
expect(needsCompaction(messages, 2000, 0.9)).toBe(true);
|
|
59
|
+
// At 99% threshold (1980), 2000 >= 1980, so still needs compaction
|
|
60
|
+
expect(needsCompaction(messages, 2000, 0.99)).toBe(true);
|
|
61
|
+
// At 101% threshold (2020), 2000 < 2020, so no compaction needed
|
|
62
|
+
expect(needsCompaction(messages, 2000, 1.01)).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("handleProactiveCompaction", () => {
|
|
66
|
+
let state;
|
|
67
|
+
beforeEach(() => {
|
|
68
|
+
// Create state with enough messages for compaction
|
|
69
|
+
const messages = createMessages(12, 500);
|
|
70
|
+
state = new LoopState(messages);
|
|
71
|
+
});
|
|
72
|
+
it("should return false when compaction not needed", async () => {
|
|
73
|
+
const smallState = new LoopState(createMessages(5, 50));
|
|
74
|
+
const result = await handleProactiveCompaction(smallState, 4096);
|
|
75
|
+
expect(result).toBe(false);
|
|
76
|
+
expect(smallState.compactionCount).toBe(0);
|
|
77
|
+
});
|
|
78
|
+
it("should apply compaction when needed", async () => {
|
|
79
|
+
const result = await handleProactiveCompaction(state, 4096);
|
|
80
|
+
// May or may not compact depending on actual token counts
|
|
81
|
+
// Just verify it doesn't throw
|
|
82
|
+
expect(typeof result).toBe("boolean");
|
|
83
|
+
});
|
|
84
|
+
it("should respect custom options", async () => {
|
|
85
|
+
const customOptions = {
|
|
86
|
+
keepFirst: 2,
|
|
87
|
+
keepLast: 5,
|
|
88
|
+
preserveToolPairs: false,
|
|
89
|
+
};
|
|
90
|
+
const result = await handleProactiveCompaction(state, 4096, customOptions);
|
|
91
|
+
expect(typeof result).toBe("boolean");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe("handleReactiveCompaction", () => {
|
|
95
|
+
let state;
|
|
96
|
+
beforeEach(() => {
|
|
97
|
+
const messages = createMessages(12, 500);
|
|
98
|
+
state = new LoopState(messages);
|
|
99
|
+
});
|
|
100
|
+
it("should attempt compaction on any message set", async () => {
|
|
101
|
+
const result = await handleReactiveCompaction(state, 4096);
|
|
102
|
+
expect(typeof result).toBe("boolean");
|
|
103
|
+
});
|
|
104
|
+
it("should return false if compaction does not reduce tokens", async () => {
|
|
105
|
+
// Very small state that can't be compacted meaningfully
|
|
106
|
+
const smallState = new LoopState(createMessages(2, 100));
|
|
107
|
+
const result = await handleReactiveCompaction(smallState, 4096);
|
|
108
|
+
expect(result).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it("should increment compaction count on success", async () => {
|
|
111
|
+
const initialCount = state.compactionCount;
|
|
112
|
+
await handleReactiveCompaction(state, 1000); // Force compaction with low limit
|
|
113
|
+
// If compaction succeeded, count should increase
|
|
114
|
+
// (depends on actual token counts)
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("compaction with tool pairs", () => {
|
|
118
|
+
it("should preserve tool use/result pairs when enabled", async () => {
|
|
119
|
+
const messages = [
|
|
120
|
+
{ role: "user", content: [{ type: "text", text: "x".repeat(4000) }] },
|
|
121
|
+
{ role: "assistant", content: [
|
|
122
|
+
{ type: "tool_use", id: "tool1", name: "Read", input: { file_path: "/test" } },
|
|
123
|
+
] },
|
|
124
|
+
{ role: "user", content: [
|
|
125
|
+
{ type: "tool_result", tool_use_id: "tool1", content: "result" },
|
|
126
|
+
] },
|
|
127
|
+
{ role: "assistant", content: [{ type: "text", text: "Done" }] },
|
|
128
|
+
];
|
|
129
|
+
const state = new LoopState(messages);
|
|
130
|
+
// With preserveToolPairs: true
|
|
131
|
+
const result = await handleProactiveCompaction(state, 1000, {
|
|
132
|
+
keepFirst: 0,
|
|
133
|
+
keepLast: 1,
|
|
134
|
+
preserveToolPairs: true,
|
|
135
|
+
});
|
|
136
|
+
// Tool pairs should be considered for preservation
|
|
137
|
+
expect(typeof result).toBe("boolean");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe("compaction state updates", () => {
|
|
141
|
+
it("should update state messages on successful compaction", async () => {
|
|
142
|
+
const messages = createMessages(15, 500);
|
|
143
|
+
const state = new LoopState(messages);
|
|
144
|
+
const originalLength = state.messages.length;
|
|
145
|
+
await handleProactiveCompaction(state, 2000); // Force compaction
|
|
146
|
+
// If compaction occurred, message count should decrease
|
|
147
|
+
// (depends on actual implementation)
|
|
148
|
+
});
|
|
149
|
+
it("should track total tokens compacted", async () => {
|
|
150
|
+
const messages = createMessages(15, 500);
|
|
151
|
+
const state = new LoopState(messages);
|
|
152
|
+
const initialCompacted = state.totalTokensCompacted;
|
|
153
|
+
await handleProactiveCompaction(state, 2000);
|
|
154
|
+
// If compaction succeeded, this should increase
|
|
155
|
+
// (depends on actual implementation)
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("edge cases", () => {
|
|
159
|
+
it("should handle empty messages", async () => {
|
|
160
|
+
const state = new LoopState([]);
|
|
161
|
+
const result = await handleProactiveCompaction(state, 4096);
|
|
162
|
+
expect(result).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
it("should handle single message", async () => {
|
|
165
|
+
const state = new LoopState(createMessages(1, 1000));
|
|
166
|
+
const result = await handleProactiveCompaction(state, 4096);
|
|
167
|
+
expect(result).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
it("should handle messages exactly at threshold", async () => {
|
|
170
|
+
// Create messages that are exactly at the threshold
|
|
171
|
+
const messages = createMessages(8, 460); // ~3680 tokens, at 90% of 4096
|
|
172
|
+
const state = new LoopState(messages);
|
|
173
|
+
const result = await handleProactiveCompaction(state, 4096);
|
|
174
|
+
// Should need compaction at exactly 90%
|
|
175
|
+
expect(typeof result).toBe("boolean");
|
|
176
|
+
});
|
|
177
|
+
it("should handle very large individual messages", async () => {
|
|
178
|
+
const messages = [
|
|
179
|
+
{ role: "user", content: [{ type: "text", text: "x".repeat(100000) }] },
|
|
180
|
+
{ role: "assistant", content: [{ type: "text", text: "Response" }] },
|
|
181
|
+
{ role: "user", content: [{ type: "text", text: "Follow up" }] },
|
|
182
|
+
];
|
|
183
|
+
const state = new LoopState(messages);
|
|
184
|
+
const result = await handleReactiveCompaction(state, 4096);
|
|
185
|
+
expect(typeof result).toBe("boolean");
|
|
186
|
+
});
|
|
187
|
+
it("should handle messages with mixed content types", async () => {
|
|
188
|
+
const messages = [
|
|
189
|
+
{ role: "user", content: [{ type: "text", text: "x".repeat(2000) }] },
|
|
190
|
+
{ role: "assistant", content: [
|
|
191
|
+
{ type: "tool_use", id: "t1", name: "Read", input: {} },
|
|
192
|
+
{ type: "text", text: "Text after tool" },
|
|
193
|
+
] },
|
|
194
|
+
{ role: "user", content: [
|
|
195
|
+
{ type: "tool_result", tool_use_id: "t1", content: "result" },
|
|
196
|
+
{ type: "image", source: { type: "base64", data: "imagedata", media_type: "image/png" } },
|
|
197
|
+
] },
|
|
198
|
+
];
|
|
199
|
+
for (let i = 0; i < 6; i++) {
|
|
200
|
+
messages.push({
|
|
201
|
+
role: i % 2 === 0 ? "user" : "assistant",
|
|
202
|
+
content: [{ type: "text", text: "x".repeat(500) }],
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
const state = new LoopState(messages);
|
|
206
|
+
const result = await handleProactiveCompaction(state, 4096);
|
|
207
|
+
expect(typeof result).toBe("boolean");
|
|
208
|
+
});
|
|
209
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/formatters.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatters Tests - Cost and metrics display utilities
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "bun:test";
|
|
5
|
+
import { formatCost, formatMetrics, formatCostBrief, formatCacheMetrics, } from "../formatters.js";
|
|
6
|
+
describe("formatCost", () => {
|
|
7
|
+
it("should format small costs with 4 decimal places", () => {
|
|
8
|
+
expect(formatCost(0.001)).toBe("$0.0010");
|
|
9
|
+
expect(formatCost(0.0099)).toBe("$0.0099");
|
|
10
|
+
expect(formatCost(0.005)).toBe("$0.0050");
|
|
11
|
+
});
|
|
12
|
+
it("should format larger costs with 2 decimal places", () => {
|
|
13
|
+
expect(formatCost(0.01)).toBe("$0.01");
|
|
14
|
+
expect(formatCost(0.5)).toBe("$0.50");
|
|
15
|
+
expect(formatCost(1.0)).toBe("$1.00");
|
|
16
|
+
expect(formatCost(10.99)).toBe("$10.99");
|
|
17
|
+
expect(formatCost(100.0)).toBe("$100.00");
|
|
18
|
+
});
|
|
19
|
+
it("should handle zero cost", () => {
|
|
20
|
+
expect(formatCost(0)).toBe("$0.0000");
|
|
21
|
+
});
|
|
22
|
+
it("should handle very large costs", () => {
|
|
23
|
+
expect(formatCost(1000.0)).toBe("$1000.00");
|
|
24
|
+
expect(formatCost(9999.99)).toBe("$9999.99");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("formatMetrics", () => {
|
|
28
|
+
it("should format basic metrics without cache", () => {
|
|
29
|
+
const metrics = {
|
|
30
|
+
model: "claude-sonnet-4-6",
|
|
31
|
+
messageCount: 5,
|
|
32
|
+
messageTokens: 1500,
|
|
33
|
+
usage: { input_tokens: 1000, output_tokens: 500 },
|
|
34
|
+
durationMs: 2000,
|
|
35
|
+
ttftMs: 150,
|
|
36
|
+
costUSD: 0.05,
|
|
37
|
+
stopReason: "end_turn",
|
|
38
|
+
requestId: "req-123",
|
|
39
|
+
};
|
|
40
|
+
const result = formatMetrics(metrics);
|
|
41
|
+
expect(result).toContain("Cost: $0.05");
|
|
42
|
+
expect(result).toContain("1,000 input");
|
|
43
|
+
expect(result).toContain("500 output");
|
|
44
|
+
expect(result).not.toContain("Cache:");
|
|
45
|
+
});
|
|
46
|
+
it("should format metrics with cache information", () => {
|
|
47
|
+
const metrics = {
|
|
48
|
+
model: "claude-sonnet-4-6",
|
|
49
|
+
messageCount: 5,
|
|
50
|
+
messageTokens: 1500,
|
|
51
|
+
usage: {
|
|
52
|
+
input_tokens: 1000,
|
|
53
|
+
output_tokens: 500,
|
|
54
|
+
cache_read_input_tokens: 800,
|
|
55
|
+
cache_creation_input_tokens: 200,
|
|
56
|
+
},
|
|
57
|
+
durationMs: 2000,
|
|
58
|
+
ttftMs: 150,
|
|
59
|
+
costUSD: 0.03,
|
|
60
|
+
stopReason: "end_turn",
|
|
61
|
+
requestId: "req-123",
|
|
62
|
+
};
|
|
63
|
+
const result = formatMetrics(metrics);
|
|
64
|
+
expect(result).toContain("Cost: $0.03");
|
|
65
|
+
expect(result).toContain("800 read");
|
|
66
|
+
expect(result).toContain("200 write");
|
|
67
|
+
expect(result).toContain("Cache:");
|
|
68
|
+
});
|
|
69
|
+
it("should handle small costs with 4 decimals", () => {
|
|
70
|
+
const metrics = {
|
|
71
|
+
model: "claude-sonnet-4-6",
|
|
72
|
+
messageCount: 1,
|
|
73
|
+
messageTokens: 100,
|
|
74
|
+
usage: { input_tokens: 50, output_tokens: 50 },
|
|
75
|
+
durationMs: 500,
|
|
76
|
+
ttftMs: 100,
|
|
77
|
+
costUSD: 0.005,
|
|
78
|
+
stopReason: "end_turn",
|
|
79
|
+
requestId: "req-1",
|
|
80
|
+
};
|
|
81
|
+
const result = formatMetrics(metrics);
|
|
82
|
+
expect(result).toContain("$0.0050");
|
|
83
|
+
});
|
|
84
|
+
it("should format large token counts with locale separators", () => {
|
|
85
|
+
const metrics = {
|
|
86
|
+
model: "claude-sonnet-4-6",
|
|
87
|
+
messageCount: 100,
|
|
88
|
+
messageTokens: 500000,
|
|
89
|
+
usage: { input_tokens: 400000, output_tokens: 100000 },
|
|
90
|
+
durationMs: 10000,
|
|
91
|
+
ttftMs: 500,
|
|
92
|
+
costUSD: 5.0,
|
|
93
|
+
stopReason: "end_turn",
|
|
94
|
+
requestId: "req-123",
|
|
95
|
+
};
|
|
96
|
+
const result = formatMetrics(metrics);
|
|
97
|
+
expect(result).toContain("400,000 input");
|
|
98
|
+
expect(result).toContain("100,000 output");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("formatCostBrief", () => {
|
|
102
|
+
it("should format brief cost with total tokens", () => {
|
|
103
|
+
const metrics = {
|
|
104
|
+
model: "claude-sonnet-4-6",
|
|
105
|
+
messageCount: 5,
|
|
106
|
+
messageTokens: 1500,
|
|
107
|
+
usage: { input_tokens: 1000, output_tokens: 500 },
|
|
108
|
+
durationMs: 2000,
|
|
109
|
+
ttftMs: 150,
|
|
110
|
+
costUSD: 0.05,
|
|
111
|
+
stopReason: "end_turn",
|
|
112
|
+
requestId: "req-123",
|
|
113
|
+
};
|
|
114
|
+
const result = formatCostBrief(metrics);
|
|
115
|
+
expect(result).toContain("Cost: $0.05");
|
|
116
|
+
expect(result).toContain("1,500"); // Total tokens
|
|
117
|
+
expect(result).not.toContain("input");
|
|
118
|
+
expect(result).not.toContain("output");
|
|
119
|
+
});
|
|
120
|
+
it("should handle small costs", () => {
|
|
121
|
+
const metrics = {
|
|
122
|
+
model: "claude-sonnet-4-6",
|
|
123
|
+
messageCount: 1,
|
|
124
|
+
messageTokens: 100,
|
|
125
|
+
usage: { input_tokens: 50, output_tokens: 50 },
|
|
126
|
+
durationMs: 500,
|
|
127
|
+
ttftMs: 100,
|
|
128
|
+
costUSD: 0.001,
|
|
129
|
+
stopReason: "end_turn",
|
|
130
|
+
requestId: "req-1",
|
|
131
|
+
};
|
|
132
|
+
const result = formatCostBrief(metrics);
|
|
133
|
+
expect(result).toContain("$0.0010");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe("formatCacheMetrics", () => {
|
|
137
|
+
it("should format cache metrics with all fields", () => {
|
|
138
|
+
const cacheMetrics = {
|
|
139
|
+
cacheHits: 50,
|
|
140
|
+
cacheMisses: 10,
|
|
141
|
+
totalCacheReadTokens: 50000,
|
|
142
|
+
totalCacheWriteTokens: 5000,
|
|
143
|
+
cacheHitRate: 0.833,
|
|
144
|
+
estimatedSavingsUSD: 0.25,
|
|
145
|
+
};
|
|
146
|
+
const result = formatCacheMetrics(cacheMetrics);
|
|
147
|
+
expect(result).toContain("83.3% hit rate");
|
|
148
|
+
expect(result).toContain("50,000 read");
|
|
149
|
+
expect(result).toContain("5,000 written");
|
|
150
|
+
expect(result).toContain("Saved: $0.25");
|
|
151
|
+
});
|
|
152
|
+
it("should handle zero cache activity", () => {
|
|
153
|
+
const cacheMetrics = {
|
|
154
|
+
cacheHits: 0,
|
|
155
|
+
cacheMisses: 0,
|
|
156
|
+
totalCacheReadTokens: 0,
|
|
157
|
+
totalCacheWriteTokens: 0,
|
|
158
|
+
cacheHitRate: 0,
|
|
159
|
+
estimatedSavingsUSD: 0,
|
|
160
|
+
};
|
|
161
|
+
const result = formatCacheMetrics(cacheMetrics);
|
|
162
|
+
expect(result).toContain("0.0% hit rate");
|
|
163
|
+
expect(result).toContain("0 read");
|
|
164
|
+
expect(result).toContain("0 written");
|
|
165
|
+
expect(result).toContain("Saved: $0.0000");
|
|
166
|
+
});
|
|
167
|
+
it("should handle 100% hit rate", () => {
|
|
168
|
+
const cacheMetrics = {
|
|
169
|
+
cacheHits: 100,
|
|
170
|
+
cacheMisses: 0,
|
|
171
|
+
totalCacheReadTokens: 100000,
|
|
172
|
+
totalCacheWriteTokens: 0,
|
|
173
|
+
cacheHitRate: 1.0,
|
|
174
|
+
estimatedSavingsUSD: 1.50,
|
|
175
|
+
};
|
|
176
|
+
const result = formatCacheMetrics(cacheMetrics);
|
|
177
|
+
expect(result).toContain("100.0% hit rate");
|
|
178
|
+
expect(result).toContain("100,000 read");
|
|
179
|
+
expect(result).toContain("Saved: $1.50");
|
|
180
|
+
});
|
|
181
|
+
it("should format large numbers with separators", () => {
|
|
182
|
+
const cacheMetrics = {
|
|
183
|
+
cacheHits: 1000,
|
|
184
|
+
cacheMisses: 100,
|
|
185
|
+
totalCacheReadTokens: 1000000,
|
|
186
|
+
totalCacheWriteTokens: 100000,
|
|
187
|
+
cacheHitRate: 0.909,
|
|
188
|
+
estimatedSavingsUSD: 10.0,
|
|
189
|
+
};
|
|
190
|
+
const result = formatCacheMetrics(cacheMetrics);
|
|
191
|
+
expect(result).toContain("1,000,000 read");
|
|
192
|
+
expect(result).toContain("100,000 written");
|
|
193
|
+
expect(result).toContain("90.9% hit rate");
|
|
194
|
+
});
|
|
195
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Loop Index Tests - Main entry point and exports
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "bun:test";
|
|
5
|
+
import { agentLoop, formatCost, formatMetrics, formatCostBrief, formatCacheMetrics, LoopState, executeTools, buildAPIMessages, injectReminderIntoContent, handleProactiveCompaction, handleReactiveCompaction, needsCompaction, estimateMessagesTokens, DEFAULT_PROACTIVE_OPTIONS, DEFAULT_REACTIVE_OPTIONS, } from "../index.js";
|
|
6
|
+
describe("exports", () => {
|
|
7
|
+
it("should export agentLoop function", () => {
|
|
8
|
+
expect(typeof agentLoop).toBe("function");
|
|
9
|
+
});
|
|
10
|
+
it("should export formatter functions", () => {
|
|
11
|
+
expect(typeof formatCost).toBe("function");
|
|
12
|
+
expect(typeof formatMetrics).toBe("function");
|
|
13
|
+
expect(typeof formatCostBrief).toBe("function");
|
|
14
|
+
expect(typeof formatCacheMetrics).toBe("function");
|
|
15
|
+
});
|
|
16
|
+
it("should export LoopState class", () => {
|
|
17
|
+
expect(LoopState).toBeDefined();
|
|
18
|
+
expect(typeof LoopState).toBe("function");
|
|
19
|
+
});
|
|
20
|
+
it("should export executeTools function", () => {
|
|
21
|
+
expect(typeof executeTools).toBe("function");
|
|
22
|
+
});
|
|
23
|
+
it("should export message builder functions", () => {
|
|
24
|
+
expect(typeof buildAPIMessages).toBe("function");
|
|
25
|
+
expect(typeof injectReminderIntoContent).toBe("function");
|
|
26
|
+
});
|
|
27
|
+
it("should export compaction functions and constants", () => {
|
|
28
|
+
expect(typeof handleProactiveCompaction).toBe("function");
|
|
29
|
+
expect(typeof handleReactiveCompaction).toBe("function");
|
|
30
|
+
expect(typeof needsCompaction).toBe("function");
|
|
31
|
+
expect(typeof estimateMessagesTokens).toBe("function");
|
|
32
|
+
expect(DEFAULT_PROACTIVE_OPTIONS).toBeDefined();
|
|
33
|
+
expect(DEFAULT_REACTIVE_OPTIONS).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("AgentLoopOptions type", () => {
|
|
37
|
+
it("should have required apiKey field", () => {
|
|
38
|
+
const options = {
|
|
39
|
+
apiKey: "test-key",
|
|
40
|
+
systemPrompt: "Test prompt",
|
|
41
|
+
tools: [],
|
|
42
|
+
permissionMode: "bypassPermissions",
|
|
43
|
+
workingDirectory: "/test",
|
|
44
|
+
};
|
|
45
|
+
expect(options.apiKey).toBe("test-key");
|
|
46
|
+
});
|
|
47
|
+
it("should have optional fields with defaults", () => {
|
|
48
|
+
const options = {
|
|
49
|
+
apiKey: "test-key",
|
|
50
|
+
systemPrompt: "Test prompt",
|
|
51
|
+
tools: [],
|
|
52
|
+
permissionMode: "default",
|
|
53
|
+
workingDirectory: "/test",
|
|
54
|
+
};
|
|
55
|
+
// Optional fields should be accessible
|
|
56
|
+
expect(options.model).toBeUndefined();
|
|
57
|
+
expect(options.maxTokens).toBeUndefined();
|
|
58
|
+
expect(options.hookManager).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("AgentLoopResult type", () => {
|
|
62
|
+
it("should contain all expected fields", () => {
|
|
63
|
+
// Create a result via LoopState to verify type compatibility
|
|
64
|
+
const state = new LoopState([]);
|
|
65
|
+
const result = state.toResult();
|
|
66
|
+
expect(result.messages).toBeDefined();
|
|
67
|
+
expect(result.metrics).toBeDefined();
|
|
68
|
+
expect(typeof result.totalCost).toBe("number");
|
|
69
|
+
expect(typeof result.totalDuration).toBe("number");
|
|
70
|
+
expect(result.totalCacheMetrics).toBeDefined();
|
|
71
|
+
expect(typeof result.compactionCount).toBe("number");
|
|
72
|
+
expect(typeof result.totalTokensCompacted).toBe("number");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("agentLoop function signature", () => {
|
|
76
|
+
it("should accept AgentLoopOptions and return Promise<AgentLoopResult>", () => {
|
|
77
|
+
// Type check only - don't actually run it
|
|
78
|
+
const checkSignature = async () => {
|
|
79
|
+
const options = {
|
|
80
|
+
apiKey: "test",
|
|
81
|
+
systemPrompt: "test",
|
|
82
|
+
tools: [],
|
|
83
|
+
permissionMode: "bypassPermissions",
|
|
84
|
+
workingDirectory: "/test",
|
|
85
|
+
};
|
|
86
|
+
// This would actually call the API, so we just verify the type
|
|
87
|
+
const _typeCheck = () => agentLoop([], options);
|
|
88
|
+
// Verify the function exists and has correct signature
|
|
89
|
+
expect(typeof agentLoop).toBe("function");
|
|
90
|
+
};
|
|
91
|
+
// Just verify no type errors
|
|
92
|
+
expect(checkSignature).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("re-exports from submodules", () => {
|
|
96
|
+
it("should re-export LoopState correctly", () => {
|
|
97
|
+
const state = new LoopState([
|
|
98
|
+
{ role: "user", content: [{ type: "text", text: "test" }] },
|
|
99
|
+
]);
|
|
100
|
+
expect(state.messages).toHaveLength(1);
|
|
101
|
+
expect(state.turnNumber).toBe(0);
|
|
102
|
+
});
|
|
103
|
+
it("should re-export formatters with correct behavior", () => {
|
|
104
|
+
expect(formatCost(0.005)).toBe("$0.0050");
|
|
105
|
+
expect(formatCost(1.5)).toBe("$1.50");
|
|
106
|
+
});
|
|
107
|
+
it("should re-export message builder functions", () => {
|
|
108
|
+
const messages = [
|
|
109
|
+
{ role: "user", content: [{ type: "text", text: "Hello" }] },
|
|
110
|
+
];
|
|
111
|
+
const result = buildAPIMessages(messages, "System", "Reminder");
|
|
112
|
+
expect(result).toHaveLength(1);
|
|
113
|
+
expect((result[0]?.content[0]).text).toContain("Reminder");
|
|
114
|
+
});
|
|
115
|
+
it("should re-export compaction constants", () => {
|
|
116
|
+
expect(DEFAULT_PROACTIVE_OPTIONS.keepFirst).toBe(0);
|
|
117
|
+
expect(DEFAULT_PROACTIVE_OPTIONS.keepLast).toBe(3);
|
|
118
|
+
expect(DEFAULT_REACTIVE_OPTIONS.keepFirst).toBe(0);
|
|
119
|
+
expect(DEFAULT_REACTIVE_OPTIONS.keepLast).toBe(3);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-state.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/loop-state.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|