@ai-matrx/agents 0.59.192 → 0.59.193

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/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.59.193
4
+
5
+ UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
+ Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/matrx-agents/src`.
7
+
3
8
  ## 0.59.192
9
+
10
+ Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 89bae1f6f7 7829f4d91a -- apps/shared/matrx-agents/src`
11
+ has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
12
+
13
+ ## 0.59.191
4
14
  ### THE model-settings panel (2026-10-21)
5
15
 
6
16
  - Added `./settings/react` `ModelSettingsPanel`, `ExtraSettingRow`, `SettingRowFrame`, `SettingsGroupSection`, `SettingRowLabel`, `formatSettingValue`; `./settings` `SettingsWriteTarget` / `CapabilitiesWriteTarget` / `SettingRowRead`, `isOffValue` / `offValueFor` / `settingStateOf` / `withSettingState` / `ENUM_OFF_VALUE`, `isUnsetChoice` / `AUTO_VALUE` / `AUTO_MEANS_UNSET_KEYS`, `startingValueFor`.
@@ -703,7 +703,7 @@ var MANDATE_KEYS = {
703
703
  */
704
704
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
705
705
  /**
706
- * @deprecated retiring since 0.59.192 — no longer declared in
706
+ * @deprecated retiring since 0.59.193 — no longer declared in
707
707
  * aidream. It leaves this union once no snapshot within the last
708
708
  * 3 published versions still carries it as active.
709
709
  */
@@ -680,7 +680,7 @@ var MANDATE_KEYS = {
680
680
  */
681
681
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
682
682
  /**
683
- * @deprecated retiring since 0.59.192 — no longer declared in
683
+ * @deprecated retiring since 0.59.193 — no longer declared in
684
684
  * aidream. It leaves this union once no snapshot within the last
685
685
  * 3 published versions still carries it as active.
686
686
  */
@@ -656,7 +656,7 @@ var MANDATE_KEYS = {
656
656
  */
657
657
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
658
658
  /**
659
- * @deprecated retiring since 0.59.192 — no longer declared in
659
+ * @deprecated retiring since 0.59.193 — no longer declared in
660
660
  * aidream. It leaves this union once no snapshot within the last
661
661
  * 3 published versions still carries it as active.
662
662
  */
@@ -628,7 +628,7 @@ var MANDATE_KEYS = {
628
628
  */
629
629
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
630
630
  /**
631
- * @deprecated retiring since 0.59.192 — no longer declared in
631
+ * @deprecated retiring since 0.59.193 — no longer declared in
632
632
  * aidream. It leaves this union once no snapshot within the last
633
633
  * 3 published versions still carries it as active.
634
634
  */
@@ -47,9 +47,9 @@ module.exports = __toCommonJS(mandates_exports);
47
47
 
48
48
  // mandates/keys.generated.ts
49
49
  var MANDATE_KEYS_META = {
50
- aidreamRevision: "7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c",
50
+ aidreamRevision: "3165453310fa6d42f3b90249a12d956eeebe7636",
51
51
  generatorVersion: "1.0.0",
52
- packageVersion: "0.59.192",
52
+ packageVersion: "0.59.193",
53
53
  retireWindow: 3
54
54
  };
55
55
  var MANDATE_KEYS = {
@@ -666,7 +666,7 @@ var MANDATE_KEYS = {
666
666
  */
667
667
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
668
668
  /**
669
- * @deprecated retiring since 0.59.192 — no longer declared in
669
+ * @deprecated retiring since 0.59.193 — no longer declared in
670
670
  * aidream. It leaves this union once no snapshot within the last
671
671
  * 3 published versions still carries it as active.
672
672
  */
@@ -693,7 +693,7 @@ var MANDATE_KEYS = {
693
693
  var ALL_MANDATE_KEYS = Object.values(MANDATE_KEYS);
694
694
  var RETIRING_MANDATE_KEYS = {
695
695
  "brand_discovery.offering_roles": "0.59.0",
696
- "coding_session.managed_translation_reference": "0.59.192",
696
+ "coding_session.managed_translation_reference": "0.59.193",
697
697
  "pdf.content_cleaner": "0.59.0",
698
698
  "sms.owner_beta": "0.59.0",
699
699
  "voice.owner_beta": "0.59.0"
@@ -6,9 +6,9 @@
6
6
  * from the IN-PROCESS mandate declarations — the same `declared_mandates()` the
7
7
  * boot sync writes to the database from. There is no hand list anywhere.
8
8
  *
9
- * aidream revision: 7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c
9
+ * aidream revision: 3165453310fa6d42f3b90249a12d956eeebe7636
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.192
11
+ * package version: 0.59.193
12
12
  * active keys: 606
13
13
  * retiring keys: 5
14
14
  *
@@ -19,9 +19,9 @@
19
19
  */
20
20
  /** Where this module came from — surfaced so a report can name the exact build. */
21
21
  declare const MANDATE_KEYS_META: {
22
- readonly aidreamRevision: "7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c";
22
+ readonly aidreamRevision: "3165453310fa6d42f3b90249a12d956eeebe7636";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.192";
24
+ readonly packageVersion: "0.59.193";
25
25
  readonly retireWindow: 3;
26
26
  };
27
27
  /** Every declared mandate key, by THE IDENTIFIER RULE. */
@@ -639,7 +639,7 @@ declare const MANDATE_KEYS: {
639
639
  */
640
640
  readonly brand_discovery__offering_roles: "brand_discovery.offering_roles";
641
641
  /**
642
- * @deprecated retiring since 0.59.192 — no longer declared in
642
+ * @deprecated retiring since 0.59.193 — no longer declared in
643
643
  * aidream. It leaves this union once no snapshot within the last
644
644
  * 3 published versions still carries it as active.
645
645
  */
@@ -670,7 +670,7 @@ declare const ALL_MANDATE_KEYS: readonly MandateKey[];
670
670
  /** Keys still in the union but no longer declared (two-phase retire, phase 1). */
671
671
  declare const RETIRING_MANDATE_KEYS: {
672
672
  readonly "brand_discovery.offering_roles": "0.59.0";
673
- readonly "coding_session.managed_translation_reference": "0.59.192";
673
+ readonly "coding_session.managed_translation_reference": "0.59.193";
674
674
  readonly "pdf.content_cleaner": "0.59.0";
675
675
  readonly "sms.owner_beta": "0.59.0";
676
676
  readonly "voice.owner_beta": "0.59.0";
@@ -6,9 +6,9 @@
6
6
  * from the IN-PROCESS mandate declarations — the same `declared_mandates()` the
7
7
  * boot sync writes to the database from. There is no hand list anywhere.
8
8
  *
9
- * aidream revision: 7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c
9
+ * aidream revision: 3165453310fa6d42f3b90249a12d956eeebe7636
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.192
11
+ * package version: 0.59.193
12
12
  * active keys: 606
13
13
  * retiring keys: 5
14
14
  *
@@ -19,9 +19,9 @@
19
19
  */
20
20
  /** Where this module came from — surfaced so a report can name the exact build. */
21
21
  declare const MANDATE_KEYS_META: {
22
- readonly aidreamRevision: "7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c";
22
+ readonly aidreamRevision: "3165453310fa6d42f3b90249a12d956eeebe7636";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.192";
24
+ readonly packageVersion: "0.59.193";
25
25
  readonly retireWindow: 3;
26
26
  };
27
27
  /** Every declared mandate key, by THE IDENTIFIER RULE. */
@@ -639,7 +639,7 @@ declare const MANDATE_KEYS: {
639
639
  */
640
640
  readonly brand_discovery__offering_roles: "brand_discovery.offering_roles";
641
641
  /**
642
- * @deprecated retiring since 0.59.192 — no longer declared in
642
+ * @deprecated retiring since 0.59.193 — no longer declared in
643
643
  * aidream. It leaves this union once no snapshot within the last
644
644
  * 3 published versions still carries it as active.
645
645
  */
@@ -670,7 +670,7 @@ declare const ALL_MANDATE_KEYS: readonly MandateKey[];
670
670
  /** Keys still in the union but no longer declared (two-phase retire, phase 1). */
671
671
  declare const RETIRING_MANDATE_KEYS: {
672
672
  readonly "brand_discovery.offering_roles": "0.59.0";
673
- readonly "coding_session.managed_translation_reference": "0.59.192";
673
+ readonly "coding_session.managed_translation_reference": "0.59.193";
674
674
  readonly "pdf.content_cleaner": "0.59.0";
675
675
  readonly "sms.owner_beta": "0.59.0";
676
676
  readonly "voice.owner_beta": "0.59.0";
@@ -1,8 +1,8 @@
1
1
  // mandates/keys.generated.ts
2
2
  var MANDATE_KEYS_META = {
3
- aidreamRevision: "7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c",
3
+ aidreamRevision: "3165453310fa6d42f3b90249a12d956eeebe7636",
4
4
  generatorVersion: "1.0.0",
5
- packageVersion: "0.59.192",
5
+ packageVersion: "0.59.193",
6
6
  retireWindow: 3
7
7
  };
8
8
  var MANDATE_KEYS = {
@@ -619,7 +619,7 @@ var MANDATE_KEYS = {
619
619
  */
620
620
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
621
621
  /**
622
- * @deprecated retiring since 0.59.192 — no longer declared in
622
+ * @deprecated retiring since 0.59.193 — no longer declared in
623
623
  * aidream. It leaves this union once no snapshot within the last
624
624
  * 3 published versions still carries it as active.
625
625
  */
@@ -646,7 +646,7 @@ var MANDATE_KEYS = {
646
646
  var ALL_MANDATE_KEYS = Object.values(MANDATE_KEYS);
647
647
  var RETIRING_MANDATE_KEYS = {
648
648
  "brand_discovery.offering_roles": "0.59.0",
649
- "coding_session.managed_translation_reference": "0.59.192",
649
+ "coding_session.managed_translation_reference": "0.59.193",
650
650
  "pdf.content_cleaner": "0.59.0",
651
651
  "sms.owner_beta": "0.59.0",
652
652
  "voice.owner_beta": "0.59.0"
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // models/index.ts
21
21
  var models_exports = {};
22
22
  __export(models_exports, {
23
+ AGENT_AUTHORING_DEFAULT_MODEL_KNOB: () => AGENT_AUTHORING_DEFAULT_MODEL_KNOB,
23
24
  CHAT_DEFAULT_MODEL_KNOB: () => CHAT_DEFAULT_MODEL_KNOB,
24
25
  CONTENT_TYPES: () => CONTENT_TYPES,
25
26
  DEFAULT_CAPABILITIES: () => DEFAULT_CAPABILITIES,
@@ -41,11 +42,13 @@ __export(models_exports, {
41
42
  TOP_TIER_COST_RATING: () => TOP_TIER_COST_RATING,
42
43
  TOP_TIER_LOCKED_TITLE: () => TOP_TIER_LOCKED_TITLE,
43
44
  acceptsTextInstructions: () => acceptsTextInstructions,
45
+ blendedPrice: () => blendedPrice,
44
46
  buildModelClassIndex: () => buildModelClassIndex,
45
47
  buildSuccessionIndex: () => buildSuccessionIndex,
46
48
  catalogFingerprint: () => catalogFingerprint,
47
49
  catalogForApp: () => catalogForApp,
48
50
  catalogKindOf: () => catalogKindOf,
51
+ cheapestAdequateModel: () => cheapestAdequateModel,
49
52
  classConfigKey: () => classConfigKey,
50
53
  collapseTiersByClass: () => collapseTiersByClass,
51
54
  costRatingTier: () => costRatingTier,
@@ -59,6 +62,7 @@ __export(models_exports, {
59
62
  fetchCuratedModels: () => fetchCuratedModels,
60
63
  findNonCanonicalCapabilityValues: () => findNonCanonicalCapabilityValues,
61
64
  fitsMemory: () => fitsMemory,
65
+ fitsNeed: () => fitsNeed,
62
66
  fitsThisComputer: () => fitsThisComputer,
63
67
  formatMemoryBytes: () => formatMemoryBytes,
64
68
  fromDiscovery: () => fromDiscovery,
@@ -67,6 +71,7 @@ __export(models_exports, {
67
71
  groupFeatures: () => groupFeatures,
68
72
  hardwareClassesOf: () => hardwareClassesOf,
69
73
  hasCompatibleDecisionInteraction: () => hasCompatibleDecisionInteraction,
74
+ isChatModelCapability: () => isChatModelCapability,
70
75
  isContentType: () => isContentType,
71
76
  isConversationalModelCapability: () => isConversationalModelCapability,
72
77
  isDecisionModelCapability: () => isDecisionModelCapability,
@@ -86,6 +91,7 @@ __export(models_exports, {
86
91
  modelClassName: () => modelClassName,
87
92
  modelClassPinOf: () => modelClassPinOf,
88
93
  modelsForSelectionPurpose: () => modelsForSelectionPurpose,
94
+ newAgentModelStandInCount: () => newAgentModelStandInCount,
89
95
  normalizeArch: () => normalizeArch,
90
96
  normalizeModel: () => normalizeModel,
91
97
  normalizeModels: () => normalizeModels,
@@ -108,8 +114,10 @@ __export(models_exports, {
108
114
  requiredArtifacts: () => requiredArtifacts,
109
115
  resetSuccessionLogForTests: () => resetSuccessionLogForTests,
110
116
  resolveLiveModelId: () => resolveLiveModelId,
117
+ resolveNewAgentModelId: () => resolveNewAgentModelId,
111
118
  resolvePreferredModelChoice: () => resolvePreferredModelChoice,
112
119
  resolveSuccessor: () => resolveSuccessor,
120
+ seesImages: () => seesImages,
113
121
  selectActiveModels: () => selectActiveModels,
114
122
  selectActiveModelsReady: () => selectActiveModelsReady,
115
123
  selectAllModelOptions: () => selectAllModelOptions,
@@ -139,6 +147,7 @@ __export(models_exports, {
139
147
  speedRatingLabel: () => speedRatingLabel,
140
148
  speedRatingWord: () => speedRatingWord,
141
149
  splitSetProblems: () => splitSetProblems,
150
+ takesInput: () => takesInput,
142
151
  toAuditRecord: () => toAuditRecord,
143
152
  validateModelSet: () => validateModelSet,
144
153
  withModelClass: () => withModelClass
@@ -2672,3 +2681,77 @@ async function readModelCatalog(client, opts = {}) {
2672
2681
  out.catalog_fingerprint = catalogFingerprint(out);
2673
2682
  return out;
2674
2683
  }
2684
+
2685
+ // models/fit.ts
2686
+ var featuresOf = (c) => {
2687
+ const f = c.features;
2688
+ if (!f) return [];
2689
+ return Array.isArray(f) ? f : f.raw ?? [];
2690
+ };
2691
+ function seesImages(c) {
2692
+ return (c.input ?? []).includes("image") || featuresOf(c).includes("vision");
2693
+ }
2694
+ function takesInput(c, modality) {
2695
+ if (modality === "image") return seesImages(c);
2696
+ return (c.input ?? []).includes(modality);
2697
+ }
2698
+ var MEDIA_GENERATION_FEATURES = /* @__PURE__ */ new Set(["image_generation", "video_generation", "audio_generation", "music_generation"]);
2699
+ function isChatModelCapability(c) {
2700
+ if (c.interaction !== "turn") return false;
2701
+ if (!(c.input ?? []).includes("text")) return false;
2702
+ if (!(c.output ?? []).includes("text")) return false;
2703
+ return !featuresOf(c).some((f) => MEDIA_GENERATION_FEATURES.has(f));
2704
+ }
2705
+ function fitsNeed(c, need) {
2706
+ for (const m of need.inputs ?? []) if (!takesInput(c, m)) return false;
2707
+ for (const m of need.outputs ?? []) if (!(c.output ?? []).includes(m)) return false;
2708
+ const features = featuresOf(c);
2709
+ for (const f of need.features ?? []) if (!features.includes(f)) return false;
2710
+ if (need.interaction && c.interaction !== need.interaction) return false;
2711
+ if (need.minContextWindow != null && (c.contextWindow ?? 0) < need.minContextWindow) return false;
2712
+ return true;
2713
+ }
2714
+ function blendedPrice(m, outputWeight = 3) {
2715
+ const i = m.pointsInput;
2716
+ const o = m.pointsOutput;
2717
+ if (i == null && o == null) return null;
2718
+ return ((i ?? o ?? 0) + (o ?? i ?? 0) * outputWeight) / (1 + outputWeight);
2719
+ }
2720
+ function cheapestAdequateModel(catalog, need, options = {}) {
2721
+ const w = options.outputWeight ?? 3;
2722
+ const fits = catalog.filter((m) => !m.retiredAt && (options.includeDeprecated || !m.isDeprecated) && fitsNeed(m, need));
2723
+ if (fits.length === 0) return null;
2724
+ const rank = (m) => blendedPrice(m, w);
2725
+ return [...fits].sort((a, b) => {
2726
+ const pa = rank(a);
2727
+ const pb = rank(b);
2728
+ if (pa != null && pb != null && pa !== pb) return pa - pb;
2729
+ if (pa != null && pb == null) return -1;
2730
+ if (pa == null && pb != null) return 1;
2731
+ const ca = a.costRating ?? Number.MAX_SAFE_INTEGER;
2732
+ const cb = b.costRating ?? Number.MAX_SAFE_INTEGER;
2733
+ if (ca !== cb) return ca - cb;
2734
+ return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
2735
+ })[0];
2736
+ }
2737
+
2738
+ // models/default-model.ts
2739
+ var AGENT_AUTHORING_DEFAULT_MODEL_KNOB = "agents.model_prefs.agent_authoring_default_model";
2740
+ var PENDING_KNOB_ROW_MODEL_ID = "617abdcd-79e2-4a4b-be76-4a9960cdffa1";
2741
+ var standInCount = 0;
2742
+ var newAgentModelStandInCount = () => standInCount;
2743
+ async function resolveNewAgentModelId(resolveKnob) {
2744
+ let why;
2745
+ try {
2746
+ const value = await resolveKnob(AGENT_AUTHORING_DEFAULT_MODEL_KNOB);
2747
+ if (typeof value === "string" && value.trim() !== "") return { modelId: value.trim(), standIn: false };
2748
+ why = "has no value (its platform default row is pending)";
2749
+ } catch (error) {
2750
+ why = `could not be read (${error instanceof Error ? error.message : String(error)})`;
2751
+ }
2752
+ standInCount += 1;
2753
+ console.error(
2754
+ `[newAgentModel] STAND-IN: ${AGENT_AUTHORING_DEFAULT_MODEL_KNOB} ${why} \u2014 this new agent starts on ${PENDING_KNOB_ROW_MODEL_ID} (today's model). Set the knob's default to remove this stand-in.`
2755
+ );
2756
+ return { modelId: PENDING_KNOB_ROW_MODEL_ID, standIn: true };
2757
+ }
@@ -1659,4 +1659,109 @@ declare function catalogFingerprint(catalog: LocalModelCatalog): string;
1659
1659
  */
1660
1660
  declare function readModelCatalog(client: CuratedCatalogClient, opts?: ReadModelCatalogOptions): Promise<LocalModelCatalog>;
1661
1661
 
1662
- export { type AdminOffering, type AdminPricingBand, type ArtifactUse, type AuditCapabilitiesRecord, CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, type CapabilitiesParseContext, type CatalogKindInput, type CatalogModel, type CatalogTier, type CompatStatus, type ContentType, type CuratedCatalogClient, type CuratedModel, type CuratedPresentation, type CuratedRows, type CuratedVariant, DEFAULT_CAPABILITIES, type DecidedBy, type DeviceGraphics, type DeviceHardware, type DiscoveryAmbiguity, type DiscoveryArtifact, type DiscoveryMedia, type DiscoveryResult, type DiscoveryRuntime, type DiscoverySource, type DiscoveryVariant, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, type FeatureBucket, type FeatureBucketMeta, type FeatureKey, GgufError, type GgufHeader, type GgufRead, type GgufTensor, type GroupedFeatures, type HardwareClass, type HardwareClasses, type HeaderFlag, type HeaderJudgement, type HeaderRefusal, INPUT_MODALITIES, INTERACTION_MODES, type Interaction, type InteractionMode, type LocalArtifact, type LocalCatalogClient, type LocalCatalogQuery, type LocalCompatRow, type LocalModel, type LocalModelCatalog, type LocalPresentation, type LocalRuntime, type LocalRuntimeBuild, type LocalVariant, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, type Modality, type ModelCapabilities, type ModelCatalog, type ModelCatalogClient, type ModelCatalogConfig, type ModelCatalogErrorSink, type ModelCatalogPgError, type ModelCatalogPgResult, type ModelCatalogQuery, type ModelCatalogState, type ModelCatalogVariant, type ModelCatalogVariantState, type ModelClassConfig, type ModelClassEntry, type ModelClassIndex, type ModelDiagnosticEntry, type ModelDiagnosticsSink, type ModelFavorites, type ModelFavoritesCache, type ModelFavoritesClient, type ModelFavoritesConfig, type ModelFavoritesErrorSink, type ModelFavoritesState, type ModelFetchScope, type ModelFileHandle, type ModelFit, type ModelIdentityRow, type ModelJson, type ModelOfferingRow, type ModelOption, type ModelOptionWithLifecycle, type ModelRecord, type ModelRecordFetchType, type ModelRecords, type ModelRecordsClient, type ModelRecordsConfig, type ModelRecordsState, type ModelSelectionPurpose, type ModelSetEnv, type ModelSetFacts, type ModelSetValidation, type NoSelection, OUTPUT_MODALITIES, type OrderedLike, type PreferredModelChoice, type PreferredModelChoicePorts, type PriceTier, type RankedVariant, type ReadModelCatalogOptions, SERVICE_LABEL, SERVICE_LABEL_PLURAL, type SelectDevice, type Selection, type ShardName, type SuccessionClient, type SuccessionIndex, type SuccessionNode, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, type VariantDiscovery, type Want, acceptsTextInstructions, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKindOf, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsThisComputer, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelClassKnobFor, modelClassName, modelClassPinOf, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readGgufHeader, readModelCatalog, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifacts, resetSuccessionLogForTests, resolveLiveModelId, resolvePreferredModelChoice, resolveSuccessor, selectActiveModels, selectActiveModelsReady, selectAllModelOptions, selectAllModels, selectAllModelsReady, selectDeprecatedModels, selectDeprecatedModelsReady, selectModelById, selectModelClassConfig, selectModelClassName, selectModelControls, selectModelDetailError, selectModelFetchType, selectModelFullyLoaded, selectModelIdentityById, selectModelIdentityLookupStatus, selectModelLabelById, selectModelLabelWithClass, selectModelNameById, selectModelOptions, selectVariant, serviceCountLabel, setModelDiagnosticsSink, shapeCuratedModels, shardFileName, shardName, speedRatingLabel, speedRatingWord, splitSetProblems, toAuditRecord, validateModelSet, withModelClass };
1662
+ /**
1663
+ * `@ai-matrx/agents/models` — THE fit rules: what a model can do for a purpose, read from the
1664
+ * capability data the catalog holds (`capabilities.input / output / features / interaction`), never
1665
+ * from a placement (a presentation shelf, a page) and never from a list of names.
1666
+ *
1667
+ * One capability can live in two shapes in the data: "sees images" is `input` containing `image`
1668
+ * OR the `vision` feature (the audit projection `toAuditRecord` already reads it that way). Every
1669
+ * filter that asks "does it see images" asks `seesImages`, so a model carrying only one of the two
1670
+ * shapes is never dropped by one surface and kept by another.
1671
+ *
1672
+ * Every picker, every scope chip and every knob that names "the cheapest model that can do X"
1673
+ * (`cheapestAdequateModel`) goes through these, so the web, Matrx 2 and the server-side knobs agree.
1674
+ */
1675
+
1676
+ /** The capability fields a fit rule reads. A CatalogModel, a ModelCapabilities and a LocalModel's `capabilities` all fit. */
1677
+ interface FitCapabilities {
1678
+ readonly input?: readonly string[];
1679
+ readonly output?: readonly string[];
1680
+ /** Raw feature keys, or the picker's grouped features (its `raw` keeps every key). */
1681
+ readonly features?: readonly string[] | Pick<GroupedFeatures, "raw">;
1682
+ readonly interaction?: string;
1683
+ }
1684
+ /** Sees images: `image` input OR the `vision` feature (both shapes the data uses). */
1685
+ declare function seesImages(c: FitCapabilities): boolean;
1686
+ /** Takes this modality as input. `image` reads both shapes (`seesImages`). */
1687
+ declare function takesInput(c: FitCapabilities, modality: string): boolean;
1688
+ /**
1689
+ * Fit for a CHAT turn: an ordinary turn model that takes text in and gives text out, whose job is not
1690
+ * making media (a music or image generator that also returns a caption is not a chat model). Speech-to-text,
1691
+ * embedding, extraction, realtime voice, decision holders and provider-managed agents are out.
1692
+ */
1693
+ declare function isChatModelCapability(c: FitCapabilities): boolean;
1694
+ /** What a job needs from a model. Every listed item is required. */
1695
+ interface ModelNeed {
1696
+ /** Input modalities it must take (`image` = sees images, both shapes). */
1697
+ readonly inputs?: readonly string[];
1698
+ /** Output modalities it must give. */
1699
+ readonly outputs?: readonly string[];
1700
+ /** Raw feature keys it must carry (e.g. `function_calling`, `structured_output`). */
1701
+ readonly features?: readonly string[];
1702
+ /** Required interaction mode (e.g. `turn`). Absent = any. */
1703
+ readonly interaction?: string;
1704
+ /** Minimum context window in tokens. */
1705
+ readonly minContextWindow?: number;
1706
+ }
1707
+ /** Does the model meet every item of the need? */
1708
+ declare function fitsNeed(c: FitCapabilities & {
1709
+ readonly contextWindow?: number | null;
1710
+ }, need: ModelNeed): boolean;
1711
+ /** The catalog fields `cheapestAdequateModel` reads (a picker `CatalogModel` fits as-is). */
1712
+ interface PricedCatalogModel extends FitCapabilities {
1713
+ readonly id: string;
1714
+ readonly name: string;
1715
+ readonly contextWindow?: number | null;
1716
+ /** Points per 1M input tokens (the catalog's price). */
1717
+ readonly pointsInput?: number | null;
1718
+ /** Points per 1M output tokens (the catalog's price). */
1719
+ readonly pointsOutput?: number | null;
1720
+ /** Curated 1-6 cost rating: the tie-break, and the price when no points are set. */
1721
+ readonly costRating?: number | null;
1722
+ readonly isDeprecated?: boolean;
1723
+ readonly retiredAt?: string | null;
1724
+ }
1725
+ interface CheapestAdequateOptions {
1726
+ /** Weight of output price against input price (output tokens usually dominate). Default 3 (1 in : 3 out). */
1727
+ readonly outputWeight?: number;
1728
+ /** Allow deprecated models. Default false (retired models are never chosen). */
1729
+ readonly includeDeprecated?: boolean;
1730
+ }
1731
+ /** The blended price a model is ranked by, or null when the catalog holds no price for it. */
1732
+ declare function blendedPrice(m: PricedCatalogModel, outputWeight?: number): number | null;
1733
+ /**
1734
+ * THE cheapest model in a catalog that meets `need`, by the catalog's own prices (points per 1M
1735
+ * tokens, output weighted). A model with no price ranks after every priced one, by cost rating; ties
1736
+ * break on cost rating then name (stable). Retired models never; deprecated only when asked. Null when
1737
+ * nothing fits — the caller says so; there is no built-in fallback.
1738
+ */
1739
+ declare function cheapestAdequateModel<T extends PricedCatalogModel>(catalog: readonly T[], need: ModelNeed, options?: CheapestAdequateOptions): T | null;
1740
+
1741
+ /**
1742
+ * `@ai-matrx/agents/models` — THE model a new agent starts on comes from a knob, never a constant:
1743
+ * `agents.model_prefs.agent_authoring_default_model` (organization → person → device ladder, through the
1744
+ * host's knob port). Every "make me an agent" path (blank agent, quick agent, templates, the web's manual
1745
+ * create and system-agent create) asks `resolveNewAgentModelId`.
1746
+ *
1747
+ * KNOB ROW PENDING (2026-10-21): the register row exists with `default_value = null`. Until its default is
1748
+ * set to today's model (the SQL is with the owner), an unset knob answers the stand-in below — LOUDLY, every
1749
+ * time, naming the knob — so creating an agent keeps working exactly as before. When the row lands the stand-in
1750
+ * never fires; delete it then. This file is the ONE place a model id literal may appear in shared runtime code
1751
+ * (guard: apps/shared/scripts/check-no-model-literals.mjs).
1752
+ */
1753
+ declare const AGENT_AUTHORING_DEFAULT_MODEL_KNOB = "agents.model_prefs.agent_authoring_default_model";
1754
+ interface NewAgentModel {
1755
+ modelId: string;
1756
+ /** True when the knob held no value and the pending-row stand-in answered (it screamed). */
1757
+ standIn: boolean;
1758
+ }
1759
+ /** How many times the stand-in answered in this process (tests, diagnostics). */
1760
+ declare const newAgentModelStandInCount: () => number;
1761
+ /**
1762
+ * The model a new agent starts on. `resolveKnob(fullKey)` is the host's effective-knob read. A knob value
1763
+ * that is a non-empty string wins; an unset knob, or a knob read that fails, answers the stand-in and says so.
1764
+ */
1765
+ declare function resolveNewAgentModelId(resolveKnob: (fullKey: string) => Promise<unknown>): Promise<NewAgentModel>;
1766
+
1767
+ export { AGENT_AUTHORING_DEFAULT_MODEL_KNOB, type AdminOffering, type AdminPricingBand, type ArtifactUse, type AuditCapabilitiesRecord, CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, type CapabilitiesParseContext, type CatalogKindInput, type CatalogModel, type CatalogTier, type CheapestAdequateOptions, type CompatStatus, type ContentType, type CuratedCatalogClient, type CuratedModel, type CuratedPresentation, type CuratedRows, type CuratedVariant, DEFAULT_CAPABILITIES, type DecidedBy, type DeviceGraphics, type DeviceHardware, type DiscoveryAmbiguity, type DiscoveryArtifact, type DiscoveryMedia, type DiscoveryResult, type DiscoveryRuntime, type DiscoverySource, type DiscoveryVariant, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, type FeatureBucket, type FeatureBucketMeta, type FeatureKey, type FitCapabilities, GgufError, type GgufHeader, type GgufRead, type GgufTensor, type GroupedFeatures, type HardwareClass, type HardwareClasses, type HeaderFlag, type HeaderJudgement, type HeaderRefusal, INPUT_MODALITIES, INTERACTION_MODES, type Interaction, type InteractionMode, type LocalArtifact, type LocalCatalogClient, type LocalCatalogQuery, type LocalCompatRow, type LocalModel, type LocalModelCatalog, type LocalPresentation, type LocalRuntime, type LocalRuntimeBuild, type LocalVariant, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, type Modality, type ModelCapabilities, type ModelCatalog, type ModelCatalogClient, type ModelCatalogConfig, type ModelCatalogErrorSink, type ModelCatalogPgError, type ModelCatalogPgResult, type ModelCatalogQuery, type ModelCatalogState, type ModelCatalogVariant, type ModelCatalogVariantState, type ModelClassConfig, type ModelClassEntry, type ModelClassIndex, type ModelDiagnosticEntry, type ModelDiagnosticsSink, type ModelFavorites, type ModelFavoritesCache, type ModelFavoritesClient, type ModelFavoritesConfig, type ModelFavoritesErrorSink, type ModelFavoritesState, type ModelFetchScope, type ModelFileHandle, type ModelFit, type ModelIdentityRow, type ModelJson, type ModelNeed, type ModelOfferingRow, type ModelOption, type ModelOptionWithLifecycle, type ModelRecord, type ModelRecordFetchType, type ModelRecords, type ModelRecordsClient, type ModelRecordsConfig, type ModelRecordsState, type ModelSelectionPurpose, type ModelSetEnv, type ModelSetFacts, type ModelSetValidation, type NewAgentModel, type NoSelection, OUTPUT_MODALITIES, type OrderedLike, type PreferredModelChoice, type PreferredModelChoicePorts, type PriceTier, type PricedCatalogModel, type RankedVariant, type ReadModelCatalogOptions, SERVICE_LABEL, SERVICE_LABEL_PLURAL, type SelectDevice, type Selection, type ShardName, type SuccessionClient, type SuccessionIndex, type SuccessionNode, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, type VariantDiscovery, type Want, acceptsTextInstructions, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKindOf, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelClassKnobFor, modelClassName, modelClassPinOf, modelsForSelectionPurpose, newAgentModelStandInCount, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readGgufHeader, readModelCatalog, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifacts, resetSuccessionLogForTests, resolveLiveModelId, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, seesImages, selectActiveModels, selectActiveModelsReady, selectAllModelOptions, selectAllModels, selectAllModelsReady, selectDeprecatedModels, selectDeprecatedModelsReady, selectModelById, selectModelClassConfig, selectModelClassName, selectModelControls, selectModelDetailError, selectModelFetchType, selectModelFullyLoaded, selectModelIdentityById, selectModelIdentityLookupStatus, selectModelLabelById, selectModelLabelWithClass, selectModelNameById, selectModelOptions, selectVariant, serviceCountLabel, setModelDiagnosticsSink, shapeCuratedModels, shardFileName, shardName, speedRatingLabel, speedRatingWord, splitSetProblems, takesInput, toAuditRecord, validateModelSet, withModelClass };
@@ -1659,4 +1659,109 @@ declare function catalogFingerprint(catalog: LocalModelCatalog): string;
1659
1659
  */
1660
1660
  declare function readModelCatalog(client: CuratedCatalogClient, opts?: ReadModelCatalogOptions): Promise<LocalModelCatalog>;
1661
1661
 
1662
- export { type AdminOffering, type AdminPricingBand, type ArtifactUse, type AuditCapabilitiesRecord, CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, type CapabilitiesParseContext, type CatalogKindInput, type CatalogModel, type CatalogTier, type CompatStatus, type ContentType, type CuratedCatalogClient, type CuratedModel, type CuratedPresentation, type CuratedRows, type CuratedVariant, DEFAULT_CAPABILITIES, type DecidedBy, type DeviceGraphics, type DeviceHardware, type DiscoveryAmbiguity, type DiscoveryArtifact, type DiscoveryMedia, type DiscoveryResult, type DiscoveryRuntime, type DiscoverySource, type DiscoveryVariant, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, type FeatureBucket, type FeatureBucketMeta, type FeatureKey, GgufError, type GgufHeader, type GgufRead, type GgufTensor, type GroupedFeatures, type HardwareClass, type HardwareClasses, type HeaderFlag, type HeaderJudgement, type HeaderRefusal, INPUT_MODALITIES, INTERACTION_MODES, type Interaction, type InteractionMode, type LocalArtifact, type LocalCatalogClient, type LocalCatalogQuery, type LocalCompatRow, type LocalModel, type LocalModelCatalog, type LocalPresentation, type LocalRuntime, type LocalRuntimeBuild, type LocalVariant, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, type Modality, type ModelCapabilities, type ModelCatalog, type ModelCatalogClient, type ModelCatalogConfig, type ModelCatalogErrorSink, type ModelCatalogPgError, type ModelCatalogPgResult, type ModelCatalogQuery, type ModelCatalogState, type ModelCatalogVariant, type ModelCatalogVariantState, type ModelClassConfig, type ModelClassEntry, type ModelClassIndex, type ModelDiagnosticEntry, type ModelDiagnosticsSink, type ModelFavorites, type ModelFavoritesCache, type ModelFavoritesClient, type ModelFavoritesConfig, type ModelFavoritesErrorSink, type ModelFavoritesState, type ModelFetchScope, type ModelFileHandle, type ModelFit, type ModelIdentityRow, type ModelJson, type ModelOfferingRow, type ModelOption, type ModelOptionWithLifecycle, type ModelRecord, type ModelRecordFetchType, type ModelRecords, type ModelRecordsClient, type ModelRecordsConfig, type ModelRecordsState, type ModelSelectionPurpose, type ModelSetEnv, type ModelSetFacts, type ModelSetValidation, type NoSelection, OUTPUT_MODALITIES, type OrderedLike, type PreferredModelChoice, type PreferredModelChoicePorts, type PriceTier, type RankedVariant, type ReadModelCatalogOptions, SERVICE_LABEL, SERVICE_LABEL_PLURAL, type SelectDevice, type Selection, type ShardName, type SuccessionClient, type SuccessionIndex, type SuccessionNode, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, type VariantDiscovery, type Want, acceptsTextInstructions, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKindOf, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsThisComputer, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelClassKnobFor, modelClassName, modelClassPinOf, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readGgufHeader, readModelCatalog, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifacts, resetSuccessionLogForTests, resolveLiveModelId, resolvePreferredModelChoice, resolveSuccessor, selectActiveModels, selectActiveModelsReady, selectAllModelOptions, selectAllModels, selectAllModelsReady, selectDeprecatedModels, selectDeprecatedModelsReady, selectModelById, selectModelClassConfig, selectModelClassName, selectModelControls, selectModelDetailError, selectModelFetchType, selectModelFullyLoaded, selectModelIdentityById, selectModelIdentityLookupStatus, selectModelLabelById, selectModelLabelWithClass, selectModelNameById, selectModelOptions, selectVariant, serviceCountLabel, setModelDiagnosticsSink, shapeCuratedModels, shardFileName, shardName, speedRatingLabel, speedRatingWord, splitSetProblems, toAuditRecord, validateModelSet, withModelClass };
1662
+ /**
1663
+ * `@ai-matrx/agents/models` — THE fit rules: what a model can do for a purpose, read from the
1664
+ * capability data the catalog holds (`capabilities.input / output / features / interaction`), never
1665
+ * from a placement (a presentation shelf, a page) and never from a list of names.
1666
+ *
1667
+ * One capability can live in two shapes in the data: "sees images" is `input` containing `image`
1668
+ * OR the `vision` feature (the audit projection `toAuditRecord` already reads it that way). Every
1669
+ * filter that asks "does it see images" asks `seesImages`, so a model carrying only one of the two
1670
+ * shapes is never dropped by one surface and kept by another.
1671
+ *
1672
+ * Every picker, every scope chip and every knob that names "the cheapest model that can do X"
1673
+ * (`cheapestAdequateModel`) goes through these, so the web, Matrx 2 and the server-side knobs agree.
1674
+ */
1675
+
1676
+ /** The capability fields a fit rule reads. A CatalogModel, a ModelCapabilities and a LocalModel's `capabilities` all fit. */
1677
+ interface FitCapabilities {
1678
+ readonly input?: readonly string[];
1679
+ readonly output?: readonly string[];
1680
+ /** Raw feature keys, or the picker's grouped features (its `raw` keeps every key). */
1681
+ readonly features?: readonly string[] | Pick<GroupedFeatures, "raw">;
1682
+ readonly interaction?: string;
1683
+ }
1684
+ /** Sees images: `image` input OR the `vision` feature (both shapes the data uses). */
1685
+ declare function seesImages(c: FitCapabilities): boolean;
1686
+ /** Takes this modality as input. `image` reads both shapes (`seesImages`). */
1687
+ declare function takesInput(c: FitCapabilities, modality: string): boolean;
1688
+ /**
1689
+ * Fit for a CHAT turn: an ordinary turn model that takes text in and gives text out, whose job is not
1690
+ * making media (a music or image generator that also returns a caption is not a chat model). Speech-to-text,
1691
+ * embedding, extraction, realtime voice, decision holders and provider-managed agents are out.
1692
+ */
1693
+ declare function isChatModelCapability(c: FitCapabilities): boolean;
1694
+ /** What a job needs from a model. Every listed item is required. */
1695
+ interface ModelNeed {
1696
+ /** Input modalities it must take (`image` = sees images, both shapes). */
1697
+ readonly inputs?: readonly string[];
1698
+ /** Output modalities it must give. */
1699
+ readonly outputs?: readonly string[];
1700
+ /** Raw feature keys it must carry (e.g. `function_calling`, `structured_output`). */
1701
+ readonly features?: readonly string[];
1702
+ /** Required interaction mode (e.g. `turn`). Absent = any. */
1703
+ readonly interaction?: string;
1704
+ /** Minimum context window in tokens. */
1705
+ readonly minContextWindow?: number;
1706
+ }
1707
+ /** Does the model meet every item of the need? */
1708
+ declare function fitsNeed(c: FitCapabilities & {
1709
+ readonly contextWindow?: number | null;
1710
+ }, need: ModelNeed): boolean;
1711
+ /** The catalog fields `cheapestAdequateModel` reads (a picker `CatalogModel` fits as-is). */
1712
+ interface PricedCatalogModel extends FitCapabilities {
1713
+ readonly id: string;
1714
+ readonly name: string;
1715
+ readonly contextWindow?: number | null;
1716
+ /** Points per 1M input tokens (the catalog's price). */
1717
+ readonly pointsInput?: number | null;
1718
+ /** Points per 1M output tokens (the catalog's price). */
1719
+ readonly pointsOutput?: number | null;
1720
+ /** Curated 1-6 cost rating: the tie-break, and the price when no points are set. */
1721
+ readonly costRating?: number | null;
1722
+ readonly isDeprecated?: boolean;
1723
+ readonly retiredAt?: string | null;
1724
+ }
1725
+ interface CheapestAdequateOptions {
1726
+ /** Weight of output price against input price (output tokens usually dominate). Default 3 (1 in : 3 out). */
1727
+ readonly outputWeight?: number;
1728
+ /** Allow deprecated models. Default false (retired models are never chosen). */
1729
+ readonly includeDeprecated?: boolean;
1730
+ }
1731
+ /** The blended price a model is ranked by, or null when the catalog holds no price for it. */
1732
+ declare function blendedPrice(m: PricedCatalogModel, outputWeight?: number): number | null;
1733
+ /**
1734
+ * THE cheapest model in a catalog that meets `need`, by the catalog's own prices (points per 1M
1735
+ * tokens, output weighted). A model with no price ranks after every priced one, by cost rating; ties
1736
+ * break on cost rating then name (stable). Retired models never; deprecated only when asked. Null when
1737
+ * nothing fits — the caller says so; there is no built-in fallback.
1738
+ */
1739
+ declare function cheapestAdequateModel<T extends PricedCatalogModel>(catalog: readonly T[], need: ModelNeed, options?: CheapestAdequateOptions): T | null;
1740
+
1741
+ /**
1742
+ * `@ai-matrx/agents/models` — THE model a new agent starts on comes from a knob, never a constant:
1743
+ * `agents.model_prefs.agent_authoring_default_model` (organization → person → device ladder, through the
1744
+ * host's knob port). Every "make me an agent" path (blank agent, quick agent, templates, the web's manual
1745
+ * create and system-agent create) asks `resolveNewAgentModelId`.
1746
+ *
1747
+ * KNOB ROW PENDING (2026-10-21): the register row exists with `default_value = null`. Until its default is
1748
+ * set to today's model (the SQL is with the owner), an unset knob answers the stand-in below — LOUDLY, every
1749
+ * time, naming the knob — so creating an agent keeps working exactly as before. When the row lands the stand-in
1750
+ * never fires; delete it then. This file is the ONE place a model id literal may appear in shared runtime code
1751
+ * (guard: apps/shared/scripts/check-no-model-literals.mjs).
1752
+ */
1753
+ declare const AGENT_AUTHORING_DEFAULT_MODEL_KNOB = "agents.model_prefs.agent_authoring_default_model";
1754
+ interface NewAgentModel {
1755
+ modelId: string;
1756
+ /** True when the knob held no value and the pending-row stand-in answered (it screamed). */
1757
+ standIn: boolean;
1758
+ }
1759
+ /** How many times the stand-in answered in this process (tests, diagnostics). */
1760
+ declare const newAgentModelStandInCount: () => number;
1761
+ /**
1762
+ * The model a new agent starts on. `resolveKnob(fullKey)` is the host's effective-knob read. A knob value
1763
+ * that is a non-empty string wins; an unset knob, or a knob read that fails, answers the stand-in and says so.
1764
+ */
1765
+ declare function resolveNewAgentModelId(resolveKnob: (fullKey: string) => Promise<unknown>): Promise<NewAgentModel>;
1766
+
1767
+ export { AGENT_AUTHORING_DEFAULT_MODEL_KNOB, type AdminOffering, type AdminPricingBand, type ArtifactUse, type AuditCapabilitiesRecord, CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, type CapabilitiesParseContext, type CatalogKindInput, type CatalogModel, type CatalogTier, type CheapestAdequateOptions, type CompatStatus, type ContentType, type CuratedCatalogClient, type CuratedModel, type CuratedPresentation, type CuratedRows, type CuratedVariant, DEFAULT_CAPABILITIES, type DecidedBy, type DeviceGraphics, type DeviceHardware, type DiscoveryAmbiguity, type DiscoveryArtifact, type DiscoveryMedia, type DiscoveryResult, type DiscoveryRuntime, type DiscoverySource, type DiscoveryVariant, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, type FeatureBucket, type FeatureBucketMeta, type FeatureKey, type FitCapabilities, GgufError, type GgufHeader, type GgufRead, type GgufTensor, type GroupedFeatures, type HardwareClass, type HardwareClasses, type HeaderFlag, type HeaderJudgement, type HeaderRefusal, INPUT_MODALITIES, INTERACTION_MODES, type Interaction, type InteractionMode, type LocalArtifact, type LocalCatalogClient, type LocalCatalogQuery, type LocalCompatRow, type LocalModel, type LocalModelCatalog, type LocalPresentation, type LocalRuntime, type LocalRuntimeBuild, type LocalVariant, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, type Modality, type ModelCapabilities, type ModelCatalog, type ModelCatalogClient, type ModelCatalogConfig, type ModelCatalogErrorSink, type ModelCatalogPgError, type ModelCatalogPgResult, type ModelCatalogQuery, type ModelCatalogState, type ModelCatalogVariant, type ModelCatalogVariantState, type ModelClassConfig, type ModelClassEntry, type ModelClassIndex, type ModelDiagnosticEntry, type ModelDiagnosticsSink, type ModelFavorites, type ModelFavoritesCache, type ModelFavoritesClient, type ModelFavoritesConfig, type ModelFavoritesErrorSink, type ModelFavoritesState, type ModelFetchScope, type ModelFileHandle, type ModelFit, type ModelIdentityRow, type ModelJson, type ModelNeed, type ModelOfferingRow, type ModelOption, type ModelOptionWithLifecycle, type ModelRecord, type ModelRecordFetchType, type ModelRecords, type ModelRecordsClient, type ModelRecordsConfig, type ModelRecordsState, type ModelSelectionPurpose, type ModelSetEnv, type ModelSetFacts, type ModelSetValidation, type NewAgentModel, type NoSelection, OUTPUT_MODALITIES, type OrderedLike, type PreferredModelChoice, type PreferredModelChoicePorts, type PriceTier, type PricedCatalogModel, type RankedVariant, type ReadModelCatalogOptions, SERVICE_LABEL, SERVICE_LABEL_PLURAL, type SelectDevice, type Selection, type ShardName, type SuccessionClient, type SuccessionIndex, type SuccessionNode, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, type VariantDiscovery, type Want, acceptsTextInstructions, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKindOf, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelClassKnobFor, modelClassName, modelClassPinOf, modelsForSelectionPurpose, newAgentModelStandInCount, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readGgufHeader, readModelCatalog, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifacts, resetSuccessionLogForTests, resolveLiveModelId, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, seesImages, selectActiveModels, selectActiveModelsReady, selectAllModelOptions, selectAllModels, selectAllModelsReady, selectDeprecatedModels, selectDeprecatedModelsReady, selectModelById, selectModelClassConfig, selectModelClassName, selectModelControls, selectModelDetailError, selectModelFetchType, selectModelFullyLoaded, selectModelIdentityById, selectModelIdentityLookupStatus, selectModelLabelById, selectModelLabelWithClass, selectModelNameById, selectModelOptions, selectVariant, serviceCountLabel, setModelDiagnosticsSink, shapeCuratedModels, shardFileName, shardName, speedRatingLabel, speedRatingWord, splitSetProblems, takesInput, toAuditRecord, validateModelSet, withModelClass };
@@ -2525,7 +2525,82 @@ async function readModelCatalog(client, opts = {}) {
2525
2525
  out.catalog_fingerprint = catalogFingerprint(out);
2526
2526
  return out;
2527
2527
  }
2528
+
2529
+ // models/fit.ts
2530
+ var featuresOf = (c) => {
2531
+ const f = c.features;
2532
+ if (!f) return [];
2533
+ return Array.isArray(f) ? f : f.raw ?? [];
2534
+ };
2535
+ function seesImages(c) {
2536
+ return (c.input ?? []).includes("image") || featuresOf(c).includes("vision");
2537
+ }
2538
+ function takesInput(c, modality) {
2539
+ if (modality === "image") return seesImages(c);
2540
+ return (c.input ?? []).includes(modality);
2541
+ }
2542
+ var MEDIA_GENERATION_FEATURES = /* @__PURE__ */ new Set(["image_generation", "video_generation", "audio_generation", "music_generation"]);
2543
+ function isChatModelCapability(c) {
2544
+ if (c.interaction !== "turn") return false;
2545
+ if (!(c.input ?? []).includes("text")) return false;
2546
+ if (!(c.output ?? []).includes("text")) return false;
2547
+ return !featuresOf(c).some((f) => MEDIA_GENERATION_FEATURES.has(f));
2548
+ }
2549
+ function fitsNeed(c, need) {
2550
+ for (const m of need.inputs ?? []) if (!takesInput(c, m)) return false;
2551
+ for (const m of need.outputs ?? []) if (!(c.output ?? []).includes(m)) return false;
2552
+ const features = featuresOf(c);
2553
+ for (const f of need.features ?? []) if (!features.includes(f)) return false;
2554
+ if (need.interaction && c.interaction !== need.interaction) return false;
2555
+ if (need.minContextWindow != null && (c.contextWindow ?? 0) < need.minContextWindow) return false;
2556
+ return true;
2557
+ }
2558
+ function blendedPrice(m, outputWeight = 3) {
2559
+ const i = m.pointsInput;
2560
+ const o = m.pointsOutput;
2561
+ if (i == null && o == null) return null;
2562
+ return ((i ?? o ?? 0) + (o ?? i ?? 0) * outputWeight) / (1 + outputWeight);
2563
+ }
2564
+ function cheapestAdequateModel(catalog, need, options = {}) {
2565
+ const w = options.outputWeight ?? 3;
2566
+ const fits = catalog.filter((m) => !m.retiredAt && (options.includeDeprecated || !m.isDeprecated) && fitsNeed(m, need));
2567
+ if (fits.length === 0) return null;
2568
+ const rank = (m) => blendedPrice(m, w);
2569
+ return [...fits].sort((a, b) => {
2570
+ const pa = rank(a);
2571
+ const pb = rank(b);
2572
+ if (pa != null && pb != null && pa !== pb) return pa - pb;
2573
+ if (pa != null && pb == null) return -1;
2574
+ if (pa == null && pb != null) return 1;
2575
+ const ca = a.costRating ?? Number.MAX_SAFE_INTEGER;
2576
+ const cb = b.costRating ?? Number.MAX_SAFE_INTEGER;
2577
+ if (ca !== cb) return ca - cb;
2578
+ return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
2579
+ })[0];
2580
+ }
2581
+
2582
+ // models/default-model.ts
2583
+ var AGENT_AUTHORING_DEFAULT_MODEL_KNOB = "agents.model_prefs.agent_authoring_default_model";
2584
+ var PENDING_KNOB_ROW_MODEL_ID = "617abdcd-79e2-4a4b-be76-4a9960cdffa1";
2585
+ var standInCount = 0;
2586
+ var newAgentModelStandInCount = () => standInCount;
2587
+ async function resolveNewAgentModelId(resolveKnob) {
2588
+ let why;
2589
+ try {
2590
+ const value = await resolveKnob(AGENT_AUTHORING_DEFAULT_MODEL_KNOB);
2591
+ if (typeof value === "string" && value.trim() !== "") return { modelId: value.trim(), standIn: false };
2592
+ why = "has no value (its platform default row is pending)";
2593
+ } catch (error) {
2594
+ why = `could not be read (${error instanceof Error ? error.message : String(error)})`;
2595
+ }
2596
+ standInCount += 1;
2597
+ console.error(
2598
+ `[newAgentModel] STAND-IN: ${AGENT_AUTHORING_DEFAULT_MODEL_KNOB} ${why} \u2014 this new agent starts on ${PENDING_KNOB_ROW_MODEL_ID} (today's model). Set the knob's default to remove this stand-in.`
2599
+ );
2600
+ return { modelId: PENDING_KNOB_ROW_MODEL_ID, standIn: true };
2601
+ }
2528
2602
  export {
2603
+ AGENT_AUTHORING_DEFAULT_MODEL_KNOB,
2529
2604
  CHAT_DEFAULT_MODEL_KNOB,
2530
2605
  CONTENT_TYPES,
2531
2606
  DEFAULT_CAPABILITIES,
@@ -2547,11 +2622,13 @@ export {
2547
2622
  TOP_TIER_COST_RATING,
2548
2623
  TOP_TIER_LOCKED_TITLE,
2549
2624
  acceptsTextInstructions,
2625
+ blendedPrice,
2550
2626
  buildModelClassIndex,
2551
2627
  buildSuccessionIndex,
2552
2628
  catalogFingerprint,
2553
2629
  catalogForApp,
2554
2630
  catalogKindOf,
2631
+ cheapestAdequateModel,
2555
2632
  classConfigKey,
2556
2633
  collapseTiersByClass,
2557
2634
  costRatingTier,
@@ -2565,6 +2642,7 @@ export {
2565
2642
  fetchCuratedModels,
2566
2643
  findNonCanonicalCapabilityValues,
2567
2644
  fitsMemory,
2645
+ fitsNeed,
2568
2646
  fitsThisComputer,
2569
2647
  formatMemoryBytes,
2570
2648
  fromDiscovery,
@@ -2573,6 +2651,7 @@ export {
2573
2651
  groupFeatures,
2574
2652
  hardwareClassesOf,
2575
2653
  hasCompatibleDecisionInteraction,
2654
+ isChatModelCapability,
2576
2655
  isContentType,
2577
2656
  isConversationalModelCapability,
2578
2657
  isDecisionModelCapability,
@@ -2592,6 +2671,7 @@ export {
2592
2671
  modelClassName,
2593
2672
  modelClassPinOf,
2594
2673
  modelsForSelectionPurpose,
2674
+ newAgentModelStandInCount,
2595
2675
  normalizeArch,
2596
2676
  normalizeModel,
2597
2677
  normalizeModels,
@@ -2614,8 +2694,10 @@ export {
2614
2694
  requiredArtifacts,
2615
2695
  resetSuccessionLogForTests,
2616
2696
  resolveLiveModelId,
2697
+ resolveNewAgentModelId,
2617
2698
  resolvePreferredModelChoice,
2618
2699
  resolveSuccessor,
2700
+ seesImages,
2619
2701
  selectActiveModels,
2620
2702
  selectActiveModelsReady,
2621
2703
  selectAllModelOptions,
@@ -2645,6 +2727,7 @@ export {
2645
2727
  speedRatingLabel,
2646
2728
  speedRatingWord,
2647
2729
  splitSetProblems,
2730
+ takesInput,
2648
2731
  toAuditRecord,
2649
2732
  validateModelSet,
2650
2733
  withModelClass
@@ -446,6 +446,27 @@ function resolveSuccessor(modelId, index) {
446
446
  return modelId;
447
447
  }
448
448
 
449
+ // models/fit.ts
450
+ var featuresOf = (c) => {
451
+ const f = c.features;
452
+ if (!f) return [];
453
+ return Array.isArray(f) ? f : f.raw ?? [];
454
+ };
455
+ function seesImages(c) {
456
+ return (c.input ?? []).includes("image") || featuresOf(c).includes("vision");
457
+ }
458
+ function takesInput(c, modality) {
459
+ if (modality === "image") return seesImages(c);
460
+ return (c.input ?? []).includes(modality);
461
+ }
462
+ var MEDIA_GENERATION_FEATURES = /* @__PURE__ */ new Set(["image_generation", "video_generation", "audio_generation", "music_generation"]);
463
+ function isChatModelCapability(c) {
464
+ if (c.interaction !== "turn") return false;
465
+ if (!(c.input ?? []).includes("text")) return false;
466
+ if (!(c.output ?? []).includes("text")) return false;
467
+ return !featuresOf(c).some((f) => MEDIA_GENERATION_FEATURES.has(f));
468
+ }
469
+
449
470
  // models/catalog/types.ts
450
471
  var INPUT_MODALITIES = ["text", "image", "audio", "video"];
451
472
  var OUTPUT_MODALITIES = [
@@ -1635,6 +1656,7 @@ function ModelListDropdown({
1635
1656
  ].sort((a, b) => a.localeCompare(b)),
1636
1657
  [eligibleModels]
1637
1658
  );
1659
+ const chatFitApplies = effectiveSelectionPurpose === "chat" && !(outputModalities ?? []).some((o) => o !== "text");
1638
1660
  const filtered = (0, import_react2.useMemo)(() => {
1639
1661
  const q = query.trim().toLowerCase();
1640
1662
  const hasAvailable = (m) => (m.admin?.offerings ?? []).some((o) => o.isAvailable);
@@ -1646,6 +1668,7 @@ function ModelListDropdown({
1646
1668
  return false;
1647
1669
  if (effectiveSelectionPurpose === "chat" && isManagedAgentModelCapability(m))
1648
1670
  return false;
1671
+ if (chatFitApplies && !isChatModelCapability(m)) return false;
1649
1672
  if (tab === "favorites" && !favoriteSet.has(m.id)) return false;
1650
1673
  const haystack = [
1651
1674
  m.name,
@@ -1685,7 +1708,7 @@ function ModelListDropdown({
1685
1708
  if (filters.premium !== "any") {
1686
1709
  if (filters.premium === "yes" !== m.isPremium) return false;
1687
1710
  }
1688
- for (const m2 of filters.input) if (!m.input.includes(m2)) return false;
1711
+ for (const m2 of filters.input) if (!takesInput(m, m2)) return false;
1689
1712
  const outputSatisfied = (want) => m.output.includes(want) || effectiveSelectionPurpose === "agent" && isDecision && want === "text";
1690
1713
  for (const m2 of filters.output) if (!outputSatisfied(m2)) return false;
1691
1714
  for (const b of filters.features)
@@ -1751,6 +1774,7 @@ function ModelListDropdown({
1751
1774
  variant,
1752
1775
  priorityModelSet,
1753
1776
  effectiveSelectionPurpose,
1777
+ chatFitApplies,
1754
1778
  hiddenModelIds,
1755
1779
  value,
1756
1780
  successionIndex
@@ -428,6 +428,27 @@ function resolveSuccessor(modelId, index) {
428
428
  return modelId;
429
429
  }
430
430
 
431
+ // models/fit.ts
432
+ var featuresOf = (c) => {
433
+ const f = c.features;
434
+ if (!f) return [];
435
+ return Array.isArray(f) ? f : f.raw ?? [];
436
+ };
437
+ function seesImages(c) {
438
+ return (c.input ?? []).includes("image") || featuresOf(c).includes("vision");
439
+ }
440
+ function takesInput(c, modality) {
441
+ if (modality === "image") return seesImages(c);
442
+ return (c.input ?? []).includes(modality);
443
+ }
444
+ var MEDIA_GENERATION_FEATURES = /* @__PURE__ */ new Set(["image_generation", "video_generation", "audio_generation", "music_generation"]);
445
+ function isChatModelCapability(c) {
446
+ if (c.interaction !== "turn") return false;
447
+ if (!(c.input ?? []).includes("text")) return false;
448
+ if (!(c.output ?? []).includes("text")) return false;
449
+ return !featuresOf(c).some((f) => MEDIA_GENERATION_FEATURES.has(f));
450
+ }
451
+
431
452
  // models/catalog/types.ts
432
453
  var INPUT_MODALITIES = ["text", "image", "audio", "video"];
433
454
  var OUTPUT_MODALITIES = [
@@ -1617,6 +1638,7 @@ function ModelListDropdown({
1617
1638
  ].sort((a, b) => a.localeCompare(b)),
1618
1639
  [eligibleModels]
1619
1640
  );
1641
+ const chatFitApplies = effectiveSelectionPurpose === "chat" && !(outputModalities ?? []).some((o) => o !== "text");
1620
1642
  const filtered = useMemo2(() => {
1621
1643
  const q = query.trim().toLowerCase();
1622
1644
  const hasAvailable = (m) => (m.admin?.offerings ?? []).some((o) => o.isAvailable);
@@ -1628,6 +1650,7 @@ function ModelListDropdown({
1628
1650
  return false;
1629
1651
  if (effectiveSelectionPurpose === "chat" && isManagedAgentModelCapability(m))
1630
1652
  return false;
1653
+ if (chatFitApplies && !isChatModelCapability(m)) return false;
1631
1654
  if (tab === "favorites" && !favoriteSet.has(m.id)) return false;
1632
1655
  const haystack = [
1633
1656
  m.name,
@@ -1667,7 +1690,7 @@ function ModelListDropdown({
1667
1690
  if (filters.premium !== "any") {
1668
1691
  if (filters.premium === "yes" !== m.isPremium) return false;
1669
1692
  }
1670
- for (const m2 of filters.input) if (!m.input.includes(m2)) return false;
1693
+ for (const m2 of filters.input) if (!takesInput(m, m2)) return false;
1671
1694
  const outputSatisfied = (want) => m.output.includes(want) || effectiveSelectionPurpose === "agent" && isDecision && want === "text";
1672
1695
  for (const m2 of filters.output) if (!outputSatisfied(m2)) return false;
1673
1696
  for (const b of filters.features)
@@ -1733,6 +1756,7 @@ function ModelListDropdown({
1733
1756
  variant,
1734
1757
  priorityModelSet,
1735
1758
  effectiveSelectionPurpose,
1759
+ chatFitApplies,
1736
1760
  hiddenModelIds,
1737
1761
  value,
1738
1762
  successionIndex
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/agents",
3
- "version": "0.59.192",
3
+ "version": "0.59.193",
4
4
  "description": "Portable AI Matrx agent stream protocol, event projection, and safe result-presentation primitives.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -514,8 +514,8 @@
514
514
  "@ai-matrx/content-ir": "latest",
515
515
  "@ai-matrx/data": "latest",
516
516
  "@ai-matrx/design-system": "latest",
517
- "@ai-matrx/icons": "latest",
518
517
  "@ai-matrx/diff": "latest",
518
+ "@ai-matrx/icons": "latest",
519
519
  "@ai-matrx/kit": "latest"
520
520
  },
521
521
  "peerDependencies": {
@@ -555,11 +555,11 @@
555
555
  "scripts": {
556
556
  "build": "pnpm clean && node ./scripts/build-parts.mjs && node ../scripts/check-node-env-not-inlined.mjs",
557
557
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
558
- "check:package": "node ./scripts/check-catalog-reader-columns.mjs && node ./scripts/check-catalog-reader-columns.mjs --self-test && node ../scripts/check-agents-below-chat.mjs && node ../scripts/check-agents-below-chat.mjs --self-test && pnpm build && node ../scripts/check-exports-agreement.mjs && publint && pnpm verify:tarball && node ../scripts/check-tarball-relative-imports.mjs --self-test && node ../scripts/check-tarball-relative-imports.mjs --pack . && node ../scripts/check-package-rules.mjs --self-test && node ../scripts/check-package-rules.mjs .",
558
+ "check:package": "node ./scripts/check-catalog-reader-columns.mjs && node ./scripts/check-catalog-reader-columns.mjs --self-test && node ../scripts/check-no-model-literals.mjs && node ../scripts/check-no-model-literals.mjs --self-test && node ../scripts/check-agents-below-chat.mjs && node ../scripts/check-agents-below-chat.mjs --self-test && pnpm build && node ../scripts/check-exports-agreement.mjs && publint && pnpm verify:tarball && node ../scripts/check-tarball-relative-imports.mjs --self-test && node ../scripts/check-tarball-relative-imports.mjs --pack . && node ../scripts/check-package-rules.mjs --self-test && node ../scripts/check-package-rules.mjs .",
559
559
  "typecheck": "tsc --noEmit",
560
560
  "test": "vitest run",
561
561
  "verify:tarball": "node ./scripts/verify-tarball.mjs",
562
562
  "typegen:self-test": "node scripts/typegen/drop-guard.self-test.mjs && node scripts/typegen/check-api-types-fresh.mjs --self-test"
563
563
  },
564
- "gitHead": "7829f4d91a8aa88811a634c9fe02aa66cf4b2e5c"
564
+ "gitHead": "3165453310fa6d42f3b90249a12d956eeebe7636"
565
565
  }