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.
- package/DESIGN.md +145 -0
- package/LICENSE +21 -0
- package/README.md +670 -2
- package/agents/oficina-architect.md +72 -0
- package/agents/oficina-commander.md +108 -0
- package/agents/oficina-critico.md +148 -0
- package/agents/oficina-director.md +160 -0
- package/agents/oficina-guardian.md +128 -0
- package/agents/oficina-integrator.md +98 -0
- package/agents/oficina-verificador.md +88 -0
- package/commands/oficina.md +36 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +394 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/briefing.d.ts +115 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +410 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/bus.d.ts +132 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +250 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/catalog.d.ts +303 -0
- package/dist/core/catalog.d.ts.map +1 -0
- package/dist/core/catalog.js +816 -0
- package/dist/core/catalog.js.map +1 -0
- package/dist/core/dispatch.d.ts +110 -0
- package/dist/core/dispatch.d.ts.map +1 -0
- package/dist/core/dispatch.js +301 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/factory.d.ts +74 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +243 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/fsx.d.ts +39 -0
- package/dist/core/fsx.d.ts.map +1 -0
- package/dist/core/fsx.js +113 -0
- package/dist/core/fsx.js.map +1 -0
- package/dist/core/gates.d.ts +97 -0
- package/dist/core/gates.d.ts.map +1 -0
- package/dist/core/gates.js +467 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/leases.d.ts +46 -0
- package/dist/core/leases.d.ts.map +1 -0
- package/dist/core/leases.js +94 -0
- package/dist/core/leases.js.map +1 -0
- package/dist/core/log.d.ts +30 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +43 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/mesa.d.ts +82 -0
- package/dist/core/mesa.d.ts.map +1 -0
- package/dist/core/mesa.js +178 -0
- package/dist/core/mesa.js.map +1 -0
- package/dist/core/office.d.ts +208 -0
- package/dist/core/office.d.ts.map +1 -0
- package/dist/core/office.js +618 -0
- package/dist/core/office.js.map +1 -0
- package/dist/core/paths.d.ts +67 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +136 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/retry.d.ts +41 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +86 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/roster.d.ts +47 -0
- package/dist/core/roster.d.ts.map +1 -0
- package/dist/core/roster.js +146 -0
- package/dist/core/roster.js.map +1 -0
- package/dist/core/router.d.ts +67 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +186 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/state.d.ts +89 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +303 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/types.d.ts +333 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +27 -0
- package/dist/core/types.js.map +1 -0
- package/dist/hooks/compacting.d.ts +18 -0
- package/dist/hooks/compacting.d.ts.map +1 -0
- package/dist/hooks/compacting.js +72 -0
- package/dist/hooks/compacting.js.map +1 -0
- package/dist/hooks/scopeGuard.d.ts +39 -0
- package/dist/hooks/scopeGuard.d.ts.map +1 -0
- package/dist/hooks/scopeGuard.js +114 -0
- package/dist/hooks/scopeGuard.js.map +1 -0
- package/dist/hooks/sessionIdle.d.ts +35 -0
- package/dist/hooks/sessionIdle.d.ts.map +1 -0
- package/dist/hooks/sessionIdle.js +110 -0
- package/dist/hooks/sessionIdle.js.map +1 -0
- package/dist/hooks/systemTransform.d.ts +18 -0
- package/dist/hooks/systemTransform.d.ts.map +1 -0
- package/dist/hooks/systemTransform.js +63 -0
- package/dist/hooks/systemTransform.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +854 -0
- package/dist/tools/index.js.map +1 -0
- package/docs/ARCHITECTURE.md +258 -0
- package/docs/QUE-ES.md +337 -0
- package/examples/opencode.json +7 -0
- package/package.json +81 -4
- package/skills/oficina/README.md +120 -0
- package/skills/oficina/SKILL.md +251 -0
- package/skills/oficina/reference/mesh.md +345 -0
- package/skills/oficina/reference/protocol.md +342 -0
- package/skills/oficina/reference/roles.md +171 -0
- package/skills/oficina/reference/templates.md +278 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OFICINA — schema único del sistema.
|
|
3
|
+
*
|
|
4
|
+
* Todo lo que cruza el sistema (bus, roster, cards, fichas, gates) usa estas
|
|
5
|
+
* formas. Un rol venga de agency-agents o de la factory se materializa en la
|
|
6
|
+
* misma `Ficha`; una card, sin importar qué coordinó el Commander, usa la
|
|
7
|
+
* misma `Card`. Esa unificación es lo que permite que el matching de
|
|
8
|
+
* capacidades, la rotación, la auditoría y el bus no necesiten saber el
|
|
9
|
+
* origen de nada.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Invariantes globales.
|
|
13
|
+
*
|
|
14
|
+
* Los marcados `hard` son los que el sistema NUNCA puede violar: los
|
|
15
|
+
* implementa `assertInvariants` en código, no la disciplina del agente. Un
|
|
16
|
+
* prompt puede pedirle al modelo que no toque archivos fuera de scope; el
|
|
17
|
+
* guard de scope lo impide aunque el modelo se lo salte.
|
|
18
|
+
*/
|
|
19
|
+
export interface Limits {
|
|
20
|
+
/** Especialistas simultáneos. 10 base, 14 hard cap. */
|
|
21
|
+
maxConcurrentAgents: number;
|
|
22
|
+
/** Niveles de spawn bajo un coordinador. */
|
|
23
|
+
maxSpawnDepth: number;
|
|
24
|
+
/** Spawns totales por corrida. */
|
|
25
|
+
maxSpawnsTotal: number;
|
|
26
|
+
/** Saltos máximos en una cadena de ayuda (anti-deadlock). */
|
|
27
|
+
maxHelpChainHops: number;
|
|
28
|
+
/** Mensajes por agente (anti-spam). */
|
|
29
|
+
maxMessagesPerAgent: number;
|
|
30
|
+
/** TTL de un mensaje, en segundos. */
|
|
31
|
+
msgTtlSec: number;
|
|
32
|
+
/** TTL de un lease, en segundos. */
|
|
33
|
+
leaseTtlSec: number;
|
|
34
|
+
/** Intervalo de heartbeat, en segundos. */
|
|
35
|
+
heartbeatSec: number;
|
|
36
|
+
/** Rechazos de review antes de escalar. */
|
|
37
|
+
maxReviewRejections: number;
|
|
38
|
+
/** Cards por corrida. */
|
|
39
|
+
maxCards: number;
|
|
40
|
+
/** Invocaciones de subagente por corrida. */
|
|
41
|
+
maxAgentCalls: number;
|
|
42
|
+
/** Cobertura mínima (0..1) para aceptar un match del catálogo. */
|
|
43
|
+
minCatalogCoverage: number;
|
|
44
|
+
/** Invariante duro: sin gates en PASS no hay DONE. */
|
|
45
|
+
gateRequiredBeforeDone: boolean;
|
|
46
|
+
/** Invariante duro: el revisor nunca es el owner. */
|
|
47
|
+
reviewerNeqOwner: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare const DEFAULT_LIMITS: Limits;
|
|
50
|
+
/** Ciclo de vida de un agente desplegado. */
|
|
51
|
+
export type AgentState = "deployed" | "working" | "idle_available" | "blocked" | "retired";
|
|
52
|
+
/** Estados de una card. Las transiciones válidas viven en `state.ts`. */
|
|
53
|
+
export type CardState = "todo" | "in_progress" | "review" | "rework" | "done" | "blocked" | "escalated";
|
|
54
|
+
/** Dominios particionados de los tres coordinadores. */
|
|
55
|
+
export type CoordinatorDomain = "command" | "arch" | "flow";
|
|
56
|
+
export type CoordinatorId = "commander" | "architect" | "integrator";
|
|
57
|
+
export type FichaSourceKind = "agency-agents" | "factory";
|
|
58
|
+
export interface FichaSource {
|
|
59
|
+
kind: FichaSourceKind;
|
|
60
|
+
/** División de origen en agency-agents, si aplica. */
|
|
61
|
+
division?: string;
|
|
62
|
+
/** Path relativo al repo de origen. */
|
|
63
|
+
path?: string;
|
|
64
|
+
/** El system prompt original, verbatim. */
|
|
65
|
+
sourcePrompt?: string;
|
|
66
|
+
/** El "vibe" del agente: la personality hook de una línea. */
|
|
67
|
+
vibe?: string;
|
|
68
|
+
/** Las misiones declaradas del agente (de "Core Mission"). */
|
|
69
|
+
missions?: string[];
|
|
70
|
+
/** Los entregables declarados (de "Technical Deliverables"). */
|
|
71
|
+
deliverables?: string[];
|
|
72
|
+
/** Las reglas críticas declaradas (de "Critical Rules"). */
|
|
73
|
+
rules?: string[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* La ficha es lo que un agente recibe al desplegarse. Todo lo que el bus, los
|
|
77
|
+
* coordinadores y el matching de ayuda necesitan saber de un rol cabe acá.
|
|
78
|
+
*/
|
|
79
|
+
export interface Ficha {
|
|
80
|
+
/** Id de despliegue, único por corrida. */
|
|
81
|
+
id: string;
|
|
82
|
+
/** Rol canónico. */
|
|
83
|
+
role: string;
|
|
84
|
+
displayName: string;
|
|
85
|
+
source: FichaSource;
|
|
86
|
+
capabilities: string[];
|
|
87
|
+
tools: string[];
|
|
88
|
+
scope: {
|
|
89
|
+
mayTouch: string[];
|
|
90
|
+
forbidden: string[];
|
|
91
|
+
};
|
|
92
|
+
/** Si este rol puede desplegar subagentes. */
|
|
93
|
+
canDelegate: boolean;
|
|
94
|
+
delegateBudget: number;
|
|
95
|
+
/** Con qué roles tiene relación de pares (para pedir ayuda). */
|
|
96
|
+
peers: string[];
|
|
97
|
+
/** Límites duros, leídos por los coordinadores. */
|
|
98
|
+
mustNot: string[];
|
|
99
|
+
/** Qué hace al terminar su objetivo. */
|
|
100
|
+
onFinish: "idle-join" | "retire";
|
|
101
|
+
/** A qué coordinador escala. */
|
|
102
|
+
escalateTo: CoordinatorId;
|
|
103
|
+
}
|
|
104
|
+
export type CardType = "exploration" | "design" | "implementation" | "bugfix" | "refactor" | "testing" | "docs" | "security" | "infra";
|
|
105
|
+
export interface Card {
|
|
106
|
+
id: string;
|
|
107
|
+
title: string;
|
|
108
|
+
type: CardType;
|
|
109
|
+
state: CardState;
|
|
110
|
+
/** Id del agente owner (ficha `id`). */
|
|
111
|
+
owner: string | null;
|
|
112
|
+
/** Id del agente revisor. Distinto del owner por invariante. */
|
|
113
|
+
reviewer: string | null;
|
|
114
|
+
/** Capabilities que la card requiere. */
|
|
115
|
+
requiredCapabilities: string[];
|
|
116
|
+
scope: {
|
|
117
|
+
mayTouch: string[];
|
|
118
|
+
forbidden: string[];
|
|
119
|
+
};
|
|
120
|
+
/** Criterios de aceptación verificables. */
|
|
121
|
+
acceptance: string[];
|
|
122
|
+
/** Condición que debe cumplirse para pasar a DONE. */
|
|
123
|
+
gate: string;
|
|
124
|
+
dependsOn: string[];
|
|
125
|
+
/** Intentos de ejecución. */
|
|
126
|
+
attempts: number;
|
|
127
|
+
/** Rechazos acumulados del revisor. */
|
|
128
|
+
rejections: number;
|
|
129
|
+
/** Artefactos de esta card, relativos a la office dir. */
|
|
130
|
+
artifacts: string;
|
|
131
|
+
/** Resultado final. */
|
|
132
|
+
result: string | null;
|
|
133
|
+
/** Ids de cards donde este agente pidió ayuda. */
|
|
134
|
+
helpRequests: string[];
|
|
135
|
+
/** Cuántos saltos lleva la cadena de ayuda de esta card. */
|
|
136
|
+
helpHops: number;
|
|
137
|
+
}
|
|
138
|
+
export type MessageKind = "HELP_REQUEST" | "HELP_ACCEPT" | "HELP_DECLINE" | "HELP_PARTIAL" | "HELP_QUESTION" | "QUESTION" | "ANSWER" | "SPAWN_REQUEST" | "SPAWN_APPROVED" | "SPAWN_REJECTED" | "CLAIM" | "RELEASE" | "STATUS" | "NOTICE";
|
|
139
|
+
export type MessagePriority = "low" | "normal" | "high" | "critical";
|
|
140
|
+
/** Envelope de mensaje del bus. Append-only, con seq monótono por canal. */
|
|
141
|
+
export interface BusMessage {
|
|
142
|
+
id: string;
|
|
143
|
+
/** Secuencia monótona dentro del canal. */
|
|
144
|
+
seq: number;
|
|
145
|
+
from: string;
|
|
146
|
+
/** Destinatarios. `["*"]` es broadcast al pool. */
|
|
147
|
+
to: string[];
|
|
148
|
+
kind: MessageKind;
|
|
149
|
+
/** Card o subject al que se refiere. */
|
|
150
|
+
subject: string;
|
|
151
|
+
body: Record<string, unknown>;
|
|
152
|
+
replyTo: string | null;
|
|
153
|
+
inReplyTo: string | null;
|
|
154
|
+
ttlSec: number;
|
|
155
|
+
createdAt: string;
|
|
156
|
+
priority: MessagePriority;
|
|
157
|
+
/** Clave de idempotencia: evita storms de "me ayudás?". */
|
|
158
|
+
idempotencyKey: string | null;
|
|
159
|
+
/** Cuántos saltos lleva esta cadena de ayuda. */
|
|
160
|
+
hops: number;
|
|
161
|
+
}
|
|
162
|
+
export interface BusAck {
|
|
163
|
+
messageId: string;
|
|
164
|
+
agentId: string;
|
|
165
|
+
ackedAt: string;
|
|
166
|
+
}
|
|
167
|
+
export interface RosterEntry {
|
|
168
|
+
id: string;
|
|
169
|
+
role: string;
|
|
170
|
+
displayName: string;
|
|
171
|
+
state: AgentState;
|
|
172
|
+
capabilities: string[];
|
|
173
|
+
fichaPath: string;
|
|
174
|
+
/** Card en la que está trabajando. */
|
|
175
|
+
currentCard: string | null;
|
|
176
|
+
/** Lease tomado, si hay. */
|
|
177
|
+
lease: string | null;
|
|
178
|
+
idleSince: string | null;
|
|
179
|
+
canAccept: boolean;
|
|
180
|
+
/** Cuántas veces pidió ayuda / ayudó a otro (anti-monotonía). */
|
|
181
|
+
helpGiven: number;
|
|
182
|
+
helpReceived: number;
|
|
183
|
+
/** Pares con los que ya colaboraron, para rotar. */
|
|
184
|
+
helpedPeers: string[];
|
|
185
|
+
lastHeartbeat: string;
|
|
186
|
+
source: FichaSource;
|
|
187
|
+
}
|
|
188
|
+
export interface Roster {
|
|
189
|
+
version: number;
|
|
190
|
+
runId: string;
|
|
191
|
+
agents: Record<string, RosterEntry>;
|
|
192
|
+
updatedAt: string;
|
|
193
|
+
}
|
|
194
|
+
export type GatePhase = "build" | "typecheck" | "lint" | "test" | "secrecy" | "diff";
|
|
195
|
+
export type GateOutcome = "pass" | "fail" | "na" | "not_run";
|
|
196
|
+
export interface GatePhaseResult {
|
|
197
|
+
phase: GatePhase;
|
|
198
|
+
command: string | null;
|
|
199
|
+
outcome: GateOutcome;
|
|
200
|
+
exitCode: number | null;
|
|
201
|
+
/** Salida real, recortada. */
|
|
202
|
+
output: string;
|
|
203
|
+
detail: string;
|
|
204
|
+
/** Si falló, el motivo por el que la card no puede pasar. */
|
|
205
|
+
reason?: string;
|
|
206
|
+
}
|
|
207
|
+
export interface GateResult {
|
|
208
|
+
cardId: string;
|
|
209
|
+
technical: GatePhaseResult[];
|
|
210
|
+
security: GatePhaseResult[];
|
|
211
|
+
technicalOutcome: GateOutcome;
|
|
212
|
+
securityOutcome: GateOutcome;
|
|
213
|
+
passed: boolean;
|
|
214
|
+
ranAt: string;
|
|
215
|
+
}
|
|
216
|
+
export type RunStatus = "planning" | "running" | "paused" | "delivered" | "blocked" | "escalated" | "abandoned";
|
|
217
|
+
export interface OfficeState {
|
|
218
|
+
version: number;
|
|
219
|
+
runId: string;
|
|
220
|
+
objective: string;
|
|
221
|
+
createdAt: string;
|
|
222
|
+
updatedAt: string;
|
|
223
|
+
status: RunStatus;
|
|
224
|
+
/** Cards del plan, indexadas por id. */
|
|
225
|
+
cards: Record<string, Card>;
|
|
226
|
+
/** Orden de ejecución. */
|
|
227
|
+
order: string[];
|
|
228
|
+
budget: {
|
|
229
|
+
cardsUsed: number;
|
|
230
|
+
maxCards: number;
|
|
231
|
+
agentCallsUsed: number;
|
|
232
|
+
maxAgentCalls: number;
|
|
233
|
+
spawnsUsed: number;
|
|
234
|
+
maxSpawnsTotal: number;
|
|
235
|
+
};
|
|
236
|
+
/** Bitácora de decisiones. */
|
|
237
|
+
decisions: DecisionRecord[];
|
|
238
|
+
/** Escalaciones al usuario. */
|
|
239
|
+
escalations: Escalation[];
|
|
240
|
+
/** Contexto acumulado (evita repetición). */
|
|
241
|
+
context: ContextLedger;
|
|
242
|
+
/** Iteración del loop principal. */
|
|
243
|
+
iteration: number;
|
|
244
|
+
/** Ids de cards pendientes de gate. */
|
|
245
|
+
pendingGates: string[];
|
|
246
|
+
/**
|
|
247
|
+
* Qué sesión está haciendo qué.
|
|
248
|
+
*
|
|
249
|
+
* Lo usa el guard de scope: cuando una sesión intenta editar un archivo,
|
|
250
|
+
* el motor necesita saber contra qué card está trabajando esa sesión.
|
|
251
|
+
*/
|
|
252
|
+
sessions: Record<string, SessionBinding>;
|
|
253
|
+
}
|
|
254
|
+
export interface SessionBinding {
|
|
255
|
+
/** Id de agente. */
|
|
256
|
+
agentId: string;
|
|
257
|
+
/** Card en curso de esa sesión. */
|
|
258
|
+
cardId: string | null;
|
|
259
|
+
updatedAt: string;
|
|
260
|
+
/** Cuántas veces el motor auto-reanudó esta sesión. */
|
|
261
|
+
autoResumes: number;
|
|
262
|
+
}
|
|
263
|
+
export interface DecisionRecord {
|
|
264
|
+
at: string;
|
|
265
|
+
cardId: string;
|
|
266
|
+
decision: "approved" | "rework" | "replan" | "escalated" | "spawn_approved" | "spawn_rejected";
|
|
267
|
+
reason: string;
|
|
268
|
+
actor: string;
|
|
269
|
+
}
|
|
270
|
+
export interface Escalation {
|
|
271
|
+
id: string;
|
|
272
|
+
cardId: string;
|
|
273
|
+
at: string;
|
|
274
|
+
cause: string;
|
|
275
|
+
attempts: {
|
|
276
|
+
iteration: number;
|
|
277
|
+
summary: string;
|
|
278
|
+
}[];
|
|
279
|
+
options: EscalationOption[];
|
|
280
|
+
recommendation: string;
|
|
281
|
+
status: "open" | "resolved";
|
|
282
|
+
}
|
|
283
|
+
export interface EscalationOption {
|
|
284
|
+
id: string;
|
|
285
|
+
label: string;
|
|
286
|
+
tradeoff: string;
|
|
287
|
+
}
|
|
288
|
+
export interface ContextLedger {
|
|
289
|
+
decisions: string[];
|
|
290
|
+
constraints: string[];
|
|
291
|
+
pieces: string[];
|
|
292
|
+
traps: string[];
|
|
293
|
+
open: string[];
|
|
294
|
+
}
|
|
295
|
+
export interface CatalogAgent {
|
|
296
|
+
/** Slug del archivo, sin extensión. */
|
|
297
|
+
slug: string;
|
|
298
|
+
displayName: string;
|
|
299
|
+
description: string;
|
|
300
|
+
/** La personality hook de una línea que trae el frontmatter. */
|
|
301
|
+
vibe: string;
|
|
302
|
+
division: string;
|
|
303
|
+
path: string;
|
|
304
|
+
/**
|
|
305
|
+
* Capabilities inferidas del **cuerpo**, no del nombre.
|
|
306
|
+
*
|
|
307
|
+
* Es la diferencia entre "de qué se ocupa" (description) y "en qué es
|
|
308
|
+
* exactamente bueno" (Core Mission + Advanced Capabilities + Deliverables).
|
|
309
|
+
*/
|
|
310
|
+
capabilities: string[];
|
|
311
|
+
/** Subtítulos de "Core Mission": la especialidad declarada. */
|
|
312
|
+
missions: string[];
|
|
313
|
+
/** Subtítulos de "Technical Deliverables": lo que sabe producir. */
|
|
314
|
+
deliverables: string[];
|
|
315
|
+
/** Subtítulos de "Advanced Capabilities". */
|
|
316
|
+
advanced: string[];
|
|
317
|
+
/** Items de "Critical Rules". */
|
|
318
|
+
rules: string[];
|
|
319
|
+
/** Secciones H2 parseadas del cuerpo. */
|
|
320
|
+
sections: Record<string, string>;
|
|
321
|
+
/** Prompt original completo. */
|
|
322
|
+
sourcePrompt: string;
|
|
323
|
+
/** Texto indexable para matching. */
|
|
324
|
+
searchText: string;
|
|
325
|
+
}
|
|
326
|
+
export interface CatalogMatch {
|
|
327
|
+
agent: CatalogAgent;
|
|
328
|
+
/** 0..1. */
|
|
329
|
+
coverage: number;
|
|
330
|
+
matched: string[];
|
|
331
|
+
missing: string[];
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OFICINA — schema único del sistema.
|
|
3
|
+
*
|
|
4
|
+
* Todo lo que cruza el sistema (bus, roster, cards, fichas, gates) usa estas
|
|
5
|
+
* formas. Un rol venga de agency-agents o de la factory se materializa en la
|
|
6
|
+
* misma `Ficha`; una card, sin importar qué coordinó el Commander, usa la
|
|
7
|
+
* misma `Card`. Esa unificación es lo que permite que el matching de
|
|
8
|
+
* capacidades, la rotación, la auditoría y el bus no necesiten saber el
|
|
9
|
+
* origen de nada.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_LIMITS = {
|
|
12
|
+
maxConcurrentAgents: 10,
|
|
13
|
+
maxSpawnDepth: 2,
|
|
14
|
+
maxSpawnsTotal: 20,
|
|
15
|
+
maxHelpChainHops: 2,
|
|
16
|
+
maxMessagesPerAgent: 150,
|
|
17
|
+
msgTtlSec: 900,
|
|
18
|
+
leaseTtlSec: 1800,
|
|
19
|
+
heartbeatSec: 60,
|
|
20
|
+
maxReviewRejections: 3,
|
|
21
|
+
maxCards: 20,
|
|
22
|
+
maxAgentCalls: 40,
|
|
23
|
+
minCatalogCoverage: 0.6,
|
|
24
|
+
gateRequiredBeforeDone: true,
|
|
25
|
+
reviewerNeqOwner: true,
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6CH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,mBAAmB,EAAE,EAAE;IACvB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,CAAC;IACnB,mBAAmB,EAAE,GAAG;IACxB,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,EAAE;IAChB,mBAAmB,EAAE,CAAC;IACtB,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,kBAAkB,EAAE,GAAG;IACvB,sBAAsB,EAAE,IAAI;IAC5B,gBAAgB,EAAE,IAAI;CACvB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook: el estado de la oficina sobrevive a la compactación.
|
|
3
|
+
*
|
|
4
|
+
* Cuando la sesión se compacta, el modelo pierde el contexto conversacional.
|
|
5
|
+
* Sin este hook, la oficina se olvida de a mitad de camino: el agente deja de
|
|
6
|
+
* saber qué hizo, repite trabajo y el ciclo se rompe.
|
|
7
|
+
*
|
|
8
|
+
* Con este hook, el resumen de compactación incluye el estado real de la
|
|
9
|
+
* oficina — leído del disco, no del contexto que se está por perder.
|
|
10
|
+
*/
|
|
11
|
+
import type { Office } from "../core/office.js";
|
|
12
|
+
export declare function createCompactingHook(office: Office): (input: {
|
|
13
|
+
sessionID: string;
|
|
14
|
+
}, output: {
|
|
15
|
+
context: string[];
|
|
16
|
+
prompt?: string;
|
|
17
|
+
}) => Promise<void>;
|
|
18
|
+
//# sourceMappingURL=compacting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compacting.d.ts","sourceRoot":"","sources":["../../src/hooks/compacting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,IAE/C,OAAO;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC5B,QAAQ;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7C,OAAO,CAAC,IAAI,CAAC,CA6DjB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook: el estado de la oficina sobrevive a la compactación.
|
|
3
|
+
*
|
|
4
|
+
* Cuando la sesión se compacta, el modelo pierde el contexto conversacional.
|
|
5
|
+
* Sin este hook, la oficina se olvida de a mitad de camino: el agente deja de
|
|
6
|
+
* saber qué hizo, repite trabajo y el ciclo se rompe.
|
|
7
|
+
*
|
|
8
|
+
* Con este hook, el resumen de compactación incluye el estado real de la
|
|
9
|
+
* oficina — leído del disco, no del contexto que se está por perder.
|
|
10
|
+
*/
|
|
11
|
+
import { logger } from "../core/log.js";
|
|
12
|
+
const log = logger("oficina:compacting");
|
|
13
|
+
export function createCompactingHook(office) {
|
|
14
|
+
return async function onCompacting(input, output) {
|
|
15
|
+
try {
|
|
16
|
+
const state = await office.loadState();
|
|
17
|
+
if (!state.objective)
|
|
18
|
+
return;
|
|
19
|
+
const cards = Object.values(state.cards);
|
|
20
|
+
const done = cards.filter((c) => c.state === "done");
|
|
21
|
+
const pending = cards.filter((c) => c.state !== "done");
|
|
22
|
+
const roster = await office.loadRoster(state.runId);
|
|
23
|
+
const context = [
|
|
24
|
+
"## 🏢 OFICINA — estado (leído del disco, sobrevivió a la compactación)",
|
|
25
|
+
"",
|
|
26
|
+
`**Objetivo:** ${state.objective}`,
|
|
27
|
+
`**Estado de la corrida:** ${state.status}`,
|
|
28
|
+
`**Progreso:** ${done.length}/${cards.length} cards DONE`,
|
|
29
|
+
"",
|
|
30
|
+
"### Cards terminadas",
|
|
31
|
+
...(done.length > 0
|
|
32
|
+
? done.map((c) => `- ${c.id}: ${c.title} — ${c.result ?? "completada"}`)
|
|
33
|
+
: ["(ninguna)"]),
|
|
34
|
+
"",
|
|
35
|
+
"### Cards pendientes",
|
|
36
|
+
...(pending.length > 0
|
|
37
|
+
? pending.map((c) => `- ${c.id} [${c.state}] ${c.title} · owner=${c.owner ?? "—"} · gate: ${c.gate} · intentos=${c.attempts} · rechazos=${c.rejections}`)
|
|
38
|
+
: ["(ninguna)"]),
|
|
39
|
+
"",
|
|
40
|
+
`**Agentes en el roster:** ${Object.values(roster.agents)
|
|
41
|
+
.map((a) => `${a.id}(${a.role}:${a.state})`)
|
|
42
|
+
.join(", ") || "—"}`,
|
|
43
|
+
"",
|
|
44
|
+
"### Contexto acumulado",
|
|
45
|
+
...(state.context.decisions.length > 0
|
|
46
|
+
? ["", "**Decisiones:**", ...state.context.decisions.map((d) => `- ${d}`)]
|
|
47
|
+
: []),
|
|
48
|
+
...(state.context.constraints.length > 0
|
|
49
|
+
? ["", "**Constraints:**", ...state.context.constraints.map((c) => `- ${c}`)]
|
|
50
|
+
: []),
|
|
51
|
+
...(state.context.pieces.length > 0
|
|
52
|
+
? ["", "**Piezas construidas:**", ...state.context.pieces.map((p) => `- ${p}`)]
|
|
53
|
+
: []),
|
|
54
|
+
...(state.context.traps.length > 0
|
|
55
|
+
? ["", "**Trampas:**", ...state.context.traps.map((t) => `- ${t}`)]
|
|
56
|
+
: []),
|
|
57
|
+
"",
|
|
58
|
+
"Continuá desde donde quedó. No repitas trabajo ya hecho: leé `.oficina/artifacts/`.",
|
|
59
|
+
].join("\n");
|
|
60
|
+
output.context.push(context);
|
|
61
|
+
log.info("estado inyectado en la compactación", {
|
|
62
|
+
sessionID: input.sessionID,
|
|
63
|
+
done: done.length,
|
|
64
|
+
pending: pending.length,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
log.error("fallo inyectando el estado en la compactación", { error: String(err) });
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=compacting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compacting.js","sourceRoot":"","sources":["../../src/hooks/compacting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook: guard de scope.
|
|
3
|
+
*
|
|
4
|
+
* ESTE es el hook que convierte "no toques archivos fuera de tu scope" de
|
|
5
|
+
* una instrucción en una restricción. Un prompt le pide al modelo que sea
|
|
6
|
+
* cuidadoso; este hook le impide hacerlo.
|
|
7
|
+
*
|
|
8
|
+
* Cuando una sesión intenta escribir un archivo que no está en el scope de
|
|
9
|
+
* su card, la operación se rechaza con un error que explica qué hacer.
|
|
10
|
+
*
|
|
11
|
+
* El guard tiene una salida: si el archivo es claramente correcto y el
|
|
12
|
+
* modelo insiste, el scope de la card se puede ampliar. Pero el default es
|
|
13
|
+
* denegar.
|
|
14
|
+
*/
|
|
15
|
+
import type { Office } from "../core/office.js";
|
|
16
|
+
export interface ScopeGuardOptions {
|
|
17
|
+
/** Si es false, el guard solo avisa y no bloquea. */
|
|
18
|
+
enforce: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Glob mínimo a regex. Soporta `*`, `**` y `?`.
|
|
22
|
+
*
|
|
23
|
+
* El orden de los reemplazos importa: el `?` se convierte ANTES de insertar
|
|
24
|
+
* los patrones de `**`, porque el grupo insertado contiene un `?` literal
|
|
25
|
+
* que, si se convierte después, se rompe y deja de matchear.
|
|
26
|
+
*/
|
|
27
|
+
export declare function globToRegex(glob: string): RegExp;
|
|
28
|
+
/** ¿El path cae dentro de alguno de los globs? */
|
|
29
|
+
export declare function matchesScope(relativePath: string, globs: string[]): boolean;
|
|
30
|
+
/** Extrae el path del argumento de una tool de escritura. */
|
|
31
|
+
export declare function extractPath(tool: string, args: Record<string, unknown>): string | undefined;
|
|
32
|
+
export declare function createScopeGuardHook(office: Office, options?: ScopeGuardOptions): (input: {
|
|
33
|
+
tool: string;
|
|
34
|
+
sessionID: string;
|
|
35
|
+
callID: string;
|
|
36
|
+
}, output: {
|
|
37
|
+
args: Record<string, unknown>;
|
|
38
|
+
}) => Promise<void>;
|
|
39
|
+
//# sourceMappingURL=scopeGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeGuard.d.ts","sourceRoot":"","sources":["../../src/hooks/scopeGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAQ/C,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAM3E;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAe3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAqC,IAE/F,OAAO;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC1D,QAAQ;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KACxC,OAAO,CAAC,IAAI,CAAC,CAkDjB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook: guard de scope.
|
|
3
|
+
*
|
|
4
|
+
* ESTE es el hook que convierte "no toques archivos fuera de tu scope" de
|
|
5
|
+
* una instrucción en una restricción. Un prompt le pide al modelo que sea
|
|
6
|
+
* cuidadoso; este hook le impide hacerlo.
|
|
7
|
+
*
|
|
8
|
+
* Cuando una sesión intenta escribir un archivo que no está en el scope de
|
|
9
|
+
* su card, la operación se rechaza con un error que explica qué hacer.
|
|
10
|
+
*
|
|
11
|
+
* El guard tiene una salida: si el archivo es claramente correcto y el
|
|
12
|
+
* modelo insiste, el scope de la card se puede ampliar. Pero el default es
|
|
13
|
+
* denegar.
|
|
14
|
+
*/
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { logger } from "../core/log.js";
|
|
17
|
+
const log = logger("oficina:scope-guard");
|
|
18
|
+
/** Tools que escriben en disco. */
|
|
19
|
+
const WRITE_TOOLS = new Set(["edit", "write", "patch", "multiedit", "apply_patch"]);
|
|
20
|
+
/**
|
|
21
|
+
* Glob mínimo a regex. Soporta `*`, `**` y `?`.
|
|
22
|
+
*
|
|
23
|
+
* El orden de los reemplazos importa: el `?` se convierte ANTES de insertar
|
|
24
|
+
* los patrones de `**`, porque el grupo insertado contiene un `?` literal
|
|
25
|
+
* que, si se convierte después, se rompe y deja de matchear.
|
|
26
|
+
*/
|
|
27
|
+
export function globToRegex(glob) {
|
|
28
|
+
const escaped = glob
|
|
29
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
30
|
+
// `?` primero: los patrones insertados después contienen `?` literal.
|
|
31
|
+
.replace(/\?/g, ".")
|
|
32
|
+
.replace(/\*\*\//g, "\u0000")
|
|
33
|
+
.replace(/\*\*/g, "\u0001")
|
|
34
|
+
.replace(/\*/g, "[^/]*")
|
|
35
|
+
.replace(/\u0000/g, "(?:.*/)?")
|
|
36
|
+
.replace(/\u0001/g, ".*");
|
|
37
|
+
return new RegExp(`^${escaped}$`);
|
|
38
|
+
}
|
|
39
|
+
/** ¿El path cae dentro de alguno de los globs? */
|
|
40
|
+
export function matchesScope(relativePath, globs) {
|
|
41
|
+
const normalized = relativePath.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
42
|
+
return globs.some((glob) => {
|
|
43
|
+
if (glob === "**")
|
|
44
|
+
return true;
|
|
45
|
+
return globToRegex(glob).test(normalized);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Extrae el path del argumento de una tool de escritura. */
|
|
49
|
+
export function extractPath(tool, args) {
|
|
50
|
+
const candidates = ["filePath", "path", "file", "target", "notebook_path"];
|
|
51
|
+
for (const key of candidates) {
|
|
52
|
+
const value = args[key];
|
|
53
|
+
if (typeof value === "string" && value.length > 0)
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
// El tool `patch` puede traer los paths dentro de un patch estructurado.
|
|
57
|
+
if (tool === "patch" || tool === "apply_patch") {
|
|
58
|
+
const patch = args.patch ?? args.diff;
|
|
59
|
+
if (typeof patch === "string") {
|
|
60
|
+
const m = /^---+\s+(.+)$/m.exec(patch);
|
|
61
|
+
if (m?.[1])
|
|
62
|
+
return m[1].trim();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
export function createScopeGuardHook(office, options = { enforce: true }) {
|
|
68
|
+
return async function onToolExecuteBefore(input, output) {
|
|
69
|
+
if (!output?.args)
|
|
70
|
+
return;
|
|
71
|
+
if (!WRITE_TOOLS.has(input.tool))
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
const state = await office.loadState();
|
|
75
|
+
const card = office.sessionCard(state, input.sessionID);
|
|
76
|
+
// Sin card activa no hay scope que aplicar: el agente está en
|
|
77
|
+
// exploración libre o en una operación que no es de la oficina.
|
|
78
|
+
if (!card)
|
|
79
|
+
return;
|
|
80
|
+
const rawPath = extractPath(input.tool, output.args);
|
|
81
|
+
if (!rawPath)
|
|
82
|
+
return;
|
|
83
|
+
const absolute = path.isAbsolute(rawPath)
|
|
84
|
+
? rawPath
|
|
85
|
+
: path.join(office.paths.projectRoot, rawPath);
|
|
86
|
+
const relative = path.relative(office.paths.projectRoot, absolute).replace(/\\/g, "/");
|
|
87
|
+
// Los artefactos de la oficina siempre están permitidos: son el canal.
|
|
88
|
+
if (relative.startsWith(".oficina/"))
|
|
89
|
+
return;
|
|
90
|
+
const mayTouch = card.scope.mayTouch;
|
|
91
|
+
const forbidden = card.scope.forbidden;
|
|
92
|
+
if (matchesScope(relative, forbidden)) {
|
|
93
|
+
throw new Error(`[OFICINA] Scope violado: \`${relative}\` está en el scope forbidden de la card ${card.id}. ` +
|
|
94
|
+
`Forbidden: ${forbidden.join(", ")}. No lo toques. Si realmente hace falta, pedí que se amplíe el scope.`);
|
|
95
|
+
}
|
|
96
|
+
if (!matchesScope(relative, mayTouch)) {
|
|
97
|
+
throw new Error(`[OFICINA] Scope violado: \`${relative}\` está fuera del scope de la card ${card.id}. ` +
|
|
98
|
+
`Podés tocar: ${mayTouch.join(", ")}. ` +
|
|
99
|
+
`Si el archivo es necesario, pedí por el bus que se amplíe el scope, o pedí ayuda a un peer que lo cubra.`);
|
|
100
|
+
}
|
|
101
|
+
log.debug("scope ok", { card: card.id, file: relative });
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof Error && err.message.startsWith("[OFICINA]")) {
|
|
105
|
+
if (options.enforce)
|
|
106
|
+
throw err;
|
|
107
|
+
log.warn("scope violado (sin bloquear)", { error: err.message });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
log.error("fallo en el guard de scope", { error: String(err) });
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=scopeGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeGuard.js","sourceRoot":"","sources":["../../src/hooks/scopeGuard.ts"],"names":[],"mappings":"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"}
|