@jmanuelcorral/openteam 0.17.3 → 0.17.5

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
@@ -373,7 +373,7 @@ ejecutas desde un subdirectorio verás "provider not configured" y debes hacer
373
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`. |
374
374
  | `local.runtimes[].defaultModel` | `ModelRef` | requerido | Modelo por defecto de ese runtime. |
375
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. |
376
- | `local.runtimes[].modelConcurrency` | `Record<modelID, entero positivo>` opcional | ninguno | Slots por modelo, porque los slots pertenecen al modelo cargado y no al servidor: un mismo host Lemonade puede servir un modelo con `--parallel 3` y otro con `--parallel 1` a la vez. Cada modelo declarado obtiene su propia cola; el resto comparte el pool de `maxConcurrency` de la instancia. `openteam setup` lo rellena solo cuando el runtime informa de sus slots. |
376
+ | `local.runtimes[].modelConcurrency` | `Record<modelID, entero positivo>` opcional | ninguno | Slots por modelo, porque los slots pertenecen al modelo cargado y no al servidor: un mismo host Lemonade puede servir un modelo con `--parallel 3` y otro con `--parallel 1` a la vez. Cada modelo declarado obtiene su propia cola; el resto comparte el pool de `maxConcurrency` de la instancia. Cuando se deja sin definir, openteam autodetecta los slots de cada modelo desde el sondeo de salud en vivo del runtime en el momento del despacho y los aplica hasta que declares los tuyos (la config explícita siempre gana); `openteam setup` escribe el mapa para que el reparto sobreviva a los reinicios. |
377
377
  | `budgets.sessionUSD` | `number` positivo opcional | sin límite | Presupuesto frontier por sesión. |
378
378
  | `budgets.monthlyUSD` | `number` positivo opcional | sin límite | Presupuesto frontier mensual. |
379
379
  | `budgets.frontierTokensPerSession` | `number` entero positivo opcional | sin límite | Límite de tokens frontier por sesión. |
@@ -825,7 +825,7 @@ Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `
825
825
 
826
826
  | Superficie | Versión / contrato |
827
827
  | --- | --- |
828
- | openteam | `0.17.3`; versión actual del paquete |
828
+ | openteam | `0.17.5`; versión actual del paquete |
829
829
  | `@opencode-ai/plugin` | `1.18.19` |
830
830
  | `@opencode-ai/sdk` | `1.18.19` |
831
831
  | Hook de routing | `chat.message`; no `chat.params` para cambiar modelo |
package/README.md CHANGED
@@ -325,7 +325,7 @@ configured" and should `cd` to the project root first.
325
325
  | `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` optional | none per item | Foundry Local discovery; the registry uses CLI when configured and not `manual`. |
326
326
  | `local.runtimes[].defaultModel` | `ModelRef` | required | Default model for that runtime. |
327
327
  | `local.runtimes[].maxConcurrency` | positive integer, optional | `4` | Concurrent-generation cap for this instance (its real slot count). Applied per instance. |
328
- | `local.runtimes[].modelConcurrency` | `Record<modelID, positive integer>`, optional | none | Per-model slot counts, because slots belong to the loaded model rather than to the server: a single Lemonade host can serve one model at `--parallel 3` and another at `--parallel 1` simultaneously. Each declared model gets its own queue; every other model shares the instance-wide `maxConcurrency` pool. Populated automatically by `openteam setup` when the runtime reports its slots. |
328
+ | `local.runtimes[].modelConcurrency` | `Record<modelID, positive integer>`, optional | none | Per-model slot counts, because slots belong to the loaded model rather than to the server: a single Lemonade host can serve one model at `--parallel 3` and another at `--parallel 1` simultaneously. Each declared model gets its own queue; every other model shares the instance-wide `maxConcurrency` pool. When left unset, openteam auto-detects each model's slots from the runtime's live health probe at dispatch time and applies them until you declare your own (explicit config always wins); `openteam setup` writes the map so the split survives restarts. |
329
329
  | `budgets.sessionUSD` | positive number, optional | unlimited | Frontier budget per session. |
330
330
  | `budgets.monthlyUSD` | positive number, optional | unlimited | Monthly frontier budget. |
331
331
  | `budgets.frontierTokensPerSession` | positive integer, optional | unlimited | Frontier token limit per session. |
