@agentclientprotocol/claude-agent-acp 0.94.1-preview.8 → 0.95.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 +14 -5
- package/dist/acp-agent.d.ts +1 -0
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +124 -3
- package/dist/async-tasks.d.ts +6 -3
- package/dist/async-tasks.d.ts.map +1 -1
- package/dist/async-tasks.js +13 -5
- package/dist/native-subagents.d.ts +71 -1
- package/dist/native-subagents.d.ts.map +1 -1
- package/dist/native-subagents.js +309 -10
- package/dist/session-effort.d.ts +1 -0
- package/dist/session-effort.d.ts.map +1 -1
- package/dist/session-effort.js +7 -4
- package/dist/subagent-history.d.ts +7 -3
- package/dist/subagent-history.d.ts.map +1 -1
- package/dist/subagent-history.js +7 -3
- package/dist/subagent-replay.d.ts +21 -1
- package/dist/subagent-replay.d.ts.map +1 -1
- package/dist/subagent-replay.js +51 -3
- package/dist/tools.js +1 -1
- package/dist/usage-markdown.d.ts.map +1 -1
- package/dist/usage-markdown.js +18 -0
- package/package.json +6 -7
package/dist/native-subagents.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { RequestError } from "@agentclientprotocol/sdk/unstable";
|
|
1
|
+
import { RequestError, } from "@agentclientprotocol/sdk/unstable";
|
|
2
2
|
import { AIR_SUBAGENT_KEY, airExtensionMeta } from "./air-extension.js";
|
|
3
|
+
import { isFinalToolCallStatus } from "./tool-calls/renderer.js";
|
|
3
4
|
const MAX_PENDING_PARENTS = 64;
|
|
4
5
|
const MAX_PENDING_UPDATES = 256;
|
|
5
6
|
const MAX_PENDING_UPDATES_PER_PARENT = 32;
|
|
@@ -24,6 +25,7 @@ export class NativeSubagentRuntime {
|
|
|
24
25
|
parentByToolUse;
|
|
25
26
|
identityByToolUse = new Map();
|
|
26
27
|
controlByToolUse = new Map();
|
|
28
|
+
configBySession = new Map();
|
|
27
29
|
childByParentToolUse = new Map();
|
|
28
30
|
/**
|
|
29
31
|
* The child session of each tool call that went to a child session. A later
|
|
@@ -34,6 +36,18 @@ export class NativeSubagentRuntime {
|
|
|
34
36
|
taskFinishPromises = new Map();
|
|
35
37
|
/** The session that made each SendMessage call. */
|
|
36
38
|
senderByToolUse = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* The RFD form: the Agent/Task calls that the client is not shown, until
|
|
41
|
+
* their final update. Kept by id because the adapter's own report that
|
|
42
|
+
* closes an unfinished call has no `toolName` to recognize it by.
|
|
43
|
+
*/
|
|
44
|
+
hiddenLaunches = new Map();
|
|
45
|
+
/**
|
|
46
|
+
* The RFD form: the SubagentHandback calls of announced children that the
|
|
47
|
+
* client is not shown yet, with their first report, the report from their
|
|
48
|
+
* input, and the call that delegated the run.
|
|
49
|
+
*/
|
|
50
|
+
handbacks = new Map();
|
|
37
51
|
generationByTaskId = new Map();
|
|
38
52
|
pending = new Map();
|
|
39
53
|
pendingCount = 0;
|
|
@@ -80,10 +94,85 @@ export class NativeSubagentRuntime {
|
|
|
80
94
|
this.rememberSendMessage(routed);
|
|
81
95
|
return routed;
|
|
82
96
|
}
|
|
97
|
+
/** Report the model of a child response, not the parent's model or a launch-time alias. */
|
|
98
|
+
async reportModel(parentToolUseId, model, deliver) {
|
|
99
|
+
if (this.form !== "rfd" || !parentToolUseId || !model || model === "<synthetic>") {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
await deliver({
|
|
103
|
+
sessionId: this.rootSessionId,
|
|
104
|
+
update: {
|
|
105
|
+
sessionUpdate: "config_option_update",
|
|
106
|
+
configOptions: [
|
|
107
|
+
{
|
|
108
|
+
id: "model",
|
|
109
|
+
name: "Model",
|
|
110
|
+
category: "model",
|
|
111
|
+
type: "select",
|
|
112
|
+
currentValue: model,
|
|
113
|
+
options: [{ value: model, name: model }],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
_meta: { claudeCode: { parentToolUseId } },
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/** Hook observations can precede the task event that establishes a child's parent. */
|
|
121
|
+
async reportConfiguration(agentId, options, meta) {
|
|
122
|
+
if (this.form !== "rfd" || agentId === this.rootSessionId || options.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
let config = this.configBySession.get(agentId);
|
|
125
|
+
if (!config) {
|
|
126
|
+
const pending = [...this.configBySession.keys()].filter((id) => !this.children.has(id)).length;
|
|
127
|
+
if (!this.children.has(agentId) && pending >= MAX_PENDING_PARENTS) {
|
|
128
|
+
this.logger.log(`Session ${this.rootSessionId}: dropping configuration for unannounced subagent ${agentId}; pending buffer limit reached`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
config = { options: new Map(), publishing: Promise.resolve() };
|
|
132
|
+
this.configBySession.set(agentId, config);
|
|
133
|
+
}
|
|
134
|
+
for (const option of options)
|
|
135
|
+
config.options.set(option.id, option);
|
|
136
|
+
const child = this.children.get(agentId);
|
|
137
|
+
if (child?.announced)
|
|
138
|
+
await this.publishConfiguration(child, meta);
|
|
139
|
+
}
|
|
140
|
+
async publishConfiguration(child, meta) {
|
|
141
|
+
const config = this.configBySession.get(child.sessionId);
|
|
142
|
+
if (!config)
|
|
143
|
+
return;
|
|
144
|
+
// SDK hooks can run concurrently with streamed responses. Serialize snapshots
|
|
145
|
+
// so a delayed publication cannot replace newer settings with older ones.
|
|
146
|
+
const publishing = config.publishing.then(async () => {
|
|
147
|
+
if (this.configBySession.get(child.sessionId) !== config)
|
|
148
|
+
return;
|
|
149
|
+
const priority = ["mode", "model", "thought_level", "model_config"];
|
|
150
|
+
const rank = (option) => {
|
|
151
|
+
const index = priority.indexOf(option.category ?? "");
|
|
152
|
+
return index < 0 ? priority.length : index;
|
|
153
|
+
};
|
|
154
|
+
const configOptions = [...config.options.values()].sort((left, right) => rank(left) - rank(right));
|
|
155
|
+
const snapshot = JSON.stringify(configOptions);
|
|
156
|
+
if (config.published === snapshot)
|
|
157
|
+
return;
|
|
158
|
+
await this.publish({
|
|
159
|
+
sessionId: child.sessionId,
|
|
160
|
+
update: {
|
|
161
|
+
sessionUpdate: "config_option_update",
|
|
162
|
+
configOptions,
|
|
163
|
+
...(meta ? { _meta: meta } : {}),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
config.published = snapshot;
|
|
167
|
+
});
|
|
168
|
+
// The caller receives the error; later observations must still be able to retry.
|
|
169
|
+
config.publishing = publishing.catch(() => { });
|
|
170
|
+
await publishing;
|
|
171
|
+
}
|
|
83
172
|
async routeUpdate(notification, deliver, forcedSessionId) {
|
|
84
173
|
const { update } = notification;
|
|
85
174
|
const claudeMeta = update._meta?.claudeCode;
|
|
86
|
-
const isControl =
|
|
175
|
+
const isControl = this.isControlUpdate(update);
|
|
87
176
|
if (!this.enabled)
|
|
88
177
|
return notification;
|
|
89
178
|
if (this.enabled && isControl) {
|
|
@@ -126,12 +215,18 @@ export class NativeSubagentRuntime {
|
|
|
126
215
|
if (forcedSessionId) {
|
|
127
216
|
return { ...notification, sessionId: forcedSessionId };
|
|
128
217
|
}
|
|
129
|
-
return
|
|
218
|
+
return unexposedControlFallback(initial, notification, parentSessionId ?? this.rootSessionId);
|
|
130
219
|
}
|
|
131
220
|
return forcedSessionId ? { ...notification, sessionId: forcedSessionId } : null;
|
|
132
221
|
}
|
|
133
|
-
// The RFD form: the
|
|
134
|
-
//
|
|
222
|
+
// The RFD form: the parent's session messages replace the Agent/Task
|
|
223
|
+
// tool call, its prompt as the parent's outgoing message (see
|
|
224
|
+
// `linkedSessionMessages`) and its result as the child's reply (see
|
|
225
|
+
// `launchReply`). A call made inside a child that is not announced yet
|
|
226
|
+
// is buffered below, as any update of that child.
|
|
227
|
+
if (!parentPending) {
|
|
228
|
+
return this.routeRfdLaunch(notification, child, parentSessionId ?? this.rootSessionId, forcedSessionId);
|
|
229
|
+
}
|
|
135
230
|
}
|
|
136
231
|
const toolCallId = update.sessionUpdate === "tool_call" || update.sessionUpdate === "tool_call_update"
|
|
137
232
|
? update.toolCallId
|
|
@@ -147,6 +242,19 @@ export class NativeSubagentRuntime {
|
|
|
147
242
|
return { ...notification, sessionId: forcedSessionId };
|
|
148
243
|
}
|
|
149
244
|
const owner = toolCallId ? this.childByToolCall.get(toolCallId) : undefined;
|
|
245
|
+
const announcedChild = owner ??
|
|
246
|
+
(claudeMeta?.parentToolUseId
|
|
247
|
+
? this.childByParentToolUse.get(claudeMeta.parentToolUseId)
|
|
248
|
+
: undefined);
|
|
249
|
+
if (this.form === "rfd" && announcedChild?.announced) {
|
|
250
|
+
if (update.sessionUpdate === "config_option_update") {
|
|
251
|
+
await this.reportConfiguration(announcedChild.sessionId, update.configOptions, update._meta);
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
const handback = await this.routeRfdHandback(notification, announcedChild);
|
|
255
|
+
if (handback !== undefined)
|
|
256
|
+
return handback;
|
|
257
|
+
}
|
|
150
258
|
if (owner)
|
|
151
259
|
return this.toChild(owner, notification, toolCallId);
|
|
152
260
|
if (this.enabled && claudeMeta?.parentToolUseId) {
|
|
@@ -392,6 +500,7 @@ export class NativeSubagentRuntime {
|
|
|
392
500
|
this.pendingCount = 0;
|
|
393
501
|
this.identityByToolUse.clear();
|
|
394
502
|
this.controlByToolUse.clear();
|
|
503
|
+
this.configBySession.clear();
|
|
395
504
|
this.parentByToolUse.clear();
|
|
396
505
|
this.forgetRestores();
|
|
397
506
|
}
|
|
@@ -676,6 +785,7 @@ export class NativeSubagentRuntime {
|
|
|
676
785
|
*/
|
|
677
786
|
withdraw(taskId, child) {
|
|
678
787
|
this.children.delete(taskId);
|
|
788
|
+
this.configBySession.delete(child.sessionId);
|
|
679
789
|
if (child.parentToolUseId) {
|
|
680
790
|
this.takePending(child.parentToolUseId);
|
|
681
791
|
this.cleanupControl(child.parentToolUseId);
|
|
@@ -696,6 +806,7 @@ export class NativeSubagentRuntime {
|
|
|
696
806
|
async announce(child) {
|
|
697
807
|
if (this.form)
|
|
698
808
|
await announceNativeSubagent(child, this.publish, this.form);
|
|
809
|
+
await this.publishConfiguration(child);
|
|
699
810
|
}
|
|
700
811
|
/** The RFD form: publishes the work state of `child` on its parent. */
|
|
701
812
|
async reportState(child, state) {
|
|
@@ -762,6 +873,94 @@ export class NativeSubagentRuntime {
|
|
|
762
873
|
this.senderByToolUse.delete(oldest);
|
|
763
874
|
}
|
|
764
875
|
}
|
|
876
|
+
/**
|
|
877
|
+
* The RFD form: an update of the Agent/Task call that launches `child`,
|
|
878
|
+
* which the parent's session messages replace. Only a launch whose child
|
|
879
|
+
* was never exposed stays a tool call of the parent, with its final status,
|
|
880
|
+
* since the RFD lets the Agent represent unexposed work through the parent.
|
|
881
|
+
* A background launch completes before its child starts, so its completion
|
|
882
|
+
* is not such a case.
|
|
883
|
+
*/
|
|
884
|
+
async routeRfdLaunch(notification, child, parentSessionId, forcedSessionId) {
|
|
885
|
+
const { update } = notification;
|
|
886
|
+
if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update") {
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
const toolCallId = update.toolCallId;
|
|
890
|
+
// A permission request already showed the call to the client, so it
|
|
891
|
+
// keeps getting its updates.
|
|
892
|
+
if (forcedSessionId)
|
|
893
|
+
return { ...notification, sessionId: forcedSessionId };
|
|
894
|
+
const launch = this.hiddenLaunches.get(toolCallId) ?? { background: false };
|
|
895
|
+
if (isBackgroundLaunch(update.rawInput))
|
|
896
|
+
launch.background = true;
|
|
897
|
+
if (!isFinalToolCallStatus(update.status)) {
|
|
898
|
+
this.hiddenLaunches.set(toolCallId, launch);
|
|
899
|
+
return null;
|
|
900
|
+
}
|
|
901
|
+
this.hiddenLaunches.delete(toolCallId);
|
|
902
|
+
if (child?.announcePromise)
|
|
903
|
+
await child.announcePromise;
|
|
904
|
+
const background = launch.background;
|
|
905
|
+
if (child?.announced) {
|
|
906
|
+
const reply = update.status === "completed" && !background && !child.handedBack?.has(toolCallId)
|
|
907
|
+
? launchReply(toolCallId, child.sessionId, child.parentSessionId, update)
|
|
908
|
+
: undefined;
|
|
909
|
+
if (reply)
|
|
910
|
+
await this.publish(reply);
|
|
911
|
+
return null;
|
|
912
|
+
}
|
|
913
|
+
if (background && update.status === "completed")
|
|
914
|
+
return null;
|
|
915
|
+
this.takePending(toolCallId);
|
|
916
|
+
const initial = this.controlByToolUse.get(toolCallId);
|
|
917
|
+
this.cleanupControl(toolCallId);
|
|
918
|
+
return unexposedControlFallback(initial, notification, parentSessionId);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* The RFD form: an update of a SubagentHandback call of the announced
|
|
922
|
+
* `child`, which its report replaces: the child's message to its parent,
|
|
923
|
+
* see {@link linkedSessionMessages}. A failed call delivered nothing, so the
|
|
924
|
+
* child is shown the call after all. `undefined` for any other update.
|
|
925
|
+
*/
|
|
926
|
+
async routeRfdHandback(notification, child) {
|
|
927
|
+
const { update } = notification;
|
|
928
|
+
if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update") {
|
|
929
|
+
return undefined;
|
|
930
|
+
}
|
|
931
|
+
const claudeMeta = update._meta?.claudeCode;
|
|
932
|
+
let handback = this.handbacks.get(update.toolCallId);
|
|
933
|
+
if (!handback) {
|
|
934
|
+
if (claudeMeta?.toolName !== HANDBACK_TOOL)
|
|
935
|
+
return undefined;
|
|
936
|
+
handback = {
|
|
937
|
+
initial: notification,
|
|
938
|
+
delegationId: claudeMeta.parentToolUseId ?? child.parentToolUseId,
|
|
939
|
+
};
|
|
940
|
+
this.handbacks.set(update.toolCallId, handback);
|
|
941
|
+
}
|
|
942
|
+
handback.message = handbackMessage(update.rawInput) ?? handback.message;
|
|
943
|
+
if (!isFinalToolCallStatus(update.status))
|
|
944
|
+
return null;
|
|
945
|
+
this.handbacks.delete(update.toolCallId);
|
|
946
|
+
if (update.status === "completed" && handback.message) {
|
|
947
|
+
for (const view of linkedSessionMessages(update.toolCallId, child.sessionId, child.parentSessionId, handback.message)) {
|
|
948
|
+
await this.publish(view);
|
|
949
|
+
}
|
|
950
|
+
if (handback.delegationId)
|
|
951
|
+
(child.handedBack ??= new Set()).add(handback.delegationId);
|
|
952
|
+
return null;
|
|
953
|
+
}
|
|
954
|
+
return unexposedControlFallback(handback.initial, notification, child.sessionId);
|
|
955
|
+
}
|
|
956
|
+
/** Whether `update` is of an Agent/Task call, by its tool name or, in the
|
|
957
|
+
* RFD form, by the id of a call the client is not shown. */
|
|
958
|
+
isControlUpdate(update) {
|
|
959
|
+
if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update") {
|
|
960
|
+
return false;
|
|
961
|
+
}
|
|
962
|
+
return this.hiddenLaunches.has(update.toolCallId) || isNativeSubagentControlUpdate(update);
|
|
963
|
+
}
|
|
765
964
|
rememberToolCallOwner(toolCallId, child) {
|
|
766
965
|
this.childByToolCall.delete(toolCallId);
|
|
767
966
|
this.childByToolCall.set(toolCallId, child);
|
|
@@ -805,9 +1004,12 @@ export class NativeSubagentRuntime {
|
|
|
805
1004
|
this.parentByToolUse.clear();
|
|
806
1005
|
this.identityByToolUse.clear();
|
|
807
1006
|
this.controlByToolUse.clear();
|
|
1007
|
+
this.configBySession.clear();
|
|
808
1008
|
this.childByParentToolUse.clear();
|
|
809
1009
|
this.taskFinishPromises.clear();
|
|
810
1010
|
this.senderByToolUse.clear();
|
|
1011
|
+
this.hiddenLaunches.clear();
|
|
1012
|
+
this.handbacks.clear();
|
|
811
1013
|
this.generationByTaskId.clear();
|
|
812
1014
|
this.pending.clear();
|
|
813
1015
|
this.pendingCount = 0;
|
|
@@ -949,7 +1151,7 @@ export async function announceNativeSubagent(child, publish, form) {
|
|
|
949
1151
|
child.announced = true;
|
|
950
1152
|
// The immediate parent made the Agent/Task call that launched the child.
|
|
951
1153
|
if (child.prompt) {
|
|
952
|
-
await publishPrompt(child, child.prompt, child.parentToolUseId, child.parentSessionId, publish);
|
|
1154
|
+
await publishPrompt(child, child.prompt, child.parentToolUseId, child.parentSessionId, publish, { replacesLaunch: true });
|
|
953
1155
|
}
|
|
954
1156
|
return;
|
|
955
1157
|
}
|
|
@@ -1008,13 +1210,23 @@ export async function finishNativeSubagent(session, taskId, state, publish) {
|
|
|
1008
1210
|
* Agent/Task call or a SendMessage, so a prompt whose id is already in the
|
|
1009
1211
|
* transcript is the same delegation and is not sent again. `sender` is the
|
|
1010
1212
|
* session that made that call, when known.
|
|
1213
|
+
*
|
|
1214
|
+
* A launch's prompt (`replacesLaunch`) also goes to the parent, see
|
|
1215
|
+
* {@link linkedSessionMessages}. A SendMessage call stays a tool call of the
|
|
1216
|
+
* sender, so its message has only the incoming view.
|
|
1011
1217
|
*/
|
|
1012
|
-
async function publishPrompt(child, prompt, toolUseId, sender, publish) {
|
|
1218
|
+
async function publishPrompt(child, prompt, toolUseId, sender, publish, { replacesLaunch = false } = {}) {
|
|
1013
1219
|
child.promptIds ??= new Set();
|
|
1014
1220
|
const messageId = toolUseId ?? `${child.sessionId}:prompt:${child.promptIds.size + 1}`;
|
|
1015
1221
|
if (child.promptIds.has(messageId))
|
|
1016
1222
|
return;
|
|
1017
1223
|
child.promptIds.add(messageId);
|
|
1224
|
+
if (replacesLaunch && sender !== undefined && toolUseId !== undefined) {
|
|
1225
|
+
for (const view of linkedSessionMessages(toolUseId, sender, child.sessionId, prompt)) {
|
|
1226
|
+
await publish(view);
|
|
1227
|
+
}
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1018
1230
|
await publish({
|
|
1019
1231
|
sessionId: child.sessionId,
|
|
1020
1232
|
update: {
|
|
@@ -1026,6 +1238,87 @@ async function publishPrompt(child, prompt, toolUseId, sender, publish) {
|
|
|
1026
1238
|
},
|
|
1027
1239
|
});
|
|
1028
1240
|
}
|
|
1241
|
+
/**
|
|
1242
|
+
* The RFD form: a message that a tool call sent, which the client is not
|
|
1243
|
+
* shown, as two session messages: the sender's outgoing view, then the
|
|
1244
|
+
* recipient's incoming one. That call is a launch's Agent/Task call, whose
|
|
1245
|
+
* prompt goes from the parent to the child, or a child's SubagentHandback
|
|
1246
|
+
* call, whose report goes from the child to the parent. Both views use the
|
|
1247
|
+
* call's tool use id, and each names the other with the draft RFD's
|
|
1248
|
+
* `recipientMessageId` and `senderMessageId`.
|
|
1249
|
+
*/
|
|
1250
|
+
export function linkedSessionMessages(toolUseId, senderSessionId, recipientSessionId, text) {
|
|
1251
|
+
const message = {
|
|
1252
|
+
sessionUpdate: "session_message",
|
|
1253
|
+
messageId: toolUseId,
|
|
1254
|
+
senderSessionId,
|
|
1255
|
+
recipientSessionId,
|
|
1256
|
+
content: [{ type: "text", text }],
|
|
1257
|
+
};
|
|
1258
|
+
return [
|
|
1259
|
+
{
|
|
1260
|
+
sessionId: senderSessionId,
|
|
1261
|
+
update: { ...message, recipientMessageId: toolUseId },
|
|
1262
|
+
},
|
|
1263
|
+
{
|
|
1264
|
+
sessionId: recipientSessionId,
|
|
1265
|
+
update: { ...message, senderMessageId: toolUseId },
|
|
1266
|
+
},
|
|
1267
|
+
];
|
|
1268
|
+
}
|
|
1269
|
+
/**
|
|
1270
|
+
* The tool with which a child hands its report to its parent, when Claude
|
|
1271
|
+
* Code runs in hand-back mode. The Agent/Task result then only says that the
|
|
1272
|
+
* report was delivered as a message, with `handback: "send"` in its
|
|
1273
|
+
* structured result.
|
|
1274
|
+
*/
|
|
1275
|
+
export const HANDBACK_TOOL = "SubagentHandback";
|
|
1276
|
+
/** The report of a SubagentHandback call, from its input. */
|
|
1277
|
+
export function handbackMessage(input) {
|
|
1278
|
+
const message = input?.message;
|
|
1279
|
+
return typeof message === "string" && message.trim() ? message : undefined;
|
|
1280
|
+
}
|
|
1281
|
+
/**
|
|
1282
|
+
* The RFD form: the answer of a foreground child, from the completed result
|
|
1283
|
+
* of the Agent/Task call `launchId` that launched it, as the child's message
|
|
1284
|
+
* in the parent's transcript (its incoming view). It replaces that call's
|
|
1285
|
+
* result, which the parent is not shown. The child's transcript has its
|
|
1286
|
+
* answer as its own agent message, not as a session message, so this view
|
|
1287
|
+
* links to no other. `undefined` for a result without text. Not used for a
|
|
1288
|
+
* run whose child handed back its report: the result has no report then.
|
|
1289
|
+
*/
|
|
1290
|
+
export function launchReply(launchId, childSessionId, parentSessionId, result) {
|
|
1291
|
+
const content = replyContent(result);
|
|
1292
|
+
if (content.length === 0)
|
|
1293
|
+
return undefined;
|
|
1294
|
+
return {
|
|
1295
|
+
sessionId: parentSessionId,
|
|
1296
|
+
update: {
|
|
1297
|
+
sessionUpdate: "session_message",
|
|
1298
|
+
messageId: `${launchId}:reply`,
|
|
1299
|
+
senderSessionId: childSessionId,
|
|
1300
|
+
recipientSessionId: parentSessionId,
|
|
1301
|
+
content,
|
|
1302
|
+
},
|
|
1303
|
+
};
|
|
1304
|
+
}
|
|
1305
|
+
/**
|
|
1306
|
+
* The text of a completed launch's result, from the tool call's `content`:
|
|
1307
|
+
* `AgentReporter` removed the parts meant for the model there (the
|
|
1308
|
+
* `agentId: … (use SendMessage …)` line, the `<usage>` block and the hand-back
|
|
1309
|
+
* frame), which `rawOutput` still has.
|
|
1310
|
+
*/
|
|
1311
|
+
function replyContent(result) {
|
|
1312
|
+
return (result.content ?? []).flatMap((item) => item.type === "content" && item.content.type === "text" && item.content.text.trim()
|
|
1313
|
+
? [{ type: "text", text: item.content.text }]
|
|
1314
|
+
: []);
|
|
1315
|
+
}
|
|
1316
|
+
/** Whether an Agent/Task call's input runs its child in the background. */
|
|
1317
|
+
function isBackgroundLaunch(rawInput) {
|
|
1318
|
+
return (typeof rawInput === "object" &&
|
|
1319
|
+
rawInput !== null &&
|
|
1320
|
+
rawInput.run_in_background === true);
|
|
1321
|
+
}
|
|
1029
1322
|
/** The RFD form: whether the child's foreground work is in progress. */
|
|
1030
1323
|
function isWorking(child) {
|
|
1031
1324
|
return child.workState === "running" || child.workState === "requires_action";
|
|
@@ -1165,7 +1458,13 @@ function isFailedToolCallUpdate(update) {
|
|
|
1165
1458
|
return ((update.sessionUpdate === "tool_call" || update.sessionUpdate === "tool_call_update") &&
|
|
1166
1459
|
update.status === "failed");
|
|
1167
1460
|
}
|
|
1168
|
-
|
|
1461
|
+
/**
|
|
1462
|
+
* A tool call that the client was not shown, as one `tool_call` with its
|
|
1463
|
+
* final status, shown after all: an Agent/Task call whose child was never
|
|
1464
|
+
* exposed (AIR's draft shows only a failed one, the RFD form also a completed
|
|
1465
|
+
* one), or a failed SubagentHandback call.
|
|
1466
|
+
*/
|
|
1467
|
+
function unexposedControlFallback(initial, terminal, sessionId) {
|
|
1169
1468
|
if (terminal.update.sessionUpdate !== "tool_call" &&
|
|
1170
1469
|
terminal.update.sessionUpdate !== "tool_call_update") {
|
|
1171
1470
|
return { ...terminal, sessionId };
|
|
@@ -1178,7 +1477,7 @@ function failedControlFallback(initial, terminal, sessionId) {
|
|
|
1178
1477
|
update: {
|
|
1179
1478
|
...terminal.update,
|
|
1180
1479
|
sessionUpdate: "tool_call",
|
|
1181
|
-
status: "failed",
|
|
1480
|
+
status: terminal.update.status ?? "failed",
|
|
1182
1481
|
// The synthesized tool_call is this call's first report, so give it
|
|
1183
1482
|
// the standard `name` the initial one would have carried.
|
|
1184
1483
|
...(typeof claudeMeta?.toolName === "string" ? { name: claudeMeta.toolName } : {}),
|
|
@@ -1198,7 +1497,7 @@ function failedControlFallback(initial, terminal, sessionId) {
|
|
|
1198
1497
|
...initial.update,
|
|
1199
1498
|
...terminal.update,
|
|
1200
1499
|
sessionUpdate: "tool_call",
|
|
1201
|
-
status: "failed",
|
|
1500
|
+
status: terminal.update.status ?? "failed",
|
|
1202
1501
|
title: typeof terminal.update.title === "string" && terminal.update.title.trim().length > 0
|
|
1203
1502
|
? terminal.update.title
|
|
1204
1503
|
: initial.update.title,
|
package/dist/session-effort.d.ts
CHANGED
|
@@ -14,5 +14,6 @@ export declare function settingsEffortForModel(settings: Settings, modelInfo: Mo
|
|
|
14
14
|
* matching the SDK. Keep unrelated per-model entries from lower tiers while
|
|
15
15
|
* replacing entries supplied at the programmatic tier. */
|
|
16
16
|
export declare function mergeEffortSettings(base: Settings, override: Settings | undefined): Settings;
|
|
17
|
+
export declare function effortLevelName(level: string): string;
|
|
17
18
|
export declare function buildEffortConfigOption(modelInfos: ModelInfo[], currentModelId: string, currentEffortLevel: string | undefined, useRecommendedValue: boolean): SessionConfigOption | undefined;
|
|
18
19
|
//# sourceMappingURL=session-effort.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-effort.d.ts","sourceRoot":"","sources":["../src/session-effort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAIvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAE9E;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,QAAQ,GACjB;IAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAE,CAGvD;AASD;;2EAE2E;AAC3E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB;AAED;;0DAE0D;AAC1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAkB5F;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,EAAE,EACvB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,mBAAmB,EAAE,OAAO,GAC3B,mBAAmB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"session-effort.d.ts","sourceRoot":"","sources":["../src/session-effort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAIvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAE9E;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,QAAQ,GACjB;IAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAE,CAGvD;AASD;;2EAE2E;AAC3E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB;AAED;;0DAE0D;AAC1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAkB5F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,EAAE,EACvB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,mBAAmB,EAAE,OAAO,GAC3B,mBAAmB,GAAG,SAAS,CAwCjC"}
|
package/dist/session-effort.js
CHANGED
|
@@ -58,6 +58,12 @@ export function mergeEffortSettings(base, override) {
|
|
|
58
58
|
: undefined,
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
|
+
export function effortLevelName(level) {
|
|
62
|
+
return level
|
|
63
|
+
.split(/[_-]/)
|
|
64
|
+
.map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : part))
|
|
65
|
+
.join(" ");
|
|
66
|
+
}
|
|
61
67
|
export function buildEffortConfigOption(modelInfos, currentModelId, currentEffortLevel, useRecommendedValue) {
|
|
62
68
|
const currentModelInfo = modelInfos.find((model) => model.value === currentModelId);
|
|
63
69
|
const supportedLevels = currentModelInfo?.supportsEffort
|
|
@@ -72,10 +78,7 @@ export function buildEffortConfigOption(modelInfos, currentModelId, currentEffor
|
|
|
72
78
|
...(useRecommendedValue ? [] : [{ value: "default", name: "Default" }]),
|
|
73
79
|
...supportedLevels.map((level) => ({
|
|
74
80
|
value: level,
|
|
75
|
-
name: level
|
|
76
|
-
.split(/[_-]/)
|
|
77
|
-
.map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : part))
|
|
78
|
-
.join(" "),
|
|
81
|
+
name: effortLevelName(level),
|
|
79
82
|
})),
|
|
80
83
|
];
|
|
81
84
|
const includes = (level) => (!useRecommendedValue && level === "default") || supportedLevels.includes(level);
|
|
@@ -68,9 +68,13 @@ export declare function readSubagentMessages(sessionId: string, agentId: string,
|
|
|
68
68
|
* The transcript of a `subagent_type: "fork"` child without the context it
|
|
69
69
|
* inherited. A fork transcript starts with a copy of the parent's launching
|
|
70
70
|
* assistant message (its text, thinking and every tool_use, including the
|
|
71
|
-
* Agent call itself), then a user message with a
|
|
72
|
-
*
|
|
73
|
-
* `<fork-boilerplate>…</fork-boilerplate>\nYour directive: <prompt>`.
|
|
71
|
+
* Agent call itself), then a user message with a placeholder tool_result for
|
|
72
|
+
* each of those tool_uses and the text
|
|
73
|
+
* `<fork-boilerplate>…</fork-boilerplate>\nYour directive: <prompt>`. Since
|
|
74
|
+
* Claude Code 2.1.307 the fork's own Agent call gets "Fork started — that fork
|
|
75
|
+
* is you." and the other tool_uses get "This is the parent's call, not
|
|
76
|
+
* yours. …"; before that, every one got "Fork started — processing in
|
|
77
|
+
* background". Only the directive text is matched here. A fork
|
|
74
78
|
* launched from inside a subagent also gets a copy of that subagent's history
|
|
75
79
|
* before them. None of it is the child's own work: replayed as is, the
|
|
76
80
|
* parent's text and tool calls would show again in the child.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-history.d.ts","sourceRoot":"","sources":["../src/subagent-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG7F,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCjF;AAOD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GAC1C,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmD/B;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAW5D;AA0DD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE;IAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GAC1C,OAAO,CAAC,cAAc,EAAE,CAAC,CAW3B;AAyBD
|
|
1
|
+
{"version":3,"file":"subagent-history.d.ts","sourceRoot":"","sources":["../src/subagent-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG7F,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCjF;AAOD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GAC1C,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmD/B;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAW5D;AA0DD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE;IAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GAC1C,OAAO,CAAC,cAAc,EAAE,CAAC,CAW3B;AAyBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAkB5E"}
|
package/dist/subagent-history.js
CHANGED
|
@@ -234,9 +234,13 @@ function isForkDirectiveMessage(message) {
|
|
|
234
234
|
* The transcript of a `subagent_type: "fork"` child without the context it
|
|
235
235
|
* inherited. A fork transcript starts with a copy of the parent's launching
|
|
236
236
|
* assistant message (its text, thinking and every tool_use, including the
|
|
237
|
-
* Agent call itself), then a user message with a
|
|
238
|
-
*
|
|
239
|
-
* `<fork-boilerplate>…</fork-boilerplate>\nYour directive: <prompt>`.
|
|
237
|
+
* Agent call itself), then a user message with a placeholder tool_result for
|
|
238
|
+
* each of those tool_uses and the text
|
|
239
|
+
* `<fork-boilerplate>…</fork-boilerplate>\nYour directive: <prompt>`. Since
|
|
240
|
+
* Claude Code 2.1.307 the fork's own Agent call gets "Fork started — that fork
|
|
241
|
+
* is you." and the other tool_uses get "This is the parent's call, not
|
|
242
|
+
* yours. …"; before that, every one got "Fork started — processing in
|
|
243
|
+
* background". Only the directive text is matched here. A fork
|
|
240
244
|
* launched from inside a subagent also gets a copy of that subagent's history
|
|
241
245
|
* before them. None of it is the child's own work: replayed as is, the
|
|
242
246
|
* parent's text and tool calls would show again in the child.
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
* history to the child session. Every child's end goes out before the replay
|
|
9
9
|
* ends, since no subagent from before the reload still runs.
|
|
10
10
|
*
|
|
11
|
+
* As live, the parent is not shown the Agent or Task call of a child that the
|
|
12
|
+
* replay announces: the launch's prompt is the parent's outgoing message, and
|
|
13
|
+
* a foreground child's answer is its reply to the parent. A child's
|
|
14
|
+
* successful SubagentHandback call is its message to the parent instead.
|
|
15
|
+
* Unlike live, the replay does not tell runs apart, so a child that handed
|
|
16
|
+
* back any report gets no reply from its launch's result.
|
|
17
|
+
*
|
|
11
18
|
* A launch without metadata has no known id, so it is not announced: the RFD
|
|
12
19
|
* forbids inventing one. Its Agent call stays an ordinary tool call of the
|
|
13
20
|
* parent, and a notice says that subagent history is missing.
|
|
@@ -33,6 +40,8 @@ export type ReplayChild = {
|
|
|
33
40
|
notified?: SubagentState;
|
|
34
41
|
announced: boolean;
|
|
35
42
|
promptSent: boolean;
|
|
43
|
+
/** Whether it handed a report to its parent with a SubagentHandback call. */
|
|
44
|
+
handedBack?: boolean;
|
|
36
45
|
};
|
|
37
46
|
export declare class RfdSubagentReplay {
|
|
38
47
|
private readonly history;
|
|
@@ -45,6 +54,8 @@ export declare class RfdSubagentReplay {
|
|
|
45
54
|
private readonly omitted;
|
|
46
55
|
/** Children whose transcript could not be read: only their association is replayed. */
|
|
47
56
|
private withoutHistory;
|
|
57
|
+
/** The SubagentHandback calls, with their report and whether their result failed. */
|
|
58
|
+
private readonly handbacks;
|
|
48
59
|
constructor(history: SubagentHistory, publish: Publish);
|
|
49
60
|
/**
|
|
50
61
|
* Registers the launches, the launch results, and the SendMessage calls in
|
|
@@ -73,6 +84,15 @@ export declare class RfdSubagentReplay {
|
|
|
73
84
|
* comes from the launch call.
|
|
74
85
|
*/
|
|
75
86
|
childReplayed(child: ReplayChild, messages: readonly SessionMessage[]): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Takes a replayed update of a tool call, from the transcript of `owner`
|
|
89
|
+
* when it is a child's. Returns whether the client is not shown it: an
|
|
90
|
+
* update of the launch of a child that the replay shows, or of a successful
|
|
91
|
+
* SubagentHandback call of `owner`. A foreground launch's completed result
|
|
92
|
+
* goes out as the child's reply, and a hand-back as the child's message to
|
|
93
|
+
* its parent.
|
|
94
|
+
*/
|
|
95
|
+
toolCallUpdate(update: AcpSessionNotification["update"], owner: ReplayChild | undefined): Promise<boolean>;
|
|
76
96
|
/**
|
|
77
97
|
* Takes a persisted task notification. Returns whether it was a child's:
|
|
78
98
|
* its task id is the agent id.
|
|
@@ -86,7 +106,7 @@ export declare class RfdSubagentReplay {
|
|
|
86
106
|
*/
|
|
87
107
|
finish(supportsNotices: boolean, rootSessionId: string): Promise<void>;
|
|
88
108
|
private registerLaunch;
|
|
89
|
-
/** The prompt of the launch, with the launch's id, as live. */
|
|
109
|
+
/** The prompt of the launch, with the launch's id, to the parent and the child, as live. */
|
|
90
110
|
private sendPrompt;
|
|
91
111
|
/**
|
|
92
112
|
* A message that a SendMessage call delivered. Claude Code frames it for the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-replay.d.ts","sourceRoot":"","sources":["../src/subagent-replay.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"subagent-replay.d.ts","sourceRoot":"","sources":["../src/subagent-replay.ts"],"names":[],"mappings":"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"}
|