@markusylisiurunen/tau 0.3.45 → 0.3.47
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 +56 -6
- package/dist/code_mode/command.d.ts +2 -0
- package/dist/code_mode/command.js +31 -0
- package/dist/code_mode/command.js.map +1 -0
- package/dist/code_mode/index.d.ts +4 -0
- package/dist/code_mode/index.js +4 -0
- package/dist/code_mode/index.js.map +1 -0
- package/dist/code_mode/runtime.d.ts +82 -0
- package/dist/code_mode/runtime.js +298 -0
- package/dist/code_mode/runtime.js.map +1 -0
- package/dist/core/agent/agent_runtime.js +1 -1
- package/dist/core/agent/agent_runtime.js.map +1 -1
- package/dist/core/debug.js +2 -2
- package/dist/core/debug.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +10 -6
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/runtime/deps.js +0 -1
- package/dist/core/runtime/deps.js.map +1 -1
- package/dist/core/runtime/runtime_bootstrap.js +20 -3
- package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
- package/dist/core/runtime/session_prompt_composer.js +6 -4
- package/dist/core/runtime/session_prompt_composer.js.map +1 -1
- package/dist/core/session/runner.js +4 -3
- package/dist/core/session/runner.js.map +1 -1
- package/dist/core/static/code_mode/history/documentation.md +1 -12
- package/dist/core/static/code_mode/history/sandbox_runner.mjs +1 -111
- package/dist/core/static/code_mode/nook/documentation.md +1 -14
- package/dist/core/static/code_mode/nook/sandbox_runner.mjs +1 -147
- package/dist/core/static/code_mode/sandbox_runner.mjs +186 -0
- package/dist/core/static/code_mode/web/documentation.md +1 -13
- package/dist/core/static/code_mode/web/sandbox_runner.mjs +1 -115
- package/dist/core/subagents/agent_supervisor.js +64 -31
- package/dist/core/subagents/agent_supervisor.js.map +1 -1
- package/dist/core/subagents/types.js +0 -1
- package/dist/core/subagents/types.js.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/code_mode.js +41 -47
- package/dist/core/tools/code_mode.js.map +1 -1
- package/dist/core/tools/code_mode_worker.js +43 -12
- package/dist/core/tools/code_mode_worker.js.map +1 -1
- package/dist/core/tools/history.js +16 -26
- package/dist/core/tools/history.js.map +1 -1
- package/dist/core/tools/nook.js +33 -21
- package/dist/core/tools/nook.js.map +1 -1
- package/dist/core/tools/web.js +15 -20
- package/dist/core/tools/web.js.map +1 -1
- package/dist/core/utils/context_builder.js +11 -9
- package/dist/core/utils/context_builder.js.map +1 -1
- package/dist/core/utils/spawn_capture.js +19 -5
- package/dist/core/utils/spawn_capture.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/host/execution_runtime.js +3 -2
- package/dist/host/execution_runtime.js.map +1 -1
- package/dist/host/hosted_ephemeral_agent_session.js +3 -2
- package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
- package/dist/host/local_session_host.js +90 -32
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/host/session_host.js.map +1 -1
- package/dist/host/session_protocol_handler.js +29 -0
- package/dist/host/session_protocol_handler.js.map +1 -1
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +1 -1
- package/dist/protocol/index.js.map +1 -1
- package/dist/protocol/session_protocol.d.ts +66 -3
- package/dist/protocol/session_protocol.js +297 -1
- package/dist/protocol/session_protocol.js.map +1 -1
- package/dist/sdk/client_tool_command.d.ts +63 -0
- package/dist/sdk/client_tool_command.js +282 -0
- package/dist/sdk/client_tool_command.js.map +1 -0
- package/dist/sdk/code_mode.d.ts +6 -0
- package/dist/sdk/code_mode.js +58 -0
- package/dist/sdk/code_mode.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -4
- package/dist/sdk/index.js +4 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/session.js +123 -40
- package/dist/sdk/session.js.map +1 -1
- package/dist/sdk/types.d.ts +21 -10
- package/dist/transport/in_process_session_transport.js +15 -1
- package/dist/transport/in_process_session_transport.js.map +1 -1
- package/dist/transport/index.d.ts +1 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/session_protocol_transport_helpers.js +14 -0
- package/dist/transport/session_protocol_transport_helpers.js.map +1 -1
- package/dist/transport/session_transport.d.ts +3 -1
- package/dist/transport/stdio_session_transport.d.ts +3 -1
- package/dist/transport/stdio_session_transport.js +15 -1
- package/dist/transport/stdio_session_transport.js.map +1 -1
- package/dist/transport/websocket_session_transport.d.ts +3 -1
- package/dist/transport/websocket_session_transport.js +15 -1
- package/dist/transport/websocket_session_transport.js.map +1 -1
- package/dist/tui/chat_controller/diff_review_service.js +2 -2
- package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
- package/dist/tui/chat_view.js.map +1 -1
- package/dist/tui/command_client_tools.js +211 -21
- package/dist/tui/command_client_tools.js.map +1 -1
- package/dist/tui/session_chat_app.js +1 -1
- package/dist/tui/session_chat_app.js.map +1 -1
- package/dist/tui/session_chat_controller.js +49 -17
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/session_tool_execution_backend.js +2 -2
- package/dist/tui/session_tool_execution_backend.js.map +1 -1
- package/dist/tui/ui/subagent_panel.js +25 -48
- package/dist/tui/ui/subagent_panel.js.map +1 -1
- package/package.json +6 -2
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export const SESSION_PROTOCOL_VERSION =
|
|
2
|
+
export const SESSION_PROTOCOL_VERSION = 11;
|
|
3
3
|
export const SESSION_PROTOCOL_MAX_EXEC_CAPTURE_BYTES = 24 * 1024 * 1024;
|
|
4
4
|
export const SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES = 16 * 1024 * 1024;
|
|
5
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_ACTIVITIES = 64;
|
|
6
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES = 512;
|
|
7
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_SUBJECT_BYTES = 4 * 1024;
|
|
8
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_ASSISTANT_TEXT_BYTES = 32 * 1024;
|
|
9
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_DETAILS_BYTES = 32 * 1024;
|
|
10
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_METADATA_BYTES = 8 * 1024;
|
|
11
|
+
export const SESSION_PROTOCOL_MAX_SUBAGENT_NOTICE_CONTENT_BYTES = 32 * 1024;
|
|
5
12
|
const SESSION_PROTOCOL_NOTICE_TITLE_MAX_CHARS = 512;
|
|
6
13
|
const SESSION_PROTOCOL_NOTICE_CONTENT_MAX_ENTRIES = 16;
|
|
7
14
|
const SESSION_PROTOCOL_NOTICE_CONTENT_ENTRY_MAX_CHARS = 4_096;
|
|
15
|
+
const UTF8_ENCODER = new TextEncoder();
|
|
8
16
|
export const SESSION_PROTOCOL_METHODS = [
|
|
9
17
|
"initialize",
|
|
10
18
|
"session.create",
|
|
@@ -79,6 +87,149 @@ export function projectSessionProtocolNoticePresentation(title, content) {
|
|
|
79
87
|
...(projectedContent.length > 0 ? { content: projectedContent } : {}),
|
|
80
88
|
};
|
|
81
89
|
}
|
|
90
|
+
export function projectSessionProtocolSubagentActivity(activity) {
|
|
91
|
+
if (activity.type === "assistant") {
|
|
92
|
+
return {
|
|
93
|
+
type: "assistant",
|
|
94
|
+
text: truncateUtf8Middle(activity.text, SESSION_PROTOCOL_MAX_SUBAGENT_ASSISTANT_TEXT_BYTES),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (activity.type === "notice") {
|
|
98
|
+
const content = activity.content
|
|
99
|
+
? truncateSubagentTextValues(activity.content, SESSION_PROTOCOL_MAX_SUBAGENT_NOTICE_CONTENT_BYTES)
|
|
100
|
+
: [];
|
|
101
|
+
return {
|
|
102
|
+
type: "notice",
|
|
103
|
+
severity: activity.severity,
|
|
104
|
+
title: truncateUtf8Middle(activity.title, SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES),
|
|
105
|
+
...(content.length > 0 ? { content } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const toolName = activity.toolName.replace(/\s+/g, " ").trim() || "(invalid tool name)";
|
|
109
|
+
return {
|
|
110
|
+
type: "tool",
|
|
111
|
+
toolName: truncateUtf8Middle(toolName, SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES),
|
|
112
|
+
outcome: activity.outcome,
|
|
113
|
+
presentation: {
|
|
114
|
+
action: truncateUtf8Middle(activity.presentation.action, SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES),
|
|
115
|
+
...(activity.presentation.operation
|
|
116
|
+
? {
|
|
117
|
+
operation: truncateUtf8Middle(activity.presentation.operation, SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES),
|
|
118
|
+
}
|
|
119
|
+
: {}),
|
|
120
|
+
subject: truncateUtf8Middle(activity.presentation.subject, SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_SUBJECT_BYTES),
|
|
121
|
+
subjectWrap: activity.presentation.subjectWrap,
|
|
122
|
+
details: truncateSubagentActivityDetails(activity.presentation.details),
|
|
123
|
+
metadata: truncateSubagentTextValues(activity.presentation.metadata, SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_METADATA_BYTES),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function truncateSubagentActivityDetails(details) {
|
|
128
|
+
return truncateSubagentTextEntries(details, SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_DETAILS_BYTES, (omitted) => ({
|
|
129
|
+
text: `…${omitted} more ${omitted === 1 ? "line" : "lines"}…`,
|
|
130
|
+
wrap: "word",
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
function truncateSubagentTextValues(values, maxBytes) {
|
|
134
|
+
return truncateSubagentTextEntries(values.map((text) => ({ text })), maxBytes, (omitted) => ({
|
|
135
|
+
text: `…${omitted} more ${omitted === 1 ? "entry" : "entries"}…`,
|
|
136
|
+
})).map((entry) => entry.text);
|
|
137
|
+
}
|
|
138
|
+
function truncateSubagentTextEntries(entries, maxBytes, omission) {
|
|
139
|
+
const cloned = structuredClone(entries);
|
|
140
|
+
if (subagentTextEntriesBytes(cloned) <= maxBytes) {
|
|
141
|
+
return cloned;
|
|
142
|
+
}
|
|
143
|
+
const perEntryBytes = cloned.length === 1
|
|
144
|
+
? maxBytes
|
|
145
|
+
: cloned.length === 2
|
|
146
|
+
? Math.floor((maxBytes - 1) / 2)
|
|
147
|
+
: Math.floor((maxBytes - utf8ByteLength(omission(cloned.length - 2).text) - 2) / 2);
|
|
148
|
+
const bounded = cloned.map((entry) => ({
|
|
149
|
+
...entry,
|
|
150
|
+
text: truncateUtf8Middle(entry.text, perEntryBytes),
|
|
151
|
+
}));
|
|
152
|
+
if (subagentTextEntriesBytes(bounded) <= maxBytes) {
|
|
153
|
+
return bounded;
|
|
154
|
+
}
|
|
155
|
+
const itemBytes = bounded.map((entry) => utf8ByteLength(entry.text));
|
|
156
|
+
let headCount = 0;
|
|
157
|
+
let tailCount = 0;
|
|
158
|
+
let headBytes = 0;
|
|
159
|
+
let tailBytes = 0;
|
|
160
|
+
while (headCount + tailCount < bounded.length) {
|
|
161
|
+
const nextKeptCount = headCount + tailCount + 1;
|
|
162
|
+
const omitted = bounded.length - nextKeptCount;
|
|
163
|
+
if (omitted === 0)
|
|
164
|
+
break;
|
|
165
|
+
const headItemBytes = itemBytes[headCount];
|
|
166
|
+
const tailItemBytes = itemBytes[bounded.length - tailCount - 1];
|
|
167
|
+
const headFits = subagentTextEntriesProjectionBytes(nextKeptCount, headBytes + headItemBytes + tailBytes, omission(omitted).text) <= maxBytes;
|
|
168
|
+
const tailFits = subagentTextEntriesProjectionBytes(nextKeptCount, headBytes + tailBytes + tailItemBytes, omission(omitted).text) <= maxBytes;
|
|
169
|
+
if (!headFits && !tailFits)
|
|
170
|
+
break;
|
|
171
|
+
const takeHead = headFits &&
|
|
172
|
+
(!tailFits ||
|
|
173
|
+
Math.abs(headBytes + headItemBytes - tailBytes) <=
|
|
174
|
+
Math.abs(headBytes - tailBytes - tailItemBytes));
|
|
175
|
+
if (takeHead) {
|
|
176
|
+
headCount += 1;
|
|
177
|
+
headBytes += headItemBytes;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
tailCount += 1;
|
|
181
|
+
tailBytes += tailItemBytes;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const omitted = bounded.length - headCount - tailCount;
|
|
185
|
+
return [
|
|
186
|
+
...bounded.slice(0, headCount),
|
|
187
|
+
omission(omitted),
|
|
188
|
+
...bounded.slice(bounded.length - tailCount),
|
|
189
|
+
];
|
|
190
|
+
}
|
|
191
|
+
function subagentTextEntriesProjectionBytes(keptCount, keptBytes, omissionText) {
|
|
192
|
+
return keptBytes + utf8ByteLength(omissionText) + keptCount;
|
|
193
|
+
}
|
|
194
|
+
function subagentTextEntriesBytes(entries) {
|
|
195
|
+
if (entries.length === 0)
|
|
196
|
+
return 0;
|
|
197
|
+
return (entries.reduce((total, entry) => total + utf8ByteLength(entry.text), 0) + entries.length - 1);
|
|
198
|
+
}
|
|
199
|
+
function truncateUtf8Middle(value, maxBytes) {
|
|
200
|
+
if (utf8ByteLength(value) <= maxBytes)
|
|
201
|
+
return value;
|
|
202
|
+
const marker = "…";
|
|
203
|
+
const markerBytes = utf8ByteLength(marker);
|
|
204
|
+
const contentBytes = maxBytes - markerBytes;
|
|
205
|
+
const headBudget = Math.ceil(contentBytes / 2);
|
|
206
|
+
const tailBudget = contentBytes - headBudget;
|
|
207
|
+
const characters = Array.from(value);
|
|
208
|
+
let headCount = 0;
|
|
209
|
+
let headBytes = 0;
|
|
210
|
+
while (headCount < characters.length) {
|
|
211
|
+
const nextBytes = utf8ByteLength(characters[headCount]);
|
|
212
|
+
if (headBytes + nextBytes > headBudget)
|
|
213
|
+
break;
|
|
214
|
+
headBytes += nextBytes;
|
|
215
|
+
headCount += 1;
|
|
216
|
+
}
|
|
217
|
+
let tailCount = 0;
|
|
218
|
+
let tailBytes = 0;
|
|
219
|
+
while (tailCount < characters.length - headCount) {
|
|
220
|
+
const nextBytes = utf8ByteLength(characters[characters.length - tailCount - 1]);
|
|
221
|
+
if (tailBytes + nextBytes > tailBudget)
|
|
222
|
+
break;
|
|
223
|
+
tailBytes += nextBytes;
|
|
224
|
+
tailCount += 1;
|
|
225
|
+
}
|
|
226
|
+
return `${characters.slice(0, headCount).join("")}${marker}${characters
|
|
227
|
+
.slice(characters.length - tailCount)
|
|
228
|
+
.join("")}`;
|
|
229
|
+
}
|
|
230
|
+
function utf8ByteLength(value) {
|
|
231
|
+
return UTF8_ENCODER.encode(value).byteLength;
|
|
232
|
+
}
|
|
82
233
|
function truncateNoticeText(value, maxChars) {
|
|
83
234
|
if (value.length <= maxChars)
|
|
84
235
|
return value;
|
|
@@ -314,6 +465,7 @@ const sessionProtocolOutgoingRoutingSchema = z
|
|
|
314
465
|
"session.delta",
|
|
315
466
|
"session.ephemeral",
|
|
316
467
|
"session.pendingUserMessages",
|
|
468
|
+
"session.subagentActivities",
|
|
317
469
|
"session.clientTool.call",
|
|
318
470
|
"session.clientTool.cancel",
|
|
319
471
|
"response",
|
|
@@ -1667,6 +1819,97 @@ const sessionProtocolPendingUserMessagesMessageSchema = z
|
|
|
1667
1819
|
state: sessionProtocolPendingUserMessagesStateSchema,
|
|
1668
1820
|
})
|
|
1669
1821
|
.strip();
|
|
1822
|
+
const subagentActivityLineSchema = z
|
|
1823
|
+
.string()
|
|
1824
|
+
.refine((text) => !text.includes("\n") && !text.includes("\r"), "must be one line");
|
|
1825
|
+
const subagentActivityShortTextSchema = subagentActivityLineSchema
|
|
1826
|
+
.min(1)
|
|
1827
|
+
.refine((text) => text.trim().length > 0)
|
|
1828
|
+
.refine((text) => utf8ByteLength(text) <= SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES, `must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_SHORT_TEXT_BYTES} UTF-8 bytes`);
|
|
1829
|
+
const subagentToolPresentationSchema = z
|
|
1830
|
+
.object({
|
|
1831
|
+
action: subagentActivityShortTextSchema,
|
|
1832
|
+
operation: subagentActivityShortTextSchema.optional(),
|
|
1833
|
+
subject: nonEmptyStringSchema.refine((subject) => utf8ByteLength(subject) <= SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_SUBJECT_BYTES, `must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_SUBJECT_BYTES} UTF-8 bytes`),
|
|
1834
|
+
subjectWrap: z.enum(["word", "character"]),
|
|
1835
|
+
details: z
|
|
1836
|
+
.array(z
|
|
1837
|
+
.object({
|
|
1838
|
+
text: subagentActivityLineSchema,
|
|
1839
|
+
tone: z.enum(["added", "removed"]).optional(),
|
|
1840
|
+
wrap: z.enum(["word", "character"]),
|
|
1841
|
+
})
|
|
1842
|
+
.strip())
|
|
1843
|
+
.refine((details) => subagentTextEntriesBytes(details) <= SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_DETAILS_BYTES, `text must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_DETAILS_BYTES} UTF-8 bytes`),
|
|
1844
|
+
metadata: z
|
|
1845
|
+
.array(subagentActivityLineSchema)
|
|
1846
|
+
.refine((metadata) => subagentTextEntriesBytes(metadata.map((text) => ({ text }))) <=
|
|
1847
|
+
SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_METADATA_BYTES, `text must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_TOOL_METADATA_BYTES} UTF-8 bytes`),
|
|
1848
|
+
})
|
|
1849
|
+
.strip();
|
|
1850
|
+
const sessionProtocolSubagentActivitySchema = z.discriminatedUnion("type", [
|
|
1851
|
+
z
|
|
1852
|
+
.object({
|
|
1853
|
+
type: z.literal("assistant"),
|
|
1854
|
+
text: nonEmptyStringSchema.refine((text) => utf8ByteLength(text) <= SESSION_PROTOCOL_MAX_SUBAGENT_ASSISTANT_TEXT_BYTES, `must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_ASSISTANT_TEXT_BYTES} UTF-8 bytes`),
|
|
1855
|
+
})
|
|
1856
|
+
.strip(),
|
|
1857
|
+
z
|
|
1858
|
+
.object({
|
|
1859
|
+
type: z.literal("tool"),
|
|
1860
|
+
toolName: subagentActivityShortTextSchema,
|
|
1861
|
+
outcome: z.enum(["succeeded", "failed", "blocked", "cancelled"]),
|
|
1862
|
+
presentation: subagentToolPresentationSchema,
|
|
1863
|
+
})
|
|
1864
|
+
.strip(),
|
|
1865
|
+
z
|
|
1866
|
+
.object({
|
|
1867
|
+
type: z.literal("notice"),
|
|
1868
|
+
severity: z.enum(["info", "warn", "error"]),
|
|
1869
|
+
title: subagentActivityShortTextSchema,
|
|
1870
|
+
content: z
|
|
1871
|
+
.array(z.string())
|
|
1872
|
+
.refine((content) => subagentTextEntriesBytes(content.map((text) => ({ text }))) <=
|
|
1873
|
+
SESSION_PROTOCOL_MAX_SUBAGENT_NOTICE_CONTENT_BYTES, `text must not exceed ${SESSION_PROTOCOL_MAX_SUBAGENT_NOTICE_CONTENT_BYTES} UTF-8 bytes`)
|
|
1874
|
+
.optional(),
|
|
1875
|
+
})
|
|
1876
|
+
.strip(),
|
|
1877
|
+
]);
|
|
1878
|
+
const sessionProtocolSubagentActivitiesAgentStateSchema = z
|
|
1879
|
+
.object({
|
|
1880
|
+
runRevision: z.number().int().positive(),
|
|
1881
|
+
activities: z
|
|
1882
|
+
.array(sessionProtocolSubagentActivitySchema)
|
|
1883
|
+
.max(SESSION_PROTOCOL_MAX_SUBAGENT_ACTIVITIES),
|
|
1884
|
+
})
|
|
1885
|
+
.strip();
|
|
1886
|
+
const sessionProtocolSubagentActivitiesStateSchema = z
|
|
1887
|
+
.object({
|
|
1888
|
+
revision: z.number().int().positive(),
|
|
1889
|
+
agents: z.record(nonEmptyStringSchema, sessionProtocolSubagentActivitiesAgentStateSchema),
|
|
1890
|
+
})
|
|
1891
|
+
.strip();
|
|
1892
|
+
const sessionProtocolSubagentActivitiesChangeSchema = z.discriminatedUnion("type", [
|
|
1893
|
+
z
|
|
1894
|
+
.object({
|
|
1895
|
+
type: z.literal("agent.set"),
|
|
1896
|
+
agentId: nonEmptyStringSchema,
|
|
1897
|
+
state: sessionProtocolSubagentActivitiesAgentStateSchema,
|
|
1898
|
+
})
|
|
1899
|
+
.strip(),
|
|
1900
|
+
z.object({ type: z.literal("agent.remove"), agentId: nonEmptyStringSchema }).strip(),
|
|
1901
|
+
]);
|
|
1902
|
+
const sessionProtocolSubagentActivitiesMessageSchema = z
|
|
1903
|
+
.object({
|
|
1904
|
+
version: z.literal(SESSION_PROTOCOL_VERSION),
|
|
1905
|
+
type: z.literal("session.subagentActivities"),
|
|
1906
|
+
sessionId: nonEmptyStringSchema,
|
|
1907
|
+
revision: z.number().int().positive(),
|
|
1908
|
+
changes: z
|
|
1909
|
+
.array(sessionProtocolSubagentActivitiesChangeSchema)
|
|
1910
|
+
.refine((changes) => new Set(changes.map((change) => change.agentId)).size === changes.length, "must not contain duplicate agent ids"),
|
|
1911
|
+
})
|
|
1912
|
+
.strip();
|
|
1670
1913
|
const sessionProtocolInitializeResultSchema = z
|
|
1671
1914
|
.object({
|
|
1672
1915
|
protocolVersion: z.literal(SESSION_PROTOCOL_VERSION),
|
|
@@ -1683,6 +1926,7 @@ const sessionProtocolObserveResultSchema = z
|
|
|
1683
1926
|
.object({
|
|
1684
1927
|
snapshot: sessionProtocolSnapshotSchema,
|
|
1685
1928
|
pendingUserMessages: sessionProtocolPendingUserMessagesStateSchema,
|
|
1929
|
+
subagentActivities: sessionProtocolSubagentActivitiesStateSchema,
|
|
1686
1930
|
})
|
|
1687
1931
|
.strip();
|
|
1688
1932
|
const sessionProtocolListResultSchema = z
|
|
@@ -1904,6 +2148,35 @@ export function createSessionProtocolPendingUserMessagesMessage(options) {
|
|
|
1904
2148
|
}
|
|
1905
2149
|
return parsedMessage.data;
|
|
1906
2150
|
}
|
|
2151
|
+
export function applySessionProtocolSubagentActivitiesMessage(state, message) {
|
|
2152
|
+
if (message.revision <= state.revision) {
|
|
2153
|
+
return structuredClone(state);
|
|
2154
|
+
}
|
|
2155
|
+
const agents = { ...state.agents };
|
|
2156
|
+
for (const change of message.changes) {
|
|
2157
|
+
if (change.type === "agent.set") {
|
|
2158
|
+
agents[change.agentId] = structuredClone(change.state);
|
|
2159
|
+
}
|
|
2160
|
+
else {
|
|
2161
|
+
delete agents[change.agentId];
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
return { revision: message.revision, agents };
|
|
2165
|
+
}
|
|
2166
|
+
export function createSessionProtocolSubagentActivitiesMessage(options) {
|
|
2167
|
+
const message = {
|
|
2168
|
+
version: SESSION_PROTOCOL_VERSION,
|
|
2169
|
+
type: "session.subagentActivities",
|
|
2170
|
+
sessionId: options.sessionId,
|
|
2171
|
+
revision: options.revision,
|
|
2172
|
+
changes: options.changes,
|
|
2173
|
+
};
|
|
2174
|
+
const parsedMessage = sessionProtocolSubagentActivitiesMessageSchema.safeParse(message);
|
|
2175
|
+
if (!parsedMessage.success) {
|
|
2176
|
+
throw new Error(`session protocol subagent activities message is invalid: ${formatZodError(parsedMessage.error)}`);
|
|
2177
|
+
}
|
|
2178
|
+
return parsedMessage.data;
|
|
2179
|
+
}
|
|
1907
2180
|
function validateSnapshotResetCause(snapshot, message) {
|
|
1908
2181
|
if (message.delta.type !== "snapshot.reset") {
|
|
1909
2182
|
return;
|
|
@@ -2445,6 +2718,9 @@ export function parseSessionProtocolOutgoingLine(line) {
|
|
|
2445
2718
|
if (routing.data.type === "session.pendingUserMessages") {
|
|
2446
2719
|
return parseSessionProtocolPendingUserMessagesMessage(parsed);
|
|
2447
2720
|
}
|
|
2721
|
+
if (routing.data.type === "session.subagentActivities") {
|
|
2722
|
+
return parseSessionProtocolSubagentActivitiesMessage(parsed);
|
|
2723
|
+
}
|
|
2448
2724
|
if (routing.data.type === "session.clientTool.call" ||
|
|
2449
2725
|
routing.data.type === "session.clientTool.cancel") {
|
|
2450
2726
|
return parseSessionProtocolClientToolMessage(parsed);
|
|
@@ -3133,6 +3409,26 @@ function parseSessionProtocolPendingUserMessagesMessage(payload) {
|
|
|
3133
3409
|
message: message.data,
|
|
3134
3410
|
};
|
|
3135
3411
|
}
|
|
3412
|
+
function parseSessionProtocolSubagentActivitiesMessage(payload) {
|
|
3413
|
+
const fail = (message) => outgoingParseFailure("session.subagentActivities", null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, message);
|
|
3414
|
+
const message = sessionProtocolSubagentActivitiesMessageSchema.safeParse(payload);
|
|
3415
|
+
if (!message.success) {
|
|
3416
|
+
if (hasIssue(message.error, ["sessionId"])) {
|
|
3417
|
+
return fail("session.subagentActivities.sessionId must be a non-empty string");
|
|
3418
|
+
}
|
|
3419
|
+
if (hasIssue(message.error, ["revision"])) {
|
|
3420
|
+
return fail("session.subagentActivities.revision is invalid");
|
|
3421
|
+
}
|
|
3422
|
+
if (hasIssue(message.error, ["changes"])) {
|
|
3423
|
+
return fail("session.subagentActivities.changes are invalid");
|
|
3424
|
+
}
|
|
3425
|
+
return fail(`invalid session.subagentActivities message: ${formatZodError(message.error)}`);
|
|
3426
|
+
}
|
|
3427
|
+
return {
|
|
3428
|
+
ok: true,
|
|
3429
|
+
message: message.data,
|
|
3430
|
+
};
|
|
3431
|
+
}
|
|
3136
3432
|
function parseSessionProtocolResponseMessage(payload) {
|
|
3137
3433
|
const parsedIdField = sessionProtocolIdFieldSchema.safeParse(payload);
|
|
3138
3434
|
const responseId = parseNullableRequestId(parsedIdField.success ? parsedIdField.data.id : undefined);
|