@jmanuelcorral/openteam 0.13.1 → 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.1`; 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.1`; 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": {
@@ -10927,6 +11096,9 @@ function renderDoctor(input) {
10927
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.");
10928
11097
  }
10929
11098
  lines.push(` telemetry: ${input.telemetryPath} — ${input.telemetryRecords} record(s)`);
11099
+ if (input.queueWait !== undefined) {
11100
+ lines.push(...queueWaitSection(input.queueWait));
11101
+ }
10930
11102
  if (input.diagnostics !== undefined) {
10931
11103
  lines.push(...diagnosticsSection(input.diagnostics));
10932
11104
  }
@@ -13454,6 +13626,12 @@ async function runCli(argv, deps) {
13454
13626
  rosterLoadError = err instanceof Error ? err.message : String(err);
13455
13627
  }
13456
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
+ }
13457
13635
  return {
13458
13636
  exitCode: 0,
13459
13637
  stdout: renderDoctor({
@@ -13463,6 +13641,7 @@ async function runCli(argv, deps) {
13463
13641
  telemetryRecords: records.length,
13464
13642
  agentModels,
13465
13643
  opencodeConfigPaths,
13644
+ ...queueWait !== undefined ? { queueWait } : {},
13466
13645
  ...rosterAudit !== undefined ? { rosterAudit } : {},
13467
13646
  ...rosterRoleCount !== undefined ? { rosterRoleCount } : {},
13468
13647
  ...rosterLoadError !== undefined ? { rosterLoadError } : {},
@@ -15506,7 +15685,7 @@ async function buildMemoryRuntimeFromConfig(config, deps, options = {}) {
15506
15685
  // package.json
15507
15686
  var package_default = {
15508
15687
  name: "@jmanuelcorral/openteam",
15509
- version: "0.13.1",
15688
+ version: "0.14.0",
15510
15689
  packageManager: "bun@1.3.14",
15511
15690
  description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
15512
15691
  license: "MIT",
@@ -15798,6 +15977,9 @@ var deps = {
15798
15977
  storage,
15799
15978
  legacyTelemetryPath: path4
15800
15979
  }),
15980
+ readQueueEvents: () => readQueueEvents(DEFAULT_SESSIONS_DIR, {
15981
+ storage
15982
+ }),
15801
15983
  readDiagnostics: () => readDiagnosticEvents(DEFAULT_SESSIONS_DIR, {
15802
15984
  storage
15803
15985
  }),
@@ -15924,18 +16106,30 @@ function createSetupDeps() {
15924
16106
  }
15925
16107
  };
15926
16108
  }
15927
- function createRolesInitDeps() {
15928
- const detect = createDetect(nodeExec2);
16109
+ function createRolesInitDeps(configSelection) {
15929
16110
  return {
15930
16111
  prompt: clackPrompter,
15931
16112
  readFile: (path4) => storage.read(path4),
15932
16113
  writeFile: async (path4, contents) => {
15933
16114
  await storage.write(path4, contents);
15934
16115
  },
15935
- detectRuntimes: async () => (await detect()).map((runtime) => ({
15936
- id: runtime.id,
15937
- available: runtime.reachable
15938
- }))
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
+ }
15939
16133
  };
15940
16134
  }
15941
16135
  async function main() {
@@ -15951,7 +16145,7 @@ async function main() {
15951
16145
  return;
15952
16146
  }
15953
16147
  if (argv[0] === "roles" && argv[1] === "init") {
15954
- const result2 = await runRolesInit(createRolesInitDeps());
16148
+ const result2 = await runRolesInit(createRolesInitDeps(configSelection));
15955
16149
  if (result2.stdout.length > 0) {
15956
16150
  process.stdout.write(`${result2.stdout}
15957
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.
@@ -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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"}
@@ -4,6 +4,7 @@ import type { LocalRuntimeSnapshot } from "../local/types";
4
4
  import { type DiagnosticCode } from "../telemetry/diagnostics";
5
5
  import type { GraphViewHealth } from "../telemetry/graphView";
6
6
  import type { OtelDoctorView } from "../telemetry/otelConfig";
7
+ import type { QueueWaitSummary } from "../telemetry/queueWait";
7
8
  import type { AgentModelDiagnostic } from "./agents";
8
9
  import type { CacheEntry } from "./clearCache";
9
10
  export type DoctorInput = {
@@ -11,6 +12,14 @@ export type DoctorInput = {
11
12
  snapshots: readonly LocalRuntimeSnapshot[];
12
13
  telemetryPath: string;
13
14
  telemetryRecords: number;
15
+ /**
16
+ * Local-runtime queue-wait view (#144). When present, doctor renders a
17
+ * `queue wait:` section. Its `summary` is `undefined` when queue telemetry was
18
+ * read but contained no samples, so doctor says so plainly instead of printing
19
+ * zeros that read as "no contention". Absent entirely when the composition
20
+ * root does not read queue telemetry.
21
+ */
22
+ queueWait?: DoctorQueueWaitView;
14
23
  /**
15
24
  * Redacted OpenTelemetry backend view (W1-S04, #163). When present, doctor
16
25
  * renders an `opentelemetry:` line. The raw connection string never enters
@@ -108,5 +117,13 @@ export type DoctorRosterAudit = {
108
117
  readonly misassignedGuaranteedRoleEntries?: readonly DoctorRosterAuditEntry[];
109
118
  readonly unprofiledRoleEntries?: readonly DoctorRosterAuditEntry[];
110
119
  };
120
+ /**
121
+ * Doctor's view of local-runtime queue-wait telemetry (#144). Presence of this
122
+ * object means queue telemetry was consulted; `summary === undefined` means it
123
+ * held no samples yet (reported as "no data", never as zero contention).
124
+ */
125
+ export type DoctorQueueWaitView = {
126
+ readonly summary?: QueueWaitSummary;
127
+ };
111
128
  export declare function renderDoctor(input: DoctorInput): string;
112
129
  //# sourceMappingURL=doctor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/config/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,WAAW,CAAC;AAIlC,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA2GzE,CAAC;AAgIL,KAAK,6BAA6B,GAAG;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,6BAAkC,GAC1C,MAAM,CA0BR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/config/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,WAAW,CAAC;AAIlC,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA4GzE,CAAC;AAgIL,KAAK,6BAA6B,GAAG;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,6BAAkC,GAC1C,MAAM,CA0BR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxD"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import type { LocalRuntimeKind } from "../local/types";
2
3
  import { type AgentRoleProfile } from "../orchestrator/roles";
3
4
  export declare const ModelRefSchema: z.ZodObject<{
4
5
  providerID: z.ZodString;
@@ -118,13 +119,20 @@ export declare const StorageConfigSchema: z.ZodDefault<z.ZodObject<{
118
119
  * real slot count per runtime when it differs.
119
120
  */
120
121
  export declare const DEFAULT_LOCAL_MAX_CONCURRENCY = 4;
122
+ export declare const LocalRuntimeKindSchema: z.ZodEnum<{
123
+ "foundry-local": "foundry-local";
124
+ lemonade: "lemonade";
125
+ lmstudio: "lmstudio";
126
+ ollama: "ollama";
127
+ }>;
121
128
  export declare const LocalRuntimeSchema: z.ZodObject<{
122
- id: z.ZodEnum<{
129
+ id: z.ZodString;
130
+ kind: z.ZodOptional<z.ZodEnum<{
123
131
  "foundry-local": "foundry-local";
124
132
  lemonade: "lemonade";
125
133
  lmstudio: "lmstudio";
126
134
  ollama: "ollama";
127
- }>;
135
+ }>>;
128
136
  enabled: z.ZodDefault<z.ZodBoolean>;
129
137
  baseURL: z.ZodOptional<z.ZodString>;
130
138
  discovery: z.ZodOptional<z.ZodEnum<{
@@ -138,6 +146,13 @@ export declare const LocalRuntimeSchema: z.ZodObject<{
138
146
  }, z.core.$strict>;
139
147
  maxConcurrency: z.ZodOptional<z.ZodNumber>;
140
148
  }, z.core.$strict>;
149
+ /**
150
+ * Resolves the adapter {@link LocalRuntimeKind} of a configured runtime (#214).
151
+ * Prefers the explicit `kind`; falls back to the id for pre-#214 configs where
152
+ * the id was the kind. Safe because `LocalRuntimeSchema` refuses any runtime
153
+ * whose effective kind is not a known adapter kind.
154
+ */
155
+ export declare function localRuntimeKind(runtime: Pick<LocalRuntime, "id" | "kind">): LocalRuntimeKind;
141
156
  /**
142
157
  * Bloque de memoria semántica long-term (capa de conocimiento). Opt-in y
143
158
  * desactivado por defecto (ADR-1..6). Privacy-first: `storeContent=false` guarda
@@ -283,12 +298,13 @@ export declare const OpenTeamConfigObjectSchema: z.ZodObject<{
283
298
  }, z.core.$strict>>;
284
299
  local: z.ZodDefault<z.ZodObject<{
285
300
  runtimes: z.ZodDefault<z.ZodArray<z.ZodObject<{
286
- id: z.ZodEnum<{
301
+ id: z.ZodString;
302
+ kind: z.ZodOptional<z.ZodEnum<{
287
303
  "foundry-local": "foundry-local";
288
304
  lemonade: "lemonade";
289
305
  lmstudio: "lmstudio";
290
306
  ollama: "ollama";
291
- }>;
307
+ }>>;
292
308
  enabled: z.ZodDefault<z.ZodBoolean>;
293
309
  baseURL: z.ZodOptional<z.ZodString>;
294
310
  discovery: z.ZodOptional<z.ZodEnum<{
@@ -436,12 +452,13 @@ export declare const OpenTeamConfigSchema: z.ZodObject<{
436
452
  }, z.core.$strict>>;
437
453
  local: z.ZodDefault<z.ZodObject<{
438
454
  runtimes: z.ZodDefault<z.ZodArray<z.ZodObject<{
439
- id: z.ZodEnum<{
455
+ id: z.ZodString;
456
+ kind: z.ZodOptional<z.ZodEnum<{
440
457
  "foundry-local": "foundry-local";
441
458
  lemonade: "lemonade";
442
459
  lmstudio: "lmstudio";
443
460
  ollama: "ollama";
444
- }>;
461
+ }>>;
445
462
  enabled: z.ZodDefault<z.ZodBoolean>;
446
463
  baseURL: z.ZodOptional<z.ZodString>;
447
464
  discovery: z.ZodOptional<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}