@qduc/term2 0.2.0 β 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +14 -6
- package/dist/app.js.map +1 -1
- package/dist/components/BottomArea.d.ts +3 -2
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +1 -1
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/determine-active-menu.d.ts +2 -1
- package/dist/components/Input/determine-active-menu.d.ts.map +1 -1
- package/dist/components/Input/determine-active-menu.js +41 -28
- package/dist/components/Input/determine-active-menu.js.map +1 -1
- package/dist/components/InputBox.d.ts +3 -2
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +46 -11
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.menu-logic.test.js +55 -15
- package/dist/components/InputBox.menu-logic.test.js.map +1 -1
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +36 -24
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/MessageList.test.js +14 -0
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/SlashCommandMenu.d.ts +1 -6
- package/dist/components/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/SlashCommandMenu.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +1 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +4 -0
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +2 -1
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +6 -4
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +32 -11
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.js +107 -10
- package/dist/hooks/use-model-selection.test.js.map +1 -1
- package/dist/hooks/use-slash-commands.d.ts +1 -1
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.d.ts +3 -1
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +3 -3
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +2 -1
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +2 -4
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +1 -1
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- package/dist/lib/retry-executor.d.ts.map +1 -1
- package/dist/lib/retry-executor.js +1 -2
- package/dist/lib/retry-executor.js.map +1 -1
- package/dist/lib/retry-executor.test.js +1 -2
- package/dist/lib/retry-executor.test.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.d.ts +8 -0
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.js +70 -0
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts +2 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js +195 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +24 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.js +27 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts +2 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js +68 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.d.ts +16 -0
- package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.js +22 -0
- package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts +2 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js +70 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -0
- package/dist/providers/common/openai-compatible-messages.d.ts +8 -0
- package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -0
- package/dist/providers/common/openai-compatible-messages.js +356 -0
- package/dist/providers/common/openai-compatible-messages.js.map +1 -0
- package/dist/providers/common/openai-compatible-messages.test.d.ts +2 -0
- package/dist/providers/common/openai-compatible-messages.test.d.ts.map +1 -0
- package/dist/providers/common/openai-compatible-messages.test.js +26 -0
- package/dist/providers/common/openai-compatible-messages.test.js.map +1 -0
- package/dist/providers/common/openai-compatible-utils.d.ts +11 -0
- package/dist/providers/common/openai-compatible-utils.d.ts.map +1 -0
- package/dist/providers/common/openai-compatible-utils.js +33 -0
- package/dist/providers/common/openai-compatible-utils.js.map +1 -0
- package/dist/providers/common/provider-errors.d.ts +13 -0
- package/dist/providers/common/provider-errors.d.ts.map +1 -0
- package/dist/providers/common/provider-errors.js +25 -0
- package/dist/providers/common/provider-errors.js.map +1 -0
- package/dist/providers/openai-compatible.provider.createRunner.test.d.ts +2 -0
- package/dist/providers/openai-compatible.provider.createRunner.test.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.createRunner.test.js +39 -0
- package/dist/providers/openai-compatible.provider.createRunner.test.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +18 -8
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +1 -3
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/openrouter.provider.createRunner.test.js +28 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
- package/dist/providers/openrouter.provider.js +14 -5
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/scripts/eval-auto-approval/dataset.d.ts +2 -2
- package/dist/services/conversation-session.d.ts +3 -2
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +12 -6
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-store.d.ts +2 -0
- package/dist/services/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation-store.js +27 -0
- package/dist/services/conversation-store.js.map +1 -1
- package/dist/services/conversation-store.test.js +34 -0
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/logging-contract.d.ts +3 -3
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +5 -1
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/model-service.test.js +1 -5
- package/dist/services/model-service.test.js.map +1 -1
- package/dist/services/settings-schema.d.ts +12 -8
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +9 -0
- package/dist/services/settings-schema.js.map +1 -1
- package/dist/services/stream-event-parsing.js +1 -1
- package/dist/services/stream-event-parsing.js.map +1 -1
- package/dist/services/stream-event-parsing.test.js +13 -0
- package/dist/services/stream-event-parsing.test.js.map +1 -1
- package/dist/slash-commands.d.ts +20 -0
- package/dist/slash-commands.d.ts.map +1 -0
- package/dist/slash-commands.js +2 -0
- package/dist/slash-commands.js.map +1 -0
- package/dist/types/user-turn.d.ts +16 -0
- package/dist/types/user-turn.d.ts.map +1 -0
- package/dist/types/user-turn.js +27 -0
- package/dist/types/user-turn.js.map +1 -0
- package/dist/types/user-turn.test.d.ts +2 -0
- package/dist/types/user-turn.test.d.ts.map +1 -0
- package/dist/types/user-turn.test.js +32 -0
- package/dist/types/user-turn.test.js.map +1 -0
- package/dist/utils/log-truncation.d.ts +7 -0
- package/dist/utils/log-truncation.d.ts.map +1 -0
- package/dist/utils/log-truncation.js +66 -0
- package/dist/utils/log-truncation.js.map +1 -0
- package/dist/utils/log-truncation.test.d.ts +2 -0
- package/dist/utils/log-truncation.test.d.ts.map +1 -0
- package/dist/utils/log-truncation.test.js +44 -0
- package/dist/utils/log-truncation.test.js.map +1 -0
- package/dist/utils/settings-command.d.ts +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +2 -0
- package/dist/utils/settings-command.js.map +1 -1
- package/package.json +6 -2
- package/readme.md +29 -24
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { sanitizeLogMetadata } from './log-truncation.js';
|
|
3
|
+
test('sanitizeLogMetadata truncates image payloads in messages content', (t) => {
|
|
4
|
+
const longBase64 = 'data:image/png;base64,' + 'a'.repeat(10000);
|
|
5
|
+
const meta = {
|
|
6
|
+
eventType: 'provider.request.started',
|
|
7
|
+
messages: [
|
|
8
|
+
{
|
|
9
|
+
role: 'user',
|
|
10
|
+
content: [
|
|
11
|
+
{ type: 'text', text: 'describe this' },
|
|
12
|
+
{ type: 'image', image: longBase64 },
|
|
13
|
+
{ type: 'input_image', image_url: { url: longBase64, detail: 'high' } },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
const sanitized = sanitizeLogMetadata(meta);
|
|
19
|
+
const firstMessage = sanitized.messages[0];
|
|
20
|
+
const directImage = firstMessage.content[1].image;
|
|
21
|
+
const imageUrl = firstMessage.content[2].image_url.url;
|
|
22
|
+
t.not(sanitized, meta);
|
|
23
|
+
t.true(directImage.length < 500);
|
|
24
|
+
t.true(directImage.endsWith('... (truncated)'));
|
|
25
|
+
t.true(imageUrl.length < 500);
|
|
26
|
+
t.true(imageUrl.endsWith('... (truncated)'));
|
|
27
|
+
t.is(meta.messages[0].content[1].image, longBase64);
|
|
28
|
+
t.is(meta.messages[0].content[2].image_url.url, longBase64);
|
|
29
|
+
});
|
|
30
|
+
test('sanitizeLogMetadata returns metadata unchanged when there are no truncation targets', (t) => {
|
|
31
|
+
const meta = {
|
|
32
|
+
eventType: 'provider.request.started',
|
|
33
|
+
messages: [
|
|
34
|
+
{
|
|
35
|
+
role: 'user',
|
|
36
|
+
content: [{ type: 'text', text: 'plain text only' }],
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
provider: 'openai',
|
|
40
|
+
};
|
|
41
|
+
const sanitized = sanitizeLogMetadata(meta);
|
|
42
|
+
t.is(sanitized, meta);
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=log-truncation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-truncation.test.js","sourceRoot":"","sources":["../../source/utils/log-truncation.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,IAAI,CAAC,kEAAkE,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7E,MAAM,UAAU,GAAG,wBAAwB,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,0BAA0B;QACrC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;oBACvC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;oBACpC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;iBACxE;aACF;SACF;KACF,CAAC;IAEF,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAU,CAAC,GAAG,CAAC;IAExD,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,CAAC,CAAC,EAAE,EAAE;IAChG,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,0BAA0B;QACrC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;aACrD;SACF;QACD,QAAQ,EAAE,QAAQ;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE5C,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SlashCommand } from '../
|
|
1
|
+
import type { SlashCommand } from '../slash-commands.js';
|
|
2
2
|
import type { SettingsService, SettingsWithSources } from '../services/settings-service.js';
|
|
3
3
|
export declare function parseSettingValue(raw: string): any;
|
|
4
4
|
export declare function formatSettingsSummary(settings: SettingsWithSources): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-command.d.ts","sourceRoot":"","sources":["../../source/utils/settings-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"settings-command.d.ts","sourceRoot":"","sources":["../../source/utils/settings-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAM5F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAYlD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAiF3E;AAED,UAAU,yBAAyB;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,GACT,EAAE,yBAAyB,GAAG,YAAY,CAiG1C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SETTINGS_RESET_TRIGGER, SETTINGS_TRIGGER } from '../components/Input/triggers.js';
|
|
1
2
|
import { SETTING_KEYS } from '../services/settings-service.js';
|
|
2
3
|
import { getProvider } from '../providers/index.js';
|
|
3
4
|
import { parseModelProviderArg } from './model-provider-arg.js';
|
|
@@ -99,6 +100,7 @@ export function createSettingsCommand({ settingsService, addSystemMessage, apply
|
|
|
99
100
|
name: 'settings',
|
|
100
101
|
description: 'View or modify settings',
|
|
101
102
|
expectsArgs: true,
|
|
103
|
+
completion: { type: 'settings', trigger: SETTINGS_TRIGGER, resetTrigger: SETTINGS_RESET_TRIGGER },
|
|
102
104
|
action: (args) => {
|
|
103
105
|
const trimmedArgs = args?.trim() ?? '';
|
|
104
106
|
// No args: prompt for setting name with autocomplete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-command.js","sourceRoot":"","sources":["../../source/utils/settings-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings-command.js","sourceRoot":"","sources":["../../source/utils/settings-command.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qduc/term2",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "A terminal-based AI assistant that can help you get things done on your computer",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "qduc",
|
|
@@ -48,17 +48,21 @@
|
|
|
48
48
|
"dist"
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
|
+
"@ai-sdk/openai-compatible": "^2.0.47",
|
|
51
52
|
"@mozilla/readability": "^0.6.0",
|
|
52
53
|
"@openai/agents": "^0.8.3",
|
|
54
|
+
"@openai/agents-extensions": "^0.11.1",
|
|
55
|
+
"@openrouter/ai-sdk-provider": "^2.9.0",
|
|
53
56
|
"@qduc/web-fetch": "^0.1.0",
|
|
54
57
|
"@types/ssh2": "^1.15.5",
|
|
58
|
+
"ai": "^6.0.177",
|
|
55
59
|
"bash-parser": "^0.5.0",
|
|
56
60
|
"env-paths": "^3.0.0",
|
|
57
61
|
"fast-glob": "^3.3.2",
|
|
58
62
|
"fuse.js": "^7.0.0",
|
|
59
63
|
"ignore": "^5.3.2",
|
|
60
64
|
"ink": "^7.0.1",
|
|
61
|
-
"ink-prompt": "^0.
|
|
65
|
+
"ink-prompt": "^0.2.4",
|
|
62
66
|
"jsdom": "^27.4.0",
|
|
63
67
|
"marked": "^17.0.1",
|
|
64
68
|
"meow": "^11.0.0",
|
package/readme.md
CHANGED
|
@@ -15,18 +15,22 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
|
|
|
15
15
|
|
|
16
16
|
- π **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (get help from a smarter model on complex problems)
|
|
17
17
|
- π **Open Source** - MIT licensed, hackable, auditable, community-driven
|
|
18
|
-
- π€ **Multi-Provider Support** - Works with OpenAI, OpenRouter,
|
|
18
|
+
- π€ **Multi-Provider Support** - Works with OpenAI, OpenRouter, OpenAI-compatible APIs, and Vercel AI SDK providers
|
|
19
19
|
- π **Safe Execution** - Every command requires your explicit approval with diff preview
|
|
20
|
-
- π οΈ **Advanced Tools** - Shell execution, file patching, search/replace, grep, find files, file reading, web search, and mentor consultation
|
|
21
|
-
- π¬ **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/mentor`, `/lite` for easy control
|
|
20
|
+
- π οΈ **Advanced Tools** - Shell execution, file patching, search/replace (with `<...>` gap matching), grep, find files, file reading, file creation, web search, and mentor consultation
|
|
21
|
+
- π¬ **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/mentor`, `/lite`, `/copy`, `/auto-approve` for easy control
|
|
22
22
|
- π **Smart Context** - The assistant understands your environment and provides relevant help
|
|
23
23
|
- π― **Streaming Responses** - See the AI's thoughts and reasoning in real-time
|
|
24
24
|
- π§ **Reasoning Effort Control** - Configurable reasoning levels (minimal to high) for O1/O3 models
|
|
25
25
|
- β‘ **Command History** - Navigate previous inputs with arrow keys
|
|
26
|
-
- π¨ **Markdown Rendering** - Formatted code blocks and text in the terminal
|
|
26
|
+
- π¨ **Markdown Rendering** - Formatted code blocks, tables, and text in the terminal
|
|
27
27
|
- π **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
|
|
28
28
|
- π **SSH Mode** - Execute commands and edit files on remote servers over SSH
|
|
29
29
|
- π€ **Non-Interactive Mode** - Run commands from the CLI without starting the full UI
|
|
30
|
+
- βοΈ **Edit Mode** - Press `Shift+Tab` to auto-approve file edits in your workspace for faster development
|
|
31
|
+
- π€ **Auto-Approval** - Optional LLM-based safety evaluation can automatically approve safe shell commands
|
|
32
|
+
- πΌοΈ **Image Pasting** - Paste images from your clipboard directly into the terminal for vision-model analysis
|
|
33
|
+
- π **Real-time Token Usage** - Live token consumption displayed during streaming
|
|
30
34
|
|
|
31
35
|
## Why term2 vs Alternatives?
|
|
32
36
|
|
|
@@ -51,7 +55,7 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
|
|
|
51
55
|
|
|
52
56
|
**Requirements:**
|
|
53
57
|
|
|
54
|
-
- Node.js
|
|
58
|
+
- Node.js 20 or higher
|
|
55
59
|
- An API key from OpenAI, OpenRouter, or any OpenAI-compatible provider
|
|
56
60
|
|
|
57
61
|
Install globally via npm:
|
|
@@ -139,6 +143,8 @@ While in the chat, you can use these commands:
|
|
|
139
143
|
- `/model [model-name]` - Switch to a different model
|
|
140
144
|
- `/mentor` - Toggle mentor mode (see "Operating Modes" section for details)
|
|
141
145
|
- `/lite` - Toggle lite mode (see "Operating Modes" section for details)
|
|
146
|
+
- `/copy` - Copy the latest assistant response
|
|
147
|
+
- `/auto-approve [off|advisory|auto]` - Set or cycle shell auto-approval mode
|
|
142
148
|
- `/settings [key] [value]` - Modify runtime settings (e.g., `/settings agent.temperature 0.7`)
|
|
143
149
|
|
|
144
150
|
## Operating Modes
|
|
@@ -222,7 +228,7 @@ Mentor mode gives you two AI minds working together on your codebase. Your prima
|
|
|
222
228
|
|
|
223
229
|
**Requirements:**
|
|
224
230
|
|
|
225
|
-
- Configure `agent.mentorModel` in settings (e.g., `gpt-5.
|
|
231
|
+
- Configure `agent.mentorModel` in settings (e.g., `gpt-5.5`, `claude-opus-4.6` or `gemini-3.1-pro-preview`)
|
|
226
232
|
- Mentor model should be more capable than primary model for best results
|
|
227
233
|
- Toggle with `/mentor` command mid-session
|
|
228
234
|
|
|
@@ -253,10 +259,11 @@ AI: [Does additional checks based on mentor's questions]
|
|
|
253
259
|
|
|
254
260
|
Modes are mutually exclusiveβeach represents a different working style matched to your task. You can switch modes mid-session:
|
|
255
261
|
|
|
256
|
-
- `/lite` - Toggle lite mode (
|
|
262
|
+
- `/lite` - Toggle lite mode (requires clearing history first if session is active)
|
|
257
263
|
- `/mentor` - Toggle mentor mode
|
|
264
|
+
- `Shift+Tab` - Toggle edit mode (auto-approves file edits in workspace)
|
|
258
265
|
- Switching to lite mode automatically disables edit/mentor modes
|
|
259
|
-
- Enabling
|
|
266
|
+
- Enabling lite mode disables edit and mentor modes
|
|
260
267
|
|
|
261
268
|
## SSH Mode
|
|
262
269
|
|
|
@@ -375,8 +382,11 @@ export OPENAI_API_KEY="sk-..."
|
|
|
375
382
|
# OpenRouter (for Claude, Gemini, and other models)
|
|
376
383
|
export OPENROUTER_API_KEY="sk-or-v1-..."
|
|
377
384
|
|
|
378
|
-
# Web Search (Tavily)
|
|
385
|
+
# Web Search (Tavily β default)
|
|
379
386
|
export TAVILY_API_KEY="tvly-..."
|
|
387
|
+
|
|
388
|
+
# Web Search (Exa)
|
|
389
|
+
export EXA_API_KEY="..."
|
|
380
390
|
```
|
|
381
391
|
|
|
382
392
|
To make them permanent, add these exports to your shell configuration file (`~/.bashrc`, `~/.zshrc`, or `~/.profile`).
|
|
@@ -477,17 +487,12 @@ term2 works with multiple AI providers:
|
|
|
477
487
|
|
|
478
488
|
### OpenAI (default)
|
|
479
489
|
|
|
480
|
-
- `gpt-5.
|
|
490
|
+
- `gpt-5.5` (latest)
|
|
491
|
+
- `gpt-5.4`
|
|
492
|
+
- `gpt-5.4-mini`
|
|
493
|
+
- `gpt-5.3-codex`
|
|
494
|
+
- `gpt-5.2`
|
|
481
495
|
- `gpt-5.1` (default)
|
|
482
|
-
- `gpt-5`
|
|
483
|
-
- `gpt-5-mini`
|
|
484
|
-
- `gpt-4.1`
|
|
485
|
-
- `gpt-4.1-mini`
|
|
486
|
-
- `gpt-5.1`
|
|
487
|
-
- `gpt-5.1-mini`
|
|
488
|
-
- `o3` (supports reasoning effort)
|
|
489
|
-
- `o3-mini` (supports reasoning effort)
|
|
490
|
-
- `o1` (supports reasoning effort)
|
|
491
496
|
|
|
492
497
|
### OpenRouter
|
|
493
498
|
|
|
@@ -503,13 +508,14 @@ Use CLI flags (`-m model-name`) or settings file to select OpenRouter models.
|
|
|
503
508
|
|
|
504
509
|
term2 can connect to any OpenAI-compatible API. This allows you to use:
|
|
505
510
|
|
|
506
|
-
- **Local Models**: Run private models locally via Ollama, LM Studio, vLLM, or
|
|
511
|
+
- **Local Models**: Run private models locally via Ollama, LM Studio, vLLM, or llama.cpp.
|
|
507
512
|
- **Self-Hosted**: Connect to private deployments of models.
|
|
508
513
|
- **Other Providers**: Any service offering an OpenAI-compatible endpoint (e.g., Groq, Together AI).
|
|
509
514
|
|
|
510
515
|
## Safety Features
|
|
511
516
|
|
|
512
517
|
- **Command Approval** - Every destructive operation requires your explicit confirmation
|
|
518
|
+
- **Auto-Approval** - Optional LLM-based safety evaluation with advisory and auto modes for shell commands
|
|
513
519
|
- **Diff Preview** - See exact file changes before approving patches or edits
|
|
514
520
|
- **Risk Analysis** - Dangerous operations (like `rm -rf`, `git push --force`) are flagged
|
|
515
521
|
- **Path Safety** - Operations on sensitive directories require extra caution
|
|
@@ -616,6 +622,9 @@ term2 --ssh user@host --lite
|
|
|
616
622
|
- Use arrow keys to navigate through your command history
|
|
617
623
|
- Be specific in your requests for better results
|
|
618
624
|
- Use `/mentor` to get expert consultation on difficult architectural decisions
|
|
625
|
+
- Use `Shift+Tab` to toggle edit mode for faster file editing workflows
|
|
626
|
+
- Use `/auto-approve` to enable LLM-based safety evaluation for faster shell command workflows
|
|
627
|
+
- Paste images directly into the terminal when using vision-capable models
|
|
619
628
|
- Use `--lite` flag when SSH'ing to servers for general system work without codebase context
|
|
620
629
|
|
|
621
630
|
## Contributing
|
|
@@ -634,7 +643,3 @@ Built with:
|
|
|
634
643
|
- [Ink](https://github.com/vadimdemedes/ink) - React for CLI
|
|
635
644
|
- [TypeScript](https://www.typescriptlang.org/)
|
|
636
645
|
- [ssh2](https://github.com/mscdex/ssh2) - SSH client for Node.js
|
|
637
|
-
|
|
638
|
-
---
|
|
639
|
-
|
|
640
|
-
Made with β€οΈ by [qduc](https://github.com/qduc)
|