@qduc/term2 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +5 -0
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -2
- package/dist/app.js.map +1 -1
- package/dist/app.model-command-feedback.test.d.ts +2 -0
- package/dist/app.model-command-feedback.test.d.ts.map +1 -0
- package/dist/app.model-command-feedback.test.js +19 -0
- package/dist/app.model-command-feedback.test.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/components/BottomArea.d.ts +2 -0
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +2 -2
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/ChatMessage.js +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/InputBox.js +1 -1
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/MarkdownRenderer.js +1 -1
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/MentorMode.test.d.ts +2 -0
- package/dist/components/MentorMode.test.d.ts.map +1 -0
- package/dist/components/MentorMode.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.js +24 -15
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +1 -1
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SlashCommandMenu.js +2 -2
- package/dist/components/SlashCommandMenu.js.map +1 -1
- package/dist/components/StatusBar.d.ts +2 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +44 -39
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.d.ts +2 -0
- package/dist/components/StatusBar.test.d.ts.map +1 -0
- package/dist/components/StatusBar.test.js +19 -0
- package/dist/components/StatusBar.test.js.map +1 -0
- package/dist/components/TextInput.d.ts.map +1 -1
- package/dist/components/TextInput.js +1 -2
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/debug-schema.d.ts +2 -0
- package/dist/debug-schema.d.ts.map +1 -0
- package/dist/debug-schema.js +22 -0
- package/dist/debug-schema.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts +2 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +79 -493
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +1 -25
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.d.ts +2 -0
- package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.test.js +28 -0
- package/dist/hooks/use-model-selection.test.js.map +1 -0
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +29 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +2 -0
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +1 -0
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/lib/editor-impl.test.d.ts +2 -0
- package/dist/lib/editor-impl.test.d.ts.map +1 -0
- package/dist/lib/editor-impl.test.js +188 -0
- package/dist/lib/editor-impl.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +12 -4
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.public-methods.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.public-methods.test.js +188 -0
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -0
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/simple-mentor.md +0 -8
- package/dist/providers/github-copilot/converters.d.ts +45 -0
- package/dist/providers/github-copilot/converters.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.js +118 -0
- package/dist/providers/github-copilot/converters.js.map +1 -0
- package/dist/providers/github-copilot/converters.test.d.ts +2 -0
- package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.test.js +162 -0
- package/dist/providers/github-copilot/converters.test.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
- package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
- package/dist/providers/github-copilot/index.d.ts +4 -0
- package/dist/providers/github-copilot/index.d.ts.map +1 -0
- package/dist/providers/github-copilot/index.js +4 -0
- package/dist/providers/github-copilot/index.js.map +1 -0
- package/dist/providers/github-copilot/model-direct.d.ts +34 -0
- package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
- package/dist/providers/github-copilot/model-direct.js +443 -0
- package/dist/providers/github-copilot/model-direct.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts +24 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.js +15 -0
- package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
- package/dist/providers/github-copilot/model.js +581 -0
- package/dist/providers/github-copilot/model.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +20 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.js +30 -0
- package/dist/providers/github-copilot/provider.js.map +1 -0
- package/dist/providers/github-copilot/provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.test.js +52 -0
- package/dist/providers/github-copilot/provider.test.js.map +1 -0
- package/dist/providers/github-copilot/utils.d.ts +20 -0
- package/dist/providers/github-copilot/utils.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.js +142 -0
- package/dist/providers/github-copilot/utils.js.map +1 -0
- package/dist/providers/github-copilot/utils.test.d.ts +2 -0
- package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.test.js +21 -0
- package/dist/providers/github-copilot/utils.test.js.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/converters.d.ts.map +1 -1
- package/dist/providers/openrouter/converters.js +64 -46
- package/dist/providers/openrouter/converters.js.map +1 -1
- package/dist/providers/openrouter/converters.test.js +13 -12
- package/dist/providers/openrouter/converters.test.js.map +1 -1
- package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
- package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
- package/dist/providers/openrouter/merge-messages.test.js +83 -0
- package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter.history.test.d.ts +2 -0
- package/dist/providers/openrouter.history.test.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.js +533 -0
- package/dist/providers/openrouter.history.test.js.map +1 -0
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/reproduce_issue.test.d.ts +2 -0
- package/dist/reproduce_issue.test.d.ts.map +1 -0
- package/dist/reproduce_issue.test.js +31 -0
- package/dist/reproduce_issue.test.js.map +1 -0
- package/dist/services/conversation-events.d.ts +3 -0
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-service.test.js +183 -149
- package/dist/services/conversation-session.d.ts +2 -0
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +151 -28
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-session.usage.test.d.ts +2 -0
- package/dist/services/conversation-session.usage.test.d.ts.map +1 -0
- package/dist/services/conversation-session.usage.test.js +59 -0
- package/dist/services/conversation-session.usage.test.js.map +1 -0
- package/dist/services/settings-service.d.ts +9 -3
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +14 -0
- package/dist/services/settings-service.js.map +1 -1
- package/dist/test-search-tool.d.ts +2 -0
- package/dist/test-search-tool.d.ts.map +1 -0
- package/dist/test-search-tool.js +36 -0
- package/dist/test-search-tool.js.map +1 -0
- package/dist/tools/edit-healing.d.ts +24 -0
- package/dist/tools/edit-healing.d.ts.map +1 -0
- package/dist/tools/edit-healing.js +230 -0
- package/dist/tools/edit-healing.js.map +1 -0
- package/dist/tools/edit-healing.test.d.ts +2 -0
- package/dist/tools/edit-healing.test.d.ts.map +1 -0
- package/dist/tools/edit-healing.test.js +34 -0
- package/dist/tools/edit-healing.test.js.map +1 -0
- package/dist/tools/find-files.d.ts +1 -0
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +92 -8
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +45 -0
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +2 -0
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +207 -23
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +223 -2
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +20 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +87 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-fetch.test.d.ts +2 -0
- package/dist/tools/web-fetch.test.d.ts.map +1 -0
- package/dist/tools/web-fetch.test.js +94 -0
- package/dist/tools/web-fetch.test.js.map +1 -0
- package/dist/utils/command-safety/index.d.ts +2 -2
- package/dist/utils/command-safety/index.d.ts.map +1 -1
- package/dist/utils/command-safety/index.js +7 -6
- package/dist/utils/command-safety/index.js.map +1 -1
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.find.test.js +19 -21
- package/dist/utils/command-safety.find.test.js.map +1 -1
- package/dist/utils/command-safety.js +364 -10
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/conversation-event-handler.d.ts +63 -0
- package/dist/utils/conversation-event-handler.d.ts.map +1 -0
- package/dist/utils/conversation-event-handler.js +132 -0
- package/dist/utils/conversation-event-handler.js.map +1 -0
- package/dist/utils/conversation-event-handler.test.d.ts +2 -0
- package/dist/utils/conversation-event-handler.test.d.ts.map +1 -0
- package/dist/utils/conversation-event-handler.test.js +281 -0
- package/dist/utils/conversation-event-handler.test.js.map +1 -0
- package/dist/utils/conversation-utils.d.ts +41 -0
- package/dist/utils/conversation-utils.d.ts.map +1 -0
- package/dist/utils/conversation-utils.js +109 -0
- package/dist/utils/conversation-utils.js.map +1 -0
- package/dist/utils/conversation-utils.test.d.ts +2 -0
- package/dist/utils/conversation-utils.test.d.ts.map +1 -0
- package/dist/utils/conversation-utils.test.js +190 -0
- package/dist/utils/conversation-utils.test.js.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.js +31 -0
- package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +51 -58
- package/dist/utils/ink-render-options.d.ts +9 -0
- package/dist/utils/ink-render-options.d.ts.map +1 -0
- package/dist/utils/ink-render-options.js +8 -0
- package/dist/utils/ink-render-options.js.map +1 -0
- package/dist/utils/message-utils.d.ts +17 -0
- package/dist/utils/message-utils.d.ts.map +1 -0
- package/dist/utils/message-utils.js +52 -0
- package/dist/utils/message-utils.js.map +1 -0
- package/dist/utils/message-utils.test.d.ts +2 -0
- package/dist/utils/message-utils.test.d.ts.map +1 -0
- package/dist/utils/message-utils.test.js +48 -0
- package/dist/utils/message-utils.test.js.map +1 -0
- package/dist/utils/token-usage.d.ts +16 -0
- package/dist/utils/token-usage.d.ts.map +1 -0
- package/dist/utils/token-usage.js +110 -0
- package/dist/utils/token-usage.js.map +1 -0
- package/dist/utils/token-usage.test.d.ts +2 -0
- package/dist/utils/token-usage.test.d.ts.map +1 -0
- package/dist/utils/token-usage.test.js +38 -0
- package/dist/utils/token-usage.test.js.map +1 -0
- package/dist/utils/trim-tool-output.d.ts +2 -0
- package/dist/utils/trim-tool-output.d.ts.map +1 -0
- package/dist/utils/trim-tool-output.js +52 -0
- package/dist/utils/trim-tool-output.js.map +1 -0
- package/package.json +10 -3
- package/readme.md +22 -1
- package/dist/agent.lite-mode.test.d.ts +0 -2
- package/dist/agent.lite-mode.test.d.ts.map +0 -1
- package/dist/agent.lite-mode.test.js +0 -39
- package/dist/agent.lite-mode.test.js.map +0 -1
- package/dist/debug_ask_mentor.d.ts +0 -2
- package/dist/debug_ask_mentor.d.ts.map +0 -1
- package/dist/debug_ask_mentor.js +0 -73
- package/dist/debug_ask_mentor.js.map +0 -1
- package/dist/modes/companion/command-index.d.ts +0 -26
- package/dist/modes/companion/command-index.d.ts.map +0 -1
- package/dist/modes/companion/command-index.js +0 -50
- package/dist/modes/companion/command-index.js.map +0 -1
- package/dist/modes/companion/command-index.test.d.ts +0 -2
- package/dist/modes/companion/command-index.test.d.ts.map +0 -1
- package/dist/modes/companion/command-index.test.js +0 -86
- package/dist/modes/companion/command-index.test.js.map +0 -1
- package/dist/modes/companion/companion-app.d.ts +0 -12
- package/dist/modes/companion/companion-app.d.ts.map +0 -1
- package/dist/modes/companion/companion-app.js +0 -297
- package/dist/modes/companion/companion-app.js.map +0 -1
- package/dist/modes/companion/companion-session.d.ts +0 -63
- package/dist/modes/companion/companion-session.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.js +0 -146
- package/dist/modes/companion/companion-session.js.map +0 -1
- package/dist/modes/companion/companion-session.test.d.ts +0 -2
- package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.test.js +0 -28
- package/dist/modes/companion/companion-session.test.js.map +0 -1
- package/dist/modes/companion/components/status-bar.d.ts +0 -13
- package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
- package/dist/modes/companion/components/status-bar.js +0 -26
- package/dist/modes/companion/components/status-bar.js.map +0 -1
- package/dist/modes/companion/context-buffer.d.ts +0 -65
- package/dist/modes/companion/context-buffer.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.js +0 -156
- package/dist/modes/companion/context-buffer.js.map +0 -1
- package/dist/modes/companion/context-buffer.test.d.ts +0 -2
- package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.test.js +0 -154
- package/dist/modes/companion/context-buffer.test.js.map +0 -1
- package/dist/modes/companion/event-detector.d.ts +0 -46
- package/dist/modes/companion/event-detector.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.js +0 -169
- package/dist/modes/companion/event-detector.js.map +0 -1
- package/dist/modes/companion/event-detector.test.d.ts +0 -2
- package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.test.js +0 -121
- package/dist/modes/companion/event-detector.test.js.map +0 -1
- package/dist/modes/companion/index.d.ts +0 -33
- package/dist/modes/companion/index.d.ts.map +0 -1
- package/dist/modes/companion/index.js +0 -21
- package/dist/modes/companion/index.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.d.ts +0 -3
- package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.js +0 -31
- package/dist/modes/companion/input-key-mapper.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.js +0 -26
- package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
- package/dist/modes/companion/input-parser.d.ts +0 -53
- package/dist/modes/companion/input-parser.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.js +0 -114
- package/dist/modes/companion/input-parser.js.map +0 -1
- package/dist/modes/companion/input-parser.test.d.ts +0 -2
- package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.test.js +0 -123
- package/dist/modes/companion/input-parser.test.js.map +0 -1
- package/dist/modes/companion/mode-manager.d.ts +0 -41
- package/dist/modes/companion/mode-manager.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.js +0 -56
- package/dist/modes/companion/mode-manager.js.map +0 -1
- package/dist/modes/companion/mode-manager.test.d.ts +0 -2
- package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.test.js +0 -65
- package/dist/modes/companion/mode-manager.test.js.map +0 -1
- package/dist/modes/companion/output-classifier.d.ts +0 -15
- package/dist/modes/companion/output-classifier.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.js +0 -77
- package/dist/modes/companion/output-classifier.js.map +0 -1
- package/dist/modes/companion/output-classifier.test.d.ts +0 -2
- package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.test.js +0 -133
- package/dist/modes/companion/output-classifier.test.js.map +0 -1
- package/dist/modes/companion/pty-wrapper.d.ts +0 -46
- package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
- package/dist/modes/companion/pty-wrapper.js +0 -143
- package/dist/modes/companion/pty-wrapper.js.map +0 -1
- package/dist/modes/companion/safety-classifier.d.ts +0 -31
- package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.js +0 -140
- package/dist/modes/companion/safety-classifier.js.map +0 -1
- package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
- package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.test.js +0 -151
- package/dist/modes/companion/safety-classifier.test.js.map +0 -1
- package/dist/modes/companion/summarizer.d.ts +0 -24
- package/dist/modes/companion/summarizer.d.ts.map +0 -1
- package/dist/modes/companion/summarizer.js +0 -132
- package/dist/modes/companion/summarizer.js.map +0 -1
- package/dist/modes/companion/terminal-history.d.ts +0 -27
- package/dist/modes/companion/terminal-history.d.ts.map +0 -1
- package/dist/modes/companion/terminal-history.js +0 -142
- package/dist/modes/companion/terminal-history.js.map +0 -1
- package/dist/services/check_mock.d.ts +0 -2
- package/dist/services/check_mock.d.ts.map +0 -1
- package/dist/services/check_mock.js +0 -22
- package/dist/services/check_mock.js.map +0 -1
- package/dist/services/conversation-service.test.d.ts +0 -2
- package/dist/services/conversation-service.test.d.ts.map +0 -1
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/utils/command-safety.devnull.test.d.ts +0 -2
- package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.js +0 -13
- package/dist/utils/command-safety.devnull.test.js.map +0 -1
- package/dist/utils/extract-command-messages.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.test.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { areMessageListsEqual } from './message-utils.js';
|
|
3
|
+
test('areMessageListsEqual returns true for same content with new array refs', t => {
|
|
4
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
5
|
+
const messagesB = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
6
|
+
t.true(areMessageListsEqual(messagesA, messagesB));
|
|
7
|
+
});
|
|
8
|
+
test('areMessageListsEqual returns false when text changes', t => {
|
|
9
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
10
|
+
const messagesB = [{ id: 1, sender: 'bot', text: 'Hello!' }];
|
|
11
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
12
|
+
});
|
|
13
|
+
test('areMessageListsEqual returns false when command output changes', t => {
|
|
14
|
+
const messagesA = [
|
|
15
|
+
{
|
|
16
|
+
id: 'cmd-1',
|
|
17
|
+
sender: 'command',
|
|
18
|
+
status: 'completed',
|
|
19
|
+
command: 'ls',
|
|
20
|
+
output: 'file-a',
|
|
21
|
+
success: true,
|
|
22
|
+
toolName: 'shell',
|
|
23
|
+
toolArgs: { command: 'ls' },
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
const messagesB = [
|
|
27
|
+
{
|
|
28
|
+
id: 'cmd-1',
|
|
29
|
+
sender: 'command',
|
|
30
|
+
status: 'completed',
|
|
31
|
+
command: 'ls',
|
|
32
|
+
output: 'file-a\nfile-b',
|
|
33
|
+
success: true,
|
|
34
|
+
toolName: 'shell',
|
|
35
|
+
toolArgs: { command: 'ls' },
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
39
|
+
});
|
|
40
|
+
test('areMessageListsEqual returns false when length differs', t => {
|
|
41
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
42
|
+
const messagesB = [
|
|
43
|
+
{ id: 1, sender: 'bot', text: 'Hello' },
|
|
44
|
+
{ id: 2, sender: 'bot', text: 'World' },
|
|
45
|
+
];
|
|
46
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=message-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.test.js","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAExD,IAAI,CAAC,wEAAwE,EAAE,CAAC,CAAC,EAAE;IAC/E,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAE1D,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE;IAC7D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;IAE3D,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IACF,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QACd,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;QACrC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;KACxC,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage normalization and extraction utilities.
|
|
3
|
+
* Ported from backend/src/lib/utils/usage.js
|
|
4
|
+
*/
|
|
5
|
+
export interface NormalizedUsage {
|
|
6
|
+
prompt_tokens?: number;
|
|
7
|
+
completion_tokens?: number;
|
|
8
|
+
total_tokens?: number;
|
|
9
|
+
reasoning_tokens?: number;
|
|
10
|
+
prompt_ms?: number;
|
|
11
|
+
completion_ms?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function normalizeUsage(usage: any): NormalizedUsage | undefined;
|
|
14
|
+
export declare function extractUsage(payload: any): NormalizedUsage | undefined;
|
|
15
|
+
export declare function formatFooterUsage(usage: NormalizedUsage | null | undefined): string;
|
|
16
|
+
//# sourceMappingURL=token-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage.d.ts","sourceRoot":"","sources":["../../source/utils/token-usage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AA6BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,eAAe,GAAG,SAAS,CAiFtE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,eAAe,GAAG,SAAS,CAgCtE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBnF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage normalization and extraction utilities.
|
|
3
|
+
* Ported from backend/src/lib/utils/usage.js
|
|
4
|
+
*/
|
|
5
|
+
function toNumber(value) {
|
|
6
|
+
if (value == null)
|
|
7
|
+
return undefined;
|
|
8
|
+
const asNumber = Number(value);
|
|
9
|
+
if (!Number.isFinite(asNumber))
|
|
10
|
+
return undefined;
|
|
11
|
+
return asNumber;
|
|
12
|
+
}
|
|
13
|
+
function coalesceNumber(...values) {
|
|
14
|
+
for (const value of values) {
|
|
15
|
+
const num = toNumber(value);
|
|
16
|
+
if (num != null)
|
|
17
|
+
return num;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function sumNumbers(...values) {
|
|
22
|
+
let total = 0;
|
|
23
|
+
let found = false;
|
|
24
|
+
for (const value of values) {
|
|
25
|
+
const num = toNumber(value);
|
|
26
|
+
if (num == null)
|
|
27
|
+
continue;
|
|
28
|
+
total += num;
|
|
29
|
+
found = true;
|
|
30
|
+
}
|
|
31
|
+
return found ? total : undefined;
|
|
32
|
+
}
|
|
33
|
+
export function normalizeUsage(usage) {
|
|
34
|
+
if (!usage || typeof usage !== 'object')
|
|
35
|
+
return undefined;
|
|
36
|
+
const promptTokens = coalesceNumber(usage.prompt_tokens, usage.input_tokens, usage.input_token_count, usage.prompt_token_count, usage.promptTokenCount, usage.inputTokenCount, usage.inputTokens, // Agents SDK
|
|
37
|
+
usage.prompt_n !== undefined && usage.prompt_n != null
|
|
38
|
+
? (toNumber(usage.cache_n) || 0) + toNumber(usage.prompt_n)
|
|
39
|
+
: undefined);
|
|
40
|
+
const completionTokens = coalesceNumber(usage.completion_tokens, usage.output_tokens, usage.output_token_count, usage.completion_token_count, usage.candidatesTokenCount, usage.outputTokenCount, usage.outputTokens, // Agents SDK
|
|
41
|
+
usage.predicted_n);
|
|
42
|
+
const cacheCreationTokens = coalesceNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);
|
|
43
|
+
const cacheReadTokens = coalesceNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);
|
|
44
|
+
const totalTokens = coalesceNumber(usage.total_tokens, usage.total_token_count, usage.totalTokenCount, usage.totalTokens) ??
|
|
45
|
+
sumNumbers(promptTokens, completionTokens, cacheCreationTokens, cacheReadTokens);
|
|
46
|
+
const reasoningTokens = coalesceNumber(usage.reasoning_tokens, usage.reasoning_token_count, usage?.completion_tokens_details?.reasoning_tokens, usage?.output_tokens_details?.reasoning_tokens, usage.thoughtsTokenCount, usage.thoughts_token_count);
|
|
47
|
+
const promptMs = coalesceNumber(usage.prompt_ms, usage.promptMs);
|
|
48
|
+
const completionMs = coalesceNumber(usage.completion_ms, usage.completionMs, usage.predicted_ms, usage.predictedMs, usage.output_ms, usage.outputMs);
|
|
49
|
+
const mapped = {};
|
|
50
|
+
if (promptTokens != null)
|
|
51
|
+
mapped.prompt_tokens = promptTokens;
|
|
52
|
+
if (completionTokens != null)
|
|
53
|
+
mapped.completion_tokens = completionTokens;
|
|
54
|
+
if (totalTokens != null)
|
|
55
|
+
mapped.total_tokens = totalTokens;
|
|
56
|
+
if (reasoningTokens != null)
|
|
57
|
+
mapped.reasoning_tokens = reasoningTokens;
|
|
58
|
+
if (promptMs != null)
|
|
59
|
+
mapped.prompt_ms = promptMs;
|
|
60
|
+
if (completionMs != null)
|
|
61
|
+
mapped.completion_ms = completionMs;
|
|
62
|
+
return Object.keys(mapped).length > 0 ? mapped : undefined;
|
|
63
|
+
}
|
|
64
|
+
export function extractUsage(payload) {
|
|
65
|
+
if (!payload || typeof payload !== 'object')
|
|
66
|
+
return undefined;
|
|
67
|
+
const results = [];
|
|
68
|
+
const direct = normalizeUsage(payload.usage);
|
|
69
|
+
if (direct)
|
|
70
|
+
results.push(direct);
|
|
71
|
+
const metadata = normalizeUsage(payload.usageMetadata || payload.usage_metadata);
|
|
72
|
+
if (metadata)
|
|
73
|
+
results.push(metadata);
|
|
74
|
+
const nested = normalizeUsage(payload.response?.usage);
|
|
75
|
+
if (nested)
|
|
76
|
+
results.push(nested);
|
|
77
|
+
const timings = normalizeUsage(payload.timings);
|
|
78
|
+
if (timings)
|
|
79
|
+
results.push(timings);
|
|
80
|
+
// Fallback search for any usage field in the payload itself
|
|
81
|
+
const self = normalizeUsage(payload);
|
|
82
|
+
if (self)
|
|
83
|
+
results.push(self);
|
|
84
|
+
if (results.length === 0)
|
|
85
|
+
return undefined;
|
|
86
|
+
const merged = {};
|
|
87
|
+
for (let i = results.length - 1; i >= 0; i--) {
|
|
88
|
+
Object.assign(merged, results[i]);
|
|
89
|
+
}
|
|
90
|
+
// Re-normalize to fix up computed total_tokens if components were merged from different sources
|
|
91
|
+
return normalizeUsage(merged);
|
|
92
|
+
}
|
|
93
|
+
export function formatFooterUsage(usage) {
|
|
94
|
+
if (!usage)
|
|
95
|
+
return '';
|
|
96
|
+
const parts = [];
|
|
97
|
+
if (usage.prompt_tokens != null) {
|
|
98
|
+
parts.push(`${usage.prompt_tokens.toLocaleString()} in`);
|
|
99
|
+
}
|
|
100
|
+
if (usage.completion_tokens != null) {
|
|
101
|
+
parts.push(`${usage.completion_tokens.toLocaleString()} out`);
|
|
102
|
+
}
|
|
103
|
+
if (usage.total_tokens != null) {
|
|
104
|
+
parts.push(`${usage.total_tokens.toLocaleString()} total`);
|
|
105
|
+
}
|
|
106
|
+
if (parts.length === 0)
|
|
107
|
+
return '';
|
|
108
|
+
return `Tok: ${parts.join(' / ')}`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=token-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage.js","sourceRoot":"","sources":["../../source/utils/token-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage.test.d.ts","sourceRoot":"","sources":["../../source/utils/token-usage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { normalizeUsage, extractUsage, formatFooterUsage } from './token-usage.js';
|
|
3
|
+
test('normalizeUsage handles multiple formats', t => {
|
|
4
|
+
// OpenAI style
|
|
5
|
+
t.deepEqual(normalizeUsage({ prompt_tokens: 10, completion_tokens: 20, total_tokens: 30 }), {
|
|
6
|
+
prompt_tokens: 10,
|
|
7
|
+
completion_tokens: 20,
|
|
8
|
+
total_tokens: 30
|
|
9
|
+
});
|
|
10
|
+
// Agents SDK style
|
|
11
|
+
t.deepEqual(normalizeUsage({ inputTokens: 5, outputTokens: 15, totalTokens: 20 }), {
|
|
12
|
+
prompt_tokens: 5,
|
|
13
|
+
completion_tokens: 15,
|
|
14
|
+
total_tokens: 20
|
|
15
|
+
});
|
|
16
|
+
// Mixed/partial
|
|
17
|
+
t.deepEqual(normalizeUsage({ input_tokens: 100 }), {
|
|
18
|
+
prompt_tokens: 100,
|
|
19
|
+
total_tokens: 100
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
test('extractUsage finds usage in nested locations', t => {
|
|
23
|
+
const payload = {
|
|
24
|
+
usage: { prompt_tokens: 1, total_tokens: 3 },
|
|
25
|
+
response: { usage: { completion_tokens: 2, total_tokens: 3 } }
|
|
26
|
+
};
|
|
27
|
+
t.deepEqual(extractUsage(payload), {
|
|
28
|
+
prompt_tokens: 1,
|
|
29
|
+
completion_tokens: 2,
|
|
30
|
+
total_tokens: 3
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
test('formatFooterUsage returns formatted string', t => {
|
|
34
|
+
t.is(formatFooterUsage({ prompt_tokens: 1200, completion_tokens: 350, total_tokens: 1550 }), 'Tok: 1,200 in / 350 out / 1,550 total');
|
|
35
|
+
t.is(formatFooterUsage({ total_tokens: 100 }), 'Tok: 100 total');
|
|
36
|
+
t.is(formatFooterUsage(null), '');
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=token-usage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage.test.js","sourceRoot":"","sources":["../../source/utils/token-usage.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAEjF,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE;IAChD,eAAe;IACf,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAC,CAAC,EAAE;QACtF,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,mBAAmB;IACnB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAC,CAAC,EAAE;QAC7E,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,gBAAgB;IAChB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,YAAY,EAAE,GAAG,EAAC,CAAC,EAAE;QAC7C,aAAa,EAAE,GAAG;QAClB,YAAY,EAAE,GAAG;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE;IACrD,MAAM,OAAO,GAAG;QACZ,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;QAC5C,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;KACjE,CAAC;IACF,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAC/B,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,CAAC;QACpB,YAAY,EAAE,CAAC;KAClB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,EAAE;IACnD,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAC,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAC,CAAC,EAAE,uCAAuC,CAAC,CAAC;IACpI,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAC,YAAY,EAAE,GAAG,EAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC/D,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trim-tool-output.d.ts","sourceRoot":"","sources":["../../source/utils/trim-tool-output.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,cAAc,GACvB,QAAQ,OAAO,EACf,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACvB,MAgBF,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { trimOutput } from './output-trim.js';
|
|
2
|
+
const tryParseJson = (value) => {
|
|
3
|
+
if (!value.trim()) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(value);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const trimStringValue = (value, maxLines, maxCharacters) => {
|
|
14
|
+
if (!value) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
return trimOutput(value, maxLines, maxCharacters);
|
|
18
|
+
};
|
|
19
|
+
const trimJsonStrings = (value, maxLines, maxCharacters) => {
|
|
20
|
+
if (typeof value === 'string') {
|
|
21
|
+
return trimStringValue(value, maxLines, maxCharacters);
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
return value.map(entry => trimJsonStrings(entry, maxLines, maxCharacters));
|
|
25
|
+
}
|
|
26
|
+
if (value && typeof value === 'object') {
|
|
27
|
+
const record = value;
|
|
28
|
+
const next = {};
|
|
29
|
+
for (const [key, entry] of Object.entries(record)) {
|
|
30
|
+
next[key] = trimJsonStrings(entry, maxLines, maxCharacters);
|
|
31
|
+
}
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
36
|
+
export const trimToolOutput = (output, maxLines, maxCharacters) => {
|
|
37
|
+
if (typeof output !== 'string') {
|
|
38
|
+
return String(output ?? '');
|
|
39
|
+
}
|
|
40
|
+
const parsed = tryParseJson(output);
|
|
41
|
+
if (parsed !== null) {
|
|
42
|
+
const trimmed = trimJsonStrings(parsed, maxLines, maxCharacters);
|
|
43
|
+
try {
|
|
44
|
+
return JSON.stringify(trimmed);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return trimStringValue(output, maxLines, maxCharacters);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return trimStringValue(output, maxLines, maxCharacters);
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=trim-tool-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trim-tool-output.js","sourceRoot":"","sources":["../../source/utils/trim-tool-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAE5C,MAAM,YAAY,GAAG,CAAC,KAAa,EAAkB,EAAE;IACnD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,KAAa,EACb,QAAiB,EACjB,aAAsB,EAChB,EAAE;IACR,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,KAAc,EACd,QAAiB,EACjB,aAAsB,EACf,EAAE;IACT,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACrB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAClD,CAAC;IACN,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,MAAe,EACf,QAAiB,EACjB,aAAsB,EAChB,EAAE;IACR,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qduc/term2",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "A terminal-based AI assistant that can help you get things done on your computer",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "qduc",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"type": "module",
|
|
29
29
|
"engines": {
|
|
30
|
-
"node": ">=
|
|
30
|
+
"node": ">=20"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"start": "node dist/cli.js",
|
|
@@ -46,20 +46,24 @@
|
|
|
46
46
|
"dist"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
+
"@mozilla/readability": "^0.6.0",
|
|
49
50
|
"@openai/agents": "^0.4.3",
|
|
51
|
+
"@qduc/web-fetch": "^0.1.0",
|
|
50
52
|
"@types/ssh2": "^1.15.5",
|
|
51
53
|
"bash-parser": "^0.5.0",
|
|
52
54
|
"env-paths": "^3.0.0",
|
|
53
55
|
"fast-glob": "^3.3.2",
|
|
54
56
|
"fuse.js": "^7.0.0",
|
|
55
57
|
"ignore": "^5.3.2",
|
|
56
|
-
"ink": "^6.
|
|
58
|
+
"ink": "^6.6.0",
|
|
57
59
|
"ink-prompt": "^0.1.7",
|
|
60
|
+
"jsdom": "^27.4.0",
|
|
58
61
|
"marked": "^17.0.1",
|
|
59
62
|
"meow": "^11.0.0",
|
|
60
63
|
"openai": "^6.9.1",
|
|
61
64
|
"react": "^19.0.0",
|
|
62
65
|
"ssh2": "^1.17.0",
|
|
66
|
+
"turndown": "^7.2.2",
|
|
63
67
|
"winston": "^3.18.3",
|
|
64
68
|
"winston-daily-rotate-file": "^5.0.0",
|
|
65
69
|
"zod": "^4.1.13"
|
|
@@ -69,9 +73,12 @@
|
|
|
69
73
|
"@babel/cli": "^7.21.0",
|
|
70
74
|
"@babel/preset-react": "^7.18.6",
|
|
71
75
|
"@types/env-paths": "^1.0.2",
|
|
76
|
+
"@types/jsdom": "^27.0.0",
|
|
72
77
|
"@types/marked": "^5.0.2",
|
|
78
|
+
"@types/mozilla-readability": "^0.2.1",
|
|
73
79
|
"@types/node": "^24.10.1",
|
|
74
80
|
"@types/react": "^19.0.0",
|
|
81
|
+
"@types/turndown": "^5.0.6",
|
|
75
82
|
"ava": "^6.4.1",
|
|
76
83
|
"chalk": "^5.2.0",
|
|
77
84
|
"eslint-config-xo-react": "^0.27.0",
|
package/readme.md
CHANGED
|
@@ -5,13 +5,16 @@
|
|
|
5
5
|
|
|
6
6
|
A powerful terminal-based AI assistant that helps you get things done on your computer through natural conversation.
|
|
7
7
|
|
|
8
|
+
**Why term2?** Unlike proprietary alternatives, term2 is **open-source (MIT)**, works with **any AI provider** (OpenAI, OpenRouter, local self-hosted, etc.), requires **no subscription**, and uniquely supports **remote server management via SSH** — all while giving you full control over what commands execute on your system.
|
|
9
|
+
|
|
8
10
|
## Demo
|
|
9
11
|
|
|
10
12
|
https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
|
|
11
13
|
|
|
12
14
|
## Features
|
|
13
15
|
|
|
14
|
-
- 🎭 **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (
|
|
16
|
+
- 🎭 **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (get help from a smarter model on complex problems)
|
|
17
|
+
- 🌍 **Open Source** - MIT licensed, hackable, auditable, community-driven
|
|
15
18
|
- 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, and OpenAI-compatible APIs
|
|
16
19
|
- 🔒 **Safe Execution** - Every command requires your explicit approval with diff preview
|
|
17
20
|
- 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace, grep, find files, file reading, web search, and mentor consultation
|
|
@@ -24,6 +27,24 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
|
|
|
24
27
|
- 🔄 **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
|
|
25
28
|
- 🌐 **SSH Mode** - Execute commands and edit files on remote servers over SSH
|
|
26
29
|
|
|
30
|
+
## Why term2 vs Alternatives?
|
|
31
|
+
|
|
32
|
+
| | **term2** | Claude Code | Warp |
|
|
33
|
+
|---|:---:|:---:|:---:|
|
|
34
|
+
| **Open Source** | ✅ MIT | ❌ Proprietary | ❌ Proprietary |
|
|
35
|
+
| **Cost** | Pay-per-use | $20-200/mo | Freemium |
|
|
36
|
+
| **AI Providers** | Any (OpenAI, OpenRouter, local, etc.) | Anthropic only | selected models only |
|
|
37
|
+
| **SSH Remote** | ✅ Native | ❌ No | ✅ Yes |
|
|
38
|
+
| **Mentor Mode** | ✅ Built-in | ❌ No | ❌ No |
|
|
39
|
+
| **Self-Hostable** | ✅ | ❌ | ❌ |
|
|
40
|
+
|
|
41
|
+
**term2 gives you:**
|
|
42
|
+
- **Freedom** — No vendor lock-in. Use any AI provider or model you prefer.
|
|
43
|
+
- **Transparency** — Open source means you can audit every line of code.
|
|
44
|
+
- **Cost Control** — Pay only for API usage, no monthly subscriptions.
|
|
45
|
+
- **Remote Work** — Troubleshoot and manage remote servers without installing anything on remote hosts.
|
|
46
|
+
- **Safety** — Every command requires explicit approval with diff previews before execution.
|
|
47
|
+
|
|
27
48
|
## Installation
|
|
28
49
|
|
|
29
50
|
**Requirements:**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.lite-mode.test.d.ts","sourceRoot":"","sources":["../source/agent.lite-mode.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { getAgentDefinition } from './agent.js';
|
|
3
|
-
const mockSettings = (lite) => ({
|
|
4
|
-
get: (key) => {
|
|
5
|
-
if (key === 'app.liteMode')
|
|
6
|
-
return lite;
|
|
7
|
-
if (key === 'agent.model')
|
|
8
|
-
return 'gpt-4';
|
|
9
|
-
return undefined;
|
|
10
|
-
},
|
|
11
|
-
set: () => { },
|
|
12
|
-
on: () => { },
|
|
13
|
-
off: () => { },
|
|
14
|
-
getAll: () => ({}),
|
|
15
|
-
});
|
|
16
|
-
const mockLogging = {};
|
|
17
|
-
test('getAgentDefinition in lite mode should include web_search tool', t => {
|
|
18
|
-
const deps = {
|
|
19
|
-
settingsService: mockSettings(true),
|
|
20
|
-
loggingService: mockLogging,
|
|
21
|
-
};
|
|
22
|
-
const agent = getAgentDefinition(deps, 'gpt-4');
|
|
23
|
-
const toolNames = agent.tools.map(tool => tool.name);
|
|
24
|
-
t.true(toolNames.includes('shell'));
|
|
25
|
-
t.true(toolNames.includes('read_file'));
|
|
26
|
-
t.true(toolNames.includes('find_files'));
|
|
27
|
-
t.true(toolNames.includes('grep'));
|
|
28
|
-
t.true(toolNames.includes('web_search'), 'web_search should be included in lite mode');
|
|
29
|
-
});
|
|
30
|
-
test('getAgentDefinition in non-lite mode should include web_search tool', t => {
|
|
31
|
-
const deps = {
|
|
32
|
-
settingsService: mockSettings(false),
|
|
33
|
-
loggingService: mockLogging,
|
|
34
|
-
};
|
|
35
|
-
const agent = getAgentDefinition(deps, 'gpt-4');
|
|
36
|
-
const toolNames = agent.tools.map(tool => tool.name);
|
|
37
|
-
t.true(toolNames.includes('web_search'), 'web_search should be included in full mode');
|
|
38
|
-
});
|
|
39
|
-
//# sourceMappingURL=agent.lite-mode.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.lite-mode.test.js","sourceRoot":"","sources":["../source/agent.lite-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,YAAY,GAAG,CAAC,IAAa,EAAoB,EAAE,CAAC,CAAC;IACvD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,OAAO,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC;IACZ,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;CACW,CAAA,CAAC;AAElC,MAAM,WAAW,GAAG,EAAgC,CAAC;AAErD,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,IAAI,GAAG;QACT,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC;QACnC,cAAc,EAAE,WAAW;KAC9B,CAAC;IACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,4CAA4C,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,CAAC,CAAC,EAAE;IAC3E,MAAM,IAAI,GAAG;QACT,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC;QACpC,cAAc,EAAE,WAAW;KAC9B,CAAC;IACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,4CAA4C,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug_ask_mentor.d.ts","sourceRoot":"","sources":["../source/debug_ask_mentor.ts"],"names":[],"mappings":""}
|
package/dist/debug_ask_mentor.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { OpenAIAgentClient } from './lib/openai-agent-client.js';
|
|
2
|
-
import { registerProvider } from './providers/registry.js';
|
|
3
|
-
// Mock Logger
|
|
4
|
-
const mockLogger = {
|
|
5
|
-
debug: () => { },
|
|
6
|
-
info: () => { },
|
|
7
|
-
warn: () => { },
|
|
8
|
-
error: console.error,
|
|
9
|
-
setCorrelationId: () => { },
|
|
10
|
-
clearCorrelationId: () => { },
|
|
11
|
-
log: () => { },
|
|
12
|
-
};
|
|
13
|
-
// Mock Settings
|
|
14
|
-
const mockSettings = {
|
|
15
|
-
get: (key) => {
|
|
16
|
-
if (key === 'agent.provider')
|
|
17
|
-
return 'mock-provider';
|
|
18
|
-
if (key === 'agent.model')
|
|
19
|
-
return 'mock-model';
|
|
20
|
-
if (key === 'agent.mentorModel')
|
|
21
|
-
return 'mock-mentor';
|
|
22
|
-
return undefined;
|
|
23
|
-
},
|
|
24
|
-
set: () => { },
|
|
25
|
-
onChange: () => { },
|
|
26
|
-
};
|
|
27
|
-
// Mock Runner
|
|
28
|
-
class MockRunner {
|
|
29
|
-
async run(agent, input, options) {
|
|
30
|
-
console.log('MockRunner.run called');
|
|
31
|
-
// Return a result similar to what might be causing issues
|
|
32
|
-
// Missing finalOutput, but maybe has messages or text
|
|
33
|
-
return {
|
|
34
|
-
status: 'completed',
|
|
35
|
-
messages: [{ role: 'assistant', content: 'This is the answer' }],
|
|
36
|
-
// finalOutput is missing!
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Register Mock Provider
|
|
41
|
-
registerProvider({
|
|
42
|
-
id: 'mock-provider',
|
|
43
|
-
label: 'Mock Provider',
|
|
44
|
-
createRunner: () => new MockRunner(),
|
|
45
|
-
fetchModels: async () => [{ id: 'mock-model' }, { id: 'mock-mentor' }],
|
|
46
|
-
});
|
|
47
|
-
async function main() {
|
|
48
|
-
console.log('Starting debug script...');
|
|
49
|
-
try {
|
|
50
|
-
const client = new OpenAIAgentClient({
|
|
51
|
-
deps: {
|
|
52
|
-
logger: mockLogger,
|
|
53
|
-
settings: mockSettings,
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
console.log('Client initialized. Calling chat...');
|
|
57
|
-
const response = await client.chat('Hello');
|
|
58
|
-
console.log('Chat response:', response);
|
|
59
|
-
if (response === 'This is the answer') {
|
|
60
|
-
console.log('SUCCESS: Got expected response from messages fallback.');
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
console.error('FAILURE: Response did not match expected.');
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
console.log('Caught UNEXPECTED error:', e.message);
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
main().catch(console.error);
|
|
73
|
-
//# sourceMappingURL=debug_ask_mentor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug_ask_mentor.js","sourceRoot":"","sources":["../source/debug_ask_mentor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,cAAc;AACd,MAAM,UAAU,GAAoB;IAChC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC1B,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC5B,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;CACT,CAAC;AAET,gBAAgB;AAChB,MAAM,YAAY,GAAqB;IACnC,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,gBAAgB;YAAE,OAAO,eAAe,CAAC;QACrD,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,YAAY,CAAC;QAC/C,IAAI,GAAG,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACtD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;CACd,CAAC;AAET,cAAc;AACd,MAAM,UAAU;IACZ,KAAK,CAAC,GAAG,CAAC,KAAU,EAAE,KAAU,EAAE,OAAY;QAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,0DAA0D;QAC1D,sDAAsD;QACtD,OAAO;YACH,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;YAChE,0BAA0B;SAC7B,CAAC;IACN,CAAC;CACJ;AAED,yBAAyB;AACzB,gBAAgB,CAAC;IACb,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,eAAe;IACtB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAS;IAC3C,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;CACzE,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;YACjC,IAAI,EAAE;gBACF,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,YAAY;aACzB;SACJ,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command index utilities for companion mode.
|
|
3
|
-
* Generates lightweight command summaries for AI context.
|
|
4
|
-
*/
|
|
5
|
-
import type { CommandIndexEntry } from './context-buffer.js';
|
|
6
|
-
/**
|
|
7
|
-
* Format command index entries for inclusion in AI system prompt.
|
|
8
|
-
* Produces a compact, readable representation that uses minimal tokens.
|
|
9
|
-
*
|
|
10
|
-
* Example output:
|
|
11
|
-
* [0] npm test ✗ exit:1 5s ago (542 lines)
|
|
12
|
-
* [1] git diff ✓ exit:0 30s ago (23 lines)
|
|
13
|
-
* [2] npm install ✓ exit:0 2m ago (891 lines)
|
|
14
|
-
*/
|
|
15
|
-
export declare function formatCommandIndex(entries: CommandIndexEntry[]): string;
|
|
16
|
-
/**
|
|
17
|
-
* Generate system prompt section for command index.
|
|
18
|
-
* This is always included in companion mode AI context.
|
|
19
|
-
*/
|
|
20
|
-
export declare function generateCommandIndexPrompt(entries: CommandIndexEntry[]): string;
|
|
21
|
-
/**
|
|
22
|
-
* Estimate token count for command index.
|
|
23
|
-
* Rough approximation: ~4 characters per token.
|
|
24
|
-
*/
|
|
25
|
-
export declare function estimateTokens(entries: CommandIndexEntry[]): number;
|
|
26
|
-
//# sourceMappingURL=command-index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-index.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/command-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAYvE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,iBAAiB,EAAE,GAC7B,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAGnE"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command index utilities for companion mode.
|
|
3
|
-
* Generates lightweight command summaries for AI context.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Format command index entries for inclusion in AI system prompt.
|
|
7
|
-
* Produces a compact, readable representation that uses minimal tokens.
|
|
8
|
-
*
|
|
9
|
-
* Example output:
|
|
10
|
-
* [0] npm test ✗ exit:1 5s ago (542 lines)
|
|
11
|
-
* [1] git diff ✓ exit:0 30s ago (23 lines)
|
|
12
|
-
* [2] npm install ✓ exit:0 2m ago (891 lines)
|
|
13
|
-
*/
|
|
14
|
-
export function formatCommandIndex(entries) {
|
|
15
|
-
if (entries.length === 0) {
|
|
16
|
-
return 'No recent commands.';
|
|
17
|
-
}
|
|
18
|
-
return entries
|
|
19
|
-
.map(entry => {
|
|
20
|
-
const status = entry.exitCode === 0 ? '✓' : '✗';
|
|
21
|
-
const cmd = entry.command.padEnd(25).slice(0, 25);
|
|
22
|
-
return `[${entry.index}] ${cmd} ${status} exit:${entry.exitCode} ${entry.relativeTime} (${entry.outputLines} lines)`;
|
|
23
|
-
})
|
|
24
|
-
.join('\n');
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Generate system prompt section for command index.
|
|
28
|
-
* This is always included in companion mode AI context.
|
|
29
|
-
*/
|
|
30
|
-
export function generateCommandIndexPrompt(entries) {
|
|
31
|
-
const indexSection = formatCommandIndex(entries);
|
|
32
|
-
return `
|
|
33
|
-
## Terminal Context
|
|
34
|
-
|
|
35
|
-
You are observing the user's terminal session. Here are the recent commands:
|
|
36
|
-
|
|
37
|
-
${indexSection}
|
|
38
|
-
|
|
39
|
-
Use the terminal_history tool to fetch detailed output when needed.
|
|
40
|
-
`;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Estimate token count for command index.
|
|
44
|
-
* Rough approximation: ~4 characters per token.
|
|
45
|
-
*/
|
|
46
|
-
export function estimateTokens(entries) {
|
|
47
|
-
const formatted = formatCommandIndex(entries);
|
|
48
|
-
return Math.ceil(formatted.length / 4);
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=command-index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-index.js","sourceRoot":"","sources":["../../../source/modes/companion/command-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED,OAAO,OAAO;SACT,GAAG,CAAC,KAAK,CAAC,EAAE;QACT,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,WAAW,SAAS,CAAC;IAC3H,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACtC,OAA4B;IAE5B,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO;;;;;EAKT,YAAY;;;CAGb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4B;IACvD,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|