@narumitw/pi-subagents 2.0.1 → 2.0.3
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 +20 -7
- package/dist/chunks/auto-transport-SY2VHUFH.ts +109 -0
- package/dist/chunks/auto-transport-SY2VHUFH.ts.map +7 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts +19 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts.map +7 -0
- package/dist/chunks/chunk-434NII74.ts +282 -0
- package/dist/chunks/chunk-434NII74.ts.map +7 -0
- package/dist/chunks/chunk-47SK2QYC.ts +56 -0
- package/dist/chunks/chunk-47SK2QYC.ts.map +7 -0
- package/dist/chunks/chunk-6KJ34M6S.ts +159 -0
- package/dist/chunks/chunk-6KJ34M6S.ts.map +7 -0
- package/dist/chunks/chunk-7OBINKFM.ts +80 -0
- package/dist/chunks/chunk-7OBINKFM.ts.map +7 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts +335 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts.map +7 -0
- package/dist/chunks/chunk-AEUYS7JC.ts +73 -0
- package/dist/chunks/chunk-AEUYS7JC.ts.map +7 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts +189 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts.map +7 -0
- package/dist/chunks/chunk-BOAXY55Y.ts +153 -0
- package/dist/chunks/chunk-BOAXY55Y.ts.map +7 -0
- package/dist/chunks/chunk-C4L6P266.ts +22 -0
- package/dist/chunks/chunk-C4L6P266.ts.map +7 -0
- package/dist/chunks/chunk-DPPVEQAM.ts +29 -0
- package/dist/chunks/chunk-DPPVEQAM.ts.map +7 -0
- package/dist/chunks/chunk-DQMN4OYM.ts +913 -0
- package/dist/chunks/chunk-DQMN4OYM.ts.map +7 -0
- package/dist/chunks/chunk-DSOOH73Y.ts +238 -0
- package/dist/chunks/chunk-DSOOH73Y.ts.map +7 -0
- package/dist/chunks/chunk-EFBPISNT.ts +421 -0
- package/dist/chunks/chunk-EFBPISNT.ts.map +7 -0
- package/dist/chunks/chunk-EWWXFU7N.ts +150 -0
- package/dist/chunks/chunk-EWWXFU7N.ts.map +7 -0
- package/dist/chunks/chunk-F4L2UVSK.ts +380 -0
- package/dist/chunks/chunk-F4L2UVSK.ts.map +7 -0
- package/dist/chunks/chunk-F5YWVHQX.ts +1543 -0
- package/dist/chunks/chunk-F5YWVHQX.ts.map +7 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts +63 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts.map +7 -0
- package/dist/chunks/chunk-G6VZTCFH.ts +70 -0
- package/dist/chunks/chunk-G6VZTCFH.ts.map +7 -0
- package/dist/chunks/chunk-H3FP6DLR.ts +160 -0
- package/dist/chunks/chunk-H3FP6DLR.ts.map +7 -0
- package/dist/chunks/chunk-HA36LPCO.ts +130 -0
- package/dist/chunks/chunk-HA36LPCO.ts.map +7 -0
- package/dist/chunks/chunk-HKC4ES4B.ts +65 -0
- package/dist/chunks/chunk-HKC4ES4B.ts.map +7 -0
- package/dist/chunks/chunk-HOP5FXDT.ts +27 -0
- package/dist/chunks/chunk-HOP5FXDT.ts.map +7 -0
- package/dist/chunks/chunk-I2FAK44T.ts +324 -0
- package/dist/chunks/chunk-I2FAK44T.ts.map +7 -0
- package/dist/chunks/chunk-IGAMVWFN.ts +139 -0
- package/dist/chunks/chunk-IGAMVWFN.ts.map +7 -0
- package/dist/chunks/chunk-KMGKCEO4.ts +38 -0
- package/dist/chunks/chunk-KMGKCEO4.ts.map +7 -0
- package/dist/chunks/chunk-N7BLVXKK.ts +73 -0
- package/dist/chunks/chunk-N7BLVXKK.ts.map +7 -0
- package/dist/chunks/chunk-NIF42QMF.ts +297 -0
- package/dist/chunks/chunk-NIF42QMF.ts.map +7 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts +52 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts.map +7 -0
- package/dist/chunks/chunk-ONDTY4EL.ts +91 -0
- package/dist/chunks/chunk-ONDTY4EL.ts.map +7 -0
- package/dist/chunks/chunk-OVPHFGKO.ts +1769 -0
- package/dist/chunks/chunk-OVPHFGKO.ts.map +7 -0
- package/dist/chunks/chunk-P7OH4XMF.ts +60 -0
- package/dist/chunks/chunk-P7OH4XMF.ts.map +7 -0
- package/dist/chunks/chunk-PSK43Y6A.ts +339 -0
- package/dist/chunks/chunk-PSK43Y6A.ts.map +7 -0
- package/dist/chunks/chunk-QBORTI4W.ts +468 -0
- package/dist/chunks/chunk-QBORTI4W.ts.map +7 -0
- package/dist/chunks/chunk-QDVGH2X7.ts +171 -0
- package/dist/chunks/chunk-QDVGH2X7.ts.map +7 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts +490 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts.map +7 -0
- package/dist/chunks/chunk-RRR66UWR.ts +28 -0
- package/dist/chunks/chunk-RRR66UWR.ts.map +7 -0
- package/dist/chunks/chunk-RSUXZD6S.ts +275 -0
- package/dist/chunks/chunk-RSUXZD6S.ts.map +7 -0
- package/dist/chunks/chunk-RTCVYIZA.ts +221 -0
- package/dist/chunks/chunk-RTCVYIZA.ts.map +7 -0
- package/dist/chunks/chunk-S2IWVK3J.ts +44 -0
- package/dist/chunks/chunk-S2IWVK3J.ts.map +7 -0
- package/dist/chunks/chunk-SCZ33MYW.ts +52 -0
- package/dist/chunks/chunk-SCZ33MYW.ts.map +7 -0
- package/dist/chunks/chunk-SWGQLFSD.ts +60 -0
- package/dist/chunks/chunk-SWGQLFSD.ts.map +7 -0
- package/dist/chunks/chunk-UMBPMVJW.ts +22 -0
- package/dist/chunks/chunk-UMBPMVJW.ts.map +7 -0
- package/dist/chunks/chunk-UVFVHIOP.ts +735 -0
- package/dist/chunks/chunk-UVFVHIOP.ts.map +7 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts +16 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts.map +7 -0
- package/dist/chunks/config-status-J4GPWP46.ts +34 -0
- package/dist/chunks/config-status-J4GPWP46.ts.map +7 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts +1146 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts.map +7 -0
- package/dist/chunks/consult-NYXVDN5G.ts +518 -0
- package/dist/chunks/consult-NYXVDN5G.ts.map +7 -0
- package/dist/chunks/context-QDKLVQXE.ts +11 -0
- package/dist/chunks/context-QDKLVQXE.ts.map +7 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts +130 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts.map +7 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts +17 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts.map +7 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts +24 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts.map +7 -0
- package/dist/chunks/discovery-K25T3SH4.ts +12 -0
- package/dist/chunks/discovery-K25T3SH4.ts.map +7 -0
- package/dist/chunks/execution-DS2DEIQZ.ts +4034 -0
- package/dist/chunks/execution-DS2DEIQZ.ts.map +7 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts +38 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts.map +7 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts +619 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts.map +7 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts +294 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts.map +7 -0
- package/dist/chunks/persistence-VSGXAW4P.ts +344 -0
- package/dist/chunks/persistence-VSGXAW4P.ts.map +7 -0
- package/dist/chunks/registry-E6XPJB7L.ts +1324 -0
- package/dist/chunks/registry-E6XPJB7L.ts.map +7 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts +81 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts.map +7 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts +1154 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts.map +7 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts +15 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts.map +7 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts +19 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts.map +7 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts +13 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts.map +7 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts +15 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts.map +7 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts +158 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts.map +7 -0
- package/dist/chunks/workspace-WDKLN72J.ts +11 -0
- package/dist/chunks/workspace-WDKLN72J.ts.map +7 -0
- package/dist/index.ts +1057 -0
- package/dist/index.ts.map +7 -0
- package/package.json +9 -5
- package/src/index.ts +1 -1
- package/src/settings-reader.ts +208 -0
- package/src/settings.ts +22 -187
- package/src/stateful-registration.ts +1230 -0
- package/src/stateful-safety.ts +1 -1
- package/src/stateful.ts +2 -1234
- package/src/subagents-extension.ts +307 -0
- package/src/subagents.ts +1 -308
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
projectAgentRecords
|
|
5
|
+
} from "./chunk-KMGKCEO4.ts";
|
|
6
|
+
import {
|
|
7
|
+
updateStatefulLimitSetting
|
|
8
|
+
} from "./chunk-7QPPBBXZ.ts";
|
|
9
|
+
import {
|
|
10
|
+
inspectBlockingParallelLimitSettings,
|
|
11
|
+
inspectCompletionDeliverySettings,
|
|
12
|
+
inspectConsultResourceSettings,
|
|
13
|
+
inspectCwdPolicySettings,
|
|
14
|
+
inspectDelegationWorkflowSettings,
|
|
15
|
+
inspectStatefulLimitSettings,
|
|
16
|
+
inspectStatefulTransportSettings
|
|
17
|
+
} from "./chunk-QBORTI4W.ts";
|
|
18
|
+
import {
|
|
19
|
+
STATEFUL_LIMIT_DEFINITIONS,
|
|
20
|
+
isValidStatefulLimit,
|
|
21
|
+
resolveStatefulLimits,
|
|
22
|
+
statefulLimitDefinition
|
|
23
|
+
} from "./chunk-7OBINKFM.ts";
|
|
24
|
+
import {
|
|
25
|
+
safeTerminalLine
|
|
26
|
+
} from "./chunk-SWGQLFSD.ts";
|
|
27
|
+
|
|
28
|
+
// src/stateful-limit-ui.ts
|
|
29
|
+
function statefulLimitListScreen(runtime) {
|
|
30
|
+
const inspected = inspectStatefulLimitSettings();
|
|
31
|
+
const current = runtime.getRuntimeStatus().limits;
|
|
32
|
+
return {
|
|
33
|
+
kind: "actions",
|
|
34
|
+
title: "Detached Agent Limits",
|
|
35
|
+
lines: [
|
|
36
|
+
"These limits apply after /reload or the next Pi session.",
|
|
37
|
+
"Reloading can interrupt retained detached work.",
|
|
38
|
+
...inspected.error ? [
|
|
39
|
+
`Settings cannot be edited: ${safeTerminalLine(inspected.error)}`,
|
|
40
|
+
`Repair ${safeTerminalLine(inspected.path)} and retry.`
|
|
41
|
+
] : []
|
|
42
|
+
],
|
|
43
|
+
items: [
|
|
44
|
+
...inspected.values ? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {
|
|
45
|
+
const configured = inspected.values?.[definition.field];
|
|
46
|
+
return {
|
|
47
|
+
id: definition.field,
|
|
48
|
+
label: definition.label,
|
|
49
|
+
description: `Current ${current[definition.field]} \xB7 configured ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
|
|
50
|
+
action: "pick-stateful-limit"
|
|
51
|
+
};
|
|
52
|
+
}) : [],
|
|
53
|
+
{ id: "back", label: "Back", action: "back" }
|
|
54
|
+
],
|
|
55
|
+
hint: "back"
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function statefulLimitInputScreen(field, runtime) {
|
|
59
|
+
const definition = statefulLimitDefinition(field);
|
|
60
|
+
const inspected = inspectStatefulLimitSettings();
|
|
61
|
+
const configured = inspected.values?.[field];
|
|
62
|
+
return {
|
|
63
|
+
kind: "input",
|
|
64
|
+
title: definition.label,
|
|
65
|
+
lines: [
|
|
66
|
+
definition.description,
|
|
67
|
+
`Current session: ${runtime.getRuntimeStatus().limits[field]}`,
|
|
68
|
+
`Configured after reload: ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
|
|
69
|
+
`Allowed: whole numbers ${definition.minimum === 0 ? "0 or greater" : "1 or greater"}`,
|
|
70
|
+
`Read from: ${safeTerminalLine(inspected.path)}`,
|
|
71
|
+
...inspected.writePath !== inspected.path ? [`Saves to: ${safeTerminalLine(inspected.writePath)}`] : []
|
|
72
|
+
],
|
|
73
|
+
placeholder: "Enter a whole number",
|
|
74
|
+
action: "set-stateful-limit",
|
|
75
|
+
hint: "back"
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async function applyStatefulLimitSetting(field, value, ctx, runtime, options) {
|
|
79
|
+
const next = parseStatefulLimit(field, value);
|
|
80
|
+
if (next === void 0) {
|
|
81
|
+
notifyValidationError(field, ctx);
|
|
82
|
+
return { kind: "rejected" };
|
|
83
|
+
}
|
|
84
|
+
const inspected = inspectStatefulLimitSettings();
|
|
85
|
+
if (inspected.error || !inspected.values) {
|
|
86
|
+
if (options.isCurrent() && !options.signal.aborted) {
|
|
87
|
+
ctx.ui.notify(
|
|
88
|
+
`Subagent settings cannot be edited: ${safeTerminalLine(inspected.error ?? "settings are unavailable")}`,
|
|
89
|
+
"error"
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
return { kind: "rejected" };
|
|
93
|
+
}
|
|
94
|
+
const expected = configuredValues(inspected.values);
|
|
95
|
+
if (next === expected[field]) return { kind: "back" };
|
|
96
|
+
const beforeAgents = runtime.listAgents();
|
|
97
|
+
const affectedBefore = projectedRemovedAgentIds(beforeAgents, expected, {
|
|
98
|
+
...expected,
|
|
99
|
+
[field]: next
|
|
100
|
+
});
|
|
101
|
+
if (affectedBefore.length > 0) {
|
|
102
|
+
const confirmed = await ctx.ui.confirm(
|
|
103
|
+
`Lower ${statefulLimitDefinition(field).label}?`,
|
|
104
|
+
[
|
|
105
|
+
`This configured value would omit ${affectedBefore.length} currently retained agent record${affectedBefore.length === 1 ? "" : "s"} from projected recovery after reload.`,
|
|
106
|
+
"No agent is closed now, and this menu will not reload Pi.",
|
|
107
|
+
"A later state rewrite can make omitted records unavailable for recovery."
|
|
108
|
+
].join("\n\n"),
|
|
109
|
+
{ signal: options.signal }
|
|
110
|
+
);
|
|
111
|
+
if (options.signal.aborted || !options.isCurrent()) return { kind: "close" };
|
|
112
|
+
if (!confirmed) return { kind: "rejected" };
|
|
113
|
+
const affectedAfter = projectedRemovedAgentIds(runtime.listAgents(), expected, {
|
|
114
|
+
...expected,
|
|
115
|
+
[field]: next
|
|
116
|
+
});
|
|
117
|
+
if (!sameIds(affectedBefore, affectedAfter)) {
|
|
118
|
+
ctx.ui.notify("Detached agents changed while confirming; review the limit again.", "warning");
|
|
119
|
+
return { kind: "rejected" };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (options.signal.aborted || !options.isCurrent()) return { kind: "close" };
|
|
123
|
+
try {
|
|
124
|
+
updateStatefulLimitSetting(field, next, expected);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
if (options.isCurrent() && !options.signal.aborted) {
|
|
127
|
+
ctx.ui.notify(
|
|
128
|
+
`Detached limit was not saved; the previous setting is unchanged: ${formatError(error)}`,
|
|
129
|
+
"error"
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
return { kind: "rejected" };
|
|
133
|
+
}
|
|
134
|
+
if (options.signal.aborted || !options.isCurrent()) return { kind: "close" };
|
|
135
|
+
ctx.ui.notify(
|
|
136
|
+
`Saved ${statefulLimitDefinition(field).label.toLowerCase()}: ${next}. Applies after /reload; clear retained agents before reloading if their work must not be interrupted.`,
|
|
137
|
+
"info"
|
|
138
|
+
);
|
|
139
|
+
return { kind: "back" };
|
|
140
|
+
}
|
|
141
|
+
function formatDetachedLimitSummary(status) {
|
|
142
|
+
return [
|
|
143
|
+
`${status.limits.maxAgents} retained`,
|
|
144
|
+
`${status.limits.maxActiveTurns} active turns`,
|
|
145
|
+
`${status.limits.maxChildrenPerAgent} children`,
|
|
146
|
+
`depth ${status.limits.maxDepth}`,
|
|
147
|
+
`${status.limits.maxStoredAgents} stored`
|
|
148
|
+
].join(" \xB7 ");
|
|
149
|
+
}
|
|
150
|
+
function formatConfiguredDetachedLimitDivergence(status, values) {
|
|
151
|
+
const changed = STATEFUL_LIMIT_DEFINITIONS.flatMap((definition) => {
|
|
152
|
+
const configured = values[definition.field].value;
|
|
153
|
+
return configured === status.limits[definition.field] ? [] : [`${definition.label.toLowerCase()} ${configured}`];
|
|
154
|
+
});
|
|
155
|
+
return changed.length > 0 ? `Configured after reload: ${changed.join(" \xB7 ")}` : void 0;
|
|
156
|
+
}
|
|
157
|
+
function formatConfiguredDetachedLimits(values) {
|
|
158
|
+
return STATEFUL_LIMIT_DEFINITIONS.map((definition) => {
|
|
159
|
+
const snapshot = values[definition.field];
|
|
160
|
+
return `${definition.label.toLowerCase()} ${snapshot.value} (${snapshot.source})`;
|
|
161
|
+
}).join(" \xB7 ");
|
|
162
|
+
}
|
|
163
|
+
function formatEmptyStatefulRuntime(status) {
|
|
164
|
+
if (!status.enabled) return "Stateful subagents are disabled in user settings.";
|
|
165
|
+
if (!status.initialized) return "Stateful subagents are not initialized for this session.";
|
|
166
|
+
return "No current-session subagents.";
|
|
167
|
+
}
|
|
168
|
+
function parseStatefulLimit(field, value) {
|
|
169
|
+
const normalized = value?.trim() ?? "";
|
|
170
|
+
if (!/^\d+$/u.test(normalized)) return void 0;
|
|
171
|
+
const parsed = Number(normalized);
|
|
172
|
+
return isValidStatefulLimit(field, parsed) ? parsed : void 0;
|
|
173
|
+
}
|
|
174
|
+
function notifyValidationError(field, ctx) {
|
|
175
|
+
const definition = statefulLimitDefinition(field);
|
|
176
|
+
ctx.ui.notify(
|
|
177
|
+
`${definition.label} must be a safe whole number ${definition.minimum === 0 ? "0 or greater" : "1 or greater"}.`,
|
|
178
|
+
"warning"
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
function configuredValues(values) {
|
|
182
|
+
return resolveStatefulLimits(
|
|
183
|
+
Object.fromEntries(Object.entries(values).map(([field, snapshot]) => [field, snapshot.value]))
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
function projectedRemovedAgentIds(agents, current, next) {
|
|
187
|
+
const restorable = agents.filter(
|
|
188
|
+
(agent) => agent.state !== "closed" && agent.workspaceMode !== "worktree"
|
|
189
|
+
);
|
|
190
|
+
const before = projectForReload(restorable, current);
|
|
191
|
+
const afterIds = new Set(projectForReload(restorable, next).map((agent) => agent.id));
|
|
192
|
+
return before.filter((agent) => !afterIds.has(agent.id)).map((agent) => agent.id);
|
|
193
|
+
}
|
|
194
|
+
function projectForReload(agents, limits) {
|
|
195
|
+
const stored = projectAgentRecords(agents, { maxAgents: limits.maxStoredAgents });
|
|
196
|
+
return projectAgentRecords(stored, {
|
|
197
|
+
maxAgents: limits.maxAgents,
|
|
198
|
+
maxDepth: limits.maxDepth
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
function sameIds(left, right) {
|
|
202
|
+
return left.length === right.length && left.every((id, index) => id === right[index]);
|
|
203
|
+
}
|
|
204
|
+
function formatError(error) {
|
|
205
|
+
return safeTerminalLine(error instanceof Error ? error.message : String(error));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// src/workflow-ui.ts
|
|
209
|
+
async function showWorkflowPreview(ctx, current, next, requiresReload, signal) {
|
|
210
|
+
const changes = workflowEffects(current, next);
|
|
211
|
+
return ctx.ui.confirm(
|
|
212
|
+
requiresReload ? "Save delegation change and reload?" : "Save delegation change?",
|
|
213
|
+
[
|
|
214
|
+
`Current: ${workflowLabel(current)}`,
|
|
215
|
+
`New: ${workflowLabel(next)}`,
|
|
216
|
+
"",
|
|
217
|
+
"Effect:",
|
|
218
|
+
...(changes.length > 0 ? changes : ["Keep the current registered tools"]).map(
|
|
219
|
+
(effect) => `- ${effect}`
|
|
220
|
+
),
|
|
221
|
+
`- ${requiresReload ? "Reload the extension to apply this tool surface" : "No reload is needed because the active tools already match"}`
|
|
222
|
+
].join("\n"),
|
|
223
|
+
{ signal }
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
function workflowLabel(value) {
|
|
227
|
+
switch (value) {
|
|
228
|
+
case "all":
|
|
229
|
+
return "All delegation methods";
|
|
230
|
+
case "async-only":
|
|
231
|
+
return "Async only";
|
|
232
|
+
case "blocking-only":
|
|
233
|
+
return "Blocking only";
|
|
234
|
+
case "disabled":
|
|
235
|
+
return "Delegation disabled";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function workflowEffects(current, next) {
|
|
239
|
+
const blockingEnabled = (value) => value === "all" || value === "blocking-only";
|
|
240
|
+
const asyncEnabled = (value) => value === "all" || value === "async-only";
|
|
241
|
+
const effects = [];
|
|
242
|
+
if (blockingEnabled(current) !== blockingEnabled(next)) {
|
|
243
|
+
effects.push(
|
|
244
|
+
blockingEnabled(next) ? "Add blocking `subagent` and read-only `subagent_consult`" : "Remove blocking `subagent` and read-only `subagent_consult`"
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
if (asyncEnabled(current) !== asyncEnabled(next)) {
|
|
248
|
+
effects.push(
|
|
249
|
+
asyncEnabled(next) ? "Add async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`" : "Remove async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`"
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
return effects;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// src/config-status.ts
|
|
256
|
+
function showSubagentStatus(ctx, runtime) {
|
|
257
|
+
if (ctx.mode !== "tui" && !ctx.hasUI) return;
|
|
258
|
+
const snapshot = inspectCompletionDeliverySettings();
|
|
259
|
+
ctx.ui.notify(
|
|
260
|
+
formatStatus(runtime.getRuntimeStatus(), snapshot, runtime),
|
|
261
|
+
snapshot.error ? "warning" : "info"
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
function showSubagentHelp(ctx, runtime) {
|
|
265
|
+
if (ctx.mode !== "tui" && !ctx.hasUI) return;
|
|
266
|
+
ctx.ui.notify(helpLines(runtime).join("\n"), "info");
|
|
267
|
+
}
|
|
268
|
+
function statusLines(runtime) {
|
|
269
|
+
const snapshot = inspectCompletionDeliverySettings();
|
|
270
|
+
return formatStatus(runtime.getRuntimeStatus(), snapshot, runtime).split("\n");
|
|
271
|
+
}
|
|
272
|
+
function helpLines(runtime) {
|
|
273
|
+
const snapshot = inspectCompletionDeliverySettings();
|
|
274
|
+
const cwdPolicy = inspectCwdPolicySettings();
|
|
275
|
+
const parallelLimit = inspectBlockingParallelLimitSettings();
|
|
276
|
+
const detachedLimits = inspectStatefulLimitSettings();
|
|
277
|
+
const transport = inspectStatefulTransportSettings();
|
|
278
|
+
return [
|
|
279
|
+
"/subagents \u2014 choose delegation workflow, manage current agents, and configure agent tools",
|
|
280
|
+
"/subagents settings \u2014 configure target locations, trusted resources, and async completion",
|
|
281
|
+
"/subagents status \u2014 show current-session and user-setting values",
|
|
282
|
+
"/subagents help \u2014 show this help",
|
|
283
|
+
"Target policies control startup directories and resources, not filesystem access or sandboxing.",
|
|
284
|
+
"Manage saved folder trust with Pi /trust and restart Pi after changing it.",
|
|
285
|
+
`Runtime consultation target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,
|
|
286
|
+
`Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)} (${cwdPolicy.consultation.source})`,
|
|
287
|
+
`Runtime delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,
|
|
288
|
+
`Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} (${cwdPolicy.delegation.source})`,
|
|
289
|
+
`Maximum parallel workers: ${runtime.getMaxParallelTasks()} per blocking call`,
|
|
290
|
+
`Configured parallel limit: ${parallelLimit.value} (${parallelLimit.source})`,
|
|
291
|
+
`Detached limits: ${formatDetachedLimitSummary(runtime.getRuntimeStatus())}`,
|
|
292
|
+
`Configured transport: ${transport.value} (${transport.source})`,
|
|
293
|
+
...detachedLimits.values ? [`Configured detached limits: ${formatConfiguredDetachedLimits(detachedLimits.values)}`] : ["Configured detached limits: unavailable; repair user settings"],
|
|
294
|
+
"Detached limits and transport apply after /reload; clear retained agents first if their work must not be interrupted.",
|
|
295
|
+
`User settings: ${safeTerminalLine(snapshot.path)}`
|
|
296
|
+
];
|
|
297
|
+
}
|
|
298
|
+
function formatManagerSummary(runtime, status, configured) {
|
|
299
|
+
const current = currentWorkflow(runtime, status);
|
|
300
|
+
const cwdPolicy = inspectCwdPolicySettings();
|
|
301
|
+
const consult = inspectConsultResourceSettings();
|
|
302
|
+
const detachedLimits = inspectStatefulLimitSettings();
|
|
303
|
+
const transport = inspectStatefulTransportSettings();
|
|
304
|
+
const detachedDivergence = detachedLimits.values ? formatConfiguredDetachedLimitDivergence(status, detachedLimits.values) : void 0;
|
|
305
|
+
return [
|
|
306
|
+
`Delegation: ${workflowLabel(current)}`,
|
|
307
|
+
`Completion: ${completionLabel(status.completionDelivery)}`,
|
|
308
|
+
`Consult target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,
|
|
309
|
+
`Delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,
|
|
310
|
+
`Consult resources: ${consultResourceLabel(runtime.getConsultResourcePolicy())}`,
|
|
311
|
+
`Parallel workers: max ${runtime.getMaxParallelTasks()} per blocking call`,
|
|
312
|
+
`Detached limits: ${formatDetachedLimitSummary(status)}`,
|
|
313
|
+
`Transport: ${status.transport}`,
|
|
314
|
+
`Configured transport: ${transport.value} \xB7 ${transport.source}`,
|
|
315
|
+
`Configured consult target: ${consultationCwdLabel(cwdPolicy.consultation.value)} \xB7 ${cwdPolicy.consultation.source}`,
|
|
316
|
+
`Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} \xB7 ${cwdPolicy.delegation.source}`,
|
|
317
|
+
`Configured consult resources: ${consultResourceLabel(consult.value)} \xB7 ${consult.source}`,
|
|
318
|
+
`Settings: ${safeTerminalLine(cwdPolicy.path)}`,
|
|
319
|
+
`Agents: ${status.activeAgents} active \xB7 ${status.retainedAgents} retained`,
|
|
320
|
+
...detachedDivergence ? [detachedDivergence] : [],
|
|
321
|
+
...configured.value !== current ? [`Configured after reload: ${workflowLabel(configured.value)}`] : [],
|
|
322
|
+
...configured.error || detachedLimits.error ? ["Settings need repair; open Advanced settings for details."] : []
|
|
323
|
+
].join("\n");
|
|
324
|
+
}
|
|
325
|
+
function formatStatus(status, snapshot, runtime) {
|
|
326
|
+
const configuredWorkflow = inspectDelegationWorkflowSettings();
|
|
327
|
+
const consult = inspectConsultResourceSettings();
|
|
328
|
+
const cwdPolicy = inspectCwdPolicySettings();
|
|
329
|
+
const parallelLimit = inspectBlockingParallelLimitSettings();
|
|
330
|
+
const detachedLimits = inspectStatefulLimitSettings();
|
|
331
|
+
const transport = inspectStatefulTransportSettings();
|
|
332
|
+
const current = runtime ? currentWorkflow(runtime, status) : configuredWorkflow.value;
|
|
333
|
+
return [
|
|
334
|
+
"Current session",
|
|
335
|
+
` Delegation: ${workflowLabel(current)}`,
|
|
336
|
+
` Async runtime: ${status.initialized ? "initialized" : status.enabled ? "not initialized" : "disabled"}`,
|
|
337
|
+
` Transport: ${status.transport}`,
|
|
338
|
+
` Configured transport: ${transport.value} (${transport.source})`,
|
|
339
|
+
` Completion: ${completionLabel(status.completionDelivery)}`,
|
|
340
|
+
` Consultation target: ${consultationCwdLabel(runtime?.getConsultationCwdPolicy() ?? cwdPolicy.consultation.value)}`,
|
|
341
|
+
` Delegation target: ${delegationCwdLabel(runtime?.getDelegationCwdPolicy() ?? cwdPolicy.delegation.value)}`,
|
|
342
|
+
` Consultation resources: ${consultResourceLabel(runtime?.getConsultResourcePolicy() ?? consult.value)}`,
|
|
343
|
+
` Maximum parallel workers: ${runtime?.getMaxParallelTasks() ?? parallelLimit.value} per blocking call`,
|
|
344
|
+
` Detached limits: ${formatDetachedLimitSummary(status)}`,
|
|
345
|
+
` Agents: ${status.activeAgents} active, ${status.retainedAgents} retained`,
|
|
346
|
+
"User settings",
|
|
347
|
+
` Delegation source: ${configuredWorkflow.source}`,
|
|
348
|
+
` Configured delegation: ${workflowLabel(configuredWorkflow.value)}`,
|
|
349
|
+
` Completion source: ${snapshot.source}`,
|
|
350
|
+
` Configured completion: ${completionLabel(snapshot.value)}`,
|
|
351
|
+
` Configured parallel limit: ${parallelLimit.value}`,
|
|
352
|
+
` Parallel limit source: ${parallelLimit.source}`,
|
|
353
|
+
...detachedLimits.values ? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {
|
|
354
|
+
const configured = detachedLimits.values?.[definition.field];
|
|
355
|
+
return ` Configured ${definition.label.toLowerCase()}: ${configured?.value} (${configured?.source})`;
|
|
356
|
+
}) : [" Configured detached limits: unavailable"],
|
|
357
|
+
` Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)}`,
|
|
358
|
+
` Consultation target source: ${cwdPolicy.consultation.source}`,
|
|
359
|
+
` Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)}`,
|
|
360
|
+
` Delegation target source: ${cwdPolicy.delegation.source}`,
|
|
361
|
+
` Configured consultation resources: ${consultResourceLabel(consult.value)}`,
|
|
362
|
+
` Consultation resource source: ${consult.source}`,
|
|
363
|
+
` Path: ${safeTerminalLine(snapshot.path)}`,
|
|
364
|
+
configuredWorkflow.error || snapshot.error || cwdPolicy.error || parallelLimit.error || detachedLimits.error || transport.error ? ` Warning: ${safeTerminalLine(configuredWorkflow.error ?? snapshot.error ?? cwdPolicy.error ?? parallelLimit.error ?? detachedLimits.error ?? transport.error ?? "invalid settings")}` : " Warning: none",
|
|
365
|
+
configuredWorkflow.value !== current ? "Configured delegation differs from this session. Run /reload to apply it." : "Manual file changes require /reload."
|
|
366
|
+
].join("\n");
|
|
367
|
+
}
|
|
368
|
+
function currentWorkflow(runtime, status) {
|
|
369
|
+
const blocking = runtime.getBlockingEnabled();
|
|
370
|
+
if (blocking && status.enabled) return "all";
|
|
371
|
+
if (status.enabled) return "async-only";
|
|
372
|
+
if (blocking) return "blocking-only";
|
|
373
|
+
return "disabled";
|
|
374
|
+
}
|
|
375
|
+
function completionLabel(value) {
|
|
376
|
+
return value === "auto-resume" ? "Resume automatically when finished" : "Wait until my next turn";
|
|
377
|
+
}
|
|
378
|
+
function consultationCwdLabel(value) {
|
|
379
|
+
return value === "current-workspace" ? "Current workspace only" : "Anywhere \xB7 untrusted targets inherit nothing";
|
|
380
|
+
}
|
|
381
|
+
function delegationCwdLabel(value) {
|
|
382
|
+
switch (value) {
|
|
383
|
+
case "trusted-targets":
|
|
384
|
+
return "Current or saved-trusted folders";
|
|
385
|
+
case "current-workspace":
|
|
386
|
+
return "Current workspace only";
|
|
387
|
+
case "anywhere":
|
|
388
|
+
return "Anywhere \xB7 normal Pi permissions";
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function consultResourceLabel(value) {
|
|
392
|
+
switch (value) {
|
|
393
|
+
case "project-context":
|
|
394
|
+
return "Project context only";
|
|
395
|
+
case "none":
|
|
396
|
+
return "No inherited resources";
|
|
397
|
+
case "all":
|
|
398
|
+
return "All trusted resources";
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export {
|
|
403
|
+
statefulLimitListScreen,
|
|
404
|
+
statefulLimitInputScreen,
|
|
405
|
+
applyStatefulLimitSetting,
|
|
406
|
+
formatDetachedLimitSummary,
|
|
407
|
+
formatEmptyStatefulRuntime,
|
|
408
|
+
showWorkflowPreview,
|
|
409
|
+
workflowLabel,
|
|
410
|
+
showSubagentStatus,
|
|
411
|
+
showSubagentHelp,
|
|
412
|
+
statusLines,
|
|
413
|
+
helpLines,
|
|
414
|
+
formatManagerSummary,
|
|
415
|
+
currentWorkflow,
|
|
416
|
+
completionLabel,
|
|
417
|
+
consultationCwdLabel,
|
|
418
|
+
delegationCwdLabel,
|
|
419
|
+
consultResourceLabel
|
|
420
|
+
};
|
|
421
|
+
//# sourceMappingURL=chunk-EFBPISNT.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/stateful-limit-ui.ts", "../../src/workflow-ui.ts", "../../src/config-status.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { projectAgentRecords } from \"./agent-projection.js\";\nimport type { ManagedAgent } from \"./registry.js\";\nimport { safeTerminalLine as safeTerminalText } from \"./safe-text.js\";\nimport { inspectStatefulLimitSettings, updateStatefulLimitSetting } from \"./settings.js\";\nimport type { StatefulSubagentRuntimeStatus } from \"./stateful.js\";\nimport {\n\tisValidStatefulLimit,\n\tresolveStatefulLimits,\n\tSTATEFUL_LIMIT_DEFINITIONS,\n\ttype StatefulLimitField,\n\ttype StatefulLimits,\n\tstatefulLimitDefinition,\n} from \"./stateful-limits.js\";\n\nexport interface StatefulLimitRuntime {\n\tgetRuntimeStatus(): StatefulSubagentRuntimeStatus;\n\tlistAgents(includeClosed?: boolean): ManagedAgent[];\n}\n\nexport interface StatefulLimitApplyOptions {\n\tsignal: AbortSignal;\n\tisCurrent(): boolean;\n}\n\nexport function statefulLimitListScreen(runtime: StatefulLimitRuntime) {\n\tconst inspected = inspectStatefulLimitSettings();\n\tconst current = runtime.getRuntimeStatus().limits;\n\treturn {\n\t\tkind: \"actions\" as const,\n\t\ttitle: \"Detached Agent Limits\",\n\t\tlines: [\n\t\t\t\"These limits apply after /reload or the next Pi session.\",\n\t\t\t\"Reloading can interrupt retained detached work.\",\n\t\t\t...(inspected.error\n\t\t\t\t? [\n\t\t\t\t\t\t`Settings cannot be edited: ${safeTerminalText(inspected.error)}`,\n\t\t\t\t\t\t`Repair ${safeTerminalText(inspected.path)} and retry.`,\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t],\n\t\titems: [\n\t\t\t...(inspected.values\n\t\t\t\t? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\t\t\t\t\tconst configured = inspected.values?.[definition.field];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: definition.field,\n\t\t\t\t\t\t\tlabel: definition.label,\n\t\t\t\t\t\t\tdescription: `Current ${current[definition.field]} \u00B7 configured ${configured?.value ?? \"unavailable\"} (${configured?.source ?? \"unknown\"})`,\n\t\t\t\t\t\t\taction: \"pick-stateful-limit\" as const,\n\t\t\t\t\t\t};\n\t\t\t\t\t})\n\t\t\t\t: []),\n\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" as const },\n\t\t],\n\t\thint: \"back\" as const,\n\t};\n}\n\nexport function statefulLimitInputScreen(field: StatefulLimitField, runtime: StatefulLimitRuntime) {\n\tconst definition = statefulLimitDefinition(field);\n\tconst inspected = inspectStatefulLimitSettings();\n\tconst configured = inspected.values?.[field];\n\treturn {\n\t\tkind: \"input\" as const,\n\t\ttitle: definition.label,\n\t\tlines: [\n\t\t\tdefinition.description,\n\t\t\t`Current session: ${runtime.getRuntimeStatus().limits[field]}`,\n\t\t\t`Configured after reload: ${configured?.value ?? \"unavailable\"} (${configured?.source ?? \"unknown\"})`,\n\t\t\t`Allowed: whole numbers ${definition.minimum === 0 ? \"0 or greater\" : \"1 or greater\"}`,\n\t\t\t`Read from: ${safeTerminalText(inspected.path)}`,\n\t\t\t...(inspected.writePath !== inspected.path\n\t\t\t\t? [`Saves to: ${safeTerminalText(inspected.writePath)}`]\n\t\t\t\t: []),\n\t\t],\n\t\tplaceholder: \"Enter a whole number\",\n\t\taction: \"set-stateful-limit\" as const,\n\t\thint: \"back\" as const,\n\t};\n}\n\nexport async function applyStatefulLimitSetting(\n\tfield: StatefulLimitField,\n\tvalue: string | undefined,\n\tctx: ExtensionCommandContext,\n\truntime: StatefulLimitRuntime,\n\toptions: StatefulLimitApplyOptions,\n) {\n\tconst next = parseStatefulLimit(field, value);\n\tif (next === undefined) {\n\t\tnotifyValidationError(field, ctx);\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tconst inspected = inspectStatefulLimitSettings();\n\tif (inspected.error || !inspected.values) {\n\t\tif (options.isCurrent() && !options.signal.aborted) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Subagent settings cannot be edited: ${safeTerminalText(inspected.error ?? \"settings are unavailable\")}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tconst expected = configuredValues(inspected.values);\n\tif (next === expected[field]) return { kind: \"back\" as const };\n\n\tconst beforeAgents = runtime.listAgents();\n\tconst affectedBefore = projectedRemovedAgentIds(beforeAgents, expected, {\n\t\t...expected,\n\t\t[field]: next,\n\t});\n\tif (affectedBefore.length > 0) {\n\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t`Lower ${statefulLimitDefinition(field).label}?`,\n\t\t\t[\n\t\t\t\t`This configured value would omit ${affectedBefore.length} currently retained agent record${affectedBefore.length === 1 ? \"\" : \"s\"} from projected recovery after reload.`,\n\t\t\t\t\"No agent is closed now, and this menu will not reload Pi.\",\n\t\t\t\t\"A later state rewrite can make omitted records unavailable for recovery.\",\n\t\t\t].join(\"\\n\\n\"),\n\t\t\t{ signal: options.signal },\n\t\t);\n\t\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\t\tif (!confirmed) return { kind: \"rejected\" as const };\n\t\tconst affectedAfter = projectedRemovedAgentIds(runtime.listAgents(), expected, {\n\t\t\t...expected,\n\t\t\t[field]: next,\n\t\t});\n\t\tif (!sameIds(affectedBefore, affectedAfter)) {\n\t\t\tctx.ui.notify(\"Detached agents changed while confirming; review the limit again.\", \"warning\");\n\t\t\treturn { kind: \"rejected\" as const };\n\t\t}\n\t}\n\n\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\ttry {\n\t\tupdateStatefulLimitSetting(field, next, expected);\n\t} catch (error) {\n\t\tif (options.isCurrent() && !options.signal.aborted) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Detached limit was not saved; the previous setting is unchanged: ${formatError(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\tctx.ui.notify(\n\t\t`Saved ${statefulLimitDefinition(field).label.toLowerCase()}: ${next}. Applies after /reload; clear retained agents before reloading if their work must not be interrupted.`,\n\t\t\"info\",\n\t);\n\treturn { kind: \"back\" as const };\n}\n\nexport function formatDetachedLimitSummary(status: StatefulSubagentRuntimeStatus): string {\n\treturn [\n\t\t`${status.limits.maxAgents} retained`,\n\t\t`${status.limits.maxActiveTurns} active turns`,\n\t\t`${status.limits.maxChildrenPerAgent} children`,\n\t\t`depth ${status.limits.maxDepth}`,\n\t\t`${status.limits.maxStoredAgents} stored`,\n\t].join(\" \u00B7 \");\n}\n\nexport function formatConfiguredDetachedLimitDivergence(\n\tstatus: StatefulSubagentRuntimeStatus,\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): string | undefined {\n\tconst changed = STATEFUL_LIMIT_DEFINITIONS.flatMap((definition) => {\n\t\tconst configured = values[definition.field].value;\n\t\treturn configured === status.limits[definition.field]\n\t\t\t? []\n\t\t\t: [`${definition.label.toLowerCase()} ${configured}`];\n\t});\n\treturn changed.length > 0 ? `Configured after reload: ${changed.join(\" \u00B7 \")}` : undefined;\n}\n\nexport function formatConfiguredDetachedLimits(\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): string {\n\treturn STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\tconst snapshot = values[definition.field];\n\t\treturn `${definition.label.toLowerCase()} ${snapshot.value} (${snapshot.source})`;\n\t}).join(\" \u00B7 \");\n}\n\nexport function formatEmptyStatefulRuntime(status: StatefulSubagentRuntimeStatus): string {\n\tif (!status.enabled) return \"Stateful subagents are disabled in user settings.\";\n\tif (!status.initialized) return \"Stateful subagents are not initialized for this session.\";\n\treturn \"No current-session subagents.\";\n}\n\nfunction parseStatefulLimit(\n\tfield: StatefulLimitField,\n\tvalue: string | undefined,\n): number | undefined {\n\tconst normalized = value?.trim() ?? \"\";\n\tif (!/^\\d+$/u.test(normalized)) return undefined;\n\tconst parsed = Number(normalized);\n\treturn isValidStatefulLimit(field, parsed) ? parsed : undefined;\n}\n\nfunction notifyValidationError(field: StatefulLimitField, ctx: ExtensionCommandContext): void {\n\tconst definition = statefulLimitDefinition(field);\n\tctx.ui.notify(\n\t\t`${definition.label} must be a safe whole number ${definition.minimum === 0 ? \"0 or greater\" : \"1 or greater\"}.`,\n\t\t\"warning\",\n\t);\n}\n\nfunction configuredValues(\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): StatefulLimits {\n\treturn resolveStatefulLimits(\n\t\tObject.fromEntries(Object.entries(values).map(([field, snapshot]) => [field, snapshot.value])),\n\t);\n}\n\nfunction projectedRemovedAgentIds(\n\tagents: readonly ManagedAgent[],\n\tcurrent: StatefulLimits,\n\tnext: StatefulLimits,\n): string[] {\n\tconst restorable = agents.filter(\n\t\t(agent) => agent.state !== \"closed\" && agent.workspaceMode !== \"worktree\",\n\t);\n\tconst before = projectForReload(restorable, current);\n\tconst afterIds = new Set(projectForReload(restorable, next).map((agent) => agent.id));\n\treturn before.filter((agent) => !afterIds.has(agent.id)).map((agent) => agent.id);\n}\n\nfunction projectForReload(agents: readonly ManagedAgent[], limits: StatefulLimits): ManagedAgent[] {\n\tconst stored = projectAgentRecords(agents, { maxAgents: limits.maxStoredAgents });\n\treturn projectAgentRecords(stored, {\n\t\tmaxAgents: limits.maxAgents,\n\t\tmaxDepth: limits.maxDepth,\n\t});\n}\n\nfunction sameIds(left: readonly string[], right: readonly string[]): boolean {\n\treturn left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction formatError(error: unknown): string {\n\treturn safeTerminalText(error instanceof Error ? error.message : String(error));\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { DelegationWorkflow } from \"./settings/inspection.js\";\n\nexport async function showWorkflowPreview(\n\tctx: ExtensionCommandContext,\n\tcurrent: DelegationWorkflow,\n\tnext: DelegationWorkflow,\n\trequiresReload: boolean,\n\tsignal: AbortSignal,\n): Promise<boolean> {\n\tconst changes = workflowEffects(current, next);\n\treturn ctx.ui.confirm(\n\t\trequiresReload ? \"Save delegation change and reload?\" : \"Save delegation change?\",\n\t\t[\n\t\t\t`Current: ${workflowLabel(current)}`,\n\t\t\t`New: ${workflowLabel(next)}`,\n\t\t\t\"\",\n\t\t\t\"Effect:\",\n\t\t\t...(changes.length > 0 ? changes : [\"Keep the current registered tools\"]).map(\n\t\t\t\t(effect) => `- ${effect}`,\n\t\t\t),\n\t\t\t`- ${requiresReload ? \"Reload the extension to apply this tool surface\" : \"No reload is needed because the active tools already match\"}`,\n\t\t].join(\"\\n\"),\n\t\t{ signal },\n\t);\n}\n\nexport function workflowLabel(value: DelegationWorkflow): string {\n\tswitch (value) {\n\t\tcase \"all\":\n\t\t\treturn \"All delegation methods\";\n\t\tcase \"async-only\":\n\t\t\treturn \"Async only\";\n\t\tcase \"blocking-only\":\n\t\t\treturn \"Blocking only\";\n\t\tcase \"disabled\":\n\t\t\treturn \"Delegation disabled\";\n\t}\n}\n\nfunction workflowEffects(current: DelegationWorkflow, next: DelegationWorkflow): string[] {\n\tconst blockingEnabled = (value: DelegationWorkflow) =>\n\t\tvalue === \"all\" || value === \"blocking-only\";\n\tconst asyncEnabled = (value: DelegationWorkflow) => value === \"all\" || value === \"async-only\";\n\tconst effects: string[] = [];\n\tif (blockingEnabled(current) !== blockingEnabled(next)) {\n\t\teffects.push(\n\t\t\tblockingEnabled(next)\n\t\t\t\t? \"Add blocking `subagent` and read-only `subagent_consult`\"\n\t\t\t\t: \"Remove blocking `subagent` and read-only `subagent_consult`\",\n\t\t);\n\t}\n\tif (asyncEnabled(current) !== asyncEnabled(next)) {\n\t\teffects.push(\n\t\t\tasyncEnabled(next)\n\t\t\t\t? \"Add async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`\"\n\t\t\t\t: \"Remove async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`\",\n\t\t);\n\t}\n\treturn effects;\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type {\n\tCompletionDelivery,\n\tConsultationCwdPolicy,\n\tConsultResourcePolicy,\n\tDelegationCwdPolicy,\n} from \"./agents/types.js\";\nimport type { SubagentSettingsRuntime } from \"./config-ui.js\";\nimport { safeTerminalLine as safeTerminalText } from \"./safe-text.js\";\nimport type { DelegationWorkflow } from \"./settings/inspection.js\";\nimport {\n\tinspectBlockingParallelLimitSettings,\n\tinspectCompletionDeliverySettings,\n\tinspectConsultResourceSettings,\n\tinspectCwdPolicySettings,\n\tinspectDelegationWorkflowSettings,\n\tinspectStatefulLimitSettings,\n\tinspectStatefulTransportSettings,\n} from \"./settings.js\";\nimport type { StatefulSubagentRuntimeStatus } from \"./stateful.js\";\nimport {\n\tformatConfiguredDetachedLimitDivergence,\n\tformatConfiguredDetachedLimits,\n\tformatDetachedLimitSummary,\n} from \"./stateful-limit-ui.js\";\nimport { STATEFUL_LIMIT_DEFINITIONS } from \"./stateful-limits.js\";\nimport { workflowLabel } from \"./workflow-ui.js\";\n\nexport function showSubagentStatus(\n\tctx: ExtensionCommandContext,\n\truntime: SubagentSettingsRuntime,\n): void {\n\tif (ctx.mode !== \"tui\" && !ctx.hasUI) return;\n\tconst snapshot = inspectCompletionDeliverySettings();\n\tctx.ui.notify(\n\t\tformatStatus(runtime.getRuntimeStatus(), snapshot, runtime),\n\t\tsnapshot.error ? \"warning\" : \"info\",\n\t);\n}\n\nexport function showSubagentHelp(\n\tctx: ExtensionCommandContext,\n\truntime: SubagentSettingsRuntime,\n): void {\n\tif (ctx.mode !== \"tui\" && !ctx.hasUI) return;\n\tctx.ui.notify(helpLines(runtime).join(\"\\n\"), \"info\");\n}\n\nexport function statusLines(runtime: SubagentSettingsRuntime): string[] {\n\tconst snapshot = inspectCompletionDeliverySettings();\n\treturn formatStatus(runtime.getRuntimeStatus(), snapshot, runtime).split(\"\\n\");\n}\n\nexport function helpLines(runtime: SubagentSettingsRuntime): string[] {\n\tconst snapshot = inspectCompletionDeliverySettings();\n\tconst cwdPolicy = inspectCwdPolicySettings();\n\tconst parallelLimit = inspectBlockingParallelLimitSettings();\n\tconst detachedLimits = inspectStatefulLimitSettings();\n\tconst transport = inspectStatefulTransportSettings();\n\treturn [\n\t\t\"/subagents \u2014 choose delegation workflow, manage current agents, and configure agent tools\",\n\t\t\"/subagents settings \u2014 configure target locations, trusted resources, and async completion\",\n\t\t\"/subagents status \u2014 show current-session and user-setting values\",\n\t\t\"/subagents help \u2014 show this help\",\n\t\t\"Target policies control startup directories and resources, not filesystem access or sandboxing.\",\n\t\t\"Manage saved folder trust with Pi /trust and restart Pi after changing it.\",\n\t\t`Runtime consultation target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,\n\t\t`Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)} (${cwdPolicy.consultation.source})`,\n\t\t`Runtime delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,\n\t\t`Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} (${cwdPolicy.delegation.source})`,\n\t\t`Maximum parallel workers: ${runtime.getMaxParallelTasks()} per blocking call`,\n\t\t`Configured parallel limit: ${parallelLimit.value} (${parallelLimit.source})`,\n\t\t`Detached limits: ${formatDetachedLimitSummary(runtime.getRuntimeStatus())}`,\n\t\t`Configured transport: ${transport.value} (${transport.source})`,\n\t\t...(detachedLimits.values\n\t\t\t? [`Configured detached limits: ${formatConfiguredDetachedLimits(detachedLimits.values)}`]\n\t\t\t: [\"Configured detached limits: unavailable; repair user settings\"]),\n\t\t\"Detached limits and transport apply after /reload; clear retained agents first if their work must not be interrupted.\",\n\t\t`User settings: ${safeTerminalText(snapshot.path)}`,\n\t];\n}\n\nexport function formatManagerSummary(\n\truntime: SubagentSettingsRuntime,\n\tstatus: StatefulSubagentRuntimeStatus,\n\tconfigured: ReturnType<typeof inspectDelegationWorkflowSettings>,\n): string {\n\tconst current = currentWorkflow(runtime, status);\n\tconst cwdPolicy = inspectCwdPolicySettings();\n\tconst consult = inspectConsultResourceSettings();\n\tconst detachedLimits = inspectStatefulLimitSettings();\n\tconst transport = inspectStatefulTransportSettings();\n\tconst detachedDivergence = detachedLimits.values\n\t\t? formatConfiguredDetachedLimitDivergence(status, detachedLimits.values)\n\t\t: undefined;\n\treturn [\n\t\t`Delegation: ${workflowLabel(current)}`,\n\t\t`Completion: ${completionLabel(status.completionDelivery)}`,\n\t\t`Consult target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,\n\t\t`Delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,\n\t\t`Consult resources: ${consultResourceLabel(runtime.getConsultResourcePolicy())}`,\n\t\t`Parallel workers: max ${runtime.getMaxParallelTasks()} per blocking call`,\n\t\t`Detached limits: ${formatDetachedLimitSummary(status)}`,\n\t\t`Transport: ${status.transport}`,\n\t\t`Configured transport: ${transport.value} \u00B7 ${transport.source}`,\n\t\t`Configured consult target: ${consultationCwdLabel(cwdPolicy.consultation.value)} \u00B7 ${cwdPolicy.consultation.source}`,\n\t\t`Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} \u00B7 ${cwdPolicy.delegation.source}`,\n\t\t`Configured consult resources: ${consultResourceLabel(consult.value)} \u00B7 ${consult.source}`,\n\t\t`Settings: ${safeTerminalText(cwdPolicy.path)}`,\n\t\t`Agents: ${status.activeAgents} active \u00B7 ${status.retainedAgents} retained`,\n\t\t...(detachedDivergence ? [detachedDivergence] : []),\n\t\t...(configured.value !== current\n\t\t\t? [`Configured after reload: ${workflowLabel(configured.value)}`]\n\t\t\t: []),\n\t\t...(configured.error || detachedLimits.error\n\t\t\t? [\"Settings need repair; open Advanced settings for details.\"]\n\t\t\t: []),\n\t].join(\"\\n\");\n}\n\nfunction formatStatus(\n\tstatus: StatefulSubagentRuntimeStatus,\n\tsnapshot: ReturnType<typeof inspectCompletionDeliverySettings>,\n\truntime?: SubagentSettingsRuntime,\n): string {\n\tconst configuredWorkflow = inspectDelegationWorkflowSettings();\n\tconst consult = inspectConsultResourceSettings();\n\tconst cwdPolicy = inspectCwdPolicySettings();\n\tconst parallelLimit = inspectBlockingParallelLimitSettings();\n\tconst detachedLimits = inspectStatefulLimitSettings();\n\tconst transport = inspectStatefulTransportSettings();\n\tconst current = runtime ? currentWorkflow(runtime, status) : configuredWorkflow.value;\n\treturn [\n\t\t\"Current session\",\n\t\t` Delegation: ${workflowLabel(current)}`,\n\t\t` Async runtime: ${status.initialized ? \"initialized\" : status.enabled ? \"not initialized\" : \"disabled\"}`,\n\t\t` Transport: ${status.transport}`,\n\t\t` Configured transport: ${transport.value} (${transport.source})`,\n\t\t` Completion: ${completionLabel(status.completionDelivery)}`,\n\t\t` Consultation target: ${consultationCwdLabel(runtime?.getConsultationCwdPolicy() ?? cwdPolicy.consultation.value)}`,\n\t\t` Delegation target: ${delegationCwdLabel(runtime?.getDelegationCwdPolicy() ?? cwdPolicy.delegation.value)}`,\n\t\t` Consultation resources: ${consultResourceLabel(runtime?.getConsultResourcePolicy() ?? consult.value)}`,\n\t\t` Maximum parallel workers: ${runtime?.getMaxParallelTasks() ?? parallelLimit.value} per blocking call`,\n\t\t` Detached limits: ${formatDetachedLimitSummary(status)}`,\n\t\t` Agents: ${status.activeAgents} active, ${status.retainedAgents} retained`,\n\t\t\"User settings\",\n\t\t` Delegation source: ${configuredWorkflow.source}`,\n\t\t` Configured delegation: ${workflowLabel(configuredWorkflow.value)}`,\n\t\t` Completion source: ${snapshot.source}`,\n\t\t` Configured completion: ${completionLabel(snapshot.value)}`,\n\t\t` Configured parallel limit: ${parallelLimit.value}`,\n\t\t` Parallel limit source: ${parallelLimit.source}`,\n\t\t...(detachedLimits.values\n\t\t\t? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\t\t\t\tconst configured = detachedLimits.values?.[definition.field];\n\t\t\t\t\treturn ` Configured ${definition.label.toLowerCase()}: ${configured?.value} (${configured?.source})`;\n\t\t\t\t})\n\t\t\t: [\" Configured detached limits: unavailable\"]),\n\t\t` Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)}`,\n\t\t` Consultation target source: ${cwdPolicy.consultation.source}`,\n\t\t` Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)}`,\n\t\t` Delegation target source: ${cwdPolicy.delegation.source}`,\n\t\t` Configured consultation resources: ${consultResourceLabel(consult.value)}`,\n\t\t` Consultation resource source: ${consult.source}`,\n\t\t` Path: ${safeTerminalText(snapshot.path)}`,\n\t\tconfiguredWorkflow.error ||\n\t\tsnapshot.error ||\n\t\tcwdPolicy.error ||\n\t\tparallelLimit.error ||\n\t\tdetachedLimits.error ||\n\t\ttransport.error\n\t\t\t? ` Warning: ${safeTerminalText(configuredWorkflow.error ?? snapshot.error ?? cwdPolicy.error ?? parallelLimit.error ?? detachedLimits.error ?? transport.error ?? \"invalid settings\")}`\n\t\t\t: \" Warning: none\",\n\t\tconfiguredWorkflow.value !== current\n\t\t\t? \"Configured delegation differs from this session. Run /reload to apply it.\"\n\t\t\t: \"Manual file changes require /reload.\",\n\t].join(\"\\n\");\n}\n\nexport function currentWorkflow(\n\truntime: SubagentSettingsRuntime,\n\tstatus: StatefulSubagentRuntimeStatus,\n): DelegationWorkflow {\n\tconst blocking = runtime.getBlockingEnabled();\n\tif (blocking && status.enabled) return \"all\";\n\tif (status.enabled) return \"async-only\";\n\tif (blocking) return \"blocking-only\";\n\treturn \"disabled\";\n}\n\nexport function completionLabel(value: CompletionDelivery): string {\n\treturn value === \"auto-resume\" ? \"Resume automatically when finished\" : \"Wait until my next turn\";\n}\n\nexport function consultationCwdLabel(value: ConsultationCwdPolicy): string {\n\treturn value === \"current-workspace\"\n\t\t? \"Current workspace only\"\n\t\t: \"Anywhere \u00B7 untrusted targets inherit nothing\";\n}\n\nexport function delegationCwdLabel(value: DelegationCwdPolicy): string {\n\tswitch (value) {\n\t\tcase \"trusted-targets\":\n\t\t\treturn \"Current or saved-trusted folders\";\n\t\tcase \"current-workspace\":\n\t\t\treturn \"Current workspace only\";\n\t\tcase \"anywhere\":\n\t\t\treturn \"Anywhere \u00B7 normal Pi permissions\";\n\t}\n}\n\nexport function consultResourceLabel(value: ConsultResourcePolicy): string {\n\tswitch (value) {\n\t\tcase \"project-context\":\n\t\t\treturn \"Project context only\";\n\t\tcase \"none\":\n\t\t\treturn \"No inherited resources\";\n\t\tcase \"all\":\n\t\t\treturn \"All trusted resources\";\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
MAX_TOOL_MESSAGE_BYTES,
|
|
5
|
+
redactPrivateText,
|
|
6
|
+
truncateUtf8
|
|
7
|
+
} from "./chunk-H3FP6DLR.ts";
|
|
8
|
+
|
|
9
|
+
// src/child-peer-tools.ts
|
|
10
|
+
import { defineTool } from "@earendil-works/pi-coding-agent";
|
|
11
|
+
import { Type } from "typebox";
|
|
12
|
+
var MAX_PEER_MESSAGE_BYTES = 16 * 1024;
|
|
13
|
+
var MAX_DEDUPLICATION_KEY_LENGTH = 256;
|
|
14
|
+
var PEER_ENVELOPE_HEADER = /^Message Type: SUBAGENT_(?:COMPLETION|PEER_MESSAGE)\nProtocol: pi-subagents:v1\nMessage ID: (msg_[^\s]+)\n(?:Completion ID: (completion:[^\s]+)\n)?Sender ID: [^\n]+\n(?:Sender Path: [^\n]+\n)?Payload:\n/u;
|
|
15
|
+
function createChildPeerExtension(client) {
|
|
16
|
+
return (pi) => {
|
|
17
|
+
pi.registerTool(
|
|
18
|
+
defineTool({
|
|
19
|
+
name: "subagent_peer_send",
|
|
20
|
+
label: "Send Peer Message",
|
|
21
|
+
description: "Send a bounded queue-only message to /root or another retained agent by canonical task path. The runtime binds your sender identity; this tool never starts an idle turn.",
|
|
22
|
+
promptSnippet: "Send a queue-only message to another retained agent",
|
|
23
|
+
parameters: Type.Object(
|
|
24
|
+
{
|
|
25
|
+
target: Type.String({ minLength: 1, maxLength: 2048 }),
|
|
26
|
+
message: Type.String({ minLength: 1, maxLength: MAX_PEER_MESSAGE_BYTES }),
|
|
27
|
+
deduplicationKey: Type.Optional(
|
|
28
|
+
Type.String({ minLength: 1, maxLength: MAX_DEDUPLICATION_KEY_LENGTH })
|
|
29
|
+
)
|
|
30
|
+
},
|
|
31
|
+
{ additionalProperties: false }
|
|
32
|
+
),
|
|
33
|
+
async execute(_id, params) {
|
|
34
|
+
const message = await client.send(params.target, params.message, params.deduplicationKey);
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `Queued ${message.id} for ${message.recipientId}; delivery does not start an idle turn.`
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
details: {
|
|
43
|
+
messageId: message.id,
|
|
44
|
+
recipientId: message.recipientId,
|
|
45
|
+
createdAt: message.createdAt
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
);
|
|
51
|
+
pi.registerTool(
|
|
52
|
+
defineTool({
|
|
53
|
+
name: "subagent_peer_list",
|
|
54
|
+
label: "List Peers",
|
|
55
|
+
description: "List bounded identity and lifecycle metadata for /root and retained agents in this session.",
|
|
56
|
+
promptSnippet: "List retained peer task paths",
|
|
57
|
+
parameters: Type.Object({}, { additionalProperties: false }),
|
|
58
|
+
async execute() {
|
|
59
|
+
const peers = await client.list();
|
|
60
|
+
const text = truncateUtf8(JSON.stringify(peers, null, 2), MAX_TOOL_MESSAGE_BYTES).text;
|
|
61
|
+
return { content: [{ type: "text", text }], details: { peers } };
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
const acknowledgedMessageIds = /* @__PURE__ */ new Set();
|
|
66
|
+
const acknowledgedCompletionIds = /* @__PURE__ */ new Set();
|
|
67
|
+
pi.on("context", async (event) => {
|
|
68
|
+
const visible = visibleDeliveryIds(event.messages);
|
|
69
|
+
const messageIds = [...visible.messageIds].filter((id) => !acknowledgedMessageIds.has(id));
|
|
70
|
+
const completionIds = [...visible.completionIds].filter(
|
|
71
|
+
(id) => !acknowledgedCompletionIds.has(id)
|
|
72
|
+
);
|
|
73
|
+
if (messageIds.length === 0 && completionIds.length === 0) return;
|
|
74
|
+
await client.acknowledge(messageIds, completionIds);
|
|
75
|
+
for (const id of messageIds) acknowledgedMessageIds.add(id);
|
|
76
|
+
for (const id of completionIds) acknowledgedCompletionIds.add(id);
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function formatPeerMessage(message, senderPath) {
|
|
81
|
+
return truncateUtf8(
|
|
82
|
+
[
|
|
83
|
+
`Message Type: ${message.completionId ? "SUBAGENT_COMPLETION" : "SUBAGENT_PEER_MESSAGE"}`,
|
|
84
|
+
"Protocol: pi-subagents:v1",
|
|
85
|
+
`Message ID: ${message.id}`,
|
|
86
|
+
...message.completionId ? [`Completion ID: ${message.completionId}`] : [],
|
|
87
|
+
`Sender ID: ${message.senderId}`,
|
|
88
|
+
...senderPath ? [`Sender Path: ${senderPath}`] : [],
|
|
89
|
+
"Payload:",
|
|
90
|
+
redactPrivateText(message.content)
|
|
91
|
+
].join("\n"),
|
|
92
|
+
MAX_TOOL_MESSAGE_BYTES
|
|
93
|
+
).text;
|
|
94
|
+
}
|
|
95
|
+
function visibleDeliveryIds(messages) {
|
|
96
|
+
const messageIds = /* @__PURE__ */ new Set();
|
|
97
|
+
const completionIds = /* @__PURE__ */ new Set();
|
|
98
|
+
for (const message of messages) {
|
|
99
|
+
for (const text of messageText(message)) {
|
|
100
|
+
const match = PEER_ENVELOPE_HEADER.exec(text);
|
|
101
|
+
if (!match) continue;
|
|
102
|
+
messageIds.add(match[1]);
|
|
103
|
+
if (match[2]) completionIds.add(match[2]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { messageIds, completionIds };
|
|
107
|
+
}
|
|
108
|
+
function messageText(message) {
|
|
109
|
+
if (!message || typeof message !== "object" || Array.isArray(message)) return [];
|
|
110
|
+
const candidate = message;
|
|
111
|
+
if (candidate.role !== "user") return [];
|
|
112
|
+
const content = candidate.content;
|
|
113
|
+
if (typeof content === "string") return [content];
|
|
114
|
+
if (!Array.isArray(content)) return [];
|
|
115
|
+
return content.flatMap((part) => {
|
|
116
|
+
if (!part || typeof part !== "object" || Array.isArray(part)) return [];
|
|
117
|
+
const text = part.text;
|
|
118
|
+
return typeof text === "string" ? [text] : [];
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/peer-transport.ts
|
|
123
|
+
import { fileURLToPath } from "node:url";
|
|
124
|
+
var CHILD_PEER_TOOL_NAMES = ["subagent_peer_send", "subagent_peer_list"];
|
|
125
|
+
function createInProcessPeerExtension(runtime, agentId) {
|
|
126
|
+
return createChildPeerExtension({
|
|
127
|
+
send: (target, message, deduplicationKey) => runtime.send(agentId, target, message, deduplicationKey),
|
|
128
|
+
list: async () => runtime.list(agentId),
|
|
129
|
+
acknowledge: (messageIds, completionIds) => runtime.acknowledge(agentId, messageIds, completionIds)
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function childPeerBridgePath() {
|
|
133
|
+
return fileURLToPath(new URL("./child-peer-bridge.ts", import.meta.url));
|
|
134
|
+
}
|
|
135
|
+
function peerBridgeEnvironment(credentials) {
|
|
136
|
+
return {
|
|
137
|
+
PI_SUBAGENT_PEER_HOST: credentials.host,
|
|
138
|
+
PI_SUBAGENT_PEER_PORT: String(credentials.port),
|
|
139
|
+
PI_SUBAGENT_PEER_TOKEN: credentials.token
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
formatPeerMessage,
|
|
145
|
+
CHILD_PEER_TOOL_NAMES,
|
|
146
|
+
createInProcessPeerExtension,
|
|
147
|
+
childPeerBridgePath,
|
|
148
|
+
peerBridgeEnvironment
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=chunk-EWWXFU7N.ts.map
|