apiario 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Extensão de subagentes para o Apiário Dev
3
+ *
4
+ * Registra a ferramenta "subagent" que permite ao LLM delegar tarefas para
5
+ * subagentes especializados (scout, generalist, reviewer, e agentes do usuário)
6
+ * em processos isolados.
7
+ *
8
+ * Modos suportados:
9
+ * - single: { agent: "nome", task: "..." }
10
+ * - parallel: { tasks: [{ agent: "nome", task: "..." }, ...] }
11
+ * - chain: { chain: [{ agent: "nome", task: "... {previous} ..." }, ...] }
12
+ */
13
+ import { StringEnum } from "@earendil-works/pi-ai";
14
+ import { Type } from "typebox";
15
+ import { discoverAgents, seedBuiltinAgents, } from "./agents.js";
16
+ import { getResultOutput, isFailedResult, mapWithConcurrencyLimit, runSingleAgent, truncateParallelOutput, } from "./spawn.js";
17
+ import { renderSubagentCall, renderSubagentResult, } from "./display.js";
18
+ // ---------------------------------------------------------------------------
19
+ // Constantes
20
+ // ---------------------------------------------------------------------------
21
+ const MAX_PARALLEL_TASKS = 8;
22
+ const MAX_CONCURRENCY = 4;
23
+ const PER_TASK_OUTPUT_CAP = 50 * 1024; // 50 KB
24
+ // ---------------------------------------------------------------------------
25
+ // Schema dos parâmetros
26
+ // ---------------------------------------------------------------------------
27
+ const TaskItem = Type.Object({
28
+ agent: Type.String({ description: "Nome do agente a invocar" }),
29
+ task: Type.String({ description: "Tarefa a delegar para o agente" }),
30
+ cwd: Type.Optional(Type.String({
31
+ description: "Diretório de trabalho para o processo do agente",
32
+ })),
33
+ });
34
+ const ChainItem = Type.Object({
35
+ agent: Type.String({ description: "Nome do agente a invocar" }),
36
+ task: Type.String({
37
+ description: "Tarefa com placeholder opcional {previous} para saída anterior",
38
+ }),
39
+ cwd: Type.Optional(Type.String({
40
+ description: "Diretório de trabalho para o processo do agente",
41
+ })),
42
+ });
43
+ const AgentScopeSchema = StringEnum(["user", "project", "both"], {
44
+ description: 'Diretórios de agente a usar. Padrão: "user". Use "both" para incluir agentes do projeto.',
45
+ default: "user",
46
+ });
47
+ const SubagentParams = Type.Object({
48
+ agent: Type.Optional(Type.String({ description: "Nome do agente (modo single)" })),
49
+ task: Type.Optional(Type.String({ description: "Tarefa a delegar (modo single)" })),
50
+ tasks: Type.Optional(Type.Array(TaskItem, {
51
+ description: "Array de {agent, task} para execução paralela",
52
+ })),
53
+ chain: Type.Optional(Type.Array(ChainItem, {
54
+ description: "Array de {agent, task} para execução sequencial",
55
+ })),
56
+ agentScope: Type.Optional(AgentScopeSchema),
57
+ confirmProjectAgents: Type.Optional(Type.Boolean({
58
+ description: "Perguntar antes de executar agentes do projeto. Padrão: true.",
59
+ default: true,
60
+ })),
61
+ cwd: Type.Optional(Type.String({
62
+ description: "Diretório de trabalho para o agente (modo single)",
63
+ })),
64
+ });
65
+ // ---------------------------------------------------------------------------
66
+ // Helper para criar makeDetails
67
+ // ---------------------------------------------------------------------------
68
+ function createMakeDetails(mode, agentScope, projectAgentsDir) {
69
+ return (results) => ({
70
+ mode,
71
+ agentScope,
72
+ projectAgentsDir,
73
+ results,
74
+ });
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Extensão
78
+ // ---------------------------------------------------------------------------
79
+ export default function subagentExtension(pi) {
80
+ // Garante que os agentes built-in existam na primeira execução
81
+ seedBuiltinAgents();
82
+ pi.registerTool({
83
+ name: "subagent",
84
+ label: "Subagente",
85
+ description: [
86
+ "Delega tarefas para subagentes especializados com contexto isolado.",
87
+ "Modos: single (agent + task), parallel (tasks array), chain (sequencial com {previous}).",
88
+ 'Escopo padrão de agente é "user" (~/.config/apiario/agents).',
89
+ 'Para ativar agentes locais do projeto, use agentScope: "both" (ou "project").',
90
+ ].join(" "),
91
+ promptSnippet: "Delega tarefa para subagente especializado (scout, generalist, reviewer)",
92
+ promptGuidelines: [
93
+ "Use subagent para tarefas que exigem isolamento de contexto, como explorar o repositório antes de editar.",
94
+ "Prefira chain mode para fluxos multi-etapa (scout → generalist → reviewer).",
95
+ "Use parallel mode para tarefas independentes de reconhecimento.",
96
+ ],
97
+ parameters: SubagentParams,
98
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
99
+ const agentScope = params.agentScope ?? "user";
100
+ const discovery = discoverAgents(ctx.cwd, agentScope);
101
+ const agents = discovery.agents;
102
+ const confirmProjectAgents = params.confirmProjectAgents ?? true;
103
+ const hasChain = (params.chain?.length ?? 0) > 0;
104
+ const hasTasks = (params.tasks?.length ?? 0) > 0;
105
+ const hasSingle = Boolean(params.agent && params.task);
106
+ const modeCount = Number(hasChain) + Number(hasTasks) + Number(hasSingle);
107
+ const makeDetails = createMakeDetails(hasChain ? "chain" : hasTasks ? "parallel" : "single", agentScope, discovery.projectAgentsDir);
108
+ if (modeCount !== 1) {
109
+ const available = agents
110
+ .map((a) => `${a.name} (${a.source})`)
111
+ .join(", ") || "nenhum";
112
+ return {
113
+ content: [
114
+ {
115
+ type: "text",
116
+ text: `Parâmetros inválidos. Forneça exatamente um modo.\nAgentes disponíveis: ${available}`,
117
+ },
118
+ ],
119
+ details: makeDetails([]),
120
+ };
121
+ }
122
+ // Confirmação para agentes de projeto
123
+ if ((agentScope === "project" || agentScope === "both") &&
124
+ confirmProjectAgents &&
125
+ ctx.hasUI) {
126
+ const requestedAgentNames = new Set();
127
+ if (params.chain)
128
+ for (const step of params.chain)
129
+ requestedAgentNames.add(step.agent);
130
+ if (params.tasks)
131
+ for (const t of params.tasks)
132
+ requestedAgentNames.add(t.agent);
133
+ if (params.agent)
134
+ requestedAgentNames.add(params.agent);
135
+ const projectAgentsRequested = Array.from(requestedAgentNames)
136
+ .map((name) => agents.find((a) => a.name === name))
137
+ .filter((a) => a?.source === "project");
138
+ if (projectAgentsRequested.length > 0) {
139
+ const names = projectAgentsRequested
140
+ .map((a) => a.name)
141
+ .join(", ");
142
+ const dir = discovery.projectAgentsDir ?? "(desconhecido)";
143
+ const ok = await ctx.ui.confirm("Executar agentes do projeto?", `Agentes: ${names}\nOrigem: ${dir}\n\nAgentes de projeto são controlados pelo repositório. Continue apenas para repositórios confiáveis.`);
144
+ if (!ok)
145
+ return {
146
+ content: [
147
+ {
148
+ type: "text",
149
+ text: "Cancelado: agentes do projeto não aprovados.",
150
+ },
151
+ ],
152
+ details: makeDetails([]),
153
+ };
154
+ }
155
+ }
156
+ // ── Chain mode ──────────────────────────────────────
157
+ if (params.chain && params.chain.length > 0) {
158
+ const results = [];
159
+ let previousOutput = "";
160
+ for (let i = 0; i < params.chain.length; i++) {
161
+ const step = params.chain[i];
162
+ const taskWithContext = step.task.replace(/\{previous\}/g, previousOutput);
163
+ const chainUpdate = onUpdate
164
+ ? (partial) => {
165
+ const currentResult = partial.details?.results[0];
166
+ if (currentResult) {
167
+ const allResults = [
168
+ ...results,
169
+ currentResult,
170
+ ];
171
+ onUpdate({
172
+ content: partial.content,
173
+ details: makeDetails(allResults),
174
+ });
175
+ }
176
+ }
177
+ : undefined;
178
+ const result = await runSingleAgent(ctx.cwd, agents, step.agent, taskWithContext, step.cwd, i + 1, signal, chainUpdate, makeDetails);
179
+ results.push(result);
180
+ if (isFailedResult(result)) {
181
+ const errorMsg = getResultOutput(result);
182
+ return {
183
+ content: [
184
+ {
185
+ type: "text",
186
+ text: `Chain interrompida na etapa ${i + 1} (${step.agent}): ${errorMsg}`,
187
+ },
188
+ ],
189
+ details: makeDetails(results),
190
+ isError: true,
191
+ };
192
+ }
193
+ previousOutput = getFinalOutput(result.messages);
194
+ }
195
+ return {
196
+ content: [
197
+ {
198
+ type: "text",
199
+ text: getFinalOutput(results[results.length - 1].messages) || "(sem saída)",
200
+ },
201
+ ],
202
+ details: makeDetails(results),
203
+ };
204
+ }
205
+ // ── Parallel mode ───────────────────────────────────
206
+ if (params.tasks && params.tasks.length > 0) {
207
+ if (params.tasks.length > MAX_PARALLEL_TASKS) {
208
+ return {
209
+ content: [
210
+ {
211
+ type: "text",
212
+ text: `Muitas tarefas paralelas (${params.tasks.length}). Máximo é ${MAX_PARALLEL_TASKS}.`,
213
+ },
214
+ ],
215
+ details: makeDetails([]),
216
+ };
217
+ }
218
+ const allResults = new Array(params.tasks.length);
219
+ // Inicializa placeholders
220
+ for (let i = 0; i < params.tasks.length; i++) {
221
+ allResults[i] = {
222
+ agent: params.tasks[i].agent,
223
+ agentSource: "unknown",
224
+ task: params.tasks[i].task,
225
+ exitCode: -1,
226
+ messages: [],
227
+ stderr: "",
228
+ usage: {
229
+ input: 0,
230
+ output: 0,
231
+ cacheRead: 0,
232
+ cacheWrite: 0,
233
+ cost: 0,
234
+ contextTokens: 0,
235
+ turns: 0,
236
+ },
237
+ };
238
+ }
239
+ const emitParallelUpdate = () => {
240
+ if (onUpdate) {
241
+ const running = allResults.filter((r) => r.exitCode === -1).length;
242
+ const done = allResults.filter((r) => r.exitCode !== -1).length;
243
+ onUpdate({
244
+ content: [
245
+ {
246
+ type: "text",
247
+ text: `Paralelo: ${done}/${allResults.length} concluídas, ${running} em execução...`,
248
+ },
249
+ ],
250
+ details: makeDetails([...allResults]),
251
+ });
252
+ }
253
+ };
254
+ const results = await mapWithConcurrencyLimit(params.tasks, MAX_CONCURRENCY, async (t, index) => {
255
+ const result = await runSingleAgent(ctx.cwd, agents, t.agent, t.task, t.cwd, undefined, signal, (partial) => {
256
+ if (partial.details?.results[0]) {
257
+ allResults[index] =
258
+ partial.details.results[0];
259
+ emitParallelUpdate();
260
+ }
261
+ }, makeDetails);
262
+ allResults[index] = result;
263
+ emitParallelUpdate();
264
+ return result;
265
+ });
266
+ const successCount = results.filter((r) => !isFailedResult(r)).length;
267
+ const summaries = results.map((r) => {
268
+ const output = truncateParallelOutput(getResultOutput(r));
269
+ const status = isFailedResult(r)
270
+ ? `falhou${r.stopReason && r.stopReason !== "end" ? ` (${r.stopReason})` : ""}`
271
+ : "concluída";
272
+ return `### [${r.agent}] ${status}\n\n${output}`;
273
+ });
274
+ return {
275
+ content: [
276
+ {
277
+ type: "text",
278
+ text: `Paralelo: ${successCount}/${results.length} sucesso\n\n${summaries.join("\n\n---\n\n")}`,
279
+ },
280
+ ],
281
+ details: makeDetails(results),
282
+ };
283
+ }
284
+ // ── Single mode ─────────────────────────────────────
285
+ if (params.agent && params.task) {
286
+ const result = await runSingleAgent(ctx.cwd, agents, params.agent, params.task, params.cwd, undefined, signal, onUpdate, makeDetails);
287
+ if (isFailedResult(result)) {
288
+ const errorMsg = getResultOutput(result);
289
+ return {
290
+ content: [
291
+ {
292
+ type: "text",
293
+ text: `Agente ${result.stopReason || "falhou"}: ${errorMsg}`,
294
+ },
295
+ ],
296
+ details: makeDetails([result]),
297
+ isError: true,
298
+ };
299
+ }
300
+ return {
301
+ content: [
302
+ {
303
+ type: "text",
304
+ text: getFinalOutput(result.messages) ||
305
+ "(sem saída)",
306
+ },
307
+ ],
308
+ details: makeDetails([result]),
309
+ };
310
+ }
311
+ // Fallback — nunca deve chegar aqui
312
+ const available = agents
313
+ .map((a) => `${a.name} (${a.source})`)
314
+ .join(", ") || "nenhum";
315
+ return {
316
+ content: [
317
+ {
318
+ type: "text",
319
+ text: `Parâmetros inválidos. Agentes disponíveis: ${available}`,
320
+ },
321
+ ],
322
+ details: makeDetails([]),
323
+ };
324
+ },
325
+ // ── Renderização ───────────────────────────────────────
326
+ renderCall(args, theme, _context) {
327
+ return renderSubagentCall(args, theme);
328
+ },
329
+ renderResult(result, { expanded }, theme, _context) {
330
+ return renderSubagentResult(result, expanded, theme);
331
+ },
332
+ });
333
+ }
334
+ // ---------------------------------------------------------------------------
335
+ // Helpers internos
336
+ // ---------------------------------------------------------------------------
337
+ function getFinalOutput(messages) {
338
+ for (let i = messages.length - 1; i >= 0; i--) {
339
+ const msg = messages[i];
340
+ if (msg.role === "assistant") {
341
+ for (const part of msg.content) {
342
+ if (part.type === "text")
343
+ return part.text;
344
+ }
345
+ }
346
+ }
347
+ return "";
348
+ }
349
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAGL,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE/C,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC/D,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IACpE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,iDAAiD;KAC/D,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC/D,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAChB,WAAW,EACT,gEAAgE;KACnE,CAAC;IACF,GAAG,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,iDAAiD;KAC/D,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAU,EAAE;IACxE,WAAW,EACT,0FAA0F;IAC5F,OAAO,EAAE,MAAM;CAChB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC,CAC7D;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CAC/D;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACnB,WAAW,EAAE,+CAA+C;KAC7D,CAAC,CACH;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACpB,WAAW,EAAE,iDAAiD;KAC/D,CAAC,CACH;IACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC3C,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CACjC,IAAI,CAAC,OAAO,CAAC;QACX,WAAW,EACT,+DAA+D;QACjE,OAAO,EAAE,IAAI;KACd,CAAC,CACH;IACD,GAAG,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,mDAAmD;KACjE,CAAC,CACH;CACF,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,IAAqC,EACrC,UAAsB,EACtB,gBAA+B;IAE/B,OAAO,CAAC,OAAuB,EAAmB,EAAE,CAAC,CAAC;QACpD,IAAI;QACJ,UAAU;QACV,gBAAgB;QAChB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAgB;IACxD,+DAA+D;IAC/D,iBAAiB,EAAE,CAAC;IAEpB,EAAE,CAAC,YAAY,CAAC;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE;YACX,qEAAqE;YACrE,0FAA0F;YAC1F,8DAA8D;YAC9D,+EAA+E;SAChF,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,aAAa,EACX,0EAA0E;QAC5E,gBAAgB,EAAE;YAChB,2GAA2G;YAC3G,6EAA6E;YAC7E,iEAAiE;SAClE;QACD,UAAU,EAAE,cAAc;QAE1B,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAW,EACX,MAA+B,EAC/B,QAA8C,EAC9C,GAAQ;YAER,MAAM,UAAU,GAAe,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;YAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,MAAM,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC;YAEjE,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAE1E,MAAM,WAAW,GAAG,iBAAiB,CACnC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EACrD,UAAU,EACV,SAAS,CAAC,gBAAgB,CAC3B,CAAC;YAEF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,SAAS,GACb,MAAM;qBACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;qBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,2EAA2E,SAAS,EAAE;yBAC7F;qBACF;oBACD,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;iBACzB,CAAC;YACJ,CAAC;YAED,sCAAsC;YACtC,IACE,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,MAAM,CAAC;gBACnD,oBAAoB;gBACpB,GAAG,CAAC,KAAK,EACT,CAAC;gBACD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;gBAC9C,IAAI,MAAM,CAAC,KAAK;oBACd,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;wBAC7B,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,KAAK;oBACd,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK;wBAC1B,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,KAAK;oBAAE,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAExD,MAAM,sBAAsB,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;qBAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;qBAClD,MAAM,CACL,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,CACjD,CAAC;gBAEJ,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,sBAAsB;yBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,MAAM,GAAG,GACP,SAAS,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;oBACjD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAC7B,8BAA8B,EAC9B,YAAY,KAAK,aAAa,GAAG,wGAAwG,CAC1I,CAAC;oBACF,IAAI,CAAC,EAAE;wBACL,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,8CAA8C;iCACrD;6BACF;4BACD,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;yBACzB,CAAC;gBACN,CAAC;YACH,CAAC;YAED,uDAAuD;YACvD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,OAAO,GAAmB,EAAE,CAAC;gBACnC,IAAI,cAAc,GAAG,EAAE,CAAC;gBAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CACvC,eAAe,EACf,cAAc,CACf,CAAC;oBAEF,MAAM,WAAW,GAED,QAAQ;wBACtB,CAAC,CAAC,CAAC,OAAY,EAAE,EAAE;4BACf,MAAM,aAAa,GACjB,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;4BAC5B,IAAI,aAAa,EAAE,CAAC;gCAClB,MAAM,UAAU,GAAG;oCACjB,GAAG,OAAO;oCACV,aAAa;iCACd,CAAC;gCACF,QAAQ,CAAC;oCACP,OAAO,EAAE,OAAO,CAAC,OAAO;oCACxB,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC;iCAC1B,CAAC,CAAC;4BACZ,CAAC;wBACH,CAAC;wBACH,CAAC,CAAE,SAAiB,CAAC;oBAEzB,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,GAAG,CAAC,GAAG,EACP,MAAM,EACN,IAAI,CAAC,KAAK,EACV,eAAe,EACf,IAAI,CAAC,GAAG,EACR,CAAC,GAAG,CAAC,EACL,MAAM,EACN,WAAW,EACX,WAAW,CACZ,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAErB,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC3B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;wBACzC,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,+BAA+B,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,MAAM,QAAQ,EAAE;iCAC1E;6BACF;4BACD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;4BAC7B,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,cAAc,CACZ,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CACrC,IAAI,aAAa;yBACrB;qBACF;oBACD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;iBAC9B,CAAC;YACJ,CAAC;YAED,uDAAuD;YACvD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;oBAC7C,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,6BAA6B,MAAM,CAAC,KAAK,CAAC,MAAM,eAAe,kBAAkB,GAAG;6BAC3F;yBACF;wBACD,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;qBACzB,CAAC;gBACJ,CAAC;gBAED,MAAM,UAAU,GAAmB,IAAI,KAAK,CAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CACpB,CAAC;gBAEF,0BAA0B;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,UAAU,CAAC,CAAC,CAAC,GAAG;wBACd,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;wBAC5B,WAAW,EAAE,SAAS;wBACtB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC1B,QAAQ,EAAE,CAAC,CAAC;wBACZ,QAAQ,EAAE,EAAE;wBACZ,MAAM,EAAE,EAAE;wBACV,KAAK,EAAE;4BACL,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,CAAC;4BACT,SAAS,EAAE,CAAC;4BACZ,UAAU,EAAE,CAAC;4BACb,IAAI,EAAE,CAAC;4BACP,aAAa,EAAE,CAAC;4BAChB,KAAK,EAAE,CAAC;yBACT;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,kBAAkB,GAAG,GAAG,EAAE;oBAC9B,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CACzB,CAAC,MAAM,CAAC;wBACT,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CACzB,CAAC,MAAM,CAAC;wBACT,QAAQ,CAAC;4BACP,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,aAAa,IAAI,IAAI,UAAU,CAAC,MAAM,gBAAgB,OAAO,iBAAiB;iCACrF;6BACF;4BACD,OAAO,EAAE,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;yBAC/B,CAAC,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAC3C,MAAM,CAAC,KAAc,EACrB,eAAe,EACf,KAAK,EAAE,CAAM,EAAE,KAAa,EAAE,EAAE;oBAC9B,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,GAAG,CAAC,GAAG,EACP,MAAM,EACN,CAAC,CAAC,KAAK,EACP,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,GAAG,EACL,SAAS,EACT,MAAM,EACN,CAAC,OAAO,EAAE,EAAE;wBACV,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;4BAChC,UAAU,CAAC,KAAK,CAAC;gCACf,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BAC7B,kBAAkB,EAAE,CAAC;wBACvB,CAAC;oBACH,CAAC,EACD,WAAW,CACZ,CAAC;oBACF,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;oBAC3B,kBAAkB,EAAE,CAAC;oBACrB,OAAO,MAAM,CAAC;gBAChB,CAAC,CACF,CAAC;gBAEF,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAC1B,CAAC,MAAM,CAAC;gBACT,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAClC,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;wBAC9B,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC/E,CAAC,CAAC,WAAW,CAAC;oBAChB,OAAO,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,MAAM,EAAE,CAAC;gBACnD,CAAC,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,aAAa,YAAY,IAAI,OAAO,CAAC,MAAM,eAAe,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;yBAChG;qBACF;oBACD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;iBAC9B,CAAC;YACJ,CAAC;YAED,uDAAuD;YACvD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,GAAG,CAAC,GAAG,EACP,MAAM,EACN,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,GAAG,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,WAAW,CACZ,CAAC;gBAEF,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;oBACzC,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,UAAU,MAAM,CAAC,UAAU,IAAI,QAAQ,KAAK,QAAQ,EAAE;6BAC7D;yBACF;wBACD,OAAO,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC9B,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;gCAC/B,aAAa;yBAChB;qBACF;oBACD,OAAO,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC/B,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,MAAM,SAAS,GACb,MAAM;iBACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;iBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,8CAA8C,SAAS,EAAE;qBAChE;iBACF;gBACD,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;aACzB,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ;YAC9B,OAAO,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ;YAChD,OAAO,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,QAAmB;IACzC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Spawn do child process (npx apiario --mode json)
3
+ *
4
+ * Lida com:
5
+ * - Spawn do processo filho
6
+ * - Streaming de saída JSON-line
7
+ * - Coleta de resultados (mensagens, uso)
8
+ * - Abort (Ctrl+C) — mata o child
9
+ */
10
+ import type { Message } from "@earendil-works/pi-ai";
11
+ import type { AgentConfig } from "./agents.js";
12
+ export type OnUpdateCallback = (partial: any) => void;
13
+ export interface UsageStats {
14
+ input: number;
15
+ output: number;
16
+ cacheRead: number;
17
+ cacheWrite: number;
18
+ cost: number;
19
+ contextTokens: number;
20
+ turns: number;
21
+ }
22
+ export interface SingleResult {
23
+ agent: string;
24
+ agentSource: "user" | "project" | "unknown";
25
+ task: string;
26
+ exitCode: number;
27
+ messages: Message[];
28
+ stderr: string;
29
+ usage: UsageStats;
30
+ model?: string;
31
+ stopReason?: string;
32
+ errorMessage?: string;
33
+ step?: number;
34
+ }
35
+ export interface SubagentDetails {
36
+ mode: "single" | "parallel" | "chain";
37
+ agentScope: "user" | "project" | "both";
38
+ projectAgentsDir: string | null;
39
+ results: SingleResult[];
40
+ }
41
+ export declare function isFailedResult(result: SingleResult): boolean;
42
+ export declare function getResultOutput(result: SingleResult): string;
43
+ export declare function truncateParallelOutput(output: string): string;
44
+ export declare function formatTokens(count: number): string;
45
+ export declare function formatUsageStats(usage: UsageStats, model?: string): string;
46
+ export declare function runSingleAgent(defaultCwd: string, agents: AgentConfig[], agentName: string, task: string, cwd: string | undefined, step: number | undefined, signal: AbortSignal | undefined, onUpdate: OnUpdateCallback | undefined, makeDetails: (results: SingleResult[]) => SubagentDetails): Promise<SingleResult>;
47
+ export declare function mapWithConcurrencyLimit<TIn, TOut>(items: TIn[], concurrency: number, fn: (item: TIn, index: number) => Promise<TOut>): Promise<TOut[]>;
48
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACxC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAwBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAM5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAU5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAcR;AA+DD,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,GACxD,OAAO,CAAC,YAAY,CAAC,CAyLvB;AAMD,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EACrD,KAAK,EAAE,GAAG,EAAE,EACZ,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAC9C,OAAO,CAAC,IAAI,EAAE,CAAC,CAgBjB"}