oficina-opencode 0.0.0-stage → 2.0.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 (117) hide show
  1. package/DESIGN.md +145 -0
  2. package/LICENSE +21 -0
  3. package/README.md +670 -2
  4. package/agents/oficina-architect.md +72 -0
  5. package/agents/oficina-commander.md +108 -0
  6. package/agents/oficina-critico.md +148 -0
  7. package/agents/oficina-director.md +160 -0
  8. package/agents/oficina-guardian.md +128 -0
  9. package/agents/oficina-integrator.md +98 -0
  10. package/agents/oficina-verificador.md +88 -0
  11. package/commands/oficina.md +36 -0
  12. package/dist/cli.d.ts +12 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +394 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/core/briefing.d.ts +115 -0
  17. package/dist/core/briefing.d.ts.map +1 -0
  18. package/dist/core/briefing.js +410 -0
  19. package/dist/core/briefing.js.map +1 -0
  20. package/dist/core/bus.d.ts +132 -0
  21. package/dist/core/bus.d.ts.map +1 -0
  22. package/dist/core/bus.js +250 -0
  23. package/dist/core/bus.js.map +1 -0
  24. package/dist/core/catalog.d.ts +303 -0
  25. package/dist/core/catalog.d.ts.map +1 -0
  26. package/dist/core/catalog.js +816 -0
  27. package/dist/core/catalog.js.map +1 -0
  28. package/dist/core/dispatch.d.ts +110 -0
  29. package/dist/core/dispatch.d.ts.map +1 -0
  30. package/dist/core/dispatch.js +301 -0
  31. package/dist/core/dispatch.js.map +1 -0
  32. package/dist/core/factory.d.ts +74 -0
  33. package/dist/core/factory.d.ts.map +1 -0
  34. package/dist/core/factory.js +243 -0
  35. package/dist/core/factory.js.map +1 -0
  36. package/dist/core/fsx.d.ts +39 -0
  37. package/dist/core/fsx.d.ts.map +1 -0
  38. package/dist/core/fsx.js +113 -0
  39. package/dist/core/fsx.js.map +1 -0
  40. package/dist/core/gates.d.ts +97 -0
  41. package/dist/core/gates.d.ts.map +1 -0
  42. package/dist/core/gates.js +467 -0
  43. package/dist/core/gates.js.map +1 -0
  44. package/dist/core/leases.d.ts +46 -0
  45. package/dist/core/leases.d.ts.map +1 -0
  46. package/dist/core/leases.js +94 -0
  47. package/dist/core/leases.js.map +1 -0
  48. package/dist/core/log.d.ts +30 -0
  49. package/dist/core/log.d.ts.map +1 -0
  50. package/dist/core/log.js +43 -0
  51. package/dist/core/log.js.map +1 -0
  52. package/dist/core/mesa.d.ts +82 -0
  53. package/dist/core/mesa.d.ts.map +1 -0
  54. package/dist/core/mesa.js +178 -0
  55. package/dist/core/mesa.js.map +1 -0
  56. package/dist/core/office.d.ts +208 -0
  57. package/dist/core/office.d.ts.map +1 -0
  58. package/dist/core/office.js +618 -0
  59. package/dist/core/office.js.map +1 -0
  60. package/dist/core/paths.d.ts +67 -0
  61. package/dist/core/paths.d.ts.map +1 -0
  62. package/dist/core/paths.js +136 -0
  63. package/dist/core/paths.js.map +1 -0
  64. package/dist/core/retry.d.ts +41 -0
  65. package/dist/core/retry.d.ts.map +1 -0
  66. package/dist/core/retry.js +86 -0
  67. package/dist/core/retry.js.map +1 -0
  68. package/dist/core/roster.d.ts +47 -0
  69. package/dist/core/roster.d.ts.map +1 -0
  70. package/dist/core/roster.js +146 -0
  71. package/dist/core/roster.js.map +1 -0
  72. package/dist/core/router.d.ts +67 -0
  73. package/dist/core/router.d.ts.map +1 -0
  74. package/dist/core/router.js +186 -0
  75. package/dist/core/router.js.map +1 -0
  76. package/dist/core/state.d.ts +89 -0
  77. package/dist/core/state.d.ts.map +1 -0
  78. package/dist/core/state.js +303 -0
  79. package/dist/core/state.js.map +1 -0
  80. package/dist/core/types.d.ts +333 -0
  81. package/dist/core/types.d.ts.map +1 -0
  82. package/dist/core/types.js +27 -0
  83. package/dist/core/types.js.map +1 -0
  84. package/dist/hooks/compacting.d.ts +18 -0
  85. package/dist/hooks/compacting.d.ts.map +1 -0
  86. package/dist/hooks/compacting.js +72 -0
  87. package/dist/hooks/compacting.js.map +1 -0
  88. package/dist/hooks/scopeGuard.d.ts +39 -0
  89. package/dist/hooks/scopeGuard.d.ts.map +1 -0
  90. package/dist/hooks/scopeGuard.js +114 -0
  91. package/dist/hooks/scopeGuard.js.map +1 -0
  92. package/dist/hooks/sessionIdle.d.ts +35 -0
  93. package/dist/hooks/sessionIdle.d.ts.map +1 -0
  94. package/dist/hooks/sessionIdle.js +110 -0
  95. package/dist/hooks/sessionIdle.js.map +1 -0
  96. package/dist/hooks/systemTransform.d.ts +18 -0
  97. package/dist/hooks/systemTransform.d.ts.map +1 -0
  98. package/dist/hooks/systemTransform.js +63 -0
  99. package/dist/hooks/systemTransform.js.map +1 -0
  100. package/dist/index.d.ts +36 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +103 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/tools/index.d.ts +22 -0
  105. package/dist/tools/index.d.ts.map +1 -0
  106. package/dist/tools/index.js +854 -0
  107. package/dist/tools/index.js.map +1 -0
  108. package/docs/ARCHITECTURE.md +258 -0
  109. package/docs/QUE-ES.md +337 -0
  110. package/examples/opencode.json +7 -0
  111. package/package.json +81 -4
  112. package/skills/oficina/README.md +120 -0
  113. package/skills/oficina/SKILL.md +251 -0
  114. package/skills/oficina/reference/mesh.md +345 -0
  115. package/skills/oficina/reference/protocol.md +342 -0
  116. package/skills/oficina/reference/roles.md +171 -0
  117. package/skills/oficina/reference/templates.md +278 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Hook: auto-reanudación al quedar idle.
