@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,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Logic - Exponential backoff with jitter for API failures
|
|
3
|
+
* Handles rate limits, network errors, and transient failures
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface RetryOptions {
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
baseDelayMs?: number;
|
|
9
|
+
maxDelayMs?: number;
|
|
10
|
+
jitterFactor?: number;
|
|
11
|
+
retryableStatusCodes?: number[];
|
|
12
|
+
onRetry?: (attempt: number, error: Error, delayMs: number) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
16
|
+
maxRetries: 3,
|
|
17
|
+
baseDelayMs: 1000,
|
|
18
|
+
maxDelayMs: 30000,
|
|
19
|
+
jitterFactor: 0.2,
|
|
20
|
+
retryableStatusCodes: [429, 500, 502, 503, 504, 529],
|
|
21
|
+
onRetry: undefined as ((attempt: number, error: Error, delayMs: number) => void) | undefined,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Calculate delay with exponential backoff and jitter
|
|
26
|
+
*/
|
|
27
|
+
function calculateDelay(
|
|
28
|
+
attempt: number,
|
|
29
|
+
baseDelayMs: number,
|
|
30
|
+
maxDelayMs: number,
|
|
31
|
+
jitterFactor: number
|
|
32
|
+
): number {
|
|
33
|
+
// Exponential backoff: baseDelay * 2^attempt
|
|
34
|
+
const exponentialDelay = baseDelayMs * Math.pow(2, attempt);
|
|
35
|
+
|
|
36
|
+
// Add jitter to prevent thundering herd
|
|
37
|
+
const jitter = exponentialDelay * jitterFactor * (Math.random() * 2 - 1);
|
|
38
|
+
|
|
39
|
+
// Cap at max delay
|
|
40
|
+
return Math.min(exponentialDelay + jitter, maxDelayMs);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Check if an error is retryable
|
|
45
|
+
*/
|
|
46
|
+
function isRetryableError(
|
|
47
|
+
error: Error,
|
|
48
|
+
retryableStatusCodes: number[]
|
|
49
|
+
): boolean {
|
|
50
|
+
// Check for rate limit errors
|
|
51
|
+
if (error.message.includes("429") || error.message.includes("rate limit")) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Check for server errors
|
|
56
|
+
if (error.message.includes("500") ||
|
|
57
|
+
error.message.includes("502") ||
|
|
58
|
+
error.message.includes("503") ||
|
|
59
|
+
error.message.includes("504")) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Check for network errors
|
|
64
|
+
if (error.message.includes("ECONNREFUSED") ||
|
|
65
|
+
error.message.includes("ENOTFOUND") ||
|
|
66
|
+
error.message.includes("ETIMEDOUT") ||
|
|
67
|
+
error.message.includes("network") ||
|
|
68
|
+
error.message.includes("fetch failed")) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Check for transient API errors (empty/malformed responses)
|
|
73
|
+
if (error.message.includes("No message received") ||
|
|
74
|
+
error.message.includes("empty response") ||
|
|
75
|
+
error.message.includes("invalid response") ||
|
|
76
|
+
error.message.includes("unexpected EOF") ||
|
|
77
|
+
error.message.includes("connection reset") ||
|
|
78
|
+
error.message.includes("aborted")) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Check for specific status codes in error message
|
|
83
|
+
for (const code of retryableStatusCodes) {
|
|
84
|
+
if (error.message.includes(String(code))) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Sleep for a given number of milliseconds
|
|
94
|
+
*/
|
|
95
|
+
function sleep(ms: number): Promise<void> {
|
|
96
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Execute a function with retry logic
|
|
101
|
+
*/
|
|
102
|
+
export async function withRetry<T>(
|
|
103
|
+
fn: () => Promise<T>,
|
|
104
|
+
options: RetryOptions = {}
|
|
105
|
+
): Promise<T> {
|
|
106
|
+
const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
|
|
107
|
+
let lastError: Error | null = null;
|
|
108
|
+
|
|
109
|
+
for (let attempt = 0; attempt <= opts.maxRetries!; attempt++) {
|
|
110
|
+
try {
|
|
111
|
+
return await fn();
|
|
112
|
+
} catch (error) {
|
|
113
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
114
|
+
|
|
115
|
+
// Check if we should retry
|
|
116
|
+
if (attempt < opts.maxRetries! && isRetryableError(lastError, opts.retryableStatusCodes!)) {
|
|
117
|
+
const delayMs = calculateDelay(
|
|
118
|
+
attempt,
|
|
119
|
+
opts.baseDelayMs!,
|
|
120
|
+
opts.maxDelayMs!,
|
|
121
|
+
opts.jitterFactor!
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// Log retry attempt
|
|
125
|
+
if (opts.onRetry) {
|
|
126
|
+
opts.onRetry(attempt + 1, lastError, delayMs);
|
|
127
|
+
} else {
|
|
128
|
+
console.warn(
|
|
129
|
+
`\x1b[33mRetry ${attempt + 1}/${opts.maxRetries} after ${delayMs}ms: ${lastError.message}\x1b[0m`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
await sleep(delayMs);
|
|
134
|
+
} else {
|
|
135
|
+
// Non-retryable error or max retries reached
|
|
136
|
+
throw lastError;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
throw lastError || new Error("Max retries exceeded");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Create a retry wrapper for fetch
|
|
146
|
+
*/
|
|
147
|
+
export function createFetchWithRetry(
|
|
148
|
+
options: RetryOptions = {}
|
|
149
|
+
): (url: string, init?: RequestInit) => Promise<Response> {
|
|
150
|
+
return async (url: string, init?: RequestInit): Promise<Response> => {
|
|
151
|
+
return withRetry(
|
|
152
|
+
async () => {
|
|
153
|
+
const response = await fetch(url, init);
|
|
154
|
+
|
|
155
|
+
// Check for retryable status codes
|
|
156
|
+
if (options.retryableStatusCodes?.includes(response.status)) {
|
|
157
|
+
const text = await response.text();
|
|
158
|
+
throw new Error(`API error: ${response.status} - ${text}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return response;
|
|
162
|
+
},
|
|
163
|
+
options
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Parse retry-after header from rate limit response
|
|
170
|
+
*/
|
|
171
|
+
export function parseRetryAfter(response: Response): number | null {
|
|
172
|
+
const retryAfter = response.headers.get("retry-after");
|
|
173
|
+
if (retryAfter) {
|
|
174
|
+
const seconds = parseInt(retryAfter, 10);
|
|
175
|
+
if (!isNaN(seconds)) {
|
|
176
|
+
return seconds * 1000; // Convert to milliseconds
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Store - Backward compatibility layer
|
|
3
|
+
* Re-exports from composable sessions module
|
|
4
|
+
*
|
|
5
|
+
* @deprecated Import from "./sessions/index.js" instead for composable access
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Re-export everything from the new composable module
|
|
9
|
+
export {
|
|
10
|
+
SessionStore,
|
|
11
|
+
SessionPersistence,
|
|
12
|
+
SessionMetadataManager,
|
|
13
|
+
SessionExporter,
|
|
14
|
+
formatSessionSummary,
|
|
15
|
+
printSessionsList,
|
|
16
|
+
// Types
|
|
17
|
+
type SessionMetadata,
|
|
18
|
+
type SessionMessage,
|
|
19
|
+
type SessionToolUse,
|
|
20
|
+
type SessionMetrics,
|
|
21
|
+
type SessionContext,
|
|
22
|
+
type SessionCheckpoint,
|
|
23
|
+
type SessionEntry,
|
|
24
|
+
type LoadedSession,
|
|
25
|
+
type SessionSummary,
|
|
26
|
+
type SessionFilter,
|
|
27
|
+
type SessionEvent,
|
|
28
|
+
type SessionEventType,
|
|
29
|
+
type SessionEventHandler,
|
|
30
|
+
type ExportFormat,
|
|
31
|
+
type ISessionPersistence,
|
|
32
|
+
type ISessionExporter,
|
|
33
|
+
} from "./sessions/index.js";
|
|
34
|
+
|
|
35
|
+
// Default export
|
|
36
|
+
export { SessionStore as default } from "./sessions/index.js";
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Export - Export sessions to various formats
|
|
3
|
+
* Supports JSONL, JSON, and Markdown
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { join } from "path";
|
|
7
|
+
import type {
|
|
8
|
+
LoadedSession,
|
|
9
|
+
SessionSummary,
|
|
10
|
+
ExportFormat,
|
|
11
|
+
ISessionExporter,
|
|
12
|
+
SessionToolUse,
|
|
13
|
+
} from "./types.js";
|
|
14
|
+
import type { ContentBlock, ToolUseBlock, ToolResultBlock } from "../../types/index.js";
|
|
15
|
+
import { SessionPersistence } from "./persistence.js";
|
|
16
|
+
|
|
17
|
+
export class SessionExporter implements ISessionExporter {
|
|
18
|
+
private persistence: SessionPersistence;
|
|
19
|
+
|
|
20
|
+
constructor(persistence: SessionPersistence) {
|
|
21
|
+
this.persistence = persistence;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Export a loaded session to the specified format
|
|
26
|
+
*/
|
|
27
|
+
export(session: LoadedSession, format: ExportFormat): string {
|
|
28
|
+
switch (format) {
|
|
29
|
+
case "jsonl":
|
|
30
|
+
return this.toJsonl(session);
|
|
31
|
+
case "json":
|
|
32
|
+
return this.toJson(session);
|
|
33
|
+
case "markdown":
|
|
34
|
+
return this.toMarkdown(session);
|
|
35
|
+
default:
|
|
36
|
+
throw new Error(`Unsupported export format: ${format}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Export a session to a file
|
|
42
|
+
*/
|
|
43
|
+
async exportToFile(
|
|
44
|
+
sessionId: string,
|
|
45
|
+
format: ExportFormat,
|
|
46
|
+
outputPath?: string
|
|
47
|
+
): Promise<string> {
|
|
48
|
+
const sessionFile = this.persistence.getSessionPath(sessionId);
|
|
49
|
+
|
|
50
|
+
// For JSONL, just return the original file
|
|
51
|
+
if (format === "jsonl") {
|
|
52
|
+
const content = await Bun.file(sessionFile).text();
|
|
53
|
+
const finalPath = outputPath ?? join(process.cwd(), `session-${sessionId}.jsonl`);
|
|
54
|
+
await Bun.write(finalPath, content);
|
|
55
|
+
return finalPath;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// For other formats, we'd need to load and convert
|
|
59
|
+
// This is handled by the SessionStore which has access to the full session
|
|
60
|
+
throw new Error("Use SessionStore.exportSession for full export functionality");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Export to JSONL format (raw session file)
|
|
65
|
+
*/
|
|
66
|
+
private toJsonl(session: LoadedSession): string {
|
|
67
|
+
const lines: string[] = [];
|
|
68
|
+
|
|
69
|
+
// Metadata first (with explicit type)
|
|
70
|
+
lines.push(JSON.stringify({ ...session.metadata, type: "metadata" }));
|
|
71
|
+
|
|
72
|
+
// Context
|
|
73
|
+
if (session.context) {
|
|
74
|
+
lines.push(JSON.stringify(session.context));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Messages
|
|
78
|
+
for (const msg of session.messages) {
|
|
79
|
+
lines.push(JSON.stringify({ type: "message", timestamp: Date.now(), data: msg }));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Tools
|
|
83
|
+
for (const tool of session.tools) {
|
|
84
|
+
lines.push(JSON.stringify(tool));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Metrics
|
|
88
|
+
for (const metric of session.metrics) {
|
|
89
|
+
lines.push(JSON.stringify({ type: "metrics", timestamp: Date.now(), data: metric }));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Checkpoints
|
|
93
|
+
for (const checkpoint of session.checkpoints) {
|
|
94
|
+
lines.push(JSON.stringify(checkpoint));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return lines.join("\n");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Export to JSON format (pretty-printed)
|
|
102
|
+
*/
|
|
103
|
+
private toJson(session: LoadedSession): string {
|
|
104
|
+
return JSON.stringify(session, null, 2);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Export to Markdown format
|
|
109
|
+
*/
|
|
110
|
+
private toMarkdown(session: LoadedSession): string {
|
|
111
|
+
const lines: string[] = [];
|
|
112
|
+
|
|
113
|
+
// Header
|
|
114
|
+
lines.push(`# Session: ${session.metadata.id}`);
|
|
115
|
+
lines.push("");
|
|
116
|
+
lines.push(`**Created:** ${new Date(session.metadata.created).toISOString()}`);
|
|
117
|
+
lines.push(`**Model:** ${session.metadata.model}`);
|
|
118
|
+
lines.push(`**Working Directory:** ${session.metadata.workingDirectory}`);
|
|
119
|
+
|
|
120
|
+
if (session.metadata.agentName) {
|
|
121
|
+
lines.push(`**Agent:** ${session.metadata.agentName}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (session.metadata.teamName) {
|
|
125
|
+
lines.push(`**Team:** ${session.metadata.teamName}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
lines.push("");
|
|
129
|
+
|
|
130
|
+
// Messages
|
|
131
|
+
lines.push("## Conversation");
|
|
132
|
+
lines.push("");
|
|
133
|
+
|
|
134
|
+
for (const message of session.messages) {
|
|
135
|
+
const role = message.role === "user" ? "**User**" : "**Claude**";
|
|
136
|
+
lines.push(`### ${role}`);
|
|
137
|
+
lines.push("");
|
|
138
|
+
|
|
139
|
+
for (const block of message.content) {
|
|
140
|
+
this.formatBlock(block, lines);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Tools
|
|
145
|
+
if (session.tools.length > 0) {
|
|
146
|
+
lines.push("## Tool Calls");
|
|
147
|
+
lines.push("");
|
|
148
|
+
|
|
149
|
+
for (const tool of session.tools) {
|
|
150
|
+
lines.push(`### ${tool.toolName}`);
|
|
151
|
+
lines.push("");
|
|
152
|
+
lines.push("**Input:**");
|
|
153
|
+
lines.push("```json");
|
|
154
|
+
lines.push(JSON.stringify(tool.input, null, 2));
|
|
155
|
+
lines.push("```");
|
|
156
|
+
|
|
157
|
+
if (tool.result) {
|
|
158
|
+
lines.push("");
|
|
159
|
+
lines.push(`**Result:**${tool.isError ? " (error)" : ""}`);
|
|
160
|
+
lines.push("```");
|
|
161
|
+
lines.push(tool.result);
|
|
162
|
+
lines.push("```");
|
|
163
|
+
}
|
|
164
|
+
lines.push("");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Metrics
|
|
169
|
+
if (session.metrics.length > 0) {
|
|
170
|
+
lines.push("## Metrics");
|
|
171
|
+
lines.push("");
|
|
172
|
+
|
|
173
|
+
const totalCost = session.metrics.reduce((sum, m) => sum + m.costUSD, 0);
|
|
174
|
+
const totalInput = session.metrics.reduce(
|
|
175
|
+
(sum, m) => sum + m.usage.input_tokens,
|
|
176
|
+
0
|
|
177
|
+
);
|
|
178
|
+
const totalOutput = session.metrics.reduce(
|
|
179
|
+
(sum, m) => sum + m.usage.output_tokens,
|
|
180
|
+
0
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
lines.push(`- **Total Cost:** $${totalCost.toFixed(4)}`);
|
|
184
|
+
lines.push(`- **Total Input Tokens:** ${totalInput.toLocaleString()}`);
|
|
185
|
+
lines.push(`- **Total Output Tokens:** ${totalOutput.toLocaleString()}`);
|
|
186
|
+
lines.push(`- **API Calls:** ${session.metrics.length}`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Checkpoints
|
|
190
|
+
if (session.checkpoints.length > 0) {
|
|
191
|
+
lines.push("");
|
|
192
|
+
lines.push("## Checkpoints");
|
|
193
|
+
lines.push("");
|
|
194
|
+
|
|
195
|
+
for (const cp of session.checkpoints) {
|
|
196
|
+
const date = new Date(cp.timestamp).toISOString();
|
|
197
|
+
lines.push(`- ${cp.label ?? cp.checkpointId} (${date}) - ${cp.messageCount} messages`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return lines.join("\n");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Format a content block for markdown
|
|
206
|
+
*/
|
|
207
|
+
private formatBlock(block: ContentBlock, lines: string[]): void {
|
|
208
|
+
switch (block.type) {
|
|
209
|
+
case "text":
|
|
210
|
+
lines.push(block.text);
|
|
211
|
+
lines.push("");
|
|
212
|
+
break;
|
|
213
|
+
|
|
214
|
+
case "tool_use": {
|
|
215
|
+
const tool = block as ToolUseBlock;
|
|
216
|
+
lines.push(`\`\`\`tool:${tool.name}`);
|
|
217
|
+
lines.push(JSON.stringify(tool.input, null, 2));
|
|
218
|
+
lines.push("```");
|
|
219
|
+
lines.push("");
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
case "tool_result": {
|
|
224
|
+
const result = block as ToolResultBlock;
|
|
225
|
+
lines.push(`**Result**${result.is_error ? " (error)" : ""}:`);
|
|
226
|
+
lines.push("```");
|
|
227
|
+
lines.push(
|
|
228
|
+
typeof result.content === "string"
|
|
229
|
+
? result.content
|
|
230
|
+
: JSON.stringify(result.content, null, 2)
|
|
231
|
+
);
|
|
232
|
+
lines.push("```");
|
|
233
|
+
lines.push("");
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
case "thinking":
|
|
238
|
+
lines.push("> **Thinking**");
|
|
239
|
+
lines.push(`> ${block.thinking.replace(/\n/g, "\n> ")}`);
|
|
240
|
+
lines.push("");
|
|
241
|
+
break;
|
|
242
|
+
|
|
243
|
+
case "image":
|
|
244
|
+
lines.push("*(Image)*");
|
|
245
|
+
lines.push("");
|
|
246
|
+
break;
|
|
247
|
+
|
|
248
|
+
default:
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Format a session summary for display
|
|
255
|
+
*/
|
|
256
|
+
static formatSummary(session: SessionSummary): string {
|
|
257
|
+
const created = new Date(session.created);
|
|
258
|
+
const updated = session.lastActivity
|
|
259
|
+
? new Date(session.lastActivity)
|
|
260
|
+
: new Date(session.updated);
|
|
261
|
+
const age = this.formatRelativeTime(updated);
|
|
262
|
+
|
|
263
|
+
const lines: string[] = [];
|
|
264
|
+
|
|
265
|
+
// Session ID and age
|
|
266
|
+
lines.push(`\x1b[1m${session.id}\x1b[0m (${age})`);
|
|
267
|
+
|
|
268
|
+
// Model and message count
|
|
269
|
+
lines.push(` Model: ${session.model} | Messages: ${session.messageCount}`);
|
|
270
|
+
|
|
271
|
+
// Cost and tokens
|
|
272
|
+
const cost =
|
|
273
|
+
session.totalCost < 0.01
|
|
274
|
+
? `$${session.totalCost.toFixed(4)}`
|
|
275
|
+
: `$${session.totalCost.toFixed(2)}`;
|
|
276
|
+
lines.push(
|
|
277
|
+
` Cost: ${cost} | Tokens: ${session.totalTokens.input.toLocaleString()} in, ${session.totalTokens.output.toLocaleString()} out`
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
// First message preview
|
|
281
|
+
if (session.firstMessage) {
|
|
282
|
+
lines.push(` Preview: ${session.firstMessage}`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Working directory
|
|
286
|
+
lines.push(` Directory: ${session.workingDirectory}`);
|
|
287
|
+
|
|
288
|
+
return lines.join("\n");
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Format relative time
|
|
293
|
+
*/
|
|
294
|
+
static formatRelativeTime(date: Date): string {
|
|
295
|
+
const now = new Date();
|
|
296
|
+
const diffMs = now.getTime() - date.getTime();
|
|
297
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
298
|
+
const diffHours = Math.floor(diffMs / 3600000);
|
|
299
|
+
const diffDays = Math.floor(diffMs / 86400000);
|
|
300
|
+
|
|
301
|
+
if (diffMins < 1) return "just now";
|
|
302
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
303
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
304
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
305
|
+
|
|
306
|
+
return date.toLocaleDateString();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Print sessions list for CLI
|
|
311
|
+
*/
|
|
312
|
+
static printList(sessions: SessionSummary[]): void {
|
|
313
|
+
if (sessions.length === 0) {
|
|
314
|
+
console.log("No sessions found.");
|
|
315
|
+
console.log("\nStart a new conversation to create a session.");
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
console.log(`\x1b[1mRecent Sessions (${sessions.length})\x1b[0m\n`);
|
|
320
|
+
|
|
321
|
+
for (const session of sessions) {
|
|
322
|
+
console.log(this.formatSummary(session));
|
|
323
|
+
console.log("");
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
console.log("To resume a session:");
|
|
327
|
+
console.log(" coder --resume <session-id>");
|
|
328
|
+
}
|
|
329
|
+
}
|