@jmanuelcorral/openteam 0.1.34 → 0.1.36

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 CHANGED
@@ -375,6 +375,8 @@ openteam console
375
375
  openteam report --telemetry .opencode/openteam-telemetry.jsonl
376
376
  openteam yolo status
377
377
  openteam yolo on
378
+ openteam local status
379
+ openteam local off
378
380
  ```
379
381
 
380
382
  Flags: `--config <path>` y `--telemetry <path>` sobrescriben las rutas por defecto; `--opencode <path>` apunta el comando `yolo` a un `opencode.json` concreto.
@@ -417,6 +419,18 @@ También puedes activarlo durante `openteam setup` (te lo pregunta), o al vuelo
417
419
 
418
420
  > **YOLO no desactiva la privacidad de openteam.** Solo afecta a las aprobaciones de permisos de opencode; con `privacyMode: "forceLocalOnSensitive"`, los prompts sensibles siguen sin salir a frontier. Úsalo solo en entornos de confianza: auto-aprueba también `bash`, escrituras y accesos fuera del workspace (salvo reglas `deny` explícitas).
419
421
 
422
+ ### Solo frontier (sin runtime local): `openteam local`
423
+
424
+ Si **no tienes ningún runtime local** (Ollama/LM Studio/Foundry Local) o prefieres no usarlo, puedes forzar que openteam enrute **siempre a modelos frontier**. `openteam setup` ya activa este modo automáticamente cuando no habilitas ningún runtime, pero puedes alternarlo en cualquier momento sin repetir el setup:
425
+
426
+ ```powershell
427
+ openteam local status # ¿local-first o solo frontier? + runtimes configurados
428
+ openteam local off # solo frontier (desactiva el routing local-first)
429
+ openteam local on # vuelve al routing local-first
430
+ ```
431
+
432
+ Esto persiste el flag `router.frontierOnly` en `.opencode/openteam.json`. Con `frontierOnly` activo, el router escoge el **frontier cheapest-capable** en lugar de la heurística local-first, pero **respeta la privacidad, los presupuestos y los overrides explícitos por tarea**: los prompts sensibles con `forceLocalOnSensitive` no salen a frontier, y `local off` degrada esa política a `consentBeforeFrontier` (imposible forzar local sin runtime) informándote del cambio.
433
+
420
434
  ### Modo desatendido: `openteam loop` (patrón Ralph) 🎯 *(diseño)*
421
435
 
422
436
  Segundo modo de operación: un **bucle externo** que invoca `opencode run` contra un backlog persistente hasta vaciarlo, con contexto fresco por iteración y topes de seguridad (presupuesto, máx. iteraciones, sin-progreso). Complementa al orquestador interactivo, no lo sustituye. Consulta el diseño y los ejemplos en **[docs/loop.md](docs/loop.md)**.
package/dist/cli.js CHANGED
@@ -688,12 +688,14 @@ var OpenTeamConfigObjectSchema = z3.object({
688
688
  mode: RouterModeSchema.default("balanced"),
689
689
  localDefault: ModelRefSchema.default(defaultLocalModel),
690
690
  trivialPromptMaxChars: z3.number().int().positive().default(280),
691
- frontierPromptMinChars: z3.number().int().positive().default(2000)
691
+ frontierPromptMinChars: z3.number().int().positive().default(2000),
692
+ frontierOnly: z3.boolean().default(false)
692
693
  }).default({
693
694
  mode: "balanced",
694
695
  localDefault: defaultLocalModel,
695
696
  trivialPromptMaxChars: 280,
696
- frontierPromptMinChars: 2000
697
+ frontierPromptMinChars: 2000,
698
+ frontierOnly: false
697
699
  }),
698
700
  local: z3.object({
699
701
  runtimes: z3.array(LocalRuntimeSchema).min(1).default([
@@ -751,6 +753,7 @@ var RouteEventSchema = EventBaseSchema.extend({
751
753
  agent: z4.string().min(1).optional(),
752
754
  success: z4.boolean().optional(),
753
755
  batchID: z4.string().min(1).optional(),
756
+ taskID: z4.string().min(1).optional(),
754
757
  failureReason: z4.string().min(1).optional(),
755
758
  failureStage: z4.string().min(1).optional()
756
759
  });
@@ -3944,6 +3947,60 @@ function renderDoctor(input) {
3944
3947
  `);
