@lucascouts/claude-agent-acp-plus 0.25.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -4
- package/dist/acp-agent.d.ts +33 -4
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +139 -7
- package/dist/classifier-escalation.d.ts.map +1 -1
- package/dist/classifier-escalation.js +13 -9
- package/dist/task-feed.d.ts +91 -0
- package/dist/task-feed.d.ts.map +1 -1
- package/dist/task-feed.js +260 -2
- package/dist/task-output.d.ts +32 -0
- package/dist/task-output.d.ts.map +1 -0
- package/dist/task-output.js +135 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -76,24 +76,37 @@ back in `auto`. A deny rule always wins over a grant.
|
|
|
76
76
|
|
|
77
77
|
The agent's background shells, subagents, monitors and workflows are published as one table per
|
|
78
78
|
session, under `session_info_update._meta["_claude/tasks"]`. The `initialize` response advertises
|
|
79
|
-
it as `agentCapabilities._meta["_claude/tasks"] = { "version":
|
|
80
|
-
capability, never on the agent's name.
|
|
79
|
+
it as `agentCapabilities._meta["_claude/tasks"] = { "version": 2 }`; clients should gate on that
|
|
80
|
+
capability, never on the agent's name. Version 2 added `hasOutput`, `tail` and
|
|
81
|
+
`_claude/tasks/output`; a client that reads only version 1 fields keeps working.
|
|
81
82
|
|
|
82
83
|
Each update is a **snapshot, not a delta**: `{ "tasks": [...] }` carries every live task, so a
|
|
83
84
|
client replaces its list instead of merging. Each entry has `id`, `toolCallId`, `type`
|
|
84
85
|
(`shell` · `subagent` · …), `description`, `background`, `depth`, `status`
|
|
85
86
|
(`running` · `completed` · `failed` · `stopped` · `interrupted`), `startedAt` and `endedAt`
|
|
86
87
|
(epoch milliseconds, `endedAt` null while running), `usage` (`{ tokens, toolUses, durationMs }`
|
|
87
|
-
or null), `lastTool` and `
|
|
88
|
+
or null), `lastTool`, `summary`, `hasOutput` and `tail`. An ended task appears in exactly one snapshot with its final
|
|
88
89
|
status, then drops out. Progress is published at most once per second; an ending is published at
|
|
89
90
|
once. When the agent's stream ends, running tasks are published once as `interrupted`.
|
|
90
91
|
Command lines are never copied into an entry.
|
|
91
92
|
|
|
92
|
-
|
|
93
|
+
`hasOutput` is true when the task's output file can be read through `_claude/tasks/output`
|
|
94
|
+
(shell tasks only). `tail` holds the last 10 lines of a **running** shell's output, refreshed about
|
|
95
|
+
once a second, each line stripped of terminal escapes and control characters and cut to 240
|
|
96
|
+
characters (a cut line ends in `…`); it is null for every other task and once the task ends.
|
|
97
|
+
|
|
98
|
+
Three JSON-RPC methods act on a task:
|
|
93
99
|
|
|
94
100
|
- `_claude/tasks/stop` — params `{ sessionId, taskId }`, result `{}`
|
|
95
101
|
- `_claude/tasks/background` — params `{ sessionId, toolCallId }`, result `{ backgrounded }`;
|
|
96
102
|
moves a foreground tool call's task to the background
|
|
103
|
+
- `_claude/tasks/output` — params `{ sessionId, taskId, maxBytes }`, result
|
|
104
|
+
`{ content, totalBytes, truncated }`; the last `min(maxBytes, 1 MiB)` bytes of a shell task's
|
|
105
|
+
output, starting at a line boundary when truncated. It serves only the file the feed recorded
|
|
106
|
+
for that task, also after the task ended (the last 256 ended outputs per session are kept) and
|
|
107
|
+
after the session's stream ended. A task with no recorded output is invalid-params (`-32602`);
|
|
108
|
+
a file that is gone or no longer a regular file is an internal error (`-32603`). Its log line
|
|
109
|
+
names the session, task and byte count, never the content.
|
|
97
110
|
|
|
98
111
|
An unknown session or a task that is not running is an invalid-params error (`-32602`); a session
|
|
99
112
|
whose stream already ended is an internal error (`-32603`).
|
package/dist/acp-agent.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { AccountUsageTracker } from "./account-usage.js";
|
|
|
15
15
|
import { type AccountOptionState, type DeclaredAccount } from "./accounts.js";
|
|
16
16
|
export { DEFAULT_AGENT_ID, EFFORT_CONFIG_ID } from "./session-config-ids.js";
|
|
17
17
|
import { MODE_CONFIG_ID } from "./session-mode.js";
|
|
18
|
-
import { TASKS_META_KEY, TaskFeed, TaskFeedPublisher } from "./task-feed.js";
|
|
18
|
+
import { TASKS_META_KEY, TailPoller, TaskFeed, TaskFeedPublisher } from "./task-feed.js";
|
|
19
19
|
import { EscalationRegistry, GrantStore } from "./classifier-escalation.js";
|
|
20
20
|
export declare const CLAUDE_CONFIG_DIR: string;
|
|
21
21
|
/**
|
|
@@ -74,15 +74,29 @@ export declare const TASKS_STOP_METHOD = "_claude/tasks/stop";
|
|
|
74
74
|
/** Move a foreground tool call's task to the background (story 012, R2.3).
|
|
75
75
|
* Params {@link TasksBackgroundRequest}, result {@link TasksBackgroundResponse}. */
|
|
76
76
|
export declare const TASKS_BACKGROUND_METHOD = "_claude/tasks/background";
|
|
77
|
-
/**
|
|
78
|
-
*
|
|
77
|
+
/** Read the end of a task's output file (story 041, R2.1). Params
|
|
78
|
+
* {@link TasksOutputRequest}, result {@link TasksOutputResponse}. Version 2. */
|
|
79
|
+
export declare const TASKS_OUTPUT_METHOD = "_claude/tasks/output";
|
|
80
|
+
/** `agentCapabilities._meta` key advertising the task feed and its methods
|
|
81
|
+
* (R2.7). Zeo gates on this, never on the agent's name — the name is
|
|
79
82
|
* `package.json`'s, and differs between this fork and the published mirror. */
|
|
80
83
|
export declare const TASKS_CAPABILITY_KEY = "_claude/tasks";
|
|
81
|
-
|
|
84
|
+
/** Version 2 (story 041) adds `hasOutput`, `tail` and `_claude/tasks/output`. */
|
|
85
|
+
export declare const TASKS_CAPABILITY_VERSION = 2;
|
|
82
86
|
export type TasksStopRequest = {
|
|
83
87
|
sessionId: string;
|
|
84
88
|
taskId: string;
|
|
85
89
|
};
|
|
90
|
+
export type TasksOutputRequest = {
|
|
91
|
+
sessionId: string;
|
|
92
|
+
taskId: string;
|
|
93
|
+
maxBytes: number;
|
|
94
|
+
};
|
|
95
|
+
export type TasksOutputResponse = {
|
|
96
|
+
content: string;
|
|
97
|
+
totalBytes: number;
|
|
98
|
+
truncated: boolean;
|
|
99
|
+
};
|
|
86
100
|
export type TasksBackgroundRequest = {
|
|
87
101
|
sessionId: string;
|
|
88
102
|
toolCallId: string;
|
|
@@ -92,6 +106,10 @@ export type TasksBackgroundResponse = {
|
|
|
92
106
|
};
|
|
93
107
|
/** Validate raw JSON-RPC params into a {@link TasksStopRequest}. */
|
|
94
108
|
export declare function parseTasksStopRequest(params: unknown): TasksStopRequest;
|
|
109
|
+
/** Validate raw JSON-RPC params into a {@link TasksOutputRequest}. Extra keys —
|
|
110
|
+
* a `path` included — are ignored: only a file the adapter recorded is read
|
|
111
|
+
* (R2.5). */
|
|
112
|
+
export declare function parseTasksOutputRequest(params: unknown): TasksOutputRequest;
|
|
95
113
|
/** Validate raw JSON-RPC params into a {@link TasksBackgroundRequest}. */
|
|
96
114
|
export declare function parseTasksBackgroundRequest(params: unknown): TasksBackgroundRequest;
|
|
97
115
|
/** Internal model-selection state. Mirrors the shape the ACP SDK exposed as
|
|
@@ -664,6 +682,10 @@ export type Session = {
|
|
|
664
682
|
* them (R1.9). Absent only on hand-built test sessions. */
|
|
665
683
|
taskFeed?: TaskFeed;
|
|
666
684
|
taskFeedPublisher?: TaskFeedPublisher;
|
|
685
|
+
/** Story 041: publishes running shells' tails into `taskFeed`. Lives and
|
|
686
|
+
* dies with the feed — `retireTaskFeed` disposes it, a query recreate keeps
|
|
687
|
+
* it. Absent only on hand-built test sessions. */
|
|
688
|
+
tailPoller?: TailPoller;
|
|
667
689
|
/** Whether any top-level assistant text reached the client since the last
|
|
668
690
|
* stretch boundary. Set as a side effect of sending in the consumer's
|
|
669
691
|
* `sendUpdate`, never at an emission site; read at the terminal `result`
|
|
@@ -1074,6 +1096,13 @@ export declare class ClaudeAcpAgent {
|
|
|
1074
1096
|
* `startedNewTurn` result are preserved for compatibility. */
|
|
1075
1097
|
/** `_claude/tasks/stop`: stop a task the feed holds as running (R2.1, R2.2). */
|
|
1076
1098
|
stopTask(params: TasksStopRequest): Promise<Record<string, never>>;
|
|
1099
|
+
/**
|
|
1100
|
+
* `_claude/tasks/output`: the end of a task's output file (story 041, R2.1–R2.7).
|
|
1101
|
+
* Serves only a path the feed recorded for its own task, and works on an
|
|
1102
|
+
* ended session too, as long as the session object exists. One log line,
|
|
1103
|
+
* never the content.
|
|
1104
|
+
*/
|
|
1105
|
+
taskOutput(params: TasksOutputRequest): Promise<TasksOutputResponse>;
|
|
1077
1106
|
/** `_claude/tasks/background`: background the task a foreground tool call
|
|
1078
1107
|
* started (R2.3, R2.4). `false` means the id matched no foreground task. */
|
|
1079
1108
|
backgroundTask(params: TasksBackgroundRequest): Promise<TasksBackgroundResponse>;
|
package/dist/acp-agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/acp-agent.js
CHANGED
|
@@ -42,7 +42,8 @@ import { ACCOUNT_CONFIG_ID, accountForValue, accountInForce, createAccountConfig
|
|
|
42
42
|
import { isUsageCommandText, structuredUsageMarkdown, syntheticLocalCommand, } from "./usage-markdown.js";
|
|
43
43
|
export { DEFAULT_AGENT_ID, EFFORT_CONFIG_ID } from "./session-config-ids.js";
|
|
44
44
|
import { MODE_CONFIG_ID, SessionModeManager } from "./session-mode.js";
|
|
45
|
-
import { TASKS_META_KEY, TaskFeed, TaskFeedPublisher } from "./task-feed.js";
|
|
45
|
+
import { TASKS_CONTRACT_VERSION, TASKS_META_KEY, normaliseStatus, TailPoller, TaskFeed, TaskFeedPublisher, } from "./task-feed.js";
|
|
46
|
+
import { OutputUnavailable, outputPathFromBashResult, readOutput } from "./task-output.js";
|
|
46
47
|
import { EscalationRegistry, GrantStore, createAskOperator, createGrantPreToolUseHook, createPermissionDeniedHook, } from "./classifier-escalation.js";
|
|
47
48
|
export const CLAUDE_CONFIG_DIR = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
|
|
48
49
|
const execFileAsync = promisify(execFile);
|
|
@@ -142,11 +143,15 @@ export const TASKS_STOP_METHOD = "_claude/tasks/stop";
|
|
|
142
143
|
/** Move a foreground tool call's task to the background (story 012, R2.3).
|
|
143
144
|
* Params {@link TasksBackgroundRequest}, result {@link TasksBackgroundResponse}. */
|
|
144
145
|
export const TASKS_BACKGROUND_METHOD = "_claude/tasks/background";
|
|
145
|
-
/**
|
|
146
|
-
*
|
|
146
|
+
/** Read the end of a task's output file (story 041, R2.1). Params
|
|
147
|
+
* {@link TasksOutputRequest}, result {@link TasksOutputResponse}. Version 2. */
|
|
148
|
+
export const TASKS_OUTPUT_METHOD = "_claude/tasks/output";
|
|
149
|
+
/** `agentCapabilities._meta` key advertising the task feed and its methods
|
|
150
|
+
* (R2.7). Zeo gates on this, never on the agent's name — the name is
|
|
147
151
|
* `package.json`'s, and differs between this fork and the published mirror. */
|
|
148
152
|
export const TASKS_CAPABILITY_KEY = TASKS_META_KEY;
|
|
149
|
-
|
|
153
|
+
/** Version 2 (story 041) adds `hasOutput`, `tail` and `_claude/tasks/output`. */
|
|
154
|
+
export const TASKS_CAPABILITY_VERSION = TASKS_CONTRACT_VERSION;
|
|
150
155
|
/** The SDK's own text for a rejected control request, passed through to the
|
|
151
156
|
* client as the internal error's message (R2.4). */
|
|
152
157
|
function errorMessage(error) {
|
|
@@ -171,6 +176,18 @@ export function parseTasksStopRequest(params) {
|
|
|
171
176
|
taskId: requireIdField(params, TASKS_STOP_METHOD, "taskId"),
|
|
172
177
|
};
|
|
173
178
|
}
|
|
179
|
+
/** Validate raw JSON-RPC params into a {@link TasksOutputRequest}. Extra keys —
|
|
180
|
+
* a `path` included — are ignored: only a file the adapter recorded is read
|
|
181
|
+
* (R2.5). */
|
|
182
|
+
export function parseTasksOutputRequest(params) {
|
|
183
|
+
const sessionId = requireIdField(params, TASKS_OUTPUT_METHOD, "sessionId");
|
|
184
|
+
const taskId = requireIdField(params, TASKS_OUTPUT_METHOD, "taskId");
|
|
185
|
+
const maxBytes = params && typeof params === "object" ? params.maxBytes : undefined;
|
|
186
|
+
if (typeof maxBytes !== "number" || !Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
|
|
187
|
+
throw RequestError.invalidParams(undefined, `${TASKS_OUTPUT_METHOD} params require maxBytes, a positive integer`);
|
|
188
|
+
}
|
|
189
|
+
return { sessionId, taskId, maxBytes };
|
|
190
|
+
}
|
|
174
191
|
/** Validate raw JSON-RPC params into a {@link TasksBackgroundRequest}. */
|
|
175
192
|
export function parseTasksBackgroundRequest(params) {
|
|
176
193
|
return {
|
|
@@ -1520,6 +1537,39 @@ export class ClaudeAcpAgent {
|
|
|
1520
1537
|
return {};
|
|
1521
1538
|
});
|
|
1522
1539
|
}
|
|
1540
|
+
/**
|
|
1541
|
+
* `_claude/tasks/output`: the end of a task's output file (story 041, R2.1–R2.7).
|
|
1542
|
+
* Serves only a path the feed recorded for its own task, and works on an
|
|
1543
|
+
* ended session too, as long as the session object exists. One log line,
|
|
1544
|
+
* never the content.
|
|
1545
|
+
*/
|
|
1546
|
+
async taskOutput(params) {
|
|
1547
|
+
const { sessionId, taskId, maxBytes } = params;
|
|
1548
|
+
const log = (outcome, detail) => this.logger.log(`[tasks/output] method=${TASKS_OUTPUT_METHOD} sessionId=${logValue(sessionId)} taskId=${logValue(taskId)} ${detail} outcome=${outcome}`);
|
|
1549
|
+
const refuse = (error, reason) => {
|
|
1550
|
+
log("error", `reason=${logValue(reason)}`);
|
|
1551
|
+
throw error;
|
|
1552
|
+
};
|
|
1553
|
+
const session = Object.hasOwn(this.sessions, sessionId) ? this.sessions[sessionId] : undefined;
|
|
1554
|
+
if (!session) {
|
|
1555
|
+
return refuse(RequestError.invalidParams(undefined, `unknown session ${sessionId}`), "unknown_session");
|
|
1556
|
+
}
|
|
1557
|
+
const path = session.taskFeed?.outputPathFor(taskId) ?? null;
|
|
1558
|
+
if (path === null) {
|
|
1559
|
+
return refuse(RequestError.invalidParams(undefined, `task ${taskId} has no recorded output`), "no_recorded_output");
|
|
1560
|
+
}
|
|
1561
|
+
try {
|
|
1562
|
+
const result = await readOutput(path, maxBytes);
|
|
1563
|
+
log("ok", `bytes=${Buffer.byteLength(result.content, "utf8")} truncated=${result.truncated}`);
|
|
1564
|
+
return result;
|
|
1565
|
+
}
|
|
1566
|
+
catch (error) {
|
|
1567
|
+
if (error instanceof OutputUnavailable) {
|
|
1568
|
+
return refuse(RequestError.internalError(undefined, `output of task ${taskId} is no longer available (${error.code})`), error.code);
|
|
1569
|
+
}
|
|
1570
|
+
return refuse(RequestError.internalError(undefined, logValue(errorMessage(error))), "unexpected");
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1523
1573
|
/** `_claude/tasks/background`: background the task a foreground tool call
|
|
1524
1574
|
* started (R2.3, R2.4). `false` means the id matched no foreground task. */
|
|
1525
1575
|
async backgroundTask(params) {
|
|
@@ -3114,7 +3164,14 @@ export class ClaudeAcpAgent {
|
|
|
3114
3164
|
// The task settled — no further tool calls can originate
|
|
3115
3165
|
// from it, so its registry entry can be dropped.
|
|
3116
3166
|
session.liveBackgroundTasks.delete(message.task_id);
|
|
3117
|
-
|
|
3167
|
+
if (session.taskFeed && session.taskFeedPublisher) {
|
|
3168
|
+
const readable = await endingOutputReadable(session, message.task_id, message.output_file);
|
|
3169
|
+
const change = session.taskFeed.onNotification(message);
|
|
3170
|
+
if (change === "terminal" && readable !== null) {
|
|
3171
|
+
session.taskFeed.setTail(message.task_id, null, readable);
|
|
3172
|
+
}
|
|
3173
|
+
session.taskFeedPublisher.notify(change);
|
|
3174
|
+
}
|
|
3118
3175
|
break;
|
|
3119
3176
|
case "task_updated":
|
|
3120
3177
|
// terminal-status task_updated patch and a (deduplicated)
|
|
@@ -3127,7 +3184,19 @@ export class ClaudeAcpAgent {
|
|
|
3127
3184
|
message.patch.status === "killed") {
|
|
3128
3185
|
session.liveBackgroundTasks.delete(message.task_id);
|
|
3129
3186
|
}
|
|
3130
|
-
|
|
3187
|
+
if (session.taskFeed && session.taskFeedPublisher) {
|
|
3188
|
+
// The CLI queues the terminal patch BEFORE the
|
|
3189
|
+
// task_notification, so this is usually where a shell ends
|
|
3190
|
+
// and its output check has to happen (story 041, R1.7).
|
|
3191
|
+
const readable = normaliseStatus(message.patch.status) !== null
|
|
3192
|
+
? await endingOutputReadable(session, message.task_id)
|
|
3193
|
+
: null;
|
|
3194
|
+
const change = session.taskFeed.onUpdated(message);
|
|
3195
|
+
if (change === "terminal" && readable !== null) {
|
|
3196
|
+
session.taskFeed.setTail(message.task_id, null, readable);
|
|
3197
|
+
}
|
|
3198
|
+
session.taskFeedPublisher.notify(change);
|
|
3199
|
+
}
|
|
3131
3200
|
break;
|
|
3132
3201
|
case "worker_shutting_down":
|
|
3133
3202
|
// Defer until stream end. The announcement is durable and may be
|
|
@@ -4249,6 +4318,9 @@ export class ClaudeAcpAgent {
|
|
|
4249
4318
|
content = message.message.content;
|
|
4250
4319
|
}
|
|
4251
4320
|
const acceptedPlanToolUseId = observeExitPlanToolResults(message, content, session);
|
|
4321
|
+
// Before toAcpNotifications, which prunes the tool_use cache entry
|
|
4322
|
+
// that says the result is a Bash call's.
|
|
4323
|
+
observeBackgroundBashResult(message, content, session);
|
|
4252
4324
|
for (const notification of toAcpNotifications(content, message.message.role, params.sessionId, session.toolUseCache, this.client, this.logger, {
|
|
4253
4325
|
clientCapabilities: this.clientCapabilities,
|
|
4254
4326
|
parentToolUseId: message.parent_tool_use_id,
|
|
@@ -4764,6 +4836,9 @@ export class ClaudeAcpAgent {
|
|
|
4764
4836
|
* query recreate is the one exit that keeps the feed, and does not come
|
|
4765
4837
|
* through here. */
|
|
4766
4838
|
retireTaskFeed(session) {
|
|
4839
|
+
// Before the publisher: a tick landing after the flush would publish a
|
|
4840
|
+
// tail into a feed whose session is gone (story 041).
|
|
4841
|
+
session.tailPoller?.dispose();
|
|
4767
4842
|
const publisher = session.taskFeedPublisher;
|
|
4768
4843
|
if (!publisher)
|
|
4769
4844
|
return;
|
|
@@ -4783,7 +4858,8 @@ export class ClaudeAcpAgent {
|
|
|
4783
4858
|
sessionId,
|
|
4784
4859
|
update: { sessionUpdate: "session_info_update", _meta: { [TASKS_META_KEY]: snapshot } },
|
|
4785
4860
|
}), undefined, (error) => this.logger.error(`[tasks/feed] sessionId=${logValue(sessionId)} outcome=send_failed reason=${logValue(errorMessage(error))}`));
|
|
4786
|
-
|
|
4861
|
+
const tailPoller = new TailPoller(taskFeed, taskFeedPublisher, undefined, undefined, (line) => this.logger.log(line), sessionId);
|
|
4862
|
+
return { taskFeed, taskFeedPublisher, tailPoller };
|
|
4787
4863
|
}
|
|
4788
4864
|
/** Cleanly tear down a session: cancel in-flight work, release stream
|
|
4789
4865
|
* resources, and remove it from the session map. */
|
|
@@ -8646,6 +8722,7 @@ export function runAcp(logger) {
|
|
|
8646
8722
|
.onNotification(methods.agent.session.cancel, (ctx) => agent.cancel(ctx.params))
|
|
8647
8723
|
.onRequest(STEER_METHOD, { parse: parseSteerRequest }, (ctx) => agent.steer(ctx.params))
|
|
8648
8724
|
.onRequest(TASKS_STOP_METHOD, { parse: parseTasksStopRequest }, (ctx) => agent.stopTask(ctx.params))
|
|
8725
|
+
.onRequest(TASKS_OUTPUT_METHOD, { parse: parseTasksOutputRequest }, (ctx) => agent.taskOutput(ctx.params))
|
|
8649
8726
|
.onRequest(TASKS_BACKGROUND_METHOD, { parse: parseTasksBackgroundRequest }, (ctx) => agent.backgroundTask(ctx.params))
|
|
8650
8727
|
.onRequest(GOAL_CONTROL_METHOD, { parse: parseGoalRequest }, (ctx) => agent.goal(ctx.params))
|
|
8651
8728
|
.connect(stream);
|
|
@@ -8821,3 +8898,58 @@ function getMatchingModelUsage(modelUsage, currentModel) {
|
|
|
8821
8898
|
return { key: bestKey, usage: modelUsage[bestKey] };
|
|
8822
8899
|
}
|
|
8823
8900
|
}
|
|
8901
|
+
/**
|
|
8902
|
+
* Story 041 (R1.1, R1.6): a backgrounded Bash call's result names the file the
|
|
8903
|
+
* CLI writes its output to. When the structured `BashOutput` carries
|
|
8904
|
+
* `backgroundTaskId` and the text names exactly `<that id>.output` by an
|
|
8905
|
+
* absolute path, the path is recorded for the task's tail. Anything else
|
|
8906
|
+
* records nothing, so the task gets no tail. The rendered tool content is not
|
|
8907
|
+
* touched.
|
|
8908
|
+
*/
|
|
8909
|
+
function observeBackgroundBashResult(message, content, session) {
|
|
8910
|
+
if (message.type !== "user" || !session.taskFeed || !Array.isArray(content))
|
|
8911
|
+
return;
|
|
8912
|
+
const result = message.tool_use_result;
|
|
8913
|
+
if (typeof result !== "object" || result === null || !("backgroundTaskId" in result))
|
|
8914
|
+
return;
|
|
8915
|
+
const taskId = result.backgroundTaskId;
|
|
8916
|
+
if (typeof taskId !== "string" || taskId === "")
|
|
8917
|
+
return;
|
|
8918
|
+
const blocks = content.filter((c) => typeof c === "object" && c !== null && c.type === "tool_result");
|
|
8919
|
+
// `tool_use_result` describes "the" tool_result of its message: only one.
|
|
8920
|
+
if (blocks.length !== 1)
|
|
8921
|
+
return;
|
|
8922
|
+
const [block] = blocks;
|
|
8923
|
+
if (session.toolUseCache[block.tool_use_id]?.name !== "Bash")
|
|
8924
|
+
return;
|
|
8925
|
+
const text = typeof block.content === "string"
|
|
8926
|
+
? block.content
|
|
8927
|
+
: Array.isArray(block.content)
|
|
8928
|
+
? block.content
|
|
8929
|
+
.filter((c) => typeof c === "object" &&
|
|
8930
|
+
c !== null &&
|
|
8931
|
+
c.type === "text" &&
|
|
8932
|
+
typeof c.text === "string")
|
|
8933
|
+
.map((c) => c.text)
|
|
8934
|
+
.join("\n")
|
|
8935
|
+
: "";
|
|
8936
|
+
const path = outputPathFromBashResult(text, taskId);
|
|
8937
|
+
if (path === null)
|
|
8938
|
+
return;
|
|
8939
|
+
session.taskFeedPublisher?.notify(session.taskFeed.onOutputPath(taskId, path));
|
|
8940
|
+
session.tailPoller?.kick();
|
|
8941
|
+
}
|
|
8942
|
+
/**
|
|
8943
|
+
* Story 041 (R1.7): whether an ending shell task's output file reads, checked
|
|
8944
|
+
* BEFORE the ending is folded into the feed — once the feed holds the ending,
|
|
8945
|
+
* any publish (a throttled trailer, a poller tick) could send it while the
|
|
8946
|
+
* check is still pending, and with `hasOutput: false`. Returns null without
|
|
8947
|
+
* awaiting anything when there is no file to check, so every other ending
|
|
8948
|
+
* keeps its synchronous place in the SDK message loop.
|
|
8949
|
+
*/
|
|
8950
|
+
async function endingOutputReadable(session, taskId, outputFile) {
|
|
8951
|
+
const path = session.taskFeed?.endingOutputPath(taskId, outputFile) ?? null;
|
|
8952
|
+
if (path === null || !session.tailPoller)
|
|
8953
|
+
return null;
|
|
8954
|
+
return session.tailPoller.checkOutput(path);
|
|
8955
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier-escalation.d.ts","sourceRoot":"","sources":["../src/classifier-escalation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,gCAAgC,CAAC;AAGnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG7E,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AAoBnC;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAqBhF;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3C,6EAA6E;AAC7E,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,qDAAqD;IACrD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAM1C,2DAA2D;IAC3D,SAAS,IAAI,IAAI;IAIjB,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAId;AAED,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtE,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE;IAAE,aAAa,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAgBF;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoE;IAC5F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAC9E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;gBAEpD,IAAI,EAAE,sBAAsB;IAMxC,6FAA6F;IAC7F,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAyCnC,mFAAmF;IACnF,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA0B/D;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAOjC,mEAAmE;IACnE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAiBhC,wEAAwE;IACxE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI5D,4CAA4C;IAC5C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIvC,8EAA8E;IAC9E,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIvC,oEAAoE;IACpE,KAAK,IAAI,IAAI;IAWb,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,aAAa;CAMtB;AA4DD,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CACxB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAMzC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CA0DvF;AAKD,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,UAAU,CAAA;KAAE,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;IAC3F,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAYF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,YAAY,CAkGvF;
|
|
1
|
+
{"version":3,"file":"classifier-escalation.d.ts","sourceRoot":"","sources":["../src/classifier-escalation.ts"],"names":[],"mappings":"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"}
|
|
@@ -255,7 +255,7 @@ export class EscalationRegistry {
|
|
|
255
255
|
this.send(toolUseId, buildFinalUpdate(toolUseId, outcome, frame));
|
|
256
256
|
}
|
|
257
257
|
send(toolUseId, update) {
|
|
258
|
-
const warn = (error) => this.logger.log(`classifier escalation: final tool_call_update failed level=warn sessionId=${this.sessionId} toolUseId=${toolUseId} error=${
|
|
258
|
+
const warn = (error) => this.logger.log(`classifier escalation: final tool_call_update failed level=warn sessionId=${this.sessionId} toolUseId=${toolUseId} error=${errorKind(error)}`);
|
|
259
259
|
try {
|
|
260
260
|
void Promise.resolve(this.emit(toolUseId, update)).catch(warn);
|
|
261
261
|
}
|
|
@@ -402,7 +402,7 @@ export function createPermissionDeniedHook(deps) {
|
|
|
402
402
|
return {};
|
|
403
403
|
const toolName = input.tool_name;
|
|
404
404
|
// Never the command or the input: ids, tool name and outcome only (R6.3).
|
|
405
|
-
const line = (level, event, fields) => logger.log(`classifier escalation: ${event} level=${level} sessionId=${sessionId} toolUseId=${toolUseId} toolName=${toolName} ${fields}`);
|
|
405
|
+
const line = (level, event, fields) => logger.log(`classifier escalation: ${event} level=${level} sessionId=${sessionId} toolUseId=${toolUseId} toolName=${logToken(toolName)} ${fields}`);
|
|
406
406
|
let claimed = false;
|
|
407
407
|
try {
|
|
408
408
|
const reasonType = await escalations.awaitReasonType(toolUseId);
|
|
@@ -471,7 +471,7 @@ export function createPermissionDeniedHook(deps) {
|
|
|
471
471
|
escalations.resolve(toolUseId, "rejected");
|
|
472
472
|
else
|
|
473
473
|
escalations.abandon(toolUseId);
|
|
474
|
-
logger.error(`classifier escalation: hook failed level=error sessionId=${sessionId} toolUseId=${toolUseId} toolName=${toolName} error=${errorKind(error)}`);
|
|
474
|
+
logger.error(`classifier escalation: hook failed level=error sessionId=${sessionId} toolUseId=${toolUseId} toolName=${logToken(toolName)} error=${errorKind(error)}`);
|
|
475
475
|
return {};
|
|
476
476
|
}
|
|
477
477
|
};
|
|
@@ -519,11 +519,15 @@ async function askWithBounds(askOperator, req, signal) {
|
|
|
519
519
|
}
|
|
520
520
|
}
|
|
521
521
|
const GRANT_ALLOW_REASON = "approved by the operator after a classifier denial";
|
|
522
|
-
/**
|
|
523
|
-
|
|
524
|
-
|
|
522
|
+
/**
|
|
523
|
+
* A value from the hook input as a log token — a mode or a tool name, both
|
|
524
|
+
* chosen outside the adapter (an MCP tool's name is model-steerable): word
|
|
525
|
+
* characters and dashes only, capped, so it cannot forge a field or a line.
|
|
526
|
+
*/
|
|
527
|
+
function logToken(value) {
|
|
528
|
+
if (typeof value !== "string")
|
|
525
529
|
return "none";
|
|
526
|
-
const token =
|
|
530
|
+
const token = value.replace(/[^\w-]/gu, "").slice(0, 64);
|
|
527
531
|
return token || "none";
|
|
528
532
|
}
|
|
529
533
|
/**
|
|
@@ -547,14 +551,14 @@ export function createGrantPreToolUseHook(session, logger) {
|
|
|
547
551
|
const mode = input.permission_mode;
|
|
548
552
|
if (mode !== "auto") {
|
|
549
553
|
if (session.classifierGrants.has(fp)) {
|
|
550
|
-
logger.log(`classifier escalation: grant held level=info sessionId=${session.sessionId} toolUseId=${toolUseID ?? input.tool_use_id} toolName=${input.tool_name} mode=${
|
|
554
|
+
logger.log(`classifier escalation: grant held level=info sessionId=${session.sessionId} toolUseId=${toolUseID ?? input.tool_use_id} toolName=${logToken(input.tool_name)} mode=${logToken(mode)}`);
|
|
551
555
|
}
|
|
552
556
|
return {};
|
|
553
557
|
}
|
|
554
558
|
const kind = session.classifierGrants.consume(fp);
|
|
555
559
|
if (!kind)
|
|
556
560
|
return {};
|
|
557
|
-
logger.log(`classifier escalation: grant consumed level=info sessionId=${session.sessionId} toolUseId=${toolUseID ?? input.tool_use_id} toolName=${input.tool_name} grant=${kind}`);
|
|
561
|
+
logger.log(`classifier escalation: grant consumed level=info sessionId=${session.sessionId} toolUseId=${toolUseID ?? input.tool_use_id} toolName=${logToken(input.tool_name)} grant=${kind}`);
|
|
558
562
|
return {
|
|
559
563
|
hookSpecificOutput: {
|
|
560
564
|
hookEventName: "PreToolUse",
|
package/dist/task-feed.d.ts
CHANGED
|
@@ -27,10 +27,21 @@
|
|
|
27
27
|
*
|
|
28
28
|
* Neither class ever copies a command line (`SDKTaskStartedMessage.prompt`)
|
|
29
29
|
* into an entry or a log line.
|
|
30
|
+
*
|
|
31
|
+
* Version 2 (story 041) adds `hasOutput` and `tail`. A shell task's output
|
|
32
|
+
* path — named by the Bash result while it runs, by `task_notification` when
|
|
33
|
+
* it ends — is kept beside the table, never on the wire. Once an ended shell
|
|
34
|
+
* task leaves the table, its path moves to a bounded registry so
|
|
35
|
+
* `_claude/tasks/output` can still serve it.
|
|
30
36
|
*/
|
|
31
37
|
import type { SDKTaskNotificationMessage, SDKTaskProgressMessage, SDKTaskStartedMessage, SDKTaskUpdatedMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
32
38
|
/** The `session_info_update._meta` key the snapshot is published under. */
|
|
33
39
|
export declare const TASKS_META_KEY = "_claude/tasks";
|
|
40
|
+
/** The `_claude/tasks` contract version advertised at `initialize`. Version 2
|
|
41
|
+
* adds `hasOutput`, `tail` and `_claude/tasks/output`. */
|
|
42
|
+
export declare const TASKS_CONTRACT_VERSION = 2;
|
|
43
|
+
/** Ended shell outputs still servable per session, most recent kept. */
|
|
44
|
+
export declare const ENDED_OUTPUTS_MAX = 256;
|
|
34
45
|
export type TaskStatus = "running" | "completed" | "failed" | "stopped" | "interrupted";
|
|
35
46
|
export type TaskUsage = {
|
|
36
47
|
tokens: number;
|
|
@@ -51,6 +62,10 @@ export type TaskEntry = {
|
|
|
51
62
|
usage: TaskUsage | null;
|
|
52
63
|
lastTool: string | null;
|
|
53
64
|
summary: string | null;
|
|
65
|
+
/** True when `_claude/tasks/output` can serve this task (version 2). */
|
|
66
|
+
hasOutput: boolean;
|
|
67
|
+
/** A running shell's last lines, sanitized; null otherwise (version 2). */
|
|
68
|
+
tail: string[] | null;
|
|
54
69
|
};
|
|
55
70
|
export type TasksSnapshot = {
|
|
56
71
|
tasks: TaskEntry[];
|
|
@@ -97,6 +112,10 @@ export declare class TaskFeed {
|
|
|
97
112
|
private readonly held;
|
|
98
113
|
/** Shell task ids labelled by their tool call: a patch never relabels them. */
|
|
99
114
|
private readonly toolDescribed;
|
|
115
|
+
/** Shell task id → its output file, while the task is in the table. */
|
|
116
|
+
private readonly outputs;
|
|
117
|
+
/** Ended shell outputs that left the table, oldest first; see `ENDED_OUTPUTS_MAX`. */
|
|
118
|
+
private readonly endedOutputs;
|
|
100
119
|
constructor(clock: () => number, log?: TaskFeedLog, sessionId?: string);
|
|
101
120
|
/**
|
|
102
121
|
* `toolDescription` is the spawning tool call's own `description` input. A
|
|
@@ -126,6 +145,33 @@ export declare class TaskFeed {
|
|
|
126
145
|
/** The CLI process restarted: whatever was running did not survive it. A
|
|
127
146
|
* held shell task was never shown, so it is dropped rather than ended. */
|
|
128
147
|
onProcessRestart(): TaskChange;
|
|
148
|
+
/**
|
|
149
|
+
* Records the output file a Bash result named for a known shell task. Any
|
|
150
|
+
* other task, or an unknown id, is ignored: only a shell writes an output
|
|
151
|
+
* file, and only one the adapter recorded is ever read (R2.5).
|
|
152
|
+
*/
|
|
153
|
+
onOutputPath(taskId: string, path: string): TaskChange;
|
|
154
|
+
/**
|
|
155
|
+
* Sets a shell task's tail and whether its output reads. A running task
|
|
156
|
+
* keeps `lines`; an ended one keeps none, so this only confirms its output.
|
|
157
|
+
* Returns `"none"` when nothing changed, so an idle file publishes nothing.
|
|
158
|
+
*/
|
|
159
|
+
setTail(taskId: string, lines: string[] | null, readable: boolean): TaskChange;
|
|
160
|
+
/**
|
|
161
|
+
* The file the ending's existence check reads (R1.7), or null when there is
|
|
162
|
+
* nothing to check: `taskId` must be a running shell in the table. A non-empty
|
|
163
|
+
* `output_file` from the ending (the CLI's own) wins over the path the Bash result named.
|
|
164
|
+
* The caller checks BEFORE folding the ending in, so the snapshot that
|
|
165
|
+
* carries the ending already says whether the output can be served.
|
|
166
|
+
*/
|
|
167
|
+
endingOutputPath(taskId: string, outputFile?: string): string | null;
|
|
168
|
+
/** Running shell tasks with a recorded output file: the tail poller's work. */
|
|
169
|
+
runningOutputs(): {
|
|
170
|
+
taskId: string;
|
|
171
|
+
path: string;
|
|
172
|
+
}[];
|
|
173
|
+
/** The output file `_claude/tasks/output` may read for `taskId`, or null. */
|
|
174
|
+
outputPathFor(taskId: string): string | null;
|
|
129
175
|
/** True when the feed holds `taskId` as running — the stop request's gate. */
|
|
130
176
|
isRunning(taskId: string): boolean;
|
|
131
177
|
/** Running tasks plus ended tasks not yet published, oldest start first.
|
|
@@ -148,6 +194,8 @@ export declare class TaskFeed {
|
|
|
148
194
|
* the tool call is never replaced. */
|
|
149
195
|
private patch;
|
|
150
196
|
private end;
|
|
197
|
+
/** Moves a task that left the table to the ended registry, newest last. */
|
|
198
|
+
private retireOutput;
|
|
151
199
|
}
|
|
152
200
|
export type PublisherTimers = {
|
|
153
201
|
now: () => number;
|
|
@@ -192,4 +240,47 @@ export declare class TaskFeedPublisher {
|
|
|
192
240
|
private armHold;
|
|
193
241
|
private armReconcile;
|
|
194
242
|
}
|
|
243
|
+
/** The longest the ending's existence check may hold the SDK message loop. */
|
|
244
|
+
export declare const ENDING_CHECK_TIMEOUT_MS = 2000;
|
|
245
|
+
/** How often the tail poller looks at running shells' output files (R1.4). */
|
|
246
|
+
export declare const TAIL_POLL_INTERVAL_MS = 1000;
|
|
247
|
+
export type PollerTimers = {
|
|
248
|
+
setInterval: (fn: () => void, ms: number) => unknown;
|
|
249
|
+
clearInterval: (handle: any) => void;
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Publishes a running shell task's tail (story 041, R1.4, R1.5). One interval
|
|
253
|
+
* while any shell output is known; each tick `stat`s every file and reads the
|
|
254
|
+
* tail only when its size changed, shrinking included. A read error publishes
|
|
255
|
+
* `tail: null, hasOutput: false` and logs once per task until the file reads
|
|
256
|
+
* again. A tick never overlaps the previous one, and no rejection escapes it:
|
|
257
|
+
* the interval runs outside every caller that could handle one, and Node exits
|
|
258
|
+
* on an unhandled rejection.
|
|
259
|
+
*/
|
|
260
|
+
export declare class TailPoller {
|
|
261
|
+
private readonly feed;
|
|
262
|
+
private readonly publisher;
|
|
263
|
+
private readonly timers;
|
|
264
|
+
private readonly readTailFn;
|
|
265
|
+
private readonly log;
|
|
266
|
+
private readonly sessionId;
|
|
267
|
+
private interval;
|
|
268
|
+
private busy;
|
|
269
|
+
private closed;
|
|
270
|
+
/** task id → the file size the last published tail was read at. */
|
|
271
|
+
private readonly sizes;
|
|
272
|
+
/** Task ids whose file failed to read: logged once, until it reads again. */
|
|
273
|
+
private readonly failing;
|
|
274
|
+
constructor(feed: TaskFeed, publisher: TaskFeedPublisher, timers?: PollerTimers, readTailFn?: (path: string) => Promise<string[]>, log?: (line: string) => void, sessionId?: string);
|
|
275
|
+
/** Arms the interval when there is output to watch. Called after a path is recorded. */
|
|
276
|
+
kick(): void;
|
|
277
|
+
/**
|
|
278
|
+
* The ending's existence check (R1.7): true when `path` reads as a regular
|
|
279
|
+
* file within `ENDING_CHECK_TIMEOUT_MS`. Never rejects.
|
|
280
|
+
*/
|
|
281
|
+
checkOutput(path: string): Promise<boolean>;
|
|
282
|
+
dispose(): void;
|
|
283
|
+
private stop;
|
|
284
|
+
private tick;
|
|
285
|
+
}
|
|
195
286
|
//# sourceMappingURL=task-feed.d.ts.map
|
package/dist/task-feed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-feed.d.ts","sourceRoot":"","sources":["../src/task-feed.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"task-feed.d.ts","sourceRoot":"","sources":["../src/task-feed.ts"],"names":[],"mappings":"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"}
|
package/dist/task-feed.js
CHANGED
|
@@ -27,9 +27,22 @@
|
|
|
27
27
|
*
|
|
28
28
|
* Neither class ever copies a command line (`SDKTaskStartedMessage.prompt`)
|
|
29
29
|
* into an entry or a log line.
|
|
30
|
+
*
|
|
31
|
+
* Version 2 (story 041) adds `hasOutput` and `tail`. A shell task's output
|
|
32
|
+
* path — named by the Bash result while it runs, by `task_notification` when
|
|
33
|
+
* it ends — is kept beside the table, never on the wire. Once an ended shell
|
|
34
|
+
* task leaves the table, its path moves to a bounded registry so
|
|
35
|
+
* `_claude/tasks/output` can still serve it.
|
|
30
36
|
*/
|
|
37
|
+
import { stat } from "node:fs/promises";
|
|
38
|
+
import { readTail } from "./task-output.js";
|
|
31
39
|
/** The `session_info_update._meta` key the snapshot is published under. */
|
|
32
40
|
export const TASKS_META_KEY = "_claude/tasks";
|
|
41
|
+
/** The `_claude/tasks` contract version advertised at `initialize`. Version 2
|
|
42
|
+
* adds `hasOutput`, `tail` and `_claude/tasks/output`. */
|
|
43
|
+
export const TASKS_CONTRACT_VERSION = 2;
|
|
44
|
+
/** Ended shell outputs still servable per session, most recent kept. */
|
|
45
|
+
export const ENDED_OUTPUTS_MAX = 256;
|
|
33
46
|
/** How long a foreground shell task is held back before it is published. */
|
|
34
47
|
export const FOREGROUND_SHELL_HOLD_MS = 5000;
|
|
35
48
|
/** How long a running background task may be missing from the level before
|
|
@@ -104,6 +117,10 @@ export class TaskFeed {
|
|
|
104
117
|
held = new Map();
|
|
105
118
|
/** Shell task ids labelled by their tool call: a patch never relabels them. */
|
|
106
119
|
toolDescribed = new Set();
|
|
120
|
+
/** Shell task id → its output file, while the task is in the table. */
|
|
121
|
+
outputs = new Map();
|
|
122
|
+
/** Ended shell outputs that left the table, oldest first; see `ENDED_OUTPUTS_MAX`. */
|
|
123
|
+
endedOutputs = new Map();
|
|
107
124
|
constructor(clock, log = {}, sessionId = "") {
|
|
108
125
|
this.clock = clock;
|
|
109
126
|
this.log = log;
|
|
@@ -141,6 +158,8 @@ export class TaskFeed {
|
|
|
141
158
|
usage: null,
|
|
142
159
|
lastTool: null,
|
|
143
160
|
summary: null,
|
|
161
|
+
hasOutput: false,
|
|
162
|
+
tail: null,
|
|
144
163
|
};
|
|
145
164
|
if (shell && msg.is_backgrounded !== true) {
|
|
146
165
|
this.held.set(msg.task_id, entry);
|
|
@@ -194,6 +213,7 @@ export class TaskFeed {
|
|
|
194
213
|
else {
|
|
195
214
|
if (normaliseStatus(msg.patch.status)) {
|
|
196
215
|
this.held.delete(msg.task_id);
|
|
216
|
+
this.outputs.delete(msg.task_id);
|
|
197
217
|
}
|
|
198
218
|
else {
|
|
199
219
|
this.patch(heldEntry, msg.patch);
|
|
@@ -214,14 +234,19 @@ export class TaskFeed {
|
|
|
214
234
|
}
|
|
215
235
|
onNotification(msg) {
|
|
216
236
|
// A held shell task that ends was never shown: its ending is not news.
|
|
217
|
-
if (this.held.delete(msg.task_id))
|
|
237
|
+
if (this.held.delete(msg.task_id)) {
|
|
238
|
+
this.outputs.delete(msg.task_id);
|
|
218
239
|
return "none";
|
|
240
|
+
}
|
|
219
241
|
const task = this.running(msg.task_id, "task_notification");
|
|
220
242
|
if (!task)
|
|
221
243
|
return "none";
|
|
222
244
|
const ending = normaliseStatus(msg.status, msg.reason) ?? "completed";
|
|
223
245
|
if (msg.summary)
|
|
224
246
|
task.summary = msg.summary;
|
|
247
|
+
if (task.type === "shell" && typeof msg.output_file === "string" && msg.output_file !== "") {
|
|
248
|
+
this.outputs.set(task.id, msg.output_file);
|
|
249
|
+
}
|
|
225
250
|
const usage = usageOf(msg.usage);
|
|
226
251
|
if (usage)
|
|
227
252
|
task.usage = usage;
|
|
@@ -273,6 +298,8 @@ export class TaskFeed {
|
|
|
273
298
|
/** The CLI process restarted: whatever was running did not survive it. A
|
|
274
299
|
* held shell task was never shown, so it is dropped rather than ended. */
|
|
275
300
|
onProcessRestart() {
|
|
301
|
+
for (const id of this.held.keys())
|
|
302
|
+
this.outputs.delete(id);
|
|
276
303
|
this.held.clear();
|
|
277
304
|
let change = "none";
|
|
278
305
|
for (const task of this.tasks.values()) {
|
|
@@ -283,6 +310,69 @@ export class TaskFeed {
|
|
|
283
310
|
}
|
|
284
311
|
return change;
|
|
285
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Records the output file a Bash result named for a known shell task. Any
|
|
315
|
+
* other task, or an unknown id, is ignored: only a shell writes an output
|
|
316
|
+
* file, and only one the adapter recorded is ever read (R2.5).
|
|
317
|
+
*/
|
|
318
|
+
onOutputPath(taskId, path) {
|
|
319
|
+
const task = this.tasks.get(taskId) ?? this.held.get(taskId);
|
|
320
|
+
if (!task || task.type !== "shell" || task.status !== "running") {
|
|
321
|
+
this.log.debug?.(`[tasks/feed] sessionId=${this.sessionId} taskId=${taskId} ignored=output_path`);
|
|
322
|
+
return "none";
|
|
323
|
+
}
|
|
324
|
+
this.outputs.set(taskId, path);
|
|
325
|
+
return "progress";
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Sets a shell task's tail and whether its output reads. A running task
|
|
329
|
+
* keeps `lines`; an ended one keeps none, so this only confirms its output.
|
|
330
|
+
* Returns `"none"` when nothing changed, so an idle file publishes nothing.
|
|
331
|
+
*/
|
|
332
|
+
setTail(taskId, lines, readable) {
|
|
333
|
+
const task = this.tasks.get(taskId);
|
|
334
|
+
if (!task || task.type !== "shell")
|
|
335
|
+
return "none";
|
|
336
|
+
// An ended task's output is decided by the ending's check alone: a poller
|
|
337
|
+
// tick that started before the ending and failed after it must not undo it.
|
|
338
|
+
if (task.status !== "running" && !readable)
|
|
339
|
+
return "none";
|
|
340
|
+
const tail = task.status === "running" && readable ? lines : null;
|
|
341
|
+
if (task.hasOutput === readable && sameLines(task.tail, tail))
|
|
342
|
+
return "none";
|
|
343
|
+
task.hasOutput = readable;
|
|
344
|
+
task.tail = tail === null ? null : [...tail];
|
|
345
|
+
return "progress";
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* The file the ending's existence check reads (R1.7), or null when there is
|
|
349
|
+
* nothing to check: `taskId` must be a running shell in the table. A non-empty
|
|
350
|
+
* `output_file` from the ending (the CLI's own) wins over the path the Bash result named.
|
|
351
|
+
* The caller checks BEFORE folding the ending in, so the snapshot that
|
|
352
|
+
* carries the ending already says whether the output can be served.
|
|
353
|
+
*/
|
|
354
|
+
endingOutputPath(taskId, outputFile) {
|
|
355
|
+
const task = this.tasks.get(taskId);
|
|
356
|
+
if (!task || task.type !== "shell" || task.status !== "running")
|
|
357
|
+
return null;
|
|
358
|
+
if (typeof outputFile === "string" && outputFile !== "")
|
|
359
|
+
return outputFile;
|
|
360
|
+
return this.outputs.get(taskId) ?? null;
|
|
361
|
+
}
|
|
362
|
+
/** Running shell tasks with a recorded output file: the tail poller's work. */
|
|
363
|
+
runningOutputs() {
|
|
364
|
+
const work = [];
|
|
365
|
+
for (const [taskId, path] of this.outputs) {
|
|
366
|
+
const task = this.tasks.get(taskId);
|
|
367
|
+
if (task?.status === "running" && task.type === "shell")
|
|
368
|
+
work.push({ taskId, path });
|
|
369
|
+
}
|
|
370
|
+
return work;
|
|
371
|
+
}
|
|
372
|
+
/** The output file `_claude/tasks/output` may read for `taskId`, or null. */
|
|
373
|
+
outputPathFor(taskId) {
|
|
374
|
+
return this.outputs.get(taskId) ?? this.endedOutputs.get(taskId) ?? null;
|
|
375
|
+
}
|
|
286
376
|
/** True when the feed holds `taskId` as running — the stop request's gate. */
|
|
287
377
|
isRunning(taskId) {
|
|
288
378
|
return this.tasks.get(taskId)?.status === "running";
|
|
@@ -293,7 +383,11 @@ export class TaskFeed {
|
|
|
293
383
|
const tasks = [...this.tasks.values()]
|
|
294
384
|
.filter((t) => t.status === "running" || !this.published.has(t.id))
|
|
295
385
|
.sort((a, b) => a.startedAt - b.startedAt)
|
|
296
|
-
.map((t) => ({
|
|
386
|
+
.map((t) => ({
|
|
387
|
+
...t,
|
|
388
|
+
usage: t.usage ? { ...t.usage } : null,
|
|
389
|
+
tail: t.tail ? [...t.tail] : null,
|
|
390
|
+
}));
|
|
297
391
|
const endedIds = tasks.filter((t) => t.status !== "running").map((t) => t.id);
|
|
298
392
|
for (const id of endedIds)
|
|
299
393
|
this.snapshotLives.set(id, this.lives.get(id) ?? 0);
|
|
@@ -312,6 +406,7 @@ export class TaskFeed {
|
|
|
312
406
|
this.snapshotLives.delete(id);
|
|
313
407
|
this.published.add(id);
|
|
314
408
|
this.tasks.delete(id);
|
|
409
|
+
this.retireOutput(id);
|
|
315
410
|
}
|
|
316
411
|
}
|
|
317
412
|
running(taskId, kind) {
|
|
@@ -329,6 +424,12 @@ export class TaskFeed {
|
|
|
329
424
|
* state supersedes an ending the client has not seen yet, and a published
|
|
330
425
|
* id must be shown again. */
|
|
331
426
|
admit(entry) {
|
|
427
|
+
// A new life writes a new file: the previous life's is not this one's. A
|
|
428
|
+
// held shell being promoted is the same life, and keeps the path it has.
|
|
429
|
+
if (this.tasks.has(entry.id) || this.published.has(entry.id)) {
|
|
430
|
+
this.outputs.delete(entry.id);
|
|
431
|
+
this.endedOutputs.delete(entry.id);
|
|
432
|
+
}
|
|
332
433
|
this.published.delete(entry.id);
|
|
333
434
|
this.lives.set(entry.id, (this.lives.get(entry.id) ?? 0) + 1);
|
|
334
435
|
this.tasks.set(entry.id, entry);
|
|
@@ -345,8 +446,32 @@ export class TaskFeed {
|
|
|
345
446
|
end(task, status, at = this.clock()) {
|
|
346
447
|
task.status = status;
|
|
347
448
|
task.endedAt = at;
|
|
449
|
+
// An ended task has no tail, and its output is claimed again only once the
|
|
450
|
+
// file was checked (R1.7).
|
|
451
|
+
task.tail = null;
|
|
452
|
+
task.hasOutput = false;
|
|
348
453
|
this.deadlines.delete(task.id);
|
|
349
454
|
}
|
|
455
|
+
/** Moves a task that left the table to the ended registry, newest last. */
|
|
456
|
+
retireOutput(taskId) {
|
|
457
|
+
const path = this.outputs.get(taskId);
|
|
458
|
+
this.outputs.delete(taskId);
|
|
459
|
+
if (path === undefined)
|
|
460
|
+
return;
|
|
461
|
+
this.endedOutputs.delete(taskId);
|
|
462
|
+
this.endedOutputs.set(taskId, path);
|
|
463
|
+
while (this.endedOutputs.size > ENDED_OUTPUTS_MAX) {
|
|
464
|
+
const oldest = this.endedOutputs.keys().next().value;
|
|
465
|
+
if (oldest === undefined)
|
|
466
|
+
break;
|
|
467
|
+
this.endedOutputs.delete(oldest);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
function sameLines(a, b) {
|
|
472
|
+
if (a === null || b === null)
|
|
473
|
+
return a === b;
|
|
474
|
+
return a.length === b.length && a.every((line, i) => line === b[i]);
|
|
350
475
|
}
|
|
351
476
|
const realTimers = {
|
|
352
477
|
now: () => Date.now(),
|
|
@@ -528,3 +653,136 @@ export class TaskFeedPublisher {
|
|
|
528
653
|
}, Math.max(0, at - this.timers.now()));
|
|
529
654
|
}
|
|
530
655
|
}
|
|
656
|
+
/** The longest the ending's existence check may hold the SDK message loop. */
|
|
657
|
+
export const ENDING_CHECK_TIMEOUT_MS = 2_000;
|
|
658
|
+
/** How often the tail poller looks at running shells' output files (R1.4). */
|
|
659
|
+
export const TAIL_POLL_INTERVAL_MS = 1_000;
|
|
660
|
+
const realPollerTimers = {
|
|
661
|
+
setInterval: (fn, ms) => setInterval(fn, ms),
|
|
662
|
+
clearInterval: (handle) => clearInterval(handle),
|
|
663
|
+
};
|
|
664
|
+
/** A log field value with no whitespace or `=` to forge a second field. */
|
|
665
|
+
function field(value) {
|
|
666
|
+
return value.replace(/[\s=]+/g, "_");
|
|
667
|
+
}
|
|
668
|
+
function codeOf(error) {
|
|
669
|
+
return typeof error === "object" &&
|
|
670
|
+
error !== null &&
|
|
671
|
+
"code" in error &&
|
|
672
|
+
typeof error.code === "string"
|
|
673
|
+
? error.code
|
|
674
|
+
: "unknown";
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Publishes a running shell task's tail (story 041, R1.4, R1.5). One interval
|
|
678
|
+
* while any shell output is known; each tick `stat`s every file and reads the
|
|
679
|
+
* tail only when its size changed, shrinking included. A read error publishes
|
|
680
|
+
* `tail: null, hasOutput: false` and logs once per task until the file reads
|
|
681
|
+
* again. A tick never overlaps the previous one, and no rejection escapes it:
|
|
682
|
+
* the interval runs outside every caller that could handle one, and Node exits
|
|
683
|
+
* on an unhandled rejection.
|
|
684
|
+
*/
|
|
685
|
+
export class TailPoller {
|
|
686
|
+
feed;
|
|
687
|
+
publisher;
|
|
688
|
+
timers;
|
|
689
|
+
readTailFn;
|
|
690
|
+
log;
|
|
691
|
+
sessionId;
|
|
692
|
+
interval = null;
|
|
693
|
+
busy = false;
|
|
694
|
+
closed = false;
|
|
695
|
+
/** task id → the file size the last published tail was read at. */
|
|
696
|
+
sizes = new Map();
|
|
697
|
+
/** Task ids whose file failed to read: logged once, until it reads again. */
|
|
698
|
+
failing = new Set();
|
|
699
|
+
constructor(feed, publisher, timers = realPollerTimers, readTailFn = readTail, log = () => { }, sessionId = "") {
|
|
700
|
+
this.feed = feed;
|
|
701
|
+
this.publisher = publisher;
|
|
702
|
+
this.timers = timers;
|
|
703
|
+
this.readTailFn = readTailFn;
|
|
704
|
+
this.log = log;
|
|
705
|
+
this.sessionId = sessionId;
|
|
706
|
+
}
|
|
707
|
+
/** Arms the interval when there is output to watch. Called after a path is recorded. */
|
|
708
|
+
kick() {
|
|
709
|
+
if (this.closed || this.interval !== null)
|
|
710
|
+
return;
|
|
711
|
+
if (this.feed.runningOutputs().length === 0)
|
|
712
|
+
return;
|
|
713
|
+
this.interval = this.timers.setInterval(() => void this.tick(), TAIL_POLL_INTERVAL_MS);
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* The ending's existence check (R1.7): true when `path` reads as a regular
|
|
717
|
+
* file within `ENDING_CHECK_TIMEOUT_MS`. Never rejects.
|
|
718
|
+
*/
|
|
719
|
+
async checkOutput(path) {
|
|
720
|
+
let timer;
|
|
721
|
+
const timeout = new Promise((resolve) => {
|
|
722
|
+
timer = setTimeout(() => resolve(false), ENDING_CHECK_TIMEOUT_MS);
|
|
723
|
+
});
|
|
724
|
+
try {
|
|
725
|
+
return await Promise.race([
|
|
726
|
+
this.readTailFn(path).then(() => true, () => false),
|
|
727
|
+
timeout,
|
|
728
|
+
]);
|
|
729
|
+
}
|
|
730
|
+
finally {
|
|
731
|
+
clearTimeout(timer);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
dispose() {
|
|
735
|
+
this.closed = true;
|
|
736
|
+
this.stop();
|
|
737
|
+
}
|
|
738
|
+
stop() {
|
|
739
|
+
if (this.interval !== null)
|
|
740
|
+
this.timers.clearInterval(this.interval);
|
|
741
|
+
this.interval = null;
|
|
742
|
+
}
|
|
743
|
+
async tick() {
|
|
744
|
+
if (this.busy || this.closed)
|
|
745
|
+
return;
|
|
746
|
+
this.busy = true;
|
|
747
|
+
try {
|
|
748
|
+
const work = this.feed.runningOutputs();
|
|
749
|
+
if (work.length === 0) {
|
|
750
|
+
this.stop();
|
|
751
|
+
this.sizes.clear();
|
|
752
|
+
this.failing.clear();
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
755
|
+
for (const { taskId, path } of work) {
|
|
756
|
+
if (this.closed)
|
|
757
|
+
return;
|
|
758
|
+
let lines = null;
|
|
759
|
+
let readable = false;
|
|
760
|
+
try {
|
|
761
|
+
const size = (await stat(path)).size;
|
|
762
|
+
if (this.sizes.get(taskId) === size)
|
|
763
|
+
continue;
|
|
764
|
+
lines = await this.readTailFn(path);
|
|
765
|
+
this.sizes.set(taskId, size);
|
|
766
|
+
this.failing.delete(taskId);
|
|
767
|
+
readable = true;
|
|
768
|
+
}
|
|
769
|
+
catch (error) {
|
|
770
|
+
this.sizes.delete(taskId);
|
|
771
|
+
if (!this.failing.has(taskId)) {
|
|
772
|
+
this.failing.add(taskId);
|
|
773
|
+
this.log(`[tasks/tail] level=warn sessionId=${field(this.sessionId)} taskId=${field(taskId)} code=${field(codeOf(error))}`);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
if (this.closed)
|
|
777
|
+
return;
|
|
778
|
+
this.publisher.notify(this.feed.setTail(taskId, lines, readable));
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
catch (error) {
|
|
782
|
+
this.log(`[tasks/tail] level=warn sessionId=${field(this.sessionId)} outcome=tick_failed code=${field(codeOf(error))}`);
|
|
783
|
+
}
|
|
784
|
+
finally {
|
|
785
|
+
this.busy = false;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** The most `_claude/tasks/output` ever serves, whatever the client asks for (R2.3). */
|
|
2
|
+
export declare const OUTPUT_MAX_BYTES = 1048576;
|
|
3
|
+
/** Lines kept in a running task's `tail` (R1.2). */
|
|
4
|
+
export declare const TAIL_MAX_LINES = 10;
|
|
5
|
+
/** Code points kept per tail line; a longer line ends in `…` (R1.3). */
|
|
6
|
+
export declare const TAIL_MAX_CHARS = 240;
|
|
7
|
+
/** Bytes read from the end of the file to build a tail. */
|
|
8
|
+
export declare const TAIL_READ_BYTES = 16384;
|
|
9
|
+
/** A file that could not be read. `code` is the fs code, or `not_regular`. */
|
|
10
|
+
export declare class OutputUnavailable extends Error {
|
|
11
|
+
readonly code: string;
|
|
12
|
+
constructor(code: string);
|
|
13
|
+
}
|
|
14
|
+
/** The end of `file`, at most `min(maxBytes, OUTPUT_MAX_BYTES)` bytes (R2.1, R2.3). */
|
|
15
|
+
export declare function readOutput(file: string, maxBytes: number): Promise<{
|
|
16
|
+
content: string;
|
|
17
|
+
totalBytes: number;
|
|
18
|
+
truncated: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
/** The last `TAIL_MAX_LINES` lines of `file`, sanitized (R1.2, R1.3). */
|
|
21
|
+
export declare function readTail(file: string): Promise<string[]>;
|
|
22
|
+
/** One tail line as a terminal would leave it, without escapes or controls (R1.3). */
|
|
23
|
+
export declare function sanitizeLine(line: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* The output path a Bash result names for `taskId`, or null. Only an absolute, normalized path
|
|
26
|
+
* whose file name is exactly `<taskId>.output` is accepted (R1.6): anything else could be
|
|
27
|
+
* another task's file, or no task's.
|
|
28
|
+
*/
|
|
29
|
+
export declare function outputPathFromBashResult(text: string, taskId: string): string | null;
|
|
30
|
+
/** True for an absolute, normalized path whose file name is exactly `<taskId>.output`. */
|
|
31
|
+
export declare function isOutputPathFor(candidate: string, taskId: string): boolean;
|
|
32
|
+
//# sourceMappingURL=task-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-output.d.ts","sourceRoot":"","sources":["../src/task-output.ts"],"names":[],"mappings":"AAgBA,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,UAAY,CAAC;AAC1C,oDAAoD;AACpD,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,wEAAwE;AACxE,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,2DAA2D;AAC3D,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,8EAA8E;AAC9E,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKzB;AAwDD,uFAAuF;AACvF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAMtE;AAED,yEAAyE;AACzE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAK9D;AASD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUjD;AAMD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM1E"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Reading a shell task's output file — story 041.
|
|
2
|
+
//
|
|
3
|
+
// The CLI writes a background shell's output to `<task id>.output` and names that path in the
|
|
4
|
+
// Bash result. This module reads the end of such a file safely, for two consumers: the tail the
|
|
5
|
+
// task feed publishes while the task runs, and `_claude/tasks/output` after it ends.
|
|
6
|
+
//
|
|
7
|
+
// Safety rules, each one a test in `tests/task-output.test.ts`:
|
|
8
|
+
// - only a regular file is read, opened with `O_NOFOLLOW` so a symlink planted at the recorded
|
|
9
|
+
// path is refused (Node's flag covers only the last component, hence the `isFile()` check on
|
|
10
|
+
// the handle as well);
|
|
11
|
+
// - a cut lands on a line boundary, never inside a line or a UTF-8 sequence;
|
|
12
|
+
// - an error carries the fs code and never the file's content.
|
|
13
|
+
import { constants, open } from "node:fs/promises";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
/** The most `_claude/tasks/output` ever serves, whatever the client asks for (R2.3). */
|
|
16
|
+
export const OUTPUT_MAX_BYTES = 1_048_576;
|
|
17
|
+
/** Lines kept in a running task's `tail` (R1.2). */
|
|
18
|
+
export const TAIL_MAX_LINES = 10;
|
|
19
|
+
/** Code points kept per tail line; a longer line ends in `…` (R1.3). */
|
|
20
|
+
export const TAIL_MAX_CHARS = 240;
|
|
21
|
+
/** Bytes read from the end of the file to build a tail. */
|
|
22
|
+
export const TAIL_READ_BYTES = 16_384;
|
|
23
|
+
/** A file that could not be read. `code` is the fs code, or `not_regular`. */
|
|
24
|
+
export class OutputUnavailable extends Error {
|
|
25
|
+
code;
|
|
26
|
+
constructor(code) {
|
|
27
|
+
super(`task output unavailable (${code})`);
|
|
28
|
+
this.name = "OutputUnavailable";
|
|
29
|
+
this.code = code;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function unavailable(error) {
|
|
33
|
+
if (error instanceof OutputUnavailable)
|
|
34
|
+
return error;
|
|
35
|
+
const code = typeof error === "object" && error !== null && "code" in error && typeof error.code === "string"
|
|
36
|
+
? error.code
|
|
37
|
+
: "unknown";
|
|
38
|
+
return new OutputUnavailable(code);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reads the last `maxBytes` of `file`, cut on a line boundary. When the file is longer, one byte
|
|
42
|
+
* before the window is read too: everything up to and including the first `\n` is dropped, so a
|
|
43
|
+
* window that already starts on a line keeps that line. A window holding no `\n` is kept whole.
|
|
44
|
+
*/
|
|
45
|
+
async function readWindow(file, maxBytes) {
|
|
46
|
+
let handle;
|
|
47
|
+
try {
|
|
48
|
+
// O_NONBLOCK: opening a FIFO for reading would otherwise wait for a writer
|
|
49
|
+
// forever; with it the open returns, and `isFile()` below refuses the FIFO.
|
|
50
|
+
handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw unavailable(error);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const stats = await handle.stat();
|
|
57
|
+
if (!stats.isFile())
|
|
58
|
+
throw new OutputUnavailable("not_regular");
|
|
59
|
+
const totalBytes = stats.size;
|
|
60
|
+
const truncated = totalBytes > maxBytes;
|
|
61
|
+
const start = truncated ? totalBytes - maxBytes - 1 : 0;
|
|
62
|
+
const length = totalBytes - start;
|
|
63
|
+
const buffer = Buffer.alloc(length);
|
|
64
|
+
let read = 0;
|
|
65
|
+
while (read < length) {
|
|
66
|
+
const { bytesRead } = await handle.read(buffer, read, length - read, start + read);
|
|
67
|
+
if (bytesRead === 0)
|
|
68
|
+
break; // the file shrank between fstat and read
|
|
69
|
+
read += bytesRead;
|
|
70
|
+
}
|
|
71
|
+
let bytes = buffer.subarray(0, read);
|
|
72
|
+
if (truncated) {
|
|
73
|
+
const newline = bytes.indexOf(0x0a);
|
|
74
|
+
bytes = newline === -1 ? bytes.subarray(1) : bytes.subarray(newline + 1);
|
|
75
|
+
}
|
|
76
|
+
return { bytes, totalBytes, truncated };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw unavailable(error);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await handle.close().catch(() => { });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const decode = (bytes) => new TextDecoder("utf-8", { fatal: false }).decode(bytes);
|
|
86
|
+
/** The end of `file`, at most `min(maxBytes, OUTPUT_MAX_BYTES)` bytes (R2.1, R2.3). */
|
|
87
|
+
export async function readOutput(file, maxBytes) {
|
|
88
|
+
const { bytes, totalBytes, truncated } = await readWindow(file, Math.min(maxBytes, OUTPUT_MAX_BYTES));
|
|
89
|
+
return { content: decode(bytes), totalBytes, truncated };
|
|
90
|
+
}
|
|
91
|
+
/** The last `TAIL_MAX_LINES` lines of `file`, sanitized (R1.2, R1.3). */
|
|
92
|
+
export async function readTail(file) {
|
|
93
|
+
const { bytes } = await readWindow(file, TAIL_READ_BYTES);
|
|
94
|
+
const lines = decode(bytes).split("\n");
|
|
95
|
+
if (lines.at(-1) === "")
|
|
96
|
+
lines.pop();
|
|
97
|
+
return lines.slice(-TAIL_MAX_LINES).map(sanitizeLine);
|
|
98
|
+
}
|
|
99
|
+
/* eslint-disable no-control-regex -- these patterns exist to match terminal control bytes */
|
|
100
|
+
const CSI = /\x1b\[[0-?]*[ -/]*[@-~]/g;
|
|
101
|
+
const OSC = /\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g;
|
|
102
|
+
const OTHER_ESCAPE = /\x1b[\s\S]?/g;
|
|
103
|
+
const CONTROL = /[\x00-\x08\x0b-\x1f\x7f]/g;
|
|
104
|
+
/* eslint-enable no-control-regex */
|
|
105
|
+
/** One tail line as a terminal would leave it, without escapes or controls (R1.3). */
|
|
106
|
+
export function sanitizeLine(line) {
|
|
107
|
+
const redrawn = line.slice(line.lastIndexOf("\r") + 1);
|
|
108
|
+
const clean = redrawn
|
|
109
|
+
.replace(OSC, "")
|
|
110
|
+
.replace(CSI, "")
|
|
111
|
+
.replace(OTHER_ESCAPE, "")
|
|
112
|
+
.replace(CONTROL, "");
|
|
113
|
+
const chars = [...clean];
|
|
114
|
+
if (chars.length <= TAIL_MAX_CHARS)
|
|
115
|
+
return clean;
|
|
116
|
+
return chars.slice(0, TAIL_MAX_CHARS - 1).join("") + "…";
|
|
117
|
+
}
|
|
118
|
+
// The CLI ends the sentence with a period (2.1.285: "…/tasks/<id>.output."), so
|
|
119
|
+
// one trailing punctuation mark is not part of the path.
|
|
120
|
+
const OUTPUT_NOTICE = /Output is being written to: (\S+?)[.,;:]?(?:\s|$)/;
|
|
121
|
+
/**
|
|
122
|
+
* The output path a Bash result names for `taskId`, or null. Only an absolute, normalized path
|
|
123
|
+
* whose file name is exactly `<taskId>.output` is accepted (R1.6): anything else could be
|
|
124
|
+
* another task's file, or no task's.
|
|
125
|
+
*/
|
|
126
|
+
export function outputPathFromBashResult(text, taskId) {
|
|
127
|
+
const candidate = text.match(OUTPUT_NOTICE)?.[1];
|
|
128
|
+
return candidate !== undefined && isOutputPathFor(candidate, taskId) ? candidate : null;
|
|
129
|
+
}
|
|
130
|
+
/** True for an absolute, normalized path whose file name is exactly `<taskId>.output`. */
|
|
131
|
+
export function isOutputPathFor(candidate, taskId) {
|
|
132
|
+
return (path.isAbsolute(candidate) &&
|
|
133
|
+
path.normalize(candidate) === candidate &&
|
|
134
|
+
path.basename(candidate) === `${taskId}.output`);
|
|
135
|
+
}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.26.0",
|
|
7
7
|
"description": "Claude Code in Zed and other ACP clients with the VS Code extension's UX — multi-select questions, refusal consent, live quota windows, background tasks, Ultracode effort and session notices. Fork of claude-agent-acp.",
|
|
8
8
|
"main": "dist/lib.js",
|
|
9
9
|
"types": "dist/lib.d.ts",
|