@prestyj/cli 4.3.15 → 4.3.54
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 +4 -4
- package/dist/cli.js +529 -74
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +122 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +41 -23
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +14 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/auto-update.d.ts +24 -3
- package/dist/core/auto-update.d.ts.map +1 -1
- package/dist/core/auto-update.js +143 -55
- package/dist/core/auto-update.js.map +1 -1
- package/dist/core/auto-update.test.d.ts +2 -0
- package/dist/core/auto-update.test.d.ts.map +1 -0
- package/dist/core/auto-update.test.js +205 -0
- package/dist/core/auto-update.test.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +4 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +17 -1
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +44 -11
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts.map +1 -1
- package/dist/core/compaction/token-estimator.js +14 -1
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +1 -1
- package/dist/core/logger.d.ts +7 -2
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +48 -4
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +56 -21
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +356 -1
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +3 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +29 -14
- package/dist/core/skills.js.map +1 -1
- package/dist/modes/agent-home-mode.d.ts +21 -0
- package/dist/modes/agent-home-mode.d.ts.map +1 -0
- package/dist/modes/agent-home-mode.js +553 -0
- package/dist/modes/agent-home-mode.js.map +1 -0
- package/dist/system-prompt.d.ts +5 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +118 -82
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash.js +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +4 -2
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +61 -33
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +80 -20
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +12 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/plan-mode.test.js +22 -6
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts +10 -0
- package/dist/tools/prompt-hints.d.ts.map +1 -0
- package/dist/tools/prompt-hints.js +45 -0
- package/dist/tools/prompt-hints.js.map +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +32 -6
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/read.test.js +23 -4
- package/dist/tools/read.test.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +20 -3
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/write.test.js +13 -1
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +6 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +195 -70
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +0 -1
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/EyesOverlay.d.ts +10 -0
- package/dist/ui/components/EyesOverlay.d.ts.map +1 -0
- package/dist/ui/components/EyesOverlay.js +220 -0
- package/dist/ui/components/EyesOverlay.js.map +1 -0
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +7 -6
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts +4 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +6 -5
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts.map +1 -1
- package/dist/ui/components/ModelSelector.js +2 -1
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
- package/dist/ui/components/PlanOverlay.js +7 -1
- package/dist/ui/components/PlanOverlay.js.map +1 -1
- package/dist/ui/components/SelectList.d.ts +3 -1
- package/dist/ui/components/SelectList.d.ts.map +1 -1
- package/dist/ui/components/SelectList.js +15 -2
- package/dist/ui/components/SelectList.js.map +1 -1
- package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
- package/dist/ui/components/SkillsOverlay.js +6 -59
- package/dist/ui/components/SkillsOverlay.js.map +1 -1
- package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
- package/dist/ui/components/SlashCommandMenu.js +18 -8
- package/dist/ui/components/SlashCommandMenu.js.map +1 -1
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +2 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +1 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.js +94 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +19 -0
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/login.d.ts.map +1 -1
- package/dist/ui/login.js +6 -5
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/stores/create-store.d.ts +15 -0
- package/dist/ui/stores/create-store.d.ts.map +1 -0
- package/dist/ui/stores/create-store.js +30 -0
- package/dist/ui/stores/create-store.js.map +1 -0
- package/dist/ui/stores/index.d.ts +3 -0
- package/dist/ui/stores/index.d.ts.map +1 -0
- package/dist/ui/stores/index.js +3 -0
- package/dist/ui/stores/index.js.map +1 -0
- package/dist/ui/stores/taskbar-store.d.ts +19 -0
- package/dist/ui/stores/taskbar-store.d.ts.map +1 -0
- package/dist/ui/stores/taskbar-store.js +59 -0
- package/dist/ui/stores/taskbar-store.js.map +1 -0
- package/dist/ui/utils/token-to-ansi.d.ts.map +1 -1
- package/dist/ui/utils/token-to-ansi.js +9 -1
- package/dist/ui/utils/token-to-ansi.js.map +1 -1
- package/dist/utils/image.d.ts +18 -1
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js +80 -31
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/session-title.js +1 -1
- package/package.json +13 -9
package/dist/tools/subagent.js
CHANGED
|
@@ -6,6 +6,7 @@ const SUB_AGENT_MAX_TURNS = 10;
|
|
|
6
6
|
const SUB_AGENT_MAX_OUTPUT_CHARS = 100_000; // ~25k tokens, matches other tool limits
|
|
7
7
|
const SUB_AGENT_MAX_OUTPUT_LINES = 500;
|
|
8
8
|
const SUB_AGENT_MAX_STDERR_CHARS = 10_000; // Cap stderr to prevent unbounded growth
|
|
9
|
+
const SUB_AGENT_TIMEOUT_MS = 10 * 60 * 1000; // 10 minute hard timeout
|
|
9
10
|
const SubAgentParams = z.object({
|
|
10
11
|
task: z.string().describe("The task to delegate to the sub-agent"),
|
|
11
12
|
agent: z
|
|
@@ -65,16 +66,28 @@ export function createSubAgentTool(cwd, agents, parentProvider, parentModel, pla
|
|
|
65
66
|
const tokenUsage = { input: 0, output: 0 };
|
|
66
67
|
let currentActivity;
|
|
67
68
|
let textOutput = "";
|
|
68
|
-
//
|
|
69
|
-
|
|
69
|
+
// Track whether the child has actually exited
|
|
70
|
+
let childExited = false;
|
|
71
|
+
const killChild = () => {
|
|
72
|
+
if (childExited)
|
|
73
|
+
return;
|
|
70
74
|
child.kill("SIGTERM");
|
|
71
75
|
setTimeout(() => {
|
|
72
|
-
if (!
|
|
76
|
+
if (!childExited)
|
|
73
77
|
child.kill("SIGKILL");
|
|
74
78
|
}, 3000);
|
|
75
79
|
};
|
|
80
|
+
// Handle abort signal
|
|
81
|
+
const abortHandler = () => killChild();
|
|
76
82
|
context.signal.addEventListener("abort", abortHandler, { once: true });
|
|
83
|
+
// If already aborted (e.g. reset happened before we got here), kill immediately
|
|
84
|
+
if (context.signal.aborted)
|
|
85
|
+
killChild();
|
|
77
86
|
return new Promise((resolve) => {
|
|
87
|
+
// Hard timeout to prevent subagents from hanging indefinitely
|
|
88
|
+
const timeout = setTimeout(() => {
|
|
89
|
+
killChild();
|
|
90
|
+
}, SUB_AGENT_TIMEOUT_MS);
|
|
78
91
|
// Read NDJSON from stdout
|
|
79
92
|
const rl = createInterface({ input: child.stdout });
|
|
80
93
|
rl.on("line", (line) => {
|
|
@@ -132,6 +145,8 @@ export function createSubAgentTool(cwd, agents, parentProvider, parentModel, pla
|
|
|
132
145
|
}
|
|
133
146
|
});
|
|
134
147
|
child.on("close", (code) => {
|
|
148
|
+
childExited = true;
|
|
149
|
+
clearTimeout(timeout);
|
|
135
150
|
rl.close();
|
|
136
151
|
context.signal.removeEventListener("abort", abortHandler);
|
|
137
152
|
const durationMs = Date.now() - startTime;
|
|
@@ -157,6 +172,8 @@ export function createSubAgentTool(cwd, agents, parentProvider, parentModel, pla
|
|
|
157
172
|
resolve({ content, details });
|
|
158
173
|
});
|
|
159
174
|
child.on("error", (err) => {
|
|
175
|
+
childExited = true;
|
|
176
|
+
clearTimeout(timeout);
|
|
160
177
|
rl.close();
|
|
161
178
|
context.signal.removeEventListener("abort", abortHandler);
|
|
162
179
|
resolve({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,0BAA0B,GAAG,OAAO,CAAC,CAAC,yCAAyC;AACrF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,0BAA0B,GAAG,MAAM,CAAC,CAAC,yCAAyC;
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/write.test.js
CHANGED
|
@@ -4,7 +4,19 @@ import path from "node:path";
|
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import { createWriteTool } from "./write.js";
|
|
6
6
|
function resultToString(result) {
|
|
7
|
-
|
|
7
|
+
if (typeof result === "string")
|
|
8
|
+
return result;
|
|
9
|
+
if (result && typeof result === "object" && "content" in result) {
|
|
10
|
+
const c = result.content;
|
|
11
|
+
if (typeof c === "string")
|
|
12
|
+
return c;
|
|
13
|
+
if (Array.isArray(c)) {
|
|
14
|
+
return c
|
|
15
|
+
.map((b) => b.type === "text" ? (b.text ?? "") : "[image]")
|
|
16
|
+
.join("\n");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return String(result);
|
|
8
20
|
}
|
|
9
21
|
describe("createWriteTool", () => {
|
|
10
22
|
let tmpDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../src/tools/write.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,SAAS,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../src/tools/write.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,SAAS,cAAc,CAAC,MAAe;IACrC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QAChE,MAAM,CAAC,GAAI,MAA+B,CAAC,OAAO,CAAC;QACnD,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC;iBACL,GAAG,CAAC,CAAC,CAAkC,EAAE,EAAE,CAC1C,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAC/C;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,uBAAuB,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAClC,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QAEzE,mCAAmC;QACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,EACrC,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,EACpD,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAEpD,2DAA2D;QAC3D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEhD,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EACrD,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,eAAe;QACf,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EACrD,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEhD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAChD,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAExE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,EAC7C,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAExE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,wBAAwB,EAAE,OAAO,EAAE,aAAa,EAAE,EAC/D,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CAAC;QACxF,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,EACvC,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/ui/App.d.ts
CHANGED
|
@@ -55,6 +55,11 @@ interface InfoItem {
|
|
|
55
55
|
text: string;
|
|
56
56
|
id: string;
|
|
57
57
|
}
|
|
58
|
+
interface UpdateNoticeItem {
|
|
59
|
+
kind: "update_notice";
|
|
60
|
+
text: string;
|
|
61
|
+
id: string;
|
|
62
|
+
}
|
|
58
63
|
interface QueuedItem {
|
|
59
64
|
kind: "queued";
|
|
60
65
|
text: string;
|
|
@@ -130,7 +135,7 @@ export interface ToolGroupItem {
|
|
|
130
135
|
tools: ToolGroupTool[];
|
|
131
136
|
id: string;
|
|
132
137
|
}
|
|
133
|
-
export type CompletedItem = UserItem | TaskItem | AssistantItem | ToolStartItem | ToolDoneItem | ServerToolStartItem | ServerToolDoneItem | ErrorItem | InfoItem | QueuedItem | CompactingItem | CompactedItem | DurationItem | BannerItem | SubAgentGroupItem | ToolGroupItem | PlanTransitionItem | TombstoneItem;
|
|
138
|
+
export type CompletedItem = UserItem | TaskItem | AssistantItem | ToolStartItem | ToolDoneItem | ServerToolStartItem | ServerToolDoneItem | ErrorItem | InfoItem | UpdateNoticeItem | QueuedItem | CompactingItem | CompactedItem | DurationItem | BannerItem | SubAgentGroupItem | ToolGroupItem | PlanTransitionItem | TombstoneItem;
|
|
134
139
|
export interface AppProps {
|
|
135
140
|
provider: Provider;
|
|
136
141
|
model: string;
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AAE/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/App.js
CHANGED
|
@@ -11,6 +11,7 @@ import { join } from "node:path";
|
|
|
11
11
|
import { playNotificationSound } from "../utils/sound.js";
|
|
12
12
|
import { extractImagePaths } from "../utils/image.js";
|
|
13
13
|
import { useAgentLoop } from "./hooks/useAgentLoop.js";
|
|
14
|
+
import { isEyesActive, journalCount } from "@prestyj/ezcoder-eyes";
|
|
14
15
|
import { UserMessage } from "./components/UserMessage.js";
|
|
15
16
|
import { AssistantMessage } from "./components/AssistantMessage.js";
|
|
16
17
|
import { ToolExecution } from "./components/ToolExecution.js";
|
|
@@ -18,6 +19,7 @@ import { ToolGroupExecution } from "./components/ToolGroupExecution.js";
|
|
|
18
19
|
import { ServerToolExecution } from "./components/ServerToolExecution.js";
|
|
19
20
|
import { SubAgentPanel } from "./components/SubAgentPanel.js";
|
|
20
21
|
import { CompactionSpinner, CompactionDone } from "./components/CompactionNotice.js";
|
|
22
|
+
import { createWebSearchTool } from "../tools/web-search.js";
|
|
21
23
|
import { StreamingArea } from "./components/StreamingArea.js";
|
|
22
24
|
import { ActivityIndicator } from "./components/ActivityIndicator.js";
|
|
23
25
|
import { InputArea } from "./components/InputArea.js";
|
|
@@ -27,6 +29,7 @@ import { PlanOverlay } from "./components/PlanOverlay.js";
|
|
|
27
29
|
import { ModelSelector } from "./components/ModelSelector.js";
|
|
28
30
|
import { TaskOverlay } from "./components/TaskOverlay.js";
|
|
29
31
|
import { SkillsOverlay } from "./components/SkillsOverlay.js";
|
|
32
|
+
import { EyesOverlay } from "./components/EyesOverlay.js";
|
|
30
33
|
import { ThemeSelector } from "./components/ThemeSelector.js";
|
|
31
34
|
import { BackgroundTasksBar } from "./components/BackgroundTasksBar.js";
|
|
32
35
|
import { useTheme, useSetTheme } from "./theme/theme.js";
|
|
@@ -37,6 +40,7 @@ import { getGitBranch } from "../utils/git.js";
|
|
|
37
40
|
import { getModel, getContextWindow } from "../core/model-registry.js";
|
|
38
41
|
import { SessionManager } from "../core/session-manager.js";
|
|
39
42
|
import { log } from "../core/logger.js";
|
|
43
|
+
import { getPendingUpdate, startPeriodicUpdateCheck, stopPeriodicUpdateCheck, } from "../core/auto-update.js";
|
|
40
44
|
import { generateSessionTitle } from "../utils/session-title.js";
|
|
41
45
|
import { SettingsManager } from "../core/settings-manager.js";
|
|
42
46
|
import { shouldCompact, compact } from "../core/compaction/compactor.js";
|
|
@@ -303,6 +307,8 @@ export function App(props) {
|
|
|
303
307
|
const [liveItems, setLiveItems] = useState([]);
|
|
304
308
|
const [overlay, setOverlay] = useState(null);
|
|
305
309
|
const [taskCount, setTaskCount] = useState(() => getTaskCount(props.cwd));
|
|
310
|
+
const [eyesCount, setEyesCount] = useState(() => isEyesActive(props.cwd) ? journalCount({ status: "open" }, props.cwd) : undefined);
|
|
311
|
+
const [updatePending, setUpdatePending] = useState(() => getPendingUpdate(props.version) !== null);
|
|
306
312
|
const [runAllTasks, setRunAllTasks] = useState(false);
|
|
307
313
|
const runAllTasksRef = useRef(false);
|
|
308
314
|
const startTaskRef = useRef(() => { });
|
|
@@ -327,7 +333,9 @@ export function App(props) {
|
|
|
327
333
|
const persistedIndexRef = useRef(messagesRef.current.length);
|
|
328
334
|
/** Last actual API-reported input token count (from turn_end). */
|
|
329
335
|
const lastActualTokensRef = useRef(0);
|
|
330
|
-
/** Timestamp
|
|
336
|
+
/** Timestamp (ms) when lastActualTokensRef was last updated by turn_end. */
|
|
337
|
+
const lastActualTokensTimestampRef = useRef(0);
|
|
338
|
+
/** Timestamp of last compaction — used for time-based cooldown and staleness detection. */
|
|
331
339
|
const lastCompactionTimeRef = useRef(0);
|
|
332
340
|
const getId = () => String(nextIdRef.current++);
|
|
333
341
|
// Two-phase flush: items waiting to be moved to Static history after the
|
|
@@ -350,6 +358,14 @@ export function App(props) {
|
|
|
350
358
|
useEffect(() => {
|
|
351
359
|
getGitBranch(props.cwd).then(setGitBranch);
|
|
352
360
|
}, [props.cwd]);
|
|
361
|
+
// Periodic update check during long sessions
|
|
362
|
+
useEffect(() => {
|
|
363
|
+
startPeriodicUpdateCheck(props.version, (msg) => {
|
|
364
|
+
setLiveItems((prev) => [...prev, { kind: "update_notice", text: msg, id: getId() }]);
|
|
365
|
+
setUpdatePending(true);
|
|
366
|
+
});
|
|
367
|
+
return () => stopPeriodicUpdateCheck();
|
|
368
|
+
}, [props.version]);
|
|
353
369
|
// Load custom commands from .ezcoder/commands/
|
|
354
370
|
const [customCommands, setCustomCommands] = useState([]);
|
|
355
371
|
const reloadCustomCommands = useCallback(() => {
|
|
@@ -479,17 +495,24 @@ export function App(props) {
|
|
|
479
495
|
signal: undefined,
|
|
480
496
|
approvedPlanPath: approvedPlanPathRef.current,
|
|
481
497
|
});
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
498
|
+
if (result.result.compacted) {
|
|
499
|
+
// Replace spinner with completed notice
|
|
500
|
+
setLiveItems((prev) => prev.map((item) => item.id === spinId
|
|
501
|
+
? {
|
|
502
|
+
kind: "compacted",
|
|
503
|
+
originalCount: result.result.originalCount,
|
|
504
|
+
newCount: result.result.newCount,
|
|
505
|
+
tokensBefore: result.result.tokensBeforeEstimate,
|
|
506
|
+
tokensAfter: result.result.tokensAfterEstimate,
|
|
507
|
+
id: spinId,
|
|
508
|
+
}
|
|
509
|
+
: item));
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
// Nothing was actually compacted — remove spinner silently
|
|
513
|
+
log("INFO", "compaction", `Compaction skipped: ${result.result.reason ?? "unknown"}`);
|
|
514
|
+
setLiveItems((prev) => prev.filter((item) => item.id !== spinId));
|
|
515
|
+
}
|
|
493
516
|
return result.messages;
|
|
494
517
|
}
|
|
495
518
|
catch (err) {
|
|
@@ -520,7 +543,6 @@ export function App(props) {
|
|
|
520
543
|
if (options?.force) {
|
|
521
544
|
const result = await compactConversation(messages);
|
|
522
545
|
lastCompactionTimeRef.current = Date.now();
|
|
523
|
-
lastActualTokensRef.current = 0; // Reset stale pre-compaction count
|
|
524
546
|
return result;
|
|
525
547
|
}
|
|
526
548
|
if (!autoCompact)
|
|
@@ -531,12 +553,20 @@ export function App(props) {
|
|
|
531
553
|
return messages;
|
|
532
554
|
}
|
|
533
555
|
const contextWindow = getContextWindow(currentModel);
|
|
534
|
-
// Prefer actual API-reported tokens over char-based estimate
|
|
535
|
-
|
|
556
|
+
// Prefer actual API-reported tokens over char-based estimate, but only
|
|
557
|
+
// when the token count was recorded AFTER the most recent compaction.
|
|
558
|
+
// A count from before compaction is stale — it reflects the old context
|
|
559
|
+
// size and would trigger compaction again immediately for no reason.
|
|
560
|
+
const tokensFresh = lastActualTokensTimestampRef.current > lastCompactionTimeRef.current;
|
|
561
|
+
const actualTokens = lastActualTokensRef.current > 0 && tokensFresh ? lastActualTokensRef.current : undefined;
|
|
536
562
|
if (shouldCompact(messages, contextWindow, threshold, actualTokens)) {
|
|
563
|
+
const before = messages.length;
|
|
537
564
|
const result = await compactConversation(messages);
|
|
538
565
|
lastCompactionTimeRef.current = Date.now();
|
|
539
|
-
|
|
566
|
+
// If compaction was a no-op (e.g. too few middle messages to summarize),
|
|
567
|
+
// return the original reference so the agent loop doesn't replace messages.
|
|
568
|
+
if (result.length === before)
|
|
569
|
+
return messages;
|
|
540
570
|
return result;
|
|
541
571
|
}
|
|
542
572
|
return messages;
|
|
@@ -969,6 +999,7 @@ export function App(props) {
|
|
|
969
999
|
const inputContext = usage.inputTokens + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
|
|
970
1000
|
lastActualTokensRef.current =
|
|
971
1001
|
currentProvider === "anthropic" ? inputContext : inputContext + usage.outputTokens;
|
|
1002
|
+
lastActualTokensTimestampRef.current = Date.now();
|
|
972
1003
|
// For tool-only turns (no text), flush completed items to Static so
|
|
973
1004
|
// liveItems doesn't grow unbounded across consecutive tool-only turns.
|
|
974
1005
|
setLiveItems((prev) => {
|
|
@@ -1110,6 +1141,14 @@ export function App(props) {
|
|
|
1110
1141
|
useEffect(() => {
|
|
1111
1142
|
setTitleRunning(agentLoop.isRunning);
|
|
1112
1143
|
}, [agentLoop.isRunning]);
|
|
1144
|
+
// Refresh eyes badge count when the agent settles (end of a turn) — a turn
|
|
1145
|
+
// may have logged new rough/wish/blocked signals. Also covers the case where
|
|
1146
|
+
// /eyes was run for the first time (manifest now exists).
|
|
1147
|
+
useEffect(() => {
|
|
1148
|
+
if (!agentLoop.isRunning) {
|
|
1149
|
+
setEyesCount(isEyesActive(props.cwd) ? journalCount({ status: "open" }, props.cwd) : undefined);
|
|
1150
|
+
}
|
|
1151
|
+
}, [agentLoop.isRunning, props.cwd]);
|
|
1113
1152
|
// Terminal progress bar (OSC 9;4) — pulsing bar in supported terminals
|
|
1114
1153
|
useTerminalProgress(agentLoop.isRunning, agentLoop.activeToolCalls.length > 0);
|
|
1115
1154
|
// Animated thinking border — derived from global animation tick
|
|
@@ -1150,6 +1189,9 @@ export function App(props) {
|
|
|
1150
1189
|
// Clear terminal screen + scrollback — needed because Ink's <Static>
|
|
1151
1190
|
// writes directly to stdout and can't be removed by clearing React state
|
|
1152
1191
|
stdout?.write("\x1b[2J\x1b[3J\x1b[H");
|
|
1192
|
+
// Discard any items queued for two-phase flush so they don't leak
|
|
1193
|
+
// into the new session after the Static remount.
|
|
1194
|
+
pendingFlushRef.current = [];
|
|
1153
1195
|
setHistory([{ kind: "banner", id: "banner" }]);
|
|
1154
1196
|
setLiveItems([]);
|
|
1155
1197
|
setDoneStatus(null);
|
|
@@ -1160,10 +1202,14 @@ export function App(props) {
|
|
|
1160
1202
|
void (async () => {
|
|
1161
1203
|
const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined);
|
|
1162
1204
|
messagesRef.current = [{ role: "system", content: newPrompt }];
|
|
1205
|
+
persistedIndexRef.current = messagesRef.current.length;
|
|
1163
1206
|
})();
|
|
1164
1207
|
agentLoop.reset();
|
|
1165
1208
|
setSessionTitle(undefined);
|
|
1166
1209
|
sessionTitleGeneratedRef.current = false;
|
|
1210
|
+
// Bump staticKey to force Ink's <Static> to remount, discarding its
|
|
1211
|
+
// internal record of previously rendered items so they don't reappear.
|
|
1212
|
+
setStaticKey((k) => k + 1);
|
|
1167
1213
|
setLiveItems([{ kind: "info", text: "Session cleared.", id: getId() }]);
|
|
1168
1214
|
return;
|
|
1169
1215
|
}
|
|
@@ -1172,6 +1218,24 @@ export function App(props) {
|
|
|
1172
1218
|
setOverlay("theme");
|
|
1173
1219
|
return;
|
|
1174
1220
|
}
|
|
1221
|
+
// Open the Eyes pane — read-only review of installed probes + open signals.
|
|
1222
|
+
// Gated by the ezcoder-eyes manifest: in projects without /eyes set up,
|
|
1223
|
+
// there's nothing useful to show.
|
|
1224
|
+
if (trimmed === "/eyes-view" || trimmed === "/ev") {
|
|
1225
|
+
if (!isEyesActive(props.cwd)) {
|
|
1226
|
+
setLiveItems((prev) => [
|
|
1227
|
+
...prev,
|
|
1228
|
+
{
|
|
1229
|
+
kind: "info",
|
|
1230
|
+
text: "Eyes not set up in this project. Run /setup-eyes to get started.",
|
|
1231
|
+
id: getId(),
|
|
1232
|
+
},
|
|
1233
|
+
]);
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1236
|
+
setOverlay("eyes");
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1175
1239
|
// Handle /plan — toggle plan mode
|
|
1176
1240
|
if (trimmed === "/plan" || trimmed === "/plan on") {
|
|
1177
1241
|
setPlanMode(true);
|
|
@@ -1351,10 +1415,14 @@ export function App(props) {
|
|
|
1351
1415
|
setLiveItems((prev) => [...prev, queuedItem]);
|
|
1352
1416
|
return;
|
|
1353
1417
|
}
|
|
1354
|
-
// Move any remaining live items into history (Static) before starting
|
|
1418
|
+
// Move any remaining live items into history (Static) before starting a
|
|
1419
|
+
// new turn. Must go through queueFlush so flushGeneration bumps and the
|
|
1420
|
+
// drain effect actually runs — mutating pendingFlushRef directly here
|
|
1421
|
+
// stashed items that nothing was signalled to pick up, so they sat in
|
|
1422
|
+
// limbo until some unrelated later code path happened to call queueFlush.
|
|
1355
1423
|
setLiveItems((prev) => {
|
|
1356
1424
|
if (prev.length > 0) {
|
|
1357
|
-
|
|
1425
|
+
queueFlush(prev);
|
|
1358
1426
|
}
|
|
1359
1427
|
return [];
|
|
1360
1428
|
});
|
|
@@ -1429,40 +1497,57 @@ export function App(props) {
|
|
|
1429
1497
|
const newProvider = value.slice(0, colonIdx);
|
|
1430
1498
|
const newModelId = value.slice(colonIdx + 1);
|
|
1431
1499
|
log("INFO", "model", `Model changed`, { provider: newProvider, model: newModelId });
|
|
1432
|
-
//
|
|
1500
|
+
// Handle provider-specific tool changes when provider changes
|
|
1433
1501
|
setCurrentProvider((prevProvider) => {
|
|
1434
|
-
if (newProvider !== prevProvider
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1502
|
+
if (newProvider !== prevProvider) {
|
|
1503
|
+
// Add/remove client-side web_search tool based on provider.
|
|
1504
|
+
// Anthropic has native server-side web search; all other providers need the client tool.
|
|
1505
|
+
setCurrentTools((prev) => {
|
|
1506
|
+
const hasWebSearch = prev.some((t) => t.name === "web_search");
|
|
1507
|
+
if (newProvider === "anthropic" && hasWebSearch) {
|
|
1508
|
+
// Switching TO anthropic — remove client-side web_search (server-side handles it)
|
|
1509
|
+
return prev.filter((t) => t.name !== "web_search");
|
|
1510
|
+
}
|
|
1511
|
+
else if (newProvider !== "anthropic" && !hasWebSearch) {
|
|
1512
|
+
// Switching FROM anthropic — add client-side web_search
|
|
1513
|
+
return [...prev, createWebSearchTool()];
|
|
1514
|
+
}
|
|
1515
|
+
return prev;
|
|
1516
|
+
});
|
|
1517
|
+
// Reconnect MCP servers
|
|
1518
|
+
if (props.mcpManager) {
|
|
1519
|
+
void (async () => {
|
|
1520
|
+
// Disconnect old MCP servers
|
|
1521
|
+
await props.mcpManager.dispose();
|
|
1522
|
+
// Remove old MCP tools, connect new ones
|
|
1523
|
+
let apiKey;
|
|
1524
|
+
if (newProvider === "glm" && props.authStorage) {
|
|
1525
|
+
try {
|
|
1526
|
+
const glmCreds = await props.authStorage.resolveCredentials("glm");
|
|
1527
|
+
apiKey = glmCreds.accessToken;
|
|
1528
|
+
}
|
|
1529
|
+
catch {
|
|
1530
|
+
// GLM not configured — skip Z.AI MCP servers
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
else if (newProvider === "glm") {
|
|
1534
|
+
apiKey = props.credentialsByProvider?.["glm"]?.accessToken;
|
|
1535
|
+
}
|
|
1441
1536
|
try {
|
|
1442
|
-
const
|
|
1443
|
-
|
|
1537
|
+
const mcpTools = await props.mcpManager.connectAll(getMCPServers(newProvider, apiKey));
|
|
1538
|
+
setCurrentTools((prev) => [
|
|
1539
|
+
...prev.filter((t) => !t.name.startsWith("mcp__")),
|
|
1540
|
+
...mcpTools,
|
|
1541
|
+
]);
|
|
1542
|
+
log("INFO", "mcp", `MCP servers reconnected for provider ${newProvider}`);
|
|
1444
1543
|
}
|
|
1445
|
-
catch {
|
|
1446
|
-
|
|
1544
|
+
catch (err) {
|
|
1545
|
+
log("WARN", "mcp", `MCP reconnection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1546
|
+
// Still remove old MCP tools even if reconnection fails
|
|
1547
|
+
setCurrentTools((prev) => prev.filter((t) => !t.name.startsWith("mcp__")));
|
|
1447
1548
|
}
|
|
1448
|
-
}
|
|
1449
|
-
|
|
1450
|
-
apiKey = props.credentialsByProvider?.["glm"]?.accessToken;
|
|
1451
|
-
}
|
|
1452
|
-
try {
|
|
1453
|
-
const mcpTools = await props.mcpManager.connectAll(getMCPServers(newProvider, apiKey));
|
|
1454
|
-
setCurrentTools((prev) => [
|
|
1455
|
-
...prev.filter((t) => !t.name.startsWith("mcp__")),
|
|
1456
|
-
...mcpTools,
|
|
1457
|
-
]);
|
|
1458
|
-
log("INFO", "mcp", `MCP servers reconnected for provider ${newProvider}`);
|
|
1459
|
-
}
|
|
1460
|
-
catch (err) {
|
|
1461
|
-
log("WARN", "mcp", `MCP reconnection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1462
|
-
// Still remove old MCP tools even if reconnection fails
|
|
1463
|
-
setCurrentTools((prev) => prev.filter((t) => !t.name.startsWith("mcp__")));
|
|
1464
|
-
}
|
|
1465
|
-
})();
|
|
1549
|
+
})();
|
|
1550
|
+
}
|
|
1466
1551
|
}
|
|
1467
1552
|
return newProvider;
|
|
1468
1553
|
});
|
|
@@ -1497,26 +1582,54 @@ export function App(props) {
|
|
|
1497
1582
|
{ kind: "info", text: `Theme switched to: ${name}`, id: getId() },
|
|
1498
1583
|
]);
|
|
1499
1584
|
}, [switchTheme, props.settingsFile]);
|
|
1500
|
-
// All available slash commands for the command palette
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1585
|
+
// All available slash commands for the command palette — ordered by how
|
|
1586
|
+
// commonly they're used and grouped by purpose; /quit stays dead last.
|
|
1587
|
+
const allCommands = useMemo(() => {
|
|
1588
|
+
const promptByName = new Map(PROMPT_COMMANDS.map((c) => [c.name, c]));
|
|
1589
|
+
const fromPrompt = (name) => {
|
|
1590
|
+
const c = promptByName.get(name);
|
|
1591
|
+
return c ? { name: c.name, aliases: c.aliases, description: c.description } : null;
|
|
1592
|
+
};
|
|
1593
|
+
const promptOrder = [
|
|
1594
|
+
// Project audits / one-shot analysis
|
|
1595
|
+
"init",
|
|
1596
|
+
"research",
|
|
1597
|
+
"scan",
|
|
1598
|
+
"verify",
|
|
1599
|
+
"simplify",
|
|
1600
|
+
"compare",
|
|
1601
|
+
"batch",
|
|
1602
|
+
// Setup / installers
|
|
1603
|
+
"setup-lint",
|
|
1604
|
+
"setup-tests",
|
|
1605
|
+
"setup-commit",
|
|
1606
|
+
"setup-update",
|
|
1607
|
+
"setup-eyes",
|
|
1608
|
+
"eyes-improve",
|
|
1609
|
+
"setup-skills",
|
|
1610
|
+
];
|
|
1611
|
+
const orderedPromptCommands = promptOrder
|
|
1612
|
+
.map(fromPrompt)
|
|
1613
|
+
.filter((c) => c !== null);
|
|
1614
|
+
const knownPromptNames = new Set(promptOrder);
|
|
1615
|
+
const remainingPromptCommands = PROMPT_COMMANDS.filter((c) => !knownPromptNames.has(c.name)).map((c) => ({ name: c.name, aliases: c.aliases, description: c.description }));
|
|
1616
|
+
return [
|
|
1617
|
+
// Session actions (most frequent)
|
|
1618
|
+
{ name: "model", aliases: ["m"], description: "Switch model" },
|
|
1619
|
+
{ name: "compact", aliases: ["c"], description: "Compact conversation" },
|
|
1620
|
+
{ name: "clear", aliases: [], description: "Clear session and terminal" },
|
|
1621
|
+
{ name: "theme", aliases: ["t"], description: "Switch theme" },
|
|
1622
|
+
{ name: "plans", aliases: [], description: "Open plans pane" },
|
|
1623
|
+
...orderedPromptCommands,
|
|
1624
|
+
...remainingPromptCommands,
|
|
1625
|
+
...customCommands.map((cmd) => ({
|
|
1626
|
+
name: cmd.name,
|
|
1627
|
+
aliases: [],
|
|
1628
|
+
description: cmd.description,
|
|
1629
|
+
})),
|
|
1630
|
+
{ name: "quit", aliases: ["q", "exit"], description: "Exit the agent" },
|
|
1631
|
+
];
|
|
1632
|
+
}, [customCommands]);
|
|
1520
1633
|
const renderItem = (item) => {
|
|
1521
1634
|
switch (item.kind) {
|
|
1522
1635
|
case "tombstone":
|
|
@@ -1545,6 +1658,8 @@ export function App(props) {
|
|
|
1545
1658
|
}
|
|
1546
1659
|
case "info":
|
|
1547
1660
|
return (_jsx(Box, { marginTop: 1, flexShrink: 1, children: _jsx(Text, { color: theme.textDim, wrap: "wrap", children: item.text }) }, item.id));
|
|
1661
|
+
case "update_notice":
|
|
1662
|
+
return (_jsx(Box, { marginTop: 1, flexShrink: 1, borderStyle: "round", borderColor: theme.success, paddingX: 1, children: _jsxs(Text, { color: theme.success, bold: true, wrap: "wrap", children: ["✨ ", item.text] }) }, item.id));
|
|
1548
1663
|
case "plan_transition":
|
|
1549
1664
|
return (_jsx(Box, { marginTop: 1, flexShrink: 1, children: _jsxs(Text, { color: theme.planPrimary, bold: true, wrap: "wrap", children: [item.active ? "● " : "● ", item.text] }) }, item.id));
|
|
1550
1665
|
case "queued":
|
|
@@ -1615,7 +1730,8 @@ export function App(props) {
|
|
|
1615
1730
|
const isTaskView = overlay === "tasks";
|
|
1616
1731
|
const isSkillsView = overlay === "skills";
|
|
1617
1732
|
const isPlanView = overlay === "plan";
|
|
1618
|
-
const
|
|
1733
|
+
const isEyesView = overlay === "eyes";
|
|
1734
|
+
const isOverlayView = isTaskView || isSkillsView || isPlanView || isEyesView;
|
|
1619
1735
|
return (_jsxs(Box, { flexDirection: "column", width: columns, children: [_jsx(Static, { items: isOverlayView ? [] : history, style: { width: "100%" }, children: (item) => (_jsx(Box, { flexDirection: "column", paddingRight: 1, children: renderItem(item) }, item.id)) }, `${resizeKey}-${staticKey}`), isTaskView ? (_jsx(TaskOverlay, { cwd: props.cwd, agentRunning: agentLoop.isRunning, onClose: () => {
|
|
1620
1736
|
stdout?.write("\x1b[2J\x1b[3J\x1b[H");
|
|
1621
1737
|
setTaskCount(getTaskCount(props.cwd));
|
|
@@ -1636,6 +1752,13 @@ export function App(props) {
|
|
|
1636
1752
|
stdout?.write("\x1b[2J\x1b[3J\x1b[H");
|
|
1637
1753
|
setStaticKey((k) => k + 1);
|
|
1638
1754
|
setOverlay(null);
|
|
1755
|
+
} })) : isEyesView ? (_jsx(EyesOverlay, { cwd: props.cwd, onClose: () => {
|
|
1756
|
+
stdout?.write("\x1b[2J\x1b[3J\x1b[H");
|
|
1757
|
+
setEyesCount(isEyesActive(props.cwd) ? journalCount({ status: "open" }, props.cwd) : undefined);
|
|
1758
|
+
setStaticKey((k) => k + 1);
|
|
1759
|
+
setOverlay(null);
|
|
1760
|
+
}, onQueueMessage: (msg) => {
|
|
1761
|
+
agentLoop.queueMessage(msg);
|
|
1639
1762
|
} })) : isPlanView ? (_jsx(PlanOverlay, { cwd: props.cwd, autoExpandNewest: planAutoExpand, onClose: () => {
|
|
1640
1763
|
planOverlayPendingRef.current = false;
|
|
1641
1764
|
stdout?.write("\x1b[2J\x1b[3J\x1b[H");
|
|
@@ -1734,6 +1857,8 @@ export function App(props) {
|
|
|
1734
1857
|
id: getId(),
|
|
1735
1858
|
},
|
|
1736
1859
|
]);
|
|
1737
|
-
}, cwd: props.cwd, commands: allCommands }), overlay === "model" ? (_jsx(ModelSelector, { onSelect: handleModelSelect, onCancel: () => setOverlay(null), loggedInProviders: props.loggedInProviders ?? [currentProvider], currentModel: currentModel, currentProvider: currentProvider })) : overlay === "theme" ? (_jsx(ThemeSelector, { onSelect: handleThemeSelect, onCancel: () => setOverlay(null), currentTheme: theme.name })) : (_jsx(Footer, { model: currentModel, tokensIn: agentLoop.contextUsed, cwd: props.cwd, gitBranch: gitBranch, thinkingEnabled: thinkingEnabled, planMode: planMode, exitPending: exitPending })), buddyEnabled && _jsx(Buddy, { phase: agentLoop.activityPhase }), bgTasks.length > 0
|
|
1860
|
+
}, cwd: props.cwd, commands: allCommands, eyesCount: eyesCount }), overlay === "model" ? (_jsx(ModelSelector, { onSelect: handleModelSelect, onCancel: () => setOverlay(null), loggedInProviders: props.loggedInProviders ?? [currentProvider], currentModel: currentModel, currentProvider: currentProvider })) : overlay === "theme" ? (_jsx(ThemeSelector, { onSelect: handleThemeSelect, onCancel: () => setOverlay(null), currentTheme: theme.name })) : (_jsx(Footer, { model: currentModel, tokensIn: agentLoop.contextUsed, cwd: props.cwd, gitBranch: gitBranch, thinkingEnabled: thinkingEnabled, planMode: planMode, exitPending: exitPending })), buddyEnabled && _jsx(Buddy, { phase: agentLoop.activityPhase }), (bgTasks.length > 0 ||
|
|
1861
|
+
(eyesCount !== undefined && eyesCount > 0) ||
|
|
1862
|
+
updatePending) && (_jsxs(Box, { children: [bgTasks.length > 0 && (_jsx(BackgroundTasksBar, { tasks: bgTasks, focused: taskBarFocused, expanded: taskBarExpanded, selectedIndex: selectedTaskIndex, onExpand: handleTaskBarExpand, onCollapse: handleTaskBarCollapse, onKill: handleTaskKill, onExit: handleTaskBarExit, onNavigate: handleTaskNavigate })), eyesCount !== undefined && eyesCount > 0 && (_jsx(Box, { paddingLeft: bgTasks.length > 0 ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.accent, bold: true, children: `${eyesCount} eyes signal${eyesCount === 1 ? "" : "s"} · Run /eyes-improve to enhance GG Coder` }) })), updatePending && (_jsx(Box, { paddingLeft: bgTasks.length > 0 || (eyesCount !== undefined && eyesCount > 0) ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.success, bold: true, children: "\u2728 Update ready \u00B7 restart to apply" }) }))] }))] }))] }));
|
|
1738
1863
|
}
|
|
1739
1864
|
//# sourceMappingURL=App.js.map
|