3945
3948
  }
3946
3949
 
3950
+ // src/commands/local.ts
3951
+ function enabledRuntimesSummary(config) {
3952
+ const enabled = config.local.runtimes.filter((runtime) => runtime.enabled);
3953
+ if (enabled.length === 0) {
3954
+ return "ninguno";
3955
+ }
3956
+ return enabled.map((runtime) => {
3957
+ const model = `${runtime.defaultModel.providerID}/${runtime.defaultModel.modelID}`;
3958
+ const remote = runtime.baseURL !== undefined && !runtime.baseURL.includes("localhost") && !runtime.baseURL.includes("127.0.0.1") ? ` @ ${runtime.baseURL}` : "";
3959
+ return `${runtime.id} (${model})${remote}`;
3960
+ }).join(", ");
3961
+ }
3962
+ function showLocal(config) {
3963
+ const mode = config.router.frontierOnly ? "solo frontier (frontierOnly)" : "local-first";
3964
+ const lines = [
3965
+ "openteam local:",
3966
+ ` modo: ${mode}`,
3967
+ ` frontierOnly: ${config.router.frontierOnly}`,
3968
+ ` privacidad: ${config.privacyMode}`,
3969
+ ` runtimes: ${enabledRuntimesSummary(config)}`
3970
+ ];
3971
+ return { message: lines.join(`
3972
+ `) };
3973
+ }
3974
+ function setFrontierOnly(config) {
3975
+ if (config.router.frontierOnly) {
3976
+ return { message: "Sin cambios: ya estás en modo solo frontier." };
3977
+ }
3978
+ const flipsPrivacy = config.privacyMode === "forceLocalOnSensitive";
3979
+ const next = {
3980
+ ...config,
3981
+ router: { ...config.router, frontierOnly: true },
3982
+ privacyMode: flipsPrivacy ? "consentBeforeFrontier" : config.privacyMode
3983
+ };
3984
+ const privacyNote = flipsPrivacy ? " Privacidad ajustada a 'consentBeforeFrontier' (forceLocalOnSensitive requiere un runtime local)." : "";
3985
+ return {
3986
+ config: next,
3987
+ message: `Modo solo frontier activado (frontierOnly=true).${privacyNote}`
3988
+ };
3989
+ }
3990
+ function setLocalFirst(config) {
3991
+ if (!config.router.frontierOnly) {
3992
+ return { message: "Sin cambios: el routing local-first ya está activo." };
3993
+ }
3994
+ const next = {
3995
+ ...config,
3996
+ router: { ...config.router, frontierOnly: false }
3997
+ };
3998
+ return {
3999
+ config: next,
4000
+ message: "Routing local-first reactivado (frontierOnly=false). Asegúrate de tener un runtime local accesible."
4001
+ };
4002
+ }
4003
+
3947
4004
  // src/commands/orchestratorAgent.ts
3948
4005
  var ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
3949
4006
  function buildOrchestratorAgent(frontier, options = {}) {
@@ -4179,6 +4236,9 @@ var HELP = [
4179
4236
  " openteam baseline show Muestra el baseline efectivo",
4180
4237
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
4181
4238
  " openteam baseline auto Baseline cheapest-capable (modo auto)",
4239
+ " openteam local status Muestra el modo de routing (local-first / solo frontier)",
4240
+ " openteam local off Usa solo modelos frontier (sin runtime local)",
4241
+ " openteam local on Reactiva el routing local-first",
4182
4242
  " openteam doctor Diagnóstico de runtimes y config",
4183
4243
  " openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
4184
4244
  " openteam console Lanza la Console web multi-sesión (Ctrl+C para parar; --open abre el navegador)",
@@ -4261,6 +4321,26 @@ async function runBaseline(positionals, deps, configPath) {
4261
4321
  ${HELP}`
4262
4322
  };
4263
4323
  }
4324
+ async function runLocal(positionals, deps, configPath) {
4325
+ const sub = positionals[1] ?? "status";
4326
+ if (sub !== "status" && sub !== "off" && sub !== "on") {
4327
+ return {
4328
+ exitCode: 1,
4329
+ stdout: `Subcomando de local desconocido: ${sub}
4330
+
4331
+ ${HELP}`
4332
+ };
4333
+ }
4334
+ const config = await deps.loadConfig(configPath);
4335
+ if (sub === "status") {
4336
+ return { exitCode: 0, stdout: showLocal(config).message };
4337
+ }
4338
+ const outcome = sub === "off" ? setFrontierOnly(config) : setLocalFirst(config);
4339
+ if (outcome.config !== undefined) {
4340
+ await deps.saveConfig(outcome.config, configPath);
4341
+ }
4342
+ return { exitCode: 0, stdout: outcome.message };
4343
+ }
4264
4344
  async function runYolo(positionals, deps, opencodeConfigPath) {
4265
4345
  const sub = positionals[1] ?? "status";
4266
4346
  if (sub !== "status" && sub !== "on" && sub !== "off") {
@@ -4345,6 +4425,9 @@ async function runCli(argv, deps) {
4345
4425
  if (command === "baseline") {
4346
4426
  return await runBaseline(parsed.positionals, deps, configPath);
4347
4427
  }
4428
+ if (command === "local") {
4429
+ return await runLocal(parsed.positionals, deps, configPath);
4430
+ }
4348
4431
  if (command === "yolo") {
4349
4432
  return await runYolo(parsed.positionals, deps, opencodeConfigPath);
4350
4433
  }
@@ -4551,7 +4634,8 @@ function buildOpenTeamConfig(answers) {
4551
4634
  },
4552
4635
  router: {
4553
4636
  mode: answers.routerMode,
4554
- localDefault
4637
+ localDefault,
4638
+ frontierOnly: primaryLocal === undefined
4555
4639
  },
4556
4640
  local: { runtimes },
4557
4641
  privacyMode: answers.privacyMode
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAalB,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACvD,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,mBAAmB,EAAE,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA2NF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CA+DpB"}
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAclB,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACvD,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,mBAAmB,EAAE,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA0PF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CAmEpB"}
@@ -0,0 +1,6 @@
1
+ import type { OpenTeamConfig } from "../config/schema";
2
+ import type { CommandOutcome } from "./types";
3
+ export declare function showLocal(config: OpenTeamConfig): CommandOutcome;
4
+ export declare function setFrontierOnly(config: OpenTeamConfig): CommandOutcome;
5
+ export declare function setLocalFirst(config: OpenTeamConfig): CommandOutcome;
6
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAkC9C,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAahE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAsBtE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAepE"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -96,6 +96,7 @@ export declare const OpenTeamConfigObjectSchema: z.ZodObject<{
96
96
  }, z.core.$strip>>;
97
97
  trivialPromptMaxChars: z.ZodDefault<z.ZodNumber>;
98
98
  frontierPromptMinChars: z.ZodDefault<z.ZodNumber>;
99
+ frontierOnly: z.ZodDefault<z.ZodBoolean>;
99
100
  }, z.core.$strip>>;
100
101
  local: z.ZodDefault<z.ZodObject<{
101
102
  runtimes: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -179,6 +180,7 @@ export declare const OpenTeamConfigSchema: z.ZodObject<{
179
180
  }, z.core.$strip>>;
180
181
  trivialPromptMaxChars: z.ZodDefault<z.ZodNumber>;
181
182
  frontierPromptMinChars: z.ZodDefault<z.ZodNumber>;
183
+ frontierOnly: z.ZodDefault<z.ZodBoolean>;
182
184
  }, z.core.$strip>>;
183
185
  local: z.ZodDefault<z.ZodObject<{
184
186
  runtimes: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;EAA6C,CAAC;AAC3E,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAC;AACH,eAAO,MAAM,kBAAkB;;;EAA6B,CAAC;AAE7D,eAAO,MAAM,iBAAiB;;;EAAqC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;kBAmC5B,CAAC;AAEL;;GAEG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;kBAW5B,CAAC;AAWL,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DrC,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA6B,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;EAA6C,CAAC;AAC3E,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAC;AACH,eAAO,MAAM,kBAAkB;;;EAA6B,CAAC;AAE7D,eAAO,MAAM,iBAAiB;;;EAAqC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;kBAmC5B,CAAC;AAEL;;GAEG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;kBAW5B,CAAC;AAWL,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8DrC,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA6B,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -393,12 +393,14 @@ var OpenTeamConfigObjectSchema = z.object({
393
393
  mode: RouterModeSchema.default("balanced"),
394
394
  localDefault: ModelRefSchema.default(defaultLocalModel),
395
395
  trivialPromptMaxChars: z.number().int().positive().default(280),
396
- frontierPromptMinChars: z.number().int().positive().default(2000)
396
+ frontierPromptMinChars: z.number().int().positive().default(2000),
397
+ frontierOnly: z.boolean().default(false)
397
398
  }).default({
398
399
  mode: "balanced",
399
400
  localDefault: defaultLocalModel,
400
401
  trivialPromptMaxChars: 280,
401
- frontierPromptMinChars: 2000
402
+ frontierPromptMinChars: 2000,
403
+ frontierOnly: false
402
404
  }),
403
405
  local: z.object({
404
406
  runtimes: z.array(LocalRuntimeSchema).min(1).default([
@@ -949,6 +951,7 @@ var RouteEventSchema = EventBaseSchema.extend({
949
951
  agent: z3.string().min(1).optional(),
950
952
  success: z3.boolean().optional(),
951
953
  batchID: z3.string().min(1).optional(),
954
+ taskID: z3.string().min(1).optional(),
952
955
  failureReason: z3.string().min(1).optional(),
953
956
  failureStage: z3.string().min(1).optional()
954
957
  });
@@ -1383,6 +1386,60 @@ function renderDoctor(input) {
1383
1386
  `);
1384
1387
  }
1385
1388
 
1389
+ // src/commands/local.ts
1390
+ function enabledRuntimesSummary(config) {
1391
+ const enabled = config.local.runtimes.filter((runtime) => runtime.enabled);
1392
+ if (enabled.length === 0) {
1393
+ return "ninguno";
1394
+ }
1395
+ return enabled.map((runtime) => {
1396
+ const model = `${runtime.defaultModel.providerID}/${runtime.defaultModel.modelID}`;
1397
+ const remote = runtime.baseURL !== undefined && !runtime.baseURL.includes("localhost") && !runtime.baseURL.includes("127.0.0.1") ? ` @ ${runtime.baseURL}` : "";
1398
+ return `${runtime.id} (${model})${remote}`;
1399
+ }).join(", ");
1400
+ }
1401
+ function showLocal(config) {
1402
+ const mode = config.router.frontierOnly ? "solo frontier (frontierOnly)" : "local-first";
1403
+ const lines = [
1404
+ "openteam local:",
1405
+ ` modo: ${mode}`,
1406
+ ` frontierOnly: ${config.router.frontierOnly}`,
1407
+ ` privacidad: ${config.privacyMode}`,
1408
+ ` runtimes: ${enabledRuntimesSummary(config)}`
1409
+ ];
1410
+ return { message: lines.join(`
1411
+ `) };
1412
+ }
1413
+ function setFrontierOnly(config) {
1414
+ if (config.router.frontierOnly) {
1415
+ return { message: "Sin cambios: ya estás en modo solo frontier." };
1416
+ }
1417
+ const flipsPrivacy = config.privacyMode === "forceLocalOnSensitive";
1418
+ const next = {
1419
+ ...config,
1420
+ router: { ...config.router, frontierOnly: true },
1421
+ privacyMode: flipsPrivacy ? "consentBeforeFrontier" : config.privacyMode
1422
+ };
1423
+ const privacyNote = flipsPrivacy ? " Privacidad ajustada a 'consentBeforeFrontier' (forceLocalOnSensitive requiere un runtime local)." : "";
1424
+ return {
1425
+ config: next,
1426
+ message: `Modo solo frontier activado (frontierOnly=true).${privacyNote}`
1427
+ };
1428
+ }
1429
+ function setLocalFirst(config) {
1430
+ if (!config.router.frontierOnly) {
1431
+ return { message: "Sin cambios: el routing local-first ya está activo." };
1432
+ }
1433
+ const next = {
1434
+ ...config,
1435
+ router: { ...config.router, frontierOnly: false }
1436
+ };
1437
+ return {
1438
+ config: next,
1439
+ message: "Routing local-first reactivado (frontierOnly=false). Asegúrate de tener un runtime local accesible."
1440
+ };
1441
+ }
1442
+
1386
1443
  // src/commands/report.ts
1387
1444
  var TIERS = [
1388
1445
  "trivial",
@@ -1500,6 +1557,9 @@ var HELP = [
1500
1557
  " openteam baseline show Muestra el baseline efectivo",
1501
1558
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
1502
1559
  " openteam baseline auto Baseline cheapest-capable (modo auto)",
1560
+ " openteam local status Muestra el modo de routing (local-first / solo frontier)",
1561
+ " openteam local off Usa solo modelos frontier (sin runtime local)",
1562
+ " openteam local on Reactiva el routing local-first",
1503
1563
  " openteam doctor Diagnóstico de runtimes y config",
1504
1564
  " openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
1505
1565
  " openteam console Lanza la Console web multi-sesión (Ctrl+C para parar; --open abre el navegador)",
@@ -1582,6 +1642,26 @@ async function runBaseline(positionals, deps, configPath) {
1582
1642
  ${HELP}`
1583
1643
  };
1584
1644
  }
1645
+ async function runLocal(positionals, deps, configPath) {
1646
+ const sub = positionals[1] ?? "status";
1647
+ if (sub !== "status" && sub !== "off" && sub !== "on") {
1648
+ return {
1649
+ exitCode: 1,
1650
+ stdout: `Subcomando de local desconocido: ${sub}
1651
+
1652
+ ${HELP}`
1653
+ };
1654
+ }
1655
+ const config = await deps.loadConfig(configPath);
1656
+ if (sub === "status") {
1657
+ return { exitCode: 0, stdout: showLocal(config).message };
1658
+ }
1659
+ const outcome = sub === "off" ? setFrontierOnly(config) : setLocalFirst(config);
1660
+ if (outcome.config !== undefined) {
1661
+ await deps.saveConfig(outcome.config, configPath);
1662
+ }
1663
+ return { exitCode: 0, stdout: outcome.message };
1664
+ }
1585
1665
  async function runYolo(positionals, deps, opencodeConfigPath) {
1586
1666
  const sub = positionals[1] ?? "status";
1587
1667
  if (sub !== "status" && sub !== "on" && sub !== "off") {
@@ -1666,6 +1746,9 @@ async function runCli(argv, deps) {
1666
1746
  if (command === "baseline") {
1667
1747
  return await runBaseline(parsed.positionals, deps, configPath);
1668
1748
  }
1749
+ if (command === "local") {
1750
+ return await runLocal(parsed.positionals, deps, configPath);
1751
+ }
1669
1752
  if (command === "yolo") {
1670
1753
  return await runYolo(parsed.positionals, deps, opencodeConfigPath);
1671
1754
  }
@@ -2121,6 +2204,9 @@ function chooseModel(input) {
2121
2204
  if (override === "alwaysFrontier") {
2122
2205
  return finalizeDecision(input, tier, frontier, budgetAction, decision(frontier.model, "frontier", ["explicit-always-frontier"], []));
2123
2206
  }
2207
+ if (input.config.router.frontierOnly) {
2208
+ return finalizeDecision(input, tier, frontier, budgetAction, decision(frontier.model, "frontier", ["router-frontier-only"], []));
2209
+ }
2124
2210
  const shortEnoughForLocal = input.task.promptChars <= input.config.router.trivialPromptMaxChars;
2125
2211
  const largeEnoughForFrontier = input.task.promptChars >= input.config.router.frontierPromptMinChars;
2126
2212
  if (!input.task.hasCode && shortEnoughForLocal && !largeEnoughForFrontier) {
@@ -18,6 +18,8 @@ export type RoleTaskInput = {
18
18
  title?: string;
19
19
  systemPrompt?: string;
20
20
  directory?: string;
21
+ /** Correlación opcional con una tarea del loop SDD/backlog (Fase D). */
22
+ taskID?: string;
21
23
  };
22
24
  export type CoordinatorDeps = {
23
25
  client: OpencodeSessionClient;
@@ -31,6 +33,7 @@ export type CorrelatedCostRecord = CostRecord & {
31
33
  agent: string;
32
34
  success: boolean;
33
35
  batchID?: string;
36
+ taskID?: string;
34
37
  failureReason?: string;
35
38
  failureStage?: SubsessionResult["failureStage"];
36
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AA6KF;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,oBAAoB,GAC3B,UAAU,CAqBZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,SAAS,CAkB1B;AA4DD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB3B"}
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAiLF;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,oBAAoB,GAC3B,UAAU,CAyBZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,SAAS,CAkB1B;AA4DD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB3B"}
@@ -0,0 +1,47 @@
1
+ import type { StorageProvider } from "../storage/provider";
2
+ /**
3
+ * Ledger de progreso durable del orquestador.
4
+ *
5
+ * Registra, una línea por tarea, el estado de las tareas ya procesadas para que
6
+ * un flujo largo (loop SDD, `openteam loop`) pueda **reanudarse** tras una
7
+ * compactación de contexto o un reinicio sin repetir trabajo hecho. Vive detrás
8
+ * del `StorageProvider` (misma fuente de verdad que roster/decisions/telemetría)
9
+ * y es **privacy-safe**: solo `taskID`, estado y un `detail` ya redactado; nunca
10
+ * prompts ni datos sensibles.
11
+ *
12
+ * Formato de línea (Markdown, inspirado en obra/superpowers):
13
+ * `- <taskID>: complete (<detail>)`
14
+ * `- <taskID>: failed (<detail>)`
15
+ *
16
+ * Las funciones de parse/format son puras; el I/O se hace vía un
17
+ * `StorageProvider` inyectado.
18
+ */
19
+ /** Ruta por defecto del ledger (estado derivado del equipo). */
20
+ export declare const DEFAULT_LEDGER_PATH = ".opencode/openteam/progress.md";
21
+ export type LedgerStatus = "complete" | "failed";
22
+ export type LedgerEntry = {
23
+ taskID: string;
24
+ status: LedgerStatus;
25
+ /** Metadatos redactados (modelo, tier, resultado de review). Nunca prompts. */
26
+ detail?: string;
27
+ };
28
+ /** Serializa una entrada a su línea Markdown canónica. Puro. */
29
+ export declare function formatLedgerEntry(entry: LedgerEntry): string;
30
+ /** Parsea una línea; `undefined` si no es una entrada de ledger válida. Puro. */
31
+ export declare function parseLedgerLine(line: string): LedgerEntry | undefined;
32
+ /** Parsea todo el ledger, saltando cabeceras/blancos/líneas inválidas. Puro. */
33
+ export declare function parseLedger(text: string): LedgerEntry[];
34
+ /**
35
+ * Estado más reciente por `taskID` (las líneas posteriores sobrescriben a las
36
+ * anteriores: un `failed` seguido de `complete` cuenta como `complete`). Puro.
37
+ */
38
+ export declare function latestStatuses(entries: readonly LedgerEntry[]): Map<string, LedgerStatus>;
39
+ /** `true` si el último estado registrado para la tarea es `complete`. Puro. */
40
+ export declare function isTaskComplete(entries: readonly LedgerEntry[], taskID: string): boolean;
41
+ /** Conjunto de `taskID` cuyo estado más reciente es `complete`. Puro. */
42
+ export declare function completedTaskIDs(entries: readonly LedgerEntry[]): Set<string>;
43
+ /** Lee y parsea el ledger; `[]` si el fichero no existe. */
44
+ export declare function readLedger(storage: StorageProvider, path?: string): Promise<LedgerEntry[]>;
45
+ /** Añade una entrada al ledger (crea el fichero si no existe). */
46
+ export declare function appendLedgerEntry(storage: StorageProvider, entry: LedgerEntry, path?: string): Promise<void>;
47
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AAEH,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAM5D;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAgBrE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CASvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAM3B;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,MAAM,EAAE,MAAM,GACb,OAAO,CAET;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAQ7E;AAED,4DAA4D;AAC5D,wBAAsB,UAAU,CAC9B,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC,CAGxB;AAED,kEAAkE;AAClE,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/orchestrator/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,eAAe,GACf,aAAa,GACb,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAO7D,CAAC;AASF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,cAAc,EAAE,GACtB,cAAc,CAKhB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CASvC"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/orchestrator/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,eAAe,GACf,aAAa,GACb,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAQ7D,CAAC;AASF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,cAAc,EAAE,GACtB,cAAc,CAKhB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CASvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/orchestrator/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,cAAc,CAAC;IAC5B,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,yBAAyB,EAAE,OAAO,CAAC;IACnC,oBAAoB,EAAE,cAAc,EAAE,CAAC;IACvC,uBAAuB,EAAE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;IACxD,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAeF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;iBAYjC,CAAC;AAGH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAqExD,CAAC;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE3E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,qBAAqB,CAevB"}
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/orchestrator/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,cAAc,CAAC;IAC5B,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,yBAAyB,EAAE,OAAO,CAAC;IACnC,oBAAoB,EAAE,cAAc,EAAE,CAAC;IACvC,uBAAuB,EAAE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;IACxD,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAeF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;iBAYjC,CAAC;AAGH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAgFxD,CAAC;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE3E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,qBAAqB,CAevB"}
@@ -0,0 +1,90 @@
1
+ import type { OpenTeamConfig } from "../config/schema";
2
+ import type { TaskSignals } from "../router/types";
3
+ import type { StorageProvider } from "../storage/provider";
4
+ import { type CoordinatorDeps, type RoleTaskResult } from "./coordinator";
5
+ /**
6
+ * Loop de **subagent-driven-development** (SDD), adaptado de obra/superpowers al
7
+ * boundary de openteam. Por cada tarea:
8
+ *
9
+ * 1. Reanuda desde el ledger: si la tarea ya está `complete`, la salta.
10
+ * 2. Persiste un **task brief** como fichero (higiene de contexto: el
11
+ * implementer recibe solo su tarea, no el historial acumulado).
12
+ * 3. Despacha el **implementer** con el brief.
13
+ * 4. Despacha el **reviewer** (rol con alto code-quality) para revisar el
14
+ * cambio; la generación del diff vive en el propio agente reviewer.
15
+ * 5. Si el veredicto pide arreglos, despacha **UN** fix subagent con TODOS los
16
+ * findings (no uno por finding), con un número de rondas acotado.
17
+ * 6. Escribe el resultado en el ledger durable.
18
+ *
19
+ * Es una capa de orquestación **inyectable y determinista**: cliente opencode,
20
+ * storage, reloj, generadores de id y el intérprete de review se inyectan, así
21
+ * que se prueba con fakes/memory provider. No hace I/O de git ni shell: los
22
+ * artefactos persistidos son metadatos **redactados** (nunca prompts ni la
23
+ * respuesta cruda del modelo).
24
+ */
25
+ /** Directorio de artefactos del loop SDD (estado derivado). */
26
+ export declare const DEFAULT_SDD_WORKSPACE_DIR = ".opencode/openteam/sdd";
27
+ /** Rol reviewer por defecto. */
28
+ export declare const DEFAULT_REVIEWER_ROLE_ID = "reviewer";
29
+ export type SddTask = {
30
+ /** Id estable y sin `:` (kebab-case) usado para ledger y artefactos. */
31
+ id: string;
32
+ /** Rol que implementa (y arregla) la tarea. */
33
+ implementerRoleID: string;
34
+ /** Título humano corto. */
35
+ title: string;
36
+ /** Brief accionable de la tarea (cuerpo del prompt del implementer). */
37
+ brief: string;
38
+ /** Señales de routing para la tarea. */
39
+ task: TaskSignals;
40
+ /** Rol reviewer específico (sobreescribe `deps.reviewerRoleID`). */
41
+ reviewerRoleID?: string;
42
+ };
43
+ export type ReviewVerdict = {
44
+ needsFix: boolean;
45
+ /** Resumen redactado de findings para el fix dispatch. */
46
+ findings?: string;
47
+ };
48
+ export type SddDeps = CoordinatorDeps & {
49
+ storage: StorageProvider;
50
+ config: OpenTeamConfig;
51
+ workspaceDir?: string;
52
+ ledgerPath?: string;
53
+ reviewerRoleID?: string;
54
+ interpretReview?: (review: RoleTaskResult) => ReviewVerdict;
55
+ /** Máximo de rondas de fix+re-review (def: 1). */
56
+ maxFixRounds?: number;
57
+ parentSessionID?: string;
58
+ directory?: string;
59
+ };
60
+ export type SddTaskStatus = "complete" | "failed" | "skipped";
61
+ export type SddTaskOutcome = {
62
+ taskID: string;
63
+ status: SddTaskStatus;
64
+ implement?: RoleTaskResult;
65
+ review?: RoleTaskResult;
66
+ fixes: RoleTaskResult[];
67
+ };
68
+ export type SddPlanResult = {
69
+ outcomes: SddTaskOutcome[];
70
+ completed: string[];
71
+ failed: string[];
72
+ skipped: string[];
73
+ };
74
+ /** Extrae texto de una respuesta opaca del modelo (best-effort). Puro. */
75
+ export declare function extractResponseText(response: unknown): string;
76
+ /**
77
+ * Veredicto por defecto: escanea el texto de la review en busca de marcadores de
78
+ * severidad. Conservador y determinista; los llamadores pueden inyectar su
79
+ * propio intérprete vía `deps.interpretReview`.
80
+ */
81
+ export declare function defaultReviewVerdict(review: RoleTaskResult): ReviewVerdict;
82
+ /** Ejecuta una única tarea del loop SDD (con reanudación desde el ledger). */
83
+ export declare function runSddTask(task: SddTask, deps: SddDeps): Promise<SddTaskOutcome>;
84
+ /**
85
+ * Ejecuta un plan SDD **en orden** (las tareas son secuenciales por diseño; la
86
+ * paralelización de tareas independientes es otra capa). Reanuda saltando las ya
87
+ * completas y resume el resultado por estado.
88
+ */
89
+ export declare function runSddPlan(tasks: readonly SddTask[], deps: SddDeps): Promise<SddPlanResult>;
90
+ //# sourceMappingURL=sdd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdd.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sdd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,cAAc,EAEpB,MAAM,eAAe,CAAC;AASvB;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,gCAAgC;AAChC,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAEnD,MAAM,MAAM,OAAO,GAAG;IACpB,wEAAwE;IACxE,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,EAAE,WAAW,CAAC;IAClB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,eAAe,GAAG;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,aAAa,CAAC;IAC5D,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AA2FF,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAuB7D;AAKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,CAO1E;AAuBD,8EAA8E;AAC9E,wBAAsB,UAAU,CAC9B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,CAyHzB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,aAAa,CAAC,CAoBxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"chooseModel.d.ts","sourceRoot":"","sources":["../../src/router/chooseModel.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAIV,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAoXjB,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAoHhE"}
1
+ {"version":3,"file":"chooseModel.d.ts","sourceRoot":"","sources":["../../src/router/chooseModel.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAIV,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAoXjB,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CA8HhE"}
@@ -42,6 +42,7 @@ export declare const RouteEventSchema: z.ZodObject<{
42
42
  agent: z.ZodOptional<z.ZodString>;
43
43
  success: z.ZodOptional<z.ZodBoolean>;
44
44
  batchID: z.ZodOptional<z.ZodString>;
45
+ taskID: z.ZodOptional<z.ZodString>;
45
46
  failureReason: z.ZodOptional<z.ZodString>;
46
47
  failureStage: z.ZodOptional<z.ZodString>;
47
48
  }, z.core.$strip>;
@@ -162,6 +163,7 @@ export declare const OpenTeamEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
162
163
  agent: z.ZodOptional<z.ZodString>;
163
164
  success: z.ZodOptional<z.ZodBoolean>;
164
165
  batchID: z.ZodOptional<z.ZodString>;
166
+ taskID: z.ZodOptional<z.ZodString>;
165
167
  failureReason: z.ZodOptional<z.ZodString>;
166
168
  failureStage: z.ZodOptional<z.ZodString>;
167
169
  }, z.core.$strip>, z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAW/C,yEAAyE;AACzE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAC;AAEH,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AAEH,sEAAsE;AACtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAS9B,CAAC;AAEH,iEAAiE;AACjE,eAAO,MAAM,kBAAkB;;;;;;;;;iBAM7B,CAAC;AAEH,yEAAyE;AACzE,eAAO,MAAM,mBAAmB;;;;;;;;iBAK9B,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;iBAK9B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;iBAMrC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAW/C,yEAAyE;AACzE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqB3B,CAAC;AAEH,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AAEH,sEAAsE;AACtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAS9B,CAAC;AAEH,iEAAiE;AACjE,eAAO,MAAM,kBAAkB;;;;;;;;;iBAM7B,CAAC;AAEH,yEAAyE;AACzE,eAAO,MAAM,mBAAmB;;;;;;;;iBAK9B,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;iBAK9B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;iBAMrC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmanuelcorral/openteam",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "description": "Plugin opencode de routing coste-consciente local-first con orquestación Squad.",
5
5
  "license": "MIT",
6
6
  "author": "Jose Manuel Corral",