thatgfsj-code 3.0.4 → 3.0.7
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 +64 -21
- package/dist/app/index.d.ts +93 -22
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +232 -40
- package/dist/app/index.js.map +1 -1
- package/dist/cmd/index.d.ts +12 -20
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +192 -146
- package/dist/cmd/index.js.map +1 -1
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/llm/anthropic.d.ts +1 -1
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +116 -84
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/gemini.d.ts +27 -3
- package/dist/llm/gemini.d.ts.map +1 -1
- package/dist/llm/gemini.js +196 -73
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/index.d.ts +20 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +66 -6
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/openai.d.ts +5 -1
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +126 -66
- package/dist/llm/openai.js.map +1 -1
- package/dist/mcp/client.d.ts +84 -34
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +291 -126
- package/dist/mcp/client.js.map +1 -1
- package/dist/session/compactor.d.ts +27 -7
- package/dist/session/compactor.d.ts.map +1 -1
- package/dist/session/compactor.js +78 -23
- package/dist/session/compactor.js.map +1 -1
- package/dist/session/index.d.ts +96 -33
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +278 -60
- package/dist/session/index.js.map +1 -1
- package/dist/tools/file.d.ts +10 -2
- package/dist/tools/file.d.ts.map +1 -1
- package/dist/tools/file.js +54 -5
- package/dist/tools/file.js.map +1 -1
- package/dist/tools/git.d.ts +16 -2
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +61 -18
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/nwt.d.ts.map +1 -1
- package/dist/tools/nwt.js +8 -1
- package/dist/tools/nwt.js.map +1 -1
- package/dist/tools/search.d.ts +8 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +105 -34
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +0 -4
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +11 -26
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/types.d.ts +7 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +90 -18
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/ChatMessage.d.ts.map +1 -1
- package/dist/tui/components/ChatMessage.js +9 -2
- package/dist/tui/components/ChatMessage.js.map +1 -1
- package/dist/tui/components/ConfirmPrompt.d.ts +21 -0
- package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
- package/dist/tui/components/ConfirmPrompt.js +45 -0
- package/dist/tui/components/ConfirmPrompt.js.map +1 -0
- package/dist/tui/components/Header.d.ts +10 -5
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +13 -5
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/StatusBar.d.ts +7 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -1
- package/dist/tui/components/StatusBar.js +8 -3
- package/dist/tui/components/StatusBar.js.map +1 -1
- package/dist/tui/components/Thinking.d.ts +5 -0
- package/dist/tui/components/Thinking.d.ts.map +1 -1
- package/dist/tui/components/Thinking.js +24 -2
- package/dist/tui/components/Thinking.js.map +1 -1
- package/dist/tui/components/ToolCall.d.ts +6 -1
- package/dist/tui/components/ToolCall.d.ts.map +1 -1
- package/dist/tui/components/ToolCall.js +50 -22
- package/dist/tui/components/ToolCall.js.map +1 -1
- package/dist/tui/components/UserInput.d.ts +5 -0
- package/dist/tui/components/UserInput.d.ts.map +1 -1
- package/dist/tui/components/UserInput.js +9 -13
- package/dist/tui/components/UserInput.js.map +1 -1
- package/dist/tui/hooks/useChat.d.ts +1 -0
- package/dist/tui/hooks/useChat.d.ts.map +1 -1
- package/dist/tui/hooks/useChat.js +36 -16
- package/dist/tui/hooks/useChat.js.map +1 -1
- package/dist/tui/hooks/useCommands.d.ts +7 -1
- package/dist/tui/hooks/useCommands.d.ts.map +1 -1
- package/dist/tui/hooks/useCommands.js +77 -41
- package/dist/tui/hooks/useCommands.js.map +1 -1
- package/dist/tui/theme.d.ts +34 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +34 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/welcome.d.ts.map +1 -1
- package/dist/tui/welcome.js +9 -7
- package/dist/tui/welcome.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/diff.d.ts +5 -0
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +15 -0
- package/dist/utils/diff.js.map +1 -1
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +1 -0
- package/package.json +19 -7
- package/CHANGELOG.md +0 -192
- package/DEVELOPMENT.md +0 -286
- package/ROADMAP.md +0 -91
- package/docs/API_KEY_GUIDE.md +0 -236
- package/docs/FAQ.md +0 -182
- package/install.bat +0 -63
- package/install.ps1 +0 -238
- package/install.sh +0 -113
- package/src/app/index.ts +0 -197
- package/src/cache/fingerprint.ts +0 -101
- package/src/cache/index.ts +0 -21
- package/src/cache/smartModel.ts +0 -133
- package/src/cache/stats.ts +0 -199
- package/src/cache/volatile.ts +0 -47
- package/src/cmd/index.tsx +0 -288
- package/src/config/index.ts +0 -156
- package/src/config/providers.ts +0 -234
- package/src/config/types.ts +0 -71
- package/src/hooks/index.ts +0 -111
- package/src/llm/anthropic.ts +0 -413
- package/src/llm/gemini.ts +0 -169
- package/src/llm/index.ts +0 -303
- package/src/llm/openai.ts +0 -243
- package/src/llm/provider.ts +0 -71
- package/src/mcp/client.ts +0 -330
- package/src/prompts/index.ts +0 -260
- package/src/session/compactor.ts +0 -103
- package/src/session/index.ts +0 -181
- package/src/session/message.ts +0 -42
- package/src/skills/brainstorming.ts +0 -43
- package/src/skills/code-review.ts +0 -45
- package/src/skills/executing-plans.ts +0 -27
- package/src/skills/frontend-design.ts +0 -35
- package/src/skills/git-workflow.ts +0 -36
- package/src/skills/improve-architecture.ts +0 -38
- package/src/skills/index.ts +0 -136
- package/src/skills/neuroweave.ts +0 -47
- package/src/skills/playwright.ts +0 -72
- package/src/skills/prototype.ts +0 -30
- package/src/skills/subagent.ts +0 -28
- package/src/skills/supabase.ts +0 -44
- package/src/skills/systematic-debugging.ts +0 -44
- package/src/skills/tdd.ts +0 -39
- package/src/skills/triage.ts +0 -35
- package/src/skills/verification.ts +0 -31
- package/src/skills/writing-plans.ts +0 -42
- package/src/tools/file.ts +0 -143
- package/src/tools/git.ts +0 -132
- package/src/tools/index.ts +0 -111
- package/src/tools/nwt.ts +0 -598
- package/src/tools/search.ts +0 -263
- package/src/tools/shell.ts +0 -136
- package/src/tools/types.ts +0 -122
- package/src/tui/app.tsx +0 -159
- package/src/tui/components/ChatList.tsx +0 -41
- package/src/tui/components/ChatMessage.tsx +0 -54
- package/src/tui/components/Header.tsx +0 -66
- package/src/tui/components/InitWizard.tsx +0 -247
- package/src/tui/components/Markdown.tsx +0 -35
- package/src/tui/components/ModelSelector.tsx +0 -107
- package/src/tui/components/StatusBar.tsx +0 -30
- package/src/tui/components/Thinking.tsx +0 -17
- package/src/tui/components/ToolCall.tsx +0 -102
- package/src/tui/components/UserInput.tsx +0 -151
- package/src/tui/hooks/useChat.ts +0 -287
- package/src/tui/hooks/useCommands.ts +0 -271
- package/src/tui/index.ts +0 -6
- package/src/tui/welcome.ts +0 -177
- package/src/types.ts +0 -104
- package/src/utils/diff.ts +0 -71
- package/src/utils/project.ts +0 -99
- package/src/utils/stableStringify.ts +0 -47
- package/src/utils/thinking.ts +0 -119
- package/tests/cache/fingerprint.test.ts +0 -75
- package/tests/cache/providerCatalog.test.ts +0 -31
- package/tests/cache/smartModel.test.ts +0 -100
- package/tests/cache/stableStringify.test.ts +0 -43
- package/tests/cache/stats.test.ts +0 -146
- package/tests/cache/volatile.test.ts +0 -75
- package/tests/smoke-pollution.mjs +0 -78
- package/tests/smoke-thinking.mjs +0 -110
- package/tests/smoke-tool-stream.mjs +0 -69
- package/tests/smoke-tool.mjs +0 -117
- package/tsconfig.json +0 -21
package/dist/tools/shell.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { exec } from 'child_process';
|
|
6
6
|
import { promisify } from 'util';
|
|
7
7
|
const execAsync = promisify(exec);
|
|
8
|
-
// Dangerous command patterns - blocked immediately
|
|
8
|
+
// Dangerous command patterns - blocked immediately, regardless of mode
|
|
9
9
|
const DANGEROUS_PATTERNS = [
|
|
10
10
|
/^rm\s+-rf\s+\//i,
|
|
11
11
|
/^del\s+\/f\s+\/s\s+\/q/i,
|
|
@@ -22,21 +22,6 @@ const DANGEROUS_PATTERNS = [
|
|
|
22
22
|
/^eval\s+/i,
|
|
23
23
|
/base64\s+-d\s+.*\|/i,
|
|
24
24
|
];
|
|
25
|
-
// Commands that need user confirmation
|
|
26
|
-
const CONFIRM_REQUIRED = [
|
|
27
|
-
'rm -rf',
|
|
28
|
-
'rmdir',
|
|
29
|
-
'del /s /q',
|
|
30
|
-
'format',
|
|
31
|
-
'mkfs',
|
|
32
|
-
'dd',
|
|
33
|
-
'shutdown',
|
|
34
|
-
'reboot',
|
|
35
|
-
'pkill',
|
|
36
|
-
'killall',
|
|
37
|
-
'git push --force',
|
|
38
|
-
'git push -f',
|
|
39
|
-
];
|
|
40
25
|
export class ShellTool {
|
|
41
26
|
name = 'shell';
|
|
42
27
|
description = 'Execute shell commands and scripts. Some commands require user confirmation.';
|
|
@@ -66,13 +51,6 @@ export class ShellTool {
|
|
|
66
51
|
isDangerous(command) {
|
|
67
52
|
return DANGEROUS_PATTERNS.some(pattern => pattern.test(command.trim()));
|
|
68
53
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Check if command needs user confirmation
|
|
71
|
-
*/
|
|
72
|
-
needsConfirmation(command) {
|
|
73
|
-
const lower = command.toLowerCase();
|
|
74
|
-
return CONFIRM_REQUIRED.some(cmd => lower.includes(cmd.toLowerCase()));
|
|
75
|
-
}
|
|
76
54
|
async execute(params, ctx) {
|
|
77
55
|
const { command, cwd, timeout = 30 } = params;
|
|
78
56
|
if (!command || typeof command !== 'string') {
|
|
@@ -86,13 +64,20 @@ export class ShellTool {
|
|
|
86
64
|
if (trimmed.length > 10000) {
|
|
87
65
|
return { success: false, error: 'Command too long (max 10000 characters)' };
|
|
88
66
|
}
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
67
|
+
// v3.0.5: ask for EVERY shell execution. The old allow-list only covered
|
|
68
|
+
// a handful of patterns (anchored, so trivially bypassed) and the
|
|
69
|
+
// confirmation callback was never wired up anyway. App.requestConfirmation
|
|
70
|
+
// owns the decision: 'accept' mode (--yolo) auto-allows, 'ask' shows the
|
|
71
|
+
// prompt, headless denies. No channel -> fail closed.
|
|
72
|
+
if (ctx?.confirmAction) {
|
|
73
|
+
const confirmed = await ctx.confirmAction(`执行命令:\n ${trimmed}`);
|
|
92
74
|
if (!confirmed) {
|
|
93
75
|
return { success: false, error: 'Command cancelled by user' };
|
|
94
76
|
}
|
|
95
77
|
}
|
|
78
|
+
else {
|
|
79
|
+
return { success: false, error: 'Shell execution requires confirmation, but no confirmation channel is available (headless? add --yolo)' };
|
|
80
|
+
}
|
|
96
81
|
try {
|
|
97
82
|
const options = {
|
|
98
83
|
timeout: timeout * 1000,
|
package/dist/tools/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/types.d.ts
CHANGED
|
@@ -31,6 +31,13 @@ export interface ToolContext {
|
|
|
31
31
|
sessionId?: string;
|
|
32
32
|
workingDirectory?: string;
|
|
33
33
|
confirmAction?: (msg: string) => Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* v3.0.5: richer confirmation for file edits — carries the path and a
|
|
36
|
+
* rendered diff so the UI can show exactly what will change.
|
|
37
|
+
*/
|
|
38
|
+
confirmEdit?: (info: {
|
|
39
|
+
message: string;
|
|
40
|
+
}) => Promise<boolean>;
|
|
34
41
|
signal?: AbortSignal;
|
|
35
42
|
toolCallId?: string;
|
|
36
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9E;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,GAAG,CAAC,CAAyE;IAErF,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IACrB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAE5B,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAW7B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,UAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7F,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI;IAKzE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAK1B,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAKxF,KAAK,IAAI,IAAI;CAad"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+DH,yDAAyD;AAEzD,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,EAAE,CAAC;IACX,YAAY,GAAG,EAAE,CAAC;IAClB,WAAW,GAAoB,EAAE,CAAC;IAClC,YAAY,GAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACnE,SAAS,GAAiB,EAAE,CAAC;IAC7B,GAAG,CAA0E;IAErF,IAAI,CAAC,CAAS,IAAU,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,WAAW,CAAC,CAAS,IAAU,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpE,KAAK,CAAC,CAAgB;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;YACrC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAQ,GAAG,IAAI,EAAE,UAAmB;QACjF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAQ,GAAG,KAAK,EAAE,UAAoB;QACpF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,WAAW,CAAC,GAAG,KAAmD;QAChE,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAW;QACjB,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAA0E;QAC/E,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/tui/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAmD,MAAM,OAAO,CAAC;AAYxE,OAAO,KAAK,EAAE,GAAG,EAAkB,MAAM,iBAAiB,CAAC;AAQ3D,UAAU,KAAK;IACb,GAAG,EAAE,GAAG,CAAC;CACV;AAkBD,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,qBAyMpC"}
|
package/dist/tui/app.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource react */
|
|
3
|
-
import { useState, useCallback, useEffect } from 'react';
|
|
3
|
+
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
4
4
|
import { Box, Text, useStdout } from 'ink';
|
|
5
5
|
import { Header } from './components/Header.js';
|
|
6
6
|
import { ChatList } from './components/ChatList.js';
|
|
@@ -9,8 +9,11 @@ import { UserInput } from './components/UserInput.js';
|
|
|
9
9
|
import { StatusBar } from './components/StatusBar.js';
|
|
10
10
|
import { ModelSelector } from './components/ModelSelector.js';
|
|
11
11
|
import { InitWizard } from './components/InitWizard.js';
|
|
12
|
+
import { ConfirmPrompt } from './components/ConfirmPrompt.js';
|
|
12
13
|
import { useChat } from './hooks/useChat.js';
|
|
13
14
|
import { useCommands } from './hooks/useCommands.js';
|
|
15
|
+
import { SessionManager } from '../session/index.js';
|
|
16
|
+
import { theme } from './theme.js';
|
|
14
17
|
import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs';
|
|
15
18
|
import { join } from 'path';
|
|
16
19
|
import { homedir } from 'os';
|
|
@@ -32,20 +35,16 @@ function saveModelToHistory(model) {
|
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
export function TuiApp({ app }) {
|
|
35
|
-
const { messages, isThinking, streaming, streamingToolCalls, queuedMessage, sendMessage, cancel } = useChat(app);
|
|
38
|
+
const { messages, isThinking, streaming, streamingToolCalls, queuedMessage, sendMessage, cancel, hydrateMessages } = useChat(app);
|
|
36
39
|
const { handleCommand } = useCommands(app);
|
|
37
40
|
const [systemMessages, setSystemMessages] = useState([]);
|
|
38
41
|
const [viewMode, setViewMode] = useState('chat');
|
|
39
42
|
const { stdout } = useStdout();
|
|
40
43
|
const terminalWidth = stdout?.columns || 80;
|
|
41
|
-
// v3.0.0: cache stats snapshot for the Header.
|
|
42
|
-
// change (i.e. a round just completed and recorded new usage). Polling on
|
|
43
|
-
// an interval would be wasteful; React re-render is the trigger.
|
|
44
|
+
// v3.0.0: cache stats snapshot for the Header.
|
|
44
45
|
const [cacheSnapshot, setCacheSnapshot] = useState(() => app.cacheStats.snapshot());
|
|
45
46
|
// v3.0.3: resolved TTL (sticky per session). null until first round.
|
|
46
47
|
const [resolvedTtl, setResolvedTtl] = useState(app.resolvedTtl);
|
|
47
|
-
// The user-pinned config TTL ('auto' | '5m' | '1h') — used to render the
|
|
48
|
-
// Header chip BEFORE the first round, when resolvedTtl is still null.
|
|
49
48
|
const configTtl = app.config.get().cache?.ttl;
|
|
50
49
|
useEffect(() => {
|
|
51
50
|
setCacheSnapshot(app.cacheStats.snapshot());
|
|
@@ -54,6 +53,49 @@ export function TuiApp({ app }) {
|
|
|
54
53
|
const addMsg = useCallback((content) => {
|
|
55
54
|
setSystemMessages(prev => [...prev, { role: 'assistant', content }]);
|
|
56
55
|
}, []);
|
|
56
|
+
// ── v3.0.5: permission prompt wiring ──────────────────────
|
|
57
|
+
// The pending confirmation is held in React state and rendered INSTEAD of
|
|
58
|
+
// UserInput, so keystrokes can not double-feed into the chat box while a
|
|
59
|
+
// tool asks for permission. App.requestConfirmation resolves through this.
|
|
60
|
+
const [confirmReq, setConfirmReq] = useState(null);
|
|
61
|
+
const confirmResolveRef = useRef(null);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
app.confirmHandler = (req) => new Promise((resolve) => {
|
|
64
|
+
setConfirmReq(req);
|
|
65
|
+
// v3.0.5 fix: dismiss the prompt UI itself on timeout — App's side of
|
|
66
|
+
// the race resolves the permission answer, this resolves the rendering.
|
|
67
|
+
const timer = setTimeout(() => {
|
|
68
|
+
confirmResolveRef.current?.({ allowed: false, always: false });
|
|
69
|
+
}, 60000);
|
|
70
|
+
timer.unref?.();
|
|
71
|
+
confirmResolveRef.current = (v) => {
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
setConfirmReq(null);
|
|
74
|
+
confirmResolveRef.current = null;
|
|
75
|
+
if (v.always && app.permissionMode !== 'accept') {
|
|
76
|
+
app.setYolo(true);
|
|
77
|
+
setSystemMessages(prev => [
|
|
78
|
+
...prev,
|
|
79
|
+
{ role: 'assistant', content: '✓ 本会话已切换为自动确认(/yolo 可关回)。' },
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
resolve(v.allowed);
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
// Route auto-compact notices into the chat area instead of stderr.
|
|
86
|
+
app.session.onAutoCompact = (info) => {
|
|
87
|
+
setSystemMessages(prev => [
|
|
88
|
+
...prev,
|
|
89
|
+
{ role: 'assistant', content: `⚠️ 上下文较长(${info.before} 条),已自动压缩到 ${info.after} 条(工具调用块保持完整)。可用 /resume 随时找回历史。` },
|
|
90
|
+
]);
|
|
91
|
+
};
|
|
92
|
+
return () => {
|
|
93
|
+
app.confirmHandler = undefined;
|
|
94
|
+
};
|
|
95
|
+
}, [app]);
|
|
96
|
+
const onConfirmAnswer = useCallback((allowed, always) => {
|
|
97
|
+
confirmResolveRef.current?.({ allowed, always });
|
|
98
|
+
}, []);
|
|
57
99
|
const onSubmit = useCallback(async (input) => {
|
|
58
100
|
// Model selector - ignore text input
|
|
59
101
|
if (viewMode === 'model_select')
|
|
@@ -77,29 +119,59 @@ export function TuiApp({ app }) {
|
|
|
77
119
|
if (result.action === 'reinit') {
|
|
78
120
|
setViewMode('init_wizard');
|
|
79
121
|
}
|
|
122
|
+
// v3.0.5: /model — hot-swap provider+model now.
|
|
123
|
+
if (result.action === 'reload_model') {
|
|
124
|
+
await app.reloadModel();
|
|
125
|
+
setResolvedTtl(null);
|
|
126
|
+
}
|
|
127
|
+
// v3.0.5: /ttl — apply immediately.
|
|
128
|
+
if (result.action === 'apply_ttl' && result.payload) {
|
|
129
|
+
await app.applyTtl(result.payload);
|
|
130
|
+
setResolvedTtl(result.payload);
|
|
131
|
+
}
|
|
132
|
+
// v3.0.5: /resume <n> — load the session file and hydrate the chat list.
|
|
133
|
+
if (result.action === 'resume') {
|
|
134
|
+
const list = SessionManager.list(10);
|
|
135
|
+
const summary = list[result.payload];
|
|
136
|
+
if (!summary) {
|
|
137
|
+
addMsg('恢复失败:找不到该序号的会话,请先运行 /resume 查看列表。');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const file = SessionManager.load(summary.id);
|
|
141
|
+
if (!file) {
|
|
142
|
+
addMsg('恢复失败:会话文件损坏或已被清理。');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
app.session.loadFrom(file);
|
|
146
|
+
const visible = file.messages
|
|
147
|
+
.filter(m => (m.role === 'user' || m.role === 'assistant') && typeof m.content === 'string')
|
|
148
|
+
.map(m => ({ role: m.role, content: m.content }));
|
|
149
|
+
setSystemMessages([]);
|
|
150
|
+
hydrateMessages(visible);
|
|
151
|
+
const model = file.model ? `(模型: ${file.model})` : '';
|
|
152
|
+
addMsg(`✓ 已恢复会话 ${summary.id.slice(0, 24)}…,共 ${visible.length} 条可见消息${model}。输入 /模型 <名称> 可切换模型。`);
|
|
153
|
+
}
|
|
80
154
|
return;
|
|
81
155
|
}
|
|
82
156
|
sendMessage(input);
|
|
83
|
-
}, [handleCommand, sendMessage, app, viewMode, addMsg]);
|
|
157
|
+
}, [handleCommand, sendMessage, app, viewMode, addMsg, hydrateMessages]);
|
|
84
158
|
const allMessages = [...systemMessages, ...messages];
|
|
85
159
|
const activeSkills = app.skills.listActive().map(s => s.id);
|
|
86
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Header, {
|
|
160
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Header, { cacheHitRate: cacheSnapshot.hitRate > 0 ? cacheSnapshot.hitRate : null, cacheSavingsCNY: cacheSnapshot.estimatedSavingsCNY, cacheTtl: resolvedTtl ?? configTtl ?? null, width: terminalWidth }), _jsx(ChatList, { messages: allMessages, streaming: streaming, streamingToolCalls: streamingToolCalls, width: terminalWidth - 4 }), _jsx(Thinking, { active: isThinking }), queuedMessage && (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: theme.warning, children: "\uD83D\uDCCE \u5DF2\u6392\u961F: " }), _jsx(Text, { color: theme.textDim, children: queuedMessage })] })), viewMode === 'model_select' ? (_jsx(ModelSelector, { currentModel: app.config.get().model, currentProvider: app.config.get().provider, onSelect: (model) => {
|
|
161
|
+
// v3.0.5: fire-and-forget hot reload — the selector returns to
|
|
162
|
+
// chat immediately, the provider swap lands a moment later.
|
|
87
163
|
app.config.save({ model });
|
|
88
164
|
saveModelToHistory(model);
|
|
165
|
+
void app.reloadModel().then(() => setResolvedTtl(null));
|
|
89
166
|
setViewMode('chat');
|
|
90
167
|
addMsg(`模型已切换: ${model}`);
|
|
91
|
-
}, onAddNew: () => setViewMode('init_wizard') })) : viewMode === 'init_wizard' ? (
|
|
92
|
-
// v3.0.1: InitWizard is now fully self-contained — it owns its own
|
|
93
|
-
// input handling via useInput + ink-text-input. No external UserInput
|
|
94
|
-
// is rendered here, and app.tsx no longer has the text-entry
|
|
95
|
-
// viewModes (init_key / init_url / init_custom_model) because they
|
|
96
|
-
// were the broken input-handling path that left users stuck on a
|
|
97
|
-
// frozen "输入 API Key" screen with no way to type.
|
|
98
|
-
_jsx(InitWizard, { onComplete: (provider, model, apiKey, baseUrl) => {
|
|
168
|
+
}, onAddNew: () => setViewMode('init_wizard') })) : viewMode === 'init_wizard' ? (_jsx(InitWizard, { onComplete: (provider, model, apiKey, baseUrl) => {
|
|
99
169
|
app.config.save({ provider, model, apiKey, baseUrl });
|
|
100
170
|
saveModelToHistory(model);
|
|
101
171
|
setViewMode('chat');
|
|
102
172
|
addMsg(`配置完成: ${provider} / ${model}`);
|
|
103
|
-
}, onCancel: () => setViewMode('chat') })) :
|
|
173
|
+
}, onCancel: () => setViewMode('chat') })) : confirmReq ? (
|
|
174
|
+
// v3.0.5: exclusive input ownership while a tool asks for permission.
|
|
175
|
+
_jsx(ConfirmPrompt, { message: confirmReq.message, onAnswer: onConfirmAnswer })) : (_jsx(Box, { flexDirection: "column", children: _jsx(UserInput, { onSubmit: onSubmit, onCancel: cancel, disabled: false }) })), _jsx(StatusBar, { messageCount: allMessages.length, skills: activeSkills, provider: app.config.get().provider, model: app.config.get().model })] }));
|
|
104
176
|
}
|
|
105
177
|
//# sourceMappingURL=app.js.map
|
package/dist/tui/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ChatMessage.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ChatMessage.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAG5D,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD,eAAO,MAAM,WAAW,mCAKtB,CAAC;AAEH,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -4,11 +4,18 @@ import React from 'react';
|
|
|
4
4
|
import { Box, Text } from 'ink';
|
|
5
5
|
import { Markdown } from './Markdown.js';
|
|
6
6
|
import { ToolCall } from './ToolCall.js';
|
|
7
|
+
import { theme } from '../theme.js';
|
|
8
|
+
/**
|
|
9
|
+
* v3.0.6 (opencode-style): no "You"/"AI" headers, no boxes.
|
|
10
|
+
* user → dim `❯` mark + plain text
|
|
11
|
+
* assistant → accent `⏺` bullet + markdown body, tool calls as
|
|
12
|
+
* `⎿ tool(args)` continuation lines above the text
|
|
13
|
+
*/
|
|
7
14
|
function UserMessage({ content }) {
|
|
8
|
-
return (
|
|
15
|
+
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsxs(Box, { children: [_jsx(Text, { color: theme.userMark, bold: true, children: "\u276F " }), _jsx(Text, { color: theme.text, children: content })] }) }));
|
|
9
16
|
}
|
|
10
17
|
function AssistantMessage({ content, toolCalls }) {
|
|
11
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [toolCalls && toolCalls.map((tc, i) => (_jsx(ToolCall, { tool: tc }, i))), content && (_jsxs(Box, {
|
|
18
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [toolCalls && toolCalls.map((tc, i) => (_jsx(ToolCall, { tool: tc }, i))), content && (_jsxs(Box, { children: [_jsx(Text, { color: theme.assistantMark, children: "\u23FA " }), _jsx(Box, { flexDirection: "column", children: _jsx(Markdown, { content: content }) })] }))] }));
|
|
12
19
|
}
|
|
13
20
|
export const ChatMessage = React.memo(function ChatMessage({ message }) {
|
|
14
21
|
if (message.role === 'user') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../src/tui/components/ChatMessage.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../src/tui/components/ChatMessage.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAapC;;;;;GAKG;AACH,SAAS,WAAW,CAAC,EAAE,OAAO,EAAuB;IACnD,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YACzC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,8BAAU,EAC3C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAG,OAAO,GAAQ,IACrC,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAmD;IAC/F,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACxC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CACrC,KAAC,QAAQ,IAAS,IAAI,EAAE,EAAE,IAAX,CAAC,CAAc,CAC/B,CAAC,EACD,OAAO,IAAI,CACV,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,aAAa,wBAAW,EAC3C,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,KAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,GAAI,GAC1B,IACF,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,EAAE,OAAO,EAAS;IAC3E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAI,CAAC;IACnD,CAAC;IACD,OAAO,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,GAAI,CAAC;AACtF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** @jsxImportSource react */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** Full confirmation message (may contain a diff preview). */
|
|
5
|
+
message: string;
|
|
6
|
+
onAnswer: (allowed: boolean, alwaysAllow: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* v3.0.5: the permission prompt. Rendered INSTEAD of UserInput while a
|
|
10
|
+
* confirmation is pending, so Ink's useInput broadcast can not double-feed
|
|
11
|
+
* keystrokes into the chat box.
|
|
12
|
+
*
|
|
13
|
+
* v3.0.6: styled as an opencode-style dialog — rounded border, accent
|
|
14
|
+
* title, diff lines colored, keybind chips in the footer.
|
|
15
|
+
*
|
|
16
|
+
* Keys: y = allow once, a = allow everything this session (accept mode),
|
|
17
|
+
* n / ESC = deny.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ConfirmPrompt({ message, onAnswer }: Props): React.JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ConfirmPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmPrompt.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ConfirmPrompt.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,UAAU,KAAK;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,qBAuDzD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource react */
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Box, Text, useInput } from 'ink';
|
|
5
|
+
import { theme } from '../theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* v3.0.5: the permission prompt. Rendered INSTEAD of UserInput while a
|
|
8
|
+
* confirmation is pending, so Ink's useInput broadcast can not double-feed
|
|
9
|
+
* keystrokes into the chat box.
|
|
10
|
+
*
|
|
11
|
+
* v3.0.6: styled as an opencode-style dialog — rounded border, accent
|
|
12
|
+
* title, diff lines colored, keybind chips in the footer.
|
|
13
|
+
*
|
|
14
|
+
* Keys: y = allow once, a = allow everything this session (accept mode),
|
|
15
|
+
* n / ESC = deny.
|
|
16
|
+
*/
|
|
17
|
+
export function ConfirmPrompt({ message, onAnswer }) {
|
|
18
|
+
const [answered, setAnswered] = useState(false);
|
|
19
|
+
useInput((input, key) => {
|
|
20
|
+
if (answered)
|
|
21
|
+
return;
|
|
22
|
+
if (input === 'y' || input === 'Y' || key.return) {
|
|
23
|
+
setAnswered(true);
|
|
24
|
+
onAnswer(true, false);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (input === 'a' || input === 'A') {
|
|
28
|
+
setAnswered(true);
|
|
29
|
+
onAnswer(true, true);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (input === 'n' || input === 'N' || key.escape) {
|
|
33
|
+
setAnswered(true);
|
|
34
|
+
onAnswer(false, false);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const lines = message.split('\n');
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.warning, paddingX: 1, width: "100%", marginBottom: 0, children: [_jsx(Text, { color: theme.warning, bold: true, children: "\u25C6 \u6743\u9650\u786E\u8BA4" }), lines.slice(0, 40).map((line, i) => {
|
|
40
|
+
const isAdd = line.startsWith('+');
|
|
41
|
+
const isDel = line.startsWith('-');
|
|
42
|
+
return (_jsx(Text, { color: isAdd ? theme.success : isDel ? theme.error : theme.text, wrap: "truncate-end", children: line }, i));
|
|
43
|
+
}), lines.length > 40 && _jsx(Text, { color: theme.textDim, children: "\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09" }), _jsxs(Box, { marginTop: 0, children: [_jsx(Text, { color: theme.success, bold: true, children: "[y] \u5141\u8BB8" }), _jsx(Text, { color: theme.textFaint, children: " \u00B7 " }), _jsx(Text, { color: theme.accent, bold: true, children: "[a] \u672C\u4F1A\u8BDD\u5168\u90E8\u5141\u8BB8" }), _jsx(Text, { color: theme.textFaint, children: " \u00B7 " }), _jsx(Text, { color: theme.error, bold: true, children: "[n] \u62D2\u7EDD" }), _jsx(Text, { color: theme.textFaint, children: "\uFF0860 \u79D2\u65E0\u54CD\u5E94\u81EA\u52A8\u62D2\u7EDD\uFF09" })] })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ConfirmPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmPrompt.js","sourceRoot":"","sources":["../../../src/tui/components/ConfirmPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/** @jsxImportSource react */
|
|
2
2
|
import React from 'react';
|
|
3
3
|
interface Props {
|
|
4
|
-
provider: string;
|
|
5
|
-
model: string;
|
|
6
4
|
/**
|
|
7
5
|
* v3.0.0: optional cache hit-rate + estimated savings. When provided,
|
|
8
|
-
* the header shows `⚡
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* the header shows `⚡ 87% · ¥0.42` on the right side. When null (no
|
|
7
|
+
* rounds yet, or provider does not surface usage), the right side just
|
|
8
|
+
* shows the session info.
|
|
11
9
|
*/
|
|
12
10
|
cacheHitRate?: number | null;
|
|
13
11
|
cacheSavingsCNY?: number;
|
|
@@ -18,7 +16,14 @@ interface Props {
|
|
|
18
16
|
* decided (waiting for first round).
|
|
19
17
|
*/
|
|
20
18
|
cacheTtl?: '5m' | '1h' | 'auto' | null;
|
|
19
|
+
/** Terminal width for the rule line (v3.0.6). */
|
|
20
|
+
width?: number;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* v3.0.6 (opencode-style): single flat brand line + thin rule. The model /
|
|
24
|
+
* provider moved to the footer status bar; this line is only identity and
|
|
25
|
+
* cache telemetry.
|
|
26
|
+
*/
|
|
22
27
|
export declare const Header: React.NamedExoticComponent<Props>;
|
|
23
28
|
export {};
|
|
24
29
|
//# sourceMappingURL=Header.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,UAAU,KAAK;IACb;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD;;;;GAIG;AACH,eAAO,MAAM,MAAM,mCA0BjB,CAAC"}
|
|
@@ -2,6 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
/** @jsxImportSource react */
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Box, Text } from 'ink';
|
|
5
|
+
import { getVersion } from '../../version.js';
|
|
6
|
+
import { theme } from '../theme.js';
|
|
5
7
|
/**
|
|
6
8
|
* Choose a color for the hit-rate chip based on Reasonix-style thresholds:
|
|
7
9
|
* ≥ 80% green (excellent — most of the prefix is being reused)
|
|
@@ -10,13 +12,19 @@ import { Box, Text } from 'ink';
|
|
|
10
12
|
*/
|
|
11
13
|
function hitRateColor(rate) {
|
|
12
14
|
if (rate >= 0.8)
|
|
13
|
-
return
|
|
15
|
+
return theme.success;
|
|
14
16
|
if (rate >= 0.5)
|
|
15
|
-
return
|
|
16
|
-
return
|
|
17
|
+
return theme.warning;
|
|
18
|
+
return theme.textDim;
|
|
17
19
|
}
|
|
18
|
-
|
|
20
|
+
/**
|
|
21
|
+
* v3.0.6 (opencode-style): single flat brand line + thin rule. The model /
|
|
22
|
+
* provider moved to the footer status bar; this line is only identity and
|
|
23
|
+
* cache telemetry.
|
|
24
|
+
*/
|
|
25
|
+
export const Header = React.memo(function Header({ cacheHitRate, cacheSavingsCNY, cacheTtl, width }) {
|
|
19
26
|
const showCache = typeof cacheHitRate === 'number' && cacheHitRate > 0;
|
|
20
|
-
|
|
27
|
+
const rule = '─'.repeat(Math.max(20, width ? width - 2 : 78));
|
|
28
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 0, children: [_jsxs(Box, { justifyContent: "space-between", width: "100%", children: [_jsxs(Box, { children: [_jsx(Text, { color: theme.accent, bold: true, children: "\u25C6 " }), _jsx(Text, { color: theme.text, bold: true, children: "gfcode" }), _jsxs(Text, { color: theme.textDim, children: [" v", getVersion()] })] }), _jsxs(Box, { children: [showCache && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: hitRateColor(cacheHitRate), children: ["\u26A1 ", (cacheHitRate * 100).toFixed(1), "%"] }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 \u00A5", (cacheSavingsCNY ?? 0).toFixed(2)] }), _jsx(Text, { color: theme.textFaint, children: " \u00B7 " })] })), cacheTtl && _jsxs(Text, { color: theme.textDim, children: ["\u23F1 ", cacheTtl] })] })] }), _jsx(Text, { color: theme.border, children: rule })] }));
|
|
21
29
|
});
|
|
22
30
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAsBpC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACtC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAS;IACxG,MAAM,SAAS,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,GAAG,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,KAAK,EAAC,MAAM,aAC9C,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,8BAAU,EACzC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,6BAAc,EAC3C,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,mBAAK,UAAU,EAAE,IAAQ,IAC/C,EACN,MAAC,GAAG,eACD,SAAS,IAAI,CACZ,8BACE,MAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,YAAa,CAAC,wBAAK,CAAC,YAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACtF,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,+BAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAQ,EAC1E,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,yBAAY,IACvC,CACJ,EACA,QAAQ,IAAI,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,wBAAK,QAAQ,IAAQ,IACxD,IACF,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YAAG,IAAI,GAAQ,IACpC,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -3,7 +3,14 @@ import React from 'react';
|
|
|
3
3
|
interface Props {
|
|
4
4
|
messageCount: number;
|
|
5
5
|
skills: string[];
|
|
6
|
+
/** Current provider/model id (v3.0.6 — moved here from Header). */
|
|
7
|
+
provider?: string;
|
|
8
|
+
model?: string;
|
|
6
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* v3.0.6 (opencode-style footer): thin rule + one status line.
|
|
12
|
+
* left: provider/model · right: messages · active skills
|
|
13
|
+
*/
|
|
7
14
|
export declare const StatusBar: React.NamedExoticComponent<Props>;
|
|
8
15
|
export {};
|
|
9
16
|
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,mCA0BpB,CAAC"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource react */
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Box, Text } from 'ink';
|
|
5
|
-
|
|
5
|
+
import { theme } from '../theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* v3.0.6 (opencode-style footer): thin rule + one status line.
|
|
8
|
+
* left: provider/model · right: messages · active skills
|
|
9
|
+
*/
|
|
10
|
+
export const StatusBar = React.memo(function StatusBar({ messageCount, skills, provider, model }) {
|
|
6
11
|
const activeSkills = skills.slice(0, 3).join(', ');
|
|
7
12
|
const moreSkills = skills.length > 3 ? ` +${skills.length - 3}` : '';
|
|
8
|
-
return (
|
|
13
|
+
return (_jsx(Box, { flexDirection: "column", marginTop: 0, children: _jsxs(Box, { justifyContent: "space-between", width: "100%", children: [_jsx(Box, { children: provider && model ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.textDim, children: provider }), _jsx(Text, { color: theme.textFaint, children: "/" }), _jsx(Text, { color: theme.textDim, children: model })] })) : null }), _jsxs(Box, { children: [_jsxs(Text, { color: theme.textFaint, children: [messageCount, " \u6761"] }), skills.length > 0 && (_jsxs(Text, { color: theme.textFaint, children: [" \u00B7 \u6280\u80FD ", activeSkills, moreSkills] })), _jsx(Text, { color: theme.textFaint, children: " \u00B7 /help" })] })] }) }));
|
|
9
14
|
});
|
|
10
15
|
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUpC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAS;IACrG,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,YACtC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,KAAK,EAAC,MAAM,aAC9C,KAAC,GAAG,cACD,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CACnB,8BACE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAAG,QAAQ,GAAQ,EAC7C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,kBAAU,EACtC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAAG,KAAK,GAAQ,IACzC,CACJ,CAAC,CAAC,CAAC,IAAI,GACJ,EACN,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,aAAG,YAAY,eAAU,EACpD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,sCAAS,YAAY,EAAE,UAAU,IAAQ,CACtE,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,8BAAiB,IACzC,IACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|