@@ -714,7 +714,7 @@ See [docs/compatibility.md](docs/compatibility.md). Verified summary as of `2026
714
714
 
715
715
  | Surface | Version / contract |
716
716
  | --- | --- |
717
- | openteam | `0.17.3`; current package version |
717
+ | openteam | `0.17.5`; current package version |
718
718
  | `@opencode-ai/plugin` | `1.18.19` |
719
719
  | `@opencode-ai/sdk` | `1.18.19` |
720
720
  | Routing hook | `chat.message`; not `chat.params` for model changes |
@@ -34,12 +34,12 @@
34
34
  "idempotent": true
35
35
  },
36
36
  "performance": {
37
- "p95Millis": 0.4937800000000152,
37
+ "p95Millis": 0.4464980000000196,
38
38
  "budgetMillis": 50,
39
39
  "samples": 100
40
40
  }
41
41
  },
42
42
  "verdict": "pass",
43
43
  "failedGates": [],
44
- "digest": "0306cfd170a6a7afe07bb2403b7198e50c786f07c83f128742087e6643e17186"
44
+ "digest": "8c41d9fefa8b2edf934855dba6394316899e5763692228c7674aa8ec4ed52a65"
45
45
  }
@@ -20,7 +20,7 @@
20
20
  "rawFindings": 0
21
21
  },
22
22
  "overhead": {
23
- "p95Millis": 0.3300820000000044,
23
+ "p95Millis": 0.3133890000000008,
24
24
  "budgetMillis": 25,
25
25
  "samples": 1000
26
26
  },
@@ -35,5 +35,5 @@
35
35
  },
36
36
  "verdict": "pass",
37
37
  "failedGates": [],
38
- "digest": "cb6f78ca0552d4dba4735c27a9844fd69ebb8c821dc5a9639f9e9fa432b316e3"
38
+ "digest": "0d876024acfb42c9984626e6d726a964cb24929e0a32045d39d16a7a60bd7a21"
39
39
  }
package/dist/cli.js CHANGED
@@ -692,6 +692,15 @@ function slotPoolKey(runtime, modelID) {
692
692
  const declared = runtime.modelConcurrency?.[modelID];
693
693
  return declared === undefined ? runtime.id : `${runtime.id}${POOL_SEPARATOR}${modelID}`;
694
694
  }
695
+ function withReportedModelSlots(runtime, reported) {
696
+ if (reported === undefined || Object.keys(reported).length === 0) {
697
+ return runtime;
698
+ }
699
+ return {
700
+ ...runtime,
701
+ modelConcurrency: { ...reported, ...runtime.modelConcurrency }
702
+ };
703
+ }
695
704
 
696
705
  // src/capabilities/budget.ts
697
706
  var WARNING_UTILIZATION = 0.8;
@@ -2309,7 +2318,8 @@ async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
2309
2318
  if (runtimeId !== undefined && deps.runtimeLimiter !== undefined) {
2310
2319
  const limiter = deps.runtimeLimiter;
2311
2320
  const priority = priorityForRole(role);
2312
- const poolKey = slotPoolKey(configuredRuntime(runtimeId, input.config) ?? { id: runtimeId }, decision2.selected.modelID);
2321
+ const dispatchRuntime = configuredRuntime(runtimeId, input.config) ?? { id: runtimeId };
2322
+ const poolKey = slotPoolKey(withReportedModelSlots(dispatchRuntime, deps.reportedModelSlots?.(runtimeId)), decision2.selected.modelID);
2313
2323
  release = limiter.tryAcquire(poolKey, priority);
2314
2324
  let waitedMs = 0;
2315
2325
  if (release === undefined) {
@@ -6729,13 +6739,28 @@ var NodeSucceededEventSchema = z11.object({
6729
6739
  attemptID: AttemptIDSchema,
6730
6740
  artifact: ContextRefSchema
6731
6741
  }).strict();
6742
+ var NodeFailureClassSchema = z11.enum([
6743
+ "create-rejected",
6744
+ "create-no-id",
6745
+ "prompt-rejected",
6746
+ "prompt-timeout",
6747
+ "prompt-rate-limited",
6748
+ "prompt-auth",
6749
+ "prompt-content-filter",
6750
+ "prompt-context-length",
6751
+ "prompt-validation",
6752
+ "prompt-connection",
6753
+ "prompt-server",
6754
+ "unknown"
6755
+ ]);
6732
6756
  var NodeFailedEventSchema = z11.object({
6733
6757
  ...eventEnvelope,
6734
6758
  type: z11.literal("node.failed"),
6735
6759
  nodeID: NodeIDSchema,
6736
6760
  operationID: OperationIDSchema,
6737
6761
  attemptID: AttemptIDSchema,
6738
- errorClass: ErrorClassSchema
6762
+ errorClass: ErrorClassSchema,
6763
+ failureClass: NodeFailureClassSchema.optional()
6739
6764
  }).strict();
6740
6765
  var NodeCancelledEventSchema = z11.object({
6741
6766
  ...eventEnvelope,
@@ -7062,6 +7087,7 @@ function projectGraphEvent(event) {
7062
7087
  ..."operationID" in event ? { operationID: event.operationID } : {},
7063
7088
  ..."attemptID" in event ? { attemptID: event.attemptID } : {},
7064
7089
  ..."errorClass" in event ? { errorClass: event.errorClass } : {},
7090
+ ..."failureClass" in event && event.failureClass !== undefined ? { failureClass: event.failureClass } : {},
7065
7091
  ..."specDigest" in event ? { specDigest: event.specDigest } : {},
7066
7092
  ..."artifact" in event ? { artifact: redactedRef(event.artifact) } : {}
7067
7093
  };
@@ -7155,6 +7181,7 @@ function deriveVerdict(status) {
7155
7181
  }
7156
7182
  function indexTelemetry(telemetry) {
7157
7183
  const lastError = new Map;
7184
+ const lastFailure = new Map;
7158
7185
  const lastArtifact = new Map;
7159
7186
  for (const record of telemetry) {
7160
7187
  if (record.nodeID === undefined) {
@@ -7163,17 +7190,21 @@ function indexTelemetry(telemetry) {
7163
7190
  if (record.type === "node.failed" && record.errorClass !== undefined) {
7164
7191
  lastError.set(record.nodeID, record.errorClass);
7165
7192
  }
7193
+ if (record.type === "node.failed" && record.failureClass !== undefined) {
7194
+ lastFailure.set(record.nodeID, record.failureClass);
7195
+ }
7166
7196
  if (record.type === "node.succeeded" && record.artifact !== undefined) {
7167
7197
  lastArtifact.set(record.nodeID, record.artifact);
7168
7198
  }
7169
7199
  }
7170
- return { lastError, lastArtifact };
7200
+ return { lastError, lastFailure, lastArtifact };
7171
7201
  }
7172
- function buildNodeView(node, input, lastError, lastArtifact) {
7202
+ function buildNodeView(node, input, lastError, lastFailure, lastArtifact) {
7173
7203
  const runtime = input.state.nodes[node.id];
7174
7204
  const status = runtime?.status ?? "pending";
7175
7205
  const attempts = runtime?.attempts ?? 0;
7176
7206
  const errorClass = lastError.get(node.id);
7207
+ const failureClass = lastFailure.get(node.id);
7177
7208
  const artifact = lastArtifact.get(node.id);
7178
7209
  const sessionRef = input.sessions?.[node.id];
7179
7210
  const review = node.role === "reviewer" && node.reviews !== undefined ? { verdict: deriveVerdict(status), reassigned: attempts > 1 } : undefined;
@@ -7183,6 +7214,7 @@ function buildNodeView(node, input, lastError, lastArtifact) {
7183
7214
  state: toViewState(node, status, input.state),
7184
7215
  attempts,
7185
7216
  ...errorClass !== undefined ? { lastErrorClass: errorClass } : {},
7217
+ ...failureClass !== undefined ? { lastFailureClass: failureClass } : {},
7186
7218
  ...review !== undefined ? { review } : {},
7187
7219
  ...node.reviews !== undefined ? { revisionOf: node.reviews } : {},
7188
7220
  ...artifact !== undefined ? { artifact } : {},
@@ -7193,8 +7225,8 @@ function buildEdges(spec) {
7193
7225
  return spec.nodes.flatMap((node) => node.dependsOn.map((from) => ({ from, to: node.id })));
7194
7226
  }
7195
7227
  function buildGraphView(input) {
7196
- const { lastError, lastArtifact } = indexTelemetry(input.telemetry);
7197
- const nodes = input.spec.nodes.map((node) => buildNodeView(node, input, lastError, lastArtifact));
7228
+ const { lastError, lastFailure, lastArtifact } = indexTelemetry(input.telemetry);
7229
+ const nodes = input.spec.nodes.map((node) => buildNodeView(node, input, lastError, lastFailure, lastArtifact));
7198
7230
  const projection = {
7199
7231
  version: 1,
7200
7232
  runID: input.spec.runID,
@@ -10054,6 +10086,8 @@ var NON_TEXT_LABELS = new Set([
10054
10086
  "reranking"
10055
10087
  ]);
10056
10088
  var PARALLEL_ARG = /(?:^|\s)(?:--parallel|-np)[\s=]+(\d+)(?!\d)/;
10089
+ var PARALLEL_FLAGS = new Set(["--parallel", "-np"]);
10090
+ var PARALLEL_FUSED = /^(?:--parallel|-np)=(\d+)$/;
10057
10091
  function createLemonadeAdapter() {
10058
10092
  const listModels = async (options) => {
10059
10093
  const baseURL = normalizeBaseURL(options.baseURL ?? LEMONADE_DEFAULT_BASE_URL);
@@ -10154,15 +10188,49 @@ async function readLoadedModels(baseURL, fetch2) {
10154
10188
  return loaded;
10155
10189
  }
10156
10190
  function readSlotCount(entry) {
10191
+ return slotsFromLlamacppArgs(entry) ?? slotsFromLaunchCommand(entry);
10192
+ }
10193
+ function slotsFromLlamacppArgs(entry) {
10157
10194
  const options = entry.recipe_options;
10158
10195
  if (!isObject3(options) || typeof options.llamacpp_args !== "string") {
10159
10196
  return;
10160
10197
  }
10161
10198
  const match = PARALLEL_ARG.exec(options.llamacpp_args);
10162
- if (match === null) {
10199
+ return match === null ? undefined : positiveSlotCount(match[1]);
10200
+ }
10201
+ function slotsFromLaunchCommand(entry) {
10202
+ const argv = entry.launch_command;
10203
+ if (!Array.isArray(argv)) {
10163
10204
  return;
10164
10205
  }
10165
- const parsed = Number.parseInt(match[1], 10);
10206
+ for (let index = 0;index < argv.length; index += 1) {
10207
+ const token = argv[index];
10208
+ if (typeof token !== "string") {
10209
+ continue;
10210
+ }
10211
+ const fused = PARALLEL_FUSED.exec(token);
10212
+ if (fused !== null) {
10213
+ const slots = positiveSlotCount(fused[1]);
10214
+ if (slots !== undefined) {
10215
+ return slots;
10216
+ }
10217
+ continue;
10218
+ }
10219
+ if (PARALLEL_FLAGS.has(token)) {
10220
+ const next = argv[index + 1];
10221
+ const slots = typeof next === "string" ? positiveSlotCount(next) : undefined;
10222
+ if (slots !== undefined) {
10223
+ return slots;
10224
+ }
10225
+ }
10226
+ }
10227
+ return;
10228
+ }
10229
+ function positiveSlotCount(raw) {
10230
+ if (raw === undefined || !/^\d+$/.test(raw)) {
10231
+ return;
10232
+ }
10233
+ const parsed = Number.parseInt(raw, 10);
10166
10234
  return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
10167
10235
  }
10168
10236
  function enrichWithLoadState(models, loaded) {
@@ -11193,13 +11261,27 @@ function runtimeLine(snapshot, runtime) {
11193
11261
  const slots = declared === undefined ? ` · ${DEFAULT_LOCAL_MAX_CONCURRENCY} slot(s) (default)` : ` · ${declared} slot(s) (declared)`;
11194
11262
  return ` ${mark} ${snapshot.id.padEnd(14)} ${snapshot.baseURL || "(no baseURL)"} — ${detail}${slots}`;
11195
11263
  }
11196
- function runtimeModelSlotsLine(runtime) {
11197
- const entries = Object.entries(runtime?.modelConcurrency ?? {});
11198
- if (entries.length === 0) {
11199
- return;
11264
+ function runtimeModelSlotsLine(runtime, snapshot) {
11265
+ const declared = Object.entries(runtime?.modelConcurrency ?? {});
11266
+ if (declared.length > 0) {
11267
+ const detail = declared.map(([modelID, slots]) => `${modelID} ${slots} slot(s)`).join(" · ");
11268
+ return [` ↳ per-model slots: ${detail}`];
11269
+ }
11270
+ if (runtime === undefined || snapshot === undefined || !snapshot.reachable || snapshot.models.length === 0) {
11271
+ return [];
11200
11272
  }
11201
- const detail = entries.map(([modelID, slots]) => `${modelID} ${slots} slot(s)`).join(" · ");
11202
- return ` ↳ per-model slots: ${detail}`;
11273
+ const reported = snapshot.models.flatMap((model) => model.slots === undefined ? [] : [`${model.modelID} ${model.slots} slot(s)`]);
11274
+ if (reported.length > 0) {
11275
+ return [
11276
+ ` ↳ per-model slots (detected from ${snapshot.id}, applied this run): ${reported.join(" · ")}`,
11277
+ " remedy: pin these under this runtime as `modelConcurrency` in .opencode/openteam.json so the split survives restarts and outranks detection."
11278
+ ];
11279
+ }
11280
+ return [
11281
+ ` ⚠ ${snapshot.id} is reachable and serving models but has no per-model slots declared`,
11282
+ " consequence: every model shares one runtime-wide pool sized to maxConcurrency, so a model the runtime serves at fewer parallel slots is over-dispatched and its extra requests queue invisibly inside the runtime where openteam cannot prioritise them.",
11283
+ ' remedy: add "modelConcurrency": { "<modelID>": <slots> } to this runtime in .opencode/openteam.json (or re-run `openteam setup`, which detects the counts from the runtime), then re-run `openteam doctor`.'
11284
+ ];
11203
11285
  }
11204
11286
  function isNetworkRuntime(baseURL) {
11205
11287
  if (baseURL.length === 0) {
@@ -11456,9 +11538,9 @@ function renderDoctor(input) {
11456
11538
  if (classLine !== undefined) {
11457
11539
  lines.push(classLine);
11458
11540
  }
11459
- const modelSlots = runtimeModelSlotsLine(runtime);
11460
- if (modelSlots !== undefined) {
11461
- lines.push(modelSlots);
11541
+ const modelSlots = runtimeModelSlotsLine(runtime, snapshot);
11542
+ for (const line of modelSlots) {
11543
+ lines.push(line);
11462
11544
  }
11463
11545
  }
11464
11546
  }
@@ -16264,6 +16346,7 @@ async function recallMemory(deps, queryText, query) {
16264
16346
  import { tool } from "@opencode-ai/plugin";
16265
16347
  import { z as z22 } from "zod";
16266
16348
  var _pluginWarnedRoles = new Set;
16349
+ var EMPTY_ROLE_ID_SET = new Set;
16267
16350
  var RoleAssignmentSchema = z22.object({
16268
16351
  roleID: z22.string().min(1).describe("Role identifier from the roster"),
16269
16352
  prompt: z22.string().min(1).describe("Work prompt for this role"),
@@ -16467,7 +16550,7 @@ async function buildMemoryRuntimeFromConfig(config, deps, options = {}) {
16467
16550
  // package.json
16468
16551
  var package_default = {
16469
16552
  name: "@jmanuelcorral/openteam",
16470
- version: "0.17.3",
16553
+ version: "0.17.5",
16471
16554
  packageManager: "bun@1.3.14",
16472
16555
  description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
16473
16556
  license: "MIT",
@@ -137,16 +137,28 @@ export type DoctorRosterAudit = {
137
137
  readonly unprofiledRoleEntries?: readonly DoctorRosterAuditEntry[];
138
138
  };
139
139
  /**
140
- * Reports the per-model slot split when a runtime declares one.
140
+ * Reports a runtime's per-model slot split, and — the #217 fix — makes the
141
+ * previously SILENT case loud.
141
142
  *
142
- * Without this the `N slot(s)` figure above reads as the whole truth, hiding the
143
- * case that motivated per-model pools: a host declaring 4 server slots may serve
144
- * its coder model at 3 and its thinking model at 1, so the roles routed to the
145
- * thinking model serialise on a single slot. Returns `undefined` when the
146
- * runtime declares no per-model slots, so nothing is printed for the runtimes
147
- * that cannot report them. Pure.
143
+ * Slots belong to the loaded model, not the server: a Lemonade host declaring 4
144
+ * server slots may serve its coder model at `--parallel 3` and its thinking
145
+ * model at `--parallel 1`, so roles routed to the thinking model serialise on a
146
+ * single slot. There are three outcomes:
147
+ *
148
+ * 1. The config DECLARES `modelConcurrency` → print the declared split, exactly
149
+ * as before.
150
+ * 2. The config declares none but the reachable runtime REPORTED slot counts
151
+ * over its API → print what was detected (openteam now applies it at
152
+ * runtime, #217) plus a remedy to pin it in config so it survives restarts
153
+ * and outranks detection.
154
+ * 3. The config declares none and a reachable runtime serving models reported
155
+ * none → warn, because this is exactly the over-dispatch config that used to
156
+ * print nothing at all, leaving the operator no signal.
157
+ *
158
+ * Returns an empty array (prints nothing) for an unreachable runtime or one
159
+ * serving no models, where there is nothing to substantiate. Pure.
148
160
  */
149
- export declare function runtimeModelSlotsLine(runtime: LocalRuntime | undefined): string | undefined;
161
+ export declare function runtimeModelSlotsLine(runtime: LocalRuntime | undefined, snapshot?: LocalRuntimeSnapshot): string[];
150
162
  /**
151
163
  * Doctor's view of local-runtime queue-wait telemetry (#144). Presence of this
152
164
  * object means queue telemetry was consulted; `summary === undefined` means it
@@ -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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"}
@@ -98,6 +98,36 @@ export declare const NodeSucceededEventSchema: z.ZodObject<{
98
98
  mediaType: z.ZodOptional<z.ZodString>;
99
99
  }, z.core.$strict>;
100
100
  }, z.core.$strict>;
101
+ /**
102
+ * Bounded failure class carried by `node.failed` (#225).
103
+ *
104
+ * `errorClass` has only three values, and `permanent` alone covers seven
105
+ * distinct causes — measured on a live host, that made a real production
106
+ * failure undiagnosable from the journal alone. The precise class is already
107
+ * computed during shadow synthesis, so recording it is pure gain.
108
+ *
109
+ * Deliberately duplicated from `TelemetryFailureClassSchema` in
110
+ * `src/orchestrator/coordinator.ts`: `src/graph/**` must not import
111
+ * `src/orchestrator/**`. A contract test pins the two lists in sync.
112
+ *
113
+ * Privacy: a closed enum by construction, so no prompt text, URL or provider
114
+ * error string can ever be smuggled through this field.
115
+ */
116
+ export declare const NodeFailureClassSchema: z.ZodEnum<{
117
+ "create-no-id": "create-no-id";
118
+ "create-rejected": "create-rejected";
119
+ "prompt-auth": "prompt-auth";
120
+ "prompt-connection": "prompt-connection";
121
+ "prompt-content-filter": "prompt-content-filter";
122
+ "prompt-context-length": "prompt-context-length";
123
+ "prompt-rate-limited": "prompt-rate-limited";
124
+ "prompt-rejected": "prompt-rejected";
125
+ "prompt-server": "prompt-server";
126
+ "prompt-timeout": "prompt-timeout";
127
+ "prompt-validation": "prompt-validation";
128
+ unknown: "unknown";
129
+ }>;
130
+ export type NodeFailureClass = z.infer<typeof NodeFailureClassSchema>;
101
131
  export declare const NodeFailedEventSchema: z.ZodObject<{
102
132
  v: z.ZodLiteral<1>;
103
133
  seq: z.ZodNumber;
@@ -113,6 +143,20 @@ export declare const NodeFailedEventSchema: z.ZodObject<{
113
143
  transient: "transient";
114
144
  unknown: "unknown";
115
145
  }>;
146
+ failureClass: z.ZodOptional<z.ZodEnum<{
147
+ "create-no-id": "create-no-id";
148
+ "create-rejected": "create-rejected";
149
+ "prompt-auth": "prompt-auth";
150
+ "prompt-connection": "prompt-connection";
151
+ "prompt-content-filter": "prompt-content-filter";
152
+ "prompt-context-length": "prompt-context-length";
153
+ "prompt-rate-limited": "prompt-rate-limited";
154
+ "prompt-rejected": "prompt-rejected";
155
+ "prompt-server": "prompt-server";
156
+ "prompt-timeout": "prompt-timeout";
157
+ "prompt-validation": "prompt-validation";
158
+ unknown: "unknown";
159
+ }>>;
116
160
  }, z.core.$strict>;
117
161
  export declare const NodeCancelledEventSchema: z.ZodObject<{
118
162
  v: z.ZodLiteral<1>;
@@ -183,6 +227,20 @@ export declare const GraphEventV1Schema: z.ZodDiscriminatedUnion<[z.ZodObject<{
183
227
  transient: "transient";
184
228
  unknown: "unknown";
185
229
  }>;
230
+ failureClass: z.ZodOptional<z.ZodEnum<{
231
+ "create-no-id": "create-no-id";
232
+ "create-rejected": "create-rejected";
233
+ "prompt-auth": "prompt-auth";
234
+ "prompt-connection": "prompt-connection";
235
+ "prompt-content-filter": "prompt-content-filter";
236
+ "prompt-context-length": "prompt-context-length";
237
+ "prompt-rate-limited": "prompt-rate-limited";
238
+ "prompt-rejected": "prompt-rejected";
239
+ "prompt-server": "prompt-server";
240
+ "prompt-timeout": "prompt-timeout";
241
+ "prompt-validation": "prompt-validation";
242
+ unknown: "unknown";
243
+ }>>;
186
244
  }, z.core.$strict>, z.ZodObject<{
187
245
  v: z.ZodLiteral<1>;
188
246
  seq: z.ZodNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/graph/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB;;;;;;;GAOG;AAEH,eAAO,MAAM,kBAAkB,EAAG,CAAU,CAAC;AAC7C,eAAO,MAAM,mBAAmB,EAAG,CAAU,CAAC;AAE9C,4EAA4E;AAC5E,eAAO,MAAM,YAAY,aAIkC,CAAC;AAC5D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,+CAA+C;AAC/C,eAAO,MAAM,cAAc;;;EAAsC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,aAEsB,CAAC;AACrD,eAAO,MAAM,eAAe,aAEsB,CAAC;AAEnD,yDAAyD;AACzD,eAAO,MAAM,gBAAgB;;;;;;EAM3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;kBAQjB,CAAC;AACZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;kBAMnB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAQ5D,eAAO,MAAM,qBAAqB;;;;;;kBAMvB,CAAC;AAEZ,eAAO,MAAM,yBAAyB;;;;;;;;kBAQ3B,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;kBAS1B,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;kBASvB,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;;;kBAM1B,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;kBAEzB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;kBAEtB,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;kBAEzB,CAAC;AAEZ,gEAAgE;AAChE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAS7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAElD,mDAAmD;AACnD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAE1B,YAAY,IAAI,EAAE,cAAc,GAAG,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAKpE;CACF;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAM1D;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAM5D"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/graph/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB;;;;;;;GAOG;AAEH,eAAO,MAAM,kBAAkB,EAAG,CAAU,CAAC;AAC7C,eAAO,MAAM,mBAAmB,EAAG,CAAU,CAAC;AAE9C,4EAA4E;AAC5E,eAAO,MAAM,YAAY,aAIkC,CAAC;AAC5D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,+CAA+C;AAC/C,eAAO,MAAM,cAAc;;;EAAsC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,aAEsB,CAAC;AACrD,eAAO,MAAM,eAAe,aAEsB,CAAC;AAEnD,yDAAyD;AACzD,eAAO,MAAM,gBAAgB;;;;;;EAM3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;kBAQjB,CAAC;AACZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;kBAMnB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAQ5D,eAAO,MAAM,qBAAqB;;;;;;kBAMvB,CAAC;AAEZ,eAAO,MAAM,yBAAyB;;;;;;;;kBAQ3B,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;kBAS1B,CAAC;AAEZ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;EAajC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAWvB,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;;;kBAM1B,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;kBAEzB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;kBAEtB,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;kBAEzB,CAAC;AAEZ,gEAAgE;AAChE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAS7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAElD,mDAAmD;AACnD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAE1B,YAAY,IAAI,EAAE,cAAc,GAAG,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAKpE;CACF;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAM1D;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAM5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -869,13 +869,28 @@ var NodeSucceededEventSchema = z5.object({
869
869
  attemptID: AttemptIDSchema,
870
870
  artifact: ContextRefSchema
871
871
  }).strict();
872
+ var NodeFailureClassSchema = z5.enum([
873
+ "create-rejected",
874
+ "create-no-id",
875
+ "prompt-rejected",
876
+ "prompt-timeout",
877
+ "prompt-rate-limited",
878
+ "prompt-auth",
879
+ "prompt-content-filter",
880
+ "prompt-context-length",
881
+ "prompt-validation",
882
+ "prompt-connection",
883
+ "prompt-server",
884
+ "unknown"
885
+ ]);
872
886
  var NodeFailedEventSchema = z5.object({
873
887
  ...eventEnvelope,
874
888
  type: z5.literal("node.failed"),
875
889
  nodeID: NodeIDSchema,
876
890
  operationID: OperationIDSchema,
877
891
  attemptID: AttemptIDSchema,
878
- errorClass: ErrorClassSchema
892
+ errorClass: ErrorClassSchema,
893
+ failureClass: NodeFailureClassSchema.optional()
879
894
  }).strict();
880
895
  var NodeCancelledEventSchema = z5.object({
881
896
  ...eventEnvelope,
@@ -5519,6 +5534,8 @@ var NON_TEXT_LABELS = new Set([
5519
5534
  "reranking"
5520
5535
  ]);
5521
5536
  var PARALLEL_ARG = /(?:^|\s)(?:--parallel|-np)[\s=]+(\d+)(?!\d)/;
5537
+ var PARALLEL_FLAGS = new Set(["--parallel", "-np"]);
5538
+ var PARALLEL_FUSED = /^(?:--parallel|-np)=(\d+)$/;
5522
5539
  function createLemonadeAdapter() {
5523
5540
  const listModels = async (options) => {
5524
5541
  const baseURL = normalizeBaseURL(options.baseURL ?? LEMONADE_DEFAULT_BASE_URL);
@@ -5619,15 +5636,49 @@ async function readLoadedModels(baseURL, fetch) {
5619
5636
  return loaded;
5620
5637
  }
5621
5638
  function readSlotCount(entry) {
5639
+ return slotsFromLlamacppArgs(entry) ?? slotsFromLaunchCommand(entry);
5640
+ }
5641
+ function slotsFromLlamacppArgs(entry) {
5622
5642
  const options = entry.recipe_options;
5623
5643
  if (!isObject2(options) || typeof options.llamacpp_args !== "string") {
5624
5644
  return;
5625
5645
  }
5626
5646
  const match = PARALLEL_ARG.exec(options.llamacpp_args);
5627
- if (match === null) {
5647
+ return match === null ? undefined : positiveSlotCount(match[1]);
5648
+ }
5649
+ function slotsFromLaunchCommand(entry) {
5650
+ const argv = entry.launch_command;
5651
+ if (!Array.isArray(argv)) {
5652
+ return;
5653
+ }
5654
+ for (let index = 0;index < argv.length; index += 1) {
5655
+ const token = argv[index];
5656
+ if (typeof token !== "string") {
5657
+ continue;
5658
+ }
5659
+ const fused = PARALLEL_FUSED.exec(token);
5660
+ if (fused !== null) {
5661
+ const slots = positiveSlotCount(fused[1]);
5662
+ if (slots !== undefined) {
5663
+ return slots;
5664
+ }
5665
+ continue;
5666
+ }
5667
+ if (PARALLEL_FLAGS.has(token)) {
5668
+ const next = argv[index + 1];
5669
+ const slots = typeof next === "string" ? positiveSlotCount(next) : undefined;
5670
+ if (slots !== undefined) {
5671
+ return slots;
5672
+ }
5673
+ }
5674
+ }
5675
+ return;
5676
+ }
5677
+ function positiveSlotCount(raw) {
5678
+ if (raw === undefined || !/^\d+$/.test(raw)) {
5628
5679
  return;
5629
5680
  }
5630
- const parsed = Number.parseInt(match[1], 10);
5681
+ const parsed = Number.parseInt(raw, 10);
5631
5682
  return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
5632
5683
  }
5633
5684
  function enrichWithLoadState(models, loaded) {
@@ -5753,6 +5804,24 @@ function reachableRuntimeIds(snapshots) {
5753
5804
  }
5754
5805
  return ids;
5755
5806
  }
5807
+ function reportedModelSlotsByRuntime(snapshots) {
5808
+ const byRuntime = new Map;
5809
+ for (const snapshot of snapshots) {
5810
+ if (!snapshot.reachable) {
5811
+ continue;
5812
+ }
5813
+ const slots = {};
5814
+ for (const model of snapshot.models) {
5815
+ if (model.slots !== undefined) {
5816
+ slots[model.modelID] = model.slots;
5817
+ }
5818
+ }
5819
+ if (Object.keys(slots).length > 0) {
5820
+ byRuntime.set(snapshot.id, slots);
5821
+ }
5822
+ }
5823
+ return byRuntime;
5824
+ }
5756
5825
 
5757
5826
  // src/local/slotPool.ts
5758
5827
  var POOL_SEPARATOR = "::";
@@ -5784,6 +5853,15 @@ function slotPoolReservedInteractive(runtime, modelID) {
5784
5853
  function unknownPoolCapacity() {
5785
5854
  return DEFAULT_LOCAL_MAX_CONCURRENCY;
5786
5855
  }
5856
+ function withReportedModelSlots(runtime, reported) {
5857
+ if (reported === undefined || Object.keys(reported).length === 0) {
5858
+ return runtime;
5859
+ }
5860
+ return {
5861
+ ...runtime,
5862
+ modelConcurrency: { ...reported, ...runtime.modelConcurrency }
5863
+ };
5864
+ }
5787
5865
 
5788
5866
  // src/orchestrator/coordinator.ts
5789
5867
  import { z as z17 } from "zod";
@@ -6954,7 +7032,8 @@ async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
6954
7032
  if (runtimeId !== undefined && deps.runtimeLimiter !== undefined) {
6955
7033
  const limiter = deps.runtimeLimiter;
6956
7034
  const priority = priorityForRole(role);
6957
- const poolKey = slotPoolKey(configuredRuntime(runtimeId, input.config) ?? { id: runtimeId }, decision2.selected.modelID);
7035
+ const dispatchRuntime = configuredRuntime(runtimeId, input.config) ?? { id: runtimeId };
7036
+ const poolKey = slotPoolKey(withReportedModelSlots(dispatchRuntime, deps.reportedModelSlots?.(runtimeId)), decision2.selected.modelID);
6958
7037
  release = limiter.tryAcquire(poolKey, priority);
6959
7038
  let waitedMs = 0;
6960
7039
  if (release === undefined) {
@@ -8442,13 +8521,27 @@ function runtimeLine(snapshot, runtime) {
8442
8521
  const slots = declared === undefined ? ` · ${DEFAULT_LOCAL_MAX_CONCURRENCY} slot(s) (default)` : ` · ${declared} slot(s) (declared)`;
8443
8522
  return ` ${mark} ${snapshot.id.padEnd(14)} ${snapshot.baseURL || "(no baseURL)"} — ${detail}${slots}`;
8444
8523
  }
8445
- function runtimeModelSlotsLine(runtime) {
8446
- const entries = Object.entries(runtime?.modelConcurrency ?? {});
8447
- if (entries.length === 0) {
8448
- return;
8524
+ function runtimeModelSlotsLine(runtime, snapshot) {
8525
+ const declared = Object.entries(runtime?.modelConcurrency ?? {});
8526
+ if (declared.length > 0) {
8527
+ const detail = declared.map(([modelID, slots]) => `${modelID} ${slots} slot(s)`).join(" · ");
8528
+ return [` ↳ per-model slots: ${detail}`];
8529
+ }
8530
+ if (runtime === undefined || snapshot === undefined || !snapshot.reachable || snapshot.models.length === 0) {
8531
+ return [];
8449
8532
  }
8450
- const detail = entries.map(([modelID, slots]) => `${modelID} ${slots} slot(s)`).join(" · ");
8451
- return ` ↳ per-model slots: ${detail}`;
8533
+ const reported = snapshot.models.flatMap((model) => model.slots === undefined ? [] : [`${model.modelID} ${model.slots} slot(s)`]);
8534
+ if (reported.length > 0) {
8535
+ return [
8536
+ ` ↳ per-model slots (detected from ${snapshot.id}, applied this run): ${reported.join(" · ")}`,
8537
+ " remedy: pin these under this runtime as `modelConcurrency` in .opencode/openteam.json so the split survives restarts and outranks detection."
8538
+ ];
8539
+ }
8540
+ return [
8541
+ ` ⚠ ${snapshot.id} is reachable and serving models but has no per-model slots declared`,
8542
+ " consequence: every model shares one runtime-wide pool sized to maxConcurrency, so a model the runtime serves at fewer parallel slots is over-dispatched and its extra requests queue invisibly inside the runtime where openteam cannot prioritise them.",
8543
+ ' remedy: add "modelConcurrency": { "<modelID>": <slots> } to this runtime in .opencode/openteam.json (or re-run `openteam setup`, which detects the counts from the runtime), then re-run `openteam doctor`.'
8544
+ ];
8452
8545
  }
8453
8546
  function isNetworkRuntime(baseURL) {
8454
8547
  if (baseURL.length === 0) {
@@ -8705,9 +8798,9 @@ function renderDoctor(input) {
8705
8798
  if (classLine !== undefined) {
8706
8799
  lines.push(classLine);
8707
8800
  }
8708
- const modelSlots = runtimeModelSlotsLine(runtime);
8709
- if (modelSlots !== undefined) {
8710
- lines.push(modelSlots);
8801
+ const modelSlots = runtimeModelSlotsLine(runtime, snapshot);
8802
+ for (const line of modelSlots) {
8803
+ lines.push(line);
8711
8804
  }
8712
8805
  }
8713
8806
  }
@@ -12941,6 +13034,7 @@ function createMemoryTool(deps) {
12941
13034
  import { tool as tool4 } from "@opencode-ai/plugin";
12942
13035
  import { z as z25 } from "zod";
12943
13036
  var _pluginWarnedRoles = new Set;
13037
+ var EMPTY_ROLE_ID_SET = new Set;
12944
13038
  var RoleAssignmentSchema = z25.object({
12945
13039
  roleID: z25.string().min(1).describe("Role identifier from the roster"),
12946
13040
  prompt: z25.string().min(1).describe("Work prompt for this role"),
@@ -13133,14 +13227,18 @@ function mapTelemetryFailureClassToErrorClass(cls) {
13133
13227
  }
13134
13228
  function classifyShadowNodeError(result) {
13135
13229
  if (result === undefined || result.subsession.success) {
13136
- return "unknown";
13230
+ return { errorClass: "unknown", failureClass: "unknown" };
13137
13231
  }
13138
13232
  const failureReason = result.subsession.failureReason ?? result.record.failureReason;
13139
13233
  const failureStage = result.subsession.failureStage ?? result.record.failureStage;
13140
13234
  if (failureReason !== undefined || failureStage !== undefined) {
13141
- return mapTelemetryFailureClassToErrorClass(classifyFailureForTelemetry(failureReason ?? "", failureStage));
13235
+ const failureClass = classifyFailureForTelemetry(failureReason ?? "", failureStage);
13236
+ return {
13237
+ errorClass: mapTelemetryFailureClassToErrorClass(failureClass),
13238
+ failureClass
13239
+ };
13142
13240
  }
13143
- return "unknown";
13241
+ return { errorClass: "unknown", failureClass: "unknown" };
13144
13242
  }
13145
13243
  function synthesizeJournalEvents(spec, results, cancelled = []) {
13146
13244
  const runID = spec.runID;
@@ -13183,6 +13281,7 @@ function synthesizeJournalEvents(spec, results, cancelled = []) {
13183
13281
  attemptID: attempt
13184
13282
  });
13185
13283
  if (result === undefined || !result.subsession.success) {
13284
+ const classified = classifyShadowNodeError(result);
13186
13285
  events.push({
13187
13286
  v: 1,
13188
13287
  seq: events.length,
@@ -13191,7 +13290,8 @@ function synthesizeJournalEvents(spec, results, cancelled = []) {
13191
13290
  nodeID: node.id,
13192
13291
  operationID: operation,
13193
13292
  attemptID: attempt,
13194
- errorClass: classifyShadowNodeError(result)
13293
+ errorClass: classified.errorClass,
13294
+ failureClass: classified.failureClass
13195
13295
  });
13196
13296
  } else {
13197
13297
  events.push({
@@ -13342,6 +13442,28 @@ function orchestrateToolDescription(config) {
13342
13442
 
13343
13443
  ` + "Emit one assignment per role that has genuinely distinct work, in a " + "single call — that is what parallelises the team. A call carrying only " + "one assignment has delegated nothing and is almost always a mistake " + "unless the task truly belongs to a single role. Use `dependsOn` to " + "sequence roles that must wait for another role's output; independent " + "roles are dispatched concurrently.";
13344
13444
  }
13445
+ function unknownAssignmentRoleIDs(assignments, config, rosterRoleIDs) {
13446
+ const seen = new Set;
13447
+ const unknown = [];
13448
+ for (const { roleID } of assignments) {
13449
+ if (getRoleProfile(roleID, config.orchestrator?.roles) !== undefined) {
13450
+ continue;
13451
+ }
13452
+ if (rosterRoleIDs.has(roleID)) {
13453
+ continue;
13454
+ }
13455
+ if (seen.has(roleID)) {
13456
+ continue;
13457
+ }
13458
+ seen.add(roleID);
13459
+ unknown.push(roleID);
13460
+ }
13461
+ return unknown;
13462
+ }
13463
+ function formatUnknownRoleError(unknownRoles, assignable) {
13464
+ const offending = unknownRoles.map((roleID) => `"${roleID}"`).join(", ");
13465
+ return `role validation error: unknown role(s) ${offending} — not a roster role ` + "and not declared under orchestrator.roles. " + `Assignable roles: ${assignable.join(", ")}. ` + "Use one of these, or declare the custom role under orchestrator.roles in " + ".opencode/openteam.json before assigning it.";
13466
+ }
13345
13467
  function createOrchestrateTool(deps) {
13346
13468
  return tool4({
13347
13469
  description: orchestrateToolDescription(deps.config),
@@ -13365,6 +13487,12 @@ function createOrchestrateTool(deps) {
13365
13487
  return `dependency validation error: ${depError.code} — ${depError.detail}`;
13366
13488
  }
13367
13489
  try {
13490
+ const needsRoster = parsed.data.assignments.some((assignment) => getRoleProfile(assignment.roleID, deps.config.orchestrator?.roles) === undefined);
13491
+ const rosterRoleIDs = needsRoster ? await deps.rosterRoleIDs() : EMPTY_ROLE_ID_SET;
13492
+ const unknownRoles = unknownAssignmentRoleIDs(parsed.data.assignments, deps.config, rosterRoleIDs);
13493
+ if (unknownRoles.length > 0) {
13494
+ return formatUnknownRoleError(unknownRoles, assignableRoleIDs(deps.config));
13495
+ }
13368
13496
  const inputs = buildRoleTaskInputs(parsed.data, deps.config);
13369
13497
  const coordinatorDeps = {
13370
13498
  client: deps.client,
@@ -13375,7 +13503,8 @@ function createOrchestrateTool(deps) {
13375
13503
  warnedRoles: _pluginWarnedRoles,
13376
13504
  localRuntimeReachable: deps.localRuntimeReachable,
13377
13505
  reachableRuntimeIds: deps.reachableRuntimeIds,
13378
- runtimeLimiter: deps.runtimeLimiter
13506
+ runtimeLimiter: deps.runtimeLimiter,
13507
+ reportedModelSlots: deps.reportedModelSlots
13379
13508
  };
13380
13509
  const batch = await runRoleTasks(inputs, coordinatorDeps);
13381
13510
  const projected = projectResults(batch.results, batch.cancelled);
@@ -13739,7 +13868,7 @@ var createOtlpSpanExporter = (connection, config) => {
13739
13868
  // package.json
13740
13869
  var package_default = {
13741
13870
  name: "@jmanuelcorral/openteam",
13742
- version: "0.17.3",
13871
+ version: "0.17.5",
13743
13872
  packageManager: "bun@1.3.14",
13744
13873
  description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
13745
13874
  license: "MIT",
@@ -14203,6 +14332,17 @@ async function readStoredRosterForDoctor(storage) {
14203
14332
  return content;
14204
14333
  }
14205
14334
  }
14335
+ async function readStoredRosterRoleIDs(storage) {
14336
+ try {
14337
+ const content = await storage.read(OPENTEAM_ROSTER_PATH);
14338
+ if (content === undefined) {
14339
+ return new Set;
14340
+ }
14341
+ return new Set(parseRoster(content).entries.map((entry) => entry.roleID));
14342
+ } catch {
14343
+ return new Set;
14344
+ }
14345
+ }
14206
14346
  var auditStoredRosterForDoctor = (roster, configuredRoles) => typeof roster === "string" ? auditRoster(roster, configuredRoles) : auditRoster(roster, configuredRoles);
14207
14347
  function createCliDeps(config, registry, telemetryPath, sessionsDir = DEFAULT_SESSIONS_DIR, storage = createFsStorageProvider(process.cwd()), fallbackSource = "options", rawOptions, resolveOpencodeVersion) {
14208
14348
  return {
@@ -14487,17 +14627,36 @@ var server = async (ctx, rawOptions) => {
14487
14627
  const effectiveGraphMode = graphConfig.effectiveMode;
14488
14628
  const journalRoot2 = config.graph?.journalRoot ?? DEFAULT_GRAPH_JOURNAL_ROOT;
14489
14629
  const journal = effectiveGraphMode !== "off" ? createFsGraphJournal(journalRoot2) : undefined;
14630
+ const reportedSlotsByRuntime = new Map;
14631
+ const rememberReportedSlots = (snapshots) => {
14632
+ const reported = reportedModelSlotsByRuntime(snapshots);
14633
+ for (const snapshot of snapshots) {
14634
+ const slots = reported.get(snapshot.id);
14635
+ if (slots === undefined) {
14636
+ reportedSlotsByRuntime.delete(snapshot.id);
14637
+ } else {
14638
+ reportedSlotsByRuntime.set(snapshot.id, slots);
14639
+ }
14640
+ }
14641
+ };
14642
+ const reportedModelSlots = (runtimeId) => reportedSlotsByRuntime.get(runtimeId);
14490
14643
  const localRuntimeReachable = async () => {
14491
14644
  const snapshots = await registry.probe(config.local.runtimes.filter((runtime) => runtime.enabled));
14645
+ rememberReportedSlots(snapshots);
14492
14646
  return anyRuntimeReachable(snapshots);
14493
14647
  };
14494
14648
  const probeReachableRuntimeIds = async () => {
14495
14649
  const snapshots = await registry.probe(config.local.runtimes.filter((runtime) => runtime.enabled));
14650
+ rememberReportedSlots(snapshots);
14496
14651
  return reachableRuntimeIds(snapshots);
14497
14652
  };
14498
14653
  const runtimeById = (key2) => {
14499
14654
  const runtimeId = slotPoolRuntimeID(key2);
14500
- return config.local.runtimes.find((runtime) => runtime.id === runtimeId);
14655
+ const runtime = config.local.runtimes.find((candidate) => candidate.id === runtimeId);
14656
+ if (runtime === undefined) {
14657
+ return;
14658
+ }
14659
+ return withReportedModelSlots(runtime, reportedSlotsByRuntime.get(runtimeId));
14501
14660
  };
14502
14661
  const runtimeLimiter = createRuntimeConcurrencyLimiter({
14503
14662
  capacityFor: (key2) => {
@@ -14522,6 +14681,8 @@ var server = async (ctx, rawOptions) => {
14522
14681
  localRuntimeReachable,
14523
14682
  reachableRuntimeIds: probeReachableRuntimeIds,
14524
14683
  runtimeLimiter,
14684
+ reportedModelSlots,
14685
+ rosterRoleIDs: () => readStoredRosterRoleIDs(storage),
14525
14686
  warn: diagnostics.warn("unknown-role")
14526
14687
  });
14527
14688
  const memoryTool = createMemoryTool({
@@ -14543,7 +14704,8 @@ var server = async (ctx, rawOptions) => {
14543
14704
  warn: diagnostics.warn("unknown-role"),
14544
14705
  localRuntimeReachable,
14545
14706
  reachableRuntimeIds: probeReachableRuntimeIds,
14546
- runtimeLimiter
14707
+ runtimeLimiter,
14708
+ reportedModelSlots
14547
14709
  }
14548
14710
  });
14549
14711
  const registerCastTool = createRegisterCastTool({
@@ -1 +1 @@
1
- {"version":3,"file":"lemonade.d.ts","sourceRoot":"","sources":["../../src/local/lemonade.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAIV,cAAc,EAGf,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AA6BzE,wBAAgB,qBAAqB,IAAI,cAAc,CA0CtD"}
1
+ {"version":3,"file":"lemonade.d.ts","sourceRoot":"","sources":["../../src/local/lemonade.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAIV,cAAc,EAGf,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AAmCzE,wBAAgB,qBAAqB,IAAI,cAAc,CA0CtD"}
@@ -33,4 +33,18 @@ export declare function anyRuntimeReachable(snapshots: readonly LocalRuntimeSnap
33
33
  * one. Pure over probe results; reachability I/O lives in `RuntimeRegistry.probe`.
34
34
  */
35
35
  export declare function reachableRuntimeIds(snapshots: readonly LocalRuntimeSnapshot[]): Set<LocalRuntimeId>;
36
+ /**
37
+ * Per-model slot counts each reachable runtime REPORTED over its API, keyed by
38
+ * runtime instance id then by model id (#217).
39
+ *
40
+ * The health-probe path already carries the slot count a model was loaded with
41
+ * (`LocalModelInfo.slots`), measured from the runtime itself — on a live
42
+ * Lemonade host the coder model served `--parallel 3` while the thinking model
43
+ * served `--parallel 1`. Surfacing that here lets the plugin apply those counts
44
+ * to a config that declares none, so a low-slot model stops being over-dispatched
45
+ * to. A runtime that reports no slots (an adapter that cannot, or a server too
46
+ * old to expose them) contributes no entry, preserving the single-pool default.
47
+ * Pure over probe results; probing I/O lives in `RuntimeRegistry.probe`.
48
+ */
49
+ export declare function reportedModelSlotsByRuntime(snapshots: readonly LocalRuntimeSnapshot[]): Map<LocalRuntimeId, Record<string, number>>;
36
50
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/local/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAEhE,YAAY,OAAO,EAAE,sBAAsB,EAW1C;IAEK,KAAK,CACT,QAAQ,EAAE,SAAS,YAAY,EAAE,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA+BjC;IAED,OAAO,CAAC,kBAAkB;CAuB3B;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,cAAc,EAAE,CAWlB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,GAAG,CAAC,cAAc,CAAC,CAQrB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/local/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAEhE,YAAY,OAAO,EAAE,sBAAsB,EAW1C;IAEK,KAAK,CACT,QAAQ,EAAE,SAAS,YAAY,EAAE,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA+BjC;IAED,OAAO,CAAC,kBAAkB;CAuB3B;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,cAAc,EAAE,CAWlB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,GAAG,CAAC,cAAc,CAAC,CAQrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiB7C"}
@@ -53,6 +53,27 @@ export declare function slotPoolReservedInteractive(runtime: Pick<LocalRuntime,
53
53
  * unbounded capacity. Pure.
54
54
  */
55
55
  export declare function unknownPoolCapacity(): number;
56
+ /**
57
+ * A runtime whose per-model slot pools also reflect what the runtime REPORTED
58
+ * over its API, for the models the config declares no slot count for (#217).
59
+ *
60
+ * `openteam setup` writes `modelConcurrency` from the slot counts a runtime
61
+ * reports, but an existing config predating that — or one written by hand —
62
+ * declares none, so every model shares the single `maxConcurrency` pool and a
63
+ * 1-slot model is over-dispatched to (three of four generations then queue
64
+ * inside the server, invisible to the limiter). The runtime already reports its
65
+ * real per-model slot counts on the health-probe path, so folding them in here
66
+ * closes that gap without a re-run of setup.
67
+ *
68
+ * Explicit config ALWAYS wins: a `modelConcurrency` entry the operator wrote
69
+ * overrides the reported count for the same model, because explicit operator
70
+ * intent outranks detection. Reported counts only fill the models the config is
71
+ * silent on.
72
+ *
73
+ * Returns the runtime UNCHANGED when nothing was reported, so a runtime whose
74
+ * adapter cannot report slots keeps its exact prior single-pool behaviour. Pure.
75
+ */
76
+ export declare function withReportedModelSlots<T extends Pick<LocalRuntime, "modelConcurrency">>(runtime: T, reported: Readonly<Record<string, number>> | undefined): T;
56
77
  /** Re-exported so callers resolving pools do not also import the schema module. */
57
78
  export { effectiveReservedInteractiveSlots };
58
79
  //# sourceMappingURL=slotPool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slotPool.d.ts","sourceRoot":"","sources":["../../src/local/slotPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iCAAiC,EACjC,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAW9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,kBAAkB,CAAC,EACtD,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAG7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,kBAAkB,CAAC,EAClE,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAIR;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,IAAI,CACX,YAAY,EACZ,gBAAgB,GAAG,kBAAkB,GAAG,0BAA0B,CACnE,EACD,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,mFAAmF;AACnF,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
1
+ {"version":3,"file":"slotPool.d.ts","sourceRoot":"","sources":["../../src/local/slotPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iCAAiC,EACjC,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAW9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,kBAAkB,CAAC,EACtD,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAG7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,kBAAkB,CAAC,EAClE,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAIR;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,IAAI,CACX,YAAY,EACZ,gBAAgB,GAAG,kBAAkB,GAAG,0BAA0B,CACnE,EACD,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,EAChD,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAQvE;AAED,mFAAmF;AACnF,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
@@ -93,6 +93,19 @@ export type CoordinatorDeps = {
93
93
  * released in a `finally`, so it stays pinned to its runtime for its duration.
94
94
  */
95
95
  runtimeLimiter?: RuntimeConcurrencyLimiter;
96
+ /**
97
+ * Per-model slot counts a runtime REPORTED over its API, looked up by instance
98
+ * id (#217). When a runtime declares no `modelConcurrency` for a model but the
99
+ * probe observed a slot count for it, the dispatch competes in a per-model pool
100
+ * sized to that reported count instead of the bare runtime pool — so a 1-slot
101
+ * model is not over-dispatched to. Explicit config always wins over the report.
102
+ *
103
+ * Injected reader, not I/O: the composition root probes in `src/local/**` and
104
+ * caches the result, and this port hands the coordinator the cached counts so
105
+ * the dispatch stays free of network access. Optional so existing callers keep
106
+ * the exact pre-#217 single-pool behaviour when it is absent.
107
+ */
108
+ reportedModelSlots?: (runtimeId: LocalRuntimeId) => Readonly<Record<string, number>> | undefined;
96
109
  };
97
110
  export type CorrelatedCostRecord = CostRecord & {
98
111
  decisionID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"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"}
@@ -170,6 +170,32 @@ export type OrchestrateDeps = {
170
170
  * queues excess work. Required so dropping the wiring is a compile error.
171
171
  */
172
172
  readonly runtimeLimiter: RuntimeConcurrencyLimiter;
173
+ /**
174
+ * Per-model reported-slot reader (#217). A REQUIRED injected reader hand-fed
175
+ * from the composition root's cached probe results, passed through to the
176
+ * coordinator so a config that declares no `modelConcurrency` still caps each
177
+ * model at the slot count the runtime reported (a 1-slot model then stops being
178
+ * over-dispatched to). Required (not optional) so dropping the composition-root
179
+ * wiring is a compile error, the same posture as the limiter and reachability
180
+ * ports. Not I/O: the probe runs in `src/local/**`; this only reads its cache.
181
+ */
182
+ readonly reportedModelSlots: (runtimeId: LocalRuntimeId) => Readonly<Record<string, number>> | undefined;
183
+ /**
184
+ * Registered project-roster role IDs (#roleid-roster). A REQUIRED injected I/O
185
+ * port — the roster lives on disk behind the `StorageProvider` boundary,
186
+ * outside router purity, so it cannot be read from the pure config. The tool
187
+ * consults it so a role the operator deliberately cast into the roster but has
188
+ * not given an `orchestrator.roles` profile — a product-supported state:
189
+ * `openteam-register-cast` returns success for it and `openteam doctor` prints
190
+ * it as informational, not an error — is accepted, while a name the model
191
+ * invented (present in neither config nor roster) is rejected. Required (not
192
+ * optional) so that dropping the injection at the composition root is a compile
193
+ * error rather than a silent fail-open that would reject legitimately-cast
194
+ * custom roles and reintroduce this exact regression. The adapter MUST be
195
+ * fail-safe: on a missing or unparseable roster it returns an empty set, and it
196
+ * must never throw.
197
+ */
198
+ readonly rosterRoleIDs: () => Promise<ReadonlySet<string>>;
173
199
  };
174
200
  /**
175
201
  * Builds a `GraphSpecV1` from orchestrate payload assignments. Each assignment
@@ -230,6 +256,35 @@ export declare function assignableRoleIDs(config: OpenTeamConfig): string[];
230
256
  * Builds the tool description. Dynamic because the roster is config-driven.
231
257
  */
232
258
  export declare function orchestrateToolDescription(config: OpenTeamConfig): string;
259
+ /**
260
+ * Returns the assignment roleIDs that are genuinely invented: they resolve NO
261
+ * curated or configured routing profile AND are not registered in the project
262
+ * roster. This is the exact set that would otherwise fall through to
263
+ * `synthesiseFallbackProfile`, a neutral FRONTIER-ELIGIBLE profile, without the
264
+ * operator ever having asked for that role.
265
+ *
266
+ * A roleID is accepted when either:
267
+ * - `getRoleProfile` resolves it against the built-in `TEAM_ROLES`, a legacy
268
+ * themed alias, or a role the user declared under `orchestrator.roles`; or
269
+ * - it appears in `rosterRoleIDs` — a role the operator deliberately cast into
270
+ * the project roster. A roster entry without a profile is a product-supported
271
+ * state (`openteam-register-cast` returns success for it and `openteam doctor`
272
+ * reports it as informational, not an error), so it must NOT be rejected here.
273
+ *
274
+ * Anything else is a name the coordinator model invented on the fly; routing it
275
+ * on the fallback profile silently bypasses curated routing, so the tool rejects
276
+ * it instead of dispatching it.
277
+ *
278
+ * This preserves the open-roleID doctrine: a genuinely custom project roleID
279
+ * stays valid the moment it is either declared under `orchestrator.roles` or
280
+ * cast into the roster. What is no longer accepted is an undeclared, unregistered
281
+ * name the model guessed.
282
+ *
283
+ * Pure: no I/O, clock, random, or env — the roster is read by the caller through
284
+ * an injected port and passed in as a set. Order-preserving and de-duplicated so
285
+ * the error message lists each offending id exactly once.
286
+ */
287
+ export declare function unknownAssignmentRoleIDs(assignments: readonly OrchestratePayload["assignments"][number][], config: OpenTeamConfig, rosterRoleIDs: ReadonlySet<string>): string[];
233
288
  /**
234
289
  * Creates the `openteam-orchestrate` tool.
235
290
  *
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrateTool.d.ts","sourceRoot":"","sources":["../../src/plugin/orchestrateTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrateTool.d.ts","sourceRoot":"","sources":["../../src/plugin/orchestrateTool.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ErrorClass, GraphEventType, GraphEventV1 } from "../graph/schema";
1
+ import type { ErrorClass, GraphEventType, GraphEventV1, NodeFailureClass } from "../graph/schema";
2
2
  /**
3
3
  * **Reference-only** telemetry projection for Graph events (GE-037).
4
4
  *
@@ -19,6 +19,7 @@ export type GraphTelemetryRecord = {
19
19
  readonly operationID?: string;
20
20
  readonly attemptID?: string;
21
21
  readonly errorClass?: ErrorClass;
22
+ readonly failureClass?: NodeFailureClass;
22
23
  readonly specDigest?: string;
23
24
  readonly artifact?: {
24
25
  readonly uri: string;
@@ -1 +1 @@
1
- {"version":3,"file":"graphProjection.d.ts","sourceRoot":"","sources":["../../src/telemetry/graphProjection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhF;;;;;;;;;GASG;AAEH,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB,CAe3E"}
1
+ {"version":3,"file":"graphProjection.d.ts","sourceRoot":"","sources":["../../src/telemetry/graphProjection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;GASG;AAEH,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB,CAkB3E"}
@@ -1,4 +1,4 @@
1
- import type { ErrorClass, GraphSpecV1 } from "../graph/schema";
1
+ import type { ErrorClass, GraphSpecV1, NodeFailureClass } from "../graph/schema";
2
2
  import type { GraphState } from "../graph/types";
3
3
  import type { GraphTelemetryRecord } from "./graphProjection";
4
4
  /**
@@ -30,6 +30,8 @@ export type GraphNodeView = {
30
30
  readonly state: GraphViewNodeState;
31
31
  readonly attempts: number;
32
32
  readonly lastErrorClass?: ErrorClass;
33
+ /** Precise cause behind lastErrorClass (#225). Absent on pre-#225 journals. */
34
+ readonly lastFailureClass?: NodeFailureClass;
33
35
  readonly review?: {
34
36
  readonly verdict: ReviewVerdict;
35
37
  readonly reassigned: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"graphView.d.ts","sourceRoot":"","sources":["../../src/telemetry/graphView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;;;;;;;;;;GAWG;AAEH,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,OAAO,GACP,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAC;AAErE,2DAA2D;AAC3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,CAAC;AA8FF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,qBAAqB,CAgB3E"}
1
+ {"version":3,"file":"graphView.d.ts","sourceRoot":"","sources":["../../src/telemetry/graphView.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmanuelcorral/openteam",
3
- "version": "0.17.3",
3
+ "version": "0.17.5",
4
4
  "packageManager": "bun@1.3.14",
5
5
  "description": "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
6
6
  "license": "MIT",