oficina-opencode 3.0.5 → 3.1.1

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.
Files changed (145) hide show
  1. package/README.md +240 -208
  2. package/commands/oficina.md +7 -6
  3. package/dashboard/.dom-check.html +1257 -0
  4. package/dashboard/README-DASHBOARD.md +64 -0
  5. package/dashboard/assets/factory.css +1543 -0
  6. package/dashboard/assets/tokens.css +208 -0
  7. package/dashboard/build-kanban-data.mjs +279 -0
  8. package/dashboard/dashboard.css +753 -0
  9. package/dashboard/dashboard.html +121 -0
  10. package/dashboard/dashboard.js +610 -0
  11. package/dashboard/data/snapshot.json +883 -0
  12. package/dashboard/debate.html +134 -0
  13. package/dashboard/factory/build-snapshot.mjs +89 -0
  14. package/dashboard/factory/factory-app.js +1185 -0
  15. package/dashboard/factory/factory-core.js +541 -0
  16. package/dashboard/factory/snapshot.js +850 -0
  17. package/dashboard/factory.html +350 -0
  18. package/dashboard/kanban-data.json +671 -0
  19. package/dashboard/kanban-source.js +643 -0
  20. package/dashboard/kanban.check.mjs +454 -0
  21. package/dashboard/kanban.html +1257 -0
  22. package/dashboard/leadership.html +1008 -0
  23. package/dashboard/lib/debate-app.js +1149 -0
  24. package/dashboard/lib/debate-core.js +698 -0
  25. package/dashboard/lib/debate-data.js +163 -0
  26. package/dashboard/lib/debate-demo.js +110 -0
  27. package/dashboard/lib/debate.css +1155 -0
  28. package/dashboard/lib/leadership-model.js +946 -0
  29. package/dashboard/probe.mjs +35 -0
  30. package/dashboard/scripts/serve.mjs +122 -0
  31. package/dashboard/scripts/snapshot-data.mjs +93 -0
  32. package/dashboard/scripts/snapshot.mjs +28 -0
  33. package/dashboard/server.mjs +242 -0
  34. package/dashboard/shot.mjs +54 -0
  35. package/dashboard/shots/desktop-gates.png +0 -0
  36. package/dashboard/shots/desktop-light.png +0 -0
  37. package/dashboard/shots/desktop-real.png +0 -0
  38. package/dashboard/shots/mobile.png +0 -0
  39. package/dashboard/test/factory-core.test.mjs +244 -0
  40. package/dashboard/tests/debate-core.test.mjs +336 -0
  41. package/dashboard/tests/leadership-model.test.mjs +404 -0
  42. package/dist/cli.js +148 -26
  43. package/dist/cli.js.map +1 -1
  44. package/dist/core/bus.js +3 -3
  45. package/dist/core/bus.js.map +1 -1
  46. package/dist/core/catalog.d.ts +9 -1
  47. package/dist/core/catalog.d.ts.map +1 -1
  48. package/dist/core/catalog.js +77 -2
  49. package/dist/core/catalog.js.map +1 -1
  50. package/dist/core/dashboard.d.ts +33 -0
  51. package/dist/core/dashboard.d.ts.map +1 -0
  52. package/dist/core/dashboard.js +115 -0
  53. package/dist/core/dashboard.js.map +1 -0
  54. package/dist/core/dispatch.d.ts +1 -1
  55. package/dist/core/dispatch.d.ts.map +1 -1
  56. package/dist/core/dispatch.js +84 -12
  57. package/dist/core/dispatch.js.map +1 -1
  58. package/dist/core/docsync.d.ts +0 -9
  59. package/dist/core/docsync.d.ts.map +1 -1
  60. package/dist/core/docsync.js +12 -15
  61. package/dist/core/docsync.js.map +1 -1
  62. package/dist/core/environment.d.ts +28 -0
  63. package/dist/core/environment.d.ts.map +1 -0
  64. package/dist/core/environment.js +80 -0
  65. package/dist/core/environment.js.map +1 -0
  66. package/dist/core/factory.d.ts +16 -0
  67. package/dist/core/factory.d.ts.map +1 -1
  68. package/dist/core/factory.js +143 -0
  69. package/dist/core/factory.js.map +1 -1
  70. package/dist/core/fsx.d.ts +20 -2
  71. package/dist/core/fsx.d.ts.map +1 -1
  72. package/dist/core/fsx.js +10 -6
  73. package/dist/core/fsx.js.map +1 -1
  74. package/dist/core/gates.d.ts +23 -1
  75. package/dist/core/gates.d.ts.map +1 -1
  76. package/dist/core/gates.js +83 -8
  77. package/dist/core/gates.js.map +1 -1
  78. package/dist/core/leases.d.ts.map +1 -1
  79. package/dist/core/leases.js +4 -1
  80. package/dist/core/leases.js.map +1 -1
  81. package/dist/core/mesa.d.ts +1 -6
  82. package/dist/core/mesa.d.ts.map +1 -1
  83. package/dist/core/mesa.js +1 -6
  84. package/dist/core/mesa.js.map +1 -1
  85. package/dist/core/office.d.ts +3 -29
  86. package/dist/core/office.d.ts.map +1 -1
  87. package/dist/core/office.js +77 -90
  88. package/dist/core/office.js.map +1 -1
  89. package/dist/core/paths.d.ts.map +1 -1
  90. package/dist/core/paths.js +6 -1
  91. package/dist/core/paths.js.map +1 -1
  92. package/dist/core/retry.d.ts +2 -8
  93. package/dist/core/retry.d.ts.map +1 -1
  94. package/dist/core/retry.js +3 -34
  95. package/dist/core/retry.js.map +1 -1
  96. package/dist/core/roster.js +3 -3
  97. package/dist/core/roster.js.map +1 -1
  98. package/dist/core/sandbox.d.ts +38 -1
  99. package/dist/core/sandbox.d.ts.map +1 -1
  100. package/dist/core/sandbox.js +119 -15
  101. package/dist/core/sandbox.js.map +1 -1
  102. package/dist/core/state.d.ts +2 -2
  103. package/dist/core/state.d.ts.map +1 -1
  104. package/dist/core/state.js +5 -33
  105. package/dist/core/state.js.map +1 -1
  106. package/dist/core/stores.d.ts +3 -13
  107. package/dist/core/stores.d.ts.map +1 -1
  108. package/dist/core/stores.js +8 -32
  109. package/dist/core/stores.js.map +1 -1
  110. package/dist/core/systemPrompt.d.ts.map +1 -1
  111. package/dist/core/systemPrompt.js +4 -1
  112. package/dist/core/systemPrompt.js.map +1 -1
  113. package/dist/core/tripwire.d.ts +22 -8
  114. package/dist/core/tripwire.d.ts.map +1 -1
  115. package/dist/core/tripwire.js +71 -26
  116. package/dist/core/tripwire.js.map +1 -1
  117. package/dist/core/types.d.ts +6 -14
  118. package/dist/core/types.d.ts.map +1 -1
  119. package/dist/core/types.js +11 -3
  120. package/dist/core/types.js.map +1 -1
  121. package/dist/hooks/scopeGuard.d.ts +15 -1
  122. package/dist/hooks/scopeGuard.d.ts.map +1 -1
  123. package/dist/hooks/scopeGuard.js +88 -73
  124. package/dist/hooks/scopeGuard.js.map +1 -1
  125. package/dist/tools/index.d.ts +9 -1
  126. package/dist/tools/index.d.ts.map +1 -1
  127. package/dist/tools/index.js +29 -81
  128. package/dist/tools/index.js.bak +972 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/v1.d.ts.map +1 -1
  131. package/dist/v1.js +30 -36
  132. package/dist/v1.js.map +1 -1
  133. package/dist/v2.d.ts +5 -0
  134. package/dist/v2.d.ts.map +1 -1
  135. package/dist/v2.js +79 -46
  136. package/dist/v2.js.bak +517 -0
  137. package/dist/v2.js.map +1 -1
  138. package/docs/GARANTIAS.md +2 -2
  139. package/docs/PRUEBA-E2E.md +4 -4
  140. package/docs/QUE-ES.md +4 -5
  141. package/docs/SEGURIDAD-REPO.md +83 -0
  142. package/docs/assets/banner.svg +42 -0
  143. package/docs/catalog-facts.json +3 -3
  144. package/docs/superpowers/specs/2026-10-29-factory-skill-creator-and-remove-budget.md +182 -0
  145. package/package.json +14 -6
