@qduc/term2 0.1.0
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/LICENSE +21 -0
- package/dist/agent.d.ts +19 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +143 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +22 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +403 -0
- package/dist/app.js.map +1 -0
- 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/app.parseInput.test.d.ts +2 -0
- package/dist/app.parseInput.test.d.ts.map +1 -0
- package/dist/app.parseInput.test.js +97 -0
- package/dist/app.parseInput.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +241 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +10 -0
- package/dist/components/ApprovalPrompt.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.js +163 -0
- package/dist/components/ApprovalPrompt.js.map +1 -0
- package/dist/components/Banner.d.ts +9 -0
- package/dist/components/Banner.d.ts.map +1 -0
- package/dist/components/Banner.js +86 -0
- package/dist/components/Banner.js.map +1 -0
- package/dist/components/BottomArea.d.ts +33 -0
- package/dist/components/BottomArea.d.ts.map +1 -0
- package/dist/components/BottomArea.js +31 -0
- package/dist/components/BottomArea.js.map +1 -0
- package/dist/components/BottomArea.test.d.ts +2 -0
- package/dist/components/BottomArea.test.d.ts.map +1 -0
- package/dist/components/BottomArea.test.js +73 -0
- package/dist/components/BottomArea.test.js.map +1 -0
- package/dist/components/ChatMessage.d.ts +7 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +10 -0
- package/dist/components/ChatMessage.js.map +1 -0
- package/dist/components/CommandMessage.d.ts +15 -0
- package/dist/components/CommandMessage.d.ts.map +1 -0
- package/dist/components/CommandMessage.js +188 -0
- package/dist/components/CommandMessage.js.map +1 -0
- package/dist/components/CommandMessage.test.d.ts +2 -0
- package/dist/components/CommandMessage.test.d.ts.map +1 -0
- package/dist/components/CommandMessage.test.js +35 -0
- package/dist/components/CommandMessage.test.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +27 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +77 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ErrorBoundary.test.d.ts +2 -0
- package/dist/components/ErrorBoundary.test.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.test.js +32 -0
- package/dist/components/ErrorBoundary.test.js.map +1 -0
- package/dist/components/Input/PopupManager.d.ts +42 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -0
- package/dist/components/Input/PopupManager.js +13 -0
- package/dist/components/Input/PopupManager.js.map +1 -0
- package/dist/components/InputBox.d.ts +18 -0
- package/dist/components/InputBox.d.ts.map +1 -0
- package/dist/components/InputBox.js +384 -0
- package/dist/components/InputBox.js.map +1 -0
- package/dist/components/InputBox.menu-logic.test.d.ts +2 -0
- package/dist/components/InputBox.menu-logic.test.d.ts.map +1 -0
- package/dist/components/InputBox.menu-logic.test.js +151 -0
- package/dist/components/InputBox.menu-logic.test.js.map +1 -0
- package/dist/components/InputBox.test.d.ts +2 -0
- package/dist/components/InputBox.test.d.ts.map +1 -0
- package/dist/components/InputBox.test.js +91 -0
- package/dist/components/InputBox.test.js.map +1 -0
- package/dist/components/LiveResponse.d.ts +13 -0
- package/dist/components/LiveResponse.d.ts.map +1 -0
- package/dist/components/LiveResponse.js +16 -0
- package/dist/components/LiveResponse.js.map +1 -0
- package/dist/components/MarkdownRenderer.d.ts +8 -0
- package/dist/components/MarkdownRenderer.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer.js +225 -0
- package/dist/components/MarkdownRenderer.js.map +1 -0
- 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/MessageList.d.ts +7 -0
- package/dist/components/MessageList.d.ts.map +1 -0
- package/dist/components/MessageList.js +29 -0
- package/dist/components/MessageList.js.map +1 -0
- package/dist/components/MessageList.test.d.ts +2 -0
- package/dist/components/MessageList.test.d.ts.map +1 -0
- package/dist/components/MessageList.test.js +15 -0
- package/dist/components/MessageList.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.d.ts +18 -0
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.js +91 -0
- package/dist/components/ModelSelectionMenu.js.map +1 -0
- package/dist/components/ModelSelectionMenu.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.test.js +83 -0
- package/dist/components/ModelSelectionMenu.test.js.map +1 -0
- package/dist/components/PathSelectionMenu.d.ts +12 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -0
- package/dist/components/PathSelectionMenu.js +42 -0
- package/dist/components/PathSelectionMenu.js.map +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts +9 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.js +21 -0
- package/dist/components/SettingsSelectionMenu.js.map +1 -0
- package/dist/components/SlashCommandMenu.d.ts +15 -0
- package/dist/components/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/SlashCommandMenu.js +20 -0
- package/dist/components/SlashCommandMenu.js.map +1 -0
- package/dist/components/StatusBar.d.ts +11 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +59 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/TextInput.d.ts +42 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +397 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput.test.d.ts.map +1 -0
- package/dist/components/TextInput.test.js +75 -0
- package/dist/components/TextInput.test.js.map +1 -0
- package/dist/context/InputContext.d.ts +31 -0
- package/dist/context/InputContext.d.ts.map +1 -0
- package/dist/context/InputContext.js +36 -0
- package/dist/context/InputContext.js.map +1 -0
- package/dist/context/InputContext.stability.test.d.ts +2 -0
- package/dist/context/InputContext.stability.test.d.ts.map +1 -0
- package/dist/context/InputContext.stability.test.js +28 -0
- package/dist/context/InputContext.stability.test.js.map +1 -0
- package/dist/context/InputContext.test.d.ts +2 -0
- package/dist/context/InputContext.test.d.ts.map +1 -0
- package/dist/context/InputContext.test.js +168 -0
- package/dist/context/InputContext.test.js.map +1 -0
- 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 +78 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -0
- package/dist/hooks/use-conversation.js +1017 -0
- package/dist/hooks/use-conversation.js.map +1 -0
- package/dist/hooks/use-input-history.d.ts +16 -0
- package/dist/hooks/use-input-history.d.ts.map +1 -0
- package/dist/hooks/use-input-history.js +71 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/hooks/use-model-selection.d.ts +27 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.js +187 -0
- package/dist/hooks/use-model-selection.js.map +1 -0
- 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.d.ts +22 -0
- package/dist/hooks/use-path-completion.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.js +153 -0
- package/dist/hooks/use-path-completion.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-setting.d.ts +7 -0
- package/dist/hooks/use-setting.d.ts.map +1 -0
- package/dist/hooks/use-setting.js +35 -0
- package/dist/hooks/use-setting.js.map +1 -0
- package/dist/hooks/use-settings-completion.d.ts +23 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.js +164 -0
- package/dist/hooks/use-settings-completion.js.map +1 -0
- package/dist/hooks/use-settings-completion.test.d.ts +2 -0
- package/dist/hooks/use-settings-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.test.js +334 -0
- package/dist/hooks/use-settings-completion.test.js.map +1 -0
- package/dist/hooks/use-slash-commands.d.ts +21 -0
- package/dist/hooks/use-slash-commands.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.js +87 -0
- package/dist/hooks/use-slash-commands.js.map +1 -0
- package/dist/hooks/use-slash-commands.test.d.ts +2 -0
- package/dist/hooks/use-slash-commands.test.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.test.js +246 -0
- package/dist/hooks/use-slash-commands.test.js.map +1 -0
- package/dist/lib/editor-impl.d.ts +23 -0
- package/dist/lib/editor-impl.d.ts.map +1 -0
- package/dist/lib/editor-impl.js +235 -0
- package/dist/lib/editor-impl.js.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.js +68 -0
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts +48 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.js +653 -0
- package/dist/lib/openai-agent-client.js.map +1 -0
- package/dist/lib/openai-agent-client.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.test.js +181 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -0
- package/dist/lib/shell.d.ts +7 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +56 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +4 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -0
- package/dist/lib/tool-invoke.js +26 -0
- package/dist/lib/tool-invoke.js.map +1 -0
- package/dist/lib/tool-invoke.test.d.ts +2 -0
- package/dist/lib/tool-invoke.test.d.ts.map +1 -0
- package/dist/lib/tool-invoke.test.js +19 -0
- package/dist/lib/tool-invoke.test.js.map +1 -0
- package/dist/no-singleton-imports.test.d.ts +2 -0
- package/dist/no-singleton-imports.test.d.ts.map +1 -0
- package/dist/no-singleton-imports.test.js +30 -0
- package/dist/no-singleton-imports.test.js.map +1 -0
- package/dist/prompts/anthropic.md +79 -0
- package/dist/prompts/codex.md +97 -0
- package/dist/prompts/default.md +77 -0
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/gpt-5.md +318 -0
- package/dist/prompts/lite.md +29 -0
- package/dist/prompts/simple-mentor.md +207 -0
- package/dist/prompts/simple.md +189 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-compatible/api.d.ts +17 -0
- package/dist/providers/openai-compatible/api.d.ts.map +1 -0
- package/dist/providers/openai-compatible/api.js +58 -0
- package/dist/providers/openai-compatible/api.js.map +1 -0
- package/dist/providers/openai-compatible/model.d.ts +17 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -0
- package/dist/providers/openai-compatible/model.js +435 -0
- package/dist/providers/openai-compatible/model.js.map +1 -0
- package/dist/providers/openai-compatible/provider.d.ts +22 -0
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible/provider.js +43 -0
- package/dist/providers/openai-compatible/provider.js.map +1 -0
- package/dist/providers/openai-compatible/utils.d.ts +3 -0
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
- package/dist/providers/openai-compatible/utils.js +11 -0
- package/dist/providers/openai-compatible/utils.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts +8 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.js +71 -0
- package/dist/providers/openai-compatible.provider.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +2 -0
- package/dist/providers/openai.provider.d.ts.map +1 -0
- package/dist/providers/openai.provider.js +36 -0
- package/dist/providers/openai.provider.js.map +1 -0
- package/dist/providers/openrouter/api.d.ts +39 -0
- package/dist/providers/openrouter/api.d.ts.map +1 -0
- package/dist/providers/openrouter/api.js +172 -0
- package/dist/providers/openrouter/api.js.map +1 -0
- package/dist/providers/openrouter/converters.d.ts +8 -0
- package/dist/providers/openrouter/converters.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.js +382 -0
- package/dist/providers/openrouter/converters.js.map +1 -0
- package/dist/providers/openrouter/converters.test.d.ts +2 -0
- package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.test.js +158 -0
- package/dist/providers/openrouter/converters.test.js.map +1 -0
- package/dist/providers/openrouter/index.d.ts +4 -0
- package/dist/providers/openrouter/index.d.ts.map +1 -0
- package/dist/providers/openrouter/index.js +4 -0
- package/dist/providers/openrouter/index.js.map +1 -0
- package/dist/providers/openrouter/model.d.ts +14 -0
- package/dist/providers/openrouter/model.d.ts.map +1 -0
- package/dist/providers/openrouter/model.js +485 -0
- package/dist/providers/openrouter/model.js.map +1 -0
- package/dist/providers/openrouter/provider.d.ts +15 -0
- package/dist/providers/openrouter/provider.d.ts.map +1 -0
- package/dist/providers/openrouter/provider.js +21 -0
- package/dist/providers/openrouter/provider.js.map +1 -0
- package/dist/providers/openrouter/utils.d.ts +10 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -0
- package/dist/providers/openrouter/utils.js +27 -0
- package/dist/providers/openrouter/utils.js.map +1 -0
- package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
- package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
- package/dist/providers/openrouter.api.retry.test.js +148 -0
- package/dist/providers/openrouter.api.retry.test.js.map +1 -0
- package/dist/providers/openrouter.d.ts +2 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- 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.js +4 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts +2 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.js +23 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +2 -0
- package/dist/providers/openrouter.provider.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.js +56 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/dist/providers/openrouter.test.d.ts +2 -0
- package/dist/providers/openrouter.test.d.ts.map +1 -0
- package/dist/providers/openrouter.test.js +1382 -0
- package/dist/providers/openrouter.test.js.map +1 -0
- package/dist/providers/registry.d.ts +65 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +44 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/registry.test.d.ts +2 -0
- package/dist/providers/registry.test.d.ts.map +1 -0
- package/dist/providers/registry.test.js +76 -0
- package/dist/providers/registry.test.js.map +1 -0
- package/dist/providers/web-search/index.d.ts +8 -0
- package/dist/providers/web-search/index.d.ts.map +1 -0
- package/dist/providers/web-search/index.js +9 -0
- package/dist/providers/web-search/index.js.map +1 -0
- package/dist/providers/web-search/registry.d.ts +35 -0
- package/dist/providers/web-search/registry.d.ts.map +1 -0
- package/dist/providers/web-search/registry.js +56 -0
- package/dist/providers/web-search/registry.js.map +1 -0
- package/dist/providers/web-search/registry.test.d.ts +2 -0
- package/dist/providers/web-search/registry.test.d.ts.map +1 -0
- package/dist/providers/web-search/registry.test.js +105 -0
- package/dist/providers/web-search/registry.test.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.d.ts +15 -0
- package/dist/providers/web-search/tavily.provider.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.js +69 -0
- package/dist/providers/web-search/tavily.provider.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts +2 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.js +67 -0
- package/dist/providers/web-search/tavily.provider.test.js.map +1 -0
- package/dist/providers/web-search/types.d.ts +55 -0
- package/dist/providers/web-search/types.d.ts.map +1 -0
- package/dist/providers/web-search/types.js +6 -0
- package/dist/providers/web-search/types.js.map +1 -0
- package/dist/safety-checker.js +57 -0
- package/dist/services/conversation-events.d.ts +76 -0
- package/dist/services/conversation-events.d.ts.map +1 -0
- package/dist/services/conversation-events.js +2 -0
- package/dist/services/conversation-events.js.map +1 -0
- package/dist/services/conversation-service.d.ts +31 -0
- package/dist/services/conversation-service.d.ts.map +1 -0
- package/dist/services/conversation-service.js +46 -0
- package/dist/services/conversation-service.js.map +1 -0
- package/dist/services/conversation-service.test.js +190 -0
- package/dist/services/conversation-session.d.ts +99 -0
- package/dist/services/conversation-session.d.ts.map +1 -0
- package/dist/services/conversation-session.js +978 -0
- package/dist/services/conversation-session.js.map +1 -0
- package/dist/services/conversation-store.d.ts +24 -0
- package/dist/services/conversation-store.d.ts.map +1 -0
- package/dist/services/conversation-store.js +216 -0
- package/dist/services/conversation-store.js.map +1 -0
- package/dist/services/conversation-store.test.d.ts +2 -0
- package/dist/services/conversation-store.test.d.ts.map +1 -0
- package/dist/services/conversation-store.test.js +167 -0
- package/dist/services/conversation-store.test.js.map +1 -0
- package/dist/services/execution-context.d.ts +10 -0
- package/dist/services/execution-context.d.ts.map +1 -0
- package/dist/services/execution-context.js +22 -0
- package/dist/services/execution-context.js.map +1 -0
- package/dist/services/execution-context.test.d.ts +2 -0
- package/dist/services/execution-context.test.d.ts.map +1 -0
- package/dist/services/execution-context.test.js +49 -0
- package/dist/services/execution-context.test.js.map +1 -0
- package/dist/services/file-service.d.ts +12 -0
- package/dist/services/file-service.d.ts.map +1 -0
- package/dist/services/file-service.js +90 -0
- package/dist/services/file-service.js.map +1 -0
- package/dist/services/history-service.d.ts +39 -0
- package/dist/services/history-service.d.ts.map +1 -0
- package/dist/services/history-service.js +152 -0
- package/dist/services/history-service.js.map +1 -0
- package/dist/services/logging-service.d.ts +75 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +343 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/model-service.d.ts +15 -0
- package/dist/services/model-service.d.ts.map +1 -0
- package/dist/services/model-service.js +46 -0
- package/dist/services/model-service.js.map +1 -0
- package/dist/services/model-service.test.d.ts +2 -0
- package/dist/services/model-service.test.d.ts.map +1 -0
- package/dist/services/model-service.test.js +128 -0
- package/dist/services/model-service.test.js.map +1 -0
- package/dist/services/service-interfaces.d.ts +33 -0
- package/dist/services/service-interfaces.d.ts.map +1 -0
- package/dist/services/service-interfaces.js +2 -0
- package/dist/services/service-interfaces.js.map +1 -0
- package/dist/services/settings-service.d.ts +316 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +1128 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/settings-service.mock.d.ts +20 -0
- package/dist/services/settings-service.mock.d.ts.map +1 -0
- package/dist/services/settings-service.mock.js +55 -0
- package/dist/services/settings-service.mock.js.map +1 -0
- package/dist/services/singleton-deprecation.test.d.ts +2 -0
- package/dist/services/singleton-deprecation.test.d.ts.map +1 -0
- package/dist/services/singleton-deprecation.test.js +59 -0
- package/dist/services/singleton-deprecation.test.js.map +1 -0
- package/dist/services/ssh-service.d.ts +32 -0
- package/dist/services/ssh-service.d.ts.map +1 -0
- package/dist/services/ssh-service.js +119 -0
- package/dist/services/ssh-service.js.map +1 -0
- package/dist/services/ssh-service.test.d.ts +2 -0
- package/dist/services/ssh-service.test.d.ts.map +1 -0
- package/dist/services/ssh-service.test.js +269 -0
- package/dist/services/ssh-service.test.js.map +1 -0
- 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/apply-patch.d.ts +28 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +399 -0
- package/dist/tools/apply-patch.js.map +1 -0
- package/dist/tools/apply-patch.test.d.ts +2 -0
- package/dist/tools/apply-patch.test.d.ts.map +1 -0
- package/dist/tools/apply-patch.test.js +155 -0
- package/dist/tools/apply-patch.test.js.map +1 -0
- package/dist/tools/ask-mentor.d.ts +11 -0
- package/dist/tools/ask-mentor.d.ts.map +1 -0
- package/dist/tools/ask-mentor.js +52 -0
- package/dist/tools/ask-mentor.js.map +1 -0
- package/dist/tools/ask-mentor.test.d.ts +2 -0
- package/dist/tools/ask-mentor.test.d.ts.map +1 -0
- package/dist/tools/ask-mentor.test.js +47 -0
- package/dist/tools/ask-mentor.test.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +55 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/find-files.d.ts +15 -0
- package/dist/tools/find-files.d.ts.map +1 -0
- package/dist/tools/find-files.js +179 -0
- package/dist/tools/find-files.js.map +1 -0
- package/dist/tools/find-files.test.d.ts +2 -0
- package/dist/tools/find-files.test.d.ts.map +1 -0
- package/dist/tools/find-files.test.js +131 -0
- package/dist/tools/find-files.test.js.map +1 -0
- package/dist/tools/format-helpers.d.ts +34 -0
- package/dist/tools/format-helpers.d.ts.map +1 -0
- package/dist/tools/format-helpers.js +131 -0
- package/dist/tools/format-helpers.js.map +1 -0
- package/dist/tools/grep.d.ts +16 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +211 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/read-file.d.ts +15 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +114 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/read-file.test.d.ts +2 -0
- package/dist/tools/read-file.test.d.ts.map +1 -0
- package/dist/tools/read-file.test.js +122 -0
- package/dist/tools/read-file.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts +19 -0
- package/dist/tools/search-replace.d.ts.map +1 -0
- package/dist/tools/search-replace.js +411 -0
- package/dist/tools/search-replace.js.map +1 -0
- package/dist/tools/search-replace.test.d.ts +2 -0
- package/dist/tools/search-replace.test.d.ts.map +1 -0
- package/dist/tools/search-replace.test.js +302 -0
- package/dist/tools/search-replace.test.js.map +1 -0
- package/dist/tools/search.d.ts +15 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +143 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.d.ts +19 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +278 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/tool-execution-context.d.ts +7 -0
- package/dist/tools/tool-execution-context.d.ts.map +1 -0
- package/dist/tools/tool-execution-context.js +7 -0
- package/dist/tools/tool-execution-context.js.map +1 -0
- package/dist/tools/types.d.ts +30 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +12 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +19 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +29 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +106 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/web-search.test.d.ts +2 -0
- package/dist/tools/web-search.test.d.ts.map +1 -0
- package/dist/tools/web-search.test.js +176 -0
- package/dist/tools/web-search.test.js.map +1 -0
- package/dist/utils/command-logger.d.ts +11 -0
- package/dist/utils/command-logger.d.ts.map +1 -0
- package/dist/utils/command-logger.js +34 -0
- package/dist/utils/command-logger.js.map +1 -0
- package/dist/utils/command-safety/constants.d.ts +21 -0
- package/dist/utils/command-safety/constants.d.ts.map +1 -0
- package/dist/utils/command-safety/constants.js +245 -0
- package/dist/utils/command-safety/constants.js.map +1 -0
- package/dist/utils/command-safety/find-helpers.d.ts +15 -0
- package/dist/utils/command-safety/find-helpers.d.ts.map +1 -0
- package/dist/utils/command-safety/find-helpers.js +218 -0
- package/dist/utils/command-safety/find-helpers.js.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.js +113 -0
- package/dist/utils/command-safety/handlers/find-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.js +68 -0
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/index.d.ts +13 -0
- package/dist/utils/command-safety/handlers/index.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/index.js +20 -0
- package/dist/utils/command-safety/handlers/index.js.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.js +94 -0
- package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/types.d.ts +36 -0
- package/dist/utils/command-safety/handlers/types.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/types.js +2 -0
- package/dist/utils/command-safety/handlers/types.js.map +1 -0
- package/dist/utils/command-safety/index.d.ts +14 -0
- package/dist/utils/command-safety/index.d.ts.map +1 -0
- package/dist/utils/command-safety/index.js +183 -0
- package/dist/utils/command-safety/index.js.map +1 -0
- package/dist/utils/command-safety/path-analysis.d.ts +4 -0
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -0
- package/dist/utils/command-safety/path-analysis.js +153 -0
- package/dist/utils/command-safety/path-analysis.js.map +1 -0
- package/dist/utils/command-safety/utils.d.ts +2 -0
- package/dist/utils/command-safety/utils.d.ts.map +1 -0
- package/dist/utils/command-safety/utils.js +22 -0
- package/dist/utils/command-safety/utils.js.map +1 -0
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.d.ts +2 -0
- package/dist/utils/command-safety.find.test.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.js +342 -0
- package/dist/utils/command-safety.find.test.js.map +1 -0
- package/dist/utils/command-safety.js +702 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/command-safety.path.test.d.ts +2 -0
- package/dist/utils/command-safety.path.test.d.ts.map +1 -0
- package/dist/utils/command-safety.path.test.js +360 -0
- package/dist/utils/command-safety.path.test.js.map +1 -0
- package/dist/utils/diff.d.ts +2 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +44 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/diff.test.d.ts +2 -0
- package/dist/utils/diff.test.d.ts.map +1 -0
- package/dist/utils/diff.test.js +85 -0
- package/dist/utils/diff.test.js.map +1 -0
- package/dist/utils/error-helpers.d.ts +6 -0
- package/dist/utils/error-helpers.d.ts.map +1 -0
- package/dist/utils/error-helpers.js +46 -0
- package/dist/utils/error-helpers.js.map +1 -0
- package/dist/utils/error-helpers.test.d.ts +2 -0
- package/dist/utils/error-helpers.test.d.ts.map +1 -0
- package/dist/utils/error-helpers.test.js +152 -0
- package/dist/utils/error-helpers.test.js.map +1 -0
- package/dist/utils/execute-shell.d.ts +15 -0
- package/dist/utils/execute-shell.d.ts.map +1 -0
- package/dist/utils/execute-shell.js +34 -0
- package/dist/utils/execute-shell.js.map +1 -0
- package/dist/utils/execute-shell.test.d.ts +2 -0
- package/dist/utils/execute-shell.test.d.ts.map +1 -0
- package/dist/utils/execute-shell.test.js +20 -0
- package/dist/utils/execute-shell.test.js.map +1 -0
- package/dist/utils/extract-command-messages.d.ts +5 -0
- package/dist/utils/extract-command-messages.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.js +140 -0
- package/dist/utils/extract-command-messages.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 +57 -0
- package/dist/utils/message-buffer.d.ts +2 -0
- package/dist/utils/message-buffer.d.ts.map +1 -0
- package/dist/utils/message-buffer.js +15 -0
- package/dist/utils/message-buffer.js.map +1 -0
- package/dist/utils/message-buffer.test.d.ts +2 -0
- package/dist/utils/message-buffer.test.d.ts.map +1 -0
- package/dist/utils/message-buffer.test.js +17 -0
- package/dist/utils/message-buffer.test.js.map +1 -0
- package/dist/utils/output-trim.d.ts +31 -0
- package/dist/utils/output-trim.d.ts.map +1 -0
- package/dist/utils/output-trim.js +71 -0
- package/dist/utils/output-trim.js.map +1 -0
- package/dist/utils/provider-credentials.d.ts +10 -0
- package/dist/utils/provider-credentials.d.ts.map +1 -0
- package/dist/utils/provider-credentials.js +22 -0
- package/dist/utils/provider-credentials.js.map +1 -0
- package/dist/utils/settings-command.d.ts +13 -0
- package/dist/utils/settings-command.d.ts.map +1 -0
- package/dist/utils/settings-command.js +173 -0
- package/dist/utils/settings-command.js.map +1 -0
- package/dist/utils/ssh-config-parser.d.ts +21 -0
- package/dist/utils/ssh-config-parser.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.js +89 -0
- package/dist/utils/ssh-config-parser.js.map +1 -0
- package/dist/utils/ssh-config-parser.test.d.ts +2 -0
- package/dist/utils/ssh-config-parser.test.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.test.js +153 -0
- package/dist/utils/ssh-config-parser.test.js.map +1 -0
- package/dist/utils/streaming-updater.d.ts +7 -0
- package/dist/utils/streaming-updater.d.ts.map +1 -0
- package/dist/utils/streaming-updater.js +41 -0
- package/dist/utils/streaming-updater.js.map +1 -0
- package/dist/utils/throttle.d.ts +7 -0
- package/dist/utils/throttle.d.ts.map +1 -0
- package/dist/utils/throttle.js +49 -0
- package/dist/utils/throttle.js.map +1 -0
- package/package.json +108 -0
- package/readme.md +428 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createThrottledFunction } from './throttle.js';
|
|
2
|
+
export const createStreamingUpdateCoordinator = (onUpdate, intervalMs) => {
|
|
3
|
+
let lastEmitted = null;
|
|
4
|
+
const throttled = createThrottledFunction((...args) => {
|
|
5
|
+
if (lastEmitted && args.length === lastEmitted.length) {
|
|
6
|
+
let isDuplicate = true;
|
|
7
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
8
|
+
if (args[i] !== lastEmitted[i]) {
|
|
9
|
+
isDuplicate = false;
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (isDuplicate) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
lastEmitted = args;
|
|
18
|
+
onUpdate(...args);
|
|
19
|
+
}, intervalMs);
|
|
20
|
+
const push = (...args) => {
|
|
21
|
+
if (lastEmitted && args.length === lastEmitted.length) {
|
|
22
|
+
let isDuplicate = true;
|
|
23
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
24
|
+
if (args[i] !== lastEmitted[i]) {
|
|
25
|
+
isDuplicate = false;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (isDuplicate) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throttled.throttled(...args);
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
push,
|
|
37
|
+
flush: throttled.flush,
|
|
38
|
+
cancel: throttled.cancel,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=streaming-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-updater.js","sourceRoot":"","sources":["../../source/utils/streaming-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,eAAe,CAAC;AAQtD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC5C,QAAiC,EACjC,UAAkB,EACc,EAAE;IAClC,IAAI,WAAW,GAAgB,IAAI,CAAC;IAEpC,MAAM,SAAS,GAAG,uBAAuB,CAAC,CAAC,GAAG,IAAU,EAAE,EAAE;QACxD,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM;gBACV,CAAC;YACL,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO;YACX,CAAC;QACL,CAAC;QACD,WAAW,GAAG,IAAI,CAAC;QACnB,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IACtB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,CAAC,GAAG,IAAU,EAAE,EAAE;QAC3B,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM;gBACV,CAAC;YACL,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO;YACX,CAAC;QACL,CAAC;QACD,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,OAAO;QACH,IAAI;QACJ,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,SAAS,CAAC,MAAM;KAC3B,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ThrottledFunction<Args extends unknown[]> = {
|
|
2
|
+
throttled: (...args: Args) => void;
|
|
3
|
+
flush: () => void;
|
|
4
|
+
cancel: () => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const createThrottledFunction: <Args extends unknown[]>(fn: (...args: Args) => void, intervalMs: number) => ThrottledFunction<Args>;
|
|
7
|
+
//# sourceMappingURL=throttle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../source/utils/throttle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI;IACpD,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,IAAI,SAAS,OAAO,EAAE,EAC1D,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAC3B,YAAY,MAAM,KACnB,iBAAiB,CAAC,IAAI,CAkDxB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export const createThrottledFunction = (fn, intervalMs) => {
|
|
2
|
+
let lastCallTime = 0;
|
|
3
|
+
let timeout = null;
|
|
4
|
+
let pendingArgs = null;
|
|
5
|
+
const invoke = () => {
|
|
6
|
+
if (!pendingArgs)
|
|
7
|
+
return;
|
|
8
|
+
const args = pendingArgs;
|
|
9
|
+
pendingArgs = null;
|
|
10
|
+
lastCallTime = Date.now();
|
|
11
|
+
fn(...args);
|
|
12
|
+
};
|
|
13
|
+
const schedule = (delayMs) => {
|
|
14
|
+
if (timeout)
|
|
15
|
+
return;
|
|
16
|
+
timeout = setTimeout(() => {
|
|
17
|
+
timeout = null;
|
|
18
|
+
invoke();
|
|
19
|
+
}, delayMs);
|
|
20
|
+
};
|
|
21
|
+
const throttled = (...args) => {
|
|
22
|
+
pendingArgs = args;
|
|
23
|
+
if (timeout)
|
|
24
|
+
return;
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
const elapsed = now - lastCallTime;
|
|
27
|
+
if (elapsed >= intervalMs) {
|
|
28
|
+
invoke();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
schedule(intervalMs - elapsed);
|
|
32
|
+
};
|
|
33
|
+
const flush = () => {
|
|
34
|
+
if (timeout) {
|
|
35
|
+
clearTimeout(timeout);
|
|
36
|
+
timeout = null;
|
|
37
|
+
}
|
|
38
|
+
invoke();
|
|
39
|
+
};
|
|
40
|
+
const cancel = () => {
|
|
41
|
+
if (timeout) {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
timeout = null;
|
|
44
|
+
}
|
|
45
|
+
pendingArgs = null;
|
|
46
|
+
};
|
|
47
|
+
return { throttled, flush, cancel };
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../source/utils/throttle.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACnC,EAA2B,EAC3B,UAAkB,EACK,EAAE;IACzB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAyC,IAAI,CAAC;IACzD,IAAI,WAAW,GAAgB,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,GAAG,EAAE;QAChB,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,EAAE;QACjC,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,EAAE,CAAC;QACb,CAAC,EAAE,OAAO,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,GAAG,IAAU,EAAE,EAAE;QAChC,WAAW,GAAG,IAAI,CAAC;QACnB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,YAAY,CAAC;QACnC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC;YACT,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACf,IAAI,OAAO,EAAE,CAAC;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAG,EAAE;QAChB,IAAI,OAAO,EAAE,CAAC;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,WAAW,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO,EAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC;AACtC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qduc/term2",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A terminal-based AI assistant that can help you get things done on your computer",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "qduc",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"ai",
|
|
9
|
+
"assistant",
|
|
10
|
+
"cli",
|
|
11
|
+
"terminal",
|
|
12
|
+
"openai",
|
|
13
|
+
"agent",
|
|
14
|
+
"chat",
|
|
15
|
+
"gpt"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/qduc/term2.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/qduc/term2",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/qduc/term2/issues"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"term2": "dist/cli.js"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=16"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"start": "node dist/cli.js",
|
|
34
|
+
"build": "tsc && npm run post-build",
|
|
35
|
+
"dev": "tsc --watch",
|
|
36
|
+
"test": "DISABLE_LOGGING=1 ava --reporter=min | grep -v '✔'",
|
|
37
|
+
"test:verbose": "tsc && ava",
|
|
38
|
+
"lint": "prettier --check .",
|
|
39
|
+
"lint-fix": "prettier --write .",
|
|
40
|
+
"post-build": "cp -r source/prompts dist/",
|
|
41
|
+
"prepublishOnly": "npm run build && npm test",
|
|
42
|
+
"logs": "node tools/log_viewer/src/server.js"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist"
|
|
46
|
+
],
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@openai/agents": "^0.3.3",
|
|
49
|
+
"@types/ssh2": "^1.15.5",
|
|
50
|
+
"bash-parser": "^0.5.0",
|
|
51
|
+
"env-paths": "^3.0.0",
|
|
52
|
+
"fast-glob": "^3.3.2",
|
|
53
|
+
"fuse.js": "^7.0.0",
|
|
54
|
+
"ignore": "^5.3.2",
|
|
55
|
+
"ink": "^6.5.1",
|
|
56
|
+
"ink-prompt": "^0.1.7",
|
|
57
|
+
"marked": "^17.0.1",
|
|
58
|
+
"meow": "^11.0.0",
|
|
59
|
+
"openai": "^6.9.1",
|
|
60
|
+
"react": "^19.0.0",
|
|
61
|
+
"ssh2": "^1.17.0",
|
|
62
|
+
"winston": "^3.18.3",
|
|
63
|
+
"winston-daily-rotate-file": "^5.0.0",
|
|
64
|
+
"zod": "^4.1.13"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@ava/typescript": "^6.0.0",
|
|
68
|
+
"@babel/cli": "^7.21.0",
|
|
69
|
+
"@babel/preset-react": "^7.18.6",
|
|
70
|
+
"@types/env-paths": "^1.0.2",
|
|
71
|
+
"@types/marked": "^5.0.2",
|
|
72
|
+
"@types/node": "^24.10.1",
|
|
73
|
+
"@types/react": "^19.0.0",
|
|
74
|
+
"ava": "^6.4.1",
|
|
75
|
+
"chalk": "^5.2.0",
|
|
76
|
+
"eslint-config-xo-react": "^0.27.0",
|
|
77
|
+
"eslint-plugin-react": "^7.32.2",
|
|
78
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
79
|
+
"import-jsx": "^5.0.0",
|
|
80
|
+
"ink-testing-library": "^4.0.0",
|
|
81
|
+
"prettier": "^2.8.7",
|
|
82
|
+
"tsx": "^4.20.6",
|
|
83
|
+
"typescript": "^5.9.3"
|
|
84
|
+
},
|
|
85
|
+
"ava": {
|
|
86
|
+
"environmentVariables": {
|
|
87
|
+
"NODE_NO_WARNINGS": "1",
|
|
88
|
+
"DISABLE_LOGGING": "1"
|
|
89
|
+
},
|
|
90
|
+
"typescript": {
|
|
91
|
+
"rewritePaths": {
|
|
92
|
+
"source/": "dist/"
|
|
93
|
+
},
|
|
94
|
+
"compile": "tsc"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"xo": {
|
|
98
|
+
"extends": "xo-react",
|
|
99
|
+
"prettier": true,
|
|
100
|
+
"ignores": [
|
|
101
|
+
"**/*.test.js"
|
|
102
|
+
],
|
|
103
|
+
"rules": {
|
|
104
|
+
"react/prop-types": "off",
|
|
105
|
+
"unicorn/expiring-todo-comments": "off"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
# term2
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/term2)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
|
|
7
|
+
A powerful terminal-based AI assistant that helps you get things done on your computer through natural conversation.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, and OpenAI-compatible APIs
|
|
12
|
+
- 🔒 **Safe Execution** - Every command requires your explicit approval with diff preview
|
|
13
|
+
- 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace, grep, find files, file reading, web search, and mentor consultation
|
|
14
|
+
- 💬 **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/setting` for easy control
|
|
15
|
+
- 📝 **Smart Context** - The assistant understands your environment and provides relevant help
|
|
16
|
+
- 🎯 **Streaming Responses** - See the AI's thoughts and reasoning in real-time
|
|
17
|
+
- 🧠 **Reasoning Effort Control** - Configurable reasoning levels (minimal to high) for O1/O3 models
|
|
18
|
+
- ⚡ **Command History** - Navigate previous inputs with arrow keys
|
|
19
|
+
- 🎨 **Markdown Rendering** - Formatted code blocks and text in the terminal
|
|
20
|
+
- 🔄 **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
|
|
21
|
+
- 🌐 **SSH Mode** - Execute commands and edit files on remote servers over SSH
|
|
22
|
+
|
|
23
|
+
## Demo
|
|
24
|
+
|
|
25
|
+
<!-- Add a demo GIF or screenshot here -->
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
$ term2
|
|
29
|
+
You: What files are in my current directory?
|
|
30
|
+
Assistant: I'll list the files for you.
|
|
31
|
+
|
|
32
|
+
📋 Command to execute:
|
|
33
|
+
ls -la
|
|
34
|
+
|
|
35
|
+
Approve? (y/n): y
|
|
36
|
+
...
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
**Requirements:**
|
|
42
|
+
|
|
43
|
+
- Node.js 16 or higher
|
|
44
|
+
- An API key from OpenAI, OpenRouter, or any OpenAI-compatible provider
|
|
45
|
+
|
|
46
|
+
Install globally via npm:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install --global term2
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Set your API key as an environment variable:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# For OpenAI (default)
|
|
56
|
+
export OPENAI_API_KEY="your-api-key-here"
|
|
57
|
+
|
|
58
|
+
# For OpenRouter
|
|
59
|
+
export TERM2_AGENT_PROVIDER="openrouter"
|
|
60
|
+
export TERM2_AGENT_OPENROUTER_API_KEY="your-openrouter-key"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
To make it permanent, add the export to your shell configuration file (`~/.bashrc`, `~/.zshrc`, or `~/.profile`).
|
|
64
|
+
|
|
65
|
+
## Usage
|
|
66
|
+
|
|
67
|
+
Start the assistant:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
term2
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then simply chat with the AI! Type your question or request, press Enter, and the assistant will help you.
|
|
74
|
+
|
|
75
|
+
### Basic Examples
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
"What files are in my current directory?"
|
|
79
|
+
"Show me my git status"
|
|
80
|
+
"Create a backup of my documents folder"
|
|
81
|
+
"What's using port 3000?"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Advanced Examples
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
"Find all TODO comments in my JavaScript files"
|
|
88
|
+
"Help me debug why my server won't start on port 8080"
|
|
89
|
+
"Create a new React component called UserProfile"
|
|
90
|
+
"Show me the disk usage of my home directory"
|
|
91
|
+
"What processes are consuming the most memory?"
|
|
92
|
+
"Search for the word 'config' in all .json files"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Command Line Options
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
term2 # Start with default model (gpt-5.1)
|
|
99
|
+
term2 -m gpt-4o # Use a specific model
|
|
100
|
+
term2 --model gpt-4o-mini # Use GPT-4o mini for faster/cheaper responses
|
|
101
|
+
term2 -r high # Set reasoning effort to high (for O1/O3 models)
|
|
102
|
+
term2 --reasoning medium # Set reasoning effort to medium
|
|
103
|
+
term2 --lite # Start in lite mode (session-only, minimal context)
|
|
104
|
+
|
|
105
|
+
# SSH Mode - execute on remote servers
|
|
106
|
+
term2 --ssh user@host --remote-dir /path/to/project
|
|
107
|
+
term2 --ssh deploy@server.com --remote-dir /var/www/app --ssh-port 2222
|
|
108
|
+
|
|
109
|
+
# Combine SSH with lite mode for remote terminal assistance
|
|
110
|
+
term2 --ssh user@host --remote-dir /path --lite
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Slash Commands
|
|
114
|
+
|
|
115
|
+
While in the chat, you can use these commands:
|
|
116
|
+
|
|
117
|
+
- `/clear` - Clear the conversation history
|
|
118
|
+
- `/quit` - Exit the application
|
|
119
|
+
- `/model [model-name]` - Switch to a different model
|
|
120
|
+
- `/mentor` - Toggle mentor mode (collaborative mode with mentor model)
|
|
121
|
+
- `/lite` - Toggle lite mode (minimal context, session-only)
|
|
122
|
+
- `/settings [key] [value]` - Modify runtime settings (e.g., `/settings agent.temperature 0.7`)
|
|
123
|
+
|
|
124
|
+
## Configuration
|
|
125
|
+
|
|
126
|
+
term2 stores its configuration in:
|
|
127
|
+
|
|
128
|
+
- **macOS**: `~/Library/Logs/term2-nodejs/settings.json`
|
|
129
|
+
- **Linux**: `~/.local/state/term2-nodejs/settings.json`
|
|
130
|
+
|
|
131
|
+
You can also configure settings via environment variables (prefix with `TERM2_`):
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Agent settings
|
|
135
|
+
export TERM2_AGENT_MODEL="gpt-4o"
|
|
136
|
+
export TERM2_AGENT_PROVIDER="openai" # or "openrouter"
|
|
137
|
+
export TERM2_AGENT_REASONING_EFFORT="medium" # none, minimal, low, medium, high, default
|
|
138
|
+
export TERM2_AGENT_TEMPERATURE="0.7" # 0.0 to 2.0
|
|
139
|
+
export TERM2_AGENT_MAX_TURNS="100"
|
|
140
|
+
export TERM2_AGENT_RETRY_ATTEMPTS="2"
|
|
141
|
+
|
|
142
|
+
# Provider-specific settings
|
|
143
|
+
export TERM2_AGENT_OPENROUTER_API_KEY="your-key"
|
|
144
|
+
|
|
145
|
+
# Tool settings
|
|
146
|
+
export TERM2_SHELL_TIMEOUT="180000"
|
|
147
|
+
export TERM2_SHELL_MAX_OUTPUT_LINES="1000"
|
|
148
|
+
|
|
149
|
+
# Web Search settings
|
|
150
|
+
export TAVILY_API_KEY="tvly-..." # Your Tavily API key
|
|
151
|
+
export TERM2_WEBSEARCH_PROVIDER="tavily" # Web search provider (default: tavily)
|
|
152
|
+
|
|
153
|
+
# App settings
|
|
154
|
+
export TERM2_APP_MODE="default" # or "edit" for automatic patch approval
|
|
155
|
+
|
|
156
|
+
# SSH settings (alternative to CLI flags)
|
|
157
|
+
export TERM2_SSH_HOST="user@server.com"
|
|
158
|
+
export TERM2_SSH_PORT="22"
|
|
159
|
+
export TERM2_SSH_REMOTE_DIR="/path/to/project"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## How It Works
|
|
163
|
+
|
|
164
|
+
1. You type a message and press Enter
|
|
165
|
+
2. The AI analyzes your request and determines if it needs to execute commands
|
|
166
|
+
3. If a command is needed, you'll see a preview and approval prompt
|
|
167
|
+
4. After approval, the command runs and results are shown
|
|
168
|
+
5. The AI uses the results to provide a helpful response
|
|
169
|
+
6. You stay in full control - reject any command with 'n'
|
|
170
|
+
|
|
171
|
+
## SSH Mode
|
|
172
|
+
|
|
173
|
+
SSH mode enables term2 to execute commands and modify files on remote servers over SSH. This is useful for managing remote deployments, debugging server issues, or working on remote development environments.
|
|
174
|
+
|
|
175
|
+
### Requirements
|
|
176
|
+
|
|
177
|
+
- SSH agent running with your keys loaded (`ssh-add`)
|
|
178
|
+
- SSH access to the target server
|
|
179
|
+
- `--remote-dir` is required to specify the working directory (optional in lite mode - will auto-detect)
|
|
180
|
+
|
|
181
|
+
### Usage
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Basic usage
|
|
185
|
+
term2 --ssh user@hostname --remote-dir /path/to/project
|
|
186
|
+
|
|
187
|
+
# With custom SSH port
|
|
188
|
+
term2 --ssh user@hostname --remote-dir /path/to/project --ssh-port 2222
|
|
189
|
+
|
|
190
|
+
# With lite mode (auto-detects remote directory)
|
|
191
|
+
term2 --ssh user@hostname --lite
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### How It Works
|
|
195
|
+
|
|
196
|
+
When SSH mode is enabled:
|
|
197
|
+
1. term2 establishes an SSH connection using your SSH agent for authentication
|
|
198
|
+
2. All shell commands are executed on the remote server via SSH
|
|
199
|
+
3. File operations (read, write, patch) are performed remotely using shell commands (`cat`, heredocs)
|
|
200
|
+
4. The working directory is set to `--remote-dir` on the remote server
|
|
201
|
+
5. The connection is automatically closed when you exit term2
|
|
202
|
+
|
|
203
|
+
### Combining with Lite Mode
|
|
204
|
+
|
|
205
|
+
SSH mode works seamlessly with lite mode for lightweight remote terminal assistance:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
term2 --ssh user@host --remote-dir /path/to/project --lite
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
This combination provides:
|
|
212
|
+
- Remote command execution over SSH
|
|
213
|
+
- Read-only tools (grep, find_files, read_file) for exploration
|
|
214
|
+
- Minimal context and faster responses
|
|
215
|
+
- No file editing tools (safer for production servers)
|
|
216
|
+
|
|
217
|
+
### Limitations
|
|
218
|
+
|
|
219
|
+
- Authentication is via SSH agent only (no password prompts)
|
|
220
|
+
- Binary file operations are not supported (text files only)
|
|
221
|
+
- Large file transfers may be slower than local operations
|
|
222
|
+
|
|
223
|
+
## Safety Features
|
|
224
|
+
|
|
225
|
+
- **Command Approval** - Every destructive operation requires your explicit confirmation
|
|
226
|
+
- **Diff Preview** - See exact file changes before approving patches or edits
|
|
227
|
+
- **Risk Analysis** - Dangerous operations (like `rm -rf`, `git push --force`) are flagged
|
|
228
|
+
- **Path Safety** - Operations on sensitive directories require extra caution
|
|
229
|
+
- **Dry-Run Validation** - Patches are validated before approval to prevent errors
|
|
230
|
+
- **No Hidden Actions** - All tool usage is transparent and visible
|
|
231
|
+
- **Retry Limits** - Automatic abort after consecutive tool failures (default: 3)
|
|
232
|
+
|
|
233
|
+
## Available Tools
|
|
234
|
+
|
|
235
|
+
The AI assistant has access to these tools to help you:
|
|
236
|
+
|
|
237
|
+
### Shell Tool
|
|
238
|
+
Execute shell commands with safety validation:
|
|
239
|
+
- Detects dangerous patterns (`rm -rf`, force operations)
|
|
240
|
+
- Validates paths to prevent operations on sensitive directories
|
|
241
|
+
- Configurable timeout and output limits
|
|
242
|
+
- Requires explicit approval before execution
|
|
243
|
+
|
|
244
|
+
### Apply Patch Tool
|
|
245
|
+
Apply file changes using unified diff format:
|
|
246
|
+
- Create new files or update existing ones
|
|
247
|
+
- Dry-run validation before approval
|
|
248
|
+
- Clear diff preview showing exact changes
|
|
249
|
+
- Supports "edit mode" for automatic approval
|
|
250
|
+
|
|
251
|
+
### Search & Replace Tool
|
|
252
|
+
Find and replace text in files:
|
|
253
|
+
- Exact match with fallback to line-by-line matching
|
|
254
|
+
- Diff generation for user preview
|
|
255
|
+
- Single or multiple replacements
|
|
256
|
+
- Requires approval before making changes
|
|
257
|
+
|
|
258
|
+
### Grep Tool
|
|
259
|
+
Search codebase for patterns:
|
|
260
|
+
- Uses ripgrep when available (fast!)
|
|
261
|
+
- Supports regex patterns
|
|
262
|
+
- Respects .gitignore
|
|
263
|
+
- Read-only operation (no approval needed)
|
|
264
|
+
|
|
265
|
+
### Ask Mentor Tool
|
|
266
|
+
Consult a smarter model for advice:
|
|
267
|
+
- Query a different/better model for complex questions
|
|
268
|
+
- Configurable mentor model via settings
|
|
269
|
+
- Useful for getting second opinions
|
|
270
|
+
|
|
271
|
+
### Find Files Tool
|
|
272
|
+
Search for files in the workspace:
|
|
273
|
+
- High-performance file search using `fd`
|
|
274
|
+
- Supports glob patterns and exclusions
|
|
275
|
+
- Respects `.gitignore` by default
|
|
276
|
+
|
|
277
|
+
### Read File Tool
|
|
278
|
+
Read file contents with precision:
|
|
279
|
+
- Read entire files or specific line ranges
|
|
280
|
+
- Optimizes context usage for large files
|
|
281
|
+
- Support for reading multiple files
|
|
282
|
+
|
|
283
|
+
### Web Search Tool
|
|
284
|
+
Search the web for information:
|
|
285
|
+
- Uses Tavily API by default for web search
|
|
286
|
+
- Converts results to markdown for readability
|
|
287
|
+
- Pluggable architecture ready to swap in other providers (Serper, Brave, etc.)
|
|
288
|
+
- Read-only operation (no approval needed)
|
|
289
|
+
- Requires `TAVILY_API_KEY` environment variable or settings configuration
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
## Supported Models
|
|
293
|
+
|
|
294
|
+
term2 works with multiple AI providers:
|
|
295
|
+
|
|
296
|
+
### OpenAI (default)
|
|
297
|
+
- `gpt-5.2` (latest)
|
|
298
|
+
- `gpt-5.1` (default)
|
|
299
|
+
- `gpt-5`
|
|
300
|
+
- `gpt-5-mini`
|
|
301
|
+
- `gpt-4.1`
|
|
302
|
+
- `gpt-4.1-mini`
|
|
303
|
+
- `gpt-4o`
|
|
304
|
+
- `gpt-4o-mini`
|
|
305
|
+
- `o3` (supports reasoning effort)
|
|
306
|
+
- `o3-mini` (supports reasoning effort)
|
|
307
|
+
- `o1` (supports reasoning effort)
|
|
308
|
+
|
|
309
|
+
### OpenRouter
|
|
310
|
+
Access hundreds of models through OpenRouter including:
|
|
311
|
+
- Claude models (Anthropic)
|
|
312
|
+
- Gemini models (Google)
|
|
313
|
+
- Open-source models (Deepseek, GLM, Minimax, Devstral, etc.)
|
|
314
|
+
|
|
315
|
+
Set `TERM2_AGENT_PROVIDER="openrouter"` to use OpenRouter.
|
|
316
|
+
|
|
317
|
+
### OpenAI-Compatible
|
|
318
|
+
Any OpenAI-compatible API endpoint can be configured through runtime settings.
|
|
319
|
+
|
|
320
|
+
## Development
|
|
321
|
+
|
|
322
|
+
Want to contribute or run from source?
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Clone the repository
|
|
326
|
+
git clone https://github.com/qduc/term2.git
|
|
327
|
+
cd term2
|
|
328
|
+
|
|
329
|
+
# Install dependencies
|
|
330
|
+
npm install
|
|
331
|
+
|
|
332
|
+
# Run in development mode
|
|
333
|
+
npm run dev
|
|
334
|
+
|
|
335
|
+
# Run tests
|
|
336
|
+
npm test
|
|
337
|
+
|
|
338
|
+
# Build
|
|
339
|
+
npm run build
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Troubleshooting
|
|
343
|
+
|
|
344
|
+
### "OPENAI_API_KEY not set"
|
|
345
|
+
|
|
346
|
+
Make sure you've exported your OpenAI API key:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
export OPENAI_API_KEY="sk-..."
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Command not found: term2
|
|
353
|
+
|
|
354
|
+
After installation, you may need to restart your terminal or run:
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
source ~/.bashrc # or ~/.zshrc
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Permission denied
|
|
361
|
+
|
|
362
|
+
If you get permission errors during global installation, use:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
sudo npm install --global term2
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Or configure npm to install globally without sudo: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally
|
|
369
|
+
|
|
370
|
+
### SSH connection failed
|
|
371
|
+
|
|
372
|
+
Make sure your SSH agent is running and has your keys loaded:
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# Start SSH agent if not running
|
|
376
|
+
eval "$(ssh-agent -s)"
|
|
377
|
+
|
|
378
|
+
# Add your SSH key
|
|
379
|
+
ssh-add ~/.ssh/id_rsa
|
|
380
|
+
|
|
381
|
+
# Verify the key is loaded
|
|
382
|
+
ssh-add -l
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
Also verify you can connect manually: `ssh user@hostname`
|
|
386
|
+
|
|
387
|
+
### SSH mode: "remote-dir is required"
|
|
388
|
+
|
|
389
|
+
When using `--ssh` without `--lite`, you must also specify `--remote-dir`:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
term2 --ssh user@host --remote-dir /home/user/project
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
With `--lite` mode, `--remote-dir` is optional and will auto-detect:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
term2 --ssh user@host --lite
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Tips
|
|
402
|
+
|
|
403
|
+
- The assistant won't run dangerous commands without your approval
|
|
404
|
+
- You can reject any command by pressing 'n' when prompted
|
|
405
|
+
- Press Ctrl+C to exit the chat at any time
|
|
406
|
+
- Use arrow keys to navigate through your command history
|
|
407
|
+
- Be specific in your requests for better results
|
|
408
|
+
|
|
409
|
+
## License
|
|
410
|
+
|
|
411
|
+
MIT License - see [LICENSE](LICENSE) file for details
|
|
412
|
+
|
|
413
|
+
## Contributing
|
|
414
|
+
|
|
415
|
+
Contributions are welcome! Please feel free to submit a Pull Request or open an Issue on [GitHub](https://github.com/qduc/term2).
|
|
416
|
+
|
|
417
|
+
## Acknowledgments
|
|
418
|
+
|
|
419
|
+
Built with:
|
|
420
|
+
|
|
421
|
+
- [OpenAI Agents SDK](https://github.com/openai/openai-agents-js)
|
|
422
|
+
- [Ink](https://github.com/vadimdemedes/ink) - React for CLI
|
|
423
|
+
- [TypeScript](https://www.typescriptlang.org/)
|
|
424
|
+
- [ssh2](https://github.com/mscdex/ssh2) - SSH client for Node.js
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
Made with ❤️ by [qduc](https://github.com/qduc)
|