@glbgpt/cli 0.1.4 → 0.2.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/README.md +82 -40
- package/dist/src/coding/backgroundTasks.d.ts +34 -0
- package/dist/src/coding/backgroundTasks.js +154 -0
- package/dist/src/coding/backgroundTasks.js.map +1 -0
- package/dist/src/coding/backgroundTools.d.ts +9 -0
- package/dist/src/coding/backgroundTools.js +63 -0
- package/dist/src/coding/backgroundTools.js.map +1 -0
- package/dist/src/coding/bashTool.d.ts +27 -0
- package/dist/src/coding/bashTool.js +144 -0
- package/dist/src/coding/bashTool.js.map +1 -0
- package/dist/src/coding/dangerousCommands.d.ts +29 -0
- package/dist/src/coding/dangerousCommands.js +156 -0
- package/dist/src/coding/dangerousCommands.js.map +1 -0
- package/dist/src/coding/editDiff.d.ts +45 -0
- package/dist/src/coding/editDiff.js +156 -0
- package/dist/src/coding/editDiff.js.map +1 -0
- package/dist/src/coding/editTool.d.ts +14 -0
- package/dist/src/coding/editTool.js +154 -0
- package/dist/src/coding/editTool.js.map +1 -0
- package/dist/src/coding/index.d.ts +25 -0
- package/dist/src/coding/index.js +30 -0
- package/dist/src/coding/index.js.map +1 -0
- package/dist/src/coding/outputAccumulator.d.ts +34 -0
- package/dist/src/coding/outputAccumulator.js +111 -0
- package/dist/src/coding/outputAccumulator.js.map +1 -0
- package/dist/src/coding/permissionGate.d.ts +65 -0
- package/dist/src/coding/permissionGate.js +138 -0
- package/dist/src/coding/permissionGate.js.map +1 -0
- package/dist/src/coding/permissionStore.d.ts +36 -0
- package/dist/src/coding/permissionStore.js +56 -0
- package/dist/src/coding/permissionStore.js.map +1 -0
- package/dist/src/coding/permissions.d.ts +34 -0
- package/dist/src/coding/permissions.js +18 -0
- package/dist/src/coding/permissions.js.map +1 -0
- package/dist/src/coding/projectContext.d.ts +21 -0
- package/dist/src/coding/projectContext.js +118 -0
- package/dist/src/coding/projectContext.js.map +1 -0
- package/dist/src/coding/readState.d.ts +22 -0
- package/dist/src/coding/readState.js +30 -0
- package/dist/src/coding/readState.js.map +1 -0
- package/dist/src/coding/truncate.d.ts +39 -0
- package/dist/src/coding/truncate.js +83 -0
- package/dist/src/coding/truncate.js.map +1 -0
- package/dist/src/coding/writeTool.d.ts +14 -0
- package/dist/src/coding/writeTool.js +82 -0
- package/dist/src/coding/writeTool.js.map +1 -0
- package/dist/src/commands/execCommand.d.ts +13 -0
- package/dist/src/commands/execCommand.js +73 -6
- package/dist/src/commands/execCommand.js.map +1 -1
- package/dist/src/commands/updateCommand.d.ts +7 -0
- package/dist/src/commands/updateCommand.js +11 -0
- package/dist/src/commands/updateCommand.js.map +1 -0
- package/dist/src/core/catalog.d.ts +5 -0
- package/dist/src/core/catalog.js +31 -1
- package/dist/src/core/catalog.js.map +1 -1
- package/dist/src/core/compaction.d.ts +52 -0
- package/dist/src/core/compaction.js +151 -0
- package/dist/src/core/compaction.js.map +1 -0
- package/dist/src/core/contextPrune.js +8 -1
- package/dist/src/core/contextPrune.js.map +1 -1
- package/dist/src/core/runChat.d.ts +1 -1
- package/dist/src/core/runChat.js +1 -1
- package/dist/src/core/runChat.js.map +1 -1
- package/dist/src/core/session.d.ts +10 -1
- package/dist/src/core/session.js +11 -2
- package/dist/src/core/session.js.map +1 -1
- package/dist/src/core/turnLoop.d.ts +18 -2
- package/dist/src/core/turnLoop.js +79 -12
- package/dist/src/core/turnLoop.js.map +1 -1
- package/dist/src/core/updateCheck.d.ts +35 -0
- package/dist/src/core/updateCheck.js +71 -2
- package/dist/src/core/updateCheck.js.map +1 -1
- package/dist/src/core/updateRunner.d.ts +7 -0
- package/dist/src/core/updateRunner.js +26 -0
- package/dist/src/core/updateRunner.js.map +1 -0
- package/dist/src/exec/output.d.ts +3 -2
- package/dist/src/exec/output.js +17 -4
- package/dist/src/exec/output.js.map +1 -1
- package/dist/src/fs/index.d.ts +4 -1
- package/dist/src/fs/index.js +7 -2
- package/dist/src/fs/index.js.map +1 -1
- package/dist/src/fs/limits.d.ts +1 -1
- package/dist/src/fs/limits.js +3 -1
- package/dist/src/fs/limits.js.map +1 -1
- package/dist/src/fs/readFileTool.d.ts +2 -1
- package/dist/src/fs/readFileTool.js +4 -1
- package/dist/src/fs/readFileTool.js.map +1 -1
- package/dist/src/fs/workspaceGuard.d.ts +8 -0
- package/dist/src/fs/workspaceGuard.js +48 -0
- package/dist/src/fs/workspaceGuard.js.map +1 -1
- package/dist/src/index.js +44 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/server.js +17 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/tui/App.d.ts +10 -1
- package/dist/src/tui/App.js +114 -15
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/UpdatePrompt.d.ts +17 -0
- package/dist/src/tui/UpdatePrompt.js +42 -0
- package/dist/src/tui/UpdatePrompt.js.map +1 -0
- package/dist/src/tui/approvalBridge.d.ts +21 -0
- package/dist/src/tui/approvalBridge.js +45 -0
- package/dist/src/tui/approvalBridge.js.map +1 -0
- package/dist/src/tui/chatController.d.ts +21 -0
- package/dist/src/tui/chatController.js +155 -16
- package/dist/src/tui/chatController.js.map +1 -1
- package/dist/src/tui/commands.js +16 -2
- package/dist/src/tui/commands.js.map +1 -1
- package/dist/src/tui/models.d.ts +4 -0
- package/dist/src/tui/models.js +8 -1
- package/dist/src/tui/models.js.map +1 -1
- package/dist/src/tui/run.d.ts +7 -0
- package/dist/src/tui/run.js +107 -22
- package/dist/src/tui/run.js.map +1 -1
- package/dist/src/web/webFetchTool.js +41 -5
- package/dist/src/web/webFetchTool.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { BUDGET_EXHAUSTED_MESSAGE, MAX_TOOL_CALLS_PER_TURN } from '../fs/limits.js';
|
|
2
2
|
import { track } from '../telemetry/telemetry.js';
|
|
3
3
|
/** Pathological backstop only — the tool budget below governs normal turns. */
|
|
4
|
-
const MAX_ROUNDS =
|
|
4
|
+
const MAX_ROUNDS = 32;
|
|
5
|
+
/**
|
|
6
|
+
* Fed back for every tool call on a message the provider cut off with finish_reason=length:
|
|
7
|
+
* streamed tool-call arguments are accumulated incrementally, so a length-truncated message
|
|
8
|
+
* can yield arguments that parse as valid JSON yet are semantically incomplete. With tools
|
|
9
|
+
* that mutate files or spend credits, executing them would corrupt state — discard them all
|
|
10
|
+
* and let the model re-issue (pi agent-loop behavior, 2026-08-08 调研 A1).
|
|
11
|
+
*/
|
|
12
|
+
const LENGTH_TRUNCATED_TOOLS_MESSAGE = 'Response was truncated by the output limit; this tool call was discarded because its ' +
|
|
13
|
+
'arguments may be incomplete. Re-issue the call (smaller, if possible).';
|
|
5
14
|
/**
|
|
6
15
|
* Drives one user turn to completion, following the OpenAI tool-calling protocol:
|
|
7
16
|
*
|
|
@@ -39,8 +48,9 @@ export class TurnLoop {
|
|
|
39
48
|
for (let round = 0; round < MAX_ROUNDS; round++) {
|
|
40
49
|
let content;
|
|
41
50
|
let toolCalls;
|
|
51
|
+
let finishReason;
|
|
42
52
|
try {
|
|
43
|
-
({ content, toolCalls } = await this.streamOneCall(session, emit, opts, toolCallsUsed >= budget));
|
|
53
|
+
({ content, toolCalls, finishReason } = await this.streamOneCall(session, emit, opts, toolCallsUsed >= budget));
|
|
44
54
|
}
|
|
45
55
|
catch (err) {
|
|
46
56
|
// User interruption (Esc): keep whatever partial text already streamed so the
|
|
@@ -61,7 +71,10 @@ export class TurnLoop {
|
|
|
61
71
|
if (content.length === 0 && toolCalls.length === 0) {
|
|
62
72
|
// The request itself succeeded (no throw) — the model just returned nothing. Keep the
|
|
63
73
|
// user message (not a poison payload) so a retry has context; only add nothing more.
|
|
64
|
-
emit({
|
|
74
|
+
emit({
|
|
75
|
+
type: 'error',
|
|
76
|
+
message: 'The model returned no output. Please try again.',
|
|
77
|
+
});
|
|
65
78
|
return;
|
|
66
79
|
}
|
|
67
80
|
session.addAssistantMessage(content.length > 0 ? content : null, toolCalls);
|
|
@@ -74,6 +87,28 @@ export class TurnLoop {
|
|
|
74
87
|
emit({ type: 'turn_complete' });
|
|
75
88
|
return;
|
|
76
89
|
}
|
|
90
|
+
// Length-truncated message with tool calls: never execute them (arguments may be
|
|
91
|
+
// silently incomplete). Answer every call with an error result and loop so the
|
|
92
|
+
// model re-issues. Consumes no budget — nothing ran.
|
|
93
|
+
if (finishReason === 'length') {
|
|
94
|
+
for (const call of toolCalls) {
|
|
95
|
+
const result = { error: LENGTH_TRUNCATED_TOOLS_MESSAGE };
|
|
96
|
+
emit({
|
|
97
|
+
type: 'tool_call_begin',
|
|
98
|
+
id: call.id,
|
|
99
|
+
name: call.function.name,
|
|
100
|
+
args: safeParseArgs(call.function.arguments),
|
|
101
|
+
});
|
|
102
|
+
emit({
|
|
103
|
+
type: 'tool_call_end',
|
|
104
|
+
id: call.id,
|
|
105
|
+
name: call.function.name,
|
|
106
|
+
result,
|
|
107
|
+
});
|
|
108
|
+
session.addToolMessage(call.id, call.function.name, result);
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
77
112
|
// Execute the requested tools and feed results back into the conversation.
|
|
78
113
|
// Tool execution itself is never aborted mid-flight (a paid submit must not be torn),
|
|
79
114
|
// but an interrupt takes effect before the next model call.
|
|
@@ -116,7 +151,12 @@ export class TurnLoop {
|
|
|
116
151
|
? { error: denied }
|
|
117
152
|
: await this.registry.dispatch(call.function.name, call.function.arguments);
|
|
118
153
|
// Ends may arrive out of completion order; the TUI matches rows by call id.
|
|
119
|
-
emit({
|
|
154
|
+
emit({
|
|
155
|
+
type: 'tool_call_end',
|
|
156
|
+
id: call.id,
|
|
157
|
+
name: call.function.name,
|
|
158
|
+
result,
|
|
159
|
+
});
|
|
120
160
|
return result;
|
|
121
161
|
}));
|
|
122
162
|
// Tool messages must follow the tool_calls order the model emitted.
|
|
@@ -126,14 +166,24 @@ export class TurnLoop {
|
|
|
126
166
|
for (let i = 0; i < toolCalls.length; i++) {
|
|
127
167
|
const call = toolCalls[i];
|
|
128
168
|
const args = safeParseArgs(call.function.arguments);
|
|
129
|
-
emit({
|
|
169
|
+
emit({
|
|
170
|
+
type: 'tool_call_begin',
|
|
171
|
+
id: call.id,
|
|
172
|
+
name: call.function.name,
|
|
173
|
+
args,
|
|
174
|
+
});
|
|
130
175
|
// Past a budget/cap, don't dispatch: feed the model an error instead, so it
|
|
131
176
|
// wraps up with what it has (a normal answer, not a hard stop).
|
|
132
177
|
const denied = denial[i];
|
|
133
178
|
const result = denied
|
|
134
179
|
? { error: denied }
|
|
135
180
|
: await this.registry.dispatch(call.function.name, call.function.arguments);
|
|
136
|
-
emit({
|
|
181
|
+
emit({
|
|
182
|
+
type: 'tool_call_end',
|
|
183
|
+
id: call.id,
|
|
184
|
+
name: call.function.name,
|
|
185
|
+
result,
|
|
186
|
+
});
|
|
137
187
|
session.addToolMessage(call.id, call.function.name, result);
|
|
138
188
|
}
|
|
139
189
|
}
|
|
@@ -141,10 +191,17 @@ export class TurnLoop {
|
|
|
141
191
|
emit({ type: 'turn_interrupted' });
|
|
142
192
|
return;
|
|
143
193
|
}
|
|
144
|
-
//
|
|
194
|
+
// Steering: text typed mid-turn joins the conversation before the next model call.
|
|
195
|
+
for (const content of opts.takeSteering?.() ?? []) {
|
|
196
|
+
session.addUserMessage(content);
|
|
197
|
+
}
|
|
198
|
+
// Loop: stream again now that tool results (and any steering) are in the messages.
|
|
145
199
|
}
|
|
146
200
|
session.rollbackTo(checkpoint);
|
|
147
|
-
emit({
|
|
201
|
+
emit({
|
|
202
|
+
type: 'error',
|
|
203
|
+
message: `Turn exceeded ${MAX_ROUNDS} tool-calling rounds`,
|
|
204
|
+
});
|
|
148
205
|
}
|
|
149
206
|
/** Stream a single model call, emitting text deltas and accumulating tool_calls. */
|
|
150
207
|
async streamOneCall(session, emit, opts, forceNoTools) {
|
|
@@ -159,8 +216,9 @@ export class TurnLoop {
|
|
|
159
216
|
};
|
|
160
217
|
let content = '';
|
|
161
218
|
const toolAcc = new Map();
|
|
219
|
+
let finishReason = null;
|
|
162
220
|
try {
|
|
163
|
-
await this.consumeStream(req, opts, emit, (text) => (content += text), toolAcc);
|
|
221
|
+
finishReason = await this.consumeStream(req, opts, emit, (text) => (content += text), toolAcc);
|
|
164
222
|
}
|
|
165
223
|
catch (err) {
|
|
166
224
|
// Attach the partial text so an interrupt can preserve what already streamed.
|
|
@@ -178,10 +236,14 @@ export class TurnLoop {
|
|
|
178
236
|
...(e.extraContent !== undefined ? { extra_content: e.extraContent } : {}),
|
|
179
237
|
}))
|
|
180
238
|
.filter((c) => c.function.name.length > 0);
|
|
181
|
-
return { content, toolCalls };
|
|
239
|
+
return { content, toolCalls, finishReason };
|
|
182
240
|
}
|
|
183
|
-
/**
|
|
241
|
+
/**
|
|
242
|
+
* Iterate the backend stream, forwarding deltas/usage and accumulating tool-call pieces.
|
|
243
|
+
* Returns the last non-null finish_reason seen (providers send it on the closing chunk).
|
|
244
|
+
*/
|
|
184
245
|
async consumeStream(req, opts, emit, onText, toolAcc) {
|
|
246
|
+
let finishReason = null;
|
|
185
247
|
for await (const chunk of this.backend.stream(req, opts.signal)) {
|
|
186
248
|
// The final chunk (include_usage) carries token counts with empty/no choices; surface
|
|
187
249
|
// them before the delta guard below skips it.
|
|
@@ -193,12 +255,16 @@ export class TurnLoop {
|
|
|
193
255
|
});
|
|
194
256
|
}
|
|
195
257
|
const choice = chunk.choices?.[0];
|
|
258
|
+
if (typeof choice?.finish_reason === 'string')
|
|
259
|
+
finishReason = choice.finish_reason;
|
|
196
260
|
const delta = choice?.delta;
|
|
197
261
|
if (!delta)
|
|
198
262
|
continue;
|
|
199
263
|
if (typeof delta.content === 'string' && delta.content.length > 0) {
|
|
200
264
|
onText(delta.content);
|
|
201
|
-
emit({ type: 'assistant_delta', text: delta.content });
|
|
265
|
+
const r = emit({ type: 'assistant_delta', text: delta.content });
|
|
266
|
+
if (r)
|
|
267
|
+
await r; // backpressure: wait for the consumer to drain
|
|
202
268
|
}
|
|
203
269
|
if (delta.tool_calls) {
|
|
204
270
|
for (const tc of delta.tool_calls) {
|
|
@@ -215,6 +281,7 @@ export class TurnLoop {
|
|
|
215
281
|
}
|
|
216
282
|
}
|
|
217
283
|
}
|
|
284
|
+
return finishReason;
|
|
218
285
|
}
|
|
219
286
|
}
|
|
220
287
|
/** Thrown when the user aborts mid-stream; carries the text streamed so far. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnLoop.js","sourceRoot":"","sources":["../../../src/core/turnLoop.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD,+EAA+E;AAC/E,MAAM,UAAU,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"turnLoop.js","sourceRoot":"","sources":["../../../src/core/turnLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,10 +14,18 @@ export interface UpdateCache {
|
|
|
14
14
|
latestVersion: string;
|
|
15
15
|
channel: string;
|
|
16
16
|
lastCheckedAt: number;
|
|
17
|
+
/** Version the user chose "Skip until next version" for (mutes the startup prompt only). */
|
|
18
|
+
dismissedVersion?: string;
|
|
17
19
|
}
|
|
18
20
|
export interface UpdateNotice {
|
|
19
21
|
latest: string;
|
|
20
22
|
command: string;
|
|
23
|
+
/**
|
|
24
|
+
* True when the user dismissed exactly this version ("Skip until next version").
|
|
25
|
+
* Mutes the interactive startup prompt; advisory lines (scrollback note, /status,
|
|
26
|
+
* exec stderr) deliberately ignore it — Codex behaves the same way.
|
|
27
|
+
*/
|
|
28
|
+
dismissed: boolean;
|
|
21
29
|
}
|
|
22
30
|
/** Injectable deps so tests never touch the network, the real cache, or the clock. */
|
|
23
31
|
export interface UpdateCheckDeps {
|
|
@@ -28,6 +36,8 @@ export interface UpdateCheckDeps {
|
|
|
28
36
|
/** Resolved from env/config when omitted. */
|
|
29
37
|
enabled?: boolean;
|
|
30
38
|
}
|
|
39
|
+
/** Strict semver check (same charset-constrained grammar as compareVersions). */
|
|
40
|
+
export declare function isValidVersion(version: string): boolean;
|
|
31
41
|
/** The npm dist-tag this build tracks: prerelease test builds follow `test`. */
|
|
32
42
|
export declare function channelForVersion(version: string): 'test' | 'latest';
|
|
33
43
|
export declare function upgradeCommand(channel: string): string;
|
|
@@ -38,9 +48,34 @@ export declare function upgradeCommand(channel: string): string;
|
|
|
38
48
|
* (test.10 > test.9); a release outranks its own prereleases.
|
|
39
49
|
*/
|
|
40
50
|
export declare function compareVersions(a: string, b: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Persist "Skip until next version": mute the startup prompt for exactly `version`.
|
|
53
|
+
* With no cache yet (catalog-sourced notice before the first registry fetch), a minimal
|
|
54
|
+
* stale-marked cache is written so the dismissal still sticks — lastCheckedAt 0 keeps the
|
|
55
|
+
* background refresh firing next start, and refresh() preserves the dismissal. Failures
|
|
56
|
+
* are silent — worst case the user is prompted again next start.
|
|
57
|
+
*/
|
|
58
|
+
export declare function dismissUpdateVersion(version: string, cacheFile?: string): Promise<void>;
|
|
41
59
|
/**
|
|
42
60
|
* Cache-only answer for THIS start; spawns the background refresh when the cache
|
|
43
61
|
* is stale, missing, or from another channel. Returns a notice only when the
|
|
44
62
|
* cached latest genuinely outranks the running version.
|
|
45
63
|
*/
|
|
46
64
|
export declare function maybeCheckForUpdate(deps?: UpdateCheckDeps): Promise<UpdateNotice | null>;
|
|
65
|
+
/** Server-driven version steering, published through the model-catalog endpoint. */
|
|
66
|
+
export interface CatalogCliVersions {
|
|
67
|
+
latestVersion?: string;
|
|
68
|
+
minVersion?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Merge the two notice sources: the npm-registry cache (20h TTL) and the catalog's
|
|
72
|
+
* server-driven `cli.latest_version` (fresh every start — the catalog is fetched each
|
|
73
|
+
* run, so a release notice no longer waits out the registry cache). The newer latest
|
|
74
|
+
* wins. `belowMinimum` is set when the running version is under the catalog's
|
|
75
|
+
* `cli.min_version` — computed even when the user disabled update checks, because it
|
|
76
|
+
* is a support boundary, not advertising.
|
|
77
|
+
*/
|
|
78
|
+
export declare function effectiveUpdateNotice(catalog?: CatalogCliVersions, deps?: UpdateCheckDeps): Promise<{
|
|
79
|
+
notice: UpdateNotice | null;
|
|
80
|
+
belowMinimum: string | null;
|
|
81
|
+
}>;
|
|
@@ -17,6 +17,10 @@ import { VERSION } from '../version.js';
|
|
|
17
17
|
export const UPDATE_CHECK_TTL_MS = 20 * 60 * 60 * 1000;
|
|
18
18
|
const REGISTRY_URL = 'https://registry.npmjs.org/@glbgpt%2fcli';
|
|
19
19
|
const FETCH_TIMEOUT_MS = 5000;
|
|
20
|
+
/** Strict semver check (same charset-constrained grammar as compareVersions). */
|
|
21
|
+
export function isValidVersion(version) {
|
|
22
|
+
return parse(version) !== null;
|
|
23
|
+
}
|
|
20
24
|
/** The npm dist-tag this build tracks: prerelease test builds follow `test`. */
|
|
21
25
|
export function channelForVersion(version) {
|
|
22
26
|
return version.includes('-test.') ? 'test' : 'latest';
|
|
@@ -92,6 +96,8 @@ async function readCache(file) {
|
|
|
92
96
|
if (typeof parsed.latestVersion === 'string' &&
|
|
93
97
|
typeof parsed.channel === 'string' &&
|
|
94
98
|
typeof parsed.lastCheckedAt === 'number') {
|
|
99
|
+
if (typeof parsed.dismissedVersion !== 'string')
|
|
100
|
+
delete parsed.dismissedVersion;
|
|
95
101
|
return parsed;
|
|
96
102
|
}
|
|
97
103
|
}
|
|
@@ -108,10 +114,41 @@ async function refresh(cacheFile, channel, fetchImpl, now) {
|
|
|
108
114
|
const latest = json['dist-tags']?.[channel];
|
|
109
115
|
if (typeof latest !== 'string' || !latest)
|
|
110
116
|
return;
|
|
111
|
-
|
|
117
|
+
// Preserve the dismissal across refreshes — it is keyed to an exact version, so a
|
|
118
|
+
// genuinely newer release naturally un-mutes the prompt without any extra logic.
|
|
119
|
+
const prior = await readCache(cacheFile);
|
|
120
|
+
const cache = {
|
|
121
|
+
latestVersion: latest,
|
|
122
|
+
channel,
|
|
123
|
+
lastCheckedAt: now(),
|
|
124
|
+
...(prior?.dismissedVersion ? { dismissedVersion: prior.dismissedVersion } : {}),
|
|
125
|
+
};
|
|
112
126
|
await fs.mkdir(path.dirname(cacheFile), { recursive: true });
|
|
113
127
|
await fs.writeFile(cacheFile, JSON.stringify(cache) + '\n', 'utf8');
|
|
114
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Persist "Skip until next version": mute the startup prompt for exactly `version`.
|
|
131
|
+
* With no cache yet (catalog-sourced notice before the first registry fetch), a minimal
|
|
132
|
+
* stale-marked cache is written so the dismissal still sticks — lastCheckedAt 0 keeps the
|
|
133
|
+
* background refresh firing next start, and refresh() preserves the dismissal. Failures
|
|
134
|
+
* are silent — worst case the user is prompted again next start.
|
|
135
|
+
*/
|
|
136
|
+
export async function dismissUpdateVersion(version, cacheFile) {
|
|
137
|
+
const file = cacheFile ?? path.join(configDir(), 'version-check.json');
|
|
138
|
+
try {
|
|
139
|
+
const cache = (await readCache(file)) ?? {
|
|
140
|
+
latestVersion: version,
|
|
141
|
+
channel: channelForVersion(VERSION),
|
|
142
|
+
lastCheckedAt: 0,
|
|
143
|
+
};
|
|
144
|
+
cache.dismissedVersion = version;
|
|
145
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
146
|
+
await fs.writeFile(file, JSON.stringify(cache) + '\n', 'utf8');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// Silent by contract.
|
|
150
|
+
}
|
|
151
|
+
}
|
|
115
152
|
/**
|
|
116
153
|
* Cache-only answer for THIS start; spawns the background refresh when the cache
|
|
117
154
|
* is stale, missing, or from another channel. Returns a notice only when the
|
|
@@ -132,8 +169,40 @@ export async function maybeCheckForUpdate(deps = {}) {
|
|
|
132
169
|
});
|
|
133
170
|
}
|
|
134
171
|
if (cache !== null && cache.channel === channel && compareVersions(cache.latestVersion, current) > 0) {
|
|
135
|
-
return {
|
|
172
|
+
return {
|
|
173
|
+
latest: cache.latestVersion,
|
|
174
|
+
command: upgradeCommand(channel),
|
|
175
|
+
dismissed: cache.dismissedVersion === cache.latestVersion,
|
|
176
|
+
};
|
|
136
177
|
}
|
|
137
178
|
return null;
|
|
138
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Merge the two notice sources: the npm-registry cache (20h TTL) and the catalog's
|
|
182
|
+
* server-driven `cli.latest_version` (fresh every start — the catalog is fetched each
|
|
183
|
+
* run, so a release notice no longer waits out the registry cache). The newer latest
|
|
184
|
+
* wins. `belowMinimum` is set when the running version is under the catalog's
|
|
185
|
+
* `cli.min_version` — computed even when the user disabled update checks, because it
|
|
186
|
+
* is a support boundary, not advertising.
|
|
187
|
+
*/
|
|
188
|
+
export async function effectiveUpdateNotice(catalog = {}, deps = {}) {
|
|
189
|
+
const current = deps.currentVersion ?? VERSION;
|
|
190
|
+
const belowMinimum = catalog.minVersion && compareVersions(catalog.minVersion, current) > 0 ? catalog.minVersion : null;
|
|
191
|
+
let notice = await maybeCheckForUpdate(deps);
|
|
192
|
+
const fromCatalog = catalog.latestVersion;
|
|
193
|
+
if ((deps.enabled ?? isEnabled()) &&
|
|
194
|
+
current !== '0.0.0' &&
|
|
195
|
+
fromCatalog &&
|
|
196
|
+
compareVersions(fromCatalog, current) > 0 &&
|
|
197
|
+
(!notice || compareVersions(fromCatalog, notice.latest) > 0)) {
|
|
198
|
+
const cacheFile = deps.cacheFile ?? path.join(configDir(), 'version-check.json');
|
|
199
|
+
const cache = await readCache(cacheFile);
|
|
200
|
+
notice = {
|
|
201
|
+
latest: fromCatalog,
|
|
202
|
+
command: upgradeCommand(channelForVersion(current)),
|
|
203
|
+
dismissed: cache?.dismissedVersion === fromCatalog,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return { notice, belowMinimum };
|
|
207
|
+
}
|
|
139
208
|
//# sourceMappingURL=updateCheck.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../../src/core/updateCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../../src/core/updateCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run the npm upgrade command on the user's behalf (Codex model: the TUI exits first,
|
|
3
|
+
* then the plain CLI process runs this — never replace a running install from inside
|
|
4
|
+
* the TUI). Output streams straight to the terminal so npm's own errors (EACCES on a
|
|
5
|
+
* sudo-owned prefix, network failures) stay visible and actionable.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runUpgrade(command?: string): Promise<boolean>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { VERSION } from '../version.js';
|
|
3
|
+
import { channelForVersion, upgradeCommand } from './updateCheck.js';
|
|
4
|
+
/**
|
|
5
|
+
* Run the npm upgrade command on the user's behalf (Codex model: the TUI exits first,
|
|
6
|
+
* then the plain CLI process runs this — never replace a running install from inside
|
|
7
|
+
* the TUI). Output streams straight to the terminal so npm's own errors (EACCES on a
|
|
8
|
+
* sudo-owned prefix, network failures) stay visible and actionable.
|
|
9
|
+
*/
|
|
10
|
+
export async function runUpgrade(command) {
|
|
11
|
+
const cmd = command ?? upgradeCommand(channelForVersion(VERSION));
|
|
12
|
+
process.stderr.write(`Updating glbgpt via \`${cmd}\`...\n\n`);
|
|
13
|
+
const code = await new Promise((resolve) => {
|
|
14
|
+
const child = spawn(cmd, { shell: true, stdio: 'inherit' });
|
|
15
|
+
child.on('error', () => resolve(1));
|
|
16
|
+
child.on('exit', (c) => resolve(c ?? 1));
|
|
17
|
+
});
|
|
18
|
+
if (code === 0) {
|
|
19
|
+
process.stderr.write('\nUpdate installed. Restart glbgpt to use the new version.\n');
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
process.stderr.write(`\nUpdate failed (exit ${code}). Try running it yourself: ${cmd}\n` +
|
|
23
|
+
'(If npm reports a permission error, your global prefix may need sudo — consider a user-writable prefix.)\n');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=updateRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateRunner.js","sourceRoot":"","sources":["../../../src/core/updateRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAErE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,MAAM,GAAG,GAAG,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,WAAW,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,IAAI,+BAA+B,GAAG,IAAI;QACjE,4GAA4G,CAC/G,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export type OutputMode = 'text' | 'json' | 'jsonl';
|
|
11
11
|
export interface OutputSinks {
|
|
12
|
-
|
|
12
|
+
/** May return a promise to backpressure the model stream (stdout drain). */
|
|
13
|
+
out: (s: string) => void | Promise<void>;
|
|
13
14
|
err: (s: string) => void;
|
|
14
15
|
}
|
|
15
16
|
export interface ExecUsage {
|
|
@@ -26,7 +27,7 @@ export declare class ExecOutput {
|
|
|
26
27
|
/** Emitted once before streaming (jsonl only). */
|
|
27
28
|
start(): void;
|
|
28
29
|
/** An assistant text delta. */
|
|
29
|
-
delta(text: string): void
|
|
30
|
+
delta(text: string): void | Promise<void>;
|
|
30
31
|
/** Token usage from the final stream chunk. */
|
|
31
32
|
usageEvent(promptTokens: number, completionTokens: number): void;
|
|
32
33
|
/** Successful completion. `structured` is the parsed object when --output-schema was used. */
|
package/dist/src/exec/output.js
CHANGED
|
@@ -20,8 +20,10 @@ export class ExecOutput {
|
|
|
20
20
|
}
|
|
21
21
|
/** Emitted once before streaming (jsonl only). */
|
|
22
22
|
start() {
|
|
23
|
+
// `protocol` versions the jsonl event stream for machine consumers (pi A2):
|
|
24
|
+
// bump it on any breaking change to event names or shapes.
|
|
23
25
|
if (this.mode === 'jsonl')
|
|
24
|
-
this.line({ type: 'turn_started', model: this.model });
|
|
26
|
+
this.line({ type: 'turn_started', protocol: 1, model: this.model });
|
|
25
27
|
}
|
|
26
28
|
/** An assistant text delta. */
|
|
27
29
|
delta(text) {
|
|
@@ -29,7 +31,7 @@ export class ExecOutput {
|
|
|
29
31
|
return;
|
|
30
32
|
this.content += text;
|
|
31
33
|
if (this.mode === 'jsonl')
|
|
32
|
-
this.line({ type: 'delta', text });
|
|
34
|
+
return this.line({ type: 'delta', text });
|
|
33
35
|
}
|
|
34
36
|
/** Token usage from the final stream chunk. */
|
|
35
37
|
usageEvent(promptTokens, completionTokens) {
|
|
@@ -79,7 +81,13 @@ export class ExecOutput {
|
|
|
79
81
|
this.line({ type: 'tool_call', name, args });
|
|
80
82
|
}
|
|
81
83
|
else {
|
|
82
|
-
const arg = typeof args.
|
|
84
|
+
const arg = typeof args.command === 'string'
|
|
85
|
+
? truncateArg(args.command)
|
|
86
|
+
: typeof args.path === 'string'
|
|
87
|
+
? args.path
|
|
88
|
+
: typeof args.pattern === 'string'
|
|
89
|
+
? args.pattern
|
|
90
|
+
: '';
|
|
83
91
|
this.sinks.err(`⚒ ${name}${arg ? `(${arg})` : ''}\n`);
|
|
84
92
|
}
|
|
85
93
|
}
|
|
@@ -119,7 +127,12 @@ export class ExecOutput {
|
|
|
119
127
|
return this.content;
|
|
120
128
|
}
|
|
121
129
|
line(obj) {
|
|
122
|
-
this.sinks.out(`${JSON.stringify(obj)}\n`);
|
|
130
|
+
return this.sinks.out(`${JSON.stringify(obj)}\n`);
|
|
123
131
|
}
|
|
124
132
|
}
|
|
133
|
+
/** Single-line, bounded command preview for the activity row. */
|
|
134
|
+
function truncateArg(s, max = 80) {
|
|
135
|
+
const one = s.replace(/\s+/g, ' ').trim();
|
|
136
|
+
return one.length > max ? one.slice(0, max - 1) + '…' : one;
|
|
137
|
+
}
|
|
125
138
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/exec/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/exec/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,OAAO,UAAU;IAKF;IACA;IACA;IANX,OAAO,GAAG,EAAE,CAAC;IACb,KAAK,GAAc,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAEtE,YACmB,IAAgB,EAChB,KAAa,EACb,KAAkB;QAFlB,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAa;IAClC,CAAC;IAEJ,kDAAkD;IAClD,KAAK;QACH,4EAA4E;QAC5E,2DAA2D;QAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,+CAA+C;IAC/C,UAAU,CAAC,YAAoB,EAAE,gBAAwB;QACvD,IAAI,CAAC,KAAK,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;QAClF,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,8FAA8F;IAC9F,YAAY,CAAC,UAA0B;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU;YACV,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,+FAA+F;IAC/F,WAAW,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,EAAE,OAAO,EAAE;aACnB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,SAAS,CAAC,IAAY,EAAE,IAA6B;QACnD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GACP,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;gBAC9B,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC3B,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAC7B,CAAC,CAAC,IAAI,CAAC,IAAI;oBACX,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;wBAChC,CAAC,CAAC,IAAI,CAAC,OAAO;wBACd,CAAC,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAY,EAAE,MAA+B;QACnD,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,OAAO,IAAI,MAAM,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,qGAAqG;IACrG,WAAW,CAAC,CAOX;QACC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,CAAC,CAAC,MAAM;gBACjB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,IAAI,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,IAAI,CAAC,GAAY;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AAED,iEAAiE;AACjE,SAAS,WAAW,CAAC,CAAS,EAAE,GAAG,GAAG,EAAE;IACtC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC"}
|
package/dist/src/fs/index.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/** Public surface of the fs read tools (phase A). */
|
|
2
2
|
import type { ClientTool } from '../core/types.js';
|
|
3
|
+
import type { ReadFileState } from '../coding/readState.js';
|
|
3
4
|
export { workspaceRoot } from './workspaceGuard.js';
|
|
4
5
|
export { MAX_TOOL_CALLS_PER_TURN } from './limits.js';
|
|
5
6
|
/** The four read-only tools, jailed to `root`. Registration order = model-visible order. */
|
|
6
7
|
/** The fs tool names — source of truth for context pruning's "prunable" check. */
|
|
7
8
|
export declare const FS_TOOL_NAMES: ReadonlySet<string>;
|
|
8
|
-
export declare function createFsTools(root: string
|
|
9
|
+
export declare function createFsTools(root: string, opts?: {
|
|
10
|
+
readState?: ReadFileState;
|
|
11
|
+
}): ClientTool[];
|
package/dist/src/fs/index.js
CHANGED
|
@@ -7,7 +7,12 @@ export { MAX_TOOL_CALLS_PER_TURN } from './limits.js';
|
|
|
7
7
|
/** The four read-only tools, jailed to `root`. Registration order = model-visible order. */
|
|
8
8
|
/** The fs tool names — source of truth for context pruning's "prunable" check. */
|
|
9
9
|
export const FS_TOOL_NAMES = new Set(['read_file', 'list_dir', 'glob', 'grep']);
|
|
10
|
-
export function createFsTools(root) {
|
|
11
|
-
return [
|
|
10
|
+
export function createFsTools(root, opts = {}) {
|
|
11
|
+
return [
|
|
12
|
+
createReadFileTool(root, opts.readState),
|
|
13
|
+
createListDirTool(root),
|
|
14
|
+
createGlobTool(root),
|
|
15
|
+
createGrepTool(root),
|
|
16
|
+
];
|
|
12
17
|
}
|
|
13
18
|
//# sourceMappingURL=index.js.map
|
package/dist/src/fs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,4FAA4F;AAC5F,kFAAkF;AAClF,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErG,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAsC,EAAE;IAClF,OAAO;QACL,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QACxC,iBAAiB,CAAC,IAAI,CAAC;QACvB,cAAc,CAAC,IAAI,CAAC;QACpB,cAAc,CAAC,IAAI,CAAC;KACrB,CAAC;AACJ,CAAC"}
|
package/dist/src/fs/limits.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export declare const MAX_GLOB_SCAN = 2000;
|
|
|
19
19
|
export declare const MAX_GREP_MATCHES = 100;
|
|
20
20
|
export declare const MAX_GREP_LINE_CHARS = 200;
|
|
21
21
|
export declare const GREP_TIMEOUT_MS = 5000;
|
|
22
|
-
export declare const MAX_TOOL_CALLS_PER_TURN =
|
|
22
|
+
export declare const MAX_TOOL_CALLS_PER_TURN = 40;
|
|
23
23
|
/** Directory names never listed, walked, or matched (noise + huge). */
|
|
24
24
|
export declare const IGNORED_DIRS: Set<string>;
|
|
25
25
|
/** File names never listed or matched. */
|
package/dist/src/fs/limits.js
CHANGED
|
@@ -34,7 +34,9 @@ export const MAX_GREP_LINE_CHARS = 200; // grep match line preview cap
|
|
|
34
34
|
// also bounds the worst-case main-thread stall: Claude Code allows 20s but its
|
|
35
35
|
// ripgrep runs out-of-process; in-process, 5s keeps a frozen TUI recoverable.
|
|
36
36
|
export const GREP_TIMEOUT_MS = 5_000;
|
|
37
|
-
|
|
37
|
+
// 15 -> 40 (2026-08-21): coding turns (bash/edit/write) legitimately run much deeper than
|
|
38
|
+
// fs-read turns; the cap stays a runaway backstop, and billing is still bounded per round.
|
|
39
|
+
export const MAX_TOOL_CALLS_PER_TURN = 40; // TurnLoop budget (counts ALL tools)
|
|
38
40
|
/** Directory names never listed, walked, or matched (noise + huge). */
|
|
39
41
|
export const IGNORED_DIRS = new Set([
|
|
40
42
|
'node_modules',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/fs/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,wDAAwD;AACnH,0FAA0F;AAC1F,wFAAwF;AACxF,4FAA4F;AAC5F,kFAAkF;AAClF,wFAAwF;AACxF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,mCAAmC;AACvE,mFAAmF;AACnF,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,6CAA6C;AAC9F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,0CAA0C;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,WAAW;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,uDAAuD;AAC5F,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,uDAAuD;AAC1F,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC,CAAC,8BAA8B;AACtE,+EAA+E;AAC/E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC,CAAC,qCAAqC;AAEhF,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,aAAa;IACb,OAAO;CACR,CAAC,CAAC;AACH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,wBAAwB,GACnC,uEAAuE,CAAC;AAE1E,oFAAoF;AACpF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,8CAA8C;AAC1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,qCAAqC;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC,CAAC,gDAAgD;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAC5B,wEAAwE,CAAC;AAE3E,8EAA8E;AAC9E,kFAAkF;AAClF,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAChD,uFAAuF;AACvF,yFAAyF;AACzF,oFAAoF;AACpF,mFAAmF;AACnF,wFAAwF;AACxF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,oDAAoD"}
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/fs/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,wDAAwD;AACnH,0FAA0F;AAC1F,wFAAwF;AACxF,4FAA4F;AAC5F,kFAAkF;AAClF,wFAAwF;AACxF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,mCAAmC;AACvE,mFAAmF;AACnF,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,6CAA6C;AAC9F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,0CAA0C;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,WAAW;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,uDAAuD;AAC5F,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,uDAAuD;AAC1F,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC,CAAC,8BAA8B;AACtE,+EAA+E;AAC/E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,0FAA0F;AAC1F,2FAA2F;AAC3F,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC,CAAC,qCAAqC;AAEhF,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,aAAa;IACb,OAAO;CACR,CAAC,CAAC;AACH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,wBAAwB,GACnC,uEAAuE,CAAC;AAE1E,oFAAoF;AACpF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,8CAA8C;AAC1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,qCAAqC;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC,CAAC,gDAAgD;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAC5B,wEAAwE,CAAC;AAE3E,8EAA8E;AAC9E,kFAAkF;AAClF,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAChD,uFAAuF;AACvF,yFAAyF;AACzF,oFAAoF;AACpF,mFAAmF;AACnF,wFAAwF;AACxF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,oDAAoD"}
|