3
+ *
4
+ * ESTE es el hook que convierte "la oficina trabaja" en algo real.
5
+ *
6
+ * El síntoma que lo motiva: un modelo rápido dice "listo, terminado" y para.
7
+ * Con un skill, la oficina depende de que el modelo *quiera* seguir. Con este
8
+ * hook, cuando la sesión queda `idle` y queda trabajo, el motor manda un
9
+ * prompt sintético y la corrida sigue. El modelo no puede declarar que
10
+ * terminó: el estado lo dice.
11
+ *
12
+ * ## La mesa entra en el prompt
13
+ *
14
+ * El hook no solo reanuda: también inyecta la **foto de la mesa**. Así el
15
+ * agente que arranca sabe de entrada: quién está trabajando, qué hay libre,
16
+ * qué pedidos de ayuda siguen sin responder y qué preguntas están abiertas.
17
+ *
18
+ * Sin esto, el peer mesh es un bus al que nadie mira.
19
+ */
20
+ import type { Office } from "../core/office.js";
21
+ export interface SessionIdleOptions {
22
+ /** Tope de auto-reanudaciones por sesión. */
23
+ maxAutoResumes?: number;
24
+ /** Cooldown mínimo entre reanudaciones, en ms. */
25
+ cooldownMs?: number;
26
+ /** Cliente del SDK para mandar el prompt sintético. */
27
+ sendPrompt: (sessionID: string, text: string) => Promise<void>;
28
+ }
29
+ export declare function createSessionIdleHook(office: Office, options: SessionIdleOptions): (input: {
30
+ event: {
31
+ type: string;
32
+ properties?: Record<string, unknown>;
33
+ };
34
+ }) => Promise<void>;
35
+ //# sourceMappingURL=sessionIdle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionIdle.d.ts","sourceRoot":"","sources":["../../src/hooks/sessionIdle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,IAK3C,OAAO;IACzC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAC9D,KAAG,OAAO,CAAC,IAAI,CAAC,CA8GlB"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Hook: auto-reanudación al quedar idle.
3
+ *
4
+ * ESTE es el hook que convierte "la oficina trabaja" en algo real.
5
+ *
6
+ * El síntoma que lo motiva: un modelo rápido dice "listo, terminado" y para.
7
+ * Con un skill, la oficina depende de que el modelo *quiera* seguir. Con este
8
+ * hook, cuando la sesión queda `idle` y queda trabajo, el motor manda un
9
+ * prompt sintético y la corrida sigue. El modelo no puede declarar que
10
+ * terminó: el estado lo dice.
11
+ *
12
+ * ## La mesa entra en el prompt
13
+ *
14
+ * El hook no solo reanuda: también inyecta la **foto de la mesa**. Así el
15
+ * agente que arranca sabe de entrada: quién está trabajando, qué hay libre,
16
+ * qué pedidos de ayuda siguen sin responder y qué preguntas están abiertas.
17
+ *
18
+ * Sin esto, el peer mesh es un bus al que nadie mira.
19
+ */
20
+ import { snapshotMesa, renderMesaBrief } from "../core/mesa.js";
21
+ import { logger } from "../core/log.js";
22
+ const log = logger("oficina:session-idle");
23
+ export function createSessionIdleHook(office, options) {
24
+ const maxAutoResumes = options.maxAutoResumes ?? 25;
25
+ const cooldownMs = options.cooldownMs ?? 1_500;
26
+ const lastResume = new Map();
27
+ return async function onSessionIdle(input) {
28
+ const event = input.event;
29
+ if (event.type !== "session.idle")
30
+ return;
31
+ const sessionID = event.properties?.sessionID;
32
+ if (!sessionID)
33
+ return;
34
+ try {
35
+ const state = await office.loadState();
36
+ // La oficina tiene que estar corriendo. Una corrida pausada, bloqueada
37
+ // o entregada no se reanuda: eso es decisión del usuario.
38
+ if (state.status !== "running")
39
+ return;
40
+ const cards = Object.values(state.cards);
41
+ if (cards.length === 0)
42
+ return;
43
+ const pending = cards.filter((c) => c.state !== "done");
44
+ const mesa = await snapshotMesa(office);
45
+ const mesaBrief = renderMesaBrief(mesa);
46
+ // ¿Hay algo que hacer? Trabajo pendiente, ayuda sin responder, preguntas
47
+ // abiertas, o cards sin owner.
48
+ const hayTrabajo = pending.length > 0 ||
49
+ mesa.ayudaAbierta.length > 0 ||
50
+ mesa.preguntasAbiertas.length > 0 ||
51
+ mesa.sinOwner.length > 0;
52
+ if (!hayTrabajo)
53
+ return;
54
+ // Tope de auto-reanudaciones.
55
+ const binding = state.sessions[sessionID];
56
+ const resumes = binding?.autoResumes ?? 0;
57
+ if (resumes >= maxAutoResumes) {
58
+ log.warn("tope de auto-reanudaciones alcanzado", { sessionID, resumes });
59
+ return;
60
+ }
61
+ // Cooldown.
62
+ const last = lastResume.get(sessionID);
63
+ if (last !== undefined && Date.now() - last < cooldownMs)
64
+ return;
65
+ lastResume.set(sessionID, Date.now());
66
+ const next = pending
67
+ .map((c) => ({
68
+ card: c,
69
+ ready: c.dependsOn.every((d) => state.cards[d]?.state === "done"),
70
+ }))
71
+ .filter((c) => c.ready || c.card.state === "in_progress" || c.card.state === "rework");
72
+ const current = next[0]?.card;
73
+ const working = mesa.trabajando;
74
+ const sections = [
75
+ "[OFICINA — auto-continuación]",
76
+ "",
77
+ `La corrida sigue abierta. Quedan ${pending.length} card(s) sin terminar.`,
78
+ ];
79
+ if (current) {
80
+ sections.push("", `**Próxima: ${current.id} — ${current.title}** (${current.state})`, `Owner: ${current.owner ?? "(sin owner)"}`, `Gate: ${current.gate}`, "Criterios de aceptación:", ...current.acceptance.map((a) => `- ${a}`));
81
+ }
82
+ if (working.length > 0) {
83
+ sections.push("", `**Agentes trabajando ahora:** ${working.map((p) => `${p.displayName} → ${p.card ?? "—"}`).join(", ")}`);
84
+ }
85
+ if (mesaBrief) {
86
+ sections.push("", "---", "", "**La mesa:**", "", mesaBrief);
87
+ }
88
+ sections.push("", "Usá `oficina_board` para el panorama, `oficina_assign` para tomar trabajo, `oficina_bus` (action=read) para leer el bus,", "y `oficina_mesa` (action=view) para ver la mesa.", "", "No declares la corrida terminada mientras queden cards sin DONE. Si estás trabado, pedí ayuda por el bus o escalá.");
89
+ state.sessions[sessionID] = {
90
+ agentId: binding?.agentId ?? "primary",
91
+ cardId: binding?.cardId ?? null,
92
+ updatedAt: new Date().toISOString(),
93
+ autoResumes: resumes + 1,
94
+ };
95
+ await office.saveState(state);
96
+ log.info("auto-reanudando sesión", {
97
+ sessionID,
98
+ pending: pending.length,
99
+ helpOpen: mesa.ayudaAbierta.length,
100
+ resumes: resumes + 1,
101
+ });
102
+ await options.sendPrompt(sessionID, sections.join("\n"));
103
+ }
104
+ catch (err) {
105
+ // Un fallo en el hook no debe tumbar la sesión. Se loguea y se sigue.
106
+ log.error("fallo en el hook de auto-continuación", { sessionID, error: String(err) });
107
+ }
108
+ };
109
+ }
110
+ //# sourceMappingURL=sessionIdle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionIdle.js","sourceRoot":"","sources":["../../src/hooks/sessionIdle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Hook: inyección del estado de la oficina en el prompt del sistema.
3
+ *
4
+ * El agente no debería necesitar preguntar "cómo va la oficina". El estado
5
+ * viaja con cada llamada: qué cards hay, cuál es la siguiente, qué está
6
+ * bloqueado, qué dice el ledger de contexto.
7
+ *
8
+ * Sin esto, el modelo pierde la noción de "ya hice esto" y repite trabajo —
9
+ * exactamente el síntoma que la oficina existe para eliminar.
10
+ */
11
+ import type { Office } from "../core/office.js";
12
+ export declare function createSystemTransformHook(office: Office): (_input: {
13
+ sessionID?: string;
14
+ model: unknown;
15
+ }, output: {
16
+ system: string[];
17
+ }) => Promise<void>;
18
+ //# sourceMappingURL=systemTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemTransform.d.ts","sourceRoot":"","sources":["../../src/hooks/systemTransform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,IAEpD,QAAQ;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAC9C,QAAQ;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,KAC3B,OAAO,CAAC,IAAI,CAAC,CA0DjB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Hook: inyección del estado de la oficina en el prompt del sistema.
3
+ *
4
+ * El agente no debería necesitar preguntar "cómo va la oficina". El estado
5
+ * viaja con cada llamada: qué cards hay, cuál es la siguiente, qué está
6
+ * bloqueado, qué dice el ledger de contexto.
7
+ *
8
+ * Sin esto, el modelo pierde la noción de "ya hice esto" y repite trabajo —
9
+ * exactamente el síntoma que la oficina existe para eliminar.
10
+ */
11
+ import { logger } from "../core/log.js";
12
+ const log = logger("oficina:system");
13
+ export function createSystemTransformHook(office) {
14
+ return async function onSystemTransform(_input, output) {
15
+ try {
16
+ const state = await office.loadState();
17
+ if (!state.objective)
18
+ return;
19
+ const cards = Object.values(state.cards);
20
+ if (cards.length === 0)
21
+ return;
22
+ const roster = await office.loadRoster(state.runId);
23
+ const idle = Object.values(roster.agents).filter((a) => a.state === "idle_available");
24
+ const working = Object.values(roster.agents).filter((a) => a.state === "working");
25
+ const lines = [
26
+ "",
27
+ "## 🏢 OFICINA — estado de la corrida",
28
+ "",
29
+ `**Objetivo:** ${state.objective}`,
30
+ `**Estado:** ${state.status} · iteración ${state.iteration} · presupuesto ${state.budget.cardsUsed}/${state.budget.maxCards} cards, ${state.budget.agentCallsUsed}/${state.budget.maxAgentCalls} agentes`,
31
+ "",
32
+ "### Cards",
33
+ "",
34
+ ...cards.map((c) => `- **${c.id}** [${c.state}] ${c.title} · owner=${c.owner ?? "—"} reviewer=${c.reviewer ?? "—"} · gate: ${c.gate}`),
35
+ "",
36
+ `**Trabajando:** ${working.map((a) => `${a.id}(${a.role})`).join(", ") || "—"}`,
37
+ `**Libres:** ${idle.map((a) => `${a.id}(${a.role})`).join(", ") || "—"}`,
38
+ ];
39
+ if (state.context.decisions.length > 0) {
40
+ lines.push("", "### Decisiones ya tomadas (no las repitas)", "");
41
+ lines.push(...state.context.decisions.map((d) => `- ${d}`));
42
+ }
43
+ if (state.context.constraints.length > 0) {
44
+ lines.push("", "### Constraints descubiertos", "");
45
+ lines.push(...state.context.constraints.map((c) => `- ${c}`));
46
+ }
47
+ if (state.context.traps.length > 0) {
48
+ lines.push("", "### Trampas (no toques esto)", "");
49
+ lines.push(...state.context.traps.map((t) => `- ${t}`));
50
+ }
51
+ if (state.context.open.length > 0) {
52
+ lines.push("", "### Temas abiertos", "");
53
+ lines.push(...state.context.open.map((t) => `- ${t}`));
54
+ }
55
+ lines.push("", "Usá `oficina_board` para el panorama, `oficina_assign` para tomar trabajo, `oficina_bus` para el bus.", "");
56
+ output.system.push(lines.join("\n"));
57
+ }
58
+ catch (err) {
59
+ log.error("fallo inyectando el estado en el system prompt", { error: String(err) });
60
+ }
61
+ };
62
+ }
63
+ //# sourceMappingURL=systemTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemTransform.js","sourceRoot":"","sources":["../../src/hooks/systemTransform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * OFICINA — entry point del plugin para OpenCode.
3
+ *
4
+ * Qué registra:
5
+ * - **Tools** (`oficina_*`): la superficie de trabajo.
6
+ * - **Hook `event` → session.idle**: auto-reanudación. La oficina sigue
7
+ * trabajando cuando el modelo para. Esto es lo que hace que "trabajen
8
+ * incansablemente" sea una propiedad del sistema y no un pedido.
9
+ * - **Hook `tool.execute.before`**: guard de scope. "No toques fuera de tu
10
+ * scope" pasa de ser una instrucción a ser una restricción.
11
+ * - **Hook `experimental.chat.system.transform`**: el estado de la oficina
12
+ * viaja con cada llamada. El agente no repregunta lo que ya sabe.
13
+ * - **Hook `experimental.session.compacting`**: el estado sobrevive a la
14
+ * compactación.
15
+ *
16
+ * Lo que NO hace: decidir el plan, escribir código ni emitir el veredicto de
17
+ * review. Eso sigue siendo del modelo. El código pone los límites; el modelo
18
+ * hace el trabajo.
19
+ */
20
+ import type { Plugin } from "@opencode-ai/plugin";
21
+ export interface OficinaOptions {
22
+ /** Directorio del proyecto. Si se omite, se usa el del host. */
23
+ directory?: string;
24
+ /** Raíz del repo agency-agents para el catálogo de roles. */
25
+ agencyRoot?: string;
26
+ /** Tope de auto-reanudaciones por sesión. */
27
+ maxAutoResumes?: number;
28
+ /** Si es false, el guard de scope avisa pero no bloquea. */
29
+ enforceScope?: boolean;
30
+ }
31
+ export declare const OficinaPlugin: Plugin;
32
+ export default OficinaPlugin;
33
+ export { Office } from "./core/office.js";
34
+ export { Bus } from "./core/bus.js";
35
+ export * from "./core/types.js";
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAW9D,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,MAmF3B,CAAA;AAED,eAAe,aAAa,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACnC,cAAc,iBAAiB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * OFICINA — entry point del plugin para OpenCode.
3
+ *
4
+ * Qué registra:
5
+ * - **Tools** (`oficina_*`): la superficie de trabajo.
6
+ * - **Hook `event` → session.idle**: auto-reanudación. La oficina sigue
7
+ * trabajando cuando el modelo para. Esto es lo que hace que "trabajen
8
+ * incansablemente" sea una propiedad del sistema y no un pedido.
9
+ * - **Hook `tool.execute.before`**: guard de scope. "No toques fuera de tu
10
+ * scope" pasa de ser una instrucción a ser una restricción.
11
+ * - **Hook `experimental.chat.system.transform`**: el estado de la oficina
12
+ * viaja con cada llamada. El agente no repregunta lo que ya sabe.
13
+ * - **Hook `experimental.session.compacting`**: el estado sobrevive a la
14
+ * compactación.
15
+ *
16
+ * Lo que NO hace: decidir el plan, escribir código ni emitir el veredicto de
17
+ * review. Eso sigue siendo del modelo. El código pone los límites; el modelo
18
+ * hace el trabajo.
19
+ */
20
+ import { Office } from "./core/office.js";
21
+ import { buildTools } from "./tools/index.js";
22
+ import { createSessionIdleHook } from "./hooks/sessionIdle.js";
23
+ import { createScopeGuardHook } from "./hooks/scopeGuard.js";
24
+ import { createSystemTransformHook } from "./hooks/systemTransform.js";
25
+ import { createCompactingHook } from "./hooks/compacting.js";
26
+ import { logger } from "./core/log.js";
27
+ const log = logger("oficina");
28
+ export const OficinaPlugin = async (input, options) => {
29
+ const directory = options?.directory ?? input.directory ?? input.worktree;
30
+ const office = new Office({
31
+ cwd: directory,
32
+ agencyRoot: options?.agencyRoot,
33
+ // El cliente del SDK permite arrancar subagentes de verdad.
34
+ client: input.client
35
+ ? {
36
+ session: {
37
+ prompt: (args) => input.client.session.prompt(args),
38
+ },
39
+ }
40
+ : undefined,
41
+ });
42
+ await office.init();
43
+ // Conecta el log del plugin al log estructurado del host, si hay cliente.
44
+ if (input.client?.app?.log) {
45
+ const { configureLogging } = await import("./core/log.js");
46
+ configureLogging({
47
+ sink: (entry) => {
48
+ void input.client.app.log({
49
+ body: {
50
+ service: `oficina/${entry.service}`,
51
+ level: entry.level,
52
+ message: entry.message,
53
+ extra: entry.extra ?? {},
54
+ },
55
+ });
56
+ },
57
+ });
58
+ }
59
+ const tools = buildTools(office);
60
+ const onSessionIdle = createSessionIdleHook(office, {
61
+ maxAutoResumes: options?.maxAutoResumes ?? 25,
62
+ sendPrompt: async (sessionID, text) => {
63
+ await input.client.session.promptAsync({
64
+ path: { id: sessionID },
65
+ body: { parts: [{ type: "text", text }] },
66
+ });
67
+ },
68
+ });
69
+ const onScopeGuard = createScopeGuardHook(office, { enforce: options?.enforceScope ?? true });
70
+ const onSystemTransform = createSystemTransformHook(office);
71
+ const onCompacting = createCompactingHook(office);
72
+ log.info("plugin inicializado", {
73
+ directory,
74
+ officeDir: office.paths.officeDir,
75
+ projectRoot: office.paths.projectRoot,
76
+ });
77
+ return {
78
+ tool: tools,
79
+ event: async ({ event }) => {
80
+ if (event.type === "session.idle") {
81
+ await onSessionIdle({ event });
82
+ }
83
+ },
84
+ "tool.execute.before": async (hookInput, hookOutput) => {
85
+ await onScopeGuard({
86
+ tool: hookInput.tool,
87
+ sessionID: hookInput.sessionID,
88
+ callID: hookInput.callID,
89
+ }, hookOutput);
90
+ },
91
+ "experimental.chat.system.transform": async (hookInput, hookOutput) => {
92
+ await onSystemTransform(hookInput, hookOutput);
93
+ },
94
+ "experimental.session.compacting": async (hookInput, hookOutput) => {
95
+ await onCompacting(hookInput, hookOutput);
96
+ },
97
+ };
98
+ };
99
+ export default OficinaPlugin;
100
+ export { Office } from "./core/office.js";
101
+ export { Bus } from "./core/bus.js";
102
+ export * from "./core/types.js";
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Tools de la OFICINA.
3
+ *
4
+ * La superficie que ve el modelo. Diez tools, no treinta: cada tool que se
5
+ * suma es ruido en el contexto de todos los agentes.
6
+ *
7
+ * Lo que el modelo decide: el plan, el contenido, los veredictos, el triage.
8
+ * Lo que el código decide: los gates, los invariantes, el routing, los
9
+ * contadores, los leases. Esa división es la que hace que el sistema sea
10
+ * determinista donde tiene que serlo y creativo donde tiene que serlo.
11
+ */
12
+ import { type ToolDefinition } from "@opencode-ai/plugin";
13
+ import { Office } from "../core/office.js";
14
+ /**
15
+ * Construye el set de tools dado una instancia de Office.
16
+ *
17
+ * El tipo de retorno es explícito a propósito: sin la anotación, TypeScript
18
+ * no puede nombrar el tipo de los schemas (que viene del zod anidado del
19
+ * plugin) y el build falla con TS2742.
20
+ */
21
+ export declare function buildTools(office: Office): Record<string, ToolDefinition>;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAG/D,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAA;AA2BvD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA+3BzE"}