@qduc/term2 0.15.0 → 0.16.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/README.md +324 -316
- package/dist/agent.d.ts +3 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +15 -63
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +129 -19
- package/dist/app.js.map +1 -1
- package/dist/cli.js +25 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +4 -0
- package/dist/commands/compact-command.js.map +1 -1
- package/dist/commands/effort-command.js +1 -1
- package/dist/commands/effort-command.js.map +1 -1
- package/dist/commands/guarded-settings-command.d.ts.map +1 -1
- package/dist/commands/guarded-settings-command.js +4 -8
- package/dist/commands/guarded-settings-command.js.map +1 -1
- package/dist/commands/model-command.js +1 -1
- package/dist/commands/model-command.js.map +1 -1
- package/dist/commands/resume-command.d.ts +10 -0
- package/dist/commands/resume-command.d.ts.map +1 -0
- package/dist/commands/resume-command.js +40 -0
- package/dist/commands/resume-command.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +5 -4
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/InputBox.d.ts +2 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +56 -18
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +16 -15
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/common/MenuContainer.d.ts +25 -2
- package/dist/components/common/MenuContainer.d.ts.map +1 -1
- package/dist/components/common/MenuContainer.js +35 -11
- package/dist/components/common/MenuContainer.js.map +1 -1
- package/dist/components/common/ScrollableTabBar.d.ts.map +1 -1
- package/dist/components/common/ScrollableTabBar.js +5 -4
- package/dist/components/common/ScrollableTabBar.js.map +1 -1
- package/dist/components/input/ApplicationInputSurface.d.ts +4 -5
- package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
- package/dist/components/input/ApplicationInputSurface.js.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.d.ts.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.js +5 -4
- package/dist/components/input/FirstRunSetupPrompt.js.map +1 -1
- package/dist/components/input/MenuSurface.d.ts.map +1 -1
- package/dist/components/input/MenuSurface.js +10 -3
- package/dist/components/input/MenuSurface.js.map +1 -1
- package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
- package/dist/components/input/ModelMenuSession.js +2 -1
- package/dist/components/input/ModelMenuSession.js.map +1 -1
- package/dist/components/input/PendingQueueList.d.ts +2 -0
- package/dist/components/input/PendingQueueList.d.ts.map +1 -1
- package/dist/components/input/PendingQueueList.js +17 -14
- package/dist/components/input/PendingQueueList.js.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.js +2 -1
- package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +12 -11
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts +2 -2
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +10 -9
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/Banner.d.ts +0 -1
- package/dist/components/layout/Banner.d.ts.map +1 -1
- package/dist/components/layout/Banner.js +43 -73
- package/dist/components/layout/Banner.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +6 -5
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +17 -9
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/DiffView.js +5 -5
- package/dist/components/layout/DiffView.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +4 -1
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +305 -95
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/layout/background-task-clock.d.ts +43 -0
- package/dist/components/layout/background-task-clock.d.ts.map +1 -0
- package/dist/components/layout/background-task-clock.js +46 -0
- package/dist/components/layout/background-task-clock.js.map +1 -0
- package/dist/components/menu/CopyMenu.d.ts.map +1 -1
- package/dist/components/menu/CopyMenu.js +4 -3
- package/dist/components/menu/CopyMenu.js.map +1 -1
- package/dist/components/menu/MentorPoolSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/MentorPoolSelectionMenu.js +28 -21
- package/dist/components/menu/MentorPoolSelectionMenu.js.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js +26 -13
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/menu/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/PathSelectionMenu.js +4 -3
- package/dist/components/menu/PathSelectionMenu.js.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.js +46 -26
- package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
- package/dist/components/menu/RewindMenu.d.ts.map +1 -1
- package/dist/components/menu/RewindMenu.js +4 -3
- package/dist/components/menu/RewindMenu.js.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.js +26 -26
- package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.js +22 -20
- package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.js +33 -23
- package/dist/components/menu/SkillSelectionMenu.js.map +1 -1
- package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/menu/SlashCommandMenu.js +11 -6
- package/dist/components/menu/SlashCommandMenu.js.map +1 -1
- package/dist/components/message/ChatMessage.js +2 -2
- package/dist/components/message/ChatMessage.js.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.js +8 -11
- package/dist/components/message/CodeContextSearchRenderer.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.d.ts.map +1 -1
- package/dist/components/message/CommandGroupSummary.js +15 -7
- package/dist/components/message/CommandGroupSummary.js.map +1 -1
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +111 -91
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/GrepRenderer.d.ts.map +1 -1
- package/dist/components/message/GrepRenderer.js +5 -8
- package/dist/components/message/GrepRenderer.js.map +1 -1
- package/dist/components/message/MemoryRenderer.d.ts +1 -0
- package/dist/components/message/MemoryRenderer.d.ts.map +1 -1
- package/dist/components/message/MemoryRenderer.js +19 -17
- package/dist/components/message/MemoryRenderer.js.map +1 -1
- package/dist/components/message/MessageList.d.ts +1 -2
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -11
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/ReadFileRenderer.d.ts.map +1 -1
- package/dist/components/message/ReadFileRenderer.js +5 -6
- package/dist/components/message/ReadFileRenderer.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +17 -13
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/WebFetchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebFetchRenderer.js +7 -11
- package/dist/components/message/WebFetchRenderer.js.map +1 -1
- package/dist/components/message/WebSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebSearchRenderer.js +5 -10
- package/dist/components/message/WebSearchRenderer.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +29 -6
- package/dist/components/message/command-grouping.d.ts.map +1 -1
- package/dist/components/message/command-grouping.js +62 -20
- package/dist/components/message/command-grouping.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +5 -32
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +26 -8
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/message/useCommandVisibility.d.ts.map +1 -1
- package/dist/components/message/useCommandVisibility.js +5 -4
- package/dist/components/message/useCommandVisibility.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +190 -106
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/components/prompt/HandoffConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/HandoffConfirmationPrompt.js +3 -2
- package/dist/components/prompt/HandoffConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/InputSurgeConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js +5 -4
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js +4 -3
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js +4 -3
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.d.ts.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.js +6 -5
- package/dist/components/prompt/QueuePausedPrompt.js.map +1 -1
- package/dist/components/prompt/StandardModeConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/StandardModeConfirmationPrompt.js +3 -2
- package/dist/components/prompt/StandardModeConfirmationPrompt.js.map +1 -1
- package/dist/components/theme.d.ts +58 -3
- package/dist/components/theme.d.ts.map +1 -1
- package/dist/components/theme.js +84 -17
- package/dist/components/theme.js.map +1 -1
- package/dist/contracts/application-stream.d.ts +14 -0
- package/dist/contracts/application-stream.d.ts.map +1 -1
- package/dist/gateway/assertion.d.ts +4 -1
- package/dist/gateway/assertion.d.ts.map +1 -1
- package/dist/gateway/assertion.js +24 -2
- package/dist/gateway/assertion.js.map +1 -1
- package/dist/gateway/contracts.d.ts +21 -4
- package/dist/gateway/contracts.d.ts.map +1 -1
- package/dist/gateway/contracts.js +11 -0
- package/dist/gateway/contracts.js.map +1 -1
- package/dist/gateway/dynamic-workspace-registry.d.ts +76 -0
- package/dist/gateway/dynamic-workspace-registry.d.ts.map +1 -0
- package/dist/gateway/dynamic-workspace-registry.js +403 -0
- package/dist/gateway/dynamic-workspace-registry.js.map +1 -0
- package/dist/gateway/gateway.d.ts +24 -1
- package/dist/gateway/gateway.d.ts.map +1 -1
- package/dist/gateway/gateway.js +704 -21
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/launcher-seam.d.ts +18 -0
- package/dist/gateway/launcher-seam.d.ts.map +1 -0
- package/dist/gateway/launcher-seam.js +43 -0
- package/dist/gateway/launcher-seam.js.map +1 -0
- package/dist/gateway/pairing.d.ts +25 -0
- package/dist/gateway/pairing.d.ts.map +1 -0
- package/dist/gateway/pairing.js +107 -0
- package/dist/gateway/pairing.js.map +1 -0
- package/dist/gateway/persistence/coordinator.d.ts +2 -0
- package/dist/gateway/persistence/coordinator.d.ts.map +1 -1
- package/dist/gateway/persistence/coordinator.js +13 -0
- package/dist/gateway/persistence/coordinator.js.map +1 -1
- package/dist/gateway/runtime-factory.d.ts +15 -6
- package/dist/gateway/runtime-factory.d.ts.map +1 -1
- package/dist/gateway/runtime-factory.js +38 -9
- package/dist/gateway/runtime-factory.js.map +1 -1
- package/dist/gateway/safe-log.d.ts.map +1 -1
- package/dist/gateway/safe-log.js +19 -0
- package/dist/gateway/safe-log.js.map +1 -1
- package/dist/gateway/server-session.d.ts.map +1 -1
- package/dist/gateway/server-session.js +36 -4
- package/dist/gateway/server-session.js.map +1 -1
- package/dist/gateway/server.d.ts +26 -3
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +105 -17
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/settings-rpc.d.ts +95 -0
- package/dist/gateway/settings-rpc.d.ts.map +1 -0
- package/dist/gateway/settings-rpc.js +227 -0
- package/dist/gateway/settings-rpc.js.map +1 -0
- package/dist/gateway/trusted-clients.d.ts +27 -0
- package/dist/gateway/trusted-clients.d.ts.map +1 -0
- package/dist/gateway/trusted-clients.js +157 -0
- package/dist/gateway/trusted-clients.js.map +1 -0
- package/dist/gateway/worker-boundary.d.ts +6 -5
- package/dist/gateway/worker-boundary.d.ts.map +1 -1
- package/dist/gateway/worker-boundary.js +20 -10
- package/dist/gateway/worker-boundary.js.map +1 -1
- package/dist/gateway/workspace-admission.d.ts +11 -0
- package/dist/gateway/workspace-admission.d.ts.map +1 -1
- package/dist/gateway/workspace-admission.js +89 -16
- package/dist/gateway/workspace-admission.js.map +1 -1
- package/dist/gateway/workspace-boundary-probe.d.ts +18 -0
- package/dist/gateway/workspace-boundary-probe.d.ts.map +1 -0
- package/dist/gateway/workspace-boundary-probe.js +37 -0
- package/dist/gateway/workspace-boundary-probe.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.d.ts +6 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +9 -1
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +11 -3
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +6 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +22 -13
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts +1 -3
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.js +11 -9
- package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +8 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +27 -18
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-opencode-go-usage.d.ts +8 -0
- package/dist/hooks/use-opencode-go-usage.d.ts.map +1 -0
- package/dist/hooks/use-opencode-go-usage.js +45 -0
- package/dist/hooks/use-opencode-go-usage.js.map +1 -0
- package/dist/hooks/use-shell-mode.d.ts +3 -4
- package/dist/hooks/use-shell-mode.d.ts.map +1 -1
- package/dist/hooks/use-shell-mode.js +14 -12
- package/dist/hooks/use-shell-mode.js.map +1 -1
- package/dist/hooks/use-terminal-columns.d.ts +15 -0
- package/dist/hooks/use-terminal-columns.d.ts.map +1 -0
- package/dist/hooks/use-terminal-columns.js +45 -0
- package/dist/hooks/use-terminal-columns.js.map +1 -0
- package/dist/lib/agent-client.d.ts +2 -0
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +1 -0
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +3 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +4 -0
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +3 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +9 -2
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/lib/harness-input-idle.d.ts.map +1 -1
- package/dist/lib/harness-input-idle.js +1 -1
- package/dist/lib/harness-input-idle.js.map +1 -1
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +9 -2
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/approval-model.md +22 -0
- package/dist/prompts/gpt-5.6.md +3 -2
- package/dist/prompts/mentor-mode-stub.md +3 -0
- package/dist/prompts/orchestrator-mode-stub.md +3 -0
- package/dist/prompts/prefix-quality.test.ts +10 -0
- package/dist/prompts/prompt-constructor.d.ts +2 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +23 -13
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +39 -5
- package/dist/prompts/prompt-constructor.ts +27 -15
- package/dist/prompts/prompt-profiles.d.ts +1 -3
- package/dist/prompts/prompt-profiles.d.ts.map +1 -1
- package/dist/prompts/prompt-profiles.js +2 -7
- package/dist/prompts/prompt-profiles.js.map +1 -1
- package/dist/prompts/prompt-profiles.ts +3 -16
- package/dist/prompts/session-browser.md +3 -0
- package/dist/prompts/subagent-delegation.d.ts +3 -2
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +9 -13
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.ts +9 -13
- package/dist/providers/chained-wire-state.d.ts +7 -2
- package/dist/providers/chained-wire-state.d.ts.map +1 -1
- package/dist/providers/chained-wire-state.js +16 -7
- package/dist/providers/chained-wire-state.js.map +1 -1
- package/dist/providers/codex-auth.d.ts +2 -5
- package/dist/providers/codex-auth.d.ts.map +1 -1
- package/dist/providers/codex-auth.js +2 -0
- package/dist/providers/codex-auth.js.map +1 -1
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +22 -3
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/grok-auth.d.ts +2 -5
- package/dist/providers/grok-auth.d.ts.map +1 -1
- package/dist/providers/grok-auth.js +2 -0
- package/dist/providers/grok-auth.js.map +1 -1
- package/dist/providers/oauth-account-store.d.ts +5 -0
- package/dist/providers/oauth-account-store.d.ts.map +1 -1
- package/dist/providers/oauth-account-store.js +56 -5
- package/dist/providers/oauth-account-store.js.map +1 -1
- package/dist/providers/oauth-pkce.d.ts +8 -0
- package/dist/providers/oauth-pkce.d.ts.map +1 -1
- package/dist/providers/oauth-pkce.js +91 -19
- package/dist/providers/oauth-pkce.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +8 -1
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/opencode-go-usage.d.ts +24 -0
- package/dist/providers/opencode-go-usage.d.ts.map +1 -0
- package/dist/providers/opencode-go-usage.js +37 -0
- package/dist/providers/opencode-go-usage.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/providers/openrouter.provider.js +8 -1
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/responses-websocket-sessions.d.ts +1 -0
- package/dist/providers/responses-websocket-sessions.d.ts.map +1 -1
- package/dist/providers/responses-websocket-sessions.js +16 -2
- package/dist/providers/responses-websocket-sessions.js.map +1 -1
- package/dist/providers/retrying-model.d.ts.map +1 -1
- package/dist/providers/retrying-model.js +31 -3
- package/dist/providers/retrying-model.js.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts +5 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.js +229 -149
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
- package/dist/services/agent-runtime/generation-guard.d.ts +39 -25
- package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -1
- package/dist/services/agent-runtime/generation-guard.js +98 -100
- package/dist/services/agent-runtime/generation-guard.js.map +1 -1
- package/dist/services/agent-runtime/run-budget.d.ts +1 -1
- package/dist/services/agent-runtime/run-budget.d.ts.map +1 -1
- package/dist/services/agent-runtime/run-budget.js +4 -0
- package/dist/services/agent-runtime/run-budget.js.map +1 -1
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +1 -0
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +13 -2
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +35 -7
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.d.ts +3 -2
- package/dist/services/conversation/conversation-admission-workflow.d.ts.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.js +6 -1
- package/dist/services/conversation/conversation-admission-workflow.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +43 -2
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts +14 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +142 -11
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +3 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.d.ts +22 -1
- package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.js +61 -0
- package/dist/services/conversation/conversation-persistence.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +45 -29
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/session-audit.d.ts +70 -0
- package/dist/services/conversation/session-audit.d.ts.map +1 -0
- package/dist/services/conversation/session-audit.js +164 -0
- package/dist/services/conversation/session-audit.js.map +1 -0
- package/dist/services/conversation/session-browser.d.ts +46 -0
- package/dist/services/conversation/session-browser.d.ts.map +1 -0
- package/dist/services/conversation/session-browser.js +380 -0
- package/dist/services/conversation/session-browser.js.map +1 -0
- package/dist/services/input-surge-approval.d.ts +21 -0
- package/dist/services/input-surge-approval.d.ts.map +1 -0
- package/dist/services/input-surge-approval.js +42 -0
- package/dist/services/input-surge-approval.js.map +1 -0
- package/dist/services/large-uncached-input-guard.js +4 -4
- package/dist/services/large-uncached-input-guard.js.map +1 -1
- package/dist/services/logging/assistant-turn-journal.d.ts +15 -0
- package/dist/services/logging/assistant-turn-journal.d.ts.map +1 -1
- package/dist/services/logging/assistant-turn-journal.js +27 -0
- package/dist/services/logging/assistant-turn-journal.js.map +1 -1
- package/dist/services/memory/memory-capabilities.js +2 -2
- package/dist/services/memory/memory-search.d.ts +16 -0
- package/dist/services/memory/memory-search.d.ts.map +1 -0
- package/dist/services/memory/memory-search.js +55 -0
- package/dist/services/memory/memory-search.js.map +1 -0
- package/dist/services/memory/memory-store.d.ts +12 -0
- package/dist/services/memory/memory-store.d.ts.map +1 -1
- package/dist/services/memory/memory-store.js +14 -35
- package/dist/services/memory/memory-store.js.map +1 -1
- package/dist/services/mode-notices.d.ts +11 -0
- package/dist/services/mode-notices.d.ts.map +1 -1
- package/dist/services/mode-notices.js +37 -3
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/queue/queue-controller.d.ts +13 -0
- package/dist/services/queue/queue-controller.d.ts.map +1 -1
- package/dist/services/queue/queue-controller.js +32 -1
- package/dist/services/queue/queue-controller.js.map +1 -1
- package/dist/services/retry/in-loop-model-retry.d.ts +12 -0
- package/dist/services/retry/in-loop-model-retry.d.ts.map +1 -0
- package/dist/services/retry/in-loop-model-retry.js +115 -0
- package/dist/services/retry/in-loop-model-retry.js.map +1 -0
- package/dist/services/retry/retry-classifier.d.ts.map +1 -1
- package/dist/services/retry/retry-classifier.js +18 -12
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.js +10 -6
- package/dist/services/retry/retry-error-classification.js.map +1 -1
- package/dist/services/retry/upstream-retry-policy.d.ts.map +1 -1
- package/dist/services/retry/upstream-retry-policy.js +40 -7
- package/dist/services/retry/upstream-retry-policy.js.map +1 -1
- package/dist/services/runtime-setting-router.d.ts.map +1 -1
- package/dist/services/runtime-setting-router.js +7 -2
- package/dist/services/runtime-setting-router.js.map +1 -1
- package/dist/services/session/background-check-in-scheduler.d.ts +44 -0
- package/dist/services/session/background-check-in-scheduler.d.ts.map +1 -0
- package/dist/services/session/background-check-in-scheduler.js +88 -0
- package/dist/services/session/background-check-in-scheduler.js.map +1 -0
- package/dist/services/session/background-task-control.js +4 -1
- package/dist/services/session/background-task-control.js.map +1 -1
- package/dist/services/session/initial-input-preparer.d.ts +2 -1
- package/dist/services/session/initial-input-preparer.d.ts.map +1 -1
- package/dist/services/session/initial-input-preparer.js +3 -1
- package/dist/services/session/initial-input-preparer.js.map +1 -1
- package/dist/services/session/repetition-detector.d.ts +0 -4
- package/dist/services/session/repetition-detector.d.ts.map +1 -1
- package/dist/services/session/repetition-detector.js +0 -7
- package/dist/services/session/repetition-detector.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +6 -2
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +99 -29
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-lifecycle.d.ts +8 -0
- package/dist/services/session/session-lifecycle.d.ts.map +1 -1
- package/dist/services/session/session-lifecycle.js +4 -0
- package/dist/services/session/session-lifecycle.js.map +1 -1
- package/dist/services/session/session-stream-processor.d.ts.map +1 -1
- package/dist/services/session/session-stream-processor.js +5 -15
- package/dist/services/session/session-stream-processor.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +2 -1
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js +1 -0
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-attempt.d.ts +3 -0
- package/dist/services/session/turn-attempt.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.js +5 -0
- package/dist/services/session/turn-attempt.js.map +1 -1
- package/dist/services/session/turn-coordinator.d.ts +1 -1
- package/dist/services/session/turn-coordinator.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +4 -1
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +27 -3
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +35 -11
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-service.d.ts +9 -0
- package/dist/services/settings/settings-service.d.ts.map +1 -1
- package/dist/services/settings/settings-service.js +40 -0
- package/dist/services/settings/settings-service.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +5 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +2 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +6 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
- package/dist/services/shell/shell-interaction-session.d.ts +4 -5
- package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
- package/dist/services/shell/shell-interaction-session.js +8 -20
- package/dist/services/shell/shell-interaction-session.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +15 -0
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
- package/dist/services/subagents/mentor-runner.js +2 -0
- package/dist/services/subagents/mentor-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +34 -1
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +1 -1
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +28 -1
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +11 -0
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/tool-policy.d.ts.map +1 -1
- package/dist/services/subagents/tool-policy.js +10 -5
- package/dist/services/subagents/tool-policy.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +2 -0
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +29 -0
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +5 -1
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/tools/agent/ask-user.d.ts.map +1 -1
- package/dist/tools/agent/ask-user.js +2 -0
- package/dist/tools/agent/ask-user.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +40 -24
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/memory/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory/memory-tools.js +322 -59
- package/dist/tools/memory/memory-tools.js.map +1 -1
- package/dist/tools/session-browser/session-browser-tools.d.ts +4 -0
- package/dist/tools/session-browser/session-browser-tools.d.ts.map +1 -0
- package/dist/tools/session-browser/session-browser-tools.js +47 -0
- package/dist/tools/session-browser/session-browser-tools.js.map +1 -0
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +7 -0
- package/dist/tools/system/shell.js.map +1 -1
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/utils/busy-turn-guard.d.ts +17 -0
- package/dist/utils/busy-turn-guard.d.ts.map +1 -0
- package/dist/utils/busy-turn-guard.js +24 -0
- package/dist/utils/busy-turn-guard.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +28 -7
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/output/bounded-json.d.ts +33 -0
- package/dist/utils/output/bounded-json.d.ts.map +1 -0
- package/dist/utils/output/bounded-json.js +59 -0
- package/dist/utils/output/bounded-json.js.map +1 -0
- package/dist/utils/output/output-trim.d.ts.map +1 -1
- package/dist/utils/output/output-trim.js +7 -7
- package/dist/utils/output/output-trim.js.map +1 -1
- package/dist/utils/output/text-snippet.d.ts +6 -0
- package/dist/utils/output/text-snippet.d.ts.map +1 -0
- package/dist/utils/output/text-snippet.js +106 -0
- package/dist/utils/output/text-snippet.js.map +1 -0
- package/dist/utils/resume-list.d.ts +3 -1
- package/dist/utils/resume-list.d.ts.map +1 -1
- package/dist/utils/resume-list.js +3 -2
- package/dist/utils/resume-list.js.map +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +15 -0
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts +2 -0
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.js.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts +1 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js +20 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js.map +1 -1
- package/dist/utils/value-suggestions.d.ts.map +1 -1
- package/dist/utils/value-suggestions.js +1 -0
- package/dist/utils/value-suggestions.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,408 +1,416 @@
|
|
|
1
1
|
# term2
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@qduc/term2)
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
10
|
-
## Demo
|
|
11
|
-
|
|
12
|
-
https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
|
|
13
|
-
|
|
14
|
-
## Features
|
|
15
|
-
|
|
16
|
-
- 🎭 **Five Operating Modes** - Standard (full-power, auto-approves patches), Lite (fast & safe), Mentor (expert model advice), Plan (read-only research/planning), and Orchestrator (delegates task execution to subagents)
|
|
17
|
-
- 🌍 **Open Source** - MIT licensed, hackable, auditable, community-driven
|
|
18
|
-
- 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, OpenAI-compatible APIs, and Vercel AI SDK providers
|
|
19
|
-
- 🔒 **Safe Execution** - Every command requires your explicit approval with diff preview
|
|
20
|
-
- 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace (with `<...>` gap matching), grep, find files, file reading, file creation, web search, web fetching, code outline & context search, mentor consultation, and subagent invocation
|
|
21
|
-
- 👥 **Subagent Delegation** - Spawn specialized, synchronous subagents (`explorer`, `worker`, `researcher`, `mentor`) to perform sub-tasks in parallel while conserving your main context
|
|
22
|
-
- ⏪ **Conversation Rewind** - Rewind to any past user turn with `/rewind`, choosing whether to edit the turn again or resend it as-is. The picker states what each rewind discards (turns, replies, edited files) before you commit to it
|
|
23
|
-
- 💾 **Conversation Resumption & Persistence** - Saved conversations are persisted using robust event logging and can be resumed later using the `--resume` flag
|
|
24
|
-
- 💬 **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/mentor`, `/lite`, `/copy`, `/auto-approve`, `/plan`, `/rewind`, `/usage`, `/effort`, `/handoff`, and `/orchestrator` for easy control
|
|
25
|
-
- 📝 **Smart Context** - The assistant understands your environment and provides relevant help
|
|
26
|
-
- 🎯 **Streaming Responses** - See the AI's thoughts and reasoning in real-time
|
|
27
|
-
- 🧠 **Reasoning Effort Control** - Configurable reasoning levels (minimal to high) for O1/O3 models
|
|
28
|
-
- ⚡ **Command History** - Navigate previous inputs with arrow keys
|
|
29
|
-
- 🎨 **Markdown Rendering** - Formatted code blocks, tables, and text in the terminal
|
|
30
|
-
- 🔄 **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
|
|
31
|
-
- 🌐 **SSH Mode** - Execute commands and edit files on remote servers over SSH
|
|
32
|
-
- 🔒 **Sandboxed Execution** - Shell commands run in a sandbox with configurable read policies (`credential-denylist`, `home-denylist`, `standard`, `strict`) to protect sensitive files
|
|
33
|
-
- 🤖 **Non-Interactive Mode** - Run commands from the CLI without starting the full UI
|
|
34
|
-
- ✏️ **Standard Mode** - Auto-approves file edits in your workspace for faster development (active by default)
|
|
35
|
-
- 🛡️ **Smart Shell Auto-Approval** - A hybrid local-heuristic + LLM-based safety evaluator that auto-approves safe commands, eliminating prompt fatigue while strictly blocking risky ones (with detailed reasoning explanations)
|
|
36
|
-
- 🖼️ **Image Pasting** - Paste images from your clipboard directly into the terminal for vision-model analysis
|
|
37
|
-
- 📈 **Real-time Token Usage** - Live token consumption displayed during streaming
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
## Why term2 vs Alternatives?
|
|
41
|
-
|
|
42
|
-
| | **term2** | **Claude Code** | **Warp** |
|
|
43
|
-
| --- | --- | --- | --- |
|
|
44
|
-
| **Open Source** | ✅ MIT | ❌ Proprietary | ✅ Open Source |
|
|
45
|
-
| **Cost** | Pay-per-use API | $20 - $200/mo (or API) | Freemium / Paid tiers |
|
|
46
|
-
| **AI Providers** | Any (OpenAI, OpenRouter, local) | Anthropic only | Selected models / BYOLLM |
|
|
47
|
-
| **SSH / Remote** | ✅ Native | ✅ Yes (Remote Control/SSH) | ✅ Yes |
|
|
48
|
-
| **Mentor Mode** | ✅ Built-in | ❌ No | ❌ No |
|
|
49
|
-
| **Self-Hostable** | ✅ Yes | ❌ No (Requires Anthropic) | ❌ Cloud elements (Oz) |
|
|
3
|
+
[](https://www.npmjs.com/package/@qduc/term2)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
50
7
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
**Requirements:**
|
|
54
|
-
|
|
55
|
-
- Node.js 20 or higher
|
|
56
|
-
- An API key from OpenAI, OpenRouter, or any OpenAI-compatible provider
|
|
57
|
-
|
|
58
|
-
Install globally via npm:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
npm install --global @qduc/term2
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Set your API key as an environment variable (see [Configuration](#configuration) section for details):
|
|
8
|
+
term2 is an open-source terminal AI assistant and autonomous agent runtime built for high-velocity software engineering and system administration.
|
|
65
9
|
|
|
66
|
-
|
|
67
|
-
export OPENAI_API_KEY="your-api-key-here"
|
|
68
|
-
```
|
|
10
|
+
Combining a fast React (Ink) terminal interface with an application-owned run loop, term2 provides fine-grained execution safety, native multi-agent delegation, provider-neutral context compaction, and seamless multi-provider support—giving developers complete agency over their workflow without vendor lock-in or subscription gates.
|
|
69
11
|
|
|
70
|
-
|
|
12
|
+
---
|
|
71
13
|
|
|
72
|
-
|
|
14
|
+
## Core Capabilities
|
|
73
15
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
16
|
+
- **Open Source and Local First**: MIT licensed. No mandatory subscriptions, telemetry lock-in, or proprietary walled gardens.
|
|
17
|
+
- **Universal Provider Support**: Native integration with OpenAI (WebSocket Responses and Chat Completions), ChatGPT/Codex OAuth (browser PKCE), Grok Responses API (with encrypted reasoning and OAuth), OpenRouter, Anthropic, Google Gemini, and custom local endpoints (Ollama, llama.cpp, vLLM).
|
|
18
|
+
- **Fine-Grained Sandboxing and Safety**: Sandboxed shell execution with configurable read/write boundaries (`standard`, `strict`) and interactive unified diff previews.
|
|
19
|
+
- **Smart Shell Auto-Approval**: A hybrid heuristic and LLM safety evaluator that auto-approves safe read-only and workspace commands, eliminating prompt fatigue while strictly gating risky operations.
|
|
20
|
+
- **Multi-Agent Orchestration**: Spawn specialized foreground or background subagents (`explorer`, `worker`, `mentor`, `librarian`) across tiered model profiles (`smart`, `balanced`, `cheap`, `chore`).
|
|
21
|
+
- **Provider-Neutral Context Compaction**: Intelligently compacts long conversation histories (via `/compact` or automatic thresholds) while preserving cold-prefix architectural facts and hot-tail tool ledger integrity.
|
|
22
|
+
- **Time-Travel Rewind and Forking**: Non-destructive conversation rewinding with discard previews (`/rewind`, `/undo`, `/retry`), session resumption (`/resume`, `--resume`), and session branching (`--fork`).
|
|
23
|
+
- **Native Remote Development**: Execute commands and manage codebases on remote servers seamlessly over SSH with SSH agent authentication.
|
|
24
|
+
- **Five Focused Operating Modes**: Standard, Plan, Lite, Mentor, and Orchestrator modes adapted to every phase of engineering.
|
|
78
25
|
|
|
79
|
-
|
|
26
|
+
---
|
|
80
27
|
|
|
81
|
-
|
|
28
|
+
## Comparison: Why term2?
|
|
82
29
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
30
|
+
| Feature | term2 | Claude Code | Warp |
|
|
31
|
+
| :--- | :---: | :---: | :---: |
|
|
32
|
+
| **License** | **MIT Open Source** | Proprietary | Proprietary / Closed Core |
|
|
33
|
+
| **Cost** | **Direct API / Pay-per-use** | Subscription / API | Freemium / Paid Tiers |
|
|
34
|
+
| **Model Ecosystem** | **Any** (OpenAI, Codex, Grok, OpenRouter, Anthropic, Google, Local) | Anthropic only | Selected Cloud Models |
|
|
35
|
+
| **OAuth Browser Login** | **Grok and Codex PKCE** | No | No |
|
|
36
|
+
| **Local LLMs (Ollama/llama.cpp)** | **Native** | No | Partial (BYOLLM) |
|
|
37
|
+
| **Subagent Swarms** | **Configurable 4-Tier Roles** | Limited | No |
|
|
38
|
+
| **Remote SSH Workspaces** | **Native SSH Agent** | Remote Control | SSH Client |
|
|
39
|
+
| **Dual-Model Mentor Mode** | **Built-in** | No | No |
|
|
40
|
+
| **Context Compaction** | **Local and Provider-Native** | Automatic (Closed) | No |
|
|
86
41
|
|
|
87
|
-
|
|
42
|
+
---
|
|
88
43
|
|
|
89
|
-
|
|
44
|
+
## Installation
|
|
90
45
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"Create a backup of my documents folder"
|
|
95
|
-
"What's using port 3000?"
|
|
96
|
-
```
|
|
46
|
+
### Prerequisites
|
|
47
|
+
- Node.js version 20.0.0 or higher
|
|
48
|
+
- An API key or OAuth account for your preferred AI provider
|
|
97
49
|
|
|
98
|
-
###
|
|
50
|
+
### Install via Package Manager
|
|
51
|
+
```bash
|
|
52
|
+
# Install globally via npm
|
|
53
|
+
npm install --global @qduc/term2
|
|
99
54
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"Help me debug why my server won't start on port 8080"
|
|
103
|
-
"Create a new React component called UserProfile"
|
|
104
|
-
"Show me the disk usage of my home directory"
|
|
105
|
-
"What processes are consuming the most memory?"
|
|
106
|
-
"Search for the word 'config' in all .json files"
|
|
55
|
+
# Or using pnpm
|
|
56
|
+
pnpm add --global @qduc/term2
|
|
107
57
|
```
|
|
108
58
|
|
|
109
|
-
###
|
|
59
|
+
### Quick Setup
|
|
110
60
|
|
|
61
|
+
#### 1. OAuth Browser Login (Grok or Codex)
|
|
62
|
+
term2 supports browser-based PKCE OAuth logins for OpenAI Codex/ChatGPT and xAI Grok:
|
|
111
63
|
```bash
|
|
112
|
-
#
|
|
113
|
-
term2
|
|
114
|
-
term2 -m gpt-5.2 # Use a specific model
|
|
115
|
-
term2 --model gpt-5-mini # Use GPT-5 mini for faster/cheaper responses
|
|
116
|
-
term2 -r high # Set reasoning effort to high (for GPT-5 models)
|
|
117
|
-
term2 --reasoning medium # Set reasoning effort to medium
|
|
118
|
-
|
|
119
|
-
# Operating modes (see "Operating Modes" section below for details)
|
|
120
|
-
term2 --lite # Start in lite mode for general terminal work (no codebase)
|
|
121
|
-
|
|
122
|
-
# Resuming past conversations
|
|
123
|
-
term2 --resume # Resume the last conversation session
|
|
124
|
-
term2 -R <conversation-uuid> # Resume a specific conversation by ID
|
|
125
|
-
|
|
126
|
-
# SSH Mode - execute on remote servers
|
|
127
|
-
term2 --ssh user@host --remote-dir /path/to/project
|
|
128
|
-
term2 --ssh deploy@server.com --remote-dir /var/www/app --ssh-port 2222
|
|
129
|
-
|
|
130
|
-
# Combine SSH with lite mode for lightweight remote assistance
|
|
131
|
-
term2 --ssh user@host --remote-dir /path --lite
|
|
132
|
-
|
|
133
|
-
# Non-interactive mode
|
|
134
|
-
term2 "how to use grep"
|
|
135
|
-
term2 --auto-approve "list files in current directory"
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Slash Commands
|
|
139
|
-
|
|
140
|
-
While in the chat, you can use these commands:
|
|
141
|
-
|
|
142
|
-
- `/clear` - Clear the conversation history
|
|
143
|
-
- `/quit` - Exit the application
|
|
144
|
-
- `/model [model-name]` - Switch to a different model
|
|
145
|
-
- `/mentor` - Toggle mentor mode
|
|
146
|
-
- `/lite` - Toggle lite mode (requires `/clear` first if a session is active)
|
|
147
|
-
- `/plan` - Toggle plan mode (read-only research/planning mode)
|
|
148
|
-
- `/orchestrator` - Toggle orchestrator mode (delegates all tool-backed work to subagents; requires `/clear` first if a session is active)
|
|
149
|
-
- `/skills` - Browse and manage available skills
|
|
150
|
-
- `/rewind [last | <turn>] [edit | resend]` - Rewind the conversation to a user turn, discarding that turn and everything after it. With no arguments it opens a picker showing what each rewind would discard; `Tab` switches between putting the turn back in the input box (`edit`, the default) and resending it unchanged (`resend`)
|
|
151
|
-
- `/undo` - Alias for `/rewind edit`
|
|
152
|
-
- `/retry` - Alias for `/rewind resend`, acting on the last turn immediately
|
|
153
|
-
- `/retry-tool` - Retry the last tool call (was `/retry tool`)
|
|
154
|
-
- `/usage` - Show token usage breakdown for the current session (includes subagent usage)
|
|
155
|
-
- `/effort [level]` - Set reasoning effort for O1/O3 models (e.g. none, minimal, low, medium, high)
|
|
156
|
-
- `/copy` - Copy the latest assistant response to the clipboard
|
|
157
|
-
- `/handoff` - Hand off the last assistant response to another model or session
|
|
158
|
-
- `/auto-approve [off|advisory|auto|always]` - Set or cycle shell auto-approval mode
|
|
159
|
-
- `/settings [key] [value]` - Modify runtime settings (e.g., `/settings agent.temperature 0.7`)
|
|
160
|
-
|
|
64
|
+
# Log in to xAI Grok
|
|
65
|
+
term2 --grok-login
|
|
161
66
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
| ----------- | ------------------- | ------------------------------------ | -------------------- | ------------- |
|
|
166
|
-
| **Standard**| `term2` | Codebase work & development | Auto-approves patches| Full codebase |
|
|
167
|
-
| **Plan** | `/plan` | Researching and designing plans | Read-only tools | Full codebase |
|
|
168
|
-
| **Lite** | `term2 --lite` | General terminal tasks (no codebase) | Read-only tools | None |
|
|
169
|
-
| **Mentor** | `/mentor` | Complex codebase problems | All + mentor tool | Full codebase |
|
|
170
|
-
| **Orchestrator**| `/orchestrator` | Delegating complex multi-step work | Subagents + read-only| Full codebase |
|
|
67
|
+
# Log in to OpenAI Codex / ChatGPT
|
|
68
|
+
term2 --codex-login
|
|
69
|
+
```
|
|
171
70
|
|
|
172
|
-
|
|
71
|
+
> **Multi-Account Management**: Manage multiple OAuth accounts and switch between active profiles at runtime via the `/providers` menu.
|
|
173
72
|
|
|
174
|
-
|
|
73
|
+
#### 2. Environment Variables (API Keys)
|
|
74
|
+
Alternatively, export the API key for your chosen provider:
|
|
75
|
+
```bash
|
|
76
|
+
# OpenAI
|
|
77
|
+
export OPENAI_API_KEY="sk-..."
|
|
175
78
|
|
|
176
|
-
|
|
79
|
+
# OpenRouter (Claude, Gemini, DeepSeek, etc.)
|
|
80
|
+
export OPENROUTER_API_KEY="sk-or-v1-..."
|
|
177
81
|
|
|
178
|
-
|
|
82
|
+
# Anthropic
|
|
83
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
179
84
|
|
|
180
|
-
|
|
85
|
+
# Google Gemini
|
|
86
|
+
export GOOGLE_GENERATIVE_AI_API_KEY="..."
|
|
181
87
|
|
|
182
|
-
|
|
88
|
+
# Web Search (Tavily or Exa)
|
|
89
|
+
export TAVILY_API_KEY="tvly-..."
|
|
90
|
+
export EXA_API_KEY="..."
|
|
91
|
+
```
|
|
183
92
|
|
|
93
|
+
---
|
|
184
94
|
|
|
185
|
-
##
|
|
95
|
+
## Quick Start
|
|
186
96
|
|
|
187
|
-
|
|
97
|
+
Launch term2 in your project directory:
|
|
188
98
|
|
|
189
99
|
```bash
|
|
190
|
-
|
|
191
|
-
term2
|
|
192
|
-
term2 --ssh user@hostname --lite # lightweight remote assistance (--remote-dir optional)
|
|
193
|
-
```
|
|
100
|
+
# Start standard interactive session
|
|
101
|
+
term2
|
|
194
102
|
|
|
195
|
-
|
|
103
|
+
# Start in lightweight mode (fast system/terminal operations, no codebase ingestion)
|
|
104
|
+
term2 --lite
|
|
196
105
|
|
|
197
|
-
|
|
106
|
+
# Start with a specific model and provider
|
|
107
|
+
term2 -m claude-sonnet-4.6 -p openrouter
|
|
198
108
|
|
|
199
|
-
|
|
109
|
+
# Resume the last conversation session
|
|
110
|
+
term2 --resume
|
|
200
111
|
|
|
201
|
-
|
|
202
|
-
term2 "
|
|
203
|
-
term2 --auto-approve "delete /tmp/test-file"
|
|
204
|
-
|
|
205
|
-
# Output: AI response → stdout, events → stderr
|
|
206
|
-
ANSWER=$(term2 "is there any TODO in source/cli.tsx?")
|
|
112
|
+
# Run a non-interactive prompt from the command line
|
|
113
|
+
term2 "Explain the architecture of source/agent.ts"
|
|
207
114
|
```
|
|
208
115
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
## Shell Auto-Approval
|
|
116
|
+
---
|
|
212
117
|
|
|
213
|
-
|
|
118
|
+
## Operating Modes
|
|
214
119
|
|
|
215
|
-
|
|
120
|
+
term2 features five distinct operating modes tailored to different stages of development:
|
|
121
|
+
|
|
122
|
+
| Mode | Trigger / CLI | Purpose and Behavior | Tools and Context |
|
|
123
|
+
| :--- | :--- | :--- | :--- |
|
|
124
|
+
| **Standard** | `term2` *(default)* | High-velocity codebase development. Automatically approves workspace file patches while gating destructive commands. | Full codebase context, all tools, patch auto-approval. |
|
|
125
|
+
| **Plan** | `/plan` or `Shift+Tab` | Architecture design, research, and code exploration. Enforces read-only safety guarantees (no file writes or mutating commands). | Full codebase context, read-only tools. |
|
|
126
|
+
| **Lite** | `term2 --lite` or `/lite` | General terminal tasks, DevOps, and SSH administration without codebase ingestion overhead. | Session context only, read-only system tools. |
|
|
127
|
+
| **Mentor** | `/mentor` | Collaborative problem-solving. Pairs the primary model with a higher-tier strategic model (`smartModel`) for architectural review. | Full codebase context, all tools and `ask_mentor`. |
|
|
128
|
+
| **Orchestrator** | `/orchestrator` | High-level task coordination. Encourages prompt-guided delegation across specialized subagents while retaining end-to-end turn ownership. | Full codebase context, direct tools and subagent delegation. |
|
|
129
|
+
|
|
130
|
+
> **Mode Switching:** Press `Shift+Tab` to cycle the application's operating modes. To run one direct shell command in any operating mode, prefix the input with `!`; the command and output are added to the conversation, then the input returns to normal mode. Use slash commands (`/plan`, `/lite`, `/mentor`, `/orchestrator`) to switch modes explicitly.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Subagents Architecture
|
|
135
|
+
|
|
136
|
+
term2 includes a modular subagent execution system designed to isolate heavy computational, research, or modification workloads from the main conversation transcript. Each subagent operates under a defined role profile with explicit permissions, execution budgets, and capability tiers.
|
|
137
|
+
|
|
138
|
+
### Explorer Subagent
|
|
139
|
+
- **Purpose**: Rapid codebase reconnaissance, symbol search, file discovery, and dependency mapping.
|
|
140
|
+
- **Permissions**: Read-only (`canRead: true`, `canWrite: false`, `canSearchWeb: true`, `canRunShell: true`).
|
|
141
|
+
- **Safety Boundary**: Restricted to non-destructive read operations and safe read-only shell commands (`rg`, `fd`, `git status`).
|
|
142
|
+
- **Model Tier**: Defaults to `agent.cheapModel` (e.g. `gpt-5.4-mini`) to minimize latency and token consumption during wide search operations.
|
|
143
|
+
|
|
144
|
+
### Worker Subagent
|
|
145
|
+
- **Purpose**: Autonomous implementation of discrete tasks, file modifications, refactoring slices, and running automated test suites.
|
|
146
|
+
- **Permissions**: Full read/write (`canRead: true`, `canWrite: true`, `canSearchWeb: false`, `canRunShell: true`).
|
|
147
|
+
- **Safety Boundary**: Sandboxed to the workspace root directory. Supports pinning execution to a dedicated Git worktree (`worktree` parameter) to isolate dirty state from the parent checkout.
|
|
148
|
+
- **Model Tier**: Defaults to `agent.balancedModel` (e.g. `gpt-5.3-codex` or `claude-sonnet-4.6`).
|
|
149
|
+
|
|
150
|
+
### Mentor Subagent
|
|
151
|
+
- **Purpose**: High-level strategic consultation, algorithmic design analysis, and independent second-opinion code review.
|
|
152
|
+
- **Permissions**: Advisory only (`canRead: false`, `canWrite: false`, `canSearchWeb: false`, `canRunShell: false`).
|
|
153
|
+
- **Safety Boundary**: Completely detached from the workspace filesystem and tool execution. Receives architectural queries via the `ask_mentor` tool and returns structured recommendations without polluting turn history.
|
|
154
|
+
- **Model Tier**: Defaults to `agent.smartModel` (e.g. `gpt-5.5`).
|
|
155
|
+
|
|
156
|
+
### Librarian Subagent
|
|
157
|
+
- **Purpose**: Long-term persistent memory management, documentation discovery, and indexing domain knowledge across sessions.
|
|
158
|
+
- **Permissions**: Memory management (`canRead: false`, `canWrite: false`, `canSearchWeb: false`, `canRunShell: false`). Interacts with memory exclusively via specialized `memory_*` tools and `activate_skill`.
|
|
159
|
+
- **Safety Boundary**: Operates strictly within persistent memory storage without general filesystem, shell, or web access.
|
|
160
|
+
- **Model Tier**: Defaults to `agent.cheapModel`.
|
|
161
|
+
|
|
162
|
+
### Subagent Capability Tiers
|
|
163
|
+
Subagent roles are mapped to four configurable model tiers in `settings.json`:
|
|
164
|
+
- `agent.smartModel` / `agent.smartProvider` / `agent.smartReasoningEffort`: For deep reasoning and strategic advisory (used by Mentor).
|
|
165
|
+
- `agent.balancedModel` / `agent.balancedProvider` / `agent.balancedReasoningEffort`: For implementation, editing, and execution (used by Worker).
|
|
166
|
+
- `agent.cheapModel` / `agent.cheapProvider` / `agent.cheapReasoningEffort`: For high-throughput search and discovery (used by Explorer and Librarian).
|
|
167
|
+
- `agent.choreModel` / `agent.choreProvider`: For narrow utility tasks such as AST patch self-healing and auto-approval evaluation.
|
|
168
|
+
|
|
169
|
+
### Background Subagent Management and Lifecycle
|
|
170
|
+
- **Concurrent Execution**: Subagents can run synchronously in the foreground or asynchronously in the background.
|
|
171
|
+
- **Task Manager (`Ctrl+G`)**: Press `Ctrl+G` to open the Background Task Manager to inspect live running subagents, view stream output, pause runs, or terminate hung jobs.
|
|
172
|
+
- **Resource Budgets**: Each subagent run is bounded by an execution turn budget (`maxTurns`) to prevent infinite recursive loops.
|
|
173
|
+
|
|
174
|
+
### Subagent Check-In and Steering
|
|
175
|
+
- **Periodic Check-In**: The `BackgroundCheckInScheduler` periodically wakes the launching agent with status summaries of background work without interrupting active user turns.
|
|
176
|
+
- **Mid-Turn Steering**: Deliver real-time steering messages to running subagent tasks at clean request boundaries.
|
|
177
|
+
- **Orchestrator Inquiries**: Subagents can query the parent orchestrator for clarifying decisions using the `ask_orchestrator` tool when encountering ambiguity.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Safety, Sandboxing, and Auto-Approval
|
|
182
|
+
|
|
183
|
+
### Sandboxed Execution
|
|
184
|
+
Shell commands execute inside an isolated execution boundary:
|
|
185
|
+
- `standard` policy: Restricts file writes to the workspace and temporary directories while blocking reads of sensitive credential paths (`~/.ssh`, `~/.aws`, `~/.docker`, `~/.netrc`, `~/.kube`, etc.).
|
|
186
|
+
- `strict` policy: Locks down file reading to the workspace and safe toolchains, blocking access to the user home directory and system roots (`/etc`, `/var`, `/root`).
|
|
187
|
+
- Toggle sandbox enforcement anytime using `/sandbox`, or configure policies via `sandbox.readPolicy` in `/settings`.
|
|
188
|
+
|
|
189
|
+
### Smart Shell Auto-Approval Modes (`/auto-approve`)
|
|
190
|
+
- `off` (Default): Every shell command prompts for interactive user confirmation with a unified diff preview.
|
|
191
|
+
- `advisory`: Commands require confirmation, but include real-time LLM-generated safety and consequence explanations.
|
|
192
|
+
- `auto`: Safe, read-only, and idempotent workspace operations execute automatically; potentially destructive commands (e.g. `rm -rf`, `git reset --hard`, `git push --force`) are strictly blocked for user confirmation.
|
|
193
|
+
- `always`: Unattended execution mode. Disables sandbox boundaries (intended for automated CI environments; use with caution).
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Context Management and Compaction
|
|
198
|
+
|
|
199
|
+
### Local and Server-Side Compaction
|
|
200
|
+
- **Provider-Neutral Compactor**: When conversation tokens exceed configured ratios or thresholds, term2 performs request-boundary context compaction.
|
|
201
|
+
- **Cold-Prefix Preservation**: Architectural decisions, environment constraints, and critical requirements are summarized and retained verbatim.
|
|
202
|
+
- **Hot-Tail Invariants**: Recent conversation turns and active tool ledger call/result pairs remain completely intact, preventing broken references.
|
|
203
|
+
- **Manual Trigger**: Run `/compact` at any point to compress transcript history immediately.
|
|
204
|
+
- **OpenAI Native Compaction**: Leverages server-side context management when supported by the provider endpoint.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Conversation Resumption, Rewind, and Queuing
|
|
209
|
+
|
|
210
|
+
### Time-Travel Rewind (`/rewind`, `/undo`, `/retry`)
|
|
211
|
+
- **Inspection Picker**: Running `/rewind` opens an interactive menu detailing exactly which turns, replies, and modified files will be affected before committing.
|
|
212
|
+
- **Disposition Modes**:
|
|
213
|
+
- `edit` (Default / `/undo`): Discards subsequent turns and places the selected user prompt back into the input editor for revision.
|
|
214
|
+
- `resend` (`/retry`): Discards subsequent turns and immediately resends the selected prompt to the model.
|
|
215
|
+
- **Tool Retry (`/retry-tool`)**: Retries only the most recent failed or timed-out tool call without losing conversation context.
|
|
216
|
+
|
|
217
|
+
### Session Persistence and Resumption
|
|
218
|
+
- **Persistence Engine**: Sessions are auto-saved using append-only event streams.
|
|
219
|
+
- **Resuming Sessions**:
|
|
220
|
+
```bash
|
|
221
|
+
term2 --resume # Resume the most recent session
|
|
222
|
+
term2 --resume <session-id> # Resume a specific session by UUID
|
|
223
|
+
term2 --resume ls # List recent saved sessions with metadata
|
|
224
|
+
```
|
|
225
|
+
- **Session Branching (`--fork`)**:
|
|
226
|
+
```bash
|
|
227
|
+
term2 --resume <session-id> --fork
|
|
228
|
+
```
|
|
216
229
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
230
|
+
### Mid-Turn Injection and Prompt Queuing
|
|
231
|
+
- **Input Queuing**: Press `Alt+Enter` or `Esc+Enter` to queue additional user instructions while a turn is actively generating.
|
|
232
|
+
- **Queue Editing**: Edit or delete pending queued prompts before they are admitted at the next request boundary.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Remote Development over SSH
|
|
237
|
+
|
|
238
|
+
term2 connects directly to remote hosts over SSH, executing commands and modifying remote files within a remote working directory:
|
|
223
239
|
|
|
224
|
-
|
|
240
|
+
```bash
|
|
241
|
+
# Connect to remote server with working directory
|
|
242
|
+
term2 --ssh user@hostname --remote-dir /path/to/project
|
|
225
243
|
|
|
226
|
-
|
|
244
|
+
# Custom SSH port
|
|
245
|
+
term2 --ssh user@hostname --remote-dir /path/to/project --ssh-port 2222
|
|
227
246
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
"shell": { "autoApproveMode": "auto" },
|
|
231
|
-
"agent": { "choreModel": "gpt-5.4-mini" }
|
|
232
|
-
}
|
|
247
|
+
# Lightweight remote administration without codebase indexing
|
|
248
|
+
term2 --ssh user@hostname --lite
|
|
233
249
|
```
|
|
234
250
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
term2 stores its configuration in:
|
|
251
|
+
**Requirements and Behavior**:
|
|
252
|
+
- Requires an SSH agent running locally (`ssh-agent`) with loaded keys (`ssh-add`), or configured identity keys in `~/.ssh/config`.
|
|
253
|
+
- `--remote-dir` is required for full codebase sessions. In `--lite` mode, omitting `--remote-dir` defaults to the remote user's home directory.
|
|
254
|
+
- Background command execution is restricted to local workspaces.
|
|
240
255
|
|
|
241
|
-
|
|
242
|
-
- **Linux**: `~/.local/state/term2-nodejs/settings.json`
|
|
256
|
+
---
|
|
243
257
|
|
|
244
|
-
|
|
258
|
+
## Non-Interactive and Scripting Mode
|
|
245
259
|
|
|
246
|
-
|
|
260
|
+
Execute one-off queries and automation tasks directly from shell scripts:
|
|
247
261
|
|
|
248
262
|
```bash
|
|
249
|
-
#
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
# OpenRouter (for Claude, Gemini, and other models)
|
|
253
|
-
export OPENROUTER_API_KEY="sk-or-v1-..."
|
|
263
|
+
# Standard non-interactive query (output prints to stdout)
|
|
264
|
+
term2 "Summarize recent commits in this repository"
|
|
254
265
|
|
|
255
|
-
#
|
|
256
|
-
|
|
266
|
+
# Automated task execution with tool approvals enabled
|
|
267
|
+
term2 --auto-approve "Fix syntax errors in source/cli.tsx and run typecheck"
|
|
257
268
|
|
|
258
|
-
#
|
|
259
|
-
|
|
269
|
+
# Capture output in shell pipeline
|
|
270
|
+
TODO_LIST=$(term2 "List all TODO markers in source/")
|
|
260
271
|
```
|
|
261
272
|
|
|
262
|
-
|
|
273
|
+
---
|
|
263
274
|
|
|
264
|
-
|
|
275
|
+
## Reference Guide
|
|
265
276
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
1. **App menu** - Use `/settings` command during a session (e.g., `/settings agent.model gpt-5.2`)
|
|
269
|
-
2. **Settings file** - Manually edit the JSON file:
|
|
270
|
-
- **macOS**: `~/Library/Logs/term2-nodejs/settings.json`
|
|
271
|
-
- **Linux**: `~/.local/state/term2-nodejs/settings.json`
|
|
272
|
-
3. **CLI flags** - Override for a single session (e.g., `-m gpt-5.2`)
|
|
273
|
-
|
|
274
|
-
### Provider Configuration Examples
|
|
275
|
-
|
|
276
|
-
```json
|
|
277
|
-
// OpenAI (default)
|
|
278
|
-
{ "agent": { "provider": "openai", "model": "gpt-5.5" } }
|
|
279
|
-
|
|
280
|
-
// OpenRouter
|
|
281
|
-
{ "agent": { "provider": "openrouter", "model": "anthropic/claude-sonnet-4.6" } }
|
|
282
|
-
```
|
|
277
|
+
### Slash Commands
|
|
283
278
|
|
|
284
|
-
|
|
279
|
+
| Command | Arguments | Description |
|
|
280
|
+
| :--- | :--- | :--- |
|
|
281
|
+
| `/model` | `[model-name]` | Open model selection menu or switch model directly (`Ctrl+O`). |
|
|
282
|
+
| `/effort` | `[effort-level]` | Configure reasoning effort (`none`, `minimal`, `low`, `medium`, `high`, `xhigh`) (`Ctrl+T`). |
|
|
283
|
+
| `/plan` | — | Toggle read-only Plan Mode (`Shift+Tab`). |
|
|
284
|
+
| `/lite` | — | Toggle lightweight terminal mode. |
|
|
285
|
+
| `/mentor` | — | Toggle collaborative Mentor Mode. |
|
|
286
|
+
| `/orchestrator` | — | Toggle prompt-guided Orchestrator Mode. |
|
|
287
|
+
| `/auto-approve` | `[off\|advisory\|auto\|always]` | Cycle or set shell command auto-approval level. |
|
|
288
|
+
| `/sandbox` | — | Toggle shell sandbox isolation on or off. |
|
|
289
|
+
| `/compact` | — | Manually trigger context compaction. |
|
|
290
|
+
| `/providers` | — | Open interactive provider manager (list, add, edit, remove, switch accounts). |
|
|
291
|
+
| `/skills` | `[skill-name]` | Activate a skill for the next request. |
|
|
292
|
+
| `/rewind` | `[last\|<turn>] [edit\|resend]` | Rewind conversation history with interactive discard inspection. |
|
|
293
|
+
| `/undo` | — | Alias for `/rewind edit` (places target turn back in input box). |
|
|
294
|
+
| `/retry` | — | Alias for `/rewind resend` (immediately resends the last user turn). |
|
|
295
|
+
| `/retry-tool` | — | Re-execute the last failed or timed-out tool call. |
|
|
296
|
+
| `/copy` | `[N]` | Copy the latest assistant response (or $N$-th prior response) to clipboard. |
|
|
297
|
+
| `/usage` | — | Display exact token counts, cost breakdown, and provider rate-limit metrics. |
|
|
298
|
+
| `/resume` | `[ls\|conversation-id]` | Resume the latest or a specific saved conversation; use `/resume ls` to list recent conversations. |
|
|
299
|
+
| `/handoff` | — | Export current conversation context for handoff to another session or model. |
|
|
300
|
+
| `/settings` | `[key] [value]` | View or modify runtime configuration settings. |
|
|
301
|
+
| `/clear` | — | Clear current conversation history and start a fresh turn. |
|
|
302
|
+
| `/quit` | — | Exit term2 session. |
|
|
303
|
+
|
|
304
|
+
### Keyboard Shortcuts
|
|
305
|
+
|
|
306
|
+
| Shortcut | Context | Action |
|
|
307
|
+
| :--- | :--- | :--- |
|
|
308
|
+
| `Ctrl + O` | Input Box | Open interactive model selection menu. |
|
|
309
|
+
| `Ctrl + T` | Input Box | Open reasoning effort selection menu. |
|
|
310
|
+
| `Ctrl + G` | Global | Open Background Task Manager (inspect/pause/stop tasks). |
|
|
311
|
+
| `Shift + Tab` | Global | Cycle Operating Modes. |
|
|
312
|
+
| `!` prefix | Input Box | Execute the following command directly in the shell; the red `!` prompt remains active until the command completes. |
|
|
313
|
+
| `Alt + Enter` / `Esc + Enter` | Input Box | Queue input while a turn is executing. |
|
|
314
|
+
| `Ctrl + R` | Model Menu | Refresh provider model catalog from API. |
|
|
315
|
+
| `Ctrl + D` | Settings Menu | Reset highlighted setting to its default value. |
|
|
316
|
+
| `Escape` | Input Box | Clear input buffer (when typing). |
|
|
317
|
+
| `Double Escape` | Active Turn | Safely interrupt in-flight generation or tool execution. |
|
|
318
|
+
| `y` / `n` | Approval Prompt | Single-key approve or reject for tool execution. |
|
|
319
|
+
| `Ctrl + C` | Global | Force immediate graceful exit. |
|
|
320
|
+
|
|
321
|
+
---
|
|
285
322
|
|
|
286
|
-
|
|
287
|
-
{
|
|
288
|
-
"providers": [
|
|
289
|
-
{ "name": "llama.cpp", "type": "llama.cpp", "baseUrl": "http://127.0.0.1:8080/v1" }
|
|
290
|
-
],
|
|
291
|
-
"agent": { "provider": "llama.cpp", "model": "qwen3.6-35b-a3b" }
|
|
292
|
-
}
|
|
293
|
-
```
|
|
323
|
+
## Configuration
|
|
294
324
|
|
|
295
|
-
|
|
325
|
+
Settings are persisted across sessions in `settings.json`:
|
|
326
|
+
- **macOS**: `~/Library/Logs/term2-nodejs/settings.json`
|
|
327
|
+
- **Linux**: `~/.local/state/term2-nodejs/settings.json` *(or `$XDG_STATE_HOME/term2-nodejs/settings.json`)*
|
|
328
|
+
- **Windows**: `%LOCALAPPDATA%\term2-nodejs\Log\settings.json`
|
|
296
329
|
|
|
297
|
-
###
|
|
330
|
+
### Configuration Example
|
|
298
331
|
|
|
299
332
|
```json
|
|
300
333
|
{
|
|
301
334
|
"agent": {
|
|
302
|
-
"model": "gpt-5.4",
|
|
303
335
|
"provider": "openai",
|
|
304
|
-
"
|
|
305
|
-
"
|
|
336
|
+
"model": "gpt-5.4",
|
|
337
|
+
"reasoningEffort": "medium",
|
|
306
338
|
"smartModel": "gpt-5.5",
|
|
307
|
-
"
|
|
339
|
+
"smartProvider": "openai",
|
|
340
|
+
"balancedModel": "claude-sonnet-4.6",
|
|
341
|
+
"balancedProvider": "openrouter",
|
|
308
342
|
"cheapModel": "gpt-5.4-mini",
|
|
309
|
-
"choreModel": "gpt-5.4-mini"
|
|
343
|
+
"choreModel": "gpt-5.4-mini",
|
|
344
|
+
"temperature": 0.7,
|
|
345
|
+
"maxTurns": 100
|
|
310
346
|
},
|
|
311
347
|
"shell": {
|
|
348
|
+
"autoApproveMode": "auto",
|
|
312
349
|
"timeout": 120000,
|
|
313
|
-
"
|
|
314
|
-
|
|
350
|
+
"maxParallelToolCalls": 3
|
|
351
|
+
},
|
|
352
|
+
"sandbox": {
|
|
353
|
+
"readPolicy": "standard"
|
|
354
|
+
},
|
|
355
|
+
"webSearch": {
|
|
356
|
+
"provider": "tavily"
|
|
315
357
|
},
|
|
316
|
-
"
|
|
317
|
-
|
|
358
|
+
"providers": [
|
|
359
|
+
{
|
|
360
|
+
"name": "Local Ollama",
|
|
361
|
+
"type": "openai-compatible",
|
|
362
|
+
"baseUrl": "http://127.0.0.1:11434/v1"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"name": "Local llama.cpp",
|
|
366
|
+
"type": "llama.cpp",
|
|
367
|
+
"baseUrl": "http://127.0.0.1:8080/v1"
|
|
368
|
+
}
|
|
369
|
+
]
|
|
318
370
|
}
|
|
319
371
|
```
|
|
320
372
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
## Supported Models
|
|
325
|
-
|
|
326
|
-
- **OpenAI** (default): `gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.3-codex`, `gpt-5.2`, `gpt-5.1`
|
|
327
|
-
- **OpenRouter**: Claude, Gemini, DeepSeek, and hundreds more — use `-m model-name`
|
|
328
|
-
- **Local/Self-hosted**: Any OpenAI-compatible API (Ollama, LM Studio, vLLM, Groq, etc.)
|
|
329
|
-
|
|
330
|
-
You can reorder provider priority with the `PROVIDER_ORDER` setting in `settings.json`.
|
|
331
|
-
|
|
332
|
-
## Subagents
|
|
373
|
+
---
|
|
333
374
|
|
|
334
|
-
|
|
375
|
+
## Development and Testing
|
|
335
376
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
Subagents can also use the `ask_user` tool to ask you structured multi-choice questions during execution. Low-risk (YELLOW) shell commands issued by subagents are auto-approved to reduce interruptions.
|
|
339
|
-
|
|
340
|
-
## Conversation Resumption & Persistence
|
|
341
|
-
|
|
342
|
-
Conversations are auto-saved on exit. Resume with:
|
|
377
|
+
To set up the development environment from source:
|
|
343
378
|
|
|
344
379
|
```bash
|
|
345
|
-
|
|
346
|
-
term2 --resume <session-uuid> # resume specific session
|
|
347
|
-
term2 --resume ls # list saved sessions with metadata
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
## Development
|
|
353
|
-
|
|
354
|
-
Want to contribute or run from source?
|
|
355
|
-
|
|
356
|
-
```bash
|
|
357
|
-
# Clone the repository
|
|
380
|
+
# 1. Clone repository
|
|
358
381
|
git clone https://github.com/qduc/term2.git
|
|
359
382
|
cd term2
|
|
360
383
|
|
|
361
|
-
# Install dependencies
|
|
362
|
-
|
|
384
|
+
# 2. Install dependencies (requires pnpm >= 11)
|
|
385
|
+
pnpm install
|
|
363
386
|
|
|
364
|
-
#
|
|
365
|
-
|
|
387
|
+
# 3. Start TypeScript compiler in watch mode
|
|
388
|
+
pnpm dev
|
|
366
389
|
|
|
367
|
-
# Run
|
|
368
|
-
|
|
390
|
+
# 4. Run test suites
|
|
391
|
+
pnpm test # Run Vitest unit tests
|
|
392
|
+
pnpm test:lane # Run deterministic fast-lane tests
|
|
393
|
+
pnpm test:provider-black-box # Run provider black-box wire tests
|
|
394
|
+
pnpm typecheck # Run strict type checking
|
|
395
|
+
pnpm lint # Run ESLint and Prettier checks
|
|
369
396
|
|
|
370
|
-
# Build
|
|
371
|
-
|
|
397
|
+
# 5. Build for distribution
|
|
398
|
+
pnpm build
|
|
372
399
|
```
|
|
373
400
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
| Issue | Fix |
|
|
377
|
-
| --- | --- |
|
|
378
|
-
| `OPENAI_API_KEY not set` | `export OPENAI_API_KEY="sk-..."` |
|
|
379
|
-
| `command not found: term2` | Restart terminal or `source ~/.zshrc` |
|
|
380
|
-
| Permission denied during install | `sudo npm install --global @qduc/term2` or [fix npm perms](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally) |
|
|
381
|
-
| SSH connection failed | Start agent (`eval "$(ssh-agent -s)"`), add key (`ssh-add`), verify with `ssh-add -l` |
|
|
382
|
-
| `remote-dir is required` | Add `--remote-dir /path` or use `--lite` (auto-detects) |
|
|
383
|
-
|
|
384
|
-
## Tips
|
|
385
|
-
|
|
386
|
-
- Choose the right mode: **lite** for terminal work, **standard** for codebase work, **mentor** for complex problems
|
|
387
|
-
- Paste images directly into the terminal for vision-model analysis
|
|
388
|
-
- Press `Ctrl+C` to exit, arrow keys to navigate history
|
|
389
|
-
- Use `/auto-approve auto` to reduce prompt fatigue during long sessions
|
|
390
|
-
- System notifications alert you when the agent needs approval or finishes a task
|
|
391
|
-
- Sandbox protects sensitive files — configure `sandbox.readPolicy` in settings for stricter access control
|
|
392
|
-
|
|
393
|
-
## Contributing
|
|
394
|
-
|
|
395
|
-
Contributions are welcome! Please feel free to submit a Pull Request or open an Issue on [GitHub](https://github.com/qduc/term2).
|
|
401
|
+
---
|
|
396
402
|
|
|
397
403
|
## License
|
|
398
404
|
|
|
399
|
-
|
|
405
|
+
This project is licensed under the [MIT License](LICENSE).
|
|
400
406
|
|
|
401
|
-
|
|
407
|
+
---
|
|
402
408
|
|
|
403
|
-
|
|
409
|
+
## Acknowledgments
|
|
404
410
|
|
|
405
|
-
|
|
406
|
-
- [Ink](https://github.com/vadimdemedes/ink)
|
|
407
|
-
- [
|
|
408
|
-
- [
|
|
411
|
+
term2 is built on open-source libraries:
|
|
412
|
+
- [Ink](https://github.com/vadimdemedes/ink) — React for interactive command-line apps
|
|
413
|
+
- [Vercel AI SDK](https://github.com/vercel/ai) — Multi-provider AI streaming primitives
|
|
414
|
+
- [OpenAI Node SDK](https://github.com/openai/openai-node) — OpenAI API transport
|
|
415
|
+
- [ssh2](https://github.com/mscdex/ssh2) — SSH2 client for remote server execution
|
|
416
|
+
- [Zod](https://github.com/colinhacks/zod) — TypeScript-first schema validation
|