@ai-matrx/agents 0.59.271 → 0.59.273

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,25 @@
1
1
  # Changelog
2
2
 
3
- ## 0.59.271
3
+ ## 0.59.273
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.272
9
+
10
+ - New export `./context/rules-corpus.json` (shipped in `files`): the context-rules parity corpus, so a consumer test (chat) reads it through the dependency instead of a path into this package. Additive; no consumer action required.
11
+
12
+ - `./settings`: `reasoning_effort` leaves `AUTO_MEANS_UNSET_KEYS` — a person's "auto" is saved and
13
+ sent (owner ruling 2026-10-24: unset effort runs at the platform default "low"; "auto" only when a
14
+ person picks it). New `NEVER_IMPLICIT_AUTO_KEYS` + `isNeverImplicitChoice`; `startingValueFor`
15
+ never starts a row at "auto". Consumer action: none beyond adopting latest — every writer reads
16
+ `isUnsetChoice` already.
17
+
18
+ ## 0.59.271
19
+
20
+ Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 8a4ed656ea 2c48e64133 -- apps/shared/matrx-agents/src`
21
+ has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
22
+
8
23
  ## 0.59.270
9
24
 
10
25
  Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 4c08cba6c4 8a4ed656ea -- apps/shared/matrx-agents/src`
@@ -0,0 +1,238 @@
1
+ {
2
+ "version": 1,
3
+ "about": "THE parity corpus for context value rules (common-docs/systems/data/scopes-context/context-delivery/RULES.md). Run by the package vitest (context/rules.test.ts) AND aidream pytest (tests/test_context_rules_corpus.py). Expectations are hand-derived from RULES.md section 2 — never regenerate them from either implementation.",
4
+ "defaults": { "cap": 50000 },
5
+ "rules_cases": [
6
+ { "name": "bare value under default", "input": { "chars": 150 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
7
+ { "name": "bare value at the default is inline (<=)", "input": { "chars": 200 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
8
+ { "name": "bare value one over the default", "input": { "chars": 201 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
9
+ { "name": "unresolved lazy source is on request", "input": { "chars": null }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
10
+ { "name": "server per-key default (small lazy document)", "input": { "default_max": 6000, "chars": 5000 }, "expect": { "include": true, "max_inline_chars": 6000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
11
+ { "name": "server per-key default zero (IDE diagnostics)", "input": { "default_max": 0, "chars": 10 }, "expect": { "include": true, "max_inline_chars": 0, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
12
+ { "name": "page limit raises the default", "input": { "surface": { "declared": true, "auto_context": true, "max_inline_chars": 8000 }, "chars": 7000 }, "expect": { "include": true, "max_inline_chars": 8000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": false } },
13
+ { "name": "agent ceiling below page limit wins", "input": { "agent": { "declared": true, "max_inline_chars": 1000 }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 8000 }, "chars": 5000 }, "expect": { "include": true, "max_inline_chars": 1000, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "agent" }, "clamped": false } },
14
+ { "name": "page limit below agent ceiling wins", "input": { "agent": { "declared": true, "max_inline_chars": 1000 }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 500 }, "chars": 400 }, "expect": { "include": true, "max_inline_chars": 500, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": false } },
15
+ { "name": "agent and page tie — agent named", "input": { "agent": { "declared": true, "max_inline_chars": 1000 }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 1000 }, "chars": 1000 }, "expect": { "include": true, "max_inline_chars": 1000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "agent" }, "clamped": false } },
16
+ { "name": "agent declares key without a limit — page limit applies", "input": { "agent": { "declared": true, "max_inline_chars": null }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 8000 }, "chars": 3000 }, "expect": { "include": true, "max_inline_chars": 8000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": false } },
17
+ { "name": "agent limit ignored when the key is not declared", "input": { "agent": { "declared": false, "max_inline_chars": 1000 }, "chars": 300 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
18
+ { "name": "page zero beats agent ceiling", "input": { "agent": { "declared": true, "max_inline_chars": 1000 }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 0 }, "chars": 5 }, "expect": { "include": true, "max_inline_chars": 0, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": false } },
19
+ { "name": "agent zero with no page", "input": { "agent": { "declared": true, "max_inline_chars": 0 }, "chars": 5 }, "expect": { "include": true, "max_inline_chars": 0, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "agent" }, "clamped": false } },
20
+ { "name": "page auto_context off drops an undeclared value", "input": { "surface": { "declared": true, "auto_context": false, "max_inline_chars": null }, "chars": 50 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "default" }, "clamped": false } },
21
+ { "name": "agent declaration re-admits a page auto_context off value", "input": { "agent": { "declared": true }, "surface": { "declared": true, "auto_context": false }, "chars": 50 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "agent", "max_inline_chars": "default" }, "clamped": false } },
22
+ { "name": "auto_context off on an undeclared surface value is not a page rule", "input": { "surface": { "declared": false, "auto_context": false }, "chars": 50 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
23
+ { "name": "kill switch drops an undeclared key", "input": { "agent": { "declared": false, "kill_switch": true }, "chars": 50 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "agent", "max_inline_chars": "default" }, "clamped": false } },
24
+ { "name": "kill switch keeps a declared key", "input": { "agent": { "declared": true, "kill_switch": true }, "chars": 50 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
25
+ { "name": "kill switch beats a page auto_context on", "input": { "agent": { "declared": false, "kill_switch": true }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 8000 }, "chars": 50 }, "expect": { "include": false, "max_inline_chars": 8000, "delivery": "off", "decided_by": { "include": "agent", "max_inline_chars": "page" }, "clamped": false } },
26
+ { "name": "YOU re-admit past the kill switch", "input": { "agent": { "declared": false, "kill_switch": true }, "user": { "include": true }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
27
+ { "name": "YOU re-admit past page auto_context off", "input": { "surface": { "declared": true, "auto_context": false }, "user": { "include": true }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
28
+ { "name": "YOU turn a value off", "input": { "user": { "include": false }, "chars": 100 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
29
+ { "name": "YOU turn off an agent-declared value", "input": { "agent": { "declared": true, "max_inline_chars": 5000 }, "user": { "include": false }, "chars": 100 }, "expect": { "include": false, "max_inline_chars": 5000, "delivery": "off", "decided_by": { "include": "you", "max_inline_chars": "agent" }, "clamped": false } },
30
+ { "name": "YOUR limit beats a lower agent ceiling", "input": { "agent": { "declared": true, "max_inline_chars": 1000 }, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 500 }, "user": { "max_inline_chars": 20000 }, "chars": 15000 }, "expect": { "include": true, "max_inline_chars": 20000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "you" }, "clamped": false } },
31
+ { "name": "YOUR limit zero means never inline", "input": { "user": { "max_inline_chars": 0 }, "chars": 5 }, "expect": { "include": true, "max_inline_chars": 0, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "you" }, "clamped": false } },
32
+ { "name": "YOUR limit at exact size is inline", "input": { "user": { "max_inline_chars": 300 }, "chars": 300 }, "expect": { "include": true, "max_inline_chars": 300, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "you" }, "clamped": false } },
33
+ { "name": "YOUR limit above the cap is clamped and says so", "input": { "user": { "max_inline_chars": 60000 }, "chars": 55000 }, "expect": { "include": true, "max_inline_chars": 50000, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "you" }, "clamped": true } },
34
+ { "name": "agent limit above the cap is clamped", "input": { "agent": { "declared": true, "max_inline_chars": 70000 }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 50000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "agent" }, "clamped": true } },
35
+ { "name": "lowered cap knob clamps a page limit", "input": { "cap": 1000, "surface": { "declared": true, "auto_context": true, "max_inline_chars": 8000 }, "chars": 900 }, "expect": { "include": true, "max_inline_chars": 1000, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": true } },
36
+ { "name": "negative user limit is ignored", "input": { "user": { "max_inline_chars": -5 }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
37
+ { "name": "fractional user limit is ignored", "input": { "user": { "max_inline_chars": 12.5 }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
38
+ { "name": "non-boolean user include is ignored", "input": { "user": { "include": "no" }, "chars": 100 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
39
+ { "name": "user limit only — include still decided by the page", "input": { "surface": { "declared": true, "auto_context": false }, "user": { "max_inline_chars": 900 }, "chars": 100 }, "expect": { "include": false, "max_inline_chars": 900, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "you" }, "clamped": false } },
40
+ { "name": "user limit on an unresolved lazy source stays on request", "input": { "user": { "max_inline_chars": 20000 }, "chars": null }, "expect": { "include": true, "max_inline_chars": 20000, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "you" }, "clamped": false } },
41
+ { "name": "identity survives the agent kill switch", "input": { "identity": true, "agent": { "declared": false, "kill_switch": true }, "chars": 120 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
42
+ { "name": "identity survives a page that switched auto context off", "input": { "identity": true, "surface": { "declared": true, "auto_context": false }, "chars": 120 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
43
+ { "name": "identity under the kill switch: the person's off rule still wins", "input": { "identity": true, "agent": { "declared": false, "kill_switch": true }, "user": { "include": false }, "chars": 120 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
44
+ { "name": "a page's own conversation never gets the page: the lock turns it off", "input": { "surface": { "declared": true, "auto_context": false, "own": true }, "chars": 10 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "default" }, "clamped": false } },
45
+ { "name": "the person's saved on rule cannot reopen a page's own conversation", "input": { "surface": { "declared": true, "auto_context": false, "own": true }, "user": { "include": true }, "chars": 10 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "default" }, "clamped": false } },
46
+ { "name": "the agent's own declaration cannot reopen a page's own conversation", "input": { "agent": { "declared": true, "kill_switch": false }, "surface": { "declared": true, "auto_context": false, "own": true }, "chars": 10 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "default" }, "clamped": false } },
47
+ { "name": "identity is never locked by a page's own conversation", "input": { "identity": true, "surface": { "declared": true, "auto_context": false, "own": true }, "chars": 10 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "default", "max_inline_chars": "default" }, "clamped": false } },
48
+ { "name": "identity under a switched-off page: the person's off rule still wins", "input": { "identity": true, "surface": { "declared": true, "auto_context": false }, "user": { "include": false }, "chars": 120 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
49
+ { "name": "identity on the page's own conversation with the person's on rule is sent", "input": { "identity": true, "surface": { "declared": true, "auto_context": false }, "user": { "include": true }, "chars": 120 }, "expect": { "include": true, "max_inline_chars": 200, "delivery": "inline", "decided_by": { "include": "you", "max_inline_chars": "default" }, "clamped": false } },
50
+ { "name": "the same page-off layer closes a value that is not identity", "input": { "surface": { "declared": true, "auto_context": false }, "chars": 120 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "page", "max_inline_chars": "default" }, "clamped": false } },
51
+ { "name": "identity's limit still resolves like any value", "input": { "identity": true, "agent": { "declared": false, "kill_switch": true }, "surface": { "declared": true, "auto_context": false, "max_inline_chars": 100 }, "chars": 120 }, "expect": { "include": true, "max_inline_chars": 100, "delivery": "on_request", "decided_by": { "include": "default", "max_inline_chars": "page" }, "clamped": false } },
52
+ { "name": "a value that is not identity is still closed by the kill switch", "input": { "identity": false, "agent": { "declared": false, "kill_switch": true }, "chars": 120 }, "expect": { "include": false, "max_inline_chars": 200, "delivery": "off", "decided_by": { "include": "agent", "max_inline_chars": "default" }, "clamped": false } }
53
+ ],
54
+ "lookup_cases": [
55
+ { "name": "no rows", "rows": {}, "surface_key": "matrx-user/notes", "key": "note_bundle", "expect": null },
56
+ { "name": "default row only", "rows": { "_default": { "note_bundle": { "include": false } } }, "surface_key": "matrx-user/notes", "key": "note_bundle", "expect": { "include": false } },
57
+ { "name": "surface row merges over default per field", "rows": { "_default": { "note_bundle": { "max_inline_chars": 1000 } }, "matrx-user/notes": { "note_bundle": { "include": false } } }, "surface_key": "matrx-user/notes", "key": "note_bundle", "expect": { "include": false, "max_inline_chars": 1000 } },
58
+ { "name": "surface row field wins over default field", "rows": { "_default": { "note_bundle": { "include": false } }, "matrx-user/notes": { "note_bundle": { "include": true } } }, "surface_key": "matrx-user/notes", "key": "note_bundle", "expect": { "include": true } },
59
+ { "name": "other surface rows never apply", "rows": { "matrx-user/tasks": { "note_bundle": { "include": false } } }, "surface_key": "matrx-user/notes", "key": "note_bundle", "expect": null },
60
+ { "name": "no-surface value reads the default row", "rows": { "_default": { "attached_document_1": { "max_inline_chars": 9000 } } }, "surface_key": "_default", "key": "attached_document_1", "expect": { "max_inline_chars": 9000 } },
61
+ { "name": "other key absent", "rows": { "_default": { "a": { "include": false } } }, "surface_key": "_default", "key": "b", "expect": null }
62
+ ],
63
+ "chars_cases": [
64
+ { "name": "plain string", "value": "hello", "chars": 5 },
65
+ { "name": "empty string", "value": "", "chars": 0 },
66
+ { "name": "accented string counts code points", "value": "héllo", "chars": 5 },
67
+ { "name": "astral emoji is ONE code point (JS .length would say 2)", "value": "😀ab", "chars": 3 },
68
+ { "name": "string with a raw newline is itself", "value": "a\nb", "chars": 3 },
69
+ { "name": "object pretty-printed at indent 2", "value": { "a": 1 }, "chars": 12 },
70
+ { "name": "empty object", "value": {}, "chars": 2 },
71
+ { "name": "empty array", "value": [], "chars": 2 },
72
+ { "name": "array pretty-printed", "value": [1, 2], "chars": 12 },
73
+ { "name": "nested with empty array", "value": { "a": { "b": [] } }, "chars": 28 },
74
+ { "name": "object with non-ASCII value (ensure_ascii off)", "value": { "k": "é😀" }, "chars": 15 },
75
+ { "name": "object with newline in a string escapes it", "value": { "t": "a\nb" }, "chars": 17 },
76
+ { "name": "boolean", "value": true, "chars": 4 },
77
+ { "name": "null", "value": null, "chars": 4 },
78
+ { "name": "integer", "value": 42, "chars": 2 }
79
+ ],
80
+ "server_default_cases": [
81
+ { "name": "plain string has no server default", "value": "hello", "expect": null },
82
+ { "name": "plain object has no server default", "value": {"a": 1}, "expect": null },
83
+ { "name": "envelope with content only", "value": {"content": "x", "label": "Note"}, "expect": null },
84
+ { "name": "envelope default_max_inline_chars is the server default", "value": {"content": "x", "default_max_inline_chars": 9000}, "expect": 9000 },
85
+ { "name": "envelope default zero (IDE diagnostics)", "value": {"content": "x", "default_max_inline_chars": 0}, "expect": 0 },
86
+ { "name": "negative envelope default is ignored", "value": {"content": "x", "default_max_inline_chars": -1}, "expect": null },
87
+ { "name": "boolean envelope default is ignored", "value": {"content": "x", "default_max_inline_chars": true}, "expect": null },
88
+ { "name": "fractional envelope default is ignored", "value": {"content": "x", "default_max_inline_chars": 12.5}, "expect": null },
89
+ { "name": "string envelope default is ignored", "value": {"content": "x", "default_max_inline_chars": "9000"}, "expect": null },
90
+ { "name": "a page limit is not a server default", "value": {"content": "x", "max_inline_chars": 8000}, "expect": null },
91
+ { "name": "lazy source pointer (no content) is 6000", "value": {"source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111", "field": "content"}, "type": "json", "label": "Doc"}, "expect": 6000 },
92
+ { "name": "lazy source with null content is 6000", "value": {"content": null, "source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111"}}, "expect": 6000 },
93
+ { "name": "a source with content is not lazy", "value": {"content": "body", "source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111"}}, "expect": null },
94
+ { "name": "normalized resource source is descriptor-first", "value": {"source": {"kind": "file", "id": "11111111-1111-4111-8111-111111111111", "extra": {"resource_type": "file"}}, "type": "json"}, "expect": 0 },
95
+ { "name": "explicit default beats the lazy default", "value": {"source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111"}, "default_max_inline_chars": 100}, "expect": 100 },
96
+ { "name": "a source without kind is raw content", "value": {"source": {"id": "11111111-1111-4111-8111-111111111111"}}, "expect": null },
97
+ { "name": "an unknown key makes the dict raw JSON", "value": {"content": "x", "default_max_inline_chars": 9000, "other": 1}, "expect": null },
98
+ { "name": "bare resource reference is descriptor-first", "value": {"__kind": "resource_ref", "resource_type": "file", "resource_id": "11111111-1111-4111-8111-111111111111"}, "expect": 0 },
99
+ { "name": "resource reference nested as envelope content is not promoted", "value": {"content": {"__kind": "resource_ref", "resource_type": "file", "resource_id": "11111111-1111-4111-8111-111111111111"}}, "expect": null },
100
+ { "name": "resource reference without a UUID id is raw content", "value": {"__kind": "resource_ref", "resource_type": "file", "resource_id": "not-a-uuid"}, "expect": null }
101
+ ],
102
+ "envelope_cases": [
103
+ { "name": "a record that merely has content is raw content", "value": {"id": "11111111-1111-4111-8111-111111111111", "title": "Q3 vendor review", "content": "Follow up with Acme"}, "expect": {"content": {"id": "11111111-1111-4111-8111-111111111111", "title": "Q3 vendor review", "content": "Follow up with Acme"}, "overrides": {}} },
104
+ { "name": "a true envelope splits content from its fields", "value": {"content": "Follow up with Acme", "label": "Current note", "max_inline_chars": 8000}, "expect": {"content": "Follow up with Acme", "overrides": {"label": "Current note", "max_inline_chars": 8000}} },
105
+ { "name": "an envelope with an unknown key is raw content", "value": {"content": "x", "label": "L", "pinned": true}, "expect": {"content": {"content": "x", "label": "L", "pinned": true}, "overrides": {}} },
106
+ { "name": "an envelope keeps default_max_inline_chars as a field", "value": {"content": "2 errors", "default_max_inline_chars": 0}, "expect": {"content": "2 errors", "overrides": {"default_max_inline_chars": 0}} },
107
+ { "name": "a lazy source pointer has null content", "value": {"source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111"}, "type": "json", "label": "Doc"}, "expect": {"content": null, "overrides": {"source": {"kind": "note", "id": "11111111-1111-4111-8111-111111111111"}, "type": "json", "label": "Doc"}} },
108
+ { "name": "a source without kind and no content is raw content", "value": {"source": {"id": "11111111-1111-4111-8111-111111111111"}, "label": "Doc"}, "expect": {"content": {"source": {"id": "11111111-1111-4111-8111-111111111111"}, "label": "Doc"}, "overrides": {}} },
109
+ { "name": "a plain string is content", "value": "hello", "expect": {"content": "hello", "overrides": {}} },
110
+ { "name": "an array is content", "value": [1, 2], "expect": {"content": [1, 2], "overrides": {}} }
111
+ ],
112
+ "wire_passthrough_cases": [
113
+ { "name": "an attached file reference ships as-is", "key": "attached_file_22222222-2222-4222-8222-222222222222", "value": {"__kind": "resource_ref", "resource_type": "file", "resource_id": "22222222-2222-4222-8222-222222222222"}, "passthrough": true },
114
+ { "name": "a reference with its own policy ships as-is", "key": "attached_file_22222222-2222-4222-8222-222222222222", "value": {"__kind": "resource_ref", "resource_type": "file", "resource_id": "22222222-2222-4222-8222-222222222222", "promote": [{"representation": "clean_text", "max_chars": 5000}], "exclude": ["image"]}, "passthrough": true },
115
+ { "name": "a processed document reference ships as-is", "key": "source_doc", "value": {"__kind": "resource_ref", "resource_type": "processed_document", "resource_id": "22222222-2222-4222-8222-222222222222"}, "passthrough": true },
116
+ { "name": "a bare file id under file_id ships as-is", "key": "file_id", "value": "22222222-2222-4222-8222-222222222222", "passthrough": true },
117
+ { "name": "a bare file id under a *_file_id key ships as-is", "key": "attached_file_id", "value": "22222222-2222-4222-8222-222222222222", "passthrough": true },
118
+ { "name": "a record with content is wrapped", "key": "current_note", "value": {"id": "22222222-2222-4222-8222-222222222222", "title": "Q3 vendor review", "content": "Follow up"}, "passthrough": false },
119
+ { "name": "a plain string is wrapped", "key": "current_note", "value": "Follow up with Acme", "passthrough": false }
120
+ ],
121
+ "server_resolved_cases": [
122
+ { "name": "bare note id is server-resolved", "key": "note_id", "value": "33333333-3333-4333-8333-333333333333", "expect": true, "server_promotes": true },
123
+ { "name": "prefixed note id is server-resolved", "key": "current_note_id", "value": "33333333-3333-4333-8333-333333333333", "expect": true, "server_promotes": true },
124
+ { "name": "an id key is case-insensitive", "key": "Note_ID", "value": "33333333-3333-4333-8333-333333333333", "expect": true, "server_promotes": true },
125
+ { "name": "a braced UUID is a UUID", "key": "file_id", "value": "{33333333-3333-4333-8333-333333333333}", "expect": true, "server_promotes": true },
126
+ { "name": "a hyphenless UUID is a UUID", "key": "file_id", "value": "33333333333343338333333333333333", "expect": true, "server_promotes": true },
127
+ { "name": "a urn UUID is a UUID", "key": "note_id", "value": "urn:uuid:33333333-3333-4333-8333-333333333333", "expect": true, "server_promotes": true },
128
+ { "name": "a top-level resource reference is server-resolved", "key": "current_note", "value": {"__kind": "resource_ref", "resource_type": "note", "resource_id": "33333333-3333-4333-8333-333333333333"}, "expect": true, "server_promotes": true },
129
+ { "name": "an unregistered id noun: the client stops predicting, the server keeps it raw", "key": "model_id", "value": "33333333-3333-4333-8333-333333333333", "expect": true, "server_promotes": false },
130
+ { "name": "a resource reference as envelope content: the client stops predicting", "key": "current_note", "value": {"content": {"__kind": "resource_ref", "resource_type": "note", "resource_id": "33333333-3333-4333-8333-333333333333"}, "label": "Note"}, "expect": true, "server_promotes": false },
131
+ { "name": "a UUID under a non-id key is plain text", "key": "note", "value": "33333333-3333-4333-8333-333333333333", "expect": false, "server_promotes": false },
132
+ { "name": "a non-UUID under an id key is plain text", "key": "note_id", "value": "not-a-uuid", "expect": false, "server_promotes": false },
133
+ { "name": "a plain record is not server-resolved", "key": "current_note", "value": {"id": "33333333-3333-4333-8333-333333333333", "title": "Q3 vendor review", "content": "Follow up"}, "expect": false, "server_promotes": false }
134
+ ],
135
+ "effective_lookup_cases": [
136
+ { "name": "declared on both sides: page key", "rows": {"matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "matrx-user/notes", "key": "current_note_published_to_web", "expect": {"include": false} },
137
+ { "name": "declared client-only: the server files it under _default and still reads the page rule", "rows": {"matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "current_note_published_to_web", "expect": {"include": false} },
138
+ { "name": "rule in _default only, page key", "rows": {"_default": {"current_note_published_to_web": {"max_inline_chars": 1000}}}, "primary_surface": "matrx-user/notes", "surface_key": "matrx-user/notes", "key": "current_note_published_to_web", "expect": {"max_inline_chars": 1000} },
139
+ { "name": "rule in _default only, _default key", "rows": {"_default": {"current_note_published_to_web": {"max_inline_chars": 1000}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "current_note_published_to_web", "expect": {"max_inline_chars": 1000} },
140
+ { "name": "rule in P only, _default key", "rows": {"matrx-user/notes": {"attached_document_1": {"max_inline_chars": 9000}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "attached_document_1", "expect": {"max_inline_chars": 9000} },
141
+ { "name": "both rows merge per field, page key", "rows": {"_default": {"current_note_published_to_web": {"max_inline_chars": 1000}}, "matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "matrx-user/notes", "key": "current_note_published_to_web", "expect": {"include": false, "max_inline_chars": 1000} },
142
+ { "name": "both rows merge per field, _default key", "rows": {"_default": {"current_note_published_to_web": {"max_inline_chars": 1000}}, "matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "current_note_published_to_web", "expect": {"include": false, "max_inline_chars": 1000} },
143
+ { "name": "P wins a field both rows set", "rows": {"_default": {"current_note_published_to_web": {"include": true, "max_inline_chars": 1000}}, "matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "current_note_published_to_web", "expect": {"include": false, "max_inline_chars": 1000} },
144
+ { "name": "a surroundings key keeps its own surface", "rows": {"matrx-user/sidebar": {"sidebar_filter": {"include": false}}, "matrx-user/notes": {"sidebar_filter": {"include": true}}}, "primary_surface": "matrx-user/notes", "surface_key": "matrx-user/sidebar", "key": "sidebar_filter", "expect": {"include": false} },
145
+ { "name": "a surroundings key never reads P", "rows": {"matrx-user/notes": {"sidebar_filter": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "matrx-user/sidebar", "key": "sidebar_filter", "expect": null },
146
+ { "name": "no primary surface: _default key reads _default only", "rows": {"matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": null, "surface_key": "_default", "key": "current_note_published_to_web", "expect": null },
147
+ { "name": "no primary surface: surface key merges as before", "rows": {"_default": {"current_note_published_to_web": {"max_inline_chars": 1000}}, "matrx-user/notes": {"current_note_published_to_web": {"include": false}}}, "primary_surface": null, "surface_key": "matrx-user/notes", "key": "current_note_published_to_web", "expect": {"include": false, "max_inline_chars": 1000} },
148
+ { "name": "other surfaces' rows never apply", "rows": {"matrx-user/tasks": {"current_note_published_to_web": {"include": false}}}, "primary_surface": "matrx-user/notes", "surface_key": "_default", "key": "current_note_published_to_web", "expect": null },
149
+ { "name": "a value a screen mounted inside the page published keeps that screen's surface", "rows": {"matrx-user/transcripts": {"transcript_title": {"include": false}}, "matrx-user/knowledge": {"transcript_title": {"include": true, "max_inline_chars": 9}}, "_default": {"transcript_title": {"max_inline_chars": 700}}}, "primary_surface": "matrx-user/knowledge", "surface_key": "matrx-user/transcripts", "origin": "client", "key": "transcript_title", "expect": {"include": false, "max_inline_chars": 700} },
150
+ { "name": "a mounted screen's value never reads the primary's row", "rows": {"matrx-user/knowledge": {"transcript_title": {"include": false}}}, "primary_surface": "matrx-user/knowledge", "surface_key": "matrx-user/transcripts", "origin": "client", "key": "transcript_title", "expect": null }
151
+ ],
152
+ "humanize_cases": [
153
+ { "name": "snake case to title words", "key": "current_note", "expect": "Current Note" },
154
+ { "name": "id is an acronym", "key": "note_id", "expect": "Note ID" },
155
+ { "name": "a long page key", "key": "current_note_published_to_web", "expect": "Current Note Published To Web" },
156
+ { "name": "several acronyms", "key": "source_url_pdf", "expect": "Source URL PDF" },
157
+ { "name": "acronyms are whole parts only", "key": "url2pdf_source", "expect": "Url2pdf Source" },
158
+ { "name": "hyphens split like underscores", "key": "ai-model-settings", "expect": "AI Model Settings" },
159
+ { "name": "runs of separators collapse", "key": "attached__file--id", "expect": "Attached File ID" },
160
+ { "name": "leading and trailing separators drop", "key": "_internal_key_", "expect": "Internal Key" },
161
+ { "name": "upper-case input is normalized", "key": "API_KEY_STATUS", "expect": "API Key Status" },
162
+ { "name": "camelCase splits into words", "key": "myValue_ID", "expect": "My Value ID" },
163
+ { "name": "uuid and json", "key": "resource_uuid_json", "expect": "Resource UUID JSON" },
164
+ { "name": "every listed acronym", "key": "id_url_pdf_html_json_api_ai_ui_csv_sms_seo_llm_mcp_uuid_iso", "expect": "ID URL PDF HTML JSON API AI UI CSV SMS SEO LLM MCP UUID ISO" },
165
+ { "name": "a word that only contains an acronym stays a word", "key": "idea_guide", "expect": "Idea Guide" },
166
+ { "name": "digits stay", "key": "attached_document_2", "expect": "Attached Document 2" },
167
+ { "name": "a single word", "key": "notes", "expect": "Notes" },
168
+ { "name": "empty key", "key": "", "expect": "" },
169
+ { "name": "already words stay as written", "key": "Normal Text", "expect": "Normal Text" },
170
+ { "name": "a person's phrase keeps its casing and apostrophe", "key": "Customer's iPhone model", "expect": "Customer's iPhone model" },
171
+ { "name": "a phrase with a version number is not split on the dot", "key": "Version 2.0", "expect": "Version 2.0" },
172
+ { "name": "a lowercase phrase gains only a capital first letter", "key": "lowercase words here", "expect": "Lowercase words here" },
173
+ { "name": "a plural acronym tail stays whole", "key": "userIDs", "expect": "User IDs" },
174
+ { "name": "a plural acronym part", "key": "user_ids", "expect": "User IDs" },
175
+ { "name": "api key", "key": "api_key", "expect": "API Key" },
176
+ { "name": "user id", "key": "user_id", "expect": "User ID" },
177
+ { "name": "an upper-case run before a word splits", "key": "HTMLParser", "expect": "HTML Parser" },
178
+ { "name": "digits stay inside a part", "key": "step2_output", "expect": "Step2 Output" },
179
+ { "name": "a short versioned key", "key": "v2", "expect": "V2" },
180
+ { "name": "no key at all", "key": null, "expect": "" }
181
+ ],
182
+ "attachment_key_cases_about": "attached_resource_ + encode(provider + ':' + resource_ref): ASCII letters, digits and '-' kept; every other UTF-8 byte is '_' + two lowercase hex digits ('_' itself is _5f), so the key is unique across providers, case-preserving and stable, and every client derives it from GET /conversations/{id}/attachments (provider, resource_ref).",
183
+ "attachment_key_cases": [
184
+ { "name": "a GitHub repository", "provider": "github", "resource_ref": "harbor-point/work-orders", "expect": "attached_resource_github_3aharbor-point_2fwork-orders" },
185
+ { "name": "a Drive file id keeps its case", "provider": "google", "resource_ref": "1AbCvendorSchedule", "expect": "attached_resource_google_3a1AbCvendorSchedule" },
186
+ { "name": "ids that differ only by case stay distinct", "provider": "google", "resource_ref": "1abcvendorschedule", "expect": "attached_resource_google_3a1abcvendorschedule" },
187
+ { "name": "an underscore is escaped, so it never collides with a slash", "provider": "github", "resource_ref": "harbor_point/ops", "expect": "attached_resource_github_3aharbor_5fpoint_2fops" },
188
+ { "name": "slash form", "provider": "github", "resource_ref": "a/b", "expect": "attached_resource_github_3aa_2fb" },
189
+ { "name": "underscore form", "provider": "github", "resource_ref": "a_b", "expect": "attached_resource_github_3aa_5fb" },
190
+ { "name": "the same ref under another provider is another key", "provider": "microsoft", "resource_ref": "1AbC", "expect": "attached_resource_microsoft_3a1AbC" },
191
+ { "name": "the same ref under Google", "provider": "google", "resource_ref": "1AbC", "expect": "attached_resource_google_3a1AbC" },
192
+ { "name": "a synced record ref with dots, colons and @", "provider": "google", "resource_ref": "calendar.events:abc123@google.com", "expect": "attached_resource_google_3acalendar_2eevents_3aabc123_40google_2ecom" },
193
+ { "name": "non-ASCII is escaped byte by byte (UTF-8)", "provider": "github", "resource_ref": "café", "expect": "attached_resource_github_3acaf_c3_a9" },
194
+ { "name": "spaces and dots", "provider": "microsoft", "resource_ref": "Q4 Budget.xlsx", "expect": "attached_resource_microsoft_3aQ4_20Budget_2exlsx" },
195
+ { "name": "an empty ref still names the provider", "provider": "github", "resource_ref": "", "expect": "attached_resource_github_3a" }
196
+ ],
197
+ "server_authoritative_keys_about": "The keys whose value the SERVER states itself, never the client's copy (RULES.md section 5a, owner ruling 2026-10-01: identity is the server's truth, never the page's claim), and where it states each: active_context = the turn's <active_context> block; manifest = a server-built context value. aidream SERVER_AUTHORITATIVE_KEYS and the package SERVER_AUTHORITATIVE_KEYS must equal this table exactly.",
198
+ "server_authoritative_keys": { "user": "manifest", "client": "manifest", "organization": "active_context", "active_scopes": "active_context" },
199
+ "pointer_inline_ceilings_about": "The page-layer limits the client DERIVES instead of reading from the page (owner ruling 2026-09-30, the person's pointer): a selection and the text around it inline up to these sizes on every page, never below the page's own number; pageless_content is a launch with no page behind it. A sent value carries the number on its envelope; a WITHHELD value does not, so the server holds the same table for its receipt row. matrx-frontend POINTER_INLINE_CEILINGS / PAGELESS_CONTENT_INLINE_CEILING and aidream POINTER_INLINE_CEILINGS / PAGELESS_CONTENT_INLINE_CEILING must equal this table exactly.",
200
+ "pointer_inline_ceilings": { "selection": 10000, "text_before": 2500, "text_after": 2500 },
201
+ "pageless_content_inline_ceiling": 6000,
202
+ "consumed_key_cases_about": "The reserved keys the server never keeps under their own name (RULES.md section 5 consumed_as): each still gets a receipt row naming what became of it. aidream RESERVED_CONSUMED_KEYS and the package RESERVED_CONSUMED_KEYS must equal this table exactly.",
203
+ "consumed_key_cases": [
204
+ { "name": "the registered screens around the page expand into <surface>::<value> rows", "key": "surface_chain", "consumed_as": "expanded" },
205
+ { "name": "open unregistered windows expand into window::<title> rows", "key": "window_forms", "consumed_as": "expanded" },
206
+ { "name": "a table-access grant is a directive the server acts on", "key": "__table_access", "consumed_as": "directive" },
207
+ { "name": "attached Google files are a directive the server acts on", "key": "__google_files", "consumed_as": "directive" },
208
+ { "name": "an Orchestra member step's connection is a directive the server acts on", "key": "__orchestra_member", "consumed_as": "directive" }
209
+ ],
210
+ "surroundings_key_cases_about": "The key the server delivers each value of a surface_chain level under (aidream chain_context_key), which the composer lists before the send (expandSurroundingsForDisplay): one key, so the composer, the person's rule and the receipt name the same value.",
211
+ "surroundings_key_cases": [
212
+ { "name": "the canvas beside the chat delivers its active organization id under its own surface", "surface": "matrx-user/canvas", "value": "active_organization_id", "key": "matrx-user/canvas::active_organization_id" },
213
+ { "name": "a window's value keeps its window surface", "surface": "matrx-user/data-tables-row-editor", "value": "row_draft", "key": "matrx-user/data-tables-row-editor::row_draft" }
214
+ ],
215
+ "page_context_cases_about": "RULES.md section 0: a page's OWN conversation (mode own) and a conversation whose page switch is off (mode off) never receive the page. The listed keys are withheld at the PAGE layer (declared, auto_context off), as is any value from the screens around the page (origin surroundings) and any value the page itself declared; the person values are never withheld. withheld null = the default list for the mode. aidream page_context.py and the package's pageContextWithholds must agree with every case.",
216
+ "page_context_defaults": {
217
+ "off": ["route_brief", "surface_chain", "window_forms", "surface_closed"],
218
+ "own": ["route_brief", "surface_chain", "window_forms", "surface_closed", "conversation"],
219
+ "person_values": ["user", "client", "organization", "project", "task", "active_scopes"]
220
+ },
221
+ "page_context_cases": [
222
+ { "name": "an own conversation never gets its route", "mode": "own", "withheld": null, "key": "route_brief", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": true },
223
+ { "name": "an own conversation never gets its own id", "mode": "own", "withheld": null, "key": "conversation", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": true },
224
+ { "name": "a switched-off page still lets the conversation know its id", "mode": "off", "withheld": null, "key": "conversation", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": false },
225
+ { "name": "a switched-off page withholds its route", "mode": "off", "withheld": null, "key": "route_brief", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": true },
226
+ { "name": "the person is never withheld", "mode": "own", "withheld": null, "key": "user", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": false },
227
+ { "name": "the organization is never withheld, even when the page declares it", "mode": "own", "withheld": null, "key": "organization", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/chat", "expect": false },
228
+ { "name": "the conversation's working document is never withheld, even when the page declares the name", "mode": "own", "withheld": null, "key": "working_document", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/chat", "expect": false },
229
+ { "name": "the conversation's scratchpad is never withheld from its own conversation", "mode": "own", "withheld": null, "key": "user_scratchpad", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/chat", "expect": false },
230
+ { "name": "an attached scratchpad is never withheld by a switched-off page", "mode": "off", "withheld": null, "key": "user_scratchpad_ab12cd34", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/chat", "expect": false },
231
+ { "name": "a page's own declared value is withheld from its own conversation", "mode": "own", "withheld": null, "key": "battle_columns", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/agent-battle", "expect": true },
232
+ { "name": "a screen around the page is withheld", "mode": "own", "withheld": null, "key": "matrx-user/notes::content", "origin": "surroundings", "surface_declared": true, "surface_key": "matrx-user/notes", "expect": true },
233
+ { "name": "an attachment is not the page", "mode": "own", "withheld": null, "key": "attached_document_x", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": false },
234
+ { "name": "a page that declares its own list overrides the default", "mode": "own", "withheld": ["conversation"], "key": "route_brief", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": false },
235
+ { "name": "a declared list can never withhold the person", "mode": "own", "withheld": ["user", "conversation"], "key": "user", "origin": "client", "surface_declared": false, "surface_key": "_default", "expect": false },
236
+ { "name": "a switched-off page withholds what a screen mounted inside it published", "mode": "off", "withheld": null, "key": "transcript_title", "origin": "client", "surface_declared": true, "surface_key": "matrx-user/transcripts", "expect": true }
237
+ ]
238
+ }
@@ -38,6 +38,7 @@ __export(models_exports, {
38
38
  GgufError: () => GgufError,
39
39
  INPUT_MODALITIES: () => INPUT_MODALITIES,
40
40
  INTERACTION_MODES: () => INTERACTION_MODES,
41
+ LLM_INTERACTIONS: () => LLM_INTERACTIONS,
41
42
  MAX_SUCCESSION_HOPS: () => MAX_SUCCESSION_HOPS,
42
43
  MODEL_CATALOG_KINDS: () => MODEL_CATALOG_KINDS,
43
44
  MODEL_FAVORITE_ENTITY_TYPE: () => MODEL_FAVORITE_ENTITY_TYPE,
@@ -47,6 +48,7 @@ __export(models_exports, {
47
48
  SERVICE_LABEL_PLURAL: () => SERVICE_LABEL_PLURAL,
48
49
  TOP_TIER_COST_RATING: () => TOP_TIER_COST_RATING,
49
50
  TOP_TIER_LOCKED_TITLE: () => TOP_TIER_LOCKED_TITLE,
51
+ UNKNOWN_MODEL_KIND: () => UNKNOWN_MODEL_KIND,
50
52
  acceptsTextInstructions: () => acceptsTextInstructions,
51
53
  announceModelCatalogChanged: () => announceModelCatalogChanged,
52
54
  availableOnDevices: () => availableOnDevices,
@@ -57,6 +59,7 @@ __export(models_exports, {
57
59
  catalogForApp: () => catalogForApp,
58
60
  catalogKeyColumn: () => catalogKeyColumn,
59
61
  catalogKindOf: () => catalogKindOf,
62
+ catalogKindVerdict: () => catalogKindVerdict,
60
63
  cheapestAdequateModel: () => cheapestAdequateModel,
61
64
  classConfigKey: () => classConfigKey,
62
65
  collapseTiersByClass: () => collapseTiersByClass,
@@ -2828,7 +2831,8 @@ function toDeviceModelFile(r) {
2828
2831
  sha256: sn2(r.sha256),
2829
2832
  artifact_id: sn2(r.artifact_id),
2830
2833
  state: s2(r.state),
2831
- organization_id: sn2(r.organization_id)
2834
+ organization_id: sn2(r.organization_id),
2835
+ model_key: sn2(r.metadata?.model_key)
2832
2836
  };
2833
2837
  }
2834
2838
  async function readDeviceModelFiles(client, opts = {}) {
@@ -2881,6 +2885,7 @@ var DeviceModelUnavailableError = class extends Error {
2881
2885
  };
2882
2886
 
2883
2887
  // models/catalog-reader.ts
2888
+ var UNKNOWN_MODEL_KIND = "unknown";
2884
2889
  var MODEL_CATALOG_KINDS = /* @__PURE__ */ new Set([
2885
2890
  "llm_model",
2886
2891
  "whisper_model",
@@ -2889,23 +2894,35 @@ var MODEL_CATALOG_KINDS = /* @__PURE__ */ new Set([
2889
2894
  "video_gen_model",
2890
2895
  "ner_model",
2891
2896
  "wake_word_model",
2892
- "lora"
2897
+ "lora",
2898
+ "embedding_model",
2899
+ UNKNOWN_MODEL_KIND
2893
2900
  ]);
2894
- function catalogKindOf(m, kindOfEntry) {
2901
+ var LLM_INTERACTIONS = /* @__PURE__ */ new Set(["turn", "single", "agent"]);
2902
+ function catalogKindVerdict(m, kindOfEntry) {
2895
2903
  for (const v of m.variants)
2896
2904
  for (const id of v.catalog_entry_ids ?? []) {
2897
2905
  const k = kindOfEntry.get(id);
2898
- if (k && MODEL_CATALOG_KINDS.has(k)) return k;
2906
+ if (k && k !== UNKNOWN_MODEL_KIND && MODEL_CATALOG_KINDS.has(k)) return { kind: k, reason: null };
2899
2907
  }
2900
2908
  const out = m.capabilities.output ?? [];
2901
2909
  const inp = m.capabilities.input ?? [];
2902
- if (m.presentation?.shelf === "loras") return "lora";
2903
- if (out.includes("video")) return "video_gen_model";
2904
- if (out.includes("image")) return "image_gen_model";
2905
- if (out.includes("audio")) return "tts_model_file";
2906
- if (inp.includes("audio")) return "whisper_model";
2907
- if (m.capabilities.interaction === "extraction") return "ner_model";
2908
- return "llm_model";
2910
+ const interaction = m.capabilities.interaction ?? "";
2911
+ const placed = (kind) => ({ kind, reason: null });
2912
+ if (m.presentation?.shelf === "loras" || interaction === "adapter") return placed("lora");
2913
+ if (out.includes("video")) return placed("video_gen_model");
2914
+ if (out.includes("image")) return placed("image_gen_model");
2915
+ if (out.includes("embedding")) return placed("embedding_model");
2916
+ if (out.includes("audio")) return placed("tts_model_file");
2917
+ if (inp.includes("audio") && (out.includes("decision") || interaction === "detection")) return placed("wake_word_model");
2918
+ if (inp.includes("audio") && out.includes("text")) return placed("whisper_model");
2919
+ if (interaction === "extraction") return placed("ner_model");
2920
+ if (inp.includes("text") && out.includes("text") && LLM_INTERACTIONS.has(interaction)) return placed("llm_model");
2921
+ const shape = `input [${inp.join(", ")}], output [${out.join(", ")}], interaction ${interaction || "(none)"}`;
2922
+ return { kind: UNKNOWN_MODEL_KIND, reason: `no kind rule places ${shape}` };
2923
+ }
2924
+ function catalogKindOf(m, kindOfEntry) {
2925
+ return catalogKindVerdict(m, kindOfEntry).kind;
2909
2926
  }
2910
2927
  function canonicalJson(value) {
2911
2928
  if (value === void 0) return "null";
@@ -2984,6 +3001,8 @@ async function readCatalogWith(client, opts, preread) {
2984
3001
  const p = presentationOf.get(c.id);
2985
3002
  stamp(p);
2986
3003
  const maker = providerById.get(s3(m.provider_id));
3004
+ const verdict = catalogKindVerdict(c, kindOfEntry);
3005
+ if (verdict.reason) warnings.push(`${s3(m.name)}: kind unknown: ${verdict.reason}`);
2987
3006
  return [
2988
3007
  {
2989
3008
  id: s3(m.id),
@@ -2994,7 +3013,7 @@ async function readCatalogWith(client, opts, preread) {
2994
3013
  maker_logo_file_id: sn3(maker?.logo_file_id),
2995
3014
  description: sn3(m.description),
2996
3015
  capabilities: m.capabilities ?? {},
2997
- kind: catalogKindOf(c, kindOfEntry),
3016
+ kind: verdict.kind,
2998
3017
  offered: c.offered,
2999
3018
  updated_at: c.updated_at,
3000
3019
  presentation: p ? {
@@ -1109,7 +1109,7 @@ interface LocalModel {
1109
1109
  /** Matrx 2's 1.48 id for a model seeded from its old list (metadata.desktop_id). */
1110
1110
  desktop_id?: string | null;
1111
1111
  maker_logo_file_id?: string | null;
1112
- /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora. */
1112
+ /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora, embedding_model, or unknown (no rule places it; `catalogKindVerdict` says why). */
1113
1113
  kind?: string;
1114
1114
  /** At least one variant is offered (Matrx 2 lists it). */
1115
1115
  offered?: boolean;
@@ -1764,6 +1764,11 @@ interface DeviceModelFile {
1764
1764
  artifact_id: string | null;
1765
1765
  state: string;
1766
1766
  organization_id: string | null;
1767
+ /**
1768
+ * The key the computer runs this file under (`metadata.model_key`, published by Matrx 2): for a person's own
1769
+ * file it is the run key the device's model service names it by. Null when not reported yet.
1770
+ */
1771
+ model_key: string | null;
1767
1772
  }
1768
1773
  declare function toDeviceModelFile(r: Row$1): DeviceModelFile;
1769
1774
  /**
@@ -1845,8 +1850,12 @@ interface ReadModelCatalogOptions {
1845
1850
  appInstanceIds?: readonly string[];
1846
1851
  };
1847
1852
  }
1853
+ /** The kind of a model the catalog cannot place by its capabilities: shown loudly, never offered to a chat. */
1854
+ declare const UNKNOWN_MODEL_KIND: "unknown";
1848
1855
  /** The catalog kinds whose rows live in the unified catalog (ai.*): the admin Catalogs page's model kinds. */
1849
1856
  declare const MODEL_CATALOG_KINDS: ReadonlySet<string>;
1857
+ /** The interactions a text-in, text-out model answers a person in: only these make an llm_model. */
1858
+ declare const LLM_INTERACTIONS: ReadonlySet<string>;
1850
1859
  /** What `catalogKindOf` reads from a model (a CuratedModel or a LocalModel from `readModelCatalog` both fit). */
1851
1860
  interface CatalogKindInput {
1852
1861
  readonly variants: ReadonlyArray<{
@@ -1861,11 +1870,20 @@ interface CatalogKindInput {
1861
1870
  readonly shelf?: string | null;
1862
1871
  } | null;
1863
1872
  }
1873
+ /** A model's admin kind and, when it is `unknown`, why (one line, said on the admin page and in reader warnings). */
1874
+ interface CatalogKindVerdict {
1875
+ kind: string;
1876
+ reason: string | null;
1877
+ }
1864
1878
  /**
1865
- * THE admin Catalogs kind of a unified model: the kind of the old public.catalog_entries rows its variants
1866
- * carry (the list migration stamps them), when that is a model kind; else placed by what it does.
1867
- * `kindOfEntry` maps catalog_entries.id → kind.
1879
+ * THE admin Catalogs kind of a unified model, with the reason when it cannot be placed: the kind of the
1880
+ * old public.catalog_entries rows its variants carry (the list migration stamps them), when that is a
1881
+ * model kind; else placed by what it does (capabilities, never a name list). There is NO default: a model
1882
+ * is an llm_model only when it takes text, gives text and answers in a chat-like interaction
1883
+ * (LLM_INTERACTIONS); anything the rules cannot place is `unknown`, with the reason.
1868
1884
  */
1885
+ declare function catalogKindVerdict(m: CatalogKindInput, kindOfEntry: ReadonlyMap<string, string>): CatalogKindVerdict;
1886
+ /** THE admin Catalogs kind of a unified model (`catalogKindVerdict(...).kind`); `unknown` when it cannot be placed. */
1869
1887
  declare function catalogKindOf(m: CatalogKindInput, kindOfEntry: ReadonlyMap<string, string>): string;
1870
1888
  /** sha256 (hex) of the catalog's canonical JSON, its own `catalog_fingerprint` left out. Isomorphic (pure JS). */
1871
1889
  declare function catalogFingerprint(catalog: LocalModelCatalog): string;
@@ -2087,5 +2105,5 @@ interface ModelCatalogVisibilityOptions {
2087
2105
  */
2088
2106
  declare function followModelCatalogVisibility(options: ModelCatalogVisibilityOptions): () => void;
2089
2107
 
2090
- export { CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, DEFAULT_CAPABILITIES, DEVICE_FILE_USABLE_STATES, DEVICE_OWN_FILE_USABLE_STATES, DEVICE_RULE_TWIN_FIXTURE, DEVICE_SERVED_SETTINGS_KEY, DEVICE_SERVED_VIA, DeviceModelUnavailableError, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, GgufError, INPUT_MODALITIES, INTERACTION_MODES, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, NEW_AGENT_DEFAULT_MODEL_KNOB, OUTPUT_MODALITIES, SERVICE_LABEL, SERVICE_LABEL_PLURAL, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, acceptsTextInstructions, announceModelCatalogChanged, availableOnDevices, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKeyColumn, catalogKindOf, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, followModelCatalogChanges, followModelCatalogVisibility, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isModelCatalogChange, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelCatalogRevision, modelClassKnobFor, modelClassName, modelClassPinOf, modelDisplayLabel, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, onModelCatalogChanged, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readDeviceModelFiles, readGgufHeader, readModelCatalog, readModelCatalogStamp, readModelIdentities, readPublicModel, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifactIds, requiredArtifacts, resetSuccessionLogForTests, resolveDeviceModel, resolveLiveModelId, resolveModelMapKnob, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, runtimesOnEngine, 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, toDeviceModelFile, validateModelSet, variantVerdict, withModelClass };
2091
- export type { AdminOffering, AdminPricingBand, ArtifactUse, AuditCapabilitiesRecord, AvailabilityVariant, CapabilitiesParseContext, CatalogKeyColumn, CatalogKindInput, CatalogModel, CatalogTier, CheapestAdequateOptions, CompatStatus, ContentType, CuratedCatalogClient, CuratedModel, CuratedPresentation, CuratedRows, CuratedVariant, DecidedBy, DeviceAvailability, DeviceGraphics, DeviceHardware, DeviceModelFile, DeviceModelResolution, DeviceServedSettings, DiscoveryAmbiguity, DiscoveryArtifact, DiscoveryMedia, DiscoveryResult, DiscoveryRuntime, DiscoverySource, DiscoveryVariant, FeatureBucket, FeatureBucketMeta, FeatureKey, FitCapabilities, GgufHeader, GgufRead, GgufTensor, GroupedFeatures, HardwareClass, HardwareClasses, HeaderFlag, HeaderJudgement, HeaderRefusal, Interaction, InteractionMode, LocalArtifact, LocalCatalogClient, LocalCatalogQuery, LocalCompatRow, LocalModel, LocalModelCatalog, LocalPresentation, LocalRuntime, LocalRuntimeBuild, LocalVariant, Modality, ModelCapabilities, ModelCatalog, ModelCatalogChangePayload, ModelCatalogClient, ModelCatalogConfig, ModelCatalogDirectiveSubscribe, ModelCatalogErrorSink, ModelCatalogPgError, ModelCatalogPgResult, ModelCatalogQuery, ModelCatalogState, ModelCatalogVariant, ModelCatalogVariantState, ModelCatalogVisibilityOptions, ModelClassConfig, ModelClassEntry, ModelClassIndex, ModelDiagnosticEntry, ModelDiagnosticsSink, ModelFavorites, ModelFavoritesCache, ModelFavoritesClient, ModelFavoritesConfig, ModelFavoritesErrorSink, ModelFavoritesState, ModelFetchScope, ModelFileHandle, ModelFit, ModelIdentityRow, ModelJson, ModelLabelSource, ModelNeed, ModelOfferingRow, ModelOption, ModelOptionWithLifecycle, ModelRecord, ModelRecordFetchType, ModelRecords, ModelRecordsClient, ModelRecordsConfig, ModelRecordsState, ModelSelectionPurpose, ModelSetEnv, ModelSetFacts, ModelSetValidation, NewAgentModel, NoSelection, OrderedLike, PreferredModelChoice, PreferredModelChoicePorts, PriceTier, PricedCatalogModel, PublicModelClient, RankOptions, RankedVariant, ReadModelCatalogOptions, SelectDevice, Selection, ShardName, SuccessionClient, SuccessionIndex, SuccessionNode, VariantDiscovery, VariantVerdict, Want };
2108
+ export { CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, DEFAULT_CAPABILITIES, DEVICE_FILE_USABLE_STATES, DEVICE_OWN_FILE_USABLE_STATES, DEVICE_RULE_TWIN_FIXTURE, DEVICE_SERVED_SETTINGS_KEY, DEVICE_SERVED_VIA, DeviceModelUnavailableError, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, GgufError, INPUT_MODALITIES, INTERACTION_MODES, LLM_INTERACTIONS, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, NEW_AGENT_DEFAULT_MODEL_KNOB, OUTPUT_MODALITIES, SERVICE_LABEL, SERVICE_LABEL_PLURAL, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, UNKNOWN_MODEL_KIND, acceptsTextInstructions, announceModelCatalogChanged, availableOnDevices, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKeyColumn, catalogKindOf, catalogKindVerdict, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, followModelCatalogChanges, followModelCatalogVisibility, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isModelCatalogChange, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelCatalogRevision, modelClassKnobFor, modelClassName, modelClassPinOf, modelDisplayLabel, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, onModelCatalogChanged, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readDeviceModelFiles, readGgufHeader, readModelCatalog, readModelCatalogStamp, readModelIdentities, readPublicModel, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifactIds, requiredArtifacts, resetSuccessionLogForTests, resolveDeviceModel, resolveLiveModelId, resolveModelMapKnob, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, runtimesOnEngine, 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, toDeviceModelFile, validateModelSet, variantVerdict, withModelClass };
2109
+ export type { AdminOffering, AdminPricingBand, ArtifactUse, AuditCapabilitiesRecord, AvailabilityVariant, CapabilitiesParseContext, CatalogKeyColumn, CatalogKindInput, CatalogKindVerdict, CatalogModel, CatalogTier, CheapestAdequateOptions, CompatStatus, ContentType, CuratedCatalogClient, CuratedModel, CuratedPresentation, CuratedRows, CuratedVariant, DecidedBy, DeviceAvailability, DeviceGraphics, DeviceHardware, DeviceModelFile, DeviceModelResolution, DeviceServedSettings, DiscoveryAmbiguity, DiscoveryArtifact, DiscoveryMedia, DiscoveryResult, DiscoveryRuntime, DiscoverySource, DiscoveryVariant, FeatureBucket, FeatureBucketMeta, FeatureKey, FitCapabilities, GgufHeader, GgufRead, GgufTensor, GroupedFeatures, HardwareClass, HardwareClasses, HeaderFlag, HeaderJudgement, HeaderRefusal, Interaction, InteractionMode, LocalArtifact, LocalCatalogClient, LocalCatalogQuery, LocalCompatRow, LocalModel, LocalModelCatalog, LocalPresentation, LocalRuntime, LocalRuntimeBuild, LocalVariant, Modality, ModelCapabilities, ModelCatalog, ModelCatalogChangePayload, ModelCatalogClient, ModelCatalogConfig, ModelCatalogDirectiveSubscribe, ModelCatalogErrorSink, ModelCatalogPgError, ModelCatalogPgResult, ModelCatalogQuery, ModelCatalogState, ModelCatalogVariant, ModelCatalogVariantState, ModelCatalogVisibilityOptions, ModelClassConfig, ModelClassEntry, ModelClassIndex, ModelDiagnosticEntry, ModelDiagnosticsSink, ModelFavorites, ModelFavoritesCache, ModelFavoritesClient, ModelFavoritesConfig, ModelFavoritesErrorSink, ModelFavoritesState, ModelFetchScope, ModelFileHandle, ModelFit, ModelIdentityRow, ModelJson, ModelLabelSource, ModelNeed, ModelOfferingRow, ModelOption, ModelOptionWithLifecycle, ModelRecord, ModelRecordFetchType, ModelRecords, ModelRecordsClient, ModelRecordsConfig, ModelRecordsState, ModelSelectionPurpose, ModelSetEnv, ModelSetFacts, ModelSetValidation, NewAgentModel, NoSelection, OrderedLike, PreferredModelChoice, PreferredModelChoicePorts, PriceTier, PricedCatalogModel, PublicModelClient, RankOptions, RankedVariant, ReadModelCatalogOptions, SelectDevice, Selection, ShardName, SuccessionClient, SuccessionIndex, SuccessionNode, VariantDiscovery, VariantVerdict, Want };
@@ -1109,7 +1109,7 @@ interface LocalModel {
1109
1109
  /** Matrx 2's 1.48 id for a model seeded from its old list (metadata.desktop_id). */
1110
1110
  desktop_id?: string | null;
1111
1111
  maker_logo_file_id?: string | null;
1112
- /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora. */
1112
+ /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora, embedding_model, or unknown (no rule places it; `catalogKindVerdict` says why). */
1113
1113
  kind?: string;
1114
1114
  /** At least one variant is offered (Matrx 2 lists it). */
1115
1115
  offered?: boolean;
@@ -1764,6 +1764,11 @@ interface DeviceModelFile {
1764
1764
  artifact_id: string | null;
1765
1765
  state: string;
1766
1766
  organization_id: string | null;
1767
+ /**
1768
+ * The key the computer runs this file under (`metadata.model_key`, published by Matrx 2): for a person's own
1769
+ * file it is the run key the device's model service names it by. Null when not reported yet.
1770
+ */
1771
+ model_key: string | null;
1767
1772
  }
1768
1773
  declare function toDeviceModelFile(r: Row$1): DeviceModelFile;
1769
1774
  /**
@@ -1845,8 +1850,12 @@ interface ReadModelCatalogOptions {
1845
1850
  appInstanceIds?: readonly string[];
1846
1851
  };
1847
1852
  }
1853
+ /** The kind of a model the catalog cannot place by its capabilities: shown loudly, never offered to a chat. */
1854
+ declare const UNKNOWN_MODEL_KIND: "unknown";
1848
1855
  /** The catalog kinds whose rows live in the unified catalog (ai.*): the admin Catalogs page's model kinds. */
1849
1856
  declare const MODEL_CATALOG_KINDS: ReadonlySet<string>;
1857
+ /** The interactions a text-in, text-out model answers a person in: only these make an llm_model. */
1858
+ declare const LLM_INTERACTIONS: ReadonlySet<string>;
1850
1859
  /** What `catalogKindOf` reads from a model (a CuratedModel or a LocalModel from `readModelCatalog` both fit). */
1851
1860
  interface CatalogKindInput {
1852
1861
  readonly variants: ReadonlyArray<{
@@ -1861,11 +1870,20 @@ interface CatalogKindInput {
1861
1870
  readonly shelf?: string | null;
1862
1871
  } | null;
1863
1872
  }
1873
+ /** A model's admin kind and, when it is `unknown`, why (one line, said on the admin page and in reader warnings). */
1874
+ interface CatalogKindVerdict {
1875
+ kind: string;
1876
+ reason: string | null;
1877
+ }
1864
1878
  /**
1865
- * THE admin Catalogs kind of a unified model: the kind of the old public.catalog_entries rows its variants
1866
- * carry (the list migration stamps them), when that is a model kind; else placed by what it does.
1867
- * `kindOfEntry` maps catalog_entries.id → kind.
1879
+ * THE admin Catalogs kind of a unified model, with the reason when it cannot be placed: the kind of the
1880
+ * old public.catalog_entries rows its variants carry (the list migration stamps them), when that is a
1881
+ * model kind; else placed by what it does (capabilities, never a name list). There is NO default: a model
1882
+ * is an llm_model only when it takes text, gives text and answers in a chat-like interaction
1883
+ * (LLM_INTERACTIONS); anything the rules cannot place is `unknown`, with the reason.
1868
1884
  */
1885
+ declare function catalogKindVerdict(m: CatalogKindInput, kindOfEntry: ReadonlyMap<string, string>): CatalogKindVerdict;
1886
+ /** THE admin Catalogs kind of a unified model (`catalogKindVerdict(...).kind`); `unknown` when it cannot be placed. */
1869
1887
  declare function catalogKindOf(m: CatalogKindInput, kindOfEntry: ReadonlyMap<string, string>): string;
1870
1888
  /** sha256 (hex) of the catalog's canonical JSON, its own `catalog_fingerprint` left out. Isomorphic (pure JS). */
1871
1889
  declare function catalogFingerprint(catalog: LocalModelCatalog): string;
@@ -2087,5 +2105,5 @@ interface ModelCatalogVisibilityOptions {
2087
2105
  */
2088
2106
  declare function followModelCatalogVisibility(options: ModelCatalogVisibilityOptions): () => void;
2089
2107
 
2090
- export { CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, DEFAULT_CAPABILITIES, DEVICE_FILE_USABLE_STATES, DEVICE_OWN_FILE_USABLE_STATES, DEVICE_RULE_TWIN_FIXTURE, DEVICE_SERVED_SETTINGS_KEY, DEVICE_SERVED_VIA, DeviceModelUnavailableError, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, GgufError, INPUT_MODALITIES, INTERACTION_MODES, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, NEW_AGENT_DEFAULT_MODEL_KNOB, OUTPUT_MODALITIES, SERVICE_LABEL, SERVICE_LABEL_PLURAL, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, acceptsTextInstructions, announceModelCatalogChanged, availableOnDevices, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKeyColumn, catalogKindOf, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, followModelCatalogChanges, followModelCatalogVisibility, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isModelCatalogChange, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelCatalogRevision, modelClassKnobFor, modelClassName, modelClassPinOf, modelDisplayLabel, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, onModelCatalogChanged, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readDeviceModelFiles, readGgufHeader, readModelCatalog, readModelCatalogStamp, readModelIdentities, readPublicModel, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifactIds, requiredArtifacts, resetSuccessionLogForTests, resolveDeviceModel, resolveLiveModelId, resolveModelMapKnob, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, runtimesOnEngine, 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, toDeviceModelFile, validateModelSet, variantVerdict, withModelClass };
2091
- export type { AdminOffering, AdminPricingBand, ArtifactUse, AuditCapabilitiesRecord, AvailabilityVariant, CapabilitiesParseContext, CatalogKeyColumn, CatalogKindInput, CatalogModel, CatalogTier, CheapestAdequateOptions, CompatStatus, ContentType, CuratedCatalogClient, CuratedModel, CuratedPresentation, CuratedRows, CuratedVariant, DecidedBy, DeviceAvailability, DeviceGraphics, DeviceHardware, DeviceModelFile, DeviceModelResolution, DeviceServedSettings, DiscoveryAmbiguity, DiscoveryArtifact, DiscoveryMedia, DiscoveryResult, DiscoveryRuntime, DiscoverySource, DiscoveryVariant, FeatureBucket, FeatureBucketMeta, FeatureKey, FitCapabilities, GgufHeader, GgufRead, GgufTensor, GroupedFeatures, HardwareClass, HardwareClasses, HeaderFlag, HeaderJudgement, HeaderRefusal, Interaction, InteractionMode, LocalArtifact, LocalCatalogClient, LocalCatalogQuery, LocalCompatRow, LocalModel, LocalModelCatalog, LocalPresentation, LocalRuntime, LocalRuntimeBuild, LocalVariant, Modality, ModelCapabilities, ModelCatalog, ModelCatalogChangePayload, ModelCatalogClient, ModelCatalogConfig, ModelCatalogDirectiveSubscribe, ModelCatalogErrorSink, ModelCatalogPgError, ModelCatalogPgResult, ModelCatalogQuery, ModelCatalogState, ModelCatalogVariant, ModelCatalogVariantState, ModelCatalogVisibilityOptions, ModelClassConfig, ModelClassEntry, ModelClassIndex, ModelDiagnosticEntry, ModelDiagnosticsSink, ModelFavorites, ModelFavoritesCache, ModelFavoritesClient, ModelFavoritesConfig, ModelFavoritesErrorSink, ModelFavoritesState, ModelFetchScope, ModelFileHandle, ModelFit, ModelIdentityRow, ModelJson, ModelLabelSource, ModelNeed, ModelOfferingRow, ModelOption, ModelOptionWithLifecycle, ModelRecord, ModelRecordFetchType, ModelRecords, ModelRecordsClient, ModelRecordsConfig, ModelRecordsState, ModelSelectionPurpose, ModelSetEnv, ModelSetFacts, ModelSetValidation, NewAgentModel, NoSelection, OrderedLike, PreferredModelChoice, PreferredModelChoicePorts, PriceTier, PricedCatalogModel, PublicModelClient, RankOptions, RankedVariant, ReadModelCatalogOptions, SelectDevice, Selection, ShardName, SuccessionClient, SuccessionIndex, SuccessionNode, VariantDiscovery, VariantVerdict, Want };
2108
+ export { CHAT_DEFAULT_MODEL_KNOB, CONTENT_TYPES, DEFAULT_CAPABILITIES, DEVICE_FILE_USABLE_STATES, DEVICE_OWN_FILE_USABLE_STATES, DEVICE_RULE_TWIN_FIXTURE, DEVICE_SERVED_SETTINGS_KEY, DEVICE_SERVED_VIA, DeviceModelUnavailableError, EMPTY_MODEL_RECORDS, EXCLUDED_REVIEW_STATES, FEATURE_BUCKETS, FEATURE_BUCKET_ORDER, FEATURE_KEYS, FILE_TYPE_QUANT, GgufError, INPUT_MODALITIES, INTERACTION_MODES, LLM_INTERACTIONS, MAX_SUCCESSION_HOPS, MODEL_CATALOG_KINDS, MODEL_FAVORITE_ENTITY_TYPE, NEW_AGENT_DEFAULT_MODEL_KNOB, OUTPUT_MODALITIES, SERVICE_LABEL, SERVICE_LABEL_PLURAL, TOP_TIER_COST_RATING, TOP_TIER_LOCKED_TITLE, UNKNOWN_MODEL_KIND, acceptsTextInstructions, announceModelCatalogChanged, availableOnDevices, blendedPrice, buildModelClassIndex, buildSuccessionIndex, catalogFingerprint, catalogForApp, catalogKeyColumn, catalogKindOf, catalogKindVerdict, cheapestAdequateModel, classConfigKey, collapseTiersByClass, costRatingTier, costRatingWord, createModelCatalog, createModelFavorites, createModelRecords, curatedList, displayOrderOf, favoriteIdsEqual, fetchCuratedModels, findNonCanonicalCapabilityValues, fitsMemory, fitsNeed, fitsThisComputer, followModelCatalogChanges, followModelCatalogVisibility, formatMemoryBytes, fromDiscovery, ggufEngine, ggufFacts, groupFeatures, hardwareClassesOf, hasCompatibleDecisionInteraction, isChatModelCapability, isContentType, isConversationalModelCapability, isDecisionModelCapability, isFeatureKey, isHelperGguf, isInteractionMode, isListedVariant, isLocalModelCatalog, isManagedAgentModelCapability, isModelCatalogChange, isProjectorName, isSupersedable, isTopTierRating, judgeHeaderFacts, mergeAuditRecordIntoCapabilities, missingShards, modelCatalogRevision, modelClassKnobFor, modelClassName, modelClassPinOf, modelDisplayLabel, modelsForSelectionPurpose, normalizeArch, normalizeModel, normalizeModels, normalizeOs, normalizePromptSettings, onModelCatalogChanged, orderCatalogGroups, orderCatalogModels, outputFormatControlKey, parseCapabilities, pickProjector, priceTierRating, quantFromName, rankVariants, readCuratedRows, readDeviceModelFiles, readGgufHeader, readModelCatalog, readModelCatalogStamp, readModelIdentities, readPublicModel, reconcileModelFavoriteIds, reportModelDiagnostic, requireCanonicalCapabilities, requiredArtifactIds, requiredArtifacts, resetSuccessionLogForTests, resolveDeviceModel, resolveLiveModelId, resolveModelMapKnob, resolveNewAgentModelId, resolvePreferredModelChoice, resolveSuccessor, runtimesOnEngine, 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, toDeviceModelFile, validateModelSet, variantVerdict, withModelClass };
2109
+ export type { AdminOffering, AdminPricingBand, ArtifactUse, AuditCapabilitiesRecord, AvailabilityVariant, CapabilitiesParseContext, CatalogKeyColumn, CatalogKindInput, CatalogKindVerdict, CatalogModel, CatalogTier, CheapestAdequateOptions, CompatStatus, ContentType, CuratedCatalogClient, CuratedModel, CuratedPresentation, CuratedRows, CuratedVariant, DecidedBy, DeviceAvailability, DeviceGraphics, DeviceHardware, DeviceModelFile, DeviceModelResolution, DeviceServedSettings, DiscoveryAmbiguity, DiscoveryArtifact, DiscoveryMedia, DiscoveryResult, DiscoveryRuntime, DiscoverySource, DiscoveryVariant, FeatureBucket, FeatureBucketMeta, FeatureKey, FitCapabilities, GgufHeader, GgufRead, GgufTensor, GroupedFeatures, HardwareClass, HardwareClasses, HeaderFlag, HeaderJudgement, HeaderRefusal, Interaction, InteractionMode, LocalArtifact, LocalCatalogClient, LocalCatalogQuery, LocalCompatRow, LocalModel, LocalModelCatalog, LocalPresentation, LocalRuntime, LocalRuntimeBuild, LocalVariant, Modality, ModelCapabilities, ModelCatalog, ModelCatalogChangePayload, ModelCatalogClient, ModelCatalogConfig, ModelCatalogDirectiveSubscribe, ModelCatalogErrorSink, ModelCatalogPgError, ModelCatalogPgResult, ModelCatalogQuery, ModelCatalogState, ModelCatalogVariant, ModelCatalogVariantState, ModelCatalogVisibilityOptions, ModelClassConfig, ModelClassEntry, ModelClassIndex, ModelDiagnosticEntry, ModelDiagnosticsSink, ModelFavorites, ModelFavoritesCache, ModelFavoritesClient, ModelFavoritesConfig, ModelFavoritesErrorSink, ModelFavoritesState, ModelFetchScope, ModelFileHandle, ModelFit, ModelIdentityRow, ModelJson, ModelLabelSource, ModelNeed, ModelOfferingRow, ModelOption, ModelOptionWithLifecycle, ModelRecord, ModelRecordFetchType, ModelRecords, ModelRecordsClient, ModelRecordsConfig, ModelRecordsState, ModelSelectionPurpose, ModelSetEnv, ModelSetFacts, ModelSetValidation, NewAgentModel, NoSelection, OrderedLike, PreferredModelChoice, PreferredModelChoicePorts, PriceTier, PricedCatalogModel, PublicModelClient, RankOptions, RankedVariant, ReadModelCatalogOptions, SelectDevice, Selection, ShardName, SuccessionClient, SuccessionIndex, SuccessionNode, VariantDiscovery, VariantVerdict, Want };
@@ -2648,7 +2648,8 @@ function toDeviceModelFile(r) {
2648
2648
  sha256: sn2(r.sha256),
2649
2649
  artifact_id: sn2(r.artifact_id),
2650
2650
  state: s2(r.state),
2651
- organization_id: sn2(r.organization_id)
2651
+ organization_id: sn2(r.organization_id),
2652
+ model_key: sn2(r.metadata?.model_key)
2652
2653
  };
2653
2654
  }
2654
2655
  async function readDeviceModelFiles(client, opts = {}) {
@@ -2701,6 +2702,7 @@ var DeviceModelUnavailableError = class extends Error {
2701
2702
  };
2702
2703
 
2703
2704
  // models/catalog-reader.ts
2705
+ var UNKNOWN_MODEL_KIND = "unknown";
2704
2706
  var MODEL_CATALOG_KINDS = /* @__PURE__ */ new Set([
2705
2707
  "llm_model",
2706
2708
  "whisper_model",
@@ -2709,23 +2711,35 @@ var MODEL_CATALOG_KINDS = /* @__PURE__ */ new Set([
2709
2711
  "video_gen_model",
2710
2712
  "ner_model",
2711
2713
  "wake_word_model",
2712
- "lora"
2714
+ "lora",
2715
+ "embedding_model",
2716
+ UNKNOWN_MODEL_KIND
2713
2717
  ]);
2714
- function catalogKindOf(m, kindOfEntry) {
2718
+ var LLM_INTERACTIONS = /* @__PURE__ */ new Set(["turn", "single", "agent"]);
2719
+ function catalogKindVerdict(m, kindOfEntry) {
2715
2720
  for (const v of m.variants)
2716
2721
  for (const id of v.catalog_entry_ids ?? []) {
2717
2722
  const k = kindOfEntry.get(id);
2718
- if (k && MODEL_CATALOG_KINDS.has(k)) return k;
2723
+ if (k && k !== UNKNOWN_MODEL_KIND && MODEL_CATALOG_KINDS.has(k)) return { kind: k, reason: null };
2719
2724
  }
2720
2725
  const out = m.capabilities.output ?? [];
2721
2726
  const inp = m.capabilities.input ?? [];
2722
- if (m.presentation?.shelf === "loras") return "lora";
2723
- if (out.includes("video")) return "video_gen_model";
2724
- if (out.includes("image")) return "image_gen_model";
2725
- if (out.includes("audio")) return "tts_model_file";
2726
- if (inp.includes("audio")) return "whisper_model";
2727
- if (m.capabilities.interaction === "extraction") return "ner_model";
2728
- return "llm_model";
2727
+ const interaction = m.capabilities.interaction ?? "";
2728
+ const placed = (kind) => ({ kind, reason: null });
2729
+ if (m.presentation?.shelf === "loras" || interaction === "adapter") return placed("lora");
2730
+ if (out.includes("video")) return placed("video_gen_model");
2731
+ if (out.includes("image")) return placed("image_gen_model");
2732
+ if (out.includes("embedding")) return placed("embedding_model");
2733
+ if (out.includes("audio")) return placed("tts_model_file");
2734
+ if (inp.includes("audio") && (out.includes("decision") || interaction === "detection")) return placed("wake_word_model");
2735
+ if (inp.includes("audio") && out.includes("text")) return placed("whisper_model");
2736
+ if (interaction === "extraction") return placed("ner_model");
2737
+ if (inp.includes("text") && out.includes("text") && LLM_INTERACTIONS.has(interaction)) return placed("llm_model");
2738
+ const shape = `input [${inp.join(", ")}], output [${out.join(", ")}], interaction ${interaction || "(none)"}`;
2739
+ return { kind: UNKNOWN_MODEL_KIND, reason: `no kind rule places ${shape}` };
2740
+ }
2741
+ function catalogKindOf(m, kindOfEntry) {
2742
+ return catalogKindVerdict(m, kindOfEntry).kind;
2729
2743
  }
2730
2744
  function canonicalJson(value) {
2731
2745
  if (value === void 0) return "null";
@@ -2804,6 +2818,8 @@ async function readCatalogWith(client, opts, preread) {
2804
2818
  const p = presentationOf.get(c.id);
2805
2819
  stamp(p);
2806
2820
  const maker = providerById.get(s3(m.provider_id));
2821
+ const verdict = catalogKindVerdict(c, kindOfEntry);
2822
+ if (verdict.reason) warnings.push(`${s3(m.name)}: kind unknown: ${verdict.reason}`);
2807
2823
  return [
2808
2824
  {
2809
2825
  id: s3(m.id),
@@ -2814,7 +2830,7 @@ async function readCatalogWith(client, opts, preread) {
2814
2830
  maker_logo_file_id: sn3(maker?.logo_file_id),
2815
2831
  description: sn3(m.description),
2816
2832
  capabilities: m.capabilities ?? {},
2817
- kind: catalogKindOf(c, kindOfEntry),
2833
+ kind: verdict.kind,
2818
2834
  offered: c.offered,
2819
2835
  updated_at: c.updated_at,
2820
2836
  presentation: p ? {
@@ -3055,6 +3071,7 @@ export {
3055
3071
  GgufError,
3056
3072
  INPUT_MODALITIES,
3057
3073
  INTERACTION_MODES,
3074
+ LLM_INTERACTIONS,
3058
3075
  MAX_SUCCESSION_HOPS,
3059
3076
  MODEL_CATALOG_KINDS,
3060
3077
  MODEL_FAVORITE_ENTITY_TYPE,
@@ -3064,6 +3081,7 @@ export {
3064
3081
  SERVICE_LABEL_PLURAL,
3065
3082
  TOP_TIER_COST_RATING,
3066
3083
  TOP_TIER_LOCKED_TITLE,
3084
+ UNKNOWN_MODEL_KIND,
3067
3085
  acceptsTextInstructions,
3068
3086
  announceModelCatalogChanged,
3069
3087
  availableOnDevices,
@@ -3074,6 +3092,7 @@ export {
3074
3092
  catalogForApp,
3075
3093
  catalogKeyColumn,
3076
3094
  catalogKindOf,
3095
+ catalogKindVerdict,
3077
3096
  cheapestAdequateModel,
3078
3097
  classConfigKey,
3079
3098
  collapseTiersByClass,
@@ -804,7 +804,7 @@ interface LocalModel {
804
804
  /** Matrx 2's 1.48 id for a model seeded from its old list (metadata.desktop_id). */
805
805
  desktop_id?: string | null;
806
806
  maker_logo_file_id?: string | null;
807
- /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora. */
807
+ /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora, embedding_model, or unknown (no rule places it; `catalogKindVerdict` says why). */
808
808
  kind?: string;
809
809
  /** At least one variant is offered (Matrx 2 lists it). */
810
810
  offered?: boolean;
@@ -804,7 +804,7 @@ interface LocalModel {
804
804
  /** Matrx 2's 1.48 id for a model seeded from its old list (metadata.desktop_id). */
805
805
  desktop_id?: string | null;
806
806
  maker_logo_file_id?: string | null;
807
- /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora. */
807
+ /** The admin Catalogs kind (`catalogKindOf`): llm_model, whisper_model, tts_model_file, image_gen_model, video_gen_model, ner_model, wake_word_model, lora, embedding_model, or unknown (no rule places it; `catalogKindVerdict` says why). */
808
808
  kind?: string;
809
809
  /** At least one variant is offered (Matrx 2 lists it). */
810
810
  offered?: boolean;
@@ -25,6 +25,7 @@ __export(settings_exports, {
25
25
  CATALOGUE_KEYS: () => CATALOGUE_KEYS,
26
26
  EMPTY_UI_GATES: () => EMPTY_UI_GATES,
27
27
  ENUM_OFF_VALUE: () => ENUM_OFF_VALUE,
28
+ NEVER_IMPLICIT_AUTO_KEYS: () => NEVER_IMPLICIT_AUTO_KEYS,
28
29
  PARAM_ALIASES: () => PARAM_ALIASES,
29
30
  SETTINGS_CATALOGUE: () => SETTINGS_CATALOGUE,
30
31
  UI_GATE_EDITABLE_KEYS: () => UI_GATE_EDITABLE_KEYS,
@@ -39,6 +40,7 @@ __export(settings_exports, {
39
40
  extractModelDefaults: () => extractModelDefaults,
40
41
  gateEnabled: () => gateEnabled,
41
42
  getActionForMode: () => getActionForMode,
43
+ isNeverImplicitChoice: () => isNeverImplicitChoice,
42
44
  isOffValue: () => isOffValue,
43
45
  isUiGateKey: () => isUiGateKey,
44
46
  isUnsetChoice: () => isUnsetChoice,
@@ -1032,13 +1034,19 @@ function withSettingState(settings, key, state, control, value) {
1032
1034
  // settings/auto-means-unset.ts
1033
1035
  var AUTO_VALUE = "auto";
1034
1036
  var AUTO_MEANS_UNSET_KEYS = /* @__PURE__ */ new Set([
1035
- "reasoning_effort",
1036
1037
  "visualization"
1037
1038
  ]);
1039
+ var NEVER_IMPLICIT_AUTO_KEYS = /* @__PURE__ */ new Set([
1040
+ "reasoning_effort"
1041
+ ]);
1038
1042
  function isUnsetChoice(key, value) {
1039
1043
  if (value === void 0 || value === null) return true;
1040
1044
  return value === AUTO_VALUE && AUTO_MEANS_UNSET_KEYS.has(key);
1041
1045
  }
1046
+ function isNeverImplicitChoice(key, value) {
1047
+ if (isUnsetChoice(key, value)) return true;
1048
+ return value === AUTO_VALUE && NEVER_IMPLICIT_AUTO_KEYS.has(key);
1049
+ }
1042
1050
 
1043
1051
  // settings/starting-value.ts
1044
1052
  function startingValueFor(key, control) {
@@ -1056,8 +1064,8 @@ function startingValueFor(key, control) {
1056
1064
  value = [];
1057
1065
  }
1058
1066
  }
1059
- if (isUnsetChoice(key, value) && control.type === "enum" && control.enum?.length) {
1060
- value = control.enum.find((choice) => !isUnsetChoice(key, choice));
1067
+ if (isNeverImplicitChoice(key, value) && control.type === "enum" && control.enum?.length) {
1068
+ value = control.enum.find((choice) => !isNeverImplicitChoice(key, choice));
1061
1069
  }
1062
1070
  if (key === "response_format" && typeof value === "string") {
1063
1071
  value = value === "" ? void 0 : { type: value };
@@ -516,14 +516,16 @@ declare function withSettingState<T extends Record<string, unknown>>(settings: T
516
516
  * included at all").
517
517
  *
518
518
  * For these keys the house "auto" posture IS the unset state on the server:
519
- * - reasoning_effort — aidream `matrx_ai/catalog/canonicalize.py` normalizes
520
- * "auto" to None before any rule or processor sees it (ai_041).
521
519
  * - visualization — the Google research agent reads an unset value as "auto"
522
520
  * (`providers/google/google_research_agent.py`).
523
521
  * So a control that offers "auto" for one of them must CLEAR the key, never
524
- * save the word: a saved "auto" and an absent key would be two stored states
525
- * with one meaning. Keys whose "auto" is a real provider value that goes on the
526
- * wire (render_quality, background, moderation, reasoning_summary) are NOT here.
522
+ * save the word.
523
+ *
524
+ * `reasoning_effort` is NOT here (owner ruling 2026-10-24): unset runs at the
525
+ * platform default ("low"), and "auto" is a PERSON's explicit choice that the
526
+ * server sends as the provider's own auto where it has one
527
+ * (`matrx_ai/catalog/controls.py::apply_reasoning_default`). So a person picking
528
+ * "auto" SAVES "auto"; it is never a starting value (`NEVER_IMPLICIT_AUTO_KEYS`).
527
529
  *
528
530
  * Every settings writer reads this one rule: the agent builder
529
531
  * (AgentSettingsCore), the conversation settings target (useConversationSettingsTarget), the
@@ -531,8 +533,12 @@ declare function withSettingState<T extends Record<string, unknown>>(settings: T
531
533
  */
532
534
  declare const AUTO_VALUE = "auto";
533
535
  declare const AUTO_MEANS_UNSET_KEYS: ReadonlySet<string>;
536
+ /** Keys whose "auto" is a real choice that only a person makes — never a default. */
537
+ declare const NEVER_IMPLICIT_AUTO_KEYS: ReadonlySet<string>;
534
538
  /** True when writing `value` to `key` means "not set" — the key is removed. */
535
539
  declare function isUnsetChoice(key: string, value: unknown): boolean;
540
+ /** True when `value` may not be chosen FOR a person (a starting value / default). */
541
+ declare function isNeverImplicitChoice(key: string, value: unknown): boolean;
536
542
 
537
543
  /**
538
544
  * THE starting value of a setting a person turns on (ticks its box). One rule
@@ -746,5 +752,5 @@ interface CapabilitiesWriteTarget {
746
752
  error?: string | null;
747
753
  }
748
754
 
749
- export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, CATALOGUE_KEYS, EMPTY_UI_GATES, ENUM_OFF_VALUE, PARAM_ALIASES, SETTINGS_CATALOGUE, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, 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, settingControl, settingLabel, settingStateOf, startingValueFor, withSettingState };
755
+ export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, CATALOGUE_KEYS, EMPTY_UI_GATES, ENUM_OFF_VALUE, NEVER_IMPLICIT_AUTO_KEYS, PARAM_ALIASES, SETTINGS_CATALOGUE, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extraSettingKeys, extractModelDefaults, gateEnabled, getActionForMode, isNeverImplicitChoice, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingControl, settingLabel, settingStateOf, startingValueFor, withSettingState };
750
756
  export type { AgentContext, AgentSettings, AgentSettingsEntry, AgentSettingsState, AgentSource, AgentVariable, CapabilitiesWriteTarget, CatalogueEntry, CatalogueGroup, ConflictAction, ConflictItem, ConflictReason, ConflictSummary, ControlDefinition, ControlType, ExtraSettingKeys, InitializeSettingsInput, LLMParams, ModelRowTarget, ModelSettingRow, NormalizedControls, PendingModelSwitch, RenderGroup, ResolutionMode, SettingRowFacts, SettingRowRead, SettingRowView, SettingState, SettingsGroupId, SettingsModelInfo, SettingsStore, SettingsStoreConfig, SettingsWriteTarget, UiGateEditableKey, UiGateKey, UiGates, VariableCustomComponentRef };
@@ -516,14 +516,16 @@ declare function withSettingState<T extends Record<string, unknown>>(settings: T
516
516
  * included at all").
517
517
  *
518
518
  * For these keys the house "auto" posture IS the unset state on the server:
519
- * - reasoning_effort — aidream `matrx_ai/catalog/canonicalize.py` normalizes
520
- * "auto" to None before any rule or processor sees it (ai_041).
521
519
  * - visualization — the Google research agent reads an unset value as "auto"
522
520
  * (`providers/google/google_research_agent.py`).
523
521
  * So a control that offers "auto" for one of them must CLEAR the key, never
524
- * save the word: a saved "auto" and an absent key would be two stored states
525
- * with one meaning. Keys whose "auto" is a real provider value that goes on the
526
- * wire (render_quality, background, moderation, reasoning_summary) are NOT here.
522
+ * save the word.
523
+ *
524
+ * `reasoning_effort` is NOT here (owner ruling 2026-10-24): unset runs at the
525
+ * platform default ("low"), and "auto" is a PERSON's explicit choice that the
526
+ * server sends as the provider's own auto where it has one
527
+ * (`matrx_ai/catalog/controls.py::apply_reasoning_default`). So a person picking
528
+ * "auto" SAVES "auto"; it is never a starting value (`NEVER_IMPLICIT_AUTO_KEYS`).
527
529
  *
528
530
  * Every settings writer reads this one rule: the agent builder
529
531
  * (AgentSettingsCore), the conversation settings target (useConversationSettingsTarget), the
@@ -531,8 +533,12 @@ declare function withSettingState<T extends Record<string, unknown>>(settings: T
531
533
  */
532
534
  declare const AUTO_VALUE = "auto";
533
535
  declare const AUTO_MEANS_UNSET_KEYS: ReadonlySet<string>;
536
+ /** Keys whose "auto" is a real choice that only a person makes — never a default. */
537
+ declare const NEVER_IMPLICIT_AUTO_KEYS: ReadonlySet<string>;
534
538
  /** True when writing `value` to `key` means "not set" — the key is removed. */
535
539
  declare function isUnsetChoice(key: string, value: unknown): boolean;
540
+ /** True when `value` may not be chosen FOR a person (a starting value / default). */
541
+ declare function isNeverImplicitChoice(key: string, value: unknown): boolean;
536
542
 
537
543
  /**
538
544
  * THE starting value of a setting a person turns on (ticks its box). One rule
@@ -746,5 +752,5 @@ interface CapabilitiesWriteTarget {
746
752
  error?: string | null;
747
753
  }
748
754
 
749
- export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, CATALOGUE_KEYS, EMPTY_UI_GATES, ENUM_OFF_VALUE, PARAM_ALIASES, SETTINGS_CATALOGUE, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, 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, settingControl, settingLabel, settingStateOf, startingValueFor, withSettingState };
755
+ export { AUTO_MEANS_UNSET_KEYS, AUTO_VALUE, CATALOGUE_KEYS, EMPTY_UI_GATES, ENUM_OFF_VALUE, NEVER_IMPLICIT_AUTO_KEYS, PARAM_ALIASES, SETTINGS_CATALOGUE, UI_GATE_EDITABLE_KEYS, UI_GATE_KEYS, buildApiPayload, buildSettingsRows, computeOverrideDiff, createSettingsStore, detectConflicts, effectiveOfferingPinOf, extraSettingKeys, extractModelDefaults, gateEnabled, getActionForMode, isNeverImplicitChoice, isOffValue, isUiGateKey, isUnsetChoice, mergeEffectiveSettings, mergeVariableValues, offValueFor, parseModelControls, parseUiGates, readApiPayload, readConflictActions, readConflictSummary, readEffectiveModelId, readEffectiveSettings, readEffectiveVariableValues, readPreviewedResolution, readSettingsEntry, resolveConflicts, sanitizeSettings, settingControl, settingLabel, settingStateOf, startingValueFor, withSettingState };
750
756
  export type { AgentContext, AgentSettings, AgentSettingsEntry, AgentSettingsState, AgentSource, AgentVariable, CapabilitiesWriteTarget, CatalogueEntry, CatalogueGroup, ConflictAction, ConflictItem, ConflictReason, ConflictSummary, ControlDefinition, ControlType, ExtraSettingKeys, InitializeSettingsInput, LLMParams, ModelRowTarget, ModelSettingRow, NormalizedControls, PendingModelSwitch, RenderGroup, ResolutionMode, SettingRowFacts, SettingRowRead, SettingRowView, SettingState, SettingsGroupId, SettingsModelInfo, SettingsStore, SettingsStoreConfig, SettingsWriteTarget, UiGateEditableKey, UiGateKey, UiGates, VariableCustomComponentRef };
@@ -965,13 +965,19 @@ function withSettingState(settings, key, state, control, value) {
965
965
  // settings/auto-means-unset.ts
966
966
  var AUTO_VALUE = "auto";
967
967
  var AUTO_MEANS_UNSET_KEYS = /* @__PURE__ */ new Set([
968
- "reasoning_effort",
969
968
  "visualization"
970
969
  ]);
970
+ var NEVER_IMPLICIT_AUTO_KEYS = /* @__PURE__ */ new Set([
971
+ "reasoning_effort"
972
+ ]);
971
973
  function isUnsetChoice(key, value) {
972
974
  if (value === void 0 || value === null) return true;
973
975
  return value === AUTO_VALUE && AUTO_MEANS_UNSET_KEYS.has(key);
974
976
  }
977
+ function isNeverImplicitChoice(key, value) {
978
+ if (isUnsetChoice(key, value)) return true;
979
+ return value === AUTO_VALUE && NEVER_IMPLICIT_AUTO_KEYS.has(key);
980
+ }
975
981
 
976
982
  // settings/starting-value.ts
977
983
  function startingValueFor(key, control) {
@@ -989,8 +995,8 @@ function startingValueFor(key, control) {
989
995
  value = [];
990
996
  }
991
997
  }
992
- if (isUnsetChoice(key, value) && control.type === "enum" && control.enum?.length) {
993
- value = control.enum.find((choice) => !isUnsetChoice(key, choice));
998
+ if (isNeverImplicitChoice(key, value) && control.type === "enum" && control.enum?.length) {
999
+ value = control.enum.find((choice) => !isNeverImplicitChoice(key, choice));
994
1000
  }
995
1001
  if (key === "response_format" && typeof value === "string") {
996
1002
  value = value === "" ? void 0 : { type: value };
@@ -1003,6 +1009,7 @@ export {
1003
1009
  CATALOGUE_KEYS,
1004
1010
  EMPTY_UI_GATES,
1005
1011
  ENUM_OFF_VALUE,
1012
+ NEVER_IMPLICIT_AUTO_KEYS,
1006
1013
  PARAM_ALIASES,
1007
1014
  SETTINGS_CATALOGUE,
1008
1015
  UI_GATE_EDITABLE_KEYS,
@@ -1017,6 +1024,7 @@ export {
1017
1024
  extractModelDefaults,
1018
1025
  gateEnabled,
1019
1026
  getActionForMode,
1027
+ isNeverImplicitChoice,
1020
1028
  isOffValue,
1021
1029
  isUiGateKey,
1022
1030
  isUnsetChoice,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/agents",
3
- "version": "0.59.271",
3
+ "version": "0.59.273",
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",
@@ -25,6 +25,7 @@
25
25
  "files": [
26
26
  "dist",
27
27
  "scripts/check-model-catalog-reads.mjs",
28
+ "context/rules-corpus.json",
28
29
  "README.md",
29
30
  "LICENSE",
30
31
  "CHANGELOG.md"
@@ -171,6 +172,7 @@
171
172
  "default": "./dist/context/react/index.cjs"
172
173
  }
173
174
  },
175
+ "./context/rules-corpus.json": "./context/rules-corpus.json",
174
176
  "./react": {
175
177
  "import": {
176
178
  "types": "./dist/react/index.d.ts",
@@ -518,5 +520,5 @@
518
520
  "optional": true
519
521
  }
520
522
  },
521
- "gitHead": "2c48e6413332bdf7ea9f92366e3ad0e4129ddd52"
523
+ "gitHead": "757401d3d21eefd180f94f290b796b53904b8c15"
522
524
  }