@narumitw/pi-subagents 2.0.0 → 2.0.2
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 +21 -8
- 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 +8 -4
- 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,518 @@
|
|
|
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
|
+
resolveConsultTools
|
|
5
|
+
} from "./chunk-UMBPMVJW.js";
|
|
6
|
+
import {
|
|
7
|
+
assertConsultationTargetAllowed,
|
|
8
|
+
resolveSubagentTarget
|
|
9
|
+
} from "./chunk-HA36LPCO.js";
|
|
10
|
+
import {
|
|
11
|
+
runSingleAgent
|
|
12
|
+
} from "./chunk-DQMN4OYM.js";
|
|
13
|
+
import "./chunk-IGAMVWFN.js";
|
|
14
|
+
import "./chunk-47SK2QYC.js";
|
|
15
|
+
import "./chunk-HKC4ES4B.js";
|
|
16
|
+
import "./chunk-DSOOH73Y.js";
|
|
17
|
+
import {
|
|
18
|
+
resolvePiPromptResources
|
|
19
|
+
} from "./chunk-G6VZTCFH.js";
|
|
20
|
+
import "./chunk-G3RSMSXJ.js";
|
|
21
|
+
import {
|
|
22
|
+
DEFAULT_AGENT_CATALOG_MAX_ITEMS,
|
|
23
|
+
SubagentConsultParams,
|
|
24
|
+
registerSubagentConsult
|
|
25
|
+
} from "./chunk-RHRQMT7Q.js";
|
|
26
|
+
import {
|
|
27
|
+
getResultFinalOutput,
|
|
28
|
+
isResultError
|
|
29
|
+
} from "./chunk-AEUYS7JC.js";
|
|
30
|
+
import "./chunk-RTCVYIZA.js";
|
|
31
|
+
import "./chunk-ONDTY4EL.js";
|
|
32
|
+
import "./chunk-HOP5FXDT.js";
|
|
33
|
+
import {
|
|
34
|
+
discoverAgents
|
|
35
|
+
} from "./chunk-PSK43Y6A.js";
|
|
36
|
+
import "./chunk-RSUXZD6S.js";
|
|
37
|
+
import {
|
|
38
|
+
resolveSubagentThinkingLevel
|
|
39
|
+
} from "./chunk-7QPPBBXZ.js";
|
|
40
|
+
import {
|
|
41
|
+
DEFAULT_CONSULTATION_CWD_POLICY,
|
|
42
|
+
DEFAULT_CONSULT_RESOURCE_POLICY
|
|
43
|
+
} from "./chunk-QBORTI4W.js";
|
|
44
|
+
import "./chunk-7OBINKFM.js";
|
|
45
|
+
import {
|
|
46
|
+
isThinkingLevel
|
|
47
|
+
} from "./chunk-DPPVEQAM.js";
|
|
48
|
+
import "./chunk-BFK2Z4ZF.js";
|
|
49
|
+
import {
|
|
50
|
+
boundText,
|
|
51
|
+
boundedPrivateText,
|
|
52
|
+
safeDisplayPath,
|
|
53
|
+
safeTerminalLine
|
|
54
|
+
} from "./chunk-SWGQLFSD.js";
|
|
55
|
+
import {
|
|
56
|
+
DEFAULT_MAX_CONTEXT_BYTES,
|
|
57
|
+
DEFAULT_MAX_STDERR_BYTES,
|
|
58
|
+
MAX_SUBAGENT_TIMEOUT_MS,
|
|
59
|
+
truncateUtf8
|
|
60
|
+
} from "./chunk-H3FP6DLR.js";
|
|
61
|
+
import {
|
|
62
|
+
assertSubagentDepthAllowed,
|
|
63
|
+
resolveDefaultSubagentTimeoutMs
|
|
64
|
+
} from "./chunk-RRR66UWR.js";
|
|
65
|
+
|
|
66
|
+
// src/consult.ts
|
|
67
|
+
import * as path from "node:path";
|
|
68
|
+
import { CONFIG_DIR_NAME } from "@earendil-works/pi-coding-agent";
|
|
69
|
+
|
|
70
|
+
// src/consult-resources.ts
|
|
71
|
+
var MINIMAL_CONSULT_SYSTEM_PROMPT = "You are a read-only consultation assistant. Analyze the delegated task using only executor-provided capabilities and return a grounded answer.";
|
|
72
|
+
async function resolveConsultResourceLaunchPolicy(policy, projectTrusted, cwd) {
|
|
73
|
+
if (policy === "none") {
|
|
74
|
+
return {
|
|
75
|
+
disableExtensions: true,
|
|
76
|
+
disableSkills: true,
|
|
77
|
+
disablePromptTemplates: true,
|
|
78
|
+
disableContextFiles: true,
|
|
79
|
+
projectTrust: false,
|
|
80
|
+
baseSystemPrompt: MINIMAL_CONSULT_SYSTEM_PROMPT
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const resources = await resolvePiPromptResources(cwd, projectTrusted);
|
|
84
|
+
const discoveredSystemPrompt = resources.systemPrompt;
|
|
85
|
+
const baseSystemPrompt = discoveredSystemPrompt ? truncateUtf8(discoveredSystemPrompt, DEFAULT_MAX_CONTEXT_BYTES).text : void 0;
|
|
86
|
+
const appendSystemPromptPaths = resources.appendSystemPromptPaths;
|
|
87
|
+
const shared = {
|
|
88
|
+
disableExtensions: true,
|
|
89
|
+
disableContextFiles: !projectTrusted,
|
|
90
|
+
projectTrust: projectTrusted,
|
|
91
|
+
baseSystemPrompt,
|
|
92
|
+
appendSystemPromptPaths: appendSystemPromptPaths.length > 0 ? appendSystemPromptPaths : void 0
|
|
93
|
+
};
|
|
94
|
+
if (policy === "project-context") {
|
|
95
|
+
return {
|
|
96
|
+
...shared,
|
|
97
|
+
disableSkills: true,
|
|
98
|
+
disablePromptTemplates: true
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return shared;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/consult.ts
|
|
105
|
+
var READ_ONLY_INSTRUCTION = [
|
|
106
|
+
"This is a read-only consultation.",
|
|
107
|
+
"Use only the tools made available by the executor to inspect and reason about existing content.",
|
|
108
|
+
"Do not claim to edit files, run shell commands, mutate state, or persist a session.",
|
|
109
|
+
"If the task asks for implementation, return analysis or instructions instead of claiming changes."
|
|
110
|
+
].join("\n");
|
|
111
|
+
var MAX_UNKNOWN_AGENT_NAME_BYTES = 128;
|
|
112
|
+
async function executeSubagentConsult(params, signal, onUpdate, ctx, options, isCurrent = () => true) {
|
|
113
|
+
const operation = validateConsultParams(params);
|
|
114
|
+
assertSubagentDepthAllowed();
|
|
115
|
+
if (signal.aborted) throw abortError("Subagent consultation was aborted before start");
|
|
116
|
+
return executeConsult(
|
|
117
|
+
operation,
|
|
118
|
+
ctx,
|
|
119
|
+
signal,
|
|
120
|
+
options,
|
|
121
|
+
(partial) => {
|
|
122
|
+
if (signal.aborted || !isCurrent()) return;
|
|
123
|
+
onUpdate?.(partial);
|
|
124
|
+
},
|
|
125
|
+
isCurrent,
|
|
126
|
+
() => void 0
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
function formatAvailableConsultAgents(discovery) {
|
|
130
|
+
const listed = discovery.agents.slice(0, DEFAULT_AGENT_CATALOG_MAX_ITEMS);
|
|
131
|
+
const labels = listed.map(
|
|
132
|
+
(agent) => `${safeTerminalLine(agent.name, MAX_UNKNOWN_AGENT_NAME_BYTES)} (${agent.source})`
|
|
133
|
+
);
|
|
134
|
+
const omitted = discovery.agents.length - listed.length + (discovery.omittedAgentDefinitions ?? 0);
|
|
135
|
+
const parts = [labels.join(", ") || "none"];
|
|
136
|
+
if (omitted > 0) {
|
|
137
|
+
parts.push(`[${omitted} additional agent definition${omitted === 1 ? "" : "s"} omitted.]`);
|
|
138
|
+
}
|
|
139
|
+
if (discovery.metadataDiscoveryIncomplete) {
|
|
140
|
+
parts.push("[Agent metadata discovery was incomplete; some definitions may be unavailable.]");
|
|
141
|
+
}
|
|
142
|
+
return parts.join(" ");
|
|
143
|
+
}
|
|
144
|
+
function validateConsultParams(params) {
|
|
145
|
+
if (!params || typeof params !== "object" || Array.isArray(params)) {
|
|
146
|
+
throw new Error("subagent_consult parameters must be an object");
|
|
147
|
+
}
|
|
148
|
+
const values = params;
|
|
149
|
+
const allowed = [
|
|
150
|
+
"agent",
|
|
151
|
+
"task",
|
|
152
|
+
"agentScope",
|
|
153
|
+
"confirmProjectAgents",
|
|
154
|
+
"cwd",
|
|
155
|
+
"timeoutMs",
|
|
156
|
+
"thinkingLevel"
|
|
157
|
+
];
|
|
158
|
+
const unexpected = Object.keys(values).find(
|
|
159
|
+
(key) => values[key] !== void 0 && !allowed.includes(key)
|
|
160
|
+
);
|
|
161
|
+
if (unexpected) throw new Error(`subagent_consult does not accept ${unexpected}`);
|
|
162
|
+
const agent = requiredString(values.agent, "agent");
|
|
163
|
+
const task = requiredString(values.task, "task");
|
|
164
|
+
if (task.includes("\0")) throw new Error("subagent_consult task must not contain NUL bytes");
|
|
165
|
+
if (Buffer.byteLength(task, "utf8") > DEFAULT_MAX_CONTEXT_BYTES) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
`subagent_consult task must be at most ${DEFAULT_MAX_CONTEXT_BYTES} UTF-8 bytes`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
const agentScope = optionalScope(values.agentScope);
|
|
171
|
+
if (values.confirmProjectAgents !== void 0 && typeof values.confirmProjectAgents !== "boolean") {
|
|
172
|
+
throw new Error("subagent_consult confirmProjectAgents must be boolean");
|
|
173
|
+
}
|
|
174
|
+
if (values.cwd !== void 0 && (typeof values.cwd !== "string" || !values.cwd.trim())) {
|
|
175
|
+
throw new Error("subagent_consult cwd must be a non-empty string");
|
|
176
|
+
}
|
|
177
|
+
if (values.timeoutMs !== void 0 && (typeof values.timeoutMs !== "number" || !Number.isFinite(values.timeoutMs) || values.timeoutMs < 1 || values.timeoutMs > MAX_SUBAGENT_TIMEOUT_MS)) {
|
|
178
|
+
throw new Error(`subagent_consult timeoutMs must be between 1 and ${MAX_SUBAGENT_TIMEOUT_MS}`);
|
|
179
|
+
}
|
|
180
|
+
if (values.thinkingLevel !== void 0 && !isThinkingLevel(values.thinkingLevel)) {
|
|
181
|
+
throw new Error("subagent_consult thinkingLevel is invalid");
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
agent,
|
|
185
|
+
task,
|
|
186
|
+
agentScope,
|
|
187
|
+
confirmProjectAgents: values.confirmProjectAgents !== false,
|
|
188
|
+
cwd: values.cwd,
|
|
189
|
+
timeoutMs: values.timeoutMs,
|
|
190
|
+
thinkingLevel: values.thinkingLevel
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async function executeConsult(operation, ctx, signal, options, emitUpdate, isCurrent, trackWork) {
|
|
194
|
+
if ((operation.agentScope === "project" || operation.agentScope === "both") && !ctx.isProjectTrusted()) {
|
|
195
|
+
throw new Error("Project-local subagent definitions require a trusted project");
|
|
196
|
+
}
|
|
197
|
+
const settings = options.getSettings();
|
|
198
|
+
const target = resolveSubagentTarget({
|
|
199
|
+
workspace: ctx.cwd,
|
|
200
|
+
requestedCwd: operation.cwd,
|
|
201
|
+
currentProjectTrusted: ctx.isProjectTrusted()
|
|
202
|
+
});
|
|
203
|
+
assertConsultationTargetAllowed(
|
|
204
|
+
target,
|
|
205
|
+
settings?.cwdPolicy?.consultation ?? DEFAULT_CONSULTATION_CWD_POLICY
|
|
206
|
+
);
|
|
207
|
+
const discovery = discoverAgents(ctx.cwd, operation.agentScope, settings);
|
|
208
|
+
const agent = discovery.agents.find((candidate) => candidate.name === operation.agent);
|
|
209
|
+
if (!agent) {
|
|
210
|
+
throw new Error(
|
|
211
|
+
`Unknown subagent definition: ${boundedPrivateText(operation.agent, 256)}. Available agents for agentScope "${operation.agentScope}": ${formatAvailableConsultAgents(discovery)}`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
const setupWork = resolveConsultSetup(operation, agent, settings, target, options);
|
|
215
|
+
trackWork(setupWork);
|
|
216
|
+
const setup = await setupWork;
|
|
217
|
+
assertCurrentRequest(signal, isCurrent);
|
|
218
|
+
if (agent.source === "project" && operation.confirmProjectAgents) {
|
|
219
|
+
if (!ctx.hasUI) {
|
|
220
|
+
throw new Error(
|
|
221
|
+
"Project-local subagent confirmation requires UI; pass confirmProjectAgents: false explicitly in a trusted project"
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
const approved = await ctx.ui.confirm(
|
|
225
|
+
"Run project-local read-only agent?",
|
|
226
|
+
`Agent: ${safeTerminalLine(agent.name, 256)}
|
|
227
|
+
Source: ${safeTerminalLine(path.posix.join(CONFIG_DIR_NAME, "agents", path.basename(agent.filePath)))}`
|
|
228
|
+
);
|
|
229
|
+
assertCurrentRequest(signal, isCurrent);
|
|
230
|
+
if (!approved) {
|
|
231
|
+
return {
|
|
232
|
+
content: [{ type: "text", text: "Read-only subagent consultation cancelled." }],
|
|
233
|
+
details: { ...setup.details, cancelled: true }
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
assertCurrentRequest(signal, isCurrent);
|
|
238
|
+
emitUpdate(consultStartingUpdate(setup.details));
|
|
239
|
+
assertCurrentRequest(signal, isCurrent);
|
|
240
|
+
const runChild = options.runChild ?? ((request) => runConsultChild(request, options));
|
|
241
|
+
const child = runChild({
|
|
242
|
+
agent: setup.agent,
|
|
243
|
+
task: operation.task,
|
|
244
|
+
cwd: setup.cwd,
|
|
245
|
+
agentScope: operation.agentScope,
|
|
246
|
+
thinkingLevel: setup.thinkingLevel,
|
|
247
|
+
timeoutMs: setup.timeoutMs,
|
|
248
|
+
effectiveTools: setup.effectiveTools,
|
|
249
|
+
resourcePolicy: setup.resourcePolicy,
|
|
250
|
+
launchPolicy: setup.launchPolicy,
|
|
251
|
+
signal,
|
|
252
|
+
onUpdate: (result2) => {
|
|
253
|
+
if (signal.aborted || !isCurrent()) return;
|
|
254
|
+
emitUpdate(consultUpdate(result2, setup.details));
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
trackWork(child);
|
|
258
|
+
const result = await child;
|
|
259
|
+
if (!isCurrent()) throw abortError("Subagent consultation owner was replaced");
|
|
260
|
+
if (result.aborted && !result.processStarted) {
|
|
261
|
+
throw abortError(result.errorMessage || "Subagent consultation was aborted before launch");
|
|
262
|
+
}
|
|
263
|
+
if (result.launchFailed) {
|
|
264
|
+
throw new Error(
|
|
265
|
+
boundedPrivateText(
|
|
266
|
+
result.errorMessage || result.stderr.trim() || "Subagent consultation failed to launch",
|
|
267
|
+
2 * 1024
|
|
268
|
+
)
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
const error = isResultError(result);
|
|
272
|
+
const output = error ? formatConsultFailure(result) : getResultFinalOutput(result) || "(no output)";
|
|
273
|
+
const bounded = boundText(output);
|
|
274
|
+
const details = {
|
|
275
|
+
...setup.details,
|
|
276
|
+
child: projectChildResult(result),
|
|
277
|
+
...error ? { isError: true } : {},
|
|
278
|
+
...bounded.truncated ? { truncated: true } : {}
|
|
279
|
+
};
|
|
280
|
+
return {
|
|
281
|
+
content: [{ type: "text", text: bounded.text }],
|
|
282
|
+
details,
|
|
283
|
+
usage: usageFromResult(result)
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
async function resolveConsultSetup(operation, agent, settings, target, options) {
|
|
287
|
+
const requestedResourcePolicy = settings?.consult?.resources ?? DEFAULT_CONSULT_RESOURCE_POLICY;
|
|
288
|
+
const resourcePolicy = target.trust.projectTrusted ? requestedResourcePolicy : "none";
|
|
289
|
+
const effectiveTools = resolveConsultTools(agent.tools);
|
|
290
|
+
const projectTrusted = target.trust.projectTrusted;
|
|
291
|
+
const thinkingLevel = resolveSubagentThinkingLevel([agent], agent.name, operation.thinkingLevel);
|
|
292
|
+
const timeoutMs = operation.timeoutMs ?? agent.timeoutMs ?? resolveDefaultSubagentTimeoutMs();
|
|
293
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_SUBAGENT_TIMEOUT_MS) {
|
|
294
|
+
throw new Error(
|
|
295
|
+
`Subagent consultation timeout must be between 1 and ${MAX_SUBAGENT_TIMEOUT_MS}ms`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
const resolveResources = options.resolveResourceLaunchPolicy ?? resolveConsultResourceLaunchPolicy;
|
|
299
|
+
const launchPolicy = await resolveResources(resourcePolicy, projectTrusted, target.cwd);
|
|
300
|
+
launchPolicy.tools = effectiveTools;
|
|
301
|
+
const childAgent = {
|
|
302
|
+
...agent,
|
|
303
|
+
tools: effectiveTools,
|
|
304
|
+
systemPrompt: [agent.systemPrompt, READ_ONLY_INSTRUCTION].filter(Boolean).join("\n\n")
|
|
305
|
+
};
|
|
306
|
+
const effectiveResources = {
|
|
307
|
+
policy: resourcePolicy,
|
|
308
|
+
projectResources: projectTrusted && resourcePolicy !== "none",
|
|
309
|
+
contextFiles: !launchPolicy.disableContextFiles,
|
|
310
|
+
skills: !launchPolicy.disableSkills,
|
|
311
|
+
promptTemplates: !launchPolicy.disablePromptTemplates
|
|
312
|
+
};
|
|
313
|
+
const details = {
|
|
314
|
+
agent: boundedPrivateText(agent.name, 256),
|
|
315
|
+
agentSource: agent.source,
|
|
316
|
+
agentScope: operation.agentScope,
|
|
317
|
+
cwd: safeDisplayPath(target.cwd, target.workspace),
|
|
318
|
+
model: agent.model ? boundedPrivateText(agent.model, 256) : void 0,
|
|
319
|
+
thinkingLevel,
|
|
320
|
+
timeoutMs,
|
|
321
|
+
policy: {
|
|
322
|
+
requestedTools: agent.tools === void 0 ? null : agent.tools.slice(0, 100).map((tool) => boundedPrivateText(tool, 256)),
|
|
323
|
+
effectiveTools,
|
|
324
|
+
cwdBoundary: target.boundary,
|
|
325
|
+
targetTrust: {
|
|
326
|
+
kind: target.trust.kind,
|
|
327
|
+
projectTrusted,
|
|
328
|
+
sourcePath: target.trust.sourcePath ? safeDisplayPath(target.trust.sourcePath, target.workspace) : void 0,
|
|
329
|
+
warning: target.trust.warning
|
|
330
|
+
},
|
|
331
|
+
requestedResources: requestedResourcePolicy,
|
|
332
|
+
effectiveResources,
|
|
333
|
+
...resourcePolicy !== requestedResourcePolicy ? { resourceDowngradeReason: `Target trust is ${target.trust.kind}` } : {},
|
|
334
|
+
extensions: "disabled",
|
|
335
|
+
sessionPersistence: "disabled",
|
|
336
|
+
retainedAgent: false
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
return {
|
|
340
|
+
agent: childAgent,
|
|
341
|
+
cwd: target.cwd,
|
|
342
|
+
resourcePolicy,
|
|
343
|
+
effectiveTools,
|
|
344
|
+
thinkingLevel,
|
|
345
|
+
timeoutMs,
|
|
346
|
+
launchPolicy,
|
|
347
|
+
details
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
async function runConsultChild(request, options) {
|
|
351
|
+
return runSingleAgent(
|
|
352
|
+
request.cwd,
|
|
353
|
+
[request.agent],
|
|
354
|
+
request.agent.name,
|
|
355
|
+
request.task,
|
|
356
|
+
request.cwd,
|
|
357
|
+
void 0,
|
|
358
|
+
request.signal,
|
|
359
|
+
request.thinkingLevel,
|
|
360
|
+
request.timeoutMs,
|
|
361
|
+
(partial) => {
|
|
362
|
+
const result = partial.details.results[0];
|
|
363
|
+
if (result) request.onUpdate?.(result);
|
|
364
|
+
},
|
|
365
|
+
(results) => ({
|
|
366
|
+
mode: "single",
|
|
367
|
+
agentScope: request.agentScope,
|
|
368
|
+
projectAgentsDir: null,
|
|
369
|
+
results
|
|
370
|
+
}),
|
|
371
|
+
options.invocationOverride,
|
|
372
|
+
request.launchPolicy
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
function consultStartingUpdate(details) {
|
|
376
|
+
return {
|
|
377
|
+
content: [{ type: "text", text: "Read-only subagent consultation starting." }],
|
|
378
|
+
details: {
|
|
379
|
+
...details,
|
|
380
|
+
progress: {
|
|
381
|
+
phase: "starting",
|
|
382
|
+
recentActivity: [],
|
|
383
|
+
recentActivityTotal: 0,
|
|
384
|
+
usage: emptyProgressUsage()
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function consultUpdate(result, details) {
|
|
390
|
+
const output = boundText(getResultFinalOutput(result) || "(running...)");
|
|
391
|
+
return {
|
|
392
|
+
content: [{ type: "text", text: output.text }],
|
|
393
|
+
details: {
|
|
394
|
+
...details,
|
|
395
|
+
child: projectChildResult(result),
|
|
396
|
+
progress: projectConsultProgress(result)
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
var CONSULT_ACTIVITY_ARGUMENTS = {
|
|
401
|
+
read: ["path", "file_path", "offset", "limit"],
|
|
402
|
+
grep: ["pattern", "path", "glob", "limit"],
|
|
403
|
+
find: ["pattern", "path", "limit"],
|
|
404
|
+
ls: ["path", "limit"]
|
|
405
|
+
};
|
|
406
|
+
function projectConsultProgress(result) {
|
|
407
|
+
const recentActivity = [];
|
|
408
|
+
for (const item of result.recentActivity ?? []) {
|
|
409
|
+
if (item.type === "text") {
|
|
410
|
+
const text = boundedPrivateText(item.text, 1024).trim();
|
|
411
|
+
if (text) recentActivity.push({ type: "text", text });
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
if (!Object.hasOwn(CONSULT_ACTIVITY_ARGUMENTS, item.name)) continue;
|
|
415
|
+
const name = item.name;
|
|
416
|
+
const args = {};
|
|
417
|
+
for (const key of CONSULT_ACTIVITY_ARGUMENTS[name]) {
|
|
418
|
+
const value = item.args[key];
|
|
419
|
+
if (typeof value === "string") args[key] = safeTerminalLine(value, 512);
|
|
420
|
+
else if (typeof value === "number" && Number.isFinite(value)) args[key] = value;
|
|
421
|
+
else if (typeof value === "boolean") args[key] = value;
|
|
422
|
+
}
|
|
423
|
+
recentActivity.push({ type: "toolCall", name, args });
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
phase: "running",
|
|
427
|
+
recentActivity,
|
|
428
|
+
recentActivityTotal: Math.max(recentActivity.length, result.recentActivityTotal ?? 0),
|
|
429
|
+
actualProvider: result.actualProvider ? boundedPrivateText(result.actualProvider, 256) : void 0,
|
|
430
|
+
actualModel: result.actualModel ? boundedPrivateText(result.actualModel, 256) : void 0,
|
|
431
|
+
usage: {
|
|
432
|
+
input: result.usage.input,
|
|
433
|
+
output: result.usage.output,
|
|
434
|
+
cacheRead: result.usage.cacheRead,
|
|
435
|
+
cacheWrite: result.usage.cacheWrite,
|
|
436
|
+
cost: result.usage.cost,
|
|
437
|
+
contextTokens: result.usage.contextTokens,
|
|
438
|
+
turns: result.usage.turns
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
function emptyProgressUsage() {
|
|
443
|
+
return {
|
|
444
|
+
input: 0,
|
|
445
|
+
output: 0,
|
|
446
|
+
cacheRead: 0,
|
|
447
|
+
cacheWrite: 0,
|
|
448
|
+
cost: 0,
|
|
449
|
+
contextTokens: 0,
|
|
450
|
+
turns: 0
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
function projectChildResult(result) {
|
|
454
|
+
return {
|
|
455
|
+
exitCode: result.exitCode,
|
|
456
|
+
stopReason: typeof result.stopReason === "string" ? boundedPrivateText(result.stopReason, 256) : void 0,
|
|
457
|
+
timedOut: result.timedOut,
|
|
458
|
+
aborted: result.aborted,
|
|
459
|
+
truncated: result.truncated,
|
|
460
|
+
malformedEvents: result.malformedEvents,
|
|
461
|
+
processStarted: result.processStarted,
|
|
462
|
+
actualProvider: result.actualProvider ? boundedPrivateText(result.actualProvider, 256) : void 0,
|
|
463
|
+
actualModel: result.actualModel ? boundedPrivateText(result.actualModel, 256) : void 0,
|
|
464
|
+
partialOutput: result.finalOutput ? boundedPrivateText(result.finalOutput, 8 * 1024) : void 0,
|
|
465
|
+
error: result.errorMessage ? boundedPrivateText(result.errorMessage, 2 * 1024) : void 0,
|
|
466
|
+
usage: { ...result.usage }
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
function formatConsultFailure(result) {
|
|
470
|
+
const rawError = result.errorMessage || result.stderr.trim();
|
|
471
|
+
const error = rawError ? boundedPrivateText(rawError, DEFAULT_MAX_STDERR_BYTES) : "";
|
|
472
|
+
const output = getResultFinalOutput(result);
|
|
473
|
+
return error && output ? `${error}
|
|
474
|
+
|
|
475
|
+
Partial output:
|
|
476
|
+
${output}` : error || output || "(no output)";
|
|
477
|
+
}
|
|
478
|
+
function usageFromResult(result) {
|
|
479
|
+
return {
|
|
480
|
+
input: result.usage.input,
|
|
481
|
+
output: result.usage.output,
|
|
482
|
+
cacheRead: result.usage.cacheRead,
|
|
483
|
+
cacheWrite: result.usage.cacheWrite,
|
|
484
|
+
totalTokens: result.usage.totalTokens ?? result.usage.input + result.usage.output + result.usage.cacheRead + result.usage.cacheWrite,
|
|
485
|
+
cost: {
|
|
486
|
+
input: result.usage.costInput ?? 0,
|
|
487
|
+
output: result.usage.costOutput ?? 0,
|
|
488
|
+
cacheRead: result.usage.costCacheRead ?? 0,
|
|
489
|
+
cacheWrite: result.usage.costCacheWrite ?? 0,
|
|
490
|
+
total: result.usage.cost
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
function assertCurrentRequest(signal, isCurrent) {
|
|
495
|
+
if (signal.aborted || !isCurrent()) throw abortError("Subagent consultation owner was replaced");
|
|
496
|
+
}
|
|
497
|
+
function abortError(message) {
|
|
498
|
+
const error = new Error(message);
|
|
499
|
+
error.name = "AbortError";
|
|
500
|
+
return error;
|
|
501
|
+
}
|
|
502
|
+
function requiredString(value, name) {
|
|
503
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
504
|
+
throw new Error(`subagent_consult requires ${name}`);
|
|
505
|
+
}
|
|
506
|
+
return value;
|
|
507
|
+
}
|
|
508
|
+
function optionalScope(value) {
|
|
509
|
+
if (value === void 0) return "user";
|
|
510
|
+
if (value === "user" || value === "project" || value === "both") return value;
|
|
511
|
+
throw new Error("subagent_consult agentScope must be user, project, or both");
|
|
512
|
+
}
|
|
513
|
+
export {
|
|
514
|
+
SubagentConsultParams,
|
|
515
|
+
executeSubagentConsult,
|
|
516
|
+
registerSubagentConsult
|
|
517
|
+
};
|
|
518
|
+
//# sourceMappingURL=consult-NYXVDN5G.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/consult.ts", "../../src/consult-resources.ts"],
|
|
4
|
+
"sourcesContent": ["import * as path from \"node:path\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { CONFIG_DIR_NAME, type ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { DEFAULT_AGENT_CATALOG_MAX_ITEMS } from \"./agents/catalog.js\";\nimport { type AgentDiscoveryResult, discoverAgents } from \"./agents/discovery.js\";\nimport {\n\ttype AgentConfig,\n\ttype AgentScope,\n\ttype ConsultResourcePolicy,\n\tisThinkingLevel,\n\ttype SubagentSettings,\n\ttype THINKING_LEVELS,\n} from \"./agents/types.js\";\nimport { resolveConsultTools } from \"./consult-policy.js\";\nimport { resolveConsultResourceLaunchPolicy } from \"./consult-resources.js\";\nimport type {\n\tConsultDetails,\n\tConsultProgress,\n\tConsultProgressActivity,\n\tSubagentConsultParams,\n} from \"./consult-tool.js\";\nimport {\n\tassertConsultationTargetAllowed,\n\ttype ResolvedSubagentTarget,\n\tresolveSubagentTarget,\n} from \"./cwd-policy.js\";\nimport {\n\tassertSubagentDepthAllowed,\n\tresolveDefaultSubagentTimeoutMs,\n} from \"./execution/runtime-policy.js\";\nimport {\n\tDEFAULT_MAX_CONTEXT_BYTES,\n\tDEFAULT_MAX_STDERR_BYTES,\n\tMAX_SUBAGENT_TIMEOUT_MS,\n} from \"./limits.js\";\nimport {\n\ttype ChildLaunchPolicy,\n\tgetResultFinalOutput,\n\tisResultError,\n\trunSingleAgent,\n\ttype SingleResult,\n\ttype SubagentDetails,\n} from \"./runner.js\";\nimport { boundedPrivateText, boundText, safeDisplayPath, safeTerminalLine } from \"./safe-text.js\";\nimport {\n\tDEFAULT_CONSULT_RESOURCE_POLICY,\n\tDEFAULT_CONSULTATION_CWD_POLICY,\n} from \"./settings/inspection.js\";\nimport { resolveSubagentThinkingLevel } from \"./settings.js\";\n\nexport { registerSubagentConsult } from \"./consult-registration.js\";\nexport type {\n\tConsultDetails,\n\tConsultProgress,\n\tConsultProgressActivity,\n} from \"./consult-tool.js\";\nexport { SubagentConsultParams } from \"./consult-tool.js\";\n\nexport interface ConsultChildRequest {\n\tagent: AgentConfig;\n\ttask: string;\n\tcwd: string;\n\tagentScope: AgentScope;\n\tthinkingLevel?: (typeof THINKING_LEVELS)[number];\n\ttimeoutMs: number;\n\teffectiveTools: string[];\n\tresourcePolicy: ConsultResourcePolicy;\n\tlaunchPolicy: ChildLaunchPolicy;\n\tsignal: AbortSignal;\n\tonUpdate?: (result: SingleResult) => void;\n}\n\nexport interface RegisterSubagentConsultOptions {\n\tgetSettings(): SubagentSettings | undefined;\n\trunChild?: (request: ConsultChildRequest) => Promise<SingleResult>;\n\tinvocationOverride?: { command: string; argsPrefix?: string[] };\n\tresolveResourceLaunchPolicy?: typeof resolveConsultResourceLaunchPolicy;\n}\n\nconst READ_ONLY_INSTRUCTION = [\n\t\"This is a read-only consultation.\",\n\t\"Use only the tools made available by the executor to inspect and reason about existing content.\",\n\t\"Do not claim to edit files, run shell commands, mutate state, or persist a session.\",\n\t\"If the task asks for implementation, return analysis or instructions instead of claiming changes.\",\n].join(\"\\n\");\n\nconst MAX_UNKNOWN_AGENT_NAME_BYTES = 128;\n\nexport async function executeSubagentConsult(\n\tparams: SubagentConsultParams,\n\tsignal: AbortSignal,\n\tonUpdate: ((partial: AgentToolResult<ConsultDetails>) => void) | undefined,\n\tctx: ExtensionContext,\n\toptions: RegisterSubagentConsultOptions,\n\tisCurrent: () => boolean = () => true,\n): Promise<AgentToolResult<ConsultDetails>> {\n\tconst operation = validateConsultParams(params);\n\tassertSubagentDepthAllowed();\n\tif (signal.aborted) throw abortError(\"Subagent consultation was aborted before start\");\n\treturn executeConsult(\n\t\toperation,\n\t\tctx,\n\t\tsignal,\n\t\toptions,\n\t\t(partial) => {\n\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\tonUpdate?.(partial);\n\t\t},\n\t\tisCurrent,\n\t\t() => undefined,\n\t);\n}\n\nfunction formatAvailableConsultAgents(discovery: AgentDiscoveryResult): string {\n\tconst listed = discovery.agents.slice(0, DEFAULT_AGENT_CATALOG_MAX_ITEMS);\n\tconst labels = listed.map(\n\t\t(agent) => `${safeTerminalLine(agent.name, MAX_UNKNOWN_AGENT_NAME_BYTES)} (${agent.source})`,\n\t);\n\tconst omitted =\n\t\tdiscovery.agents.length - listed.length + (discovery.omittedAgentDefinitions ?? 0);\n\tconst parts = [labels.join(\", \") || \"none\"];\n\tif (omitted > 0) {\n\t\tparts.push(`[${omitted} additional agent definition${omitted === 1 ? \"\" : \"s\"} omitted.]`);\n\t}\n\tif (discovery.metadataDiscoveryIncomplete) {\n\t\tparts.push(\"[Agent metadata discovery was incomplete; some definitions may be unavailable.]\");\n\t}\n\treturn parts.join(\" \");\n}\n\nfunction validateConsultParams(\n\tparams: unknown,\n): Required<Pick<SubagentConsultParams, \"agent\" | \"task\" | \"agentScope\" | \"confirmProjectAgents\">> &\n\tPick<SubagentConsultParams, \"cwd\" | \"timeoutMs\" | \"thinkingLevel\"> {\n\tif (!params || typeof params !== \"object\" || Array.isArray(params)) {\n\t\tthrow new Error(\"subagent_consult parameters must be an object\");\n\t}\n\tconst values = params as Record<string, unknown>;\n\tconst allowed = [\n\t\t\"agent\",\n\t\t\"task\",\n\t\t\"agentScope\",\n\t\t\"confirmProjectAgents\",\n\t\t\"cwd\",\n\t\t\"timeoutMs\",\n\t\t\"thinkingLevel\",\n\t];\n\tconst unexpected = Object.keys(values).find(\n\t\t(key) => values[key] !== undefined && !allowed.includes(key),\n\t);\n\tif (unexpected) throw new Error(`subagent_consult does not accept ${unexpected}`);\n\tconst agent = requiredString(values.agent, \"agent\");\n\tconst task = requiredString(values.task, \"task\");\n\tif (task.includes(\"\\0\")) throw new Error(\"subagent_consult task must not contain NUL bytes\");\n\tif (Buffer.byteLength(task, \"utf8\") > DEFAULT_MAX_CONTEXT_BYTES) {\n\t\tthrow new Error(\n\t\t\t`subagent_consult task must be at most ${DEFAULT_MAX_CONTEXT_BYTES} UTF-8 bytes`,\n\t\t);\n\t}\n\tconst agentScope = optionalScope(values.agentScope);\n\tif (\n\t\tvalues.confirmProjectAgents !== undefined &&\n\t\ttypeof values.confirmProjectAgents !== \"boolean\"\n\t) {\n\t\tthrow new Error(\"subagent_consult confirmProjectAgents must be boolean\");\n\t}\n\tif (values.cwd !== undefined && (typeof values.cwd !== \"string\" || !values.cwd.trim())) {\n\t\tthrow new Error(\"subagent_consult cwd must be a non-empty string\");\n\t}\n\tif (\n\t\tvalues.timeoutMs !== undefined &&\n\t\t(typeof values.timeoutMs !== \"number\" ||\n\t\t\t!Number.isFinite(values.timeoutMs) ||\n\t\t\tvalues.timeoutMs < 1 ||\n\t\t\tvalues.timeoutMs > MAX_SUBAGENT_TIMEOUT_MS)\n\t) {\n\t\tthrow new Error(`subagent_consult timeoutMs must be between 1 and ${MAX_SUBAGENT_TIMEOUT_MS}`);\n\t}\n\tif (values.thinkingLevel !== undefined && !isThinkingLevel(values.thinkingLevel)) {\n\t\tthrow new Error(\"subagent_consult thinkingLevel is invalid\");\n\t}\n\treturn {\n\t\tagent,\n\t\ttask,\n\t\tagentScope,\n\t\tconfirmProjectAgents: values.confirmProjectAgents !== false,\n\t\tcwd: values.cwd as string | undefined,\n\t\ttimeoutMs: values.timeoutMs as number | undefined,\n\t\tthinkingLevel: values.thinkingLevel as (typeof THINKING_LEVELS)[number] | undefined,\n\t};\n}\n\nasync function executeConsult(\n\toperation: ReturnType<typeof validateConsultParams>,\n\tctx: ExtensionContext,\n\tsignal: AbortSignal,\n\toptions: RegisterSubagentConsultOptions,\n\temitUpdate: (partial: AgentToolResult<ConsultDetails>) => void,\n\tisCurrent: () => boolean,\n\ttrackWork: (work: Promise<unknown>) => void,\n): Promise<AgentToolResult<ConsultDetails>> {\n\tif (\n\t\t(operation.agentScope === \"project\" || operation.agentScope === \"both\") &&\n\t\t!ctx.isProjectTrusted()\n\t) {\n\t\tthrow new Error(\"Project-local subagent definitions require a trusted project\");\n\t}\n\tconst settings = options.getSettings();\n\tconst target = resolveSubagentTarget({\n\t\tworkspace: ctx.cwd,\n\t\trequestedCwd: operation.cwd,\n\t\tcurrentProjectTrusted: ctx.isProjectTrusted(),\n\t});\n\tassertConsultationTargetAllowed(\n\t\ttarget,\n\t\tsettings?.cwdPolicy?.consultation ?? DEFAULT_CONSULTATION_CWD_POLICY,\n\t);\n\tconst discovery = discoverAgents(ctx.cwd, operation.agentScope, settings);\n\tconst agent = discovery.agents.find((candidate) => candidate.name === operation.agent);\n\tif (!agent) {\n\t\tthrow new Error(\n\t\t\t`Unknown subagent definition: ${boundedPrivateText(operation.agent, 256)}. ` +\n\t\t\t\t`Available agents for agentScope \"${operation.agentScope}\": ${formatAvailableConsultAgents(discovery)}`,\n\t\t);\n\t}\n\tconst setupWork = resolveConsultSetup(operation, agent, settings, target, options);\n\ttrackWork(setupWork);\n\tconst setup = await setupWork;\n\tassertCurrentRequest(signal, isCurrent);\n\n\tif (agent.source === \"project\" && operation.confirmProjectAgents) {\n\t\tif (!ctx.hasUI) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Project-local subagent confirmation requires UI; pass confirmProjectAgents: false explicitly in a trusted project\",\n\t\t\t);\n\t\t}\n\t\tconst approved = await ctx.ui.confirm(\n\t\t\t\"Run project-local read-only agent?\",\n\t\t\t`Agent: ${safeTerminalLine(agent.name, 256)}\\nSource: ${safeTerminalLine(path.posix.join(CONFIG_DIR_NAME, \"agents\", path.basename(agent.filePath)))}`,\n\t\t);\n\t\tassertCurrentRequest(signal, isCurrent);\n\t\tif (!approved) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: \"Read-only subagent consultation cancelled.\" }],\n\t\t\t\tdetails: { ...setup.details, cancelled: true },\n\t\t\t};\n\t\t}\n\t}\n\tassertCurrentRequest(signal, isCurrent);\n\temitUpdate(consultStartingUpdate(setup.details));\n\tassertCurrentRequest(signal, isCurrent);\n\tconst runChild = options.runChild ?? ((request) => runConsultChild(request, options));\n\tconst child = runChild({\n\t\tagent: setup.agent,\n\t\ttask: operation.task,\n\t\tcwd: setup.cwd,\n\t\tagentScope: operation.agentScope,\n\t\tthinkingLevel: setup.thinkingLevel,\n\t\ttimeoutMs: setup.timeoutMs,\n\t\teffectiveTools: setup.effectiveTools,\n\t\tresourcePolicy: setup.resourcePolicy,\n\t\tlaunchPolicy: setup.launchPolicy,\n\t\tsignal,\n\t\tonUpdate: (result) => {\n\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\temitUpdate(consultUpdate(result, setup.details));\n\t\t},\n\t});\n\ttrackWork(child);\n\tconst result = await child;\n\tif (!isCurrent()) throw abortError(\"Subagent consultation owner was replaced\");\n\tif (result.aborted && !result.processStarted) {\n\t\tthrow abortError(result.errorMessage || \"Subagent consultation was aborted before launch\");\n\t}\n\tif (result.launchFailed) {\n\t\tthrow new Error(\n\t\t\tboundedPrivateText(\n\t\t\t\tresult.errorMessage || result.stderr.trim() || \"Subagent consultation failed to launch\",\n\t\t\t\t2 * 1024,\n\t\t\t),\n\t\t);\n\t}\n\tconst error = isResultError(result);\n\tconst output = error\n\t\t? formatConsultFailure(result)\n\t\t: getResultFinalOutput(result) || \"(no output)\";\n\tconst bounded = boundText(output);\n\tconst details: ConsultDetails = {\n\t\t...setup.details,\n\t\tchild: projectChildResult(result),\n\t\t...(error ? { isError: true } : {}),\n\t\t...(bounded.truncated ? { truncated: true } : {}),\n\t};\n\treturn {\n\t\tcontent: [{ type: \"text\", text: bounded.text }],\n\t\tdetails,\n\t\tusage: usageFromResult(result),\n\t};\n}\n\nasync function resolveConsultSetup(\n\toperation: ReturnType<typeof validateConsultParams>,\n\tagent: AgentConfig,\n\tsettings: SubagentSettings | undefined,\n\ttarget: ResolvedSubagentTarget,\n\toptions: RegisterSubagentConsultOptions,\n) {\n\tconst requestedResourcePolicy = settings?.consult?.resources ?? DEFAULT_CONSULT_RESOURCE_POLICY;\n\tconst resourcePolicy = target.trust.projectTrusted ? requestedResourcePolicy : \"none\";\n\tconst effectiveTools = resolveConsultTools(agent.tools);\n\tconst projectTrusted = target.trust.projectTrusted;\n\tconst thinkingLevel = resolveSubagentThinkingLevel([agent], agent.name, operation.thinkingLevel);\n\tconst timeoutMs = operation.timeoutMs ?? agent.timeoutMs ?? resolveDefaultSubagentTimeoutMs();\n\tif (!Number.isFinite(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_SUBAGENT_TIMEOUT_MS) {\n\t\tthrow new Error(\n\t\t\t`Subagent consultation timeout must be between 1 and ${MAX_SUBAGENT_TIMEOUT_MS}ms`,\n\t\t);\n\t}\n\tconst resolveResources =\n\t\toptions.resolveResourceLaunchPolicy ?? resolveConsultResourceLaunchPolicy;\n\tconst launchPolicy = await resolveResources(resourcePolicy, projectTrusted, target.cwd);\n\tlaunchPolicy.tools = effectiveTools;\n\tconst childAgent: AgentConfig = {\n\t\t...agent,\n\t\ttools: effectiveTools,\n\t\tsystemPrompt: [agent.systemPrompt, READ_ONLY_INSTRUCTION].filter(Boolean).join(\"\\n\\n\"),\n\t};\n\tconst effectiveResources = {\n\t\tpolicy: resourcePolicy,\n\t\tprojectResources: projectTrusted && resourcePolicy !== \"none\",\n\t\tcontextFiles: !launchPolicy.disableContextFiles,\n\t\tskills: !launchPolicy.disableSkills,\n\t\tpromptTemplates: !launchPolicy.disablePromptTemplates,\n\t};\n\tconst details: ConsultDetails = {\n\t\tagent: boundedPrivateText(agent.name, 256),\n\t\tagentSource: agent.source,\n\t\tagentScope: operation.agentScope,\n\t\tcwd: safeDisplayPath(target.cwd, target.workspace),\n\t\tmodel: agent.model ? boundedPrivateText(agent.model, 256) : undefined,\n\t\tthinkingLevel,\n\t\ttimeoutMs,\n\t\tpolicy: {\n\t\t\trequestedTools:\n\t\t\t\tagent.tools === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: agent.tools.slice(0, 100).map((tool) => boundedPrivateText(tool, 256)),\n\t\t\teffectiveTools,\n\t\t\tcwdBoundary: target.boundary,\n\t\t\ttargetTrust: {\n\t\t\t\tkind: target.trust.kind,\n\t\t\t\tprojectTrusted,\n\t\t\t\tsourcePath: target.trust.sourcePath\n\t\t\t\t\t? safeDisplayPath(target.trust.sourcePath, target.workspace)\n\t\t\t\t\t: undefined,\n\t\t\t\twarning: target.trust.warning,\n\t\t\t},\n\t\t\trequestedResources: requestedResourcePolicy,\n\t\t\teffectiveResources,\n\t\t\t...(resourcePolicy !== requestedResourcePolicy\n\t\t\t\t? { resourceDowngradeReason: `Target trust is ${target.trust.kind}` }\n\t\t\t\t: {}),\n\t\t\textensions: \"disabled\",\n\t\t\tsessionPersistence: \"disabled\",\n\t\t\tretainedAgent: false,\n\t\t},\n\t};\n\treturn {\n\t\tagent: childAgent,\n\t\tcwd: target.cwd,\n\t\tresourcePolicy,\n\t\teffectiveTools,\n\t\tthinkingLevel,\n\t\ttimeoutMs,\n\t\tlaunchPolicy,\n\t\tdetails,\n\t};\n}\n\nasync function runConsultChild(\n\trequest: ConsultChildRequest,\n\toptions: RegisterSubagentConsultOptions,\n): Promise<SingleResult> {\n\treturn runSingleAgent(\n\t\trequest.cwd,\n\t\t[request.agent],\n\t\trequest.agent.name,\n\t\trequest.task,\n\t\trequest.cwd,\n\t\tundefined,\n\t\trequest.signal,\n\t\trequest.thinkingLevel,\n\t\trequest.timeoutMs,\n\t\t(partial) => {\n\t\t\tconst result = partial.details.results[0];\n\t\t\tif (result) request.onUpdate?.(result);\n\t\t},\n\t\t(results): SubagentDetails => ({\n\t\t\tmode: \"single\",\n\t\t\tagentScope: request.agentScope,\n\t\t\tprojectAgentsDir: null,\n\t\t\tresults,\n\t\t}),\n\t\toptions.invocationOverride,\n\t\trequest.launchPolicy,\n\t);\n}\n\nfunction consultStartingUpdate(details: ConsultDetails): AgentToolResult<ConsultDetails> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: \"Read-only subagent consultation starting.\" }],\n\t\tdetails: {\n\t\t\t...details,\n\t\t\tprogress: {\n\t\t\t\tphase: \"starting\",\n\t\t\t\trecentActivity: [],\n\t\t\t\trecentActivityTotal: 0,\n\t\t\t\tusage: emptyProgressUsage(),\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction consultUpdate(\n\tresult: SingleResult,\n\tdetails: ConsultDetails,\n): AgentToolResult<ConsultDetails> {\n\tconst output = boundText(getResultFinalOutput(result) || \"(running...)\");\n\treturn {\n\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\tdetails: {\n\t\t\t...details,\n\t\t\tchild: projectChildResult(result),\n\t\t\tprogress: projectConsultProgress(result),\n\t\t},\n\t};\n}\n\nconst CONSULT_ACTIVITY_ARGUMENTS: Record<\"read\" | \"grep\" | \"find\" | \"ls\", readonly string[]> = {\n\tread: [\"path\", \"file_path\", \"offset\", \"limit\"],\n\tgrep: [\"pattern\", \"path\", \"glob\", \"limit\"],\n\tfind: [\"pattern\", \"path\", \"limit\"],\n\tls: [\"path\", \"limit\"],\n};\n\nfunction projectConsultProgress(result: SingleResult): ConsultProgress {\n\tconst recentActivity: ConsultProgressActivity[] = [];\n\tfor (const item of result.recentActivity ?? []) {\n\t\tif (item.type === \"text\") {\n\t\t\tconst text = boundedPrivateText(item.text, 1024).trim();\n\t\t\tif (text) recentActivity.push({ type: \"text\", text });\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Object.hasOwn(CONSULT_ACTIVITY_ARGUMENTS, item.name)) continue;\n\t\tconst name = item.name as keyof typeof CONSULT_ACTIVITY_ARGUMENTS;\n\t\tconst args: Record<string, string | number | boolean> = {};\n\t\tfor (const key of CONSULT_ACTIVITY_ARGUMENTS[name]) {\n\t\t\tconst value = item.args[key];\n\t\t\tif (typeof value === \"string\") args[key] = safeTerminalLine(value, 512);\n\t\t\telse if (typeof value === \"number\" && Number.isFinite(value)) args[key] = value;\n\t\t\telse if (typeof value === \"boolean\") args[key] = value;\n\t\t}\n\t\trecentActivity.push({ type: \"toolCall\", name, args });\n\t}\n\treturn {\n\t\tphase: \"running\",\n\t\trecentActivity,\n\t\trecentActivityTotal: Math.max(recentActivity.length, result.recentActivityTotal ?? 0),\n\t\tactualProvider: result.actualProvider\n\t\t\t? boundedPrivateText(result.actualProvider, 256)\n\t\t\t: undefined,\n\t\tactualModel: result.actualModel ? boundedPrivateText(result.actualModel, 256) : undefined,\n\t\tusage: {\n\t\t\tinput: result.usage.input,\n\t\t\toutput: result.usage.output,\n\t\t\tcacheRead: result.usage.cacheRead,\n\t\t\tcacheWrite: result.usage.cacheWrite,\n\t\t\tcost: result.usage.cost,\n\t\t\tcontextTokens: result.usage.contextTokens,\n\t\t\tturns: result.usage.turns,\n\t\t},\n\t};\n}\n\nfunction emptyProgressUsage(): ConsultProgress[\"usage\"] {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\tcost: 0,\n\t\tcontextTokens: 0,\n\t\tturns: 0,\n\t};\n}\n\nfunction projectChildResult(result: SingleResult): Record<string, unknown> {\n\treturn {\n\t\texitCode: result.exitCode,\n\t\tstopReason:\n\t\t\ttypeof result.stopReason === \"string\"\n\t\t\t\t? boundedPrivateText(result.stopReason, 256)\n\t\t\t\t: undefined,\n\t\ttimedOut: result.timedOut,\n\t\taborted: result.aborted,\n\t\ttruncated: result.truncated,\n\t\tmalformedEvents: result.malformedEvents,\n\t\tprocessStarted: result.processStarted,\n\t\tactualProvider: result.actualProvider\n\t\t\t? boundedPrivateText(result.actualProvider, 256)\n\t\t\t: undefined,\n\t\tactualModel: result.actualModel ? boundedPrivateText(result.actualModel, 256) : undefined,\n\t\tpartialOutput: result.finalOutput\n\t\t\t? boundedPrivateText(result.finalOutput, 8 * 1024)\n\t\t\t: undefined,\n\t\terror: result.errorMessage ? boundedPrivateText(result.errorMessage, 2 * 1024) : undefined,\n\t\tusage: { ...result.usage },\n\t};\n}\n\nfunction formatConsultFailure(result: SingleResult): string {\n\tconst rawError = result.errorMessage || result.stderr.trim();\n\tconst error = rawError ? boundedPrivateText(rawError, DEFAULT_MAX_STDERR_BYTES) : \"\";\n\tconst output = getResultFinalOutput(result);\n\treturn error && output\n\t\t? `${error}\\n\\nPartial output:\\n${output}`\n\t\t: error || output || \"(no output)\";\n}\n\nfunction usageFromResult(result: SingleResult): Usage {\n\treturn {\n\t\tinput: result.usage.input,\n\t\toutput: result.usage.output,\n\t\tcacheRead: result.usage.cacheRead,\n\t\tcacheWrite: result.usage.cacheWrite,\n\t\ttotalTokens:\n\t\t\tresult.usage.totalTokens ??\n\t\t\tresult.usage.input + result.usage.output + result.usage.cacheRead + result.usage.cacheWrite,\n\t\tcost: {\n\t\t\tinput: result.usage.costInput ?? 0,\n\t\t\toutput: result.usage.costOutput ?? 0,\n\t\t\tcacheRead: result.usage.costCacheRead ?? 0,\n\t\t\tcacheWrite: result.usage.costCacheWrite ?? 0,\n\t\t\ttotal: result.usage.cost,\n\t\t},\n\t};\n}\n\nfunction assertCurrentRequest(signal: AbortSignal, isCurrent: () => boolean): void {\n\tif (signal.aborted || !isCurrent()) throw abortError(\"Subagent consultation owner was replaced\");\n}\n\nfunction abortError(message: string): Error {\n\tconst error = new Error(message);\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nfunction requiredString(value: unknown, name: string): string {\n\tif (typeof value !== \"string\" || !value.trim()) {\n\t\tthrow new Error(`subagent_consult requires ${name}`);\n\t}\n\treturn value;\n}\n\nfunction optionalScope(value: unknown): AgentScope {\n\tif (value === undefined) return \"user\";\n\tif (value === \"user\" || value === \"project\" || value === \"both\") return value;\n\tthrow new Error(\"subagent_consult agentScope must be user, project, or both\");\n}\n", "import type { ConsultResourcePolicy } from \"./agents/types.js\";\nimport { DEFAULT_MAX_CONTEXT_BYTES, truncateUtf8 } from \"./limits.js\";\nimport { resolvePiPromptResources } from \"./prompt-resources.js\";\nimport type { ChildLaunchPolicy } from \"./runner.js\";\n\nconst MINIMAL_CONSULT_SYSTEM_PROMPT =\n\t\"You are a read-only consultation assistant. Analyze the delegated task using only executor-provided capabilities and return a grounded answer.\";\n\n/**\n * Resolve Pi-owned prompt files without loading target settings, packages, or extensions.\n * The child still owns context-file, skill, and prompt-template loading according to this policy.\n */\nexport async function resolveConsultResourceLaunchPolicy(\n\tpolicy: ConsultResourcePolicy,\n\tprojectTrusted: boolean,\n\tcwd: string,\n): Promise<ChildLaunchPolicy> {\n\tif (policy === \"none\") {\n\t\treturn {\n\t\t\tdisableExtensions: true,\n\t\t\tdisableSkills: true,\n\t\t\tdisablePromptTemplates: true,\n\t\t\tdisableContextFiles: true,\n\t\t\tprojectTrust: false,\n\t\t\tbaseSystemPrompt: MINIMAL_CONSULT_SYSTEM_PROMPT,\n\t\t};\n\t}\n\n\tconst resources = await resolvePiPromptResources(cwd, projectTrusted);\n\tconst discoveredSystemPrompt = resources.systemPrompt;\n\tconst baseSystemPrompt = discoveredSystemPrompt\n\t\t? truncateUtf8(discoveredSystemPrompt, DEFAULT_MAX_CONTEXT_BYTES).text\n\t\t: undefined;\n\tconst appendSystemPromptPaths = resources.appendSystemPromptPaths;\n\tconst shared = {\n\t\tdisableExtensions: true,\n\t\tdisableContextFiles: !projectTrusted,\n\t\tprojectTrust: projectTrusted,\n\t\tbaseSystemPrompt,\n\t\tappendSystemPromptPaths:\n\t\t\tappendSystemPromptPaths.length > 0 ? appendSystemPromptPaths : undefined,\n\t};\n\tif (policy === \"project-context\") {\n\t\treturn {\n\t\t\t...shared,\n\t\t\tdisableSkills: true,\n\t\t\tdisablePromptTemplates: true,\n\t\t};\n\t}\n\treturn shared;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
buildContextSnapshot,
|
|
5
|
+
redactPrivateText
|
|
6
|
+
} from "./chunk-H3FP6DLR.js";
|
|
7
|
+
export {
|
|
8
|
+
buildContextSnapshot,
|
|
9
|
+
redactPrivateText
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=context-QDKLVQXE.ts.map
|