@wrongstack/core 0.298.1 → 0.298.3

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.
@@ -5741,8 +5741,16 @@ function resolveSubagentModelTarget(config, role, opts = {}) {
5741
5741
  const resolution = resolveModelMatrixResolution(config.modelMatrix, role);
5742
5742
  const matrixTarget = resolveModelTargetFromEntry(config, resolution?.entry);
5743
5743
  const implementationTarget = opts.implementationTarget ?? resolveImplementationModelTarget(config);
5744
+ const isAvailable = (providerId, model) => {
5745
+ if (!opts.statusTracker) return true;
5746
+ if (!providerId || !model) return true;
5747
+ return opts.statusTracker.isAvailable(providerId, model);
5748
+ };
5749
+ const matrixEffective = materializeTarget(config, matrixTarget);
5750
+ const matrixIsAvailable = !matrixEffective || isAvailable(matrixEffective.provider, matrixEffective.model);
5744
5751
  if (!roleNeedsIndependentReviewModel(role)) {
5745
5752
  if (!matrixTarget) return void 0;
5753
+ if (!matrixIsAvailable) return void 0;
5746
5754
  return {
5747
5755
  ...matrixTarget,
5748
5756
  source: "matrix",
@@ -5751,16 +5759,27 @@ function resolveSubagentModelTarget(config, role, opts = {}) {
5751
5759
  }
5752
5760
  const matrixRef = materializeTarget(config, matrixTarget);
5753
5761
  if (resolution?.source === "role" || resolution?.source === "phase") {
5754
- return matrixTarget ? { ...matrixTarget, source: "matrix", matrixSource: resolution.source } : void 0;
5762
+ if (!matrixTarget) return void 0;
5763
+ if (!matrixIsAvailable) return void 0;
5764
+ return {
5765
+ ...matrixTarget,
5766
+ source: "matrix",
5767
+ matrixSource: resolution.source
5768
+ };
5755
5769
  }
5756
5770
  if (matrixRef && !sameModelReference(matrixRef, implementationTarget)) {
5771
+ if (!matrixIsAvailable) return void 0;
5757
5772
  return {
5758
5773
  ...matrixTarget ?? {},
5759
5774
  source: "matrix",
5760
5775
  matrixSource: resolution?.source
5761
5776
  };
5762
5777
  }
5763
- const diverse = chooseDiverseModelTarget(config, implementationTarget);
5778
+ const diverse = chooseDiverseModelTargetWithTracker(
5779
+ config,
5780
+ implementationTarget,
5781
+ opts.statusTracker
5782
+ );
5764
5783
  if (diverse) {
5765
5784
  return {
5766
5785
  provider: diverse.provider,
@@ -5774,6 +5793,7 @@ function resolveSubagentModelTarget(config, role, opts = {}) {
5774
5793
  };
5775
5794
  }
5776
5795
  if (!matrixTarget) return void 0;
5796
+ if (!matrixIsAvailable) return void 0;
5777
5797
  return {
5778
5798
  ...matrixTarget,
5779
5799
  source: "matrix",
@@ -5810,6 +5830,14 @@ function chooseDiverseModelTarget(config, avoid) {
5810
5830
  candidates.sort((a, b) => modelDiversityScore(b, avoid) - modelDiversityScore(a, avoid));
5811
5831
  return candidates[0];
5812
5832
  }
5833
+ function chooseDiverseModelTargetWithTracker(config, avoid, tracker) {
5834
+ if (!tracker) return chooseDiverseModelTarget(config, avoid);
5835
+ const ranked = collectConfiguredModelTargets(config).filter((candidate) => !sameModelReference(candidate, avoid)).sort((a, b) => modelDiversityScore(b, avoid) - modelDiversityScore(a, avoid));
5836
+ for (const candidate of ranked) {
5837
+ if (tracker.isAvailable(candidate.provider, candidate.model)) return candidate;
5838
+ }
5839
+ return void 0;
5840
+ }
5813
5841
  function collectConfiguredModelTargets(config) {
5814
5842
  const seen = /* @__PURE__ */ new Set();
5815
5843
  const out = [];
@@ -1,4 +1,4 @@
1
- import type { WireFamily } from '../models-registry.js';
1
+ import type { ModelsDevModel, WireFamily } from '../models-registry.js';
2
2
  import type { Capabilities } from '../provider.js';
3
3
  import type { ModelRuntimeConfig } from './runtime.js';
4
4
  export interface ProviderApiKey {
@@ -143,6 +143,18 @@ export interface CustomModelDefinition {
143
143
  * or catalog entry is used.
144
144
  */
145
145
  maxOutput?: number | undefined;
146
+ /**
147
+ * Full models.dev model payload (ME-2, Model Editor). Stores all schema
148
+ * fields for catalog overrides (delta — only changed fields are set) and
149
+ * custom (non-catalog) models (full object). Validated by
150
+ * `modelsDevModelSchema` from `@wrongstack/core/models`.
151
+ *
152
+ * Legacy derived fields above (`name`, `capabilities`, `maxOutput`) stay
153
+ * functional for existing configs and are kept in sync by
154
+ * `normalizeInlineProviderModels` — prefer setting `modelsDev` for new
155
+ * code so the full schema round-trips.
156
+ */
157
+ modelsDev?: Omit<ModelsDevModel, 'id'> | undefined;
146
158
  }
147
159
  /**
148
160
  * Skill subsystem configuration. All fields optional; the subsystem itself is
@@ -41,7 +41,7 @@ export interface ModelsDevModel {
41
41
  modalities?: {
42
42
  input?: string[] | undefined;
43
43
  output?: string[] | undefined;
44
- };
44
+ } | undefined;
45
45
  cost?: {
46
46
  input?: number | undefined;
47
47
  output?: number | undefined;
@@ -49,12 +49,17 @@ export interface ModelsDevModel {
49
49
  cache_write?: number | undefined;
50
50
  cache_write_5m?: number | undefined;
51
51
  cache_write_1h?: number | undefined;
52
- [k: string]: number | undefined;
53
- };
52
+ /**
53
+ * Unknown cost keys: upstream is NOT number-only (e.g. `tiers` is an
54
+ * array of tier objects on ~300 models, census 2026-08-03). Keep this
55
+ * index `unknown` — named keys above stay typed for consumers.
56
+ */
57
+ [k: string]: unknown;
58
+ } | undefined;
54
59
  limit?: {
55
60
  context?: number | undefined;
56
61
  output?: number | undefined;
57
- };
62
+ } | undefined;
58
63
  [k: string]: unknown;
59
64
  }
60
65
  export interface ModelsDevProvider {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/core",
3
- "version": "0.298.1",
3
+ "version": "0.298.3",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack core: kernel, types, defaults, and shared utilities for the WrongStack CLI agent.",
6
6
  "repository": {
@@ -172,8 +172,9 @@
172
172
  ],
173
173
  "wrongstackApiVersion": "0.1.10",
174
174
  "dependencies": {
175
- "@wrongstack/persistence": "0.298.1",
176
- "@wrongstack/kanban": "0.298.1"
175
+ "zod": "4.4.3",
176
+ "@wrongstack/kanban": "0.298.3",
177
+ "@wrongstack/persistence": "0.298.3"
177
178
  },
178
179
  "devDependencies": {
179
180
  "@types/node": "^26.1.2",