@@ -204,26 +204,17 @@ export function extractCommand(args) {
204
204
  }
205
205
  return undefined;
206
206
  }
207
- /* ────────────────────────────────────────────────────────────────────────────
208
- * Resolucion de scope
209
- * ──────────────────────────────────────────────────────────────────────────── */
210
- /**
211
- * La card que gobierna una sesión.
212
- *
213
- * Primero mira el binding directo. Si no hay, sube por la cadena de
214
- * padres: un subagente es una sesión hija, y su scope es el de quien lo
215
- * lanzo.
216
- */
217
207
  export async function resolveScopeCard(state, sessionID, options) {
218
208
  const direct = state.sessions[sessionID];
219
209
  if (direct?.cardId) {
220
210
  const card = state.cards[direct.cardId];
221
211
  if (card)
222
- return card;
212
+ return { kind: "AUTHORIZED", card };
223
213
  }
224
214
  const resolveParent = options.resolveParentSession;
225
- if (!resolveParent)
226
- return undefined;
215
+ if (!resolveParent) {
216
+ return { kind: "NO_SCOPE_APPLICABLE" };
217
+ }
227
218
  const maxDepth = options.maxParentDepth ?? 6;
228
219
  const visited = new Set([sessionID]);
229
220
  let current = sessionID;
@@ -233,8 +224,9 @@ export async function resolveScopeCard(state, sessionID, options) {
233
224
  parent = await resolveParent(current);
234
225
  }
235
226
  catch (err) {
236
- log.debug("no se pudo resolver el padre de la sesion", { sessionID: current, error: String(err) });
237
- return undefined;
227
+ const reason = `Error resolving parent session: ${String(err)}`;
228
+ log.error("no se pudo resolver el padre de la sesion", { sessionID: current, error: String(err) });
229
+ return { kind: "VERIFICATION_FAILED", reason };
238
230
  }
239
231
  if (!parent || visited.has(parent))
240
232
  break;
@@ -243,11 +235,11 @@ export async function resolveScopeCard(state, sessionID, options) {
243
235
  if (binding?.cardId) {
244
236
  const card = state.cards[binding.cardId];
245
237
  if (card)
246
- return card;
238
+ return { kind: "AUTHORIZED", card };
247
239
  }
248
240
  current = parent;
249
241
  }
250
- return undefined;
242
+ return { kind: "NO_SCOPE_APPLICABLE" };
251
243
  }
252
244
  /* ────────────────────────────────────────────────────────────────────────────
253
245
  * Hook
@@ -269,68 +261,87 @@ export function createScopeGuardHook(office, options = { enforce: true }) {
269
261
  return;
270
262
  try {
271
263
  const state = await office.loadState();
272
- const card = await resolveScopeCard(state, input.sessionID, options);
273
- // Sin card activa no hay scope que aplicar: el agente está en
274
- // exploración libre o en una operación que no es de la oficina.
275
- if (!card)
276
- return;
277
- const policy = { mayTouch: card.scope.mayTouch, forbidden: card.scope.forbidden };
278
- const projectRoot = office.paths.projectRoot;
279
- /* ── Archivos ────────────────────────────────────────────────────── */
280
- if (isFileWrite) {
281
- const paths = extractPaths(tool, args);
282
- if (paths.length === 0)
264
+ const scopeResult = await resolveScopeCard(state, input.sessionID, options);
265
+ switch (scopeResult.kind) {
266
+ case "NO_SCOPE_APPLICABLE": {
267
+ // Sesión sin card activa legítima: no hay scope que aplicar.
268
+ // El agente está en exploración libre o en una operación que no es de la oficina.
283
269
  return;
284
- for (const p of paths) {
285
- const verdict = await checkScope(projectRoot, p, policy);
286
- if (!verdict.allowed) {
287
- log.warn("scope violado (archivo)", { card: card.id, path: p, kind: verdict.kind });
288
- if (options.enforce)
289
- throw scopeError(verdict, card);
290
- }
291
270
  }
292
- log.debug("scope ok", { card: card.id, tool, paths: paths.length });
293
- return;
294
- }
295
- /* ── Shell ───────────────────────────────────────────────────────── */
296
- if (isShell) {
297
- const command = extractCommand(args);
298
- if (!command)
299
- return;
300
- const candidates = analyzeShellCommand(command);
301
- if (candidates.length === 0)
271
+ case "VERIFICATION_FAILED": {
272
+ // No se pudo resolver la autorización: error en la cadena de padres.
273
+ // Con enforce=true y operación de escritura → DENY (fail-closed).
274
+ // Con enforce=false → WARN y deja pasar (comportamiento legacy documentado).
275
+ const reason = scopeResult.reason;
276
+ log.error("verificacion de scope fallida", { reason, tool, enforce: options.enforce });
277
+ if (options.enforce && (isFileWrite || isShell)) {
278
+ throw new Error(`[OFICINA] Scope verification failed: ${reason}. Operation blocked (fail-closed).`);
279
+ }
280
+ log.warn("verificacion de scope fallida (sin bloquear por enforce=false)", { reason, tool });
302
281
  return;
303
- for (const candidate of candidates) {
304
- if (candidate.uncertain) {
305
- // Hay una escritura que no sabemos interpretar. No se bloquea
306
- // (seria inservible) pero se avisa: el tripwire va a vigilar.
307
- log.warn("shell con escritura no interpretable", {
308
- card: card.id,
309
- op: candidate.op,
310
- command: command.slice(0, 200),
311
- });
312
- continue;
282
+ }
283
+ case "AUTHORIZED": {
284
+ const card = scopeResult.card;
285
+ const policy = { mayTouch: card.scope.mayTouch, forbidden: card.scope.forbidden };
286
+ const projectRoot = office.paths.projectRoot;
287
+ /* ── Archivos ────────────────────────────────────────────────────── */
288
+ if (isFileWrite) {
289
+ const paths = extractPaths(tool, args);
290
+ if (paths.length === 0)
291
+ return;
292
+ for (const p of paths) {
293
+ const verdict = await checkScope(projectRoot, p, policy);
294
+ if (!verdict.allowed) {
295
+ log.warn("scope violado (archivo)", { card: card.id, path: p, kind: verdict.kind });
296
+ if (options.enforce)
297
+ throw scopeError(verdict, card);
298
+ }
299
+ }
300
+ log.debug("scope ok", { card: card.id, tool, paths: paths.length });
301
+ return;
313
302
  }
314
- const verdict = await checkScope(projectRoot, candidate.target, policy);
315
- if (!verdict.allowed) {
316
- log.warn("scope violado (shell)", {
317
- card: card.id,
318
- target: candidate.target,
319
- op: candidate.op,
320
- kind: verdict.kind,
321
- });
322
- if (options.enforce && shellPolicy === "block") {
323
- throw scopeError(verdict, card);
303
+ /* ── Shell ───────────────────────────────────────────────────────── */
304
+ if (isShell) {
305
+ const command = extractCommand(args);
306
+ if (!command)
307
+ return;
308
+ const candidates = analyzeShellCommand(command);
309
+ if (candidates.length === 0)
310
+ return;
311
+ for (const candidate of candidates) {
312
+ if (candidate.uncertain) {
313
+ // Hay una escritura que no sabemos interpretar. No se bloquea
314
+ // (seria inservible) pero se avisa: el tripwire va a vigilar.
315
+ log.warn("shell con escritura no interpretable", {
316
+ card: card.id,
317
+ op: candidate.op,
318
+ command: command.slice(0, 200),
319
+ });
320
+ continue;
321
+ }
322
+ const verdict = await checkScope(projectRoot, candidate.target, policy);
323
+ if (!verdict.allowed) {
324
+ log.warn("scope violado (shell)", {
325
+ card: card.id,
326
+ target: candidate.target,
327
+ op: candidate.op,
328
+ kind: verdict.kind,
329
+ });
330
+ if (options.enforce && shellPolicy === "block") {
331
+ throw scopeError(verdict, card);
332
+ }
333
+ }
324
334
  }
335
+ return;
325
336
  }
337
+ /* ── Delegacion ──────────────────────────────────────────────────── */
338
+ // Delegar no escribe, pero crea un actor nuevo. Se registra para que
339
+ // el subagente herede el scope cuando el motor cree su sesion.
340
+ if (isDelegate) {
341
+ log.debug("delegacion dentro de scope", { card: card.id, tool });
342
+ }
343
+ break;
326
344
  }
327
- return;
328
- }
329
- /* ── Delegacion ──────────────────────────────────────────────────── */
330
- // Delegar no escribe, pero crea un actor nuevo. Se registra para que
331
- // el subagente herede el scope cuando el motor cree su sesion.
332
- if (isDelegate) {
333
- log.debug("delegacion dentro de scope", { card: card.id, tool });
334
345
  }
335
346
  }
336
347
  catch (err) {
@@ -340,7 +351,11 @@ export function createScopeGuardHook(office, options = { enforce: true }) {
340
351
  log.warn("scope violado (sin bloquear)", { error: err.message });
341
352
  return;
342
353
  }
343
- log.error("fallo en el guard de scope", { error: String(err) });
354
+ // Errores inesperados durante la verificación: fail-closed en enforce=true + escritura
355
+ log.error("fallo inesperado en el guard de scope", { error: String(err) });
356
+ if (options.enforce && (isFileWrite || isShell)) {
357
+ throw new Error(`[OFICINA] Scope guard internal error: ${String(err)}. Operation blocked (fail-closed).`);
358
+ }
344
359
  }
345
360
  };
346
361
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scopeGuard.js","sourceRoot":"","sources":["../../src/hooks/scopeGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAIH,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,YAAY,GAEb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAEzC;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,OAAO;IACP,OAAO;IACP,WAAW;IACX,aAAa;IACb,eAAe;IACf,aAAa;IACb,oBAAoB;IACpB,6BAA6B;IAC7B,WAAW;IACX,oBAAoB;IACpB,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,YAAY;CACb,CAAC,CAAA;AAEF,gCAAgC;AAChC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,MAAM;IACN,OAAO;IACP,KAAK;IACL,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,KAAK;IACL,gBAAgB;CACjB,CAAC,CAAA;AAEF,uCAAuC;AACvC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;AAuB5E;;kFAEkF;AAElF,4DAA4D;AAC5D,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;AAElG;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAA6B;IACtE,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;aAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAA;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;iBAC5D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,KAAgC,CAAA;gBAC5C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;oBAClB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,CAA4B,CAAA;gBACxC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;oBAClB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACX,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,aAAa,GACjB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE7D,wEAAwE;IACxE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,UAAU;YAAE,SAAQ;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAA6B;IACrE,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AACpC,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;IACjE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;kFAEkF;AAElF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAkB,EAClB,SAAiB,EACjB,OAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IACxC,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;IACvB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAA;IAClD,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAA;IAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,SAAS,CAAC,CAAC,CAAA;IAC5C,IAAI,OAAO,GAAG,SAAS,CAAA;IAEvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,MAA0B,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAClG,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,MAAK;QACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACxC,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,MAAM,CAAA;IAClB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;kFAEkF;AAElF,SAAS,UAAU,CAAC,OAAqB,EAAE,IAAU;IACnD,OAAO,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,MAAM,UAAU,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,UAA6B,EAAE,OAAO,EAAE,IAAI,EAAE;IACjG,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAA;IAElD,OAAO,KAAK,UAAU,mBAAmB,CACvC,KAA0D,EAC1D,MAAyC;QAEzC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAA;QACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAM;QAE7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,OAAM;QAEnD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;YACtC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACpE,8DAA8D;YAC9D,gEAAgE;YAChE,IAAI,CAAC,IAAI;gBAAE,OAAM;YAEjB,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;YACjF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAA;YAE5C,wEAAwE;YACxE,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;gBACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;oBACxD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;wBACnF,IAAI,OAAO,CAAC,OAAO;4BAAE,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;oBACtD,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YAED,wEAAwE;YACxE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAM;gBACpB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;oBACnC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;wBACxB,8DAA8D;wBAC9D,8DAA8D;wBAC9D,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE;4BAC/C,IAAI,EAAE,IAAI,CAAC,EAAE;4BACb,EAAE,EAAE,SAAS,CAAC,EAAE;4BAChB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBAC/B,CAAC,CAAA;wBACF,SAAQ;oBACV,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;oBACvE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;4BAChC,IAAI,EAAE,IAAI,CAAC,EAAE;4BACb,MAAM,EAAE,SAAS,CAAC,MAAM;4BACxB,EAAE,EAAE,SAAS,CAAC,EAAE;4BAChB,IAAI,EAAE,OAAO,CAAC,IAAI;yBACnB,CAAC,CAAA;wBACF,IAAI,OAAO,CAAC,OAAO,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;4BAC/C,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;wBACjC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAM;YACR,CAAC;YAED,wEAAwE;YACxE,qEAAqE;YACrE,+DAA+D;YAC/D,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,IAAI,OAAO,CAAC,OAAO;oBAAE,MAAM,GAAG,CAAA;gBAC9B,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBAChE,OAAM;YACR,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"scopeGuard.js","sourceRoot":"","sources":["../../src/hooks/scopeGuard.ts"],"names":[],"mappings":"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"}
@@ -59,5 +59,13 @@ export interface OficinaToolResult {
59
59
  * no puede nombrar el tipo de los schemas (que viene del zod anidado del
60
60
  * plugin) y el build falla con TS2742.
61
61
  */
62
- export declare function buildTools(office: Office): Record<string, OficinaTool>;
62
+ /** Hooks que el entry point puede inyectar en el ciclo de la corrida. */
63
+ export interface ToolHooks {
64
+ /**
65
+ * Se dispara cuando se guarda un plan (arranca una corrida). Devuelve la
66
+ * URL del dashboard visual si pudo abrirse — el plan la reporta al modelo.
67
+ */
68
+ onRunStart?: (runId: string) => Promise<string | undefined>;
69
+ }
70
+ export declare function buildTools(office: Office, hooks?: ToolHooks): Record<string, OficinaTool>;
63
71
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAA;AAKvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAC5E;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAyCD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAqjCtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAA;AAKvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAC5E;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAyCD;;;;;;GAMG;AACH,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAC5D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,SAAc,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA+/B7F"}
@@ -48,14 +48,7 @@ const cardTypeSchema = z.enum([
48
48
  "security",
49
49
  "infra",
50
50
  ]);
51
- /**
52
- * Construye el set de tools dado una instancia de Office.
53
- *
54
- * El tipo de retorno es explícito a propósito: sin la anotación, TypeScript
55
- * no puede nombrar el tipo de los schemas (que viene del zod anidado del
56
- * plugin) y el build falla con TS2742.
57
- */
58
- export function buildTools(office) {
51
+ export function buildTools(office, hooks = {}) {
59
52
  const officeOf = (ctx) => {
60
53
  // El directorio del contexto tiene prioridad sobre el cwd del plugin:
61
54
  // es el proyecto real en el que se está trabajando.
@@ -87,7 +80,7 @@ export function buildTools(office) {
87
80
  mayTouch: z.array(z.string()).describe("Globs que el agente puede tocar."),
88
81
  forbidden: z.array(z.string()).describe("Globs prohibidos."),
89
82
  })
90
- .optional(),
83
+ .describe("Scope del agente."),
91
84
  acceptance: z
92
85
  .array(z.string())
93
86
  .describe("Criterios verificables. Nada de 'hecho' genérico."),
@@ -101,19 +94,29 @@ export function buildTools(office) {
101
94
  await off.init();
102
95
  const state = await off.loadState(args.objective);
103
96
  const updated = await off.savePlan(state, args.cards);
97
+ // El plan marca el arranque de la corrida: acá se abre el dashboard
98
+ // visual (la URL viaja en la salida para que el modelo la reporte).
99
+ let dashUrl;
100
+ try {
101
+ dashUrl = await hooks.onRunStart?.(updated.runId);
102
+ }
103
+ catch { /* el dashboard es best-effort: no bloquea la corrida */ }
104
+ const lines = [
105
+ `Plan guardado. ${updated.order.length} cards en la corrida.`,
106
+ "",
107
+ ...updated.order.map((id) => {
108
+ const c = updated.cards[id];
109
+ return `- **${id}** ${c.title} [${c.type}] owner=${c.owner ?? "(sin owner)"} reviewer=${c.reviewer ?? "(sin reviewer)"} — gate: ${c.gate}`;
110
+ }),
111
+ "",
112
+ `Siguiente paso: llamá \`oficina_assign\` para tomar la primera card.`,
113
+ ];
114
+ if (dashUrl)
115
+ lines.push("", `Dashboard en vivo: ${dashUrl} (ya se abrió en tu navegador)`);
104
116
  return {
105
117
  title: `Plan guardado: ${updated.order.length} cards`,
106
- output: [
107
- `Plan guardado. ${updated.order.length} cards en la corrida.`,
108
- "",
109
- ...updated.order.map((id) => {
110
- const c = updated.cards[id];
111
- return `- **${id}** ${c.title} [${c.type}] owner=${c.owner ?? "(sin owner)"} reviewer=${c.reviewer ?? "(sin reviewer)"} — gate: ${c.gate}`;
112
- }),
113
- "",
114
- `Siguiente paso: llamá \`oficina_assign\` para tomar la primera card.`,
115
- ].join("\n"),
116
- metadata: { runId: updated.runId, cards: updated.order.length },
118
+ output: lines.join("\n"),
119
+ metadata: { runId: updated.runId, cards: updated.order.length, dashboard: dashUrl },
117
120
  };
118
121
  },
119
122
  }),
@@ -134,7 +137,7 @@ export function buildTools(office) {
134
137
  const lines = [
135
138
  `# OFICINA — ${state.objective}`,
136
139
  "",
137
- `**Estado:** ${state.status} · **iteración:** ${state.iteration} · **presupuesto:** ${state.budget.cardsUsed}/${state.budget.maxCards} cards, ${state.budget.agentCallsUsed}/${state.budget.maxAgentCalls} agentes, ${state.budget.spawnsUsed}/${state.budget.maxSpawnsTotal} spawns`,
140
+ `**Estado:** ${state.status} · **iteración:** ${state.iteration} · **cards:** ${Object.keys(state.cards).length}`,
138
141
  "",
139
142
  "## Cards",
140
143
  "",
@@ -148,11 +151,11 @@ export function buildTools(office) {
148
151
  `**Sin heartbeat:** ${dead.map((a) => `${a.id}(${a.role})`).join(", ") || "—"}`,
149
152
  ];
150
153
  return {
151
- title: `Oficina: ${state.status} · ${state.budget.cardsUsed} cards`,
154
+ title: `Oficina: ${state.status} · ${Object.keys(state.cards).length} cards`,
152
155
  output: lines.join("\n"),
153
156
  metadata: {
154
157
  status: state.status,
155
- cards: state.budget.cardsUsed,
158
+ cards: Object.keys(state.cards).length,
156
159
  idle: idle.length,
157
160
  dead: dead.length,
158
161
  },
@@ -482,10 +485,6 @@ export function buildTools(office) {
482
485
  requested_role: args.requestedRole,
483
486
  capabilities: args.capabilities,
484
487
  reason: args.reason,
485
- budget: {
486
- spawns_used: state.budget.spawnsUsed,
487
- spawns_remaining: state.budget.maxSpawnsTotal - state.budget.spawnsUsed,
488
- },
489
488
  },
490
489
  idempotencyKey: `spawn:${args.requestedRole}:${args.agentId}`,
491
490
  });
@@ -647,9 +646,10 @@ export function buildTools(office) {
647
646
  capabilities: z.array(z.string()).describe("Capabilities necesarias."),
648
647
  scope: z
649
648
  .object({
650
- mayTouch: z.array(z.string()).optional(),
651
- forbidden: z.array(z.string()).optional(),
649
+ mayTouch: z.array(z.string()).describe("Globs que el agente puede tocar."),
650
+ forbidden: z.array(z.string()).describe("Globs prohibidos."),
652
651
  })
652
+ .describe("Scope del agente.")
653
653
  .optional(),
654
654
  canDelegate: z.boolean().default(false),
655
655
  delegateBudget: z.number().int().min(0).max(5).default(0),
@@ -924,58 +924,6 @@ export function buildTools(office) {
924
924
  };
925
925
  },
926
926
  }),
927
- /**
928
- * El costo de la corrida.
929
- */
930
- oficina_cost: tool({
931
- description: "El costo real de la corrida: tokens y USD por card, por agente y por fase de trabajo, " +
932
- "con los presupuestos y cuánto falta para cada límite. También mide trabajo redundante " +
933
- "(releer el mismo contexto, repetir el mismo comando). Usá `estimate` antes de arrancar " +
934
- "una corrida grande.",
935
- args: {
936
- action: z.enum(["report", "estimate", "redundancy"]).default("report"),
937
- cards: z.number().int().min(1).max(100).default(10).describe("Para estimate: cards estimadas."),
938
- agentsPerCard: z.number().int().min(1).max(10).default(2).describe("Para estimate: agentes por card."),
939
- callsPerAgent: z.number().int().min(1).max(100).default(10).describe("Para estimate: llamadas por agente."),
940
- usdPerCall: z.number().min(0).default(0.02).describe("Para estimate: USD por llamada."),
941
- },
942
- async execute(args, ctx) {
943
- const { checkBudget, estimateRun, renderCostReport, DEFAULT_COST_LIMITS } = await import("../core/cost.js");
944
- const state = await officeOf(ctx).loadState();
945
- const ledger = await officeOf(ctx).cost.load(state.runId);
946
- if (args.action === "estimate") {
947
- const est = estimateRun(args.cards, args.agentsPerCard, args.callsPerAgent, args.usdPerCall);
948
- return {
949
- title: `Estimación: ~$${est.usd.toFixed(2)}`,
950
- output: `**Estimación previa**\n\n` +
951
- `- Cards: ${args.cards}\n` +
952
- `- Agentes por card: ${args.agentsPerCard}\n` +
953
- `- Llamadas por agente: ${args.callsPerAgent}\n` +
954
- `- USD por llamada: $${args.usdPerCall}\n\n` +
955
- `**Costo estimado: ~$${est.usd.toFixed(2)}** · ~${est.tokens.toLocaleString("es-AR")} tokens\n\n` +
956
- `_${est.note}_`,
957
- metadata: { usd: est.usd, tokens: est.tokens },
958
- };
959
- }
960
- if (args.action === "redundancy") {
961
- const { detectRedundantWork } = await import("../core/cost.js");
962
- const report = detectRedundantWork([]);
963
- return {
964
- title: "Trabajo redundante",
965
- output: report.summary,
966
- metadata: { wasted: report.wastedFraction },
967
- };
968
- }
969
- const decision = checkBudget(ledger, DEFAULT_COST_LIMITS);
970
- return {
971
- title: `Costo: $${ledger.total.usd.toFixed(4)} · ${ledger.total.calls} llamadas`,
972
- output: renderCostReport(ledger, DEFAULT_COST_LIMITS) +
973
- `\n\n**Veredicto de presupuesto:** ${decision.allowed ? "dentro de los límites" : `EXCEDIDO (${decision.breached})`}\n` +
974
- `${decision.reason}`,
975
- metadata: { usd: ledger.total.usd, allowed: decision.allowed, breached: decision.breached },
976
- };
977
- },
978
- }),
979
927
  /**
980
928
  * El freno de emergencia.
981
929
  */