@ai-matrx/agents 0.59.194 → 0.59.196

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,10 +1,15 @@
1
1
  # Changelog
2
2
 
3
- ## 0.59.194
3
+ ## 0.59.196
4
4
 
5
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
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
7
 
8
+ ## 0.59.194
9
+
10
+ Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 3165453310 87a717ae91 -- apps/shared/matrx-agents/src`
11
+ has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
12
+
8
13
  ## 0.59.193
9
14
 
10
15
  Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 7829f4d91a 3165453310 -- apps/shared/matrx-agents/src`
@@ -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.194 — no longer declared in
706
+ * @deprecated retiring since 0.59.196 — 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.194 — no longer declared in
683
+ * @deprecated retiring since 0.59.196 — 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.194 — no longer declared in
659
+ * @deprecated retiring since 0.59.196 — 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.194 — no longer declared in
631
+ * @deprecated retiring since 0.59.196 — 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: "87a717ae91835903eb5181b979e7adb555fb6e10",
50
+ aidreamRevision: "565b77216165498cb70a34094db8dae6e63fc134",
51
51
  generatorVersion: "1.0.0",
52
- packageVersion: "0.59.194",
52
+ packageVersion: "0.59.196",
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.194 — no longer declared in
669
+ * @deprecated retiring since 0.59.196 — 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.194",
696
+ "coding_session.managed_translation_reference": "0.59.196",
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: 87a717ae91835903eb5181b979e7adb555fb6e10
9
+ * aidream revision: 565b77216165498cb70a34094db8dae6e63fc134
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.194
11
+ * package version: 0.59.196
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: "87a717ae91835903eb5181b979e7adb555fb6e10";
22
+ readonly aidreamRevision: "565b77216165498cb70a34094db8dae6e63fc134";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.194";
24
+ readonly packageVersion: "0.59.196";
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.194 — no longer declared in
642
+ * @deprecated retiring since 0.59.196 — 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.194";
673
+ readonly "coding_session.managed_translation_reference": "0.59.196";
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: 87a717ae91835903eb5181b979e7adb555fb6e10
9
+ * aidream revision: 565b77216165498cb70a34094db8dae6e63fc134
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.194
11
+ * package version: 0.59.196
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: "87a717ae91835903eb5181b979e7adb555fb6e10";
22
+ readonly aidreamRevision: "565b77216165498cb70a34094db8dae6e63fc134";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.194";
24
+ readonly packageVersion: "0.59.196";
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.194 — no longer declared in
642
+ * @deprecated retiring since 0.59.196 — 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.194";
673
+ readonly "coding_session.managed_translation_reference": "0.59.196";
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: "87a717ae91835903eb5181b979e7adb555fb6e10",
3
+ aidreamRevision: "565b77216165498cb70a34094db8dae6e63fc134",
4
4
  generatorVersion: "1.0.0",
5
- packageVersion: "0.59.194",
5
+ packageVersion: "0.59.196",
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.194 — no longer declared in
622
+ * @deprecated retiring since 0.59.196 — 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.194",
649
+ "coding_session.managed_translation_reference": "0.59.196",
650
650
  "pdf.content_cleaner": "0.59.0",
651
651
  "sms.owner_beta": "0.59.0",
652
652
  "voice.owner_beta": "0.59.0"
@@ -35,6 +35,7 @@ __export(settings_exports, {
35
35
  createSettingsStore: () => createSettingsStore,
36
36
  detectConflicts: () => detectConflicts,
37
37
  effectiveOfferingPinOf: () => effectiveOfferingPinOf,
38
+ extraSettingKeys: () => extraSettingKeys,
38
39
  extractModelDefaults: () => extractModelDefaults,
39
40
  gateEnabled: () => gateEnabled,
40
41
  getActionForMode: () => getActionForMode,
@@ -56,6 +57,7 @@ __export(settings_exports, {
56
57
  readSettingsEntry: () => readSettingsEntry,
57
58
  resolveConflicts: () => resolveConflicts,
58
59
  sanitizeSettings: () => sanitizeSettings,
60
+ settingLabel: () => settingLabel,
59
61
  settingStateOf: () => settingStateOf,
60
62
  startingValueFor: () => startingValueFor,
61
63
  withSettingState: () => withSettingState
@@ -97,6 +99,83 @@ function gateEnabled(gates, key) {
97
99
  return gates?.[key] === true;
98
100
  }
99
101
 
102
+ // generated/llm-enums.ts
103
+ var LLM_PARAMS_KEYS = [
104
+ "model",
105
+ "offering_id",
106
+ "max_output_tokens",
107
+ "temperature",
108
+ "top_p",
109
+ "top_k",
110
+ "tool_choice",
111
+ "parallel_tool_calls",
112
+ "reasoning_effort",
113
+ "reasoning_summary",
114
+ "visualization",
115
+ "thinking_level",
116
+ "include_thoughts",
117
+ "thinking_budget",
118
+ "clear_thinking",
119
+ "disable_reasoning",
120
+ "response_format",
121
+ "stop_sequences",
122
+ "stream",
123
+ "store",
124
+ "extended_prompt_cache",
125
+ "previous_interaction_id",
126
+ "task",
127
+ "verbosity",
128
+ "internal_web_search",
129
+ "internal_url_context",
130
+ "internal_x_search",
131
+ "aspect_ratio",
132
+ "width",
133
+ "height",
134
+ "count",
135
+ "render_quality",
136
+ "background",
137
+ "output_compression",
138
+ "moderation",
139
+ "input_fidelity",
140
+ "partial_images",
141
+ "style",
142
+ "reference_strength",
143
+ "tts_voice",
144
+ "audio_format",
145
+ "performance_direction",
146
+ "speech_speed",
147
+ "turn_pause_ms",
148
+ "language_code",
149
+ "duration_seconds",
150
+ "resolution",
151
+ "fps",
152
+ "steps",
153
+ "seed",
154
+ "guidance_scale",
155
+ "encode_quality",
156
+ "negative_prompt",
157
+ "output_format",
158
+ "frame_images",
159
+ "reference_images",
160
+ "image_loras",
161
+ "disable_safety_checker",
162
+ "generate_audio",
163
+ "enhance_prompt",
164
+ "camera_control",
165
+ "image_input",
166
+ "image_inputs",
167
+ "mask",
168
+ "last_frame_image",
169
+ "video_input",
170
+ "video_action",
171
+ "custom_tools",
172
+ "mcp_servers",
173
+ "compaction_settings",
174
+ "detected_contexts",
175
+ "dictionary",
176
+ "tts_quality"
177
+ ];
178
+
100
179
  // settings/settings-catalogue.ts
101
180
  var import_text_case = require("@ai-matrx/kit/text-case");
102
181
  var CONTROL_TYPES = [
@@ -268,83 +347,33 @@ function buildSettingsRows(controls, settings) {
268
347
  }
269
348
  return groups;
270
349
  }
271
-
272
- // generated/llm-enums.ts
273
- var LLM_PARAMS_KEYS = [
274
- "model",
350
+ var CATALOGUE_LABELS = new Map(
351
+ SETTINGS_CATALOGUE.flatMap((g) => g.entries.map((e) => [e.key, e.label]))
352
+ );
353
+ function settingLabel(key) {
354
+ return CATALOGUE_LABELS.get(key) ?? (0, import_text_case.humanizeIdentifier)(key);
355
+ }
356
+ var RECOGNIZED_PARAMS = new Set(LLM_PARAMS_KEYS);
357
+ var EXTRA_EXCLUDED = /* @__PURE__ */ new Set([
358
+ ...CATCHALL_EXCLUDED,
275
359
  "offering_id",
276
- "max_output_tokens",
277
- "temperature",
278
- "top_p",
279
- "top_k",
280
- "tool_choice",
281
- "parallel_tool_calls",
282
- "reasoning_effort",
283
- "reasoning_summary",
284
- "visualization",
285
- "thinking_level",
286
- "include_thoughts",
287
- "thinking_budget",
288
- "clear_thinking",
289
- "disable_reasoning",
290
- "response_format",
291
- "stop_sequences",
292
- "stream",
293
- "store",
294
- "extended_prompt_cache",
295
- "previous_interaction_id",
296
- "task",
297
- "verbosity",
298
- "internal_web_search",
299
- "internal_url_context",
300
- "internal_x_search",
301
- "aspect_ratio",
302
- "width",
303
- "height",
304
- "count",
305
- "render_quality",
306
- "background",
307
- "output_compression",
308
- "moderation",
309
- "input_fidelity",
310
- "partial_images",
311
- "style",
312
- "reference_strength",
313
- "tts_voice",
314
- "audio_format",
315
- "performance_direction",
316
- "speech_speed",
317
- "turn_pause_ms",
318
- "language_code",
319
- "duration_seconds",
320
- "resolution",
321
- "fps",
322
- "steps",
323
- "seed",
324
- "guidance_scale",
325
- "encode_quality",
326
- "negative_prompt",
360
+ "max_tokens",
327
361
  "output_format",
328
- "frame_images",
329
- "reference_images",
330
- "image_loras",
331
- "disable_safety_checker",
332
- "generate_audio",
333
- "enhance_prompt",
334
- "camera_control",
335
- "image_input",
336
- "image_inputs",
337
- "mask",
338
- "last_frame_image",
339
- "video_input",
340
- "video_action",
341
- "custom_tools",
342
- "mcp_servers",
343
- "compaction_settings",
344
- "detected_contexts",
345
- "dictionary",
346
- "tts_quality"
347
- ];
362
+ "n"
363
+ ]);
364
+ function extraSettingKeys(controls, settings, alsoKeys = []) {
365
+ const out = { translated: [], unsupported: [] };
366
+ if (!controls) return out;
367
+ const declaresAny = Object.keys(controls).some((key) => lookupControl(controls, key) !== null);
368
+ if (!declaresAny) return out;
369
+ const keys = new Set(Object.keys(settings ?? {}).filter((key) => hasMeaningfulValue(settings, key)));
370
+ for (const key of alsoKeys) keys.add(key);
371
+ for (const key of keys) {
372
+ if (EXTRA_EXCLUDED.has(key) || lookupControl(controls, key)) continue;
373
+ (RECOGNIZED_PARAMS.has(key) ? out.translated : out.unsupported).push(key);
374
+ }
375
+ return out;
376
+ }
348
377
 
349
378
  // models/model-normalizer.ts
350
379
  var TEXT_RESPONSE_FORMATS = /* @__PURE__ */ new Set(["text", "json_object", "json_schema"]);
@@ -242,6 +242,26 @@ type ControlsLike = Record<string, unknown> | null | undefined;
242
242
  * without a code change. Empty groups are returned (consumers skip them).
243
243
  */
244
244
  declare function buildSettingsRows(controls: ControlsLike, settings: Record<string, unknown> | null | undefined): RenderGroup[];
245
+ /** A setting's label: the catalog's own words, else the key humanized (the catch-all rule). */
246
+ declare function settingLabel(key: string): string;
247
+ interface ExtraSettingKeys {
248
+ /**
249
+ * Set, a real model parameter, not declared by this model: KEPT and sent as the model's
250
+ * closest equivalent — the server translates it (settings-translation K7, the platform rule).
251
+ * THE panel draws these under "Translated for this model", never as a warning.
252
+ */
253
+ translated: string[];
254
+ /** Set, but no model parameter at all (a typo, a retired key): "Not on this model". */
255
+ unsupported: string[];
256
+ }
257
+ /**
258
+ * The set values THE model-settings panel draws beside the model's own rows — one rule for the
259
+ * builder and every override screen (owner, 2026-10-21). `alsoKeys` are keys a target changed
260
+ * that hold no value now (an override that removes the agent's value): they stay listed so
261
+ * their reset stays reachable. Empty until the model declares at least one control: a model
262
+ * with no declared controls is a catalog gap, not an incompatibility.
263
+ */
264
+ declare function extraSettingKeys(controls: ControlsLike, settings: Record<string, unknown> | null | undefined, alsoKeys?: readonly string[]): ExtraSettingKeys;
245
265
 
246
266
  /**
247
267
  * Agent Settings — Internal Utilities
@@ -531,6 +551,37 @@ declare function isUnsetChoice(key: string, value: unknown): boolean;
531
551
 
532
552
  declare function startingValueFor(key: string, control: ControlDefinition): unknown;
533
553
 
554
+ /** One model a host runs on the person's own computer. */
555
+ interface LocalModelEntry {
556
+ /** The value `onValueChange` receives (the conversation's model override). */
557
+ id: string;
558
+ name: string;
559
+ /** Brand glyph key (e.g. "Meta"); absent draws the neutral glyph. */
560
+ maker?: string | null;
561
+ contextWindow?: number | null;
562
+ /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
563
+ needsMoreMemory?: boolean;
564
+ }
565
+ /**
566
+ * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
567
+ * draws its models as one "On this computer" group marked local. Start/Stop and getting more
568
+ * models stay the host's own screens.
569
+ */
570
+ interface LocalModelsPort {
571
+ /** Must return the SAME array until the list changes (it is a store snapshot). */
572
+ getModels(): readonly LocalModelEntry[];
573
+ subscribe(listener: () => void): () => void;
574
+ /** Group heading. Default "On this computer". */
575
+ groupLabel?: string;
576
+ /**
577
+ * Open the local model in its own private conversation (the host's Confidential Chat), instead
578
+ * of switching this conversation to it. Present = a local pick calls ONLY this: the cloud value
579
+ * and the class pin stay untouched, and no draft or context is carried. Absent = the pick reports
580
+ * the id through `onValueChange` (the override path).
581
+ */
582
+ open?(id: string): void;
583
+ }
584
+
534
585
  /**
535
586
  * THE SETTINGS WRITE TARGET — the one seam between THE model-settings panel
536
587
  * (`./react/ModelSettingsPanel`) and whatever a change is written to.
@@ -594,9 +645,48 @@ interface SettingsWriteTarget {
594
645
  unbind?(key: string, control: ControlDefinition | null): void;
595
646
  /** Drop THIS target's change and show what it inherits again. */
596
647
  resetToInherited?(key: string): void;
648
+ /**
649
+ * The keys THIS target changed. The panel keeps a changed key it has no row for (the model
650
+ * does not declare it, and the change removed its value) on screen, so its reset stays
651
+ * reachable.
652
+ */
653
+ changedKeys?: readonly string[];
597
654
  /** The reset button's words, in the host's noun. Default "Reset to agent". */
598
655
  resetLabel?: string;
599
656
  }
657
+ /**
658
+ * THE model row — the panel's first line, drawn by the panel with THE model picker
659
+ * (`ModelListDropdown`) in every host. Where a pick lands is the host's; the options below are
660
+ * capabilities a target has or lacks, exactly like `bind` / `resetToInherited` on the rows.
661
+ */
662
+ interface ModelRowTarget {
663
+ /** The model shown (the effective one; a one-message pick while that is on). */
664
+ value: string | null;
665
+ change(modelId: string): void;
666
+ /** The pinned class (offering) of the shown model. */
667
+ pinnedOfferingId: string | null | undefined;
668
+ /** A class pick (the picker reports the class before the model). */
669
+ changePin(offeringId: string | undefined): void;
670
+ /** True when THIS target changed the model or its class. */
671
+ changedHere?: boolean;
672
+ /** Drop this target's model choice (model and class together). */
673
+ resetToInherited?(): void;
674
+ /** An explicit "no override" choice at the top of the list, in the host's words. */
675
+ emptyChoice?: {
676
+ label: string;
677
+ choose(): void;
678
+ };
679
+ /** The person's local models (a chat host's port). */
680
+ localModels?: LocalModelsPort | undefined;
681
+ disabled?: boolean;
682
+ /** Said on the read-only picker when `disabled`. */
683
+ disabledTitle?: string;
684
+ /** "This message only": while on, a pick applies to the next message, then goes back. */
685
+ oneMessage?: {
686
+ on: boolean;
687
+ change(next: boolean): void;
688
+ };
689
+ }
600
690
  /** The frontend input capabilities (ui gates) shown under the settings groups. */
601
691
  interface CapabilitiesWriteTarget {
602
692
  values: UiGates;
@@ -608,4 +698,4 @@ interface CapabilitiesWriteTarget {
608
698
  error?: string | null;
609
699
  }
610
700
 
611
- export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, type AgentContext, type AgentSettings, type AgentSettingsEntry, type AgentSettingsState, type AgentSource, type AgentVariable, CATALOGUE_KEYS, type CapabilitiesWriteTarget, type CatalogueEntry, type CatalogueGroup, type ConflictAction, type ConflictItem, type ConflictReason, type ConflictSummary, type ControlDefinition, type ControlType, EMPTY_UI_GATES, ENUM_OFF_VALUE, type InitializeSettingsInput, type LLMParams, type NormalizedControls, PARAM_ALIASES, type PendingModelSwitch, type RenderGroup, type ResolutionMode, SETTINGS_CATALOGUE, type SettingRowFacts, type SettingRowRead, type SettingRowView, type SettingState, type SettingsGroupId, type SettingsModelInfo, type SettingsRow, type SettingsStore, type SettingsStoreConfig, type SettingsWriteTarget, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, type UiGateEditableKey, type UiGateKey, type UiGates, type VariableCustomComponentRef, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extractModelDefaults, gateEnabled, getActionForMode, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingStateOf, startingValueFor, withSettingState };
701
+ export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, type AgentContext, type AgentSettings, type AgentSettingsEntry, type AgentSettingsState, type AgentSource, type AgentVariable, CATALOGUE_KEYS, type CapabilitiesWriteTarget, type CatalogueEntry, type CatalogueGroup, type ConflictAction, type ConflictItem, type ConflictReason, type ConflictSummary, type ControlDefinition, type ControlType, EMPTY_UI_GATES, ENUM_OFF_VALUE, type ExtraSettingKeys, type InitializeSettingsInput, type LLMParams, type ModelRowTarget, type NormalizedControls, PARAM_ALIASES, type PendingModelSwitch, type RenderGroup, type ResolutionMode, SETTINGS_CATALOGUE, type SettingRowFacts, type SettingRowRead, type SettingRowView, type SettingState, type SettingsGroupId, type SettingsModelInfo, type SettingsRow, type SettingsStore, type SettingsStoreConfig, type SettingsWriteTarget, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, type UiGateEditableKey, type UiGateKey, type UiGates, type VariableCustomComponentRef, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extraSettingKeys, extractModelDefaults, gateEnabled, getActionForMode, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingLabel, settingStateOf, startingValueFor, withSettingState };
@@ -242,6 +242,26 @@ type ControlsLike = Record<string, unknown> | null | undefined;
242
242
  * without a code change. Empty groups are returned (consumers skip them).
243
243
  */
244
244
  declare function buildSettingsRows(controls: ControlsLike, settings: Record<string, unknown> | null | undefined): RenderGroup[];
245
+ /** A setting's label: the catalog's own words, else the key humanized (the catch-all rule). */
246
+ declare function settingLabel(key: string): string;
247
+ interface ExtraSettingKeys {
248
+ /**
249
+ * Set, a real model parameter, not declared by this model: KEPT and sent as the model's
250
+ * closest equivalent — the server translates it (settings-translation K7, the platform rule).
251
+ * THE panel draws these under "Translated for this model", never as a warning.
252
+ */
253
+ translated: string[];
254
+ /** Set, but no model parameter at all (a typo, a retired key): "Not on this model". */
255
+ unsupported: string[];
256
+ }
257
+ /**
258
+ * The set values THE model-settings panel draws beside the model's own rows — one rule for the
259
+ * builder and every override screen (owner, 2026-10-21). `alsoKeys` are keys a target changed
260
+ * that hold no value now (an override that removes the agent's value): they stay listed so
261
+ * their reset stays reachable. Empty until the model declares at least one control: a model
262
+ * with no declared controls is a catalog gap, not an incompatibility.
263
+ */
264
+ declare function extraSettingKeys(controls: ControlsLike, settings: Record<string, unknown> | null | undefined, alsoKeys?: readonly string[]): ExtraSettingKeys;
245
265
 
246
266
  /**
247
267
  * Agent Settings — Internal Utilities
@@ -531,6 +551,37 @@ declare function isUnsetChoice(key: string, value: unknown): boolean;
531
551
 
532
552
  declare function startingValueFor(key: string, control: ControlDefinition): unknown;
533
553
 
554
+ /** One model a host runs on the person's own computer. */
555
+ interface LocalModelEntry {
556
+ /** The value `onValueChange` receives (the conversation's model override). */
557
+ id: string;
558
+ name: string;
559
+ /** Brand glyph key (e.g. "Meta"); absent draws the neutral glyph. */
560
+ maker?: string | null;
561
+ contextWindow?: number | null;
562
+ /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
563
+ needsMoreMemory?: boolean;
564
+ }
565
+ /**
566
+ * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
567
+ * draws its models as one "On this computer" group marked local. Start/Stop and getting more
568
+ * models stay the host's own screens.
569
+ */
570
+ interface LocalModelsPort {
571
+ /** Must return the SAME array until the list changes (it is a store snapshot). */
572
+ getModels(): readonly LocalModelEntry[];
573
+ subscribe(listener: () => void): () => void;
574
+ /** Group heading. Default "On this computer". */
575
+ groupLabel?: string;
576
+ /**
577
+ * Open the local model in its own private conversation (the host's Confidential Chat), instead
578
+ * of switching this conversation to it. Present = a local pick calls ONLY this: the cloud value
579
+ * and the class pin stay untouched, and no draft or context is carried. Absent = the pick reports
580
+ * the id through `onValueChange` (the override path).
581
+ */
582
+ open?(id: string): void;
583
+ }
584
+
534
585
  /**
535
586
  * THE SETTINGS WRITE TARGET — the one seam between THE model-settings panel
536
587
  * (`./react/ModelSettingsPanel`) and whatever a change is written to.
@@ -594,9 +645,48 @@ interface SettingsWriteTarget {
594
645
  unbind?(key: string, control: ControlDefinition | null): void;
595
646
  /** Drop THIS target's change and show what it inherits again. */
596
647
  resetToInherited?(key: string): void;
648
+ /**
649
+ * The keys THIS target changed. The panel keeps a changed key it has no row for (the model
650
+ * does not declare it, and the change removed its value) on screen, so its reset stays
651
+ * reachable.
652
+ */
653
+ changedKeys?: readonly string[];
597
654
  /** The reset button's words, in the host's noun. Default "Reset to agent". */
598
655
  resetLabel?: string;
599
656
  }
657
+ /**
658
+ * THE model row — the panel's first line, drawn by the panel with THE model picker
659
+ * (`ModelListDropdown`) in every host. Where a pick lands is the host's; the options below are
660
+ * capabilities a target has or lacks, exactly like `bind` / `resetToInherited` on the rows.
661
+ */
662
+ interface ModelRowTarget {
663
+ /** The model shown (the effective one; a one-message pick while that is on). */
664
+ value: string | null;
665
+ change(modelId: string): void;
666
+ /** The pinned class (offering) of the shown model. */
667
+ pinnedOfferingId: string | null | undefined;
668
+ /** A class pick (the picker reports the class before the model). */
669
+ changePin(offeringId: string | undefined): void;
670
+ /** True when THIS target changed the model or its class. */
671
+ changedHere?: boolean;
672
+ /** Drop this target's model choice (model and class together). */
673
+ resetToInherited?(): void;
674
+ /** An explicit "no override" choice at the top of the list, in the host's words. */
675
+ emptyChoice?: {
676
+ label: string;
677
+ choose(): void;
678
+ };
679
+ /** The person's local models (a chat host's port). */
680
+ localModels?: LocalModelsPort | undefined;
681
+ disabled?: boolean;
682
+ /** Said on the read-only picker when `disabled`. */
683
+ disabledTitle?: string;
684
+ /** "This message only": while on, a pick applies to the next message, then goes back. */
685
+ oneMessage?: {
686
+ on: boolean;
687
+ change(next: boolean): void;
688
+ };
689
+ }
600
690
  /** The frontend input capabilities (ui gates) shown under the settings groups. */
601
691
  interface CapabilitiesWriteTarget {
602
692
  values: UiGates;
@@ -608,4 +698,4 @@ interface CapabilitiesWriteTarget {
608
698
  error?: string | null;
609
699
  }
610
700
 
611
- export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, type AgentContext, type AgentSettings, type AgentSettingsEntry, type AgentSettingsState, type AgentSource, type AgentVariable, CATALOGUE_KEYS, type CapabilitiesWriteTarget, type CatalogueEntry, type CatalogueGroup, type ConflictAction, type ConflictItem, type ConflictReason, type ConflictSummary, type ControlDefinition, type ControlType, EMPTY_UI_GATES, ENUM_OFF_VALUE, type InitializeSettingsInput, type LLMParams, type NormalizedControls, PARAM_ALIASES, type PendingModelSwitch, type RenderGroup, type ResolutionMode, SETTINGS_CATALOGUE, type SettingRowFacts, type SettingRowRead, type SettingRowView, type SettingState, type SettingsGroupId, type SettingsModelInfo, type SettingsRow, type SettingsStore, type SettingsStoreConfig, type SettingsWriteTarget, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, type UiGateEditableKey, type UiGateKey, type UiGates, type VariableCustomComponentRef, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extractModelDefaults, gateEnabled, getActionForMode, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingStateOf, startingValueFor, withSettingState };
701
+ export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, type AgentContext, type AgentSettings, type AgentSettingsEntry, type AgentSettingsState, type AgentSource, type AgentVariable, CATALOGUE_KEYS, type CapabilitiesWriteTarget, type CatalogueEntry, type CatalogueGroup, type ConflictAction, type ConflictItem, type ConflictReason, type ConflictSummary, type ControlDefinition, type ControlType, EMPTY_UI_GATES, ENUM_OFF_VALUE, type ExtraSettingKeys, type InitializeSettingsInput, type LLMParams, type ModelRowTarget, type NormalizedControls, PARAM_ALIASES, type PendingModelSwitch, type RenderGroup, type ResolutionMode, SETTINGS_CATALOGUE, type SettingRowFacts, type SettingRowRead, type SettingRowView, type SettingState, type SettingsGroupId, type SettingsModelInfo, type SettingsRow, type SettingsStore, type SettingsStoreConfig, type SettingsWriteTarget, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, type UiGateEditableKey, type UiGateKey, type UiGates, type VariableCustomComponentRef, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extraSettingKeys, extractModelDefaults, gateEnabled, getActionForMode, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingLabel, settingStateOf, startingValueFor, withSettingState };