oficina-opencode 2.1.0 → 3.0.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.
- package/README.md +46 -10
- package/commands/oficina.md +22 -9
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/docsync.d.ts.map +1 -1
- package/dist/core/docsync.js +13 -3
- package/dist/core/docsync.js.map +1 -1
- package/dist/core/systemPrompt.d.ts +23 -0
- package/dist/core/systemPrompt.d.ts.map +1 -0
- package/dist/core/systemPrompt.js +62 -0
- package/dist/core/systemPrompt.js.map +1 -0
- package/dist/hooks/systemTransform.d.ts +5 -1
- package/dist/hooks/systemTransform.d.ts.map +1 -1
- package/dist/hooks/systemTransform.js +9 -40
- package/dist/hooks/systemTransform.js.map +1 -1
- package/dist/pluginEntry.d.ts +33 -0
- package/dist/pluginEntry.d.ts.map +1 -0
- package/dist/pluginEntry.js +106 -0
- package/dist/pluginEntry.js.map +1 -0
- package/dist/tools/index.d.ts +43 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/v1.d.ts +46 -0
- package/dist/v1.d.ts.map +1 -0
- package/dist/v1.js +305 -0
- package/dist/v1.js.map +1 -0
- package/dist/v2.d.ts +45 -0
- package/dist/v2.d.ts.map +1 -0
- package/dist/v2.js +419 -0
- package/dist/v2.js.map +1 -0
- package/docs/COMPATIBILITY.md +83 -42
- package/docs/QUE-ES.md +2 -2
- package/package.json +22 -8
- package/skills/oficina/SKILL.md +191 -69
- package/skills/oficina/reference/mesh.md +11 -2
package/dist/v1.js
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
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 `tool.execute.after`**: tripwire. Detecta lo que el guard no
|
|
12
|
+
* pudo ver: escrituras que se colaron por un comando de shell.
|
|
13
|
+
* - **Hook `permission.ask`**: segunda capa de enforcement, a nivel del
|
|
14
|
+
* framework. Cuando OpenCode pide permiso para una escritura, la oficina
|
|
15
|
+
* lo deniega si está fuera del scope.
|
|
16
|
+
* - **Hook `event` → message.updated**: contabilidad de costo. El motor ya
|
|
17
|
+
* sabe cuánto costó cada llamada; la oficina lo anota y lo presupuesta.
|
|
18
|
+
* - **Hook `experimental.chat.system.transform`**: el estado de la oficina
|
|
19
|
+
* viaja con cada llamada. El agente no repregunta lo que ya sabe.
|
|
20
|
+
* - **Hook `experimental.session.compacting`**: el estado sobrevive a la
|
|
21
|
+
* compactación.
|
|
22
|
+
* - **Hook `experimental.compaction.autocontinue`**: el freno de emergencia.
|
|
23
|
+
*
|
|
24
|
+
* Lo que NO hace: decidir el plan, escribir código ni emitir el veredicto de
|
|
25
|
+
* review. Eso sigue siendo del modelo. El código pone los límites; el modelo
|
|
26
|
+
* hace el trabajo.
|
|
27
|
+
*/
|
|
28
|
+
import { tool as v1Tool } from "@opencode-ai/plugin";
|
|
29
|
+
import { Office } from "./core/office.js";
|
|
30
|
+
import { buildTools } from "./tools/index.js";
|
|
31
|
+
import { createSessionIdleHook } from "./hooks/sessionIdle.js";
|
|
32
|
+
import { createScopeGuardHook, resolveScopeCard } from "./hooks/scopeGuard.js";
|
|
33
|
+
import { createSystemTransformHook } from "./hooks/systemTransform.js";
|
|
34
|
+
import { createCompactingHook } from "./hooks/compacting.js";
|
|
35
|
+
import { Tripwire } from "./core/tripwire.js";
|
|
36
|
+
import { checkScope } from "./core/sandbox.js";
|
|
37
|
+
import { logger } from "./core/log.js";
|
|
38
|
+
const log = logger("oficina");
|
|
39
|
+
/**
|
|
40
|
+
* Traduce las tools del motor (forma neutra) a la forma de OpenCode v1.
|
|
41
|
+
*
|
|
42
|
+
* El motor no conoce la API de ningun host: define `{ description, args,
|
|
43
|
+
* execute }` y cada entry la traduce. Acá va la traduccion a v1, que usa el
|
|
44
|
+
* helper `tool()` del plugin.
|
|
45
|
+
*/
|
|
46
|
+
function toV1Tools(defs) {
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const [name, def] of Object.entries(defs)) {
|
|
49
|
+
out[name] = v1Tool({
|
|
50
|
+
description: def.description,
|
|
51
|
+
args: def.args,
|
|
52
|
+
execute: def.execute,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
export const OficinaPlugin = async (input, options) => {
|
|
58
|
+
const directory = options?.directory ?? input.directory ?? input.worktree;
|
|
59
|
+
const office = new Office({
|
|
60
|
+
cwd: directory,
|
|
61
|
+
agencyRoot: options?.agencyRoot,
|
|
62
|
+
// El cliente del SDK permite arrancar subagentes de verdad.
|
|
63
|
+
client: input.client
|
|
64
|
+
? {
|
|
65
|
+
session: {
|
|
66
|
+
prompt: (args) => input.client.session.prompt(args),
|
|
67
|
+
},
|
|
68
|
+
}
|
|
69
|
+
: undefined,
|
|
70
|
+
});
|
|
71
|
+
await office.init();
|
|
72
|
+
// Conecta el log del plugin al log estructurado del host, si hay cliente.
|
|
73
|
+
if (input.client?.app?.log) {
|
|
74
|
+
const { configureLogging } = await import("./core/log.js");
|
|
75
|
+
configureLogging({
|
|
76
|
+
sink: (entry) => {
|
|
77
|
+
void input.client.app.log({
|
|
78
|
+
body: {
|
|
79
|
+
service: `oficina/${entry.service}`,
|
|
80
|
+
level: entry.level,
|
|
81
|
+
message: entry.message,
|
|
82
|
+
extra: entry.extra ?? {},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const tools = toV1Tools(buildTools(office));
|
|
89
|
+
/* ──────────────────────────────────────────────────────────────────────────
|
|
90
|
+
* Resolucion del padre de una sesion
|
|
91
|
+
*
|
|
92
|
+
* Es lo que hace que los subagentes hereden el scope: el hijo sube por
|
|
93
|
+
* la cadena de sesiones hasta encontrar la que tiene la card.
|
|
94
|
+
* ────────────────────────────────────────────────────────────────────────── */
|
|
95
|
+
const sessionParents = new Map();
|
|
96
|
+
const resolveParentSession = async (sessionID) => {
|
|
97
|
+
if (!input.client?.session?.get)
|
|
98
|
+
return undefined;
|
|
99
|
+
if (sessionParents.has(sessionID))
|
|
100
|
+
return sessionParents.get(sessionID);
|
|
101
|
+
try {
|
|
102
|
+
const session = await input.client.session.get({ path: { id: sessionID } });
|
|
103
|
+
const parent = session?.parentID;
|
|
104
|
+
sessionParents.set(sessionID, parent);
|
|
105
|
+
return parent;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
sessionParents.set(sessionID, undefined);
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const onSessionIdle = createSessionIdleHook(office, {
|
|
113
|
+
maxAutoResumes: options?.maxAutoResumes ?? 25,
|
|
114
|
+
sendPrompt: async (sessionID, text) => {
|
|
115
|
+
await input.client.session.promptAsync({
|
|
116
|
+
path: { id: sessionID },
|
|
117
|
+
body: { parts: [{ type: "text", text }] },
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const guardOptions = {
|
|
122
|
+
enforce: options?.enforceScope ?? true,
|
|
123
|
+
resolveParentSession,
|
|
124
|
+
};
|
|
125
|
+
const onScopeGuard = createScopeGuardHook(office, guardOptions);
|
|
126
|
+
const onSystemTransform = createSystemTransformHook(office);
|
|
127
|
+
const onCompacting = createCompactingHook(office);
|
|
128
|
+
const tripwire = new Tripwire(office.paths.projectRoot, {
|
|
129
|
+
maxFiles: options?.tripwireMaxFiles ?? 4000,
|
|
130
|
+
});
|
|
131
|
+
/** El scope que aplica a una sesión, si tiene. */
|
|
132
|
+
const scopeOf = async (sessionID) => {
|
|
133
|
+
const state = await office.loadState();
|
|
134
|
+
const card = await resolveScopeCard(state, sessionID, guardOptions);
|
|
135
|
+
if (!card)
|
|
136
|
+
return undefined;
|
|
137
|
+
return { card, policy: { mayTouch: card.scope.mayTouch, forbidden: card.scope.forbidden } };
|
|
138
|
+
};
|
|
139
|
+
log.info("plugin inicializado", {
|
|
140
|
+
directory,
|
|
141
|
+
officeDir: office.paths.officeDir,
|
|
142
|
+
projectRoot: office.paths.projectRoot,
|
|
143
|
+
});
|
|
144
|
+
return {
|
|
145
|
+
tool: tools,
|
|
146
|
+
event: async ({ event }) => {
|
|
147
|
+
if (event.type === "session.idle") {
|
|
148
|
+
await onSessionIdle({ event });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// ── Contabilidad de costo ──
|
|
152
|
+
//
|
|
153
|
+
// El motor ya sabe cuanto costo cada llamada (`AssistantMessage.cost`)
|
|
154
|
+
// y cuantos tokens consumio. La oficina lo anota, lo desglosa por
|
|
155
|
+
// card, agente y fase, y lo presupuesta. No estimamos nada: el
|
|
156
|
+
// numero real es el que llega.
|
|
157
|
+
if (event.type === "message.updated") {
|
|
158
|
+
const info = event.properties?.info;
|
|
159
|
+
if (info?.role === "assistant" && info.cost !== undefined) {
|
|
160
|
+
try {
|
|
161
|
+
const state = await office.loadState();
|
|
162
|
+
const binding = info.sessionID ? state.sessions[info.sessionID] : undefined;
|
|
163
|
+
const cardId = binding?.cardId ?? null;
|
|
164
|
+
await office.recordUsage({
|
|
165
|
+
agentId: binding?.agentId ?? info.sessionID ?? "desconocido",
|
|
166
|
+
role: binding?.agentId ?? "agente",
|
|
167
|
+
cardId,
|
|
168
|
+
phase: cardId ? "implementation" : "exploration",
|
|
169
|
+
model: info.modelID ?? "desconocido",
|
|
170
|
+
provider: info.providerID ?? "desconocido",
|
|
171
|
+
cost: info.cost,
|
|
172
|
+
tokens: info.tokens ?? { input: 0, output: 0, reasoning: 0 },
|
|
173
|
+
latencyMs: (info.time?.completed ?? 0) - (info.time?.created ?? 0),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
log.debug("no se pudo registrar el uso", { error: String(err) });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"tool.execute.before": async (hookInput, hookOutput) => {
|
|
183
|
+
await onScopeGuard({
|
|
184
|
+
tool: hookInput.tool,
|
|
185
|
+
sessionID: hookInput.sessionID,
|
|
186
|
+
callID: hookInput.callID,
|
|
187
|
+
}, hookOutput);
|
|
188
|
+
// El tripwire se arma antes de cualquier comando: una foto del arbol.
|
|
189
|
+
// Despues se compara, y lo que cambio fuera del scope se reporta.
|
|
190
|
+
const scope = await scopeOf(hookInput.sessionID);
|
|
191
|
+
if (scope) {
|
|
192
|
+
await tripwire.arm(hookInput.callID, scope.policy.mayTouch);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"tool.execute.after": async (hookInput) => {
|
|
196
|
+
const scope = await scopeOf(hookInput.sessionID);
|
|
197
|
+
if (!scope)
|
|
198
|
+
return;
|
|
199
|
+
const cambios = await tripwire.check(hookInput.callID, scope.policy.mayTouch);
|
|
200
|
+
if (cambios.length === 0)
|
|
201
|
+
return;
|
|
202
|
+
const detalle = cambios.map((c) => ` - ${c.kind}: ${c.path}`).join("\n");
|
|
203
|
+
log.warn("escrituras fuera del scope detectadas", {
|
|
204
|
+
card: scope.card.id,
|
|
205
|
+
tool: hookInput.tool,
|
|
206
|
+
cambios: cambios.length,
|
|
207
|
+
});
|
|
208
|
+
log.warn(`\n${detalle}`);
|
|
209
|
+
// Se le avisa al agente por el bus: puede que no haya sido
|
|
210
|
+
// deliberado, y el tripwire no revierte.
|
|
211
|
+
await office.bus
|
|
212
|
+
.send("peer", {
|
|
213
|
+
from: "oficina",
|
|
214
|
+
to: ["*"],
|
|
215
|
+
kind: "NOTICE",
|
|
216
|
+
subject: scope.card.id,
|
|
217
|
+
body: {
|
|
218
|
+
notice: "scope",
|
|
219
|
+
message: `Se detectaron ${cambios.length} cambio(s) fuera del scope de la card ${scope.card.id} ` +
|
|
220
|
+
`durante \`${hookInput.tool}\`:\n${detalle}\n\n` +
|
|
221
|
+
`Si fue deliberado, avisalo por el bus. Si no, revisé lo que tocaste.`,
|
|
222
|
+
},
|
|
223
|
+
})
|
|
224
|
+
.catch(() => { });
|
|
225
|
+
},
|
|
226
|
+
/**
|
|
227
|
+
* Segunda capa de enforcement, a nivel del framework.
|
|
228
|
+
*
|
|
229
|
+
* Cuando OpenCode pide permiso para algo, la oficina decide. Si la
|
|
230
|
+
* sesion tiene una card con scope, y lo que se pide escribir esta fuera
|
|
231
|
+
* de el, se deniega.
|
|
232
|
+
*
|
|
233
|
+
* Esto cubre el caso que el guard propio no cubre: tools de providers
|
|
234
|
+
* que el motor decideroxitos o con permisos declarados en el agente.
|
|
235
|
+
*/
|
|
236
|
+
"permission.ask": async (permission, output) => {
|
|
237
|
+
try {
|
|
238
|
+
const type = String(permission.type ?? "");
|
|
239
|
+
if (!["edit", "write", "patch", "multiedit"].includes(type)) {
|
|
240
|
+
output.status = "allow";
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const patterns = permission.pattern;
|
|
244
|
+
const lista = Array.isArray(patterns) ? patterns : patterns ? [patterns] : [];
|
|
245
|
+
if (lista.length === 0) {
|
|
246
|
+
output.status = "allow";
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const scope = await scopeOf(permission.sessionID);
|
|
250
|
+
if (!scope) {
|
|
251
|
+
output.status = "allow";
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
for (const patron of lista) {
|
|
255
|
+
const veredicto = await checkScope(office.paths.projectRoot, patron, scope.policy);
|
|
256
|
+
if (!veredicto.allowed) {
|
|
257
|
+
log.warn("permiso denegado por scope", { card: scope.card.id, patron, kind: veredicto.kind });
|
|
258
|
+
output.status = "deny";
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
output.status = "allow";
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
// Ante la duda, se permite: este hook es una capa extra, no la
|
|
266
|
+
// unica. Si el guard propio falla, es un bug de la oficina, no una
|
|
267
|
+
// violacion del usuario.
|
|
268
|
+
log.debug("fallo en permission.ask", { error: String(err) });
|
|
269
|
+
output.status = "allow";
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"experimental.chat.system.transform": async (hookInput, hookOutput) => {
|
|
273
|
+
await onSystemTransform(hookInput, hookOutput);
|
|
274
|
+
},
|
|
275
|
+
"experimental.session.compacting": async (hookInput, hookOutput) => {
|
|
276
|
+
await onCompacting(hookInput, hookOutput);
|
|
277
|
+
},
|
|
278
|
+
/**
|
|
279
|
+
* Freno de emergencia.
|
|
280
|
+
*
|
|
281
|
+
* La auto-continuacion post-compactacion es la via por la que una
|
|
282
|
+
* corrida puede seguir gastando sola. Con el freno puesto, se
|
|
283
|
+
* desactiva.
|
|
284
|
+
*/
|
|
285
|
+
"experimental.compaction.autocontinue": async (_hookInput, output) => {
|
|
286
|
+
try {
|
|
287
|
+
const state = await office.loadState();
|
|
288
|
+
if (state.halt) {
|
|
289
|
+
output.enabled = false;
|
|
290
|
+
log.info("auto-continuacion desactivada: la corrida esta detenida", {
|
|
291
|
+
reason: state.halt.reason,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Sin estado no se puede saber: se deja como estaba.
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
export default OficinaPlugin;
|
|
302
|
+
export { Office } from "./core/office.js";
|
|
303
|
+
export { Bus } from "./core/bus.js";
|
|
304
|
+
export * from "./core/types.js";
|
|
305
|
+
//# sourceMappingURL=v1.js.map
|
package/dist/v1.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v1.js","sourceRoot":"","sources":["../src/v1.ts"],"names":[],"mappings":"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"}
|
package/dist/v2.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OFICINA — entry point del plugin para **OpenCode v2**.
|
|
3
|
+
*
|
|
4
|
+
* ## Por qué existe este archivo
|
|
5
|
+
*
|
|
6
|
+
* OpenCode v1 y v2 tienen APIs de plugins **incomunes**: no es que
|
|
7
|
+
* cambiara una firma, es que cambió la forma. v1 exportaba una funcion que
|
|
8
|
+
* devuelve hooks; v2 exige `export default { id, setup(ctx) }`. Un plugin
|
|
9
|
+
* v1 bajo v2 falla con:
|
|
10
|
+
*
|
|
11
|
+
* PluginModule.LoadError: Plugin must export a default definition with
|
|
12
|
+
* an id and an effect or setup function.
|
|
13
|
+
*
|
|
14
|
+
* Y al reves: un plugin v2 bajo v1 no carga.
|
|
15
|
+
*
|
|
16
|
+
* Este archivo es la implementacion **v2**. La de v1 vive en `v1.ts` y el
|
|
17
|
+
* motor (`core/`, `tools/`) no depende de ninguna de las dos APIs: define
|
|
18
|
+
* las tools en una forma neutra y cada entry la traduce.
|
|
19
|
+
*
|
|
20
|
+
* ## Que registra
|
|
21
|
+
*
|
|
22
|
+
* - **Tools** (`oficina_*`): la superficie de trabajo, via `ctx.tool.transform`.
|
|
23
|
+
* - **Guard de scope** (`ctx.tool.hook` + `ctx.permission.hook`): dos capas.
|
|
24
|
+
* La primera intercepta la tool; la segunda es el punto de enforcement del
|
|
25
|
+
* framework y puede `deny` de verdad.
|
|
26
|
+
* - **Tripwire** (`ctx.tool.hook("execute.after")`): detecta escrituras que se
|
|
27
|
+
* colaron por un comando de shell.
|
|
28
|
+
* - **Estado de la oficina** (`ctx.session.hook("context")`): el agente no
|
|
29
|
+
* repregunta lo que ya sabe.
|
|
30
|
+
* - **Auto-continuacion** (`session.idle`): la corrida sigue sola cuando el
|
|
31
|
+
* modelo para.
|
|
32
|
+
* - **Costo** (`session.usage.recorded`): el numero real que reporta el motor.
|
|
33
|
+
*/
|
|
34
|
+
import { Plugin } from "@opencode/plugin";
|
|
35
|
+
export interface V2Options {
|
|
36
|
+
/** Si es false, el guard de scope avisa pero no bloquea. */
|
|
37
|
+
enforceScope?: boolean;
|
|
38
|
+
/** Tope de auto-reanudaciones por sesión. */
|
|
39
|
+
maxAutoResumes?: number;
|
|
40
|
+
/** Tope de archivos que mira el tripwire por comando. */
|
|
41
|
+
tripwireMaxFiles?: number;
|
|
42
|
+
}
|
|
43
|
+
declare const _default: Plugin.Plugin;
|
|
44
|
+
export default _default;
|
|
45
|
+
//# sourceMappingURL=v2.d.ts.map
|
package/dist/v2.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2.d.ts","sourceRoot":"","sources":["../src/v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AA2CzC,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;;AAwBD,wBA0VE"}
|