@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,151 @@
|
|
|
1
|
+
/** @jsx React.createElement */
|
|
2
|
+
/**
|
|
3
|
+
* Message Store - Centralized message state management
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for all messages in the TUI.
|
|
6
|
+
* Replaces the fragmented message handling with a clean, * append-only store with efficient updates.
|
|
7
|
+
*/
|
|
8
|
+
import React, { createContext, useContext, useState, useCallback, useRef } from "react";
|
|
9
|
+
// ============================================
|
|
10
|
+
// CONTEXT
|
|
11
|
+
// ============================================
|
|
12
|
+
const MessageStoreContext = createContext(null);
|
|
13
|
+
export function useMessageStore() {
|
|
14
|
+
const ctx = useContext(MessageStoreContext);
|
|
15
|
+
if (!ctx) {
|
|
16
|
+
throw new Error("useMessageStore must be used within MessageStoreProvider");
|
|
17
|
+
}
|
|
18
|
+
return ctx;
|
|
19
|
+
}
|
|
20
|
+
let globalMessageId = 0;
|
|
21
|
+
function generateId() {
|
|
22
|
+
globalMessageId += 1;
|
|
23
|
+
return `msg-${globalMessageId}-${Date.now()}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract text content from API message content blocks
|
|
27
|
+
*/
|
|
28
|
+
function extractTextContent(content) {
|
|
29
|
+
if (typeof content === "string") {
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
32
|
+
return content.map((block) => {
|
|
33
|
+
switch (block.type) {
|
|
34
|
+
case "text":
|
|
35
|
+
return block.text;
|
|
36
|
+
case "tool_use":
|
|
37
|
+
return `[Tool: ${block.name}]\n${JSON.stringify(block.input, null, 2)}`;
|
|
38
|
+
case "tool_result": {
|
|
39
|
+
const resultContent = typeof block.content === "string"
|
|
40
|
+
? block.content
|
|
41
|
+
: extractTextContent(block.content);
|
|
42
|
+
const prefix = block.is_error ? "[Tool Error]" : "[Tool Result]";
|
|
43
|
+
const truncated = resultContent.length > 500
|
|
44
|
+
? resultContent.slice(0, 500) + "..."
|
|
45
|
+
: resultContent;
|
|
46
|
+
return `${prefix}\n${truncated}`;
|
|
47
|
+
}
|
|
48
|
+
case "thinking":
|
|
49
|
+
return `[Thinking]\n${block.thinking}`;
|
|
50
|
+
case "redacted_thinking":
|
|
51
|
+
return "[Redacted Thinking]";
|
|
52
|
+
case "image":
|
|
53
|
+
return "[Image]";
|
|
54
|
+
default:
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
}).join("\n\n");
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Convert API message to UI message
|
|
61
|
+
*/
|
|
62
|
+
function apiToUi(msg) {
|
|
63
|
+
const content = extractTextContent(msg.content);
|
|
64
|
+
if (!content)
|
|
65
|
+
return null;
|
|
66
|
+
return {
|
|
67
|
+
id: generateId(),
|
|
68
|
+
role: msg.role,
|
|
69
|
+
content,
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export function MessageStoreProvider({ children, initialMessages = [], }) {
|
|
74
|
+
const [messages, setMessages] = useState(() => {
|
|
75
|
+
// Convert initial API messages to UI messages
|
|
76
|
+
return initialMessages
|
|
77
|
+
.map(apiToUi)
|
|
78
|
+
.filter((m) => m !== null);
|
|
79
|
+
});
|
|
80
|
+
const [apiMessages, setApiMessages] = useState(initialMessages);
|
|
81
|
+
const [tokenCount, setTokenCount] = useState(0);
|
|
82
|
+
// Track pending user messages that were added manually (to skip in addApiMessages)
|
|
83
|
+
const pendingUserMessagesRef = useRef(new Set());
|
|
84
|
+
const addMessage = useCallback((msg) => {
|
|
85
|
+
const id = generateId();
|
|
86
|
+
const fullMsg = {
|
|
87
|
+
...msg,
|
|
88
|
+
id,
|
|
89
|
+
timestamp: Date.now(),
|
|
90
|
+
};
|
|
91
|
+
setMessages((prev) => [...prev, fullMsg]);
|
|
92
|
+
// Track user messages that were added manually
|
|
93
|
+
if (msg.role === "user") {
|
|
94
|
+
pendingUserMessagesRef.current.add(msg.content);
|
|
95
|
+
}
|
|
96
|
+
return id;
|
|
97
|
+
}, []);
|
|
98
|
+
const addApiMessages = useCallback((newApiMsgs) => {
|
|
99
|
+
if (newApiMsgs.length === 0)
|
|
100
|
+
return;
|
|
101
|
+
// Update API messages
|
|
102
|
+
setApiMessages((prev) => [...prev, ...newApiMsgs]);
|
|
103
|
+
// Convert API messages to UI messages, skipping user messages that were already added manually
|
|
104
|
+
const newUiMsgs = newApiMsgs
|
|
105
|
+
.map(apiToUi)
|
|
106
|
+
.filter((m) => m !== null)
|
|
107
|
+
.filter((m) => {
|
|
108
|
+
// Skip user messages that were already added manually
|
|
109
|
+
if (m.role === "user" && pendingUserMessagesRef.current.has(m.content)) {
|
|
110
|
+
pendingUserMessagesRef.current.delete(m.content); // Clean up
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
});
|
|
115
|
+
if (newUiMsgs.length > 0) {
|
|
116
|
+
setMessages((prev) => [...prev, ...newUiMsgs]);
|
|
117
|
+
}
|
|
118
|
+
}, []);
|
|
119
|
+
const addSystem = useCallback((content, subType, toolName, isError) => {
|
|
120
|
+
return addMessage({
|
|
121
|
+
role: "system",
|
|
122
|
+
content,
|
|
123
|
+
subType,
|
|
124
|
+
toolName,
|
|
125
|
+
isError,
|
|
126
|
+
});
|
|
127
|
+
}, [addMessage]);
|
|
128
|
+
const clear = useCallback(() => {
|
|
129
|
+
setMessages([]);
|
|
130
|
+
setApiMessages([]);
|
|
131
|
+
pendingUserMessagesRef.current.clear();
|
|
132
|
+
}, []);
|
|
133
|
+
const replace = useCallback((ui, api) => {
|
|
134
|
+
setMessages(ui);
|
|
135
|
+
setApiMessages(api);
|
|
136
|
+
pendingUserMessagesRef.current.clear();
|
|
137
|
+
}, []);
|
|
138
|
+
const value = {
|
|
139
|
+
messages,
|
|
140
|
+
apiMessages,
|
|
141
|
+
addMessage,
|
|
142
|
+
addApiMessages,
|
|
143
|
+
addSystem,
|
|
144
|
+
clear,
|
|
145
|
+
replace,
|
|
146
|
+
tokenCount,
|
|
147
|
+
setTokenCount,
|
|
148
|
+
};
|
|
149
|
+
return (React.createElement(MessageStoreContext.Provider, { value: value }, children));
|
|
150
|
+
}
|
|
151
|
+
export default MessageStoreContext;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @jsx React.createElement */
|
|
2
|
+
/**
|
|
3
|
+
* Status Bar Component - Simple plain text
|
|
4
|
+
*/
|
|
5
|
+
import React from "react";
|
|
6
|
+
import type { StatusBarProps } from "./types.js";
|
|
7
|
+
export declare function StatusBar({ permissionMode, tokensUsed, model, isLoading, spinnerFrame, }: StatusBarProps): React.JSX.Element;
|
|
8
|
+
export default StatusBar;
|
|
9
|
+
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/StatusBar.tsx"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAajD,wBAAgB,SAAS,CAAC,EACxB,cAAc,EACd,UAAU,EACV,KAAK,EACL,SAAS,EACT,YAAY,GACb,EAAE,cAAc,qBAyBhB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** @jsx React.createElement */
|
|
2
|
+
/**
|
|
3
|
+
* Status Bar Component - Simple plain text
|
|
4
|
+
*/
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { Text } from "ink";
|
|
7
|
+
import { calculateContextInfo, getPermissionModeDisplay } from "../shared/status-line.js";
|
|
8
|
+
function formatTokens(tokens) {
|
|
9
|
+
if (tokens < 1000) {
|
|
10
|
+
return `${tokens}`;
|
|
11
|
+
}
|
|
12
|
+
else if (tokens < 100000) {
|
|
13
|
+
return `${(tokens / 1000).toFixed(1)}k`;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return `${(tokens / 1000).toFixed(0)}k`;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function StatusBar({ permissionMode, tokensUsed, model, isLoading, spinnerFrame, }) {
|
|
20
|
+
const contextInfo = calculateContextInfo(tokensUsed, model);
|
|
21
|
+
const permDisplay = getPermissionModeDisplay(permissionMode);
|
|
22
|
+
const parts = [];
|
|
23
|
+
if (isLoading) {
|
|
24
|
+
parts.push(spinnerFrame);
|
|
25
|
+
}
|
|
26
|
+
const percentColor = contextInfo.isCritical
|
|
27
|
+
? "red"
|
|
28
|
+
: contextInfo.isLow
|
|
29
|
+
? "yellow"
|
|
30
|
+
: undefined;
|
|
31
|
+
const contextDisplay = `Context: ${contextInfo.percentRemaining.toFixed(0)}% (${formatTokens(tokensUsed)})`;
|
|
32
|
+
parts.push(contextDisplay);
|
|
33
|
+
parts.push(`${permDisplay.symbol} ${permDisplay.label}`);
|
|
34
|
+
return (React.createElement(Text, { dimColor: percentColor === undefined, color: percentColor }, parts.join(" | ")));
|
|
35
|
+
}
|
|
36
|
+
export default StatusBar;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI Commands
|
|
3
|
+
* Command handlers for slash commands in the TUI
|
|
4
|
+
*/
|
|
5
|
+
import type { CommandContext } from "./types.js";
|
|
6
|
+
import { type HelpSection } from "./HelpPanel.js";
|
|
7
|
+
/**
|
|
8
|
+
* Get help text for commands
|
|
9
|
+
* @param section - Optional section to display
|
|
10
|
+
*/
|
|
11
|
+
export declare function getHelpText(section?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Get all help sections
|
|
14
|
+
*/
|
|
15
|
+
export declare function getHelpSections(): HelpSection[];
|
|
16
|
+
/**
|
|
17
|
+
* Handle a slash command
|
|
18
|
+
* Returns true if the command was handled
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleCommand(cmd: string, context: CommandContext): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,YAAY,CAAC;AAO5D,OAAO,EAA2D,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK3G;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAQ/C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA6X1F"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI Commands
|
|
3
|
+
* Command handlers for slash commands in the TUI
|
|
4
|
+
*/
|
|
5
|
+
import { createCheckpoint, registerCheckpoint, restoreCheckpoint, applyCheckpoint, listCheckpoints, undoCheckpoint, redoCheckpoint, getNavigationStatus, getCheckpointSummary, formatCheckpoint, } from "../../../../core/checkpoints.js";
|
|
6
|
+
import { formatCost } from "../../../../core/api-client.js";
|
|
7
|
+
import { VERSION as CODER_VERSION, getContextWindow } from "../shared/status-line.js";
|
|
8
|
+
import { AVAILABLE_MODELS, getContextWindow as getModelContextWindow, getMaxOutput, } from "../../../../core/models.js";
|
|
9
|
+
import { getHelpText as getSectionedHelpText, getCompactHelpText } from "./HelpPanel.js";
|
|
10
|
+
// Debug mode state (module-level)
|
|
11
|
+
let debugMode = false;
|
|
12
|
+
/**
|
|
13
|
+
* Get help text for commands
|
|
14
|
+
* @param section - Optional section to display
|
|
15
|
+
*/
|
|
16
|
+
export function getHelpText(section) {
|
|
17
|
+
return getSectionedHelpText(section);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get all help sections
|
|
21
|
+
*/
|
|
22
|
+
export function getHelpSections() {
|
|
23
|
+
return [
|
|
24
|
+
{ id: "general", title: "general", content: "" },
|
|
25
|
+
{ id: "commands", title: "commands", content: "" },
|
|
26
|
+
{ id: "checkpoints", title: "checkpoints", content: "" },
|
|
27
|
+
{ id: "custom", title: "custom-commands", content: "" },
|
|
28
|
+
{ id: "keybindings", title: "keybindings", content: "" },
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle a slash command
|
|
33
|
+
* Returns true if the command was handled
|
|
34
|
+
*/
|
|
35
|
+
export async function handleCommand(cmd, context) {
|
|
36
|
+
const parts = cmd.slice(1).split(" ");
|
|
37
|
+
const command = parts[0]?.toLowerCase();
|
|
38
|
+
const rest = parts.slice(1).join(" ");
|
|
39
|
+
const { sessionId, setSessionId, model, setModel, apiMessages, setApiMessages, setMessages, processedCountRef, totalCost, setTotalCost, totalTokens, setTotalTokens, permissionMode, tools, workingDirectory, sessionStore, addSystemMessage, messagesLength, onExit, exit, setSessionSelectMode, setSelectableSessions, helpMode, setHelpMode, helpSection, setHelpSection, } = context;
|
|
40
|
+
switch (command) {
|
|
41
|
+
case "exit":
|
|
42
|
+
case "quit":
|
|
43
|
+
case "q":
|
|
44
|
+
onExit();
|
|
45
|
+
exit();
|
|
46
|
+
return true;
|
|
47
|
+
case "help":
|
|
48
|
+
case "?":
|
|
49
|
+
// If section specified, show that section; otherwise enter help mode
|
|
50
|
+
if (rest) {
|
|
51
|
+
addSystemMessage(getHelpText(rest));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Enter interactive help mode
|
|
55
|
+
setHelpMode(true);
|
|
56
|
+
setHelpSection(0);
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
case "keybindings":
|
|
60
|
+
case "keys":
|
|
61
|
+
addSystemMessage(getHelpText("keybindings"));
|
|
62
|
+
return true;
|
|
63
|
+
case "clear":
|
|
64
|
+
setApiMessages([]);
|
|
65
|
+
setMessages([]);
|
|
66
|
+
processedCountRef.current = 0;
|
|
67
|
+
addSystemMessage("Conversation cleared.");
|
|
68
|
+
return true;
|
|
69
|
+
case "new":
|
|
70
|
+
try {
|
|
71
|
+
// Create a new session
|
|
72
|
+
const newSessionId = await sessionStore.createSession({
|
|
73
|
+
model,
|
|
74
|
+
workingDirectory,
|
|
75
|
+
});
|
|
76
|
+
// Clear all state
|
|
77
|
+
setSessionId(newSessionId);
|
|
78
|
+
setApiMessages([]);
|
|
79
|
+
setMessages([]);
|
|
80
|
+
processedCountRef.current = 0;
|
|
81
|
+
setTotalCost(0);
|
|
82
|
+
setTotalTokens(0);
|
|
83
|
+
addSystemMessage(`Started new session: ${newSessionId}`);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
87
|
+
addSystemMessage(`Failed to create new session: ${errorMessage}`);
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
case "compact":
|
|
91
|
+
addSystemMessage("Forcing context compaction...");
|
|
92
|
+
return true;
|
|
93
|
+
case "model":
|
|
94
|
+
if (rest) {
|
|
95
|
+
setModel(rest);
|
|
96
|
+
addSystemMessage(`Switched to model: ${rest}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
addSystemMessage(`Current model: ${model}`);
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
case "tools": {
|
|
103
|
+
const toolList = tools.map((t) => ` ${t.name}: ${t.description.split(".")[0]}`).join("\n");
|
|
104
|
+
addSystemMessage(`Available tools:\n${toolList}`);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
case "cost":
|
|
108
|
+
addSystemMessage(`Total cost: ${formatCost(totalCost)}`);
|
|
109
|
+
return true;
|
|
110
|
+
case "status":
|
|
111
|
+
case "session":
|
|
112
|
+
addSystemMessage(`Session Status:
|
|
113
|
+
ID: ${sessionId}
|
|
114
|
+
Model: ${model}
|
|
115
|
+
Messages: ${apiMessages.length}
|
|
116
|
+
Total cost: ${formatCost(totalCost)}
|
|
117
|
+
Permission mode: ${permissionMode}
|
|
118
|
+
Tokens: ${totalTokens}
|
|
119
|
+
Debug mode: ${debugMode ? "on" : "off"}`);
|
|
120
|
+
return true;
|
|
121
|
+
case "version":
|
|
122
|
+
case "ver":
|
|
123
|
+
addSystemMessage(`Coder v${CODER_VERSION}
|
|
124
|
+
Model: ${model}
|
|
125
|
+
Context: ${getContextWindow(model).toLocaleString()} tokens
|
|
126
|
+
Node: ${process.version}
|
|
127
|
+
Platform: ${process.platform} ${process.arch}`);
|
|
128
|
+
return true;
|
|
129
|
+
case "models":
|
|
130
|
+
const modelList = AVAILABLE_MODELS.map((m) => {
|
|
131
|
+
const contextStr = `${(m.contextWindow / 1000).toFixed(0)}k context`;
|
|
132
|
+
const outputStr = m.maxOutput ? `, ${(m.maxOutput / 1000).toFixed(0)}k output` : "";
|
|
133
|
+
return ` ${m.id.padEnd(22)} ${m.fullName} (${contextStr}${outputStr})`;
|
|
134
|
+
}).join("\n");
|
|
135
|
+
addSystemMessage(`Available models:\n${modelList}\n\nUse /model <id> to switch`);
|
|
136
|
+
return true;
|
|
137
|
+
case "debug":
|
|
138
|
+
debugMode = !debugMode;
|
|
139
|
+
addSystemMessage(`Debug mode: ${debugMode ? "ON" : "OFF"}`);
|
|
140
|
+
return true;
|
|
141
|
+
case "export":
|
|
142
|
+
try {
|
|
143
|
+
const format = (rest || "markdown");
|
|
144
|
+
const outputPath = await sessionStore.exportSession(sessionId, format);
|
|
145
|
+
addSystemMessage(`Session exported to: ${outputPath}`);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
149
|
+
addSystemMessage(`Export failed: ${errorMessage}`);
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
case "checkpoint":
|
|
153
|
+
case "cp":
|
|
154
|
+
if (!rest) {
|
|
155
|
+
addSystemMessage("Usage: /checkpoint <label>\nExample: /checkpoint before-refactor");
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const checkpoint = await createCheckpoint(sessionId, apiMessages, {
|
|
160
|
+
label: rest,
|
|
161
|
+
model,
|
|
162
|
+
workingDirectory,
|
|
163
|
+
totalCost,
|
|
164
|
+
trackFiles: true,
|
|
165
|
+
});
|
|
166
|
+
await registerCheckpoint(sessionId, checkpoint.id);
|
|
167
|
+
const summary = getCheckpointSummary(checkpoint);
|
|
168
|
+
addSystemMessage(`✓ Checkpoint saved: ${formatCheckpoint(checkpoint)}${summary ? `\n ${summary}` : ""}`);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
172
|
+
addSystemMessage(`Failed to create checkpoint: ${errorMessage}`);
|
|
173
|
+
}
|
|
174
|
+
return true;
|
|
175
|
+
case "checkpoints":
|
|
176
|
+
case "cps":
|
|
177
|
+
try {
|
|
178
|
+
const checkpoints = await listCheckpoints(sessionId);
|
|
179
|
+
if (checkpoints.length === 0) {
|
|
180
|
+
addSystemMessage("No checkpoints saved.");
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const list = checkpoints.map((cp) => ` ${formatCheckpoint(cp)}`).join("\n");
|
|
184
|
+
addSystemMessage(`Checkpoints:\n${list}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
189
|
+
addSystemMessage(`Failed to list checkpoints: ${errorMessage}`);
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
case "restore":
|
|
193
|
+
case "rollback":
|
|
194
|
+
case "rewind":
|
|
195
|
+
if (!rest) {
|
|
196
|
+
addSystemMessage("Usage: /restore <checkpoint-id>\nUse /checkpoints to see available checkpoints");
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const checkpointId = rest.trim();
|
|
201
|
+
const checkpoint = await restoreCheckpoint(sessionId, checkpointId);
|
|
202
|
+
if (!checkpoint) {
|
|
203
|
+
addSystemMessage(`Checkpoint not found: ${checkpointId}`);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
// Apply checkpoint without files (for TUI simplicity)
|
|
207
|
+
const result = await applyCheckpoint(checkpoint, {
|
|
208
|
+
restoreFiles: false,
|
|
209
|
+
restoreMessages: true,
|
|
210
|
+
});
|
|
211
|
+
setApiMessages(result.messages);
|
|
212
|
+
processedCountRef.current = result.messages.length;
|
|
213
|
+
setTotalCost(checkpoint.metadata.totalCost);
|
|
214
|
+
addSystemMessage(`✓ Checkpoint restored: ${result.messages.length} messages (no files changed)`);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
218
|
+
addSystemMessage(`Failed to restore checkpoint: ${errorMessage}`);
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
case "restore-chat":
|
|
222
|
+
if (!rest) {
|
|
223
|
+
addSystemMessage("Usage: /restore-chat <checkpoint-id>");
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
const checkpointId = rest.trim();
|
|
228
|
+
const checkpoint = await restoreCheckpoint(sessionId, checkpointId);
|
|
229
|
+
if (!checkpoint) {
|
|
230
|
+
addSystemMessage(`Checkpoint not found: ${checkpointId}`);
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
const result = await applyCheckpoint(checkpoint, {
|
|
234
|
+
restoreFiles: false,
|
|
235
|
+
restoreMessages: true,
|
|
236
|
+
});
|
|
237
|
+
setApiMessages(result.messages);
|
|
238
|
+
processedCountRef.current = result.messages.length;
|
|
239
|
+
setTotalCost(checkpoint.metadata.totalCost);
|
|
240
|
+
addSystemMessage(`✓ Chat restored: ${result.messages.length} messages`);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
244
|
+
addSystemMessage(`Failed to restore chat: ${errorMessage}`);
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
case "undo":
|
|
248
|
+
try {
|
|
249
|
+
const result = await undoCheckpoint(sessionId);
|
|
250
|
+
if (!result.checkpoint) {
|
|
251
|
+
addSystemMessage("Nothing to undo");
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
const applyResult = await applyCheckpoint(result.checkpoint, {
|
|
255
|
+
restoreFiles: false,
|
|
256
|
+
restoreMessages: true,
|
|
257
|
+
});
|
|
258
|
+
setApiMessages(applyResult.messages);
|
|
259
|
+
processedCountRef.current = applyResult.messages.length;
|
|
260
|
+
setTotalCost(result.checkpoint.metadata.totalCost);
|
|
261
|
+
addSystemMessage(`✓ Undone to: ${formatCheckpoint(result.checkpoint)}${result.canRedo ? "\nUse /redo to go forward" : ""}`);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
265
|
+
addSystemMessage(`Undo failed: ${errorMessage}`);
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
case "redo":
|
|
269
|
+
try {
|
|
270
|
+
const result = await redoCheckpoint(sessionId);
|
|
271
|
+
if (!result.checkpoint) {
|
|
272
|
+
addSystemMessage("Nothing to redo");
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
const applyResult = await applyCheckpoint(result.checkpoint, {
|
|
276
|
+
restoreFiles: false,
|
|
277
|
+
restoreMessages: true,
|
|
278
|
+
});
|
|
279
|
+
setApiMessages(applyResult.messages);
|
|
280
|
+
processedCountRef.current = applyResult.messages.length;
|
|
281
|
+
setTotalCost(result.checkpoint.metadata.totalCost);
|
|
282
|
+
addSystemMessage(`✓ Redone to: ${formatCheckpoint(result.checkpoint)}`);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
286
|
+
addSystemMessage(`Redo failed: ${errorMessage}`);
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
case "checkpoint-status":
|
|
290
|
+
case "cps-status":
|
|
291
|
+
try {
|
|
292
|
+
const status = await getNavigationStatus(sessionId);
|
|
293
|
+
addSystemMessage(`Checkpoint Navigation:
|
|
294
|
+
Position: ${status.current}/${status.total}
|
|
295
|
+
Can undo: ${status.canUndo ? "yes" : "no"}
|
|
296
|
+
Can redo: ${status.canRedo ? "yes" : "no"}
|
|
297
|
+
Current: ${status.currentId || "none"}`);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
301
|
+
addSystemMessage(`Failed to get status: ${errorMessage}`);
|
|
302
|
+
}
|
|
303
|
+
return true;
|
|
304
|
+
case "sessions":
|
|
305
|
+
case "resume": {
|
|
306
|
+
try {
|
|
307
|
+
// If ID provided directly, try to resume
|
|
308
|
+
if (rest) {
|
|
309
|
+
const loaded = await sessionStore.resumeSession(rest.trim());
|
|
310
|
+
if (loaded) {
|
|
311
|
+
setApiMessages(loaded.messages);
|
|
312
|
+
processedCountRef.current = loaded.messages.length;
|
|
313
|
+
setMessages([]); // Clear UI messages, will be rebuilt from apiMessages
|
|
314
|
+
const loadedModel = loaded.metadata?.model;
|
|
315
|
+
if (loadedModel)
|
|
316
|
+
setModel(loadedModel);
|
|
317
|
+
const loadedCost = loaded.metadata?.totalCost;
|
|
318
|
+
if (typeof loadedCost === "number")
|
|
319
|
+
setTotalCost(loadedCost);
|
|
320
|
+
const loadedTokens = loaded.metadata?.totalTokens;
|
|
321
|
+
if (typeof loadedTokens === "number")
|
|
322
|
+
setTotalTokens(loadedTokens);
|
|
323
|
+
addSystemMessage(`Resumed session: ${rest.trim()} (${loaded.messages.length} messages)`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
addSystemMessage(`Session not found: ${rest.trim()}`);
|
|
327
|
+
}
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
// Otherwise, list sessions with numbers for selection
|
|
331
|
+
const sessions = await sessionStore.listSessions(15);
|
|
332
|
+
if (sessions.length === 0) {
|
|
333
|
+
addSystemMessage("No recent sessions found.");
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
// Store sessions for selection
|
|
337
|
+
setSelectableSessions(sessions);
|
|
338
|
+
setSessionSelectMode(true);
|
|
339
|
+
const list = sessions.map((s, i) => {
|
|
340
|
+
const id = s.id || "unknown";
|
|
341
|
+
const model = s.metadata?.model || "unknown";
|
|
342
|
+
const msgs = s.messageCount || 0;
|
|
343
|
+
const date = s.lastActivity ? new Date(s.lastActivity).toLocaleDateString() : "unknown";
|
|
344
|
+
return ` ${String(i + 1).padStart(2)}. ${String(id).slice(0, 8)} ${String(model).padEnd(20)} ${String(msgs).padStart(3)} msgs ${date}`;
|
|
345
|
+
}).join("\n");
|
|
346
|
+
addSystemMessage(`Select a session to resume:\n${list}\n\nType the number (1-${sessions.length}) to resume, or any other key to cancel.`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
351
|
+
addSystemMessage(`Failed to list sessions: ${errorMessage}`);
|
|
352
|
+
}
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
default:
|
|
356
|
+
addSystemMessage(`Unknown command: /${command}\nType /help for available commands.`);
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
}
|