@jmanuelcorral/openteam 0.1.35 → 0.1.37

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([
@@ -3945,6 +3947,60 @@ function renderDoctor(input) {
3945
3947
  `);
3946
3948
  }
3947
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
+
3948
4004
  // src/commands/orchestratorAgent.ts
3949
4005
  var ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
3950
4006
  function buildOrchestratorAgent(frontier, options = {}) {
@@ -4180,6 +4236,9 @@ var HELP = [
4180
4236
  " openteam baseline show Muestra el baseline efectivo",
4181
4237
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
4182
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",
4183
4242
  " openteam doctor Diagnóstico de runtimes y config",
4184
4243
  " openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
4185
4244
  " openteam console Lanza la Console web multi-sesión (Ctrl+C para parar; --open abre el navegador)",
@@ -4262,6 +4321,26 @@ async function runBaseline(positionals, deps, configPath) {
4262
4321
  ${HELP}`
4263
4322
  };
4264
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
+ }
4265
4344
  async function runYolo(positionals, deps, opencodeConfigPath) {
4266
4345
  const sub = positionals[1] ?? "status";
4267
4346
  if (sub !== "status" && sub !== "on" && sub !== "off") {
@@ -4346,6 +4425,9 @@ async function runCli(argv, deps) {
4346
4425
  if (command === "baseline") {
4347
4426
  return await runBaseline(parsed.positionals, deps, configPath);
4348
4427
  }
4428
+ if (command === "local") {
4429
+ return await runLocal(parsed.positionals, deps, configPath);
4430
+ }
4349
4431
  if (command === "yolo") {
4350
4432
  return await runYolo(parsed.positionals, deps, opencodeConfigPath);
4351
4433
  }
@@ -4394,9 +4476,6 @@ ${HELP}`
4394
4476
  }
4395
4477
  }
4396
4478
 
4397
- // src/commands/setup.ts
4398
- import { join as join2 } from "node:path";
4399
-
4400
4479
  // src/config/persist.ts
4401
4480
  var DEFAULT_CONFIG_PATH = ".opencode/openteam.json";
4402
4481
  function serializeOpenTeamConfig(config) {
@@ -4552,7 +4631,8 @@ function buildOpenTeamConfig(answers) {
4552
4631
  },
4553
4632
  router: {
4554
4633
  mode: answers.routerMode,
4555
- localDefault
4634
+ localDefault,
4635
+ frontierOnly: primaryLocal === undefined
4556
4636
  },
4557
4637
  local: { runtimes },
4558
4638
  privacyMode: answers.privacyMode
@@ -4879,9 +4959,9 @@ async function runSetup(deps) {
4879
4959
  const opencodeConfig = buildOpencodeConfig(answers);
4880
4960
  const orchestratorAgent = buildOrchestratorAgent(frontier, { yolo });
4881
4961
  const slashCommands = buildOpenteamCommands();
4882
- const openTeamPath = join2(deps.cwd, DEFAULT_CONFIG_PATH);
4883
- const opencodePath = join2(deps.cwd, OPENCODE_CONFIG_PATH);
4884
- const agentPath = join2(deps.cwd, ORCHESTRATOR_AGENT_PATH);
4962
+ const openTeamPath = DEFAULT_CONFIG_PATH;
4963
+ const opencodePath = OPENCODE_CONFIG_PATH;
4964
+ const agentPath = ORCHESTRATOR_AGENT_PATH;
4885
4965
  const existing = [];
4886
4966
  if (await deps.fileExists(openTeamPath)) {
4887
4967
  existing.push(DEFAULT_CONFIG_PATH);
@@ -4893,7 +4973,7 @@ async function runSetup(deps) {
4893
4973
  existing.push(ORCHESTRATOR_AGENT_PATH);
4894
4974
  }
4895
4975
  for (const command of slashCommands) {
4896
- if (await deps.fileExists(join2(deps.cwd, command.path))) {
4976
+ if (await deps.fileExists(command.path)) {
4897
4977
  existing.push(command.path);
4898
4978
  }
4899
4979
  }
@@ -4911,7 +4991,7 @@ async function runSetup(deps) {
4911
4991
  await deps.writeFile(opencodePath, serializeOpencodeConfig(opencodeConfig));
4912
4992
  await deps.writeFile(agentPath, orchestratorAgent);
4913
4993
  for (const command of slashCommands) {
4914
- await deps.writeFile(join2(deps.cwd, command.path), command.contents);
4994
+ await deps.writeFile(command.path, command.contents);
4915
4995
  }
4916
4996
  const enabledSummary = runtimes.filter((runtime) => runtime.enabled).map((runtime) => {
4917
4997
  const remote = runtime.baseURL !== undefined && !runtime.baseURL.includes("localhost") && !runtime.baseURL.includes("127.0.0.1") ? ` @ ${runtime.baseURL}` : "";
@@ -5258,7 +5338,6 @@ var deps = {
5258
5338
  };
5259
5339
  function createSetupDeps() {
5260
5340
  return {
5261
- cwd: process.cwd(),
5262
5341
  detect: createDetect(nodeExec),
5263
5342
  probeRuntime: createProbeRuntime(nodeExec),
5264
5343
  loadFrontierProfiles: createLoadFrontierProfiles(),
@@ -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"}
@@ -123,7 +123,6 @@ export type Prompter = {
123
123
  }): Promise<string>;
124
124
  };
125
125
  export type SetupDeps = {
126
- cwd: string;
127
126
  detect: () => Promise<DetectedRuntime[]>;
128
127
  /**
129
128
  * Sondea un runtime local en una `baseURL` concreta (p.ej. otra máquina de la
@@ -133,6 +132,7 @@ export type SetupDeps = {
133
132
  probeRuntime?: (id: LocalRuntimeId, baseURL: string) => Promise<DetectedRuntime>;
134
133
  loadFrontierProfiles: () => Promise<ModelCapabilityProfile[]>;
135
134
  prompt: Prompter;
135
+ /** Rutas relativas a la raíz del proyecto (el storage ya está rooteado en el cwd). */
136
136
  writeFile: (path: string, contents: string) => Promise<void>;
137
137
  fileExists: (path: string) => Promise<boolean>;
138
138
  };
@@ -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([
@@ -1384,6 +1386,60 @@ function renderDoctor(input) {
1384
1386
  `);
1385
1387
  }
1386
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
+
1387
1443
  // src/commands/report.ts
1388
1444
  var TIERS = [
1389
1445
  "trivial",
@@ -1501,6 +1557,9 @@ var HELP = [
1501
1557
  " openteam baseline show Muestra el baseline efectivo",
1502
1558
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
1503
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",
1504
1563
  " openteam doctor Diagnóstico de runtimes y config",
1505
1564
  " openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
1506
1565
  " openteam console Lanza la Console web multi-sesión (Ctrl+C para parar; --open abre el navegador)",
@@ -1583,6 +1642,26 @@ async function runBaseline(positionals, deps, configPath) {
1583
1642
  ${HELP}`
1584
1643
  };
1585
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
+ }
1586
1665
  async function runYolo(positionals, deps, opencodeConfigPath) {
1587
1666
  const sub = positionals[1] ?? "status";
1588
1667
  if (sub !== "status" && sub !== "on" && sub !== "off") {
@@ -1667,6 +1746,9 @@ async function runCli(argv, deps) {
1667
1746
  if (command === "baseline") {
1668
1747
  return await runBaseline(parsed.positionals, deps, configPath);
1669
1748
  }
1749
+ if (command === "local") {
1750
+ return await runLocal(parsed.positionals, deps, configPath);
1751
+ }
1670
1752
  if (command === "yolo") {
1671
1753
  return await runYolo(parsed.positionals, deps, opencodeConfigPath);
1672
1754
  }
@@ -2122,6 +2204,9 @@ function chooseModel(input) {
2122
2204
  if (override === "alwaysFrontier") {
2123
2205
  return finalizeDecision(input, tier, frontier, budgetAction, decision(frontier.model, "frontier", ["explicit-always-frontier"], []));
2124
2206
  }
2207
+ if (input.config.router.frontierOnly) {
2208
+ return finalizeDecision(input, tier, frontier, budgetAction, decision(frontier.model, "frontier", ["router-frontier-only"], []));
2209
+ }
2125
2210
  const shortEnoughForLocal = input.task.promptChars <= input.config.router.trivialPromptMaxChars;
2126
2211
  const largeEnoughForFrontier = input.task.promptChars >= input.config.router.frontierPromptMinChars;
2127
2212
  if (!input.task.hasCode && shortEnoughForLocal && !largeEnoughForFrontier) {
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmanuelcorral/openteam",
3
- "version": "0.1.35",
3
+ "version": "0.1.37",
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",