@ebowwa/coder 0.2.1 → 0.7.64
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/README.md +31 -32
- 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 +32 -2
- 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 +167 -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/index.d.ts +480 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +1625 -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/README.md +5 -5
- package/native/index.darwin-arm64.node +0 -0
- package/native/index.node +0 -0
- package/native/package.json +4 -4
- package/package.json +33 -16
- package/packages/src/core/__tests__/permissions.test.ts +1091 -0
- package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -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 +88 -0
- package/packages/src/core/agent-loop/formatters.ts +50 -0
- package/packages/src/core/agent-loop/index.ts +135 -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 +222 -0
- package/packages/src/core/agent-loop/types.ts +148 -0
- package/packages/src/core/agent-loop.ts +18 -0
- package/packages/src/core/api-client-impl.ts +619 -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 +590 -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-loader.ts +324 -0
- package/packages/src/core/context-compaction.ts +578 -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 +430 -0
- package/packages/src/core/normalizers/todo +4 -0
- package/packages/src/core/permissions.ts +431 -0
- package/packages/src/core/retry.ts +170 -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 +1877 -0
- package/packages/src/index.ts +120 -0
- package/packages/src/interfaces/mcp/client.ts +389 -0
- package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
- package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
- package/packages/src/interfaces/ui/index.ts +161 -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/cli/index.ts +228 -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 +71 -0
- package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
- package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
- package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
- package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
- package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
- package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
- package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
- package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
- package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
- package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
- package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
- package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
- package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
- package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
- package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
- package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
- package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
- package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
- package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
- package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
- package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
- package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
- package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
- package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
- package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
- package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
- package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
- package/packages/src/lmdb.db +0 -0
- package/packages/src/lmdb.db-lock +0 -0
- package/packages/src/native/index.ts +2345 -0
- package/packages/src/teammates/index.ts +982 -0
- package/packages/src/types/index.ts +722 -0
- package/dist/cli.js +0 -148
- package/dist/index-0pkak453.js +0 -136
- package/dist/index-0qd0x8b4.js +0 -110
- package/dist/index-0x3kprq6.js +0 -240
- package/dist/index-1eawy937.js +0 -308
- package/dist/index-24m2aygy.js +0 -240
- package/dist/index-29xcjnne.js +0 -280
- package/dist/index-2avyytn5.js +0 -349
- package/dist/index-4ms367ey.js +0 -136
- package/dist/index-4w2t3b0m.js +0 -240
- package/dist/index-4xfgd8nz.js +0 -261
- package/dist/index-5acjp9gc.js +0 -157
- package/dist/index-5s15hr56.js +0 -136
- package/dist/index-6e4wf341.js +0 -349
- package/dist/index-6fvnkedw.js +0 -240
- package/dist/index-6rqpmd4g.js +0 -128
- package/dist/index-77ckwnbm.js +0 -280
- package/dist/index-9knxy49k.js +0 -128
- package/dist/index-9zrnw4zx.js +0 -128
- package/dist/index-bk21w99v.js +0 -280
- package/dist/index-c41n76fv.js +0 -240
- package/dist/index-cb4ppjdt.js +0 -255
- package/dist/index-cfb2edt6.js +0 -240
- package/dist/index-cmfa38hh.js +0 -308
- package/dist/index-datjz8q1.js +0 -257
- package/dist/index-eadf4wvn.js +0 -240
- package/dist/index-em5k0m3z.js +0 -345
- package/dist/index-gh8r333a.js +0 -110
- package/dist/index-gkx6k2tr.js +0 -261
- package/dist/index-h5cabfks.js +0 -155
- package/dist/index-hcrpwyy3.js +0 -261
- package/dist/index-hk7fwwa8.js +0 -257
- package/dist/index-jb8cw7f8.js +0 -136
- package/dist/index-kbyw4th1.js +0 -347
- package/dist/index-kgj5gqnm.js +0 -345
- package/dist/index-mdf6xp1z.js +0 -255
- package/dist/index-mrhv8kvc.js +0 -280
- package/dist/index-mt4743dd.js +0 -161
- package/dist/index-qnwsg97q.js +0 -240
- package/dist/index-qwdy6x44.js +0 -261
- package/dist/index-rmj77261.js +0 -157
- package/dist/index-sbbw1a61.js +0 -349
- package/dist/index-svy5bcpn.js +0 -345
- package/dist/index-tvmy7tm9.js +0 -261
- package/dist/index-tzz4vzkj.js +0 -312
- package/dist/index-vz80zmhe.js +0 -110
- package/dist/index-wed2fk67.js +0 -240
- package/dist/index-wksgzz8e.js +0 -280
- package/dist/index-wn2m4wma.js +0 -240
- package/dist/index-xha05vjc.js +0 -257
- package/dist/index-yc6eh8p8.js +0 -136
- package/dist/index-ycjxx9ft.js +0 -240
- package/dist/index-z0gzd0fc.js +0 -110
- package/dist/index-z8cwtf8j.js +0 -240
- package/dist/index-zy5mtt00.js +0 -128
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Metadata - Manage session metadata and summaries
|
|
3
|
+
*/
|
|
4
|
+
import { SessionPersistence } from "./persistence.js";
|
|
5
|
+
export class SessionMetadataManager {
|
|
6
|
+
persistence;
|
|
7
|
+
constructor(persistence) {
|
|
8
|
+
this.persistence = persistence;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Generate a new session ID
|
|
12
|
+
*/
|
|
13
|
+
generateId() {
|
|
14
|
+
const timestamp = Date.now().toString(36);
|
|
15
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
16
|
+
return `${timestamp}-${random}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create metadata for a new session
|
|
20
|
+
*/
|
|
21
|
+
createMetadata(options) {
|
|
22
|
+
return {
|
|
23
|
+
type: "metadata",
|
|
24
|
+
id: options.id ?? this.generateId(),
|
|
25
|
+
created: Date.now(),
|
|
26
|
+
updated: Date.now(),
|
|
27
|
+
model: options.model,
|
|
28
|
+
workingDirectory: options.workingDirectory,
|
|
29
|
+
agentName: options.agentName,
|
|
30
|
+
agentColor: options.agentColor,
|
|
31
|
+
teamName: options.teamName,
|
|
32
|
+
totalCost: 0,
|
|
33
|
+
totalTokens: { input: 0, output: 0 },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Update metadata timestamps
|
|
38
|
+
*/
|
|
39
|
+
touch(metadata) {
|
|
40
|
+
return {
|
|
41
|
+
...metadata,
|
|
42
|
+
updated: Date.now(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Merge updated fields into metadata
|
|
47
|
+
*/
|
|
48
|
+
merge(metadata, updates) {
|
|
49
|
+
return {
|
|
50
|
+
...metadata,
|
|
51
|
+
...updates,
|
|
52
|
+
updated: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get summary from session entries
|
|
57
|
+
*/
|
|
58
|
+
async getSummary(sessionId) {
|
|
59
|
+
const entries = await this.persistence.read(sessionId);
|
|
60
|
+
return this.entriesToSummary(sessionId, entries);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert entries to summary
|
|
64
|
+
*/
|
|
65
|
+
entriesToSummary(sessionId, entries) {
|
|
66
|
+
let metadata = null;
|
|
67
|
+
let messageCount = 0;
|
|
68
|
+
let totalCost = 0;
|
|
69
|
+
let totalInput = 0;
|
|
70
|
+
let totalOutput = 0;
|
|
71
|
+
let firstMessage;
|
|
72
|
+
let lastActivity;
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
// All entries have a type field now
|
|
75
|
+
if ("type" in entry) {
|
|
76
|
+
switch (entry.type) {
|
|
77
|
+
case "metadata":
|
|
78
|
+
metadata = entry;
|
|
79
|
+
break;
|
|
80
|
+
case "message":
|
|
81
|
+
messageCount++;
|
|
82
|
+
lastActivity = entry.timestamp;
|
|
83
|
+
const msg = entry.data;
|
|
84
|
+
if (!firstMessage && msg.role === "user") {
|
|
85
|
+
const textBlock = msg.content.find((b) => b.type === "text");
|
|
86
|
+
if (textBlock && "text" in textBlock) {
|
|
87
|
+
firstMessage = textBlock.text.slice(0, 100);
|
|
88
|
+
if (textBlock.text.length > 100) {
|
|
89
|
+
firstMessage += "...";
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case "metrics":
|
|
95
|
+
const metrics = entry.data;
|
|
96
|
+
totalCost += metrics.costUSD;
|
|
97
|
+
totalInput += metrics.usage.input_tokens;
|
|
98
|
+
totalOutput += metrics.usage.output_tokens;
|
|
99
|
+
lastActivity = entry.timestamp;
|
|
100
|
+
break;
|
|
101
|
+
case "tool_use":
|
|
102
|
+
case "context":
|
|
103
|
+
case "checkpoint":
|
|
104
|
+
lastActivity = entry.timestamp;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!metadata) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
id: sessionId,
|
|
114
|
+
created: metadata.created,
|
|
115
|
+
updated: metadata.updated,
|
|
116
|
+
lastActivity,
|
|
117
|
+
model: metadata.model,
|
|
118
|
+
messageCount,
|
|
119
|
+
totalCost,
|
|
120
|
+
totalTokens: { input: totalInput, output: totalOutput },
|
|
121
|
+
firstMessage,
|
|
122
|
+
workingDirectory: metadata.workingDirectory,
|
|
123
|
+
metadata: {
|
|
124
|
+
agentName: metadata.agentName,
|
|
125
|
+
agentColor: metadata.agentColor,
|
|
126
|
+
teamName: metadata.teamName,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Filter sessions based on criteria
|
|
132
|
+
*/
|
|
133
|
+
filterSessions(sessions, filter) {
|
|
134
|
+
return sessions.filter((session) => {
|
|
135
|
+
// Filter by model
|
|
136
|
+
if (filter.model && session.model !== filter.model) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
// Filter by working directory
|
|
140
|
+
if (filter.workingDirectory &&
|
|
141
|
+
session.workingDirectory !== filter.workingDirectory) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Filter by minimum messages
|
|
145
|
+
if (filter.minMessages && session.messageCount < filter.minMessages) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
// Filter by age (maxAge = maximum age in ms)
|
|
149
|
+
if (filter.maxAge) {
|
|
150
|
+
const age = Date.now() - session.created;
|
|
151
|
+
if (age > filter.maxAge) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Filter by timestamp (since = minimum created timestamp)
|
|
156
|
+
if (filter.since && session.created < filter.since) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Sort sessions by various criteria
|
|
164
|
+
*/
|
|
165
|
+
sortSessions(sessions, sortBy = "lastActivity", order = "desc") {
|
|
166
|
+
return [...sessions].sort((a, b) => {
|
|
167
|
+
let comparison = 0;
|
|
168
|
+
switch (sortBy) {
|
|
169
|
+
case "created":
|
|
170
|
+
comparison = a.created - b.created;
|
|
171
|
+
break;
|
|
172
|
+
case "updated":
|
|
173
|
+
comparison = a.updated - b.updated;
|
|
174
|
+
break;
|
|
175
|
+
case "lastActivity":
|
|
176
|
+
comparison = (a.lastActivity ?? a.updated) - (b.lastActivity ?? b.updated);
|
|
177
|
+
break;
|
|
178
|
+
case "messageCount":
|
|
179
|
+
comparison = a.messageCount - b.messageCount;
|
|
180
|
+
break;
|
|
181
|
+
case "cost":
|
|
182
|
+
comparison = a.totalCost - b.totalCost;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
return order === "desc" ? -comparison : comparison;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Find empty sessions (no messages)
|
|
190
|
+
*/
|
|
191
|
+
findEmptySessions(sessions) {
|
|
192
|
+
return sessions.filter((s) => s.messageCount === 0);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Find sessions by partial ID match
|
|
196
|
+
*/
|
|
197
|
+
findById(sessions, partialId) {
|
|
198
|
+
return sessions.find((s) => s.id.startsWith(partialId) || s.id.includes(partialId));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get unique models from sessions
|
|
202
|
+
*/
|
|
203
|
+
getUniqueModels(sessions) {
|
|
204
|
+
const models = new Set(sessions.map((s) => s.model));
|
|
205
|
+
return [...models].sort();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get unique working directories from sessions
|
|
209
|
+
*/
|
|
210
|
+
getUniqueDirectories(sessions) {
|
|
211
|
+
const dirs = new Set(sessions.map((s) => s.workingDirectory));
|
|
212
|
+
return [...dirs].sort();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Calculate aggregate statistics
|
|
216
|
+
*/
|
|
217
|
+
calculateStats(sessions) {
|
|
218
|
+
const totalSessions = sessions.length;
|
|
219
|
+
const totalMessages = sessions.reduce((sum, s) => sum + s.messageCount, 0);
|
|
220
|
+
const totalCost = sessions.reduce((sum, s) => sum + s.totalCost, 0);
|
|
221
|
+
const totalInputTokens = sessions.reduce((sum, s) => sum + s.totalTokens.input, 0);
|
|
222
|
+
const totalOutputTokens = sessions.reduce((sum, s) => sum + s.totalTokens.output, 0);
|
|
223
|
+
return {
|
|
224
|
+
totalSessions,
|
|
225
|
+
totalMessages,
|
|
226
|
+
totalCost,
|
|
227
|
+
totalInputTokens,
|
|
228
|
+
totalOutputTokens,
|
|
229
|
+
averageMessagesPerSession: totalSessions > 0 ? totalMessages / totalSessions : 0,
|
|
230
|
+
averageCostPerSession: totalSessions > 0 ? totalCost / totalSessions : 0,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Persistence - File operations for session storage
|
|
3
|
+
* Handles JSONL file I/O with atomic writes and queue management
|
|
4
|
+
*/
|
|
5
|
+
import type { SessionEntry, SessionMetadata, ISessionPersistence } from "./types.js";
|
|
6
|
+
export declare class SessionPersistence implements ISessionPersistence {
|
|
7
|
+
private sessionsDir;
|
|
8
|
+
private writeQueues;
|
|
9
|
+
constructor(sessionsDir?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Get the sessions directory path
|
|
12
|
+
*/
|
|
13
|
+
getSessionsDir(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get the file path for a session
|
|
16
|
+
*/
|
|
17
|
+
getSessionPath(sessionId: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the sessions directory
|
|
20
|
+
*/
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a session file exists
|
|
24
|
+
*/
|
|
25
|
+
exists(sessionId: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Read all entries from a session file
|
|
28
|
+
*/
|
|
29
|
+
read(sessionId: string): Promise<SessionEntry[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Append an entry to a session file (queued for atomic writes)
|
|
32
|
+
*/
|
|
33
|
+
append(sessionId: string, entry: SessionEntry | SessionMetadata): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Write all entries to a session file (replaces existing)
|
|
36
|
+
*/
|
|
37
|
+
writeAll(sessionId: string, entries: SessionEntry[]): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete a session file
|
|
40
|
+
*/
|
|
41
|
+
delete(sessionId: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* List all session files in the directory
|
|
44
|
+
*/
|
|
45
|
+
listFiles(): Promise<string[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Get file stats for a session
|
|
48
|
+
*/
|
|
49
|
+
getStats(sessionId: string): Promise<{
|
|
50
|
+
exists: boolean;
|
|
51
|
+
size: number;
|
|
52
|
+
mtime: Date | null;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Get modification times for multiple sessions
|
|
56
|
+
*/
|
|
57
|
+
getModificationTimes(sessionIds: string[]): Promise<Map<string, Date>>;
|
|
58
|
+
/**
|
|
59
|
+
* Read the first line (metadata) of a session file
|
|
60
|
+
*/
|
|
61
|
+
readMetadata(sessionId: string): Promise<SessionMetadata | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Read the last N entries from a session file
|
|
64
|
+
*/
|
|
65
|
+
readLast(sessionId: string, count: number): Promise<SessionEntry[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Count entries in a session file
|
|
68
|
+
*/
|
|
69
|
+
countEntries(sessionId: string): Promise<number>;
|
|
70
|
+
}
|
|
71
|
+
export declare function getSessionPersistence(sessionsDir?: string): SessionPersistence;
|
|
72
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../packages/src/core/sessions/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAyC;gBAEhD,WAAW,CAAC,EAAE,MAAM;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2BtD;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,GAAG,eAAe,GACpC,OAAO,CAAC,IAAI,CAAC;IAyBhB;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzE;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBjD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYpC;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACzC,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;KACpB,CAAC;IAiBF;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAe5E;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAatE;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKzE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIvD;AAKD,wBAAgB,qBAAqB,CACnC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB,CAKpB"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Persistence - File operations for session storage
|
|
3
|
+
* Handles JSONL file I/O with atomic writes and queue management
|
|
4
|
+
*/
|
|
5
|
+
import { homedir } from "os";
|
|
6
|
+
import { join } from "path";
|
|
7
|
+
export class SessionPersistence {
|
|
8
|
+
sessionsDir;
|
|
9
|
+
writeQueues = new Map();
|
|
10
|
+
constructor(sessionsDir) {
|
|
11
|
+
this.sessionsDir = sessionsDir ?? join(homedir(), ".claude", "sessions");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the sessions directory path
|
|
15
|
+
*/
|
|
16
|
+
getSessionsDir() {
|
|
17
|
+
return this.sessionsDir;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the file path for a session
|
|
21
|
+
*/
|
|
22
|
+
getSessionPath(sessionId) {
|
|
23
|
+
return join(this.sessionsDir, `${sessionId}.jsonl`);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the sessions directory
|
|
27
|
+
*/
|
|
28
|
+
async init() {
|
|
29
|
+
try {
|
|
30
|
+
await Bun.write(join(this.sessionsDir, ".gitkeep"), "");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Directory might already exist
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a session file exists
|
|
38
|
+
*/
|
|
39
|
+
async exists(sessionId) {
|
|
40
|
+
const file = Bun.file(this.getSessionPath(sessionId));
|
|
41
|
+
return file.exists();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read all entries from a session file
|
|
45
|
+
*/
|
|
46
|
+
async read(sessionId) {
|
|
47
|
+
const sessionFile = this.getSessionPath(sessionId);
|
|
48
|
+
try {
|
|
49
|
+
const content = await Bun.file(sessionFile).text();
|
|
50
|
+
if (!content) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const entries = [];
|
|
54
|
+
const lines = content.trim().split("\n");
|
|
55
|
+
for (const line of lines) {
|
|
56
|
+
if (!line.trim())
|
|
57
|
+
continue;
|
|
58
|
+
try {
|
|
59
|
+
entries.push(JSON.parse(line));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Skip malformed lines
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return entries;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Append an entry to a session file (queued for atomic writes)
|
|
73
|
+
*/
|
|
74
|
+
async append(sessionId, entry) {
|
|
75
|
+
const sessionFile = this.getSessionPath(sessionId);
|
|
76
|
+
// Queue writes per session to ensure order
|
|
77
|
+
const existingQueue = this.writeQueues.get(sessionId) || Promise.resolve();
|
|
78
|
+
const newQueue = existingQueue.then(async () => {
|
|
79
|
+
const line = JSON.stringify(entry) + "\n";
|
|
80
|
+
const file = Bun.file(sessionFile);
|
|
81
|
+
const existing = (await file.exists()) ? await file.text() : "";
|
|
82
|
+
await Bun.write(sessionFile, existing + line);
|
|
83
|
+
});
|
|
84
|
+
this.writeQueues.set(sessionId, newQueue);
|
|
85
|
+
try {
|
|
86
|
+
await newQueue;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
// Clean up completed queue
|
|
90
|
+
if (this.writeQueues.get(sessionId) === newQueue) {
|
|
91
|
+
this.writeQueues.delete(sessionId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Write all entries to a session file (replaces existing)
|
|
97
|
+
*/
|
|
98
|
+
async writeAll(sessionId, entries) {
|
|
99
|
+
const sessionFile = this.getSessionPath(sessionId);
|
|
100
|
+
const content = entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
|
|
101
|
+
await Bun.write(sessionFile, content);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Delete a session file
|
|
105
|
+
*/
|
|
106
|
+
async delete(sessionId) {
|
|
107
|
+
const sessionFile = this.getSessionPath(sessionId);
|
|
108
|
+
try {
|
|
109
|
+
const file = Bun.file(sessionFile);
|
|
110
|
+
if (await file.exists()) {
|
|
111
|
+
const { unlink } = await import("fs/promises");
|
|
112
|
+
await unlink(sessionFile);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* List all session files in the directory
|
|
123
|
+
*/
|
|
124
|
+
async listFiles() {
|
|
125
|
+
await this.init();
|
|
126
|
+
try {
|
|
127
|
+
const glob = new Bun.Glob("*.jsonl");
|
|
128
|
+
const files = [...glob.scanSync(this.sessionsDir)];
|
|
129
|
+
return files.map((f) => f.replace(".jsonl", ""));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get file stats for a session
|
|
137
|
+
*/
|
|
138
|
+
async getStats(sessionId) {
|
|
139
|
+
const sessionFile = this.getSessionPath(sessionId);
|
|
140
|
+
try {
|
|
141
|
+
const file = Bun.file(sessionFile);
|
|
142
|
+
const stat = await file.stat();
|
|
143
|
+
return {
|
|
144
|
+
exists: true,
|
|
145
|
+
size: stat?.size ?? 0,
|
|
146
|
+
mtime: stat?.mtime ?? null,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return { exists: false, size: 0, mtime: null };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get modification times for multiple sessions
|
|
155
|
+
*/
|
|
156
|
+
async getModificationTimes(sessionIds) {
|
|
157
|
+
const times = new Map();
|
|
158
|
+
await Promise.all(sessionIds.map(async (id) => {
|
|
159
|
+
const stats = await this.getStats(id);
|
|
160
|
+
if (stats.exists && stats.mtime) {
|
|
161
|
+
times.set(id, stats.mtime);
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
return times;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Read the first line (metadata) of a session file
|
|
168
|
+
*/
|
|
169
|
+
async readMetadata(sessionId) {
|
|
170
|
+
const entries = await this.read(sessionId);
|
|
171
|
+
for (const entry of entries) {
|
|
172
|
+
// Metadata has explicit type field now
|
|
173
|
+
if ("type" in entry && entry.type === "metadata") {
|
|
174
|
+
return entry;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Read the last N entries from a session file
|
|
181
|
+
*/
|
|
182
|
+
async readLast(sessionId, count) {
|
|
183
|
+
const entries = await this.read(sessionId);
|
|
184
|
+
return entries.slice(-count);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Count entries in a session file
|
|
188
|
+
*/
|
|
189
|
+
async countEntries(sessionId) {
|
|
190
|
+
const entries = await this.read(sessionId);
|
|
191
|
+
return entries.length;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Singleton instance for convenience
|
|
195
|
+
let defaultPersistence = null;
|
|
196
|
+
export function getSessionPersistence(sessionsDir) {
|
|
197
|
+
if (!defaultPersistence) {
|
|
198
|
+
defaultPersistence = new SessionPersistence(sessionsDir);
|
|
199
|
+
}
|
|
200
|
+
return defaultPersistence;
|
|
201
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Types - All type definitions for session handling
|
|
3
|
+
*/
|
|
4
|
+
import type { Message, QueryMetrics } from "../../types/index.js";
|
|
5
|
+
export interface SessionMetadata {
|
|
6
|
+
type: "metadata";
|
|
7
|
+
id: string;
|
|
8
|
+
created: number;
|
|
9
|
+
updated: number;
|
|
10
|
+
model: string;
|
|
11
|
+
workingDirectory: string;
|
|
12
|
+
agentName?: string;
|
|
13
|
+
agentColor?: string;
|
|
14
|
+
teamName?: string;
|
|
15
|
+
totalCost?: number;
|
|
16
|
+
totalTokens?: {
|
|
17
|
+
input: number;
|
|
18
|
+
output: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface SessionMessage {
|
|
22
|
+
type: "message";
|
|
23
|
+
timestamp: number;
|
|
24
|
+
data: Message;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionToolUse {
|
|
27
|
+
type: "tool_use";
|
|
28
|
+
timestamp: number;
|
|
29
|
+
toolId: string;
|
|
30
|
+
toolName: string;
|
|
31
|
+
input: Record<string, unknown>;
|
|
32
|
+
result?: string;
|
|
33
|
+
isError?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface SessionMetrics {
|
|
36
|
+
type: "metrics";
|
|
37
|
+
timestamp: number;
|
|
38
|
+
data: QueryMetrics;
|
|
39
|
+
}
|
|
40
|
+
export interface SessionContext {
|
|
41
|
+
type: "context";
|
|
42
|
+
timestamp: number;
|
|
43
|
+
workingDirectory: string;
|
|
44
|
+
gitBranch?: string;
|
|
45
|
+
systemPrompt?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface SessionCheckpoint {
|
|
48
|
+
type: "checkpoint";
|
|
49
|
+
timestamp: number;
|
|
50
|
+
checkpointId: string;
|
|
51
|
+
label?: string;
|
|
52
|
+
messageCount: number;
|
|
53
|
+
}
|
|
54
|
+
export type SessionEntry = SessionMetadata | SessionMessage | SessionToolUse | SessionMetrics | SessionContext | SessionCheckpoint;
|
|
55
|
+
export interface LoadedSession {
|
|
56
|
+
metadata: SessionMetadata;
|
|
57
|
+
messages: Message[];
|
|
58
|
+
tools: SessionToolUse[];
|
|
59
|
+
metrics: QueryMetrics[];
|
|
60
|
+
context: SessionContext | null;
|
|
61
|
+
checkpoints: SessionCheckpoint[];
|
|
62
|
+
}
|
|
63
|
+
export interface SessionSummary {
|
|
64
|
+
id: string;
|
|
65
|
+
created: number;
|
|
66
|
+
updated: number;
|
|
67
|
+
lastActivity?: number;
|
|
68
|
+
model: string;
|
|
69
|
+
messageCount: number;
|
|
70
|
+
totalCost: number;
|
|
71
|
+
totalTokens: {
|
|
72
|
+
input: number;
|
|
73
|
+
output: number;
|
|
74
|
+
};
|
|
75
|
+
firstMessage?: string;
|
|
76
|
+
workingDirectory: string;
|
|
77
|
+
metadata?: Record<string, unknown>;
|
|
78
|
+
agentName?: string;
|
|
79
|
+
agentColor?: string;
|
|
80
|
+
teamName?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface SessionFilter {
|
|
83
|
+
model?: string;
|
|
84
|
+
workingDirectory?: string;
|
|
85
|
+
minMessages?: number;
|
|
86
|
+
maxAge?: number;
|
|
87
|
+
since?: number;
|
|
88
|
+
}
|
|
89
|
+
export type SessionEventType = "created" | "resumed" | "message_saved" | "metrics_saved" | "checkpoint_created" | "deleted";
|
|
90
|
+
export interface SessionEvent {
|
|
91
|
+
type: SessionEventType;
|
|
92
|
+
sessionId: string;
|
|
93
|
+
timestamp: number;
|
|
94
|
+
data?: unknown;
|
|
95
|
+
}
|
|
96
|
+
export type SessionEventHandler = (event: SessionEvent) => void | Promise<void>;
|
|
97
|
+
export interface ISessionPersistence {
|
|
98
|
+
init(): Promise<void>;
|
|
99
|
+
read(sessionId: string): Promise<SessionEntry[]>;
|
|
100
|
+
append(sessionId: string, entry: SessionEntry | SessionMetadata): Promise<void>;
|
|
101
|
+
delete(sessionId: string): Promise<boolean>;
|
|
102
|
+
exists(sessionId: string): Promise<boolean>;
|
|
103
|
+
listFiles(): Promise<string[]>;
|
|
104
|
+
}
|
|
105
|
+
export type ExportFormat = "jsonl" | "json" | "markdown";
|
|
106
|
+
export interface ISessionExporter {
|
|
107
|
+
export(session: LoadedSession, format: ExportFormat): string;
|
|
108
|
+
exportToFile(sessionId: string, format: ExportFormat, outputPath?: string): Promise<string>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../packages/src/core/sessions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming text highlighter for code blocks and diffs
|
|
3
|
+
* Buffers text and highlights as content completes during streaming output
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Creates a streaming highlighter that detects and highlights code blocks
|
|
7
|
+
* and diffs as they complete during streaming output.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createStreamHighlighter(): {
|
|
10
|
+
process: (text: string) => string;
|
|
11
|
+
flush: () => string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Highlight complete text with code blocks
|
|
15
|
+
* Used for non-streaming contexts or final output
|
|
16
|
+
*/
|
|
17
|
+
export declare function highlightTextWithCodeBlocks(text: string): string;
|
|
18
|
+
//# sourceMappingURL=stream-highlighter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-highlighter.d.ts","sourceRoot":"","sources":["../../packages/src/core/stream-highlighter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA02BH;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,CAiLA;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuDhE"}
|