@loomwork/ui-hydration 0.0.0-stage → 0.1.0

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 (179) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +398 -2
  4. package/dist/cache.d.ts +71 -0
  5. package/dist/cache.d.ts.map +1 -0
  6. package/dist/cache.js +157 -0
  7. package/dist/cache.js.map +1 -0
  8. package/dist/chatSource.d.ts +105 -0
  9. package/dist/chatSource.d.ts.map +1 -0
  10. package/dist/chatSource.js +259 -0
  11. package/dist/chatSource.js.map +1 -0
  12. package/dist/client.d.ts +17 -0
  13. package/dist/client.d.ts.map +1 -0
  14. package/dist/client.js +36 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/contentRefs.d.ts +78 -0
  17. package/dist/contentRefs.d.ts.map +1 -0
  18. package/dist/contentRefs.js +129 -0
  19. package/dist/contentRefs.js.map +1 -0
  20. package/dist/controller.d.ts +228 -0
  21. package/dist/controller.d.ts.map +1 -0
  22. package/dist/controller.js +454 -0
  23. package/dist/controller.js.map +1 -0
  24. package/dist/dataProvider.d.ts +53 -0
  25. package/dist/dataProvider.d.ts.map +1 -0
  26. package/dist/dataProvider.js +77 -0
  27. package/dist/dataProvider.js.map +1 -0
  28. package/dist/esm/cache.js +151 -0
  29. package/dist/esm/cache.js.map +1 -0
  30. package/dist/esm/chatSource.js +254 -0
  31. package/dist/esm/chatSource.js.map +1 -0
  32. package/dist/esm/client.js +15 -0
  33. package/dist/esm/client.js.map +1 -0
  34. package/dist/esm/contentRefs.js +119 -0
  35. package/dist/esm/contentRefs.js.map +1 -0
  36. package/dist/esm/controller.js +449 -0
  37. package/dist/esm/controller.js.map +1 -0
  38. package/dist/esm/dataProvider.js +72 -0
  39. package/dist/esm/dataProvider.js.map +1 -0
  40. package/dist/esm/index.js +15 -0
  41. package/dist/esm/index.js.map +1 -0
  42. package/dist/esm/invoker.js +2 -0
  43. package/dist/esm/invoker.js.map +1 -0
  44. package/dist/esm/invokers.js +310 -0
  45. package/dist/esm/invokers.js.map +1 -0
  46. package/dist/esm/loomEffectProvider.js +96 -0
  47. package/dist/esm/loomEffectProvider.js.map +1 -0
  48. package/dist/esm/params.js +207 -0
  49. package/dist/esm/params.js.map +1 -0
  50. package/dist/esm/path.js +24 -0
  51. package/dist/esm/path.js.map +1 -0
  52. package/dist/esm/plan.js +190 -0
  53. package/dist/esm/plan.js.map +1 -0
  54. package/dist/esm/projection.js +230 -0
  55. package/dist/esm/projection.js.map +1 -0
  56. package/dist/esm/provider.js +416 -0
  57. package/dist/esm/provider.js.map +1 -0
  58. package/dist/esm/repair.js +53 -0
  59. package/dist/esm/repair.js.map +1 -0
  60. package/dist/esm/reshape.js +156 -0
  61. package/dist/esm/reshape.js.map +1 -0
  62. package/dist/esm/restricted.js +54 -0
  63. package/dist/esm/restricted.js.map +1 -0
  64. package/dist/esm/scheduler.js +247 -0
  65. package/dist/esm/scheduler.js.map +1 -0
  66. package/dist/esm/select.js +18 -0
  67. package/dist/esm/select.js.map +1 -0
  68. package/dist/esm/shape.js +34 -0
  69. package/dist/esm/shape.js.map +1 -0
  70. package/dist/esm/split/client.js +309 -0
  71. package/dist/esm/split/client.js.map +1 -0
  72. package/dist/esm/split/index.js +3 -0
  73. package/dist/esm/split/index.js.map +1 -0
  74. package/dist/esm/split/server.js +488 -0
  75. package/dist/esm/split/server.js.map +1 -0
  76. package/dist/esm/split/shared.js +13 -0
  77. package/dist/esm/split/shared.js.map +1 -0
  78. package/dist/index.d.ts +29 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +63 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/invoker.d.ts +10 -0
  83. package/dist/invoker.d.ts.map +1 -0
  84. package/dist/invoker.js +3 -0
  85. package/dist/invoker.js.map +1 -0
  86. package/dist/invokers.d.ts +36 -0
  87. package/dist/invokers.d.ts.map +1 -0
  88. package/dist/invokers.js +315 -0
  89. package/dist/invokers.js.map +1 -0
  90. package/dist/loomEffectProvider.d.ts +67 -0
  91. package/dist/loomEffectProvider.d.ts.map +1 -0
  92. package/dist/loomEffectProvider.js +101 -0
  93. package/dist/loomEffectProvider.js.map +1 -0
  94. package/dist/params.d.ts +103 -0
  95. package/dist/params.d.ts.map +1 -0
  96. package/dist/params.js +221 -0
  97. package/dist/params.js.map +1 -0
  98. package/dist/path.d.ts +12 -0
  99. package/dist/path.d.ts.map +1 -0
  100. package/dist/path.js +28 -0
  101. package/dist/path.js.map +1 -0
  102. package/dist/plan.d.ts +56 -0
  103. package/dist/plan.d.ts.map +1 -0
  104. package/dist/plan.js +199 -0
  105. package/dist/plan.js.map +1 -0
  106. package/dist/projection.d.ts +122 -0
  107. package/dist/projection.d.ts.map +1 -0
  108. package/dist/projection.js +238 -0
  109. package/dist/projection.js.map +1 -0
  110. package/dist/provider.d.ts +152 -0
  111. package/dist/provider.d.ts.map +1 -0
  112. package/dist/provider.js +421 -0
  113. package/dist/provider.js.map +1 -0
  114. package/dist/repair.d.ts +18 -0
  115. package/dist/repair.d.ts.map +1 -0
  116. package/dist/repair.js +57 -0
  117. package/dist/repair.js.map +1 -0
  118. package/dist/reshape.d.ts +32 -0
  119. package/dist/reshape.d.ts.map +1 -0
  120. package/dist/reshape.js +164 -0
  121. package/dist/reshape.js.map +1 -0
  122. package/dist/restricted.d.ts +21 -0
  123. package/dist/restricted.d.ts.map +1 -0
  124. package/dist/restricted.js +61 -0
  125. package/dist/restricted.js.map +1 -0
  126. package/dist/scheduler.d.ts +82 -0
  127. package/dist/scheduler.d.ts.map +1 -0
  128. package/dist/scheduler.js +254 -0
  129. package/dist/scheduler.js.map +1 -0
  130. package/dist/select.d.ts +34 -0
  131. package/dist/select.d.ts.map +1 -0
  132. package/dist/select.js +21 -0
  133. package/dist/select.js.map +1 -0
  134. package/dist/shape.d.ts +3 -0
  135. package/dist/shape.d.ts.map +1 -0
  136. package/dist/shape.js +37 -0
  137. package/dist/shape.js.map +1 -0
  138. package/dist/split/client.d.ts +132 -0
  139. package/dist/split/client.d.ts.map +1 -0
  140. package/dist/split/client.js +313 -0
  141. package/dist/split/client.js.map +1 -0
  142. package/dist/split/index.d.ts +5 -0
  143. package/dist/split/index.d.ts.map +1 -0
  144. package/dist/split/index.js +14 -0
  145. package/dist/split/index.js.map +1 -0
  146. package/dist/split/server.d.ts +160 -0
  147. package/dist/split/server.d.ts.map +1 -0
  148. package/dist/split/server.js +496 -0
  149. package/dist/split/server.js.map +1 -0
  150. package/dist/split/shared.d.ts +6 -0
  151. package/dist/split/shared.d.ts.map +1 -0
  152. package/dist/split/shared.js +19 -0
  153. package/dist/split/shared.js.map +1 -0
  154. package/package.json +77 -3
  155. package/src/cache.ts +211 -0
  156. package/src/chatSource.ts +374 -0
  157. package/src/client.ts +46 -0
  158. package/src/contentRefs.ts +195 -0
  159. package/src/controller.ts +708 -0
  160. package/src/dataProvider.ts +141 -0
  161. package/src/index.ts +86 -0
  162. package/src/invoker.ts +14 -0
  163. package/src/invokers.ts +348 -0
  164. package/src/loomEffectProvider.ts +136 -0
  165. package/src/params.ts +314 -0
  166. package/src/path.ts +26 -0
  167. package/src/plan.ts +197 -0
  168. package/src/projection.ts +297 -0
  169. package/src/provider.ts +657 -0
  170. package/src/repair.ts +70 -0
  171. package/src/reshape.ts +193 -0
  172. package/src/restricted.ts +69 -0
  173. package/src/scheduler.ts +284 -0
  174. package/src/select.ts +59 -0
  175. package/src/shape.ts +39 -0
  176. package/src/split/client.ts +449 -0
  177. package/src/split/index.ts +18 -0
  178. package/src/split/server.ts +746 -0
  179. package/src/split/shared.ts +18 -0
@@ -0,0 +1,24 @@
1
+ // ── Binding path ↔ hydration handle, browser-safe ────────────────────────────────
2
+ // A compiled widget binds to `values.<handle>`. `@loomwork/ui-core` owns that spelling for the
3
+ // compile side (`hydrationPath`), but the client entry must not pull core's runtime module graph
4
+ // into a browser bundle, and core cannot import hydration (hydration depends on core). So the
5
+ // client entry carries its own definition of the prefix and the inverse, pinned against core's
6
+ // twice: at compile time (the `satisfies` below, type-only, erased at build) and by
7
+ // `path.test.ts`, which compares the values and round-trips `hydrationPath`.
8
+ /** The hydration projection's top-level key; equal to `@loomwork/ui-core`'s constant of the same name. */
9
+ export const HYDRATION_VALUES_PREFIX = "values";
10
+ /**
11
+ * The hydration handle a binding path names: the exact inverse of core's `hydrationPath`.
12
+ * `undefined` for a path not of the form `values.<handle>` with a non-empty handle (including the
13
+ * bare prefix and `values.`). Everything after the first `values.` is the handle, spelled exactly
14
+ * as `hydrationPath` spelled it. Note: blueprint-runtime resolves a binding path by splitting on
15
+ * `.`, so a handle that itself contains a dot round-trips here but will not resolve at render time —
16
+ * keep handles dot-free. A reserved handle (`__proto__` etc.) is returned as-is; the store refuses it.
17
+ */
18
+ export function handleOfPath(path) {
19
+ const head = `${HYDRATION_VALUES_PREFIX}.`;
20
+ if (!path.startsWith(head) || path.length === head.length)
21
+ return undefined;
22
+ return path.slice(head.length);
23
+ }
24
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/path.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,+FAA+F;AAC/F,iGAAiG;AACjG,8FAA8F;AAC9F,+FAA+F;AAC/F,oFAAoF;AACpF,6EAA6E;AAI7E,0GAA0G;AAC1G,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAA0C,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,GAAG,uBAAuB,GAAG,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,190 @@
1
+ // ── Graph scheduling and argument templating ──────────────────────────────────
2
+ // A ProviderSpec's executionGraph is a DAG of MCP steps. Steps run in topological WAVES (every
3
+ // step in a wave has all its in-graph dependencies in earlier waves). A dependency naming a step
4
+ // outside the graph is treated as satisfied — the planner may reference a step it pruned — and a
5
+ // cycle is reported, never looped over. Arguments may embed `{{steps.<id>.output.<path>}}`,
6
+ // resolved from an earlier step's raw output over OWN properties only: the path is model-written
7
+ // and walked over a tool response, so an unguarded walk is a prototype-pollution read. An index
8
+ // past the end of a present array is not a bad path — the upstream answered with no such row —
9
+ // and is reported apart from every other miss (`walkPath`), so it can publish `empty`.
10
+ /**
11
+ * Kahn's algorithm over step IDS, O(V + E): in-degree counts (distinct in-graph dependencies per
12
+ * step) and a dependents list built once, then a FIFO of ids whose level never decreases. A step's
13
+ * wave is 1 + the latest wave among its in-graph dependencies (0 with none); an id is placed at the
14
+ * earliest wave any step carrying it is ready. Waves are then filled in the input's own order, so a
15
+ * wave lists its steps exactly as the input does. This is the semantics of the original
16
+ * re-filtering loop, pinned by an equivalence test: a step whose id another step already placed in
17
+ * an EARLIER wave never runs (a duplicate id), and `cycle` lists — in input order — every step
18
+ * whose id is never placed (a cycle, or anything behind one).
19
+ */
20
+ export function topoWaves(nodes) {
21
+ const ids = new Set(nodes.map((n) => n.stepId));
22
+ const pending = new Array(nodes.length);
23
+ const readyAt = new Array(nodes.length).fill(-1);
24
+ const latestDep = new Array(nodes.length).fill(-1);
25
+ const dependents = new Map();
26
+ const placedAt = new Map();
27
+ const queue = [];
28
+ const ready = (i, level) => {
29
+ readyAt[i] = level;
30
+ const id = nodes[i].stepId;
31
+ if (placedAt.has(id))
32
+ return;
33
+ placedAt.set(id, level);
34
+ queue.push(id);
35
+ };
36
+ nodes.forEach((n, i) => {
37
+ const deps = new Set(n.dependsOn.filter((d) => ids.has(d)));
38
+ pending[i] = deps.size;
39
+ for (const d of deps) {
40
+ const list = dependents.get(d);
41
+ if (list === undefined)
42
+ dependents.set(d, [i]);
43
+ else
44
+ list.push(i);
45
+ }
46
+ });
47
+ nodes.forEach((_, i) => {
48
+ if (pending[i] === 0)
49
+ ready(i, 0);
50
+ });
51
+ for (let head = 0; head < queue.length; head++) {
52
+ const id = queue[head];
53
+ const level = placedAt.get(id);
54
+ for (const i of dependents.get(id) ?? []) {
55
+ latestDep[i] = Math.max(latestDep[i], level);
56
+ pending[i] = pending[i] - 1;
57
+ if (pending[i] === 0)
58
+ ready(i, latestDep[i] + 1);
59
+ }
60
+ }
61
+ const waves = [];
62
+ const cycle = [];
63
+ nodes.forEach((n, i) => {
64
+ const at = placedAt.get(n.stepId);
65
+ if (at === undefined)
66
+ cycle.push(n.stepId);
67
+ else if (readyAt[i] === at) {
68
+ while (waves.length <= at)
69
+ waves.push([]);
70
+ waves[at].push(n);
71
+ }
72
+ });
73
+ return { waves, cycle };
74
+ }
75
+ export function terminalSteps(nodes) {
76
+ const depended = new Set(nodes.flatMap((n) => n.dependsOn));
77
+ return nodes.filter((n) => !depended.has(n.stepId));
78
+ }
79
+ const SEGMENT = /^([^[\]]+)((?:\[\d+\])*)$/;
80
+ /** Dotted path with optional `[i]` indices, own properties only. A present `null` resolves to `null`. */
81
+ export function walkPath(obj, dotted) {
82
+ const absent = { ok: false, cause: "absent" };
83
+ let cur = obj;
84
+ for (const part of dotted.split(".")) {
85
+ const m = SEGMENT.exec(part);
86
+ if (!m || cur === null || typeof cur !== "object")
87
+ return absent;
88
+ const key = m[1];
89
+ if (!Object.hasOwn(cur, key))
90
+ return absent;
91
+ cur = cur[key];
92
+ for (const idx of (m[2] ?? "").match(/\d+/g) ?? []) {
93
+ if (!Array.isArray(cur))
94
+ return absent;
95
+ const i = Number(idx);
96
+ if (i >= cur.length)
97
+ return { ok: false, cause: "out-of-range" };
98
+ cur = cur[i];
99
+ }
100
+ }
101
+ return { ok: true, value: cur };
102
+ }
103
+ /** `walkPath`'s value, or `undefined` when anything is missing. */
104
+ export function resolvePath(obj, dotted) {
105
+ const r = walkPath(obj, dotted);
106
+ return r.ok ? r.value : undefined;
107
+ }
108
+ export const STEP_TEMPLATE = /^\{\{steps\.([A-Za-z0-9_-]+)\.output(?:\.(.+))?\}\}$/;
109
+ /**
110
+ * Every step id `arguments` references through a `{{steps.<id>.output…}}` template, in first-seen
111
+ * order, deduplicated — the same template grammar `resolveArguments` substitutes, so a planner can
112
+ * check a graph it builds before it ships. At execution a reference resolves only against a step
113
+ * in a STRICTLY EARLIER `topoWaves` wave than the referencing step; a step outside the graph, or in
114
+ * the same or a later wave, has no output yet and is `unresolved-step-reference`.
115
+ */
116
+ export function stepReferences(args) {
117
+ const found = new Set();
118
+ const visit = (v) => {
119
+ if (typeof v === "string") {
120
+ const m = STEP_TEMPLATE.exec(v);
121
+ if (m)
122
+ found.add(m[1]);
123
+ }
124
+ else if (Array.isArray(v))
125
+ for (const x of v)
126
+ visit(x);
127
+ else if (v !== null && typeof v === "object")
128
+ for (const x of Object.values(v))
129
+ visit(x);
130
+ };
131
+ visit(args);
132
+ return [...found];
133
+ }
134
+ /**
135
+ * Substitute every `{{steps.<id>.output.<path>}}` in the step's arguments. EVERY template is
136
+ * walked: a bad path anywhere (`absent`, or a step with no output) is `unresolved-step-reference`
137
+ * (an error) and wins; otherwise an index past the end of a present upstream array is
138
+ * `upstream-empty` (a warn — the upstream answered with no such row; loom ADR 0100's `empty`).
139
+ */
140
+ export function resolveArguments(node, outputs) {
141
+ let bad;
142
+ let empty;
143
+ const visit = (v) => {
144
+ if (typeof v === "string") {
145
+ const m = STEP_TEMPLATE.exec(v);
146
+ if (!m)
147
+ return v;
148
+ const stepId = m[1];
149
+ if (!outputs.has(stepId)) {
150
+ bad ??= {
151
+ code: "unresolved-step-reference",
152
+ severity: "error",
153
+ message: `step "${node.stepId}" references "${stepId}", which has no output`,
154
+ };
155
+ return v;
156
+ }
157
+ const path = m[2];
158
+ const out = path === undefined
159
+ ? { ok: true, value: outputs.get(stepId) }
160
+ : walkPath(outputs.get(stepId), path);
161
+ // A present `undefined` (never produced by JSON) is treated as nothing, as before.
162
+ if (out.ok && out.value !== undefined)
163
+ return out.value;
164
+ if (!out.ok && out.cause === "out-of-range")
165
+ empty ??= {
166
+ code: "upstream-empty",
167
+ severity: "warn",
168
+ message: `step "${node.stepId}" references "${stepId}" at path "${path ?? ""}": the upstream has no such row`,
169
+ };
170
+ else
171
+ bad ??= {
172
+ code: "unresolved-step-reference",
173
+ severity: "error",
174
+ message: `step "${node.stepId}" references "${stepId}" at path "${path ?? ""}", which resolves to nothing`,
175
+ };
176
+ return v;
177
+ }
178
+ if (Array.isArray(v))
179
+ return v.map(visit);
180
+ // `Object.fromEntries` writes with CreateDataProperty: an own `__proto__` argument stays an
181
+ // own key instead of becoming the args object's prototype (an assignment would set it).
182
+ if (v !== null && typeof v === "object")
183
+ return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, visit(x)]));
184
+ return v;
185
+ };
186
+ const args = visit(node.arguments);
187
+ const failure = bad ?? empty;
188
+ return failure ? { ok: false, finding: failure } : { ok: true, args };
189
+ }
190
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ import { appendChunk, isBroadcast } from "@loomwork/ui-core/browser";
2
+ // ── One projection, keyed by handle ───────────────────────────────────────────
3
+ // Compiled widgets bind to `values.<handle>` and declare `status.<handle>` as their status
4
+ // channel (core's `hydrationPath`/`hydrationStatusPath`), and the compiler pins
5
+ // HYDRATION_PROJECTION_VERSION into the blueprint (ADR 0095). Hydration is imperative and
6
+ // transient — nothing here is durable or replayed — so the projection is driven by ONE synthetic
7
+ // in-memory event type. `subscribeSelector` gives each handle its own slice, so a value resolving
8
+ // wakes one widget, not the surface.
9
+ export const HYDRATION_PROJECTION_ID = "loom-ui.hydration";
10
+ /**
11
+ * Bump when the MEANING of `values`/`status` changes; the compiler pins this into every blueprint.
12
+ * 1.1.0: a status may be `empty` (loom ADR 0100), and the fold DROPS the handle's value with it.
13
+ */
14
+ export const HYDRATION_PROJECTION_VERSION = "1.1.0";
15
+ export const HYDRATION_SET_EVENT = "LOOM_UI_HYDRATION_SET";
16
+ const RESERVED = new Set(["__proto__", "constructor", "prototype"]);
17
+ export function isReservedHandle(handle) {
18
+ return RESERVED.has(handle);
19
+ }
20
+ // `Object.fromEntries` uses CreateDataProperty for each entry, so a `__proto__` key lands as
21
+ // an own property — never the prototype setter that a plain `out[k] = v` assignment would hit.
22
+ function without(rec, key) {
23
+ return Object.fromEntries(Object.entries(rec).filter(([k]) => k !== key));
24
+ }
25
+ export function hydrationProjection() {
26
+ return {
27
+ id: HYDRATION_PROJECTION_ID,
28
+ version: HYDRATION_PROJECTION_VERSION,
29
+ initialState: { values: {}, status: {} },
30
+ handlers: {
31
+ [HYDRATION_SET_EVENT]: (state, event) => {
32
+ const p = event.payload;
33
+ // Defense in depth: `HydrationStore` already refuses reserved handles before emitting,
34
+ // but this projection is registered on a SHARED runtime — any other holder of that
35
+ // runtime can call `handleEvent` directly with a forged envelope, bypassing the store.
36
+ // The fold itself must never write a reserved handle into state.
37
+ if (isReservedHandle(p.handle))
38
+ return state;
39
+ if (p.kind === "remove") {
40
+ if (!Object.hasOwn(state.status, p.handle) && !Object.hasOwn(state.values, p.handle))
41
+ return state;
42
+ return {
43
+ values: without(state.values, p.handle),
44
+ status: without(state.status, p.handle),
45
+ };
46
+ }
47
+ const status = { ...state.status, [p.handle]: p.status };
48
+ // loom ADR 0100 D1: a producer MUST clear the value beside `empty` — an older reader that
49
+ // cannot see `empty` would otherwise show an earlier `ready` value as current.
50
+ if (p.status?.state === "empty")
51
+ return {
52
+ values: Object.hasOwn(state.values, p.handle)
53
+ ? without(state.values, p.handle)
54
+ : state.values,
55
+ status,
56
+ };
57
+ if (p.kind === "status")
58
+ return { values: state.values, status };
59
+ return { values: { ...state.values, [p.handle]: p.value }, status };
60
+ },
61
+ },
62
+ };
63
+ }
64
+ /** A controller and its store disagree about the audience (one broadcast, the other not). */
65
+ export class HydrationAudienceMismatchError extends Error {
66
+ controllerBroadcast;
67
+ code = "hydration-audience-mismatch";
68
+ constructor(controllerBroadcast) {
69
+ super(controllerBroadcast
70
+ ? 'HydrationController: a broadcast controller needs a store scoped { audience: "broadcast" }'
71
+ : "HydrationController: a store scoped to a broadcast audience needs a broadcast controller");
72
+ this.controllerBroadcast = controllerBroadcast;
73
+ this.name = "HydrationAudienceMismatchError";
74
+ }
75
+ }
76
+ /** An `experienceId` or `principalId` contains NUL, the separator of the broadcast scope key. */
77
+ export class HydrationScopeError extends Error {
78
+ field;
79
+ code = "hydration-scope-invalid";
80
+ constructor(field) {
81
+ super(`HydrationStore: ${field} must not contain a NUL character (it separates the broadcast scope key)`);
82
+ this.field = field;
83
+ this.name = "HydrationScopeError";
84
+ }
85
+ }
86
+ export class HydrationStore {
87
+ runtime;
88
+ scope;
89
+ /** Open token streams by handle (see {@link append}). A replace/remove/empty ends the handle's. */
90
+ streams = new Map();
91
+ /**
92
+ * Installed by the controller that fronts this store: a refusal for a handle that may not take
93
+ * chunks (restricted for the viewer, unbound, not a streaming widget). Absent on a bare store.
94
+ */
95
+ appendGuard;
96
+ seq = 0; // status seq — monotone per store
97
+ emitSeq = 0; // envelope sequence — every emit, including remove
98
+ /** The projection state key: the scope, flattened. Derived — never passed in. */
99
+ executionId;
100
+ /**
101
+ * Isolation is by (experience, principal); two viewers of one experience must not share a
102
+ * store. The projection is keyed by `executionId`, so a per-viewer store is what keeps one
103
+ * viewer's values out of another's widgets even on a SHARED `ProjectionRuntime`.
104
+ */
105
+ constructor(runtime, scope, opts = {}) {
106
+ this.runtime = runtime;
107
+ this.scope = scope;
108
+ // The key below joins with NUL; an id carrying one could forge another scope's key
109
+ // (principal "p\0broadcast" would land on the broadcast scope of "p").
110
+ if (scope.experienceId.includes("\u0000"))
111
+ throw new HydrationScopeError("experienceId");
112
+ if (scope.principalId?.includes("\u0000"))
113
+ throw new HydrationScopeError("principalId");
114
+ const base = scope.principalId === undefined
115
+ ? scope.experienceId
116
+ : `${scope.experienceId}:${scope.principalId}`;
117
+ // NUL cannot appear in a typed id suffix a principal could forge, so a principal named
118
+ // "p:broadcast" never lands on the broadcast scope of "p".
119
+ this.executionId = isBroadcast(scope.audience) ? `${base}\u0000broadcast` : base;
120
+ if (opts.register !== false)
121
+ runtime.register(hydrationProjection());
122
+ }
123
+ state() {
124
+ return this.runtime.getState(HYDRATION_PROJECTION_ID, this.executionId);
125
+ }
126
+ status(handle) {
127
+ const s = this.state().status;
128
+ return Object.hasOwn(s, handle) ? s[handle] : undefined;
129
+ }
130
+ value(handle) {
131
+ const v = this.state().values;
132
+ return Object.hasOwn(v, handle) ? v[handle] : undefined;
133
+ }
134
+ handles() {
135
+ return Object.keys(this.state().status);
136
+ }
137
+ setStatus(handle, status) {
138
+ this.assertValidHandle(handle);
139
+ // `empty` drops the value, so a stream continuing onto it would resurrect a value the fold cleared.
140
+ if (status.state === "empty")
141
+ this.streams.delete(handle);
142
+ this.emit({ kind: "status", handle, status: this.stamp(status) });
143
+ }
144
+ setValue(handle, value, status) {
145
+ this.assertValidHandle(handle);
146
+ // A whole-value replace (a controller load, a supersede) ends the handle's token stream: the
147
+ // stream's accumulated text is no longer what the handle holds, so a producer's later chunks
148
+ // are refused (`stream-gap`) instead of being spliced onto the replacement.
149
+ this.streams.delete(handle);
150
+ this.emit({ kind: "value", handle, value, status: this.stamp(status) });
151
+ }
152
+ remove(handle) {
153
+ this.assertValidHandle(handle);
154
+ this.streams.delete(handle);
155
+ this.emit({ kind: "remove", handle });
156
+ }
157
+ /**
158
+ * Gate every {@link append} through `guard` (a refusal finding, or undefined to allow). A
159
+ * `HydrationController` installs one over the store it fronts, so a producer cannot write a
160
+ * viewer-restricted handle's text into the projected store behind the controller's back. A bare
161
+ * store (no controller) has no viewer and no experience to gate against and stays ungated.
162
+ */
163
+ guardAppend(guard) {
164
+ this.appendGuard = guard;
165
+ }
166
+ /**
167
+ * Append one chunk of a token stream (`StreamingText`) to a handle. The handle's value is the
168
+ * accumulated string — widgets and the value contract are unchanged — and its status is
169
+ * `pending` while the stream is open and `ready` once a chunk carries `done`.
170
+ *
171
+ * ORDERING with a whole-value writer (`setValue`/`remove`, e.g. the controller superseding a
172
+ * load): they are synchronous and the last writer wins. A replace ENDS the stream; the
173
+ * producer's next chunk then refuses (`stream-gap`, `seq` no longer 0) rather than corrupt the
174
+ * replacement, and a producer that wants to stream again starts a new stream at `seq` 0, which
175
+ * replaces the value. The contract itself (idempotence, gap, close, bounds) is core's
176
+ * `appendChunk`. A refusal emits nothing; a duplicate is `applied: false` and emits nothing.
177
+ */
178
+ append(handle, chunk) {
179
+ this.assertValidHandle(handle);
180
+ const refusal = this.appendGuard?.(handle);
181
+ if (refusal !== undefined)
182
+ return { ok: false, finding: refusal };
183
+ const r = appendChunk(this.streams.get(handle), chunk);
184
+ if (!r.ok)
185
+ return r;
186
+ if (!r.applied)
187
+ return { ok: true, applied: false };
188
+ this.streams.set(handle, r.state);
189
+ this.emit({
190
+ kind: "value",
191
+ handle,
192
+ value: r.state.text,
193
+ status: this.stamp({ state: r.state.done ? "ready" : "pending" }),
194
+ });
195
+ return { ok: true, applied: true };
196
+ }
197
+ /** Whole-state subscription: fires on ANY handle's value or status change. For a surface that renders the full projection (e.g. a terminal `watch` loop) rather than one widget's slice. */
198
+ runtimeSubscribe(listener) {
199
+ return this.runtime.subscribe(HYDRATION_PROJECTION_ID, this.executionId, listener);
200
+ }
201
+ /** Slice-scoped: fires only when THIS handle's status seq or value changes. Change-only, like loom's subscribe. */
202
+ subscribe(handle, listener) {
203
+ return this.runtime.subscribeSelector(HYDRATION_PROJECTION_ID, this.executionId, (s) => ({
204
+ value: Object.hasOwn(s.values, handle) ? s.values[handle] : undefined,
205
+ status: Object.hasOwn(s.status, handle) ? s.status[handle] : undefined,
206
+ }), listener, (a, b) => a.status?.seq === b.status?.seq && a.value === b.value);
207
+ }
208
+ assertValidHandle(handle) {
209
+ if (isReservedHandle(handle))
210
+ throw new Error(`handle "${handle}" is reserved`);
211
+ }
212
+ stamp(status) {
213
+ this.seq += 1;
214
+ return { ...status, seq: this.seq };
215
+ }
216
+ emit(payload) {
217
+ this.emitSeq += 1;
218
+ const envelope = {
219
+ id: `loom-ui-hydration-${this.executionId}-${this.emitSeq}`,
220
+ workflowId: "loom-ui.hydration",
221
+ executionId: this.executionId,
222
+ eventType: HYDRATION_SET_EVENT,
223
+ sequence: this.emitSeq,
224
+ timestamp: 0, // transient; never persisted, never compared
225
+ payload,
226
+ };
227
+ this.runtime.handleEvent(envelope);
228
+ }
229
+ }
230
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/projection.ts"],"names":[],"mappings":"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"}