@hviana/sema 0.4.0 → 0.4.2

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.
Files changed (154) hide show
  1. package/CONTRIBUTING.md +92 -10
  2. package/LICENSE.md +2 -2
  3. package/package.json +1 -1
  4. package/src/ingest-cache.ts +4 -0
  5. package/src/meter.ts +5 -0
  6. package/src/mind/attention.ts +18 -1
  7. package/src/mind/bridge.ts +292 -54
  8. package/src/mind/junction.ts +21 -7
  9. package/src/mind/match.ts +92 -1
  10. package/src/mind/mechanisms/cast.ts +12 -0
  11. package/src/mind/mechanisms/confluence.ts +30 -1
  12. package/src/mind/mechanisms/cover.ts +36 -4
  13. package/src/mind/mechanisms/recall.ts +21 -44
  14. package/src/mind/mind.ts +39 -2
  15. package/src/mind/pipeline-mechanism.ts +86 -4
  16. package/src/mind/pipeline.ts +1 -1
  17. package/src/mind/reasoning.ts +15 -8
  18. package/src/mind/recognition.ts +40 -0
  19. package/src/mind/resonance.ts +0 -0
  20. package/src/mind/traverse.ts +17 -15
  21. package/src/mind/types.ts +10 -0
  22. package/test/49-natural-units-synonym-bridge.test.mjs +56 -15
  23. package/dist/example/demo.d.ts +0 -1
  24. package/dist/example/demo.js +0 -39
  25. package/dist/example/train_base.d.ts +0 -87
  26. package/dist/example/train_base.js +0 -2252
  27. package/dist/src/alphabet.d.ts +0 -7
  28. package/dist/src/alphabet.js +0 -33
  29. package/dist/src/alu/src/alu.d.ts +0 -185
  30. package/dist/src/alu/src/alu.js +0 -440
  31. package/dist/src/alu/src/expr.d.ts +0 -61
  32. package/dist/src/alu/src/expr.js +0 -318
  33. package/dist/src/alu/src/index.d.ts +0 -11
  34. package/dist/src/alu/src/index.js +0 -19
  35. package/dist/src/alu/src/kernel-arith.d.ts +0 -16
  36. package/dist/src/alu/src/kernel-arith.js +0 -264
  37. package/dist/src/alu/src/kernel-bits.d.ts +0 -19
  38. package/dist/src/alu/src/kernel-bits.js +0 -152
  39. package/dist/src/alu/src/kernel-logic.d.ts +0 -4
  40. package/dist/src/alu/src/kernel-logic.js +0 -60
  41. package/dist/src/alu/src/kernel-nd.d.ts +0 -3
  42. package/dist/src/alu/src/kernel-nd.js +0 -208
  43. package/dist/src/alu/src/kernel-numeric.d.ts +0 -54
  44. package/dist/src/alu/src/kernel-numeric.js +0 -366
  45. package/dist/src/alu/src/operation.d.ts +0 -168
  46. package/dist/src/alu/src/operation.js +0 -189
  47. package/dist/src/alu/src/parser.d.ts +0 -221
  48. package/dist/src/alu/src/parser.js +0 -577
  49. package/dist/src/alu/src/resonance.d.ts +0 -55
  50. package/dist/src/alu/src/resonance.js +0 -126
  51. package/dist/src/alu/src/text.d.ts +0 -31
  52. package/dist/src/alu/src/text.js +0 -73
  53. package/dist/src/alu/src/value.d.ts +0 -109
  54. package/dist/src/alu/src/value.js +0 -300
  55. package/dist/src/alu/test/alu.test.d.ts +0 -1
  56. package/dist/src/alu/test/alu.test.js +0 -764
  57. package/dist/src/bytes.d.ts +0 -14
  58. package/dist/src/bytes.js +0 -59
  59. package/dist/src/canon.d.ts +0 -26
  60. package/dist/src/canon.js +0 -57
  61. package/dist/src/config.d.ts +0 -111
  62. package/dist/src/config.js +0 -91
  63. package/dist/src/derive/src/deduction.d.ts +0 -136
  64. package/dist/src/derive/src/deduction.js +0 -159
  65. package/dist/src/derive/src/index.d.ts +0 -8
  66. package/dist/src/derive/src/index.js +0 -11
  67. package/dist/src/derive/src/priority-queue.d.ts +0 -20
  68. package/dist/src/derive/src/priority-queue.js +0 -73
  69. package/dist/src/derive/src/rewrite.d.ts +0 -56
  70. package/dist/src/derive/src/rewrite.js +0 -100
  71. package/dist/src/derive/src/trie.d.ts +0 -90
  72. package/dist/src/derive/src/trie.js +0 -217
  73. package/dist/src/derive/test/derive.test.d.ts +0 -1
  74. package/dist/src/derive/test/derive.test.js +0 -122
  75. package/dist/src/extension.d.ts +0 -37
  76. package/dist/src/extension.js +0 -7
  77. package/dist/src/geometry.d.ts +0 -175
  78. package/dist/src/geometry.js +0 -823
  79. package/dist/src/index.d.ts +0 -17
  80. package/dist/src/index.js +0 -19
  81. package/dist/src/ingest-cache.d.ts +0 -41
  82. package/dist/src/ingest-cache.js +0 -161
  83. package/dist/src/meter.d.ts +0 -171
  84. package/dist/src/meter.js +0 -269
  85. package/dist/src/mind/articulation.d.ts +0 -6
  86. package/dist/src/mind/articulation.js +0 -99
  87. package/dist/src/mind/attention.d.ts +0 -414
  88. package/dist/src/mind/attention.js +0 -2065
  89. package/dist/src/mind/bridge.d.ts +0 -39
  90. package/dist/src/mind/bridge.js +0 -738
  91. package/dist/src/mind/canonical.d.ts +0 -34
  92. package/dist/src/mind/canonical.js +0 -93
  93. package/dist/src/mind/graph-search.d.ts +0 -294
  94. package/dist/src/mind/graph-search.js +0 -996
  95. package/dist/src/mind/index.d.ts +0 -9
  96. package/dist/src/mind/index.js +0 -5
  97. package/dist/src/mind/junction.d.ts +0 -134
  98. package/dist/src/mind/junction.js +0 -331
  99. package/dist/src/mind/learning.d.ts +0 -75
  100. package/dist/src/mind/learning.js +0 -270
  101. package/dist/src/mind/match.d.ts +0 -166
  102. package/dist/src/mind/match.js +0 -565
  103. package/dist/src/mind/mechanisms/alu.d.ts +0 -4
  104. package/dist/src/mind/mechanisms/alu.js +0 -36
  105. package/dist/src/mind/mechanisms/cast.d.ts +0 -89
  106. package/dist/src/mind/mechanisms/cast.js +0 -773
  107. package/dist/src/mind/mechanisms/confluence.d.ts +0 -24
  108. package/dist/src/mind/mechanisms/confluence.js +0 -225
  109. package/dist/src/mind/mechanisms/cover.d.ts +0 -6
  110. package/dist/src/mind/mechanisms/cover.js +0 -203
  111. package/dist/src/mind/mechanisms/extraction.d.ts +0 -33
  112. package/dist/src/mind/mechanisms/extraction.js +0 -300
  113. package/dist/src/mind/mechanisms/recall.d.ts +0 -16
  114. package/dist/src/mind/mechanisms/recall.js +0 -388
  115. package/dist/src/mind/mind.d.ts +0 -330
  116. package/dist/src/mind/mind.js +0 -594
  117. package/dist/src/mind/pipeline-mechanism.d.ts +0 -172
  118. package/dist/src/mind/pipeline-mechanism.js +0 -382
  119. package/dist/src/mind/pipeline.d.ts +0 -49
  120. package/dist/src/mind/pipeline.js +0 -275
  121. package/dist/src/mind/primitives.d.ts +0 -66
  122. package/dist/src/mind/primitives.js +0 -306
  123. package/dist/src/mind/rationale.d.ts +0 -139
  124. package/dist/src/mind/rationale.js +0 -163
  125. package/dist/src/mind/reasoning.d.ts +0 -40
  126. package/dist/src/mind/reasoning.js +0 -272
  127. package/dist/src/mind/recognition.d.ts +0 -20
  128. package/dist/src/mind/recognition.js +0 -463
  129. package/dist/src/mind/resonance.d.ts +0 -23
  130. package/dist/src/mind/resonance.js +0 -0
  131. package/dist/src/mind/trace.d.ts +0 -15
  132. package/dist/src/mind/trace.js +0 -73
  133. package/dist/src/mind/traverse.d.ts +0 -124
  134. package/dist/src/mind/traverse.js +0 -649
  135. package/dist/src/mind/types.d.ts +0 -323
  136. package/dist/src/mind/types.js +0 -130
  137. package/dist/src/rabitq-ivf/src/database.d.ts +0 -113
  138. package/dist/src/rabitq-ivf/src/database.js +0 -201
  139. package/dist/src/rabitq-ivf/src/index.d.ts +0 -7
  140. package/dist/src/rabitq-ivf/src/index.js +0 -4
  141. package/dist/src/rabitq-ivf/src/ivf.d.ts +0 -200
  142. package/dist/src/rabitq-ivf/src/ivf.js +0 -1165
  143. package/dist/src/rabitq-ivf/src/prng.d.ts +0 -19
  144. package/dist/src/rabitq-ivf/src/prng.js +0 -36
  145. package/dist/src/rabitq-ivf/src/rabitq.d.ts +0 -95
  146. package/dist/src/rabitq-ivf/src/rabitq.js +0 -283
  147. package/dist/src/sema.d.ts +0 -31
  148. package/dist/src/sema.js +0 -63
  149. package/dist/src/store-sqlite.d.ts +0 -184
  150. package/dist/src/store-sqlite.js +0 -942
  151. package/dist/src/store.d.ts +0 -678
  152. package/dist/src/store.js +0 -1703
  153. package/dist/src/vec.d.ts +0 -31
  154. package/dist/src/vec.js +0 -109
@@ -1,270 +0,0 @@
1
- // learning.ts — ingest and deposition (Section 7 of the mind).
2
- //
3
- // Learning is DEPOSITION: perceive a stream into a tree and intern every
4
- // node. A fact is an EDGE between node ids; recall traverses edges.
5
- import { bindSeat, companySignature, isChunk } from "../sema.js";
6
- import { changedNodes } from "./types.js";
7
- import { inputBytes, latin1Key, perceiveDeposit, resolve, } from "./primitives.js";
8
- import { canonicalWindows, leafIdPrefix } from "./canonical.js";
9
- import { fold as foldVecs } from "../sema.js";
10
- /** Intern a perceived tree into node ids, bottom-up, sharing equal subtrees.
11
- * Returns the root node id and a map from tree nodes to their ids.
12
- *
13
- * Memoized by NODE IDENTITY (ctx._internIds): the pyramid fold shares a
14
- * prefix's subtree OBJECTS across an accumulated context's deposits, and a
15
- * node already interned needs nothing again — its id is permanent
16
- * (content-addressed) and its intern-time side effects (gist capture, kid
17
- * rows) fired at first mint; re-interning was pure lookups. A memo hit
18
- * therefore skips the WHOLE shared subtree, making the intern walk
19
- * O(new nodes) per deposit instead of O(context). Only the hit node
20
- * itself enters `ids`; descendants stay reachable via the memo (see
21
- * idOf in indexSubSpans and the changedNodes prune). */
22
- export async function internTreeIds(ctx, node, ids) {
23
- const known = ctx._internIds.get(node);
24
- if (known !== undefined) {
25
- ids.set(node, known);
26
- return known;
27
- }
28
- let id;
29
- if (node.kids === null) {
30
- id = await ctx.store.putLeaf(node.leaf ?? new Uint8Array(0), node.v);
31
- }
32
- else {
33
- const kds = [];
34
- for (const k of node.kids)
35
- kds.push(await internTreeIds(ctx, k, ids));
36
- id = await ctx.store.putBranch(kds, node.v);
37
- }
38
- ids.set(node, id);
39
- ctx._internIds.set(node, id);
40
- return id;
41
- }
42
- /** Index flat branches for sub-spans of a deposit's byte stream, linked to
43
- * their structural chunks via durable CONTAINMENT edges. */
44
- export async function indexSubSpans(ctx, tree, ids) {
45
- const chunkOf = [];
46
- const streamIds = [];
47
- const streamVecs = [];
48
- const collect = (n) => {
49
- if (isChunk(n)) {
50
- // A chunk inside a memo-skipped shared subtree is absent from `ids`;
51
- // the intern memo still knows it (same object). A miss on both (the
52
- // WeakMap entry was collected) only forfeits the seenBefore skip.
53
- const chunkId = ids.get(n) ?? ctx._internIds.get(n);
54
- for (const k of n.kids) {
55
- const lid = k.leaf ? ctx.store.findLeaf(k.leaf) : null;
56
- if (lid === null)
57
- return false;
58
- streamIds.push(lid);
59
- streamVecs.push(k.v);
60
- chunkOf.push(chunkId);
61
- }
62
- return true;
63
- }
64
- if (n.kids) {
65
- for (const k of n.kids)
66
- if (!collect(k))
67
- return false;
68
- }
69
- return true;
70
- };
71
- if (!collect(tree))
72
- return false;
73
- const W = ctx.space.maxGroup; // write side of the canonical contract
74
- const prev = ctx._prevSeen;
75
- const seenBefore = (off, len) => {
76
- if (!prev)
77
- return false;
78
- for (let i = off; i < off + len; i++) {
79
- const c = chunkOf[i];
80
- if (c === undefined || !prev.has(c))
81
- return false;
82
- }
83
- return true;
84
- };
85
- const lens = streamIds.length >= W ? canonicalWindows(W) : [streamIds.length];
86
- for (const len of lens) {
87
- if (len < 1)
88
- continue;
89
- for (let off = 0; off + len <= streamIds.length; off++) {
90
- if (seenBefore(off, len))
91
- continue;
92
- const winIds = streamIds.slice(off, off + len);
93
- const flatId = ctx.store.findBranch(winIds) ??
94
- await ctx.store.putBranch(winIds, foldVecs(ctx.space, streamVecs.slice(off, off + len)));
95
- for (let i = off; i < off + len; i++) {
96
- const c = chunkOf[i];
97
- if (c !== undefined)
98
- ctx.store.addContainer(flatId, c);
99
- }
100
- }
101
- }
102
- return true;
103
- }
104
- /** Perceive, intern, and index a single input. Returns the perceived tree,
105
- * root id, id map, and the changed (new) subtrees for halo reinforcement. */
106
- export async function deposit(ctx, input, track, conversational = false) {
107
- const bytes = inputBytes(ctx, input);
108
- // Deposit-shaped perception: stable-prefix tree SEEDING (see
109
- // perceiveDeposit) — an accumulated context re-folds only its new suffix,
110
- // O(turn) instead of O(context) per conversation turn. Cache-only here
111
- // (no store-probe fallback): a knownPrefixLength scan on every novel fact
112
- // would cost O(n²) hashing, while conversation replays are always warm —
113
- // re-deposition replays from the first turn, rebuilding the cache as it
114
- // goes. `conversational` scopes the STABLE-PREFIX variant (turn-boundary
115
- // folding, matching query-time perception) to ingestPair's own growing
116
- // context argument — a bare ingestOne deposit whose bytes merely happen
117
- // to extend an earlier UNRELATED deposit (no conversational relationship)
118
- // must keep the plain fold, or two coincidentally-prefix-sharing facts
119
- // would stop sharing structure with each other.
120
- const tree = perceiveDeposit(ctx, bytes, conversational);
121
- const ids = new Map();
122
- const rootId = await internTreeIds(ctx, tree, ids);
123
- const indexed = await indexSubSpans(ctx, tree, ids);
124
- const leafIds = leafIdPrefix(ctx, bytes);
125
- if (leafIds.length === bytes.length && leafIds.length >= 2) {
126
- await ctx.store.putBranch(leafIds, tree.v);
127
- }
128
- const changed = (track && ctx._prevSeen)
129
- ? changedNodes(tree, ids, ctx._prevSeen)
130
- : [tree];
131
- if (track)
132
- ctx._prevSeen = indexed ? new Set(ids.values()) : null;
133
- return { tree, rootId, ids, changed };
134
- }
135
- /** Ingest a single input (a bare experience, no continuation). */
136
- export async function ingestOne(ctx, input) {
137
- const { tree, rootId, ids } = await deposit(ctx, input, true);
138
- ctx.store.indexTarget(rootId);
139
- const parts = tree.kids
140
- ? tree.kids.map((k) => ids.get(k))
141
- : [rootId];
142
- const stride = ctx.space.maxGroup;
143
- if (parts.length > stride) {
144
- for (let i = 0; i + stride < parts.length; i += stride) {
145
- await ctx.store.link(parts[i], parts[i + stride]);
146
- }
147
- if ((parts.length - 1) % stride !== 0) {
148
- const lastStart = Math.floor((parts.length - 1) / stride) * stride;
149
- if (lastStart < parts.length - 1) {
150
- await ctx.store.link(parts[lastStart], parts[parts.length - 1]);
151
- }
152
- }
153
- }
154
- else {
155
- for (const id of parts)
156
- ctx.store.indexTarget(id);
157
- }
158
- return Object.assign(tree, { id: rootId });
159
- }
160
- /** For each right-edge suffix of the context bytes, resolve it against the
161
- * store. A suffix whose resolved node is already a known form inherits the
162
- * continuation edge. Gate: ≥ 2 structural parents (reused across deposits),
163
- * or (halo > 0 ∧ already an edge source). Pure answers do not qualify. */
164
- async function propagateSuffixes(ctx, src, dst) {
165
- const W = ctx.space.maxGroup;
166
- const bytes = ctx.store.bytes(src);
167
- const n = bytes.length;
168
- if (n < 2 * W)
169
- return;
170
- // Existence prefilter — the write side of the canonical contract: every
171
- // deposit interns its WHOLE byte stream as a flat branch of per-byte leaf
172
- // ids (deposit(), canonical.ts). A suffix is a stored form exactly when
173
- // that flat twin exists, so one content-hash probe per offset decides;
174
- // only a hit pays for resolve()'s deposit-shaped perception. This keeps
175
- // the scan free of river folds — O(1) probes over cheap byte hashes
176
- // instead of O(suffix) vector folds per offset.
177
- const leafIds = leafIdPrefix(ctx, bytes);
178
- for (let i = 1; i <= n - W; i++) {
179
- if (ctx.store.findBranch(leafIds.slice(i)) === null)
180
- continue;
181
- const id = resolve(ctx, bytes.subarray(i));
182
- if (id === null || id === src)
183
- continue;
184
- const known = ctx.store.parentsFirst(id, 2).length >= 2 ||
185
- (ctx.store.haloMass(id) > 0 && ctx.store.hasNext(id));
186
- if (!known)
187
- continue;
188
- await ctx.store.link(id, dst);
189
- }
190
- }
191
- /** Ingest a pair (context, continuation) — learn an edge and pour halos.
192
- * Returns the deposited root ids (context, continuation) — a pure
193
- * read-out; callers that ignore it behave exactly as before. */
194
- export async function ingestPair(ctx, ctxInput, cont) {
195
- const c = await deposit(ctx, ctxInput, true, true);
196
- const cont_ = await deposit(ctx, cont, false);
197
- const ctxId = c.rootId, contId = cont_.rootId;
198
- // Stamp this turn's continuation onto its own cache entry — the proof a
199
- // FUTURE, longer ctxInput needs (see perceiveDeposit) to recognise itself
200
- // as this conversation's genuine next turn rather than an unrelated fact
201
- // that happens to share this ctxInput's byte prefix.
202
- {
203
- const ctxBytes = inputBytes(ctx, ctxInput);
204
- const entry = ctx._depositTrees.get(latin1Key(ctxBytes));
205
- if (entry !== undefined)
206
- entry.nextBytes = inputBytes(ctx, cont);
207
- }
208
- await ctx.store.link(ctxId, contId);
209
- await propagateSuffixes(ctx, ctxId, contId);
210
- // Halos pour company SIGNATURES (identity), not gists (content) — see
211
- // companySignature in sema.ts.
212
- const contSeat = bindSeat(ctx.space, companySignature(ctx.space, contId), 1);
213
- for (const part of c.changed) {
214
- const partId = c.ids.get(part);
215
- await ctx.store.pourHalo(partId, contSeat);
216
- await ctx.store.pourHalo(contId, bindSeat(ctx.space, companySignature(ctx.space, partId), 0));
217
- }
218
- return { ctxId, contId };
219
- }
220
- /** Dispatch the public ingest input shapes onto one-input / pair handlers —
221
- * THE one reading of ingest's polymorphic surface (scalar, (context,
222
- * continuation) pair, or a list mixing bare inputs and pairs). Both ingest
223
- * paths — the direct one below and {@link CachedIngest} — route through
224
- * this, so the shape-detection can never drift between them again (the
225
- * ingest cache once re-implemented it and drifted). */
226
- export async function dispatchIngest(input, second, onOne, onPair) {
227
- if (Array.isArray(input) && !(input instanceof Uint8Array) &&
228
- input.width === undefined) {
229
- const arr = input;
230
- if (arr.length === 2 && !Array.isArray(arr[0]) && !Array.isArray(arr[1])) {
231
- await onPair(arr[0], arr[1]);
232
- return undefined;
233
- }
234
- for (const item of arr) {
235
- if (Array.isArray(item) && item.length === 2) {
236
- await onPair(item[0], item[1]);
237
- }
238
- else
239
- await onOne(item);
240
- }
241
- return undefined;
242
- }
243
- if (second === undefined)
244
- return onOne(input);
245
- await onPair(input, second);
246
- return undefined;
247
- }
248
- /** Ingest an input or array of inputs/pairs. The public ingest entry point.
249
- *
250
- * `onDeposit`, when given, is invoked once per ingested item with the
251
- * deposited root node ids ({@link DepositReport}) — item-level provenance
252
- * for tooling that needs to know which stored node an ingested item became.
253
- * Purely observational: the callback runs after the item's deposit
254
- * completed and nothing reads its result. */
255
- export async function ingest(ctx, input, second, onDeposit) {
256
- let index = 0;
257
- return dispatchIngest(input, second, async (i) => {
258
- const r = await ingestOne(ctx, i);
259
- onDeposit?.({ index: index++, kind: "one", contextId: r.id });
260
- return r;
261
- }, async (a, b) => {
262
- const { ctxId, contId } = await ingestPair(ctx, a, b);
263
- onDeposit?.({
264
- index: index++,
265
- kind: "pair",
266
- contextId: ctxId,
267
- continuationId: contId,
268
- });
269
- });
270
- }
@@ -1,166 +0,0 @@
1
- import { Vec } from "../vec.js";
2
- import type { Hit } from "../store.js";
3
- import type { MindContext } from "./types.js";
4
- import type { Site } from "./graph-search.js";
5
- /** The graded LOCATE ladder: find `needle` in `haystack` starting at
6
- * `fromPos`, strictest matcher first, relaxing only when the stricter one
7
- * fails. This is the read-out matcher skill extraction locates exemplar
8
- * frames with.
9
- *
10
- * 1. exact — literal byte match (the fast path).
11
- * 2. halo — the needle's distributional role matches a recognised query
12
- * form (gate: conceptThreshold).
13
- * 3. gist — the needle's perceived gist matches a query segment
14
- * (gate: identityBar — scale-aware).
15
- *
16
- * Returns the absolute byte position, or −1. */
17
- export declare function locate(ctx: MindContext, haystack: Uint8Array, needle: Uint8Array, fromPos: number, sites?: ReadonlyArray<Site>): number;
18
- /** The ALIGNED matcher: maximal literal matching runs between `query` and
19
- * `ct` (a learned context's bytes), by seed-and-extend over
20
- * `space.maxGroup`-sized n-gram seeds. Where locate() finds ONE position of
21
- * a short frame, this finds EVERY run two whole structures share — the
22
- * matcher CAST detects a woven query with. Returns non-overlapping runs
23
- * sorted by query position. */
24
- export declare function alignRuns(ctx: MindContext, query: Uint8Array, ct: Uint8Array): Array<{
25
- qs: number;
26
- qe: number;
27
- cs: number;
28
- }>;
29
- /** A run from {@link alignGraded} — the ALIGNED matcher extended with the
30
- * same graded-evidence ladder as {@link locate}. Literal runs carry
31
- * `weight = 1` (exact match is full evidence); halo-matched site runs carry
32
- * `weight = cosine` (measured evidence — the halo similarity itself).
33
- * `cs` is the structural byte position in the context regardless of run
34
- * kind, so the substitution/redirection schemas work unchanged on conceptual
35
- * alignment. */
36
- export interface GradedRun {
37
- /** True for a run the CLIMB proposed rather than the byte matcher found — see
38
- * {@link computeWeave}'s phase 2. Provenance only: a proposed run reaches
39
- * CAST already gated (dominant literal agreement, not frame, and over bytes
40
- * no literal run claimed), so every consumer reads it exactly like any other
41
- * run. Filtering seat-shaped reads by this flag was tried and is NOT
42
- * needed — the gates, not the flag, are what make it safe. */
43
- proposed?: boolean;
44
- qs: number;
45
- qe: number;
46
- cs: number;
47
- weight: number;
48
- }
49
- /** The GRADED alignment matcher: extends literal W-gram alignment
50
- * ({@link alignRuns}) with halo-matched recognised sites in query regions
51
- * that have no literal coverage. Same ladder as {@link locate}: literal
52
- * first, then distributional role (halo-matched sites, gate:
53
- * conceptThreshold, enforced by {@link bestHaloMate}). Returns weighted
54
- * runs sorted by query position.
55
- *
56
- * `querySites` are the pre-computed recognition sites for the query
57
- * (optional — when absent, only literal alignment fires and graded degrades
58
- * to the original behaviour). Context sites are recognised internally. */
59
- export declare function alignGraded(ctx: MindContext, query: Uint8Array, contextBytes: Uint8Array, querySites?: ReadonlyArray<Site>): GradedRun[];
60
- /** The IN-LIST halo matcher: the best halo-mate for `halo` among EXPLICIT
61
- * candidates, above the concept threshold — the list counterpart of
62
- * {@link haloSiblings}, which asks the halo INDEX for candidates instead.
63
- * Behind locate()'s halo step and articulation's voice matching; a third
64
- * "best halo among these" decision must come here, not inline. */
65
- export declare function bestHaloMate<T>(ctx: MindContext, halo: Vec, items: Iterable<T>, haloOf: (item: T) => Vec | null | undefined): {
66
- item: T;
67
- score: number;
68
- } | null;
69
- export declare function haloSiblings(ctx: MindContext, id: number, halo?: Vec | null, bar?: number): Promise<Hit[]>;
70
- /** The DISTRIBUTIONAL matcher between two nodes: mutual-nearest-neighbour
71
- * strength, not a pick. Returns the direct halo cosine, or failing that the
72
- * highest mutual-halo-sibling min-score (second-order analogy), or failing
73
- * that the SHARED-FRAME strength (below) — the gate CAST's comparison
74
- * schema validates genuine analogs with (bar: significanceBar).
75
- *
76
- * The result names its TIER alongside the score: `halo: true` means the
77
- * score cleared a significanceBar-gated HALO tier (direct company cosine
78
- * or mutual-sibling) — genuine distributional evidence; `halo: false`
79
- * means only the structural shared-frame fallback matched, a coverage
80
- * fraction with no bar of its own. CAST's comparison gate treats the two
81
- * differently (see cast.ts): halo evidence stands alone, frame evidence
82
- * needs the query to have named the analog or the climb root to be
83
- * trusted. */
84
- export interface AnalogyEvidence {
85
- score: number;
86
- halo: boolean;
87
- }
88
- export declare function analogyStrength(ctx: MindContext, a: number, b: number): Promise<AnalogyEvidence>;
89
- /** The STRUCTURAL analogy tier: two nodes are analogs when their byte
90
- * streams share a LEARNT frame — a content-addressed flat form of at least
91
- * one full river window (W bytes, the perception quantum) that occurs in
92
- * BOTH. This is what "playing the same role" means structurally: "Ice is
93
- * cold" and "Steel is hard" share the learnt " is " frame even though they
94
- * keep disjoint distributional company. Halos measure company by IDENTITY
95
- * (company signatures — see sema.ts), so unrelated-company analogs must be
96
- * validated by the frame itself, not by content leaking through halo
97
- * vectors. Strength is the shared learnt coverage of the SHORTER side —
98
- * a fraction, comparable to the cosine tiers above. Derived: the window
99
- * is maxGroup, the same quantum differsByOneWindow and canonicalChunkId
100
- * measure by; no tuned constants. */
101
- export declare function sharedFrameStrength(ctx: MindContext, a: number, b: number): number;
102
- /** FORWARD through a synonym: the continuation an edge-less node borrows from
103
- * a concept (halo) sibling — resonate the node's halo, take the first
104
- * sibling above the concept threshold that itself has a direct edge. */
105
- export declare function conceptHop(ctx: MindContext, id: number): Promise<number | null>;
106
- /** FORWARD projection: follow continuation edges from a node to its fixpoint.
107
- * The first hop may cross a concept (halo) link — a synonym. The rest
108
- * follow direct edges. Convergence is intrinsic: the seen set guards
109
- * against cycles. `guide` disambiguates multi-continuation nodes by
110
- * resonance. */
111
- export declare function follow(ctx: MindContext, id: number, guide?: Vec | null): Promise<Uint8Array | null>;
112
- /** REVERSE projection: the context a learnt continuation follows, voiced as
113
- * bytes. A common continuation ("Yes.") follows MANY contexts; with a
114
- * `guide` the context whose gist resonates with the query wins (seat
115
- * symmetry) — without one, the most-corroborated context wins (poured halo
116
- * MASS, the direct measure of how many episodes established it), falling
117
- * back to first-learnt on equal mass. Among many predecessors RECIPROCAL
118
- * ones (mutual edges) are preferred when any exist (RC5). Callers that
119
- * HAVE a query gist must pass it, or they silently change disambiguation
120
- * regime.
121
- *
122
- * `rev`, when the caller has already materialised prevOf (one read per
123
- * relation — a hub's reverse fan-in is corpus-sized), is reused instead of
124
- * refetched. Returns null when there is no predecessor or the picked
125
- * context reads empty (a zero-length context is no grounding: an empty
126
- * Uint8Array is truthy, and returning it would flow a hollow "answer"
127
- * onward). */
128
- export declare function reverseContext(ctx: MindContext, id: number, guide?: Vec | null, rev?: readonly number[]): Uint8Array | null;
129
- /** THE projection: ground a matched node to answer bytes — FORWARD to its
130
- * continuation fixpoint (which may cross a concept hop), else REVERSE to
131
- * the context it follows. This is the direction ladder every mechanism's
132
- * final grounding step reduces to. */
133
- export declare function project(ctx: MindContext, id: number, guide?: Vec | null): Promise<Uint8Array | null>;
134
- /** Check whether an anchor is a span-shaped skill exemplar: it represents a
135
- * fact whose context and answer together form a span-in-context pattern.
136
- * If the anchor has a nextOf continuation, that is the answer and the anchor
137
- * itself is the context. Otherwise the anchor's prevOf parents provide
138
- * candidate contexts, and the longest one whose span is span-shaped wins. */
139
- export declare function skillExemplar(ctx: MindContext, anchor: number, guide?: Vec | null): Promise<{
140
- contextBytes: Uint8Array;
141
- answerBytes: Uint8Array;
142
- } | null>;
143
- /** Whether the answer is a SPARSE subsequence of the context (bytes in
144
- * order, arbitrary gaps) — the OPEN span-shape reading (see the section
145
- * note above). This is what lets extraction validate a MULTI-PIECE
146
- * exemplar whose answer is stitched from several context runs — but it is
147
- * deliberately permissive, so it must never be used as evidence that one
148
- * span was "drawn from" another (see {@link containsSpan} for that).
149
- *
150
- * There is deliberately NO containsSpan pre-check here: strict containment
151
- * IMPLIES the subsequence embedding (a contiguous run, or a resolved node —
152
- * whose content-addressed identity means its bytes occur contiguously — is
153
- * an in-order embedding with zero gaps), so the scan below decides alone,
154
- * with the same truth value. The old pre-check re-perceived the context
155
- * (a full river fold) per CANDIDATE in skillExemplar's √N-capped loop —
156
- * pure cost, no discrimination. */
157
- export declare function isSpanShaped(_ctx: MindContext, context: Uint8Array, answer: Uint8Array): boolean;
158
- /** STRICT containment: the answer's resolved node appears in the context's
159
- * folded tree, or the answer occurs as one CONTIGUOUS byte run of the
160
- * context. This is real evidence the answer was drawn from the context.
161
- * Fusion gates on this — the sparse-subsequence reading of
162
- * {@link isSpanShaped} is trivially satisfied by short answers over long
163
- * queries ("cold" is a gap-tolerant subsequence of most sentences holding
164
- * c…o…l…d in order), and gating fusion on it silently starved multi-topic
165
- * queries of their further points of attention. */
166
- export declare function containsSpan(ctx: MindContext, context: Uint8Array, answer: Uint8Array): boolean;