@jmanuelcorral/openteam 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.es.md CHANGED
@@ -366,11 +366,13 @@ ejecutas desde un subdirectorio verás "provider not configured" y debes hacer
366
366
  | `router.trivialPromptMaxChars` | `number` entero positivo | `280` | Prompts sin código hasta este tamaño prefieren local. |
367
367
  | `router.frontierPromptMinChars` | `number` entero positivo | `2000` | Prompts desde este tamaño se tratan como candidatos a frontier si no aplican guards. |
368
368
  | `local.runtimes` | `LocalRuntime[]` | `[]` | Runtimes locales a sondear. Vacío por defecto — ningún runtime está configurado hasta que ejecutes `openteam setup` o añadas una entrada manualmente. |
369
- | `local.runtimes[].id` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` | requerido | Runtime local. |
369
+ | `local.runtimes[].id` | `string` | requerido | Identidad de instancia, única dentro del array. Libre (`lmstudio-a`, `lemonade-lan`) para que dos máquinas del mismo tipo sean distintas; si se omite `kind`, debe ser en sí mismo un tipo de runtime (retrocompatibilidad). |
370
+ | `local.runtimes[].kind` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` opcional | migra desde `id` | Tipo de runtime que selecciona el adaptador. Opcional: si falta, se usa `id` como tipo, así toda config previa sigue funcionando sin cambios. |
370
371
  | `local.runtimes[].enabled` | `boolean` | `true` | Habilita o deshabilita ese runtime. |
371
372
  | `local.runtimes[].baseURL` | URL opcional | según runtime/config | Endpoint OpenAI-compatible (`/v1` para Ollama/LM Studio, `/api/v1` para Lemonade); Foundry Local puede omitirlo si usa discovery. |
372
373
  | `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` opcional | sin default por item | Discovery de Foundry Local; el registry usa CLI si está configurado y no es `manual`. |
373
374
  | `local.runtimes[].defaultModel` | `ModelRef` | requerido | Modelo por defecto de ese runtime. |
375
+ | `local.runtimes[].maxConcurrency` | entero positivo opcional | `4` | Límite de generaciones concurrentes de esta instancia (su número real de slots). Se aplica por instancia. |
374
376
  | `budgets.sessionUSD` | `number` positivo opcional | sin límite | Presupuesto frontier por sesión. |
375
377
  | `budgets.monthlyUSD` | `number` positivo opcional | sin límite | Presupuesto frontier mensual. |
376
378
  | `budgets.frontierTokensPerSession` | `number` entero positivo opcional | sin límite | Límite de tokens frontier por sesión. |
@@ -822,7 +824,7 @@ Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `
822
824
 
823
825
  | Superficie | Versión / contrato |
824
826
  | --- | --- |
825
- | openteam | `0.13.0`; versión actual del paquete |
827
+ | openteam | `0.14.0`; versión actual del paquete |
826
828
  | `@opencode-ai/plugin` | `1.18.19` |
827
829
  | `@opencode-ai/sdk` | `1.18.19` |
828
830
  | Hook de routing | `chat.message`; no `chat.params` para cambiar modelo |
package/README.md CHANGED
@@ -318,11 +318,13 @@ configured" and should `cd` to the project root first.
318
318
  | `router.trivialPromptMaxChars` | positive integer | `280` | Code-free prompts up to this size prefer local. |
319
319
  | `router.frontierPromptMinChars` | positive integer | `2000` | Prompts from this size are frontier candidates if no guards apply. |
320
320
  | `local.runtimes` | `LocalRuntime[]` | `[]` | Local runtimes to probe. Empty by default — no runtime is configured until you run `openteam setup` or add an entry by hand. |
321
- | `local.runtimes[].id` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` | required | Local runtime. |
321
+ | `local.runtimes[].id` | string | required | Instance identity, unique within the array. Free-form (`lmstudio-a`, `lemonade-lan`) so two machines of the same kind are distinct; when `kind` is omitted it must itself be a runtime kind (back-compat). |
322
+ | `local.runtimes[].kind` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` optional | migrates from `id` | Runtime kind selecting the adapter. Optional: when absent, `id` is treated as the kind, so pre-existing configs keep working unchanged. |
322
323
  | `local.runtimes[].enabled` | `boolean` | `true` | Enable or disable that runtime. |
323
324
  | `local.runtimes[].baseURL` | optional URL | per runtime/config | OpenAI-compatible endpoint (`/v1` for Ollama/LM Studio, `/api/v1` for Lemonade); Foundry Local may omit it when using discovery. |
324
325
  | `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` optional | none per item | Foundry Local discovery; the registry uses CLI when configured and not `manual`. |
325
326
  | `local.runtimes[].defaultModel` | `ModelRef` | required | Default model for that runtime. |
327
+ | `local.runtimes[].maxConcurrency` | positive integer, optional | `4` | Concurrent-generation cap for this instance (its real slot count). Applied per instance. |
326
328
  | `budgets.sessionUSD` | positive number, optional | unlimited | Frontier budget per session. |
327
329
  | `budgets.monthlyUSD` | positive number, optional | unlimited | Monthly frontier budget. |
328
330
  | `budgets.frontierTokensPerSession` | positive integer, optional | unlimited | Frontier token limit per session. |
@@ -711,7 +713,7 @@ See [docs/compatibility.md](docs/compatibility.md). Verified summary as of `2026
711
713
 
712
714
  | Surface | Version / contract |
713
715
  | --- | --- |
714
- | openteam | `0.13.0`; current package version |
716
+ | openteam | `0.14.0`; current package version |
715
717
  | `@opencode-ai/plugin` | `1.18.19` |
716
718
  | `@opencode-ai/sdk` | `1.18.19` |
717
719
  | Routing hook | `chat.message`; not `chat.params` for model changes |
package/dist/cli.js CHANGED
@@ -101,8 +101,8 @@ var AgentRoleProfileSchema = z.object({
101
101
  preferredFrontierModels: z.array(z.union([modelSelectionSchema, z.literal("auto")])),
102
102
  localFirst: z.boolean(),
103
103
  requiresLocalRuntime: z.boolean().optional(),
104
- localRuntimes: z.array(z.enum(["ollama", "lmstudio", "foundry-local", "lemonade"])).optional(),
105
- localModels: z.partialRecord(z.enum(["ollama", "lmstudio", "foundry-local", "lemonade"]), z.string().min(1)).optional()
104
+ localRuntimes: z.array(z.string().min(1)).optional(),
105
+ localModels: z.record(z.string().min(1), z.string().min(1)).optional()
106
106
  }).strict();
107
107
  var TEAM_ROLES = {
108
108
  architect: {
@@ -409,14 +409,33 @@ var defaultFrontierModel = {
409
409
  modelID: "claude-sonnet-4-5"
410
410
  };
411
411
  var DEFAULT_LOCAL_MAX_CONCURRENCY = 4;
412
+ var LocalRuntimeKindSchema = z2.enum([
413
+ "ollama",
414
+ "lmstudio",
415
+ "foundry-local",
416
+ "lemonade"
417
+ ]);
412
418
  var LocalRuntimeSchema = z2.object({
413
- id: z2.enum(["ollama", "lmstudio", "foundry-local", "lemonade"]),
419
+ id: z2.string().min(1),
420
+ kind: LocalRuntimeKindSchema.optional(),
414
421
  enabled: z2.boolean().default(true),
415
422
  baseURL: z2.string().url().optional(),
416
423
  discovery: z2.enum(["cli", "sdk", "manual"]).optional(),
417
424
  defaultModel: ModelRefSchema,
418
425
  maxConcurrency: z2.number().int().positive().optional()
419
- }).strict();
426
+ }).strict().superRefine((runtime, ctx) => {
427
+ const resolvedKind = runtime.kind ?? runtime.id;
428
+ if (!LocalRuntimeKindSchema.safeParse(resolvedKind).success) {
429
+ ctx.addIssue({
430
+ code: z2.ZodIssueCode.custom,
431
+ path: ["kind"],
432
+ message: `local runtime "${runtime.id}" has no resolvable kind: add "kind" ` + "(one of ollama, lmstudio, foundry-local, lemonade), since the id is " + "not itself a runtime kind."
433
+ });
434
+ }
435
+ });
436
+ function localRuntimeKind(runtime) {
437
+ return runtime.kind ?? runtime.id;
438
+ }
420
439
  var MemoryScopeSchema = z2.enum(["project", "user"]);
421
440
  var MemoryExtractionModeSchema = z2.enum([
422
441
  "local",
@@ -498,7 +517,23 @@ var OpenTeamConfigObjectSchema = z2.object({
498
517
  localOnly: false
499
518
  }),
500
519
  local: z2.object({
501
- runtimes: z2.array(LocalRuntimeSchema).default([])
520
+ runtimes: z2.array(LocalRuntimeSchema).default([]).superRefine((runtimes, ctx) => {
521
+ const seen = new Set;
522
+ for (let index = 0;index < runtimes.length; index += 1) {
523
+ const runtime = runtimes[index];
524
+ if (runtime === undefined) {
525
+ continue;
526
+ }
527
+ if (seen.has(runtime.id)) {
528
+ ctx.addIssue({
529
+ code: z2.ZodIssueCode.custom,
530
+ path: [index, "id"],
531
+ message: `duplicate local runtime id "${runtime.id}": each local.runtimes[].id must be unique within the array.`
532
+ });
533
+ }
534
+ seen.add(runtime.id);
535
+ }
536
+ })
502
537
  }).strict().default({
503
538
  runtimes: []
504
539
  }),
@@ -1130,6 +1165,16 @@ var MeetingEventSchema = EventBaseSchema.extend({
1130
1165
  roles: z4.array(z4.string().min(1)),
1131
1166
  decisionIDs: z4.array(z4.string().min(1)).optional()
1132
1167
  });
1168
+ var QueueEventSchema = EventBaseSchema.extend({
1169
+ type: z4.literal("queue"),
1170
+ runtimeId: z4.string().min(1),
1171
+ waitedMs: z4.number().finite().min(0),
1172
+ activeCount: z4.number().int().min(0),
1173
+ queuedCount: z4.number().int().min(0),
1174
+ decisionID: z4.string().min(1).optional(),
1175
+ agent: z4.string().min(1).optional(),
1176
+ batchID: z4.string().min(1).optional()
1177
+ });
1133
1178
  var DecisionEventSchema = EventBaseSchema.extend({
1134
1179
  type: z4.literal("decision"),
1135
1180
  agent: z4.string().min(1).optional(),
@@ -1175,6 +1220,7 @@ var OpenTeamEventSchema = z4.discriminatedUnion("type", [
1175
1220
  MessageEventSchema,
1176
1221
  ToolcallEventSchema,
1177
1222
  MeetingEventSchema,
1223
+ QueueEventSchema,
1178
1224
  DecisionEventSchema,
1179
1225
  ActivityEventSchema,
1180
1226
  SessionEndpointEventSchema,
@@ -1442,6 +1488,9 @@ async function readRouteCostRecords(dir, deps) {
1442
1488
  async function readDiagnosticEvents(dir, deps) {
1443
1489
  return (await readSessionEvents(dir, deps)).filter((event) => event.type === "diagnostic");
1444
1490
  }
1491
+ async function readQueueEvents(dir, deps) {
1492
+ return (await readSessionEvents(dir, deps)).filter((event) => event.type === "queue");
1493
+ }
1445
1494
  async function readSessionEvents(dir, deps) {
1446
1495
  const files = (await deps.storage.list(dir)).filter((file) => file.endsWith(".jsonl"));
1447
1496
  const perFile = await Promise.all(files.map(async (file) => {
@@ -2118,6 +2167,28 @@ async function safeEmit(sink, event) {
2118
2167
  await sink.emit(event);
2119
2168
  } catch {}
2120
2169
  }
2170
+ function buildQueueEvent(observation, sessionID, ts, correlation) {
2171
+ const event = {
2172
+ v: EVENT_SCHEMA_VERSION,
2173
+ type: "queue",
2174
+ ts,
2175
+ sessionID,
2176
+ runtimeId: observation.runtimeId,
2177
+ waitedMs: observation.waitedMs,
2178
+ activeCount: observation.activeCount,
2179
+ queuedCount: observation.queuedCount
2180
+ };
2181
+ if (correlation.decisionID !== undefined) {
2182
+ event.decisionID = correlation.decisionID;
2183
+ }
2184
+ if (correlation.agent !== undefined) {
2185
+ event.agent = correlation.agent;
2186
+ }
2187
+ if (correlation.batchID !== undefined) {
2188
+ event.batchID = correlation.batchID;
2189
+ }
2190
+ return event;
2191
+ }
2121
2192
  async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
2122
2193
  if (getRoleProfile(input.roleID, input.config.orchestrator?.roles) === undefined) {
2123
2194
  warnUnknownRole(input.roleID, deps.warn, deps.warnedRoles);
@@ -2155,16 +2226,40 @@ async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
2155
2226
  const subsessionDeps = deps.timeoutMs === undefined ? {} : { timeoutMs: deps.timeoutMs };
2156
2227
  const runtimeId = selection.runtimeId;
2157
2228
  let release;
2229
+ let queueObservation;
2158
2230
  if (runtimeId !== undefined && deps.runtimeLimiter !== undefined) {
2159
- release = deps.runtimeLimiter.tryAcquire(runtimeId);
2231
+ const limiter = deps.runtimeLimiter;
2232
+ release = limiter.tryAcquire(runtimeId);
2233
+ let waitedMs = 0;
2160
2234
  if (release === undefined) {
2161
- release = await deps.runtimeLimiter.acquire(runtimeId);
2162
- }
2235
+ const acquisition = await limiter.acquire(runtimeId);
2236
+ release = acquisition.release;
2237
+ waitedMs = acquisition.waitedMs;
2238
+ }
2239
+ queueObservation = {
2240
+ runtimeId,
2241
+ waitedMs,
2242
+ activeCount: limiter.activeCount(runtimeId),
2243
+ queuedCount: limiter.queuedCount(runtimeId)
2244
+ };
2163
2245
  }
2164
2246
  try {
2165
2247
  const subsession = await runSubsession(deps.client, request, subsessionDeps);
2166
2248
  const record = buildRecord(input, decision2, subsession, deps, correlation.decisionID, correlation.batchID);
2167
2249
  await safeEmit(deps.sink, correlatedCostRecordToRouteEvent(record));
2250
+ if (queueObservation !== undefined) {
2251
+ const sessionID = recordSessionID(input, subsession);
2252
+ if (sessionID !== undefined) {
2253
+ const queueCorrelation = {
2254
+ decisionID: correlation.decisionID,
2255
+ agent: input.roleID
2256
+ };
2257
+ if (correlation.batchID !== undefined) {
2258
+ queueCorrelation.batchID = correlation.batchID;
2259
+ }
2260
+ await safeEmit(deps.sink, buildQueueEvent(queueObservation, sessionID, deps.now(), queueCorrelation));
2261
+ }
2262
+ }
2168
2263
  return { decision: decision2, subsession, record };
2169
2264
  } finally {
2170
2265
  release?.();
@@ -2940,6 +3035,7 @@ var KNOWN_CONFIG_KEYS_BY_PATH = new Map([
2940
3035
  "local.runtimes[]",
2941
3036
  [
2942
3037
  "id",
3038
+ "kind",
2943
3039
  "enabled",
2944
3040
  "baseURL",
2945
3041
  "discovery",
@@ -9880,10 +9976,11 @@ class RuntimeRegistry {
9880
9976
  continue;
9881
9977
  }
9882
9978
  const probedAt = this.clock();
9883
- const adapter = this.adapters[runtime.id];
9979
+ const adapter = this.adapters[localRuntimeKind(runtime)];
9884
9980
  const options = this.createProbeOptions(runtime, probedAt);
9885
9981
  try {
9886
- snapshots.push(await adapter.probe(options));
9982
+ const snapshot = await adapter.probe(options);
9983
+ snapshots.push({ ...snapshot, id: runtime.id });
9887
9984
  } catch (error) {
9888
9985
  snapshots.push(unavailableSnapshot({
9889
9986
  id: runtime.id,
@@ -9903,7 +10000,7 @@ class RuntimeRegistry {
9903
10000
  if (runtime.baseURL !== undefined) {
9904
10001
  options.baseURL = runtime.baseURL;
9905
10002
  }
9906
- if (runtime.id === "foundry-local" && runtime.discovery !== "manual" && this.foundryDiscovery !== undefined) {
10003
+ if (localRuntimeKind(runtime) === "foundry-local" && runtime.discovery !== "manual" && this.foundryDiscovery !== undefined) {
9907
10004
  options.discovery = this.foundryDiscovery;
9908
10005
  }
9909
10006
  return options;
@@ -10551,6 +10648,60 @@ function describeOtelBackendForDoctor(config, env) {
10551
10648
  };
10552
10649
  }
10553
10650
 
10651
+ // src/telemetry/queueWait.ts
10652
+ function percentile(sortedAsc, p) {
10653
+ const rank = Math.ceil(p / 100 * sortedAsc.length);
10654
+ const index = Math.min(Math.max(rank, 1), sortedAsc.length) - 1;
10655
+ return sortedAsc[index] ?? 0;
10656
+ }
10657
+ function summarizeGroup(runtimeId, waits, maxQueued, maxActive) {
10658
+ const sorted = [...waits].sort((a, b) => a - b);
10659
+ return {
10660
+ runtimeId,
10661
+ samples: sorted.length,
10662
+ contended: sorted.filter((wait) => wait > 0).length,
10663
+ p50Ms: percentile(sorted, 50),
10664
+ p95Ms: percentile(sorted, 95),
10665
+ maxMs: sorted[sorted.length - 1] ?? 0,
10666
+ maxQueued,
10667
+ maxActive
10668
+ };
10669
+ }
10670
+ function summarizeQueueWaits(events) {
10671
+ if (events.length === 0) {
10672
+ return;
10673
+ }
10674
+ const allWaits = [];
10675
+ let overallMaxQueued = 0;
10676
+ let overallMaxActive = 0;
10677
+ const byRuntime = new Map;
10678
+ for (const event of events) {
10679
+ allWaits.push(event.waitedMs);
10680
+ overallMaxQueued = Math.max(overallMaxQueued, event.queuedCount);
10681
+ overallMaxActive = Math.max(overallMaxActive, event.activeCount);
10682
+ let group = byRuntime.get(event.runtimeId);
10683
+ if (group === undefined) {
10684
+ group = { waits: [], maxQueued: 0, maxActive: 0 };
10685
+ byRuntime.set(event.runtimeId, group);
10686
+ }
10687
+ group.waits.push(event.waitedMs);
10688
+ group.maxQueued = Math.max(group.maxQueued, event.queuedCount);
10689
+ group.maxActive = Math.max(group.maxActive, event.activeCount);
10690
+ }
10691
+ const overall = summarizeGroup("*", allWaits, overallMaxQueued, overallMaxActive);
10692
+ const perRuntime = [...byRuntime.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([runtimeId, group]) => summarizeGroup(runtimeId, group.waits, group.maxQueued, group.maxActive));
10693
+ return {
10694
+ samples: overall.samples,
10695
+ contended: overall.contended,
10696
+ p50Ms: overall.p50Ms,
10697
+ p95Ms: overall.p95Ms,
10698
+ maxMs: overall.maxMs,
10699
+ maxQueued: overall.maxQueued,
10700
+ maxActive: overall.maxActive,
10701
+ perRuntime
10702
+ };
10703
+ }
10704
+
10554
10705
  // src/commands/baseline.ts
10555
10706
  function formatRef(ref) {
10556
10707
  return ref === null ? "—" : `${ref.providerID}/${ref.modelID}`;
@@ -10711,6 +10862,24 @@ function isNetworkRuntime(baseURL) {
10711
10862
  return false;
10712
10863
  }
10713
10864
  }
10865
+ function queueWaitSection(view) {
10866
+ const lines = [" local queue wait (#144, per openteam process):"];
10867
+ const summary = view.summary;
10868
+ if (summary === undefined || summary.samples === 0) {
10869
+ lines.push(" (no queue samples recorded yet — run an orchestrated load, then re-run doctor)");
10870
+ return lines;
10871
+ }
10872
+ const mark = summary.contended > 0 ? "⚠" : "✓";
10873
+ lines.push(` ${mark} ${summary.samples} dispatch(es), ${summary.contended} queued — ` + `p50 ${summary.p50Ms}ms · p95 ${summary.p95Ms}ms · max ${summary.maxMs}ms`);
10874
+ lines.push(` peak depth: ${summary.maxActive} active · ${summary.maxQueued} queued`);
10875
+ for (const runtime of summary.perRuntime) {
10876
+ lines.push(` ${runtime.runtimeId.padEnd(14)} ${runtime.samples} sample(s), ` + `${runtime.contended} queued — p50 ${runtime.p50Ms}ms · p95 ${runtime.p95Ms}ms · ` + `max ${runtime.maxMs}ms · peak ${runtime.maxActive} active/${runtime.maxQueued} queued`);
10877
+ }
10878
+ if (summary.contended > 0) {
10879
+ lines.push(" Lower a runtime's maxConcurrency in .opencode/openteam.json to leave slots for interactive traffic.");
10880
+ }
10881
+ return lines;
10882
+ }
10714
10883
  function failureReasonText(reason, searchedPaths) {
10715
10884
  switch (reason) {
10716
10885
  case "provider-not-configured": {
@@ -10870,6 +11039,20 @@ function rosterHealthSection(audit, loadError, rosterRoleCount) {
10870
11039
  }
10871
11040
  return lines;
10872
11041
  }
11042
+ function gitignoreSection(gitignore) {
11043
+ if (gitignore.missingRules.length === 0) {
11044
+ return [
11045
+ " gitignore:",
11046
+ ` ✓ ${gitignore.path} ignores openteam's generated runtime state.`
11047
+ ];
11048
+ }
11049
+ const quoted = gitignore.missingRules.map((rule) => `\`${rule}\``).join(", ");
11050
+ const lines = [" gitignore:"];
11051
+ lines.push(gitignore.exists ? ` ✗ ${gitignore.path} is missing openteam ignore rule(s): ${gitignore.missingRules.join(", ")}` : ` ✗ ${gitignore.path} does not exist, so no openteam ignore rule(s) are in place: ${gitignore.missingRules.join(", ")}`);
11052
+ lines.push(" problem: openteam writes machine-local runtime output (telemetry, graph state, soak recordings) that must not be committed.");
11053
+ lines.push(` remedy: add ${quoted} to ${gitignore.path} (or re-run \`openteam setup\`), then re-run \`openteam doctor\`.`);
11054
+ return lines;
11055
+ }
10873
11056
  function agentModelsSection(diagnostics, searchedPaths) {
10874
11057
  const lines = [" agent models:"];
10875
11058
  if (diagnostics.length === 0) {
@@ -10913,10 +11096,16 @@ function renderDoctor(input) {
10913
11096
  lines.push(` ⚠ ${snapshot.id} is reached over the network: its ${cap}-slot cap is enforced per openteam process, so`, " two processes at once (an opencode session plus 'openteam console') can together exceed it.");
10914
11097
  }
10915
11098
  lines.push(` telemetry: ${input.telemetryPath} — ${input.telemetryRecords} record(s)`);
11099
+ if (input.queueWait !== undefined) {
11100
+ lines.push(...queueWaitSection(input.queueWait));
11101
+ }
10916
11102
  if (input.diagnostics !== undefined) {
10917
11103
  lines.push(...diagnosticsSection(input.diagnostics));
10918
11104
  }
10919
11105
  lines.push(...rosterHealthSection(input.rosterAudit, input.rosterLoadError, input.rosterRoleCount));
11106
+ if (input.gitignore !== undefined) {
11107
+ lines.push(...gitignoreSection(input.gitignore));
11108
+ }
10920
11109
  if (input.otelBackend !== undefined) {
10921
11110
  const otel = input.otelBackend;
10922
11111
  lines.push(" opentelemetry:");
@@ -11240,6 +11429,12 @@ function mergeOpencodeConfigs(base, override) {
11240
11429
  return result;
11241
11430
  }
11242
11431
 
11432
+ // src/storage/graph/soakRecorder.ts
11433
+ var SOAK_EVIDENCE_DIR = ".opencode/soak";
11434
+ var SOAK_RECORDER_BASE_DIR = ".opencode";
11435
+ var SOAK_RECORDER_ID_FILENAME = "soak-recorder-id";
11436
+ var SOAK_RECORDER_ID_PATH = `${SOAK_RECORDER_BASE_DIR}/${SOAK_RECORDER_ID_FILENAME}`;
11437
+
11243
11438
  // src/commands/frontierCatalog.ts
11244
11439
  function weightedCost(inputUSD, outputUSD) {
11245
11440
  return 0.75 * inputUSD + 0.25 * outputUSD;
@@ -11277,6 +11472,11 @@ var GENERATED_OPENTEAM_STATE_PATHS = [
11277
11472
  DEFAULT_STORAGE_SQLITE_INDEX_PATH,
11278
11473
  DEFAULT_MEMORY_INDEX_PATH
11279
11474
  ];
11475
+ var GENERATED_OPENTEAM_STATE_GROUPS = [
11476
+ { kind: "dir", paths: GENERATED_OPENTEAM_STATE_PATHS },
11477
+ { kind: "dir", paths: [SOAK_EVIDENCE_DIR] },
11478
+ { kind: "file", paths: [SOAK_RECORDER_ID_PATH] }
11479
+ ];
11280
11480
  var OPENCODE_DIR = ".opencode";
11281
11481
  var AGENT_DIR = `${OPENCODE_DIR}/agent`;
11282
11482
  var ROLE_AGENT_DESCRIPTIONS = {
@@ -11347,17 +11547,16 @@ function commonGeneratedStateRoot(paths) {
11347
11547
  }
11348
11548
  return common.join("/");
11349
11549
  }
11350
- function generatedStateIgnoreRule() {
11351
- const root = commonGeneratedStateRoot(GENERATED_OPENTEAM_STATE_PATHS);
11550
+ function generatedStateIgnoreRule(group) {
11551
+ const root = commonGeneratedStateRoot(group.paths);
11352
11552
  const opencodePrefix = `${OPENCODE_DIR}/`;
11353
11553
  if (!root.startsWith(opencodePrefix)) {
11354
11554
  throw new Error(`generated openteam state path is outside ${OPENCODE_DIR}`);
11355
11555
  }
11356
- return `${root.slice(opencodePrefix.length)}/`;
11556
+ const rule = root.slice(opencodePrefix.length);
11557
+ return group.kind === "dir" ? `${rule}/` : rule;
11357
11558
  }
11358
- var OPENCODE_GITIGNORE_GENERATED_STATE_RULES = [
11359
- generatedStateIgnoreRule()
11360
- ];
11559
+ var OPENCODE_GITIGNORE_GENERATED_STATE_RULES = GENERATED_OPENTEAM_STATE_GROUPS.map(generatedStateIgnoreRule);
11361
11560
  var LEGACY_OPENCODE_GITIGNORE_STATE_RULES = ["openteam/"];
11362
11561
  var LEGACY_LOCAL_OPENCODE_GITIGNORE_RULES = [
11363
11562
  "openteam/sessions/",
@@ -11393,6 +11592,13 @@ function buildOpencodeGitignore(existing = "") {
11393
11592
  `)}
11394
11593
  `;
11395
11594
  }
11595
+ function activeGitignoreRules(gitignore) {
11596
+ return gitignore.split(/\r?\n/).map(normalizeGitignoreRule).filter((line) => line.length > 0 && !line.startsWith("#"));
11597
+ }
11598
+ function missingGeneratedStateRules(gitignore) {
11599
+ const present = new Set(activeGitignoreRules(gitignore));
11600
+ return OPENCODE_GITIGNORE_GENERATED_STATE_RULES.filter((rule) => !present.has(rule));
11601
+ }
11396
11602
  var KNOWN_RUNTIMES = [
11397
11603
  {
11398
11604
  id: "ollama",
@@ -11956,7 +12162,7 @@ function resolveStaticPurgeItems(config, paths) {
11956
12162
  ...paths.opencodeConfigPaths.map((p) => ({ kind: "opencode-config", path: p })),
11957
12163
  { kind: "gitignore", path: paths.gitignorePath }
11958
12164
  ],
11959
- roster: [],
12165
+ roster: [{ kind: "file", path: OPENTEAM_ROSTER_PATH }],
11960
12166
  decisions: [
11961
12167
  { kind: "file", path: paths.decisionsPath },
11962
12168
  { kind: "file", path: paths.telemetryPath }
@@ -12248,8 +12454,12 @@ function categoryPrompt(id, items) {
12248
12454
  return "Remove openteam configuration and wiring?";
12249
12455
  case "roster": {
12250
12456
  const names = items.filter((item) => item.kind === "agent").map((item) => item.name);
12251
- const listed = names.join(", ");
12252
- return `Remove the agent roster? (${names.length} user agent${names.length === 1 ? "" : "s"}: ${listed})`;
12457
+ const hasRegistry = items.some((item) => item.kind === "file" && item.path === OPENTEAM_ROSTER_PATH);
12458
+ const plural = names.length === 1 ? "" : "s";
12459
+ const agentNames = names.length > 0 ? `: ${names.join(", ")}` : "";
12460
+ const agentClause = `${names.length} user agent${plural}${agentNames}`;
12461
+ const parts = hasRegistry ? [`roster registry (${OPENTEAM_ROSTER_PATH})`, agentClause] : [agentClause];
12462
+ return `Remove the agent roster? (${parts.join("; ")})`;
12253
12463
  }
12254
12464
  case "decisions":
12255
12465
  return "Remove decisions and telemetry?";
@@ -12311,7 +12521,9 @@ async function collectCategories(input) {
12311
12521
  const { runtime, config, paths } = input;
12312
12522
  const staticItems = resolveStaticPurgeItems(config, paths);
12313
12523
  const agents = await runtime.port.listAgents();
12314
- const rosterItems = agents.filter((agent) => path2.resolve(agent.path) !== path2.resolve(paths.orchestratorAgentPath)).map((agent) => ({ kind: "agent", path: agent.path, name: agent.name }));
12524
+ const discoveredAgents = agents.filter((agent) => path2.resolve(agent.path) !== path2.resolve(paths.orchestratorAgentPath)).map((agent) => ({ kind: "agent", path: agent.path, name: agent.name }));
12525
+ const rosterRegistry = await presentItemsFor(runtime.port, staticItems.roster);
12526
+ const rosterItems = [...rosterRegistry, ...discoveredAgents];
12315
12527
  const worktrees = await runtime.port.listWorktrees();
12316
12528
  const worktreeItems = worktrees.map((worktree) => ({
12317
12529
  kind: "worktree",
@@ -13389,6 +13601,15 @@ async function runCli(argv, deps) {
13389
13601
  ...defaultModel !== undefined ? { defaultModel } : {}
13390
13602
  });
13391
13603
  const legacyLayout = deps.detectLegacyLayout !== undefined ? await deps.detectLegacyLayout() : undefined;
13604
+ let gitignoreCoverage;
13605
+ if (deps.readGitignore !== undefined) {
13606
+ const raw = await deps.readGitignore();
13607
+ gitignoreCoverage = {
13608
+ path: OPENCODE_GITIGNORE_PATH,
13609
+ exists: raw !== undefined,
13610
+ missingRules: missingGeneratedStateRules(raw ?? "")
13611
+ };
13612
+ }
13392
13613
  const otelBackend = describeOtelBackendForDoctor({
13393
13614
  backend: "opentelemetry",
13394
13615
  connectionEnv: "APPLICATIONINSIGHTS_CONNECTION_STRING"
@@ -13405,6 +13626,12 @@ async function runCli(argv, deps) {
13405
13626
  rosterLoadError = err instanceof Error ? err.message : String(err);
13406
13627
  }
13407
13628
  }
13629
+ let queueWait;
13630
+ if (deps.readQueueEvents !== undefined) {
13631
+ const queueEvents = await deps.readQueueEvents();
13632
+ const summary = summarizeQueueWaits(queueEvents);
13633
+ queueWait = summary !== undefined ? { summary } : {};
13634
+ }
13408
13635
  return {
13409
13636
  exitCode: 0,
13410
13637
  stdout: renderDoctor({
@@ -13414,6 +13641,7 @@ async function runCli(argv, deps) {
13414
13641
  telemetryRecords: records.length,
13415
13642
  agentModels,
13416
13643
  opencodeConfigPaths,
13644
+ ...queueWait !== undefined ? { queueWait } : {},
13417
13645
  ...rosterAudit !== undefined ? { rosterAudit } : {},
13418
13646
  ...rosterRoleCount !== undefined ? { rosterRoleCount } : {},
13419
13647
  ...rosterLoadError !== undefined ? { rosterLoadError } : {},
@@ -13421,7 +13649,8 @@ async function runCli(argv, deps) {
13421
13649
  ...opencodeConfigError !== undefined ? { opencodeConfigError } : {},
13422
13650
  ...cacheEntries !== undefined ? { cacheEntries, cliVersion: deps.version } : {},
13423
13651
  ...legacyLayout !== undefined && legacyLayout.length > 0 ? { legacyLayout } : {},
13424
- ...otelBackend !== undefined ? { otelBackend } : {}
13652
+ ...otelBackend !== undefined ? { otelBackend } : {},
13653
+ ...gitignoreCoverage !== undefined ? { gitignore: gitignoreCoverage } : {}
13425
13654
  })
13426
13655
  };
13427
13656
  }
@@ -15456,7 +15685,7 @@ async function buildMemoryRuntimeFromConfig(config, deps, options = {}) {
15456
15685
  // package.json
15457
15686
  var package_default = {
15458
15687
  name: "@jmanuelcorral/openteam",
15459
- version: "0.13.0",
15688
+ version: "0.14.0",
15460
15689
  packageManager: "bun@1.3.14",
15461
15690
  description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
15462
15691
  license: "MIT",
@@ -15748,6 +15977,9 @@ var deps = {
15748
15977
  storage,
15749
15978
  legacyTelemetryPath: path4
15750
15979
  }),
15980
+ readQueueEvents: () => readQueueEvents(DEFAULT_SESSIONS_DIR, {
15981
+ storage
15982
+ }),
15751
15983
  readDiagnostics: () => readDiagnosticEvents(DEFAULT_SESSIONS_DIR, {
15752
15984
  storage
15753
15985
  }),
@@ -15773,6 +16005,7 @@ var deps = {
15773
16005
  loopRuntime: createCliLoopRuntime(),
15774
16006
  loadRosterForDoctor: readStoredRosterForDoctor,
15775
16007
  auditRoster: auditStoredRosterForDoctor,
16008
+ readGitignore: () => storage.read(OPENCODE_GITIGNORE_PATH),
15776
16009
  version: PACKAGE_VERSION
15777
16010
  };
15778
16011
  function createCliPurgeRuntime() {
@@ -15873,18 +16106,30 @@ function createSetupDeps() {
15873
16106
  }
15874
16107
  };
15875
16108
  }
15876
- function createRolesInitDeps() {
15877
- const detect = createDetect(nodeExec2);
16109
+ function createRolesInitDeps(configSelection) {
15878
16110
  return {
15879
16111
  prompt: clackPrompter,
15880
16112
  readFile: (path4) => storage.read(path4),
15881
16113
  writeFile: async (path4, contents) => {
15882
16114
  await storage.write(path4, contents);
15883
16115
  },
15884
- detectRuntimes: async () => (await detect()).map((runtime) => ({
15885
- id: runtime.id,
15886
- available: runtime.reachable
15887
- }))
16116
+ detectRuntimes: async () => {
16117
+ const config = await loadConfig(configSelection.path, configSelection.resolution);
16118
+ const enabled = config.local.runtimes.filter((runtime) => runtime.enabled);
16119
+ if (enabled.length === 0) {
16120
+ return [];
16121
+ }
16122
+ const registry = new RuntimeRegistry({
16123
+ fetch: globalThis.fetch,
16124
+ clock: () => new Date().toISOString(),
16125
+ foundryDiscovery: foundryDiscoveryFromExec(nodeExec2)
16126
+ });
16127
+ const snapshots = await registry.probe(enabled);
16128
+ return snapshots.map((snapshot) => ({
16129
+ id: snapshot.id,
16130
+ available: snapshot.reachable
16131
+ }));
16132
+ }
15888
16133
  };
15889
16134
  }
15890
16135
  async function main() {
@@ -15900,7 +16145,7 @@ async function main() {
15900
16145
  return;
15901
16146
  }
15902
16147
  if (argv[0] === "roles" && argv[1] === "init") {
15903
- const result2 = await runRolesInit(createRolesInitDeps());
16148
+ const result2 = await runRolesInit(createRolesInitDeps(configSelection));
15904
16149
  if (result2.stdout.length > 0) {
15905
16150
  process.stdout.write(`${result2.stdout}
15906
16151
  `);
@@ -8,6 +8,7 @@ import { type AgentRoleProfile } from "../orchestrator/roles";
8
8
  import { type Roster } from "../orchestrator/roster";
9
9
  import type { RosterFileLoadResult } from "../orchestrator/rosterPersistence";
10
10
  import { type WorktreeObservation, type WorktreeReconcileAction } from "../orchestrator/worktreeReconciler";
11
+ import type { QueueEvent } from "../telemetry/events";
11
12
  import type { CostRecord } from "../telemetry/types";
12
13
  import { type AgentFile } from "./agents";
13
14
  import type { CachePort } from "./clearCache";
@@ -19,6 +20,13 @@ export type CliDeps = {
19
20
  saveConfig: (config: OpenTeamConfig, path: string, options?: ConfigPathResolution) => Promise<void>;
20
21
  probe: (config: OpenTeamConfig) => Promise<LocalRuntimeSnapshot[]>;
21
22
  readTelemetry: (path: string) => Promise<CostRecord[]>;
23
+ /**
24
+ * Reads the per-dispatch local-runtime queue metric events (#144) for the
25
+ * `openteam doctor` queue-wait summary. Optional so older composition roots
26
+ * still run; when absent, doctor omits the `local queue wait` section rather
27
+ * than inventing zeros.
28
+ */
29
+ readQueueEvents?: () => Promise<QueueEvent[]>;
22
30
  /**
23
31
  * Reads plugin-safe diagnostics persisted by the opencode plugin. Optional so
24
32
  * older composition roots still run; when absent, doctor omits the section.
@@ -61,6 +69,13 @@ export type CliDeps = {
61
69
  * migration section. Absent in composition roots that do not probe the disk.
62
70
  */
63
71
  detectLegacyLayout?: () => Promise<readonly LegacyLayoutFinding[]>;
72
+ /**
73
+ * Reads `.opencode/.gitignore` for the `openteam doctor` coverage check
74
+ * (returns `undefined` when the file is absent). Optional so composition roots
75
+ * that do not touch the disk can omit it; when absent, doctor omits the
76
+ * `gitignore:` section rather than guessing.
77
+ */
78
+ readGitignore?: () => Promise<string | undefined>;
64
79
  /**
65
80
  * Executes the P15b legacy-layout migration (`openteam migrate`): physically
66
81
  * relocates pre-split artifacts to their current homes and returns a report.
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}