@loomwork/ui-hydration 0.0.0-stage → 0.1.1
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/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +398 -2
- package/dist/cache.d.ts +71 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +157 -0
- package/dist/cache.js.map +1 -0
- package/dist/chatSource.d.ts +105 -0
- package/dist/chatSource.d.ts.map +1 -0
- package/dist/chatSource.js +264 -0
- package/dist/chatSource.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +36 -0
- package/dist/client.js.map +1 -0
- package/dist/contentRefs.d.ts +78 -0
- package/dist/contentRefs.d.ts.map +1 -0
- package/dist/contentRefs.js +129 -0
- package/dist/contentRefs.js.map +1 -0
- package/dist/controller.d.ts +228 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.js +454 -0
- package/dist/controller.js.map +1 -0
- package/dist/dataProvider.d.ts +53 -0
- package/dist/dataProvider.d.ts.map +1 -0
- package/dist/dataProvider.js +77 -0
- package/dist/dataProvider.js.map +1 -0
- package/dist/esm/cache.js +151 -0
- package/dist/esm/cache.js.map +1 -0
- package/dist/esm/chatSource.js +259 -0
- package/dist/esm/chatSource.js.map +1 -0
- package/dist/esm/client.js +15 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/contentRefs.js +119 -0
- package/dist/esm/contentRefs.js.map +1 -0
- package/dist/esm/controller.js +449 -0
- package/dist/esm/controller.js.map +1 -0
- package/dist/esm/dataProvider.js +72 -0
- package/dist/esm/dataProvider.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/invoker.js +2 -0
- package/dist/esm/invoker.js.map +1 -0
- package/dist/esm/invokers.js +310 -0
- package/dist/esm/invokers.js.map +1 -0
- package/dist/esm/loomEffectProvider.js +96 -0
- package/dist/esm/loomEffectProvider.js.map +1 -0
- package/dist/esm/params.js +207 -0
- package/dist/esm/params.js.map +1 -0
- package/dist/esm/path.js +24 -0
- package/dist/esm/path.js.map +1 -0
- package/dist/esm/plan.js +190 -0
- package/dist/esm/plan.js.map +1 -0
- package/dist/esm/projection.js +230 -0
- package/dist/esm/projection.js.map +1 -0
- package/dist/esm/provider.js +416 -0
- package/dist/esm/provider.js.map +1 -0
- package/dist/esm/repair.js +53 -0
- package/dist/esm/repair.js.map +1 -0
- package/dist/esm/reshape.js +156 -0
- package/dist/esm/reshape.js.map +1 -0
- package/dist/esm/restricted.js +54 -0
- package/dist/esm/restricted.js.map +1 -0
- package/dist/esm/scheduler.js +247 -0
- package/dist/esm/scheduler.js.map +1 -0
- package/dist/esm/select.js +18 -0
- package/dist/esm/select.js.map +1 -0
- package/dist/esm/shape.js +34 -0
- package/dist/esm/shape.js.map +1 -0
- package/dist/esm/split/client.js +312 -0
- package/dist/esm/split/client.js.map +1 -0
- package/dist/esm/split/index.js +3 -0
- package/dist/esm/split/index.js.map +1 -0
- package/dist/esm/split/server.js +488 -0
- package/dist/esm/split/server.js.map +1 -0
- package/dist/esm/split/shared.js +13 -0
- package/dist/esm/split/shared.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/invoker.d.ts +10 -0
- package/dist/invoker.d.ts.map +1 -0
- package/dist/invoker.js +3 -0
- package/dist/invoker.js.map +1 -0
- package/dist/invokers.d.ts +36 -0
- package/dist/invokers.d.ts.map +1 -0
- package/dist/invokers.js +315 -0
- package/dist/invokers.js.map +1 -0
- package/dist/loomEffectProvider.d.ts +67 -0
- package/dist/loomEffectProvider.d.ts.map +1 -0
- package/dist/loomEffectProvider.js +101 -0
- package/dist/loomEffectProvider.js.map +1 -0
- package/dist/params.d.ts +103 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +221 -0
- package/dist/params.js.map +1 -0
- package/dist/path.d.ts +12 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +28 -0
- package/dist/path.js.map +1 -0
- package/dist/plan.d.ts +56 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +199 -0
- package/dist/plan.js.map +1 -0
- package/dist/projection.d.ts +122 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +238 -0
- package/dist/projection.js.map +1 -0
- package/dist/provider.d.ts +152 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +421 -0
- package/dist/provider.js.map +1 -0
- package/dist/repair.d.ts +18 -0
- package/dist/repair.d.ts.map +1 -0
- package/dist/repair.js +57 -0
- package/dist/repair.js.map +1 -0
- package/dist/reshape.d.ts +32 -0
- package/dist/reshape.d.ts.map +1 -0
- package/dist/reshape.js +164 -0
- package/dist/reshape.js.map +1 -0
- package/dist/restricted.d.ts +21 -0
- package/dist/restricted.d.ts.map +1 -0
- package/dist/restricted.js +61 -0
- package/dist/restricted.js.map +1 -0
- package/dist/scheduler.d.ts +82 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +254 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/select.d.ts +34 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +21 -0
- package/dist/select.js.map +1 -0
- package/dist/shape.d.ts +3 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +37 -0
- package/dist/shape.js.map +1 -0
- package/dist/split/client.d.ts +135 -0
- package/dist/split/client.d.ts.map +1 -0
- package/dist/split/client.js +316 -0
- package/dist/split/client.js.map +1 -0
- package/dist/split/index.d.ts +5 -0
- package/dist/split/index.d.ts.map +1 -0
- package/dist/split/index.js +14 -0
- package/dist/split/index.js.map +1 -0
- package/dist/split/server.d.ts +160 -0
- package/dist/split/server.d.ts.map +1 -0
- package/dist/split/server.js +496 -0
- package/dist/split/server.js.map +1 -0
- package/dist/split/shared.d.ts +6 -0
- package/dist/split/shared.d.ts.map +1 -0
- package/dist/split/shared.js +19 -0
- package/dist/split/shared.js.map +1 -0
- package/package.json +77 -3
- package/src/cache.ts +211 -0
- package/src/chatSource.ts +378 -0
- package/src/client.ts +46 -0
- package/src/contentRefs.ts +195 -0
- package/src/controller.ts +708 -0
- package/src/dataProvider.ts +141 -0
- package/src/index.ts +86 -0
- package/src/invoker.ts +14 -0
- package/src/invokers.ts +348 -0
- package/src/loomEffectProvider.ts +136 -0
- package/src/params.ts +314 -0
- package/src/path.ts +26 -0
- package/src/plan.ts +197 -0
- package/src/projection.ts +297 -0
- package/src/provider.ts +657 -0
- package/src/repair.ts +70 -0
- package/src/reshape.ts +193 -0
- package/src/restricted.ts +69 -0
- package/src/scheduler.ts +284 -0
- package/src/select.ts +59 -0
- package/src/shape.ts +39 -0
- package/src/split/client.ts +452 -0
- package/src/split/index.ts +18 -0
- package/src/split/server.ts +746 -0
- package/src/split/shared.ts +18 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { MCP_INVOKE_ERRORS } from "@loomwork/plugin-mcp";
|
|
2
|
+
import { SANDBOX_ERRORS } from "@loomwork/plugin-sandbox";
|
|
3
|
+
import { MAX_TREE_DEPTH, experienceHandles, handleKindsWithMedia, hasMediaTypeNodes, isChatKind, isMediaKind, mergeReadPolicy, treeDepth, } from "@loomwork/ui-core";
|
|
4
|
+
import { specFingerprint } from "../cache";
|
|
5
|
+
import { assertContentRefConfig, contentRefEnv, inspectContentRefs, principalScoped, } from "../contentRefs";
|
|
6
|
+
import { limitInvoker, memoInvoker } from "../invokers";
|
|
7
|
+
import { providerParams, relevantParams, snapshotParams } from "../params";
|
|
8
|
+
import { isReservedHandle } from "../projection";
|
|
9
|
+
import { executeProvider, outcomeResult } from "../provider";
|
|
10
|
+
import { partitionByViewer, restrictedFinding, snapshotViewer } from "../restricted";
|
|
11
|
+
import { tooDeep } from "../scheduler";
|
|
12
|
+
import { errorMessage, refuse, reservedFinding } from "./shared";
|
|
13
|
+
/**
|
|
14
|
+
* What a client may know about an experience's data plane: never a provider. Throws `TypeError`
|
|
15
|
+
* without a `revisionOf`, or when it returns a non-string, an empty string or the fingerprint.
|
|
16
|
+
*/
|
|
17
|
+
export function handleInventory(exp, opts) {
|
|
18
|
+
const revisionOf = opts?.revisionOf;
|
|
19
|
+
if (typeof revisionOf !== "function")
|
|
20
|
+
throw new TypeError("handleInventory: a revisionOf (a keyed hash) is required");
|
|
21
|
+
const findings = [];
|
|
22
|
+
const handles = [];
|
|
23
|
+
if (treeDepth(exp.root) > MAX_TREE_DEPTH) {
|
|
24
|
+
findings.push(tooDeep(exp.experienceId, MAX_TREE_DEPTH));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const split = partitionByViewer(experienceHandles(exp, opts.declaredToolClasses, opts.undeclared), snapshotViewer(opts.viewer, opts.audience));
|
|
28
|
+
findings.push(...split.advisory);
|
|
29
|
+
for (const use of split.allowed) {
|
|
30
|
+
if (isReservedHandle(use.handle)) {
|
|
31
|
+
findings.push(reservedFinding(use.handle));
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const spec = Object.hasOwn(exp.providers, use.handle) ? exp.providers[use.handle] : undefined;
|
|
35
|
+
if (spec === undefined) {
|
|
36
|
+
const f = {
|
|
37
|
+
code: "unknown-handle",
|
|
38
|
+
severity: "error",
|
|
39
|
+
message: `nodes ${use.nodeIds.join(", ")} bind "${use.handle}", which has no provider`,
|
|
40
|
+
};
|
|
41
|
+
findings.push(f);
|
|
42
|
+
handles.push({
|
|
43
|
+
handle: use.handle,
|
|
44
|
+
priority: use.priority,
|
|
45
|
+
params: [],
|
|
46
|
+
revision: "",
|
|
47
|
+
finding: f,
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
handles.push({
|
|
52
|
+
handle: use.handle,
|
|
53
|
+
priority: use.priority,
|
|
54
|
+
params: providerParams(spec),
|
|
55
|
+
revision: publicRevision(revisionOf, use.handle, spec),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
inventory: { experienceId: exp.experienceId, versionHash: exp.versionHash, handles },
|
|
61
|
+
findings,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function publicRevision(revisionOf, handle, spec) {
|
|
65
|
+
const fingerprint = specFingerprint(spec);
|
|
66
|
+
const revision = revisionOf(handle, fingerprint);
|
|
67
|
+
if (typeof revision !== "string" || revision === "")
|
|
68
|
+
throw new TypeError(`handleInventory: revisionOf returned ${revision === "" ? "an empty string" : `a ${typeof revision}`} for "${handle}"`);
|
|
69
|
+
if (revision.includes(fingerprint))
|
|
70
|
+
throw new TypeError(`handleInventory: revisionOf returned the provider fingerprint for "${handle}"; it must be keyed`);
|
|
71
|
+
return revision;
|
|
72
|
+
}
|
|
73
|
+
/** The most requests one `serveHandles` call serves by default (`ServeOptions.maxBatch`). */
|
|
74
|
+
export const DEFAULT_MAX_BATCH = 256;
|
|
75
|
+
/**
|
|
76
|
+
* The most transient calls one `serveHandles` batch has in flight by default
|
|
77
|
+
* (`ServeOptions.maxConcurrentCalls`): the batch is client-sized, so the server bounds its fan-out.
|
|
78
|
+
*/
|
|
79
|
+
export const DEFAULT_MAX_CONCURRENT_CALLS = 32;
|
|
80
|
+
/**
|
|
81
|
+
* The failure channels loom itself declares (ADR 0060) — `mcp.invoke`'s and the sandbox's, derived
|
|
82
|
+
* from loom's own exports so the list cannot drift. A `tool-<channel>` / `reshape-<channel>` code
|
|
83
|
+
* is built from whatever channel the (pluggable) invoker threw, which is arbitrary text; only
|
|
84
|
+
* these are served as they are.
|
|
85
|
+
*/
|
|
86
|
+
const TOOL_CHANNELS = new Set(Object.keys(MCP_INVOKE_ERRORS));
|
|
87
|
+
const RESHAPE_CHANNELS = new Set(Object.keys(SANDBOX_ERRORS));
|
|
88
|
+
/**
|
|
89
|
+
* Every other code a served finding may carry: the fixed codes hydration and the server mint
|
|
90
|
+
* themselves. Anything else is replaced (`load-failed` / `load-warning`) — the code is a fixed
|
|
91
|
+
* vocabulary, never text a provider or an invoker chose.
|
|
92
|
+
*/
|
|
93
|
+
const FIXED_CODES = new Set([
|
|
94
|
+
"tool-failed",
|
|
95
|
+
"tool-targetUnregistered",
|
|
96
|
+
"provider-kind-unregistered",
|
|
97
|
+
"reshape-failed",
|
|
98
|
+
"reshape-unregistered",
|
|
99
|
+
"schema-drift",
|
|
100
|
+
"schema-drift-proceeded",
|
|
101
|
+
"output-shape-drift",
|
|
102
|
+
"output-shape-unhashable",
|
|
103
|
+
"output-shape-unpinned",
|
|
104
|
+
"output-contract-drift",
|
|
105
|
+
"output-contract-missing",
|
|
106
|
+
"output-contract-unbound",
|
|
107
|
+
"param-not-overridable",
|
|
108
|
+
"param-templated",
|
|
109
|
+
"param-template-refused",
|
|
110
|
+
"invalid-params",
|
|
111
|
+
"invalid-time-token",
|
|
112
|
+
"argument-hook-failed",
|
|
113
|
+
"unresolved-step-reference",
|
|
114
|
+
"upstream-empty",
|
|
115
|
+
"dependency-failed",
|
|
116
|
+
"provider-failed",
|
|
117
|
+
"content-ref-refused",
|
|
118
|
+
"empty-graph",
|
|
119
|
+
"graph-cycle",
|
|
120
|
+
"aborted",
|
|
121
|
+
"invalid-request",
|
|
122
|
+
"version-mismatch",
|
|
123
|
+
"invalid-handle",
|
|
124
|
+
"unknown-handle",
|
|
125
|
+
"batch-too-large",
|
|
126
|
+
"tree-too-deep",
|
|
127
|
+
"hydration-internal",
|
|
128
|
+
]);
|
|
129
|
+
function publicCode(finding) {
|
|
130
|
+
const { code } = finding;
|
|
131
|
+
if (FIXED_CODES.has(code))
|
|
132
|
+
return code;
|
|
133
|
+
if (code.startsWith("tool-"))
|
|
134
|
+
return TOOL_CHANNELS.has(code.slice(5)) ? code : "tool-failed";
|
|
135
|
+
if (code.startsWith("reshape-"))
|
|
136
|
+
return RESHAPE_CHANNELS.has(code.slice(8)) ? code : "reshape-failed";
|
|
137
|
+
return finding.severity === "warn" ? "load-warning" : "load-failed";
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* What a client may be told about a finding: a fixed text keyed by its PUBLIC code. The fixed
|
|
141
|
+
* codes' own cases run FIRST, so one of them that happens to share a `tool-`/`reshape-` prefix
|
|
142
|
+
* with an allow-listed channel code (`reshape-unregistered`, a hydration-minted code, not a
|
|
143
|
+
* channel) gets its own text instead of the generic prefix fallback below.
|
|
144
|
+
*/
|
|
145
|
+
function publicText(code, severity) {
|
|
146
|
+
switch (code) {
|
|
147
|
+
case "schema-drift-proceeded":
|
|
148
|
+
return "input schema changed; served with the observed schema";
|
|
149
|
+
case "schema-drift":
|
|
150
|
+
return "input schema changed; waiting for a repair";
|
|
151
|
+
case "output-shape-drift":
|
|
152
|
+
case "output-shape-unhashable":
|
|
153
|
+
case "output-contract-drift":
|
|
154
|
+
return "the output no longer matches what it declares; waiting for a repair";
|
|
155
|
+
case "output-shape-unpinned":
|
|
156
|
+
return "the output is served unchecked";
|
|
157
|
+
case "output-contract-missing":
|
|
158
|
+
case "output-contract-unbound":
|
|
159
|
+
return "the output cannot be checked";
|
|
160
|
+
case "provider-kind-unregistered":
|
|
161
|
+
return "no data provider is registered for this view's source";
|
|
162
|
+
case "tool-targetUnregistered":
|
|
163
|
+
return "this view's source is not available";
|
|
164
|
+
case "reshape-unregistered":
|
|
165
|
+
return "the output could not be reshaped: the named reshaper is not registered";
|
|
166
|
+
case "upstream-empty":
|
|
167
|
+
return "no data for this view";
|
|
168
|
+
case "param-not-overridable":
|
|
169
|
+
return "a param was ignored";
|
|
170
|
+
case "invalid-params":
|
|
171
|
+
case "invalid-time-token":
|
|
172
|
+
return "the params were refused";
|
|
173
|
+
case "content-ref-refused":
|
|
174
|
+
return "a content-reference argument was refused";
|
|
175
|
+
case "aborted":
|
|
176
|
+
return "the load was aborted";
|
|
177
|
+
case "invalid-request":
|
|
178
|
+
return "the request is malformed";
|
|
179
|
+
case "version-mismatch":
|
|
180
|
+
return "the request is for another version of the experience";
|
|
181
|
+
case "invalid-handle":
|
|
182
|
+
return "the handle is reserved";
|
|
183
|
+
case "unknown-handle":
|
|
184
|
+
return "not a handle this experience binds";
|
|
185
|
+
case "batch-too-large":
|
|
186
|
+
return "the batch is too large";
|
|
187
|
+
case "tree-too-deep":
|
|
188
|
+
return "the experience cannot be served";
|
|
189
|
+
case "hydration-internal":
|
|
190
|
+
return "an internal error occurred";
|
|
191
|
+
}
|
|
192
|
+
if (code.startsWith("tool-"))
|
|
193
|
+
return "a tool call failed";
|
|
194
|
+
if (code.startsWith("reshape-"))
|
|
195
|
+
return "the output could not be reshaped";
|
|
196
|
+
return severity === "warn" ? "loaded with a warning" : "could not be loaded";
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The public form of a finding: `severity` kept; the code kept when it is one of the fixed codes
|
|
200
|
+
* or a loom-declared channel (otherwise the generic `tool-failed` / `reshape-failed` /
|
|
201
|
+
* `load-failed` / `load-warning`); the message a template keyed by that code, naming only the
|
|
202
|
+
* (client-supplied) handle — never a node, step, tool, script, hash, argument, channel or
|
|
203
|
+
* exception text.
|
|
204
|
+
*/
|
|
205
|
+
export function publicFinding(handle, finding) {
|
|
206
|
+
const code = publicCode(finding);
|
|
207
|
+
const text = publicText(code, finding.severity);
|
|
208
|
+
return {
|
|
209
|
+
code,
|
|
210
|
+
severity: finding.severity,
|
|
211
|
+
message: handle === undefined ? text : `handle ${JSON.stringify(handle.slice(0, 128))}: ${text}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/** Hands each finding to `onFinding` once, in full; a throwing hook is swallowed. */
|
|
215
|
+
function reporter(opts, handle) {
|
|
216
|
+
const seen = new Set();
|
|
217
|
+
const report = (finding) => {
|
|
218
|
+
if (seen.has(finding))
|
|
219
|
+
return;
|
|
220
|
+
seen.add(finding);
|
|
221
|
+
try {
|
|
222
|
+
const ret = opts.onFinding?.(handle, finding);
|
|
223
|
+
// An async hook's rejection is its own: never an unhandled rejection in the server.
|
|
224
|
+
if (ret !== null &&
|
|
225
|
+
typeof ret === "object" &&
|
|
226
|
+
typeof ret.then === "function")
|
|
227
|
+
Promise.resolve(ret).catch(() => { });
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// A logging hook must never change what the client is answered (nor, if its `then`
|
|
231
|
+
// getter throws, what the server does).
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
return Object.assign(report, {
|
|
235
|
+
silence: (finding) => {
|
|
236
|
+
seen.add(finding);
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/** Report the result's finding in full, and answer the client with its public form. */
|
|
241
|
+
function publicResult(handle, result, report) {
|
|
242
|
+
if (result.finding === undefined)
|
|
243
|
+
return result;
|
|
244
|
+
report(result.finding);
|
|
245
|
+
const finding = publicFinding(handle, result.finding);
|
|
246
|
+
return result.state === "ready"
|
|
247
|
+
? { state: "ready", value: result.value, finding }
|
|
248
|
+
: { state: result.state, finding };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* The server half of split hydration: answer a BATCH of handle loads for `exp` in one pass — one
|
|
252
|
+
* clock read (`opts.now`, else `Date.now()` once), one step memo in front of one call cap
|
|
253
|
+
* (`maxConcurrentCalls`, default 32), so identical steps across the batch's providers run once.
|
|
254
|
+
* The memo is keyed by principal too, and one call serves one principal (`opts.principal`), so
|
|
255
|
+
* two viewers never share a call. Every failure, a malformed request included, is a result, one per request
|
|
256
|
+
* in request order (a batch that is not a list gets one `invalid-request`) — and every finding a
|
|
257
|
+
* client receives is its PUBLIC form (`publicFinding`); the full one goes to `onFinding`. Rejects
|
|
258
|
+
* with `TypeError` only for a server misconfiguration (`maxBatch`, `maxConcurrentCalls`).
|
|
259
|
+
*/
|
|
260
|
+
export async function serveHandles(exp, requests, opts) {
|
|
261
|
+
// Server configuration, not client input: a bad bound is a programming error, and loud.
|
|
262
|
+
assertContentRefConfig(opts.contentRefArgs, "serveHandles");
|
|
263
|
+
const max = opts.maxBatch ?? DEFAULT_MAX_BATCH;
|
|
264
|
+
if (!Number.isInteger(max) || max < 1)
|
|
265
|
+
throw new TypeError(`serveHandles: maxBatch must be a positive integer, got ${String(max)}`);
|
|
266
|
+
const cap = opts.maxConcurrentCalls ?? DEFAULT_MAX_CONCURRENT_CALLS;
|
|
267
|
+
if (!Number.isInteger(cap) || cap < 1)
|
|
268
|
+
throw new TypeError(`serveHandles: maxConcurrentCalls must be a positive integer, got ${String(cap)}`);
|
|
269
|
+
const batch = reporter(opts, "");
|
|
270
|
+
if (!Array.isArray(requests))
|
|
271
|
+
return [
|
|
272
|
+
publicResult(undefined, refuse("invalid-request", "a batch load is a list of load requests"), batch),
|
|
273
|
+
];
|
|
274
|
+
if (requests.length > max) {
|
|
275
|
+
const tooMany = publicResult(undefined, refuse("batch-too-large", `a batch of ${requests.length} requests exceeds the bound of ${max}`), batch);
|
|
276
|
+
return requests.map(() => tooMany);
|
|
277
|
+
}
|
|
278
|
+
// Checked before anything walks the tree for handles or kinds.
|
|
279
|
+
if (treeDepth(exp.root) > MAX_TREE_DEPTH) {
|
|
280
|
+
const deep = publicResult(undefined, { state: "error", finding: tooDeep(exp.experienceId, MAX_TREE_DEPTH) }, batch);
|
|
281
|
+
return requests.map(() => deep);
|
|
282
|
+
}
|
|
283
|
+
let pass;
|
|
284
|
+
try {
|
|
285
|
+
pass = openPass(exp, opts);
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
const failed = publicResult(undefined, refuse("hydration-internal", errorMessage(e)), batch);
|
|
289
|
+
return requests.map(() => failed);
|
|
290
|
+
}
|
|
291
|
+
return Promise.all(requests.map(async (r) => {
|
|
292
|
+
// Snapshotted ONCE, inside a guard: a hostile getter or Proxy costs this request, not the
|
|
293
|
+
// batch. `experienceId`/`versionHash`/`handle` are primitives, captured by value right here.
|
|
294
|
+
// `params`, an object, is NOT safe by the same copy — a field holding a live reference can
|
|
295
|
+
// still answer a later read differently — so `serveOne` takes its own single deep-copy-and-
|
|
296
|
+
// validate pass over it (`snapshotParams`) before anything reads a key of it twice.
|
|
297
|
+
let snapshot;
|
|
298
|
+
try {
|
|
299
|
+
snapshot =
|
|
300
|
+
r !== null && typeof r === "object"
|
|
301
|
+
? {
|
|
302
|
+
experienceId: r.experienceId,
|
|
303
|
+
versionHash: r.versionHash,
|
|
304
|
+
handle: r.handle,
|
|
305
|
+
params: r.params,
|
|
306
|
+
}
|
|
307
|
+
: null;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
const report = reporter(opts, "");
|
|
311
|
+
return publicResult(undefined, refuse("invalid-request", "the request cannot be read"), report);
|
|
312
|
+
}
|
|
313
|
+
const handle = typeof snapshot?.handle === "string" ? snapshot.handle : undefined;
|
|
314
|
+
const report = reporter(opts, handle ?? "");
|
|
315
|
+
return publicResult(handle, await serveOne(exp, snapshot, opts, pass, report), report);
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Answer ONE handle load for `exp` — a batch of one (`serveHandles`). `opts.now` should be the
|
|
320
|
+
* server's clock: relative time is resolved here, never on the client.
|
|
321
|
+
*/
|
|
322
|
+
export async function serveHandle(exp, request, opts) {
|
|
323
|
+
const [result] = await serveHandles(exp, [request], opts);
|
|
324
|
+
return result ?? refuse("hydration-internal", "no result for the request");
|
|
325
|
+
}
|
|
326
|
+
function openPass(exp, opts) {
|
|
327
|
+
const { outputKinds, invoker, now, signal, principal } = opts;
|
|
328
|
+
const capped = limitInvoker(invoker, opts.maxConcurrentCalls ?? DEFAULT_MAX_CONCURRENT_CALLS);
|
|
329
|
+
const exec = {
|
|
330
|
+
// One memo per batch, in front of the cap: a memo hit never takes a slot.
|
|
331
|
+
invoker: memoInvoker(capped),
|
|
332
|
+
now: now ?? Date.now(),
|
|
333
|
+
...(signal !== undefined && { signal }),
|
|
334
|
+
...(principal !== undefined && { principal }),
|
|
335
|
+
...(opts.concurrency !== undefined && { concurrency: opts.concurrency }),
|
|
336
|
+
...(opts.captureSample !== undefined && { captureSample: opts.captureSample }),
|
|
337
|
+
...(opts.argumentHook !== undefined && { argumentHook: opts.argumentHook }),
|
|
338
|
+
...(opts.contentRefArgs !== "none" && { contentRefArgs: opts.contentRefArgs }),
|
|
339
|
+
...(opts.acceptContentRefParam !== undefined && {
|
|
340
|
+
acceptContentRefParam: opts.acceptContentRefParam,
|
|
341
|
+
}),
|
|
342
|
+
...(opts.inputDrift !== undefined && { inputDrift: opts.inputDrift }),
|
|
343
|
+
...(opts.reshapers !== undefined && { reshapers: opts.reshapers }),
|
|
344
|
+
...(opts.providers !== undefined && { providers: opts.providers }),
|
|
345
|
+
...(outputKinds?.catalog.valueContracts !== undefined && {
|
|
346
|
+
contracts: outputKinds.catalog.valueContracts,
|
|
347
|
+
}),
|
|
348
|
+
};
|
|
349
|
+
return {
|
|
350
|
+
exec,
|
|
351
|
+
// `bound` is handle-id collection only (no class read); `restricted` below takes the table.
|
|
352
|
+
bound: new Set(experienceHandles(exp).map((u) => u.handle)),
|
|
353
|
+
restricted: new Set(partitionByViewer(experienceHandles(exp, opts.declaredToolClasses, opts.undeclared), snapshotViewer(opts.viewer, opts.audience)).restricted.map((u) => u.handle)),
|
|
354
|
+
// U9: media-typed nodes mark their handle as media even with NO `outputKinds` (fail closed).
|
|
355
|
+
kinds: handleKindsWithMedia(exp, outputKinds?.catalog, outputKinds?.surface),
|
|
356
|
+
mediaWithoutKinds: outputKinds === undefined && hasMediaTypeNodes(exp),
|
|
357
|
+
refsUnguarded: opts.contentRefArgs === "none" && hasMediaTypeNodes(exp),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
async function serveOne(exp, request, opts, pass, report) {
|
|
361
|
+
try {
|
|
362
|
+
if (request === null || typeof request !== "object" || typeof request.handle !== "string")
|
|
363
|
+
return refuse("invalid-request", "a load request names a handle");
|
|
364
|
+
if (request.experienceId !== exp.experienceId || request.versionHash !== exp.versionHash)
|
|
365
|
+
return refuse("version-mismatch", `the request is for ${String(request.experienceId)}@${String(request.versionHash)}, not ${exp.experienceId}@${exp.versionHash}`);
|
|
366
|
+
const handle = request.handle;
|
|
367
|
+
if (isReservedHandle(handle))
|
|
368
|
+
return { state: "error", finding: reservedFinding(handle) };
|
|
369
|
+
// Checked first, before the provider is even looked up: a restricted handle is never loaded,
|
|
370
|
+
// cached or invoked, for any request, whatever its params.
|
|
371
|
+
if (pass.restricted.has(handle)) {
|
|
372
|
+
// The server's log gets the true reason ONCE; the client's answer is the public
|
|
373
|
+
// `unknown-handle`, which is silenced so it is not logged as a second, contradicting finding.
|
|
374
|
+
report(restrictedFinding());
|
|
375
|
+
const answer = refuse("unknown-handle", `"${handle}" is not a handle this experience binds`);
|
|
376
|
+
if (answer.finding !== undefined)
|
|
377
|
+
report.silence(answer.finding);
|
|
378
|
+
return answer;
|
|
379
|
+
}
|
|
380
|
+
// Only what a node binds is served: a provider no node binds is not the client's to ask for.
|
|
381
|
+
const declared = pass.bound.has(handle) && Object.hasOwn(exp.providers, handle)
|
|
382
|
+
? exp.providers[handle]
|
|
383
|
+
: undefined;
|
|
384
|
+
if (declared === undefined)
|
|
385
|
+
return refuse("unknown-handle", `"${handle}" is not a handle this experience binds`);
|
|
386
|
+
// U9: a handle feeding a media widget is ALWAYS contract-checked, whatever the provider
|
|
387
|
+
// declared (a shape pin passes inline bytes or a locator into a client payload and the cache).
|
|
388
|
+
const mediaBound = (pass.kinds.get(handle) ?? []).some((k) => isMediaKind(k) || isChatKind(k));
|
|
389
|
+
const spec = mediaBound && declared.outputCheck !== "contract"
|
|
390
|
+
? { ...declared, outputCheck: "contract" }
|
|
391
|
+
: declared;
|
|
392
|
+
if (mediaBound && pass.mediaWithoutKinds)
|
|
393
|
+
report({
|
|
394
|
+
code: "media-output-kinds-missing",
|
|
395
|
+
severity: "warn",
|
|
396
|
+
message: "the experience has media nodes and serve has no outputKinds: media handles are contract-checked by node type, but pass outputKinds so kinds resolve through the catalogue",
|
|
397
|
+
});
|
|
398
|
+
if (mediaBound && pass.refsUnguarded)
|
|
399
|
+
report({
|
|
400
|
+
code: "media-content-refs-unguarded",
|
|
401
|
+
severity: "warn",
|
|
402
|
+
message: 'the experience has media nodes and serve runs with contentRefArgs: "none": a content-reference tool argument is not checked; derive the table with contentRefArgsFrom(capabilities)',
|
|
403
|
+
});
|
|
404
|
+
// ONE deep-copy-and-validate pass over the request's params (`snapshotParams`): the result is
|
|
405
|
+
// plain, detached data with no accessor of its own, so `relevantParams`/`pickParams` below can
|
|
406
|
+
// never re-trigger a caller-supplied getter that answered differently than the check just did.
|
|
407
|
+
const snap = snapshotParams(request.params ?? {});
|
|
408
|
+
if (!snap.ok)
|
|
409
|
+
return { state: "error", finding: snap.finding };
|
|
410
|
+
const params = relevantParams(spec, snap.params);
|
|
411
|
+
// As in-process: only a contract provider's value is answerable to a kind.
|
|
412
|
+
const kinds = spec.outputCheck === "contract" ? (pass.kinds.get(handle) ?? []) : undefined;
|
|
413
|
+
const variant = kinds === undefined
|
|
414
|
+
? { params }
|
|
415
|
+
: {
|
|
416
|
+
params,
|
|
417
|
+
kinds,
|
|
418
|
+
...(pass.exec.contracts !== undefined && { contracts: pass.exec.contracts }),
|
|
419
|
+
};
|
|
420
|
+
// U9b: the content-reference guard (gate included) runs BEFORE the cache is consulted: a cached
|
|
421
|
+
// value was produced for an argument some principal's gate accepted once, and serving it to another
|
|
422
|
+
// principal, or after the host revoked it, would skip the gate. A refusal is not served from the
|
|
423
|
+
// cache (the load below refuses it); a param that fills a guarded argument is cached per principal.
|
|
424
|
+
const refs = pass.exec.contentRefArgs;
|
|
425
|
+
const verdict = refs === undefined
|
|
426
|
+
? undefined
|
|
427
|
+
: inspectContentRefs(spec, params, contentRefEnv(refs, spec, pass.exec.acceptContentRefParam, {
|
|
428
|
+
principalId: opts.principalId,
|
|
429
|
+
principal: pass.exec.principal,
|
|
430
|
+
}));
|
|
431
|
+
const cacheSpec = verdict?.paramFilled ? principalScoped(spec) : spec;
|
|
432
|
+
const hit = verdict?.refusal === undefined
|
|
433
|
+
? opts.cache?.get(cacheSpec, opts.principalId, variant)
|
|
434
|
+
: undefined;
|
|
435
|
+
if (hit)
|
|
436
|
+
return { state: "ready", value: hit.value };
|
|
437
|
+
const outcome = await executeProvider(spec, {
|
|
438
|
+
...pass.exec,
|
|
439
|
+
params,
|
|
440
|
+
...(opts.principalId !== undefined && { principalId: opts.principalId }),
|
|
441
|
+
...(kinds !== undefined && { kinds }),
|
|
442
|
+
});
|
|
443
|
+
for (const f of outcome.findings)
|
|
444
|
+
report(f);
|
|
445
|
+
if (!outcome.ok)
|
|
446
|
+
report(outcome.finding);
|
|
447
|
+
const drift = outcome.drift ?? [];
|
|
448
|
+
// Never cache a result that proceeded past an input drift (`report-and-proceed`): the key
|
|
449
|
+
// does not carry the drift mode, so a later request served under the default (`report`)
|
|
450
|
+
// would get it as a clean `ready` — no stale, no `onDrift`, no `onFinding`.
|
|
451
|
+
if (outcome.ok && drift.length === 0)
|
|
452
|
+
opts.cache?.set(cacheSpec, opts.principalId, outcome.value, variant);
|
|
453
|
+
if (drift.length > 0)
|
|
454
|
+
opts.onDrift?.({
|
|
455
|
+
experienceId: exp.experienceId,
|
|
456
|
+
versionHash: exp.versionHash,
|
|
457
|
+
handle,
|
|
458
|
+
spec,
|
|
459
|
+
drift,
|
|
460
|
+
findings: outcome.findings,
|
|
461
|
+
// Only a PROCEEDED input drift reaches here beside a delivered answer — a value, or an
|
|
462
|
+
// `empty` one (the retried upstream answered with no rows). `empty` itself is never drift.
|
|
463
|
+
proceeded: outcome.ok || outcome.finding.code === "upstream-empty",
|
|
464
|
+
});
|
|
465
|
+
return outcomeResult(outcome);
|
|
466
|
+
}
|
|
467
|
+
catch (e) {
|
|
468
|
+
return refuse("hydration-internal", errorMessage(e));
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
export function createServeSurface(policy = {}) {
|
|
472
|
+
const bound = mergeReadPolicy(policy);
|
|
473
|
+
const joined = (opts) => {
|
|
474
|
+
const m = mergeReadPolicy(bound, opts);
|
|
475
|
+
return {
|
|
476
|
+
...opts,
|
|
477
|
+
...(m.declaredToolClasses !== undefined && { declaredToolClasses: m.declaredToolClasses }),
|
|
478
|
+
...(m.undeclared !== undefined && { undeclared: m.undeclared }),
|
|
479
|
+
};
|
|
480
|
+
};
|
|
481
|
+
return {
|
|
482
|
+
policy: bound,
|
|
483
|
+
handleInventory: (exp, opts) => handleInventory(exp, joined(opts)),
|
|
484
|
+
serveHandles: (exp, requests, opts) => serveHandles(exp, requests, joined(opts)),
|
|
485
|
+
serveHandle: (exp, request, opts) => serveHandle(exp, request, joined(opts)),
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/split/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// What both halves of split hydration mint: kept free of any server import, so the client half
|
|
2
|
+
// (`./client`) stays browser-safe.
|
|
3
|
+
export const reservedFinding = (handle) => ({
|
|
4
|
+
code: "invalid-handle",
|
|
5
|
+
severity: "error",
|
|
6
|
+
message: `handle "${handle}" is reserved`,
|
|
7
|
+
});
|
|
8
|
+
export const refuse = (code, message) => ({
|
|
9
|
+
state: "error",
|
|
10
|
+
finding: { code, severity: "error", message },
|
|
11
|
+
});
|
|
12
|
+
export const errorMessage = (e) => (e instanceof Error ? e.message : String(e));
|
|
13
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/split/shared.ts"],"names":[],"mappings":"AAGA,+FAA+F;AAC/F,mCAAmC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,WAAW,MAAM,eAAe;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAoB,EAAE,CAAC,CAAC;IAC1E,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { HYDRATION_PROJECTION_ID, HYDRATION_PROJECTION_VERSION, HYDRATION_SET_EVENT, HydrationAudienceMismatchError, HydrationScopeError, HydrationStore, hydrationProjection, isReservedHandle, } from "./projection";
|
|
2
|
+
export type { HandleSlice, HandleState, HandleStatus, HydrationScope, HydrationState, } from "./projection";
|
|
3
|
+
export type { TransientInvoker } from "./invoker";
|
|
4
|
+
export { limitInvoker, memoInvoker, signalInvoker } from "./invokers";
|
|
5
|
+
export { defineReshapers, jsonPathSelect, outputShapeHashOf } from "./reshape";
|
|
6
|
+
export type { ReshapeFailureKind, ReshapeResult, Reshaper, ReshaperRegistry } from "./reshape";
|
|
7
|
+
export { DEFAULT_TIME_RANGE, checkParams } from "./params";
|
|
8
|
+
export { ContentRefConfigError } from "./contentRefs";
|
|
9
|
+
export type { ContentRefParamGate } from "./contentRefs";
|
|
10
|
+
export type { ArgumentHook, ArgumentHookContext, LoadParams, } from "./params";
|
|
11
|
+
export { DEFAULT_DATA_PROVIDERS, checkDataProviderConformance, defineDataProviders, mcpProvider, } from "./dataProvider";
|
|
12
|
+
export type { DataProvider, DataProviderCall, DataProviderRegistry } from "./dataProvider";
|
|
13
|
+
export { LOOM_EFFECT_KIND, TARGET_FAILED, TARGET_UNREGISTERED, effectPin, loomEffectProvider, } from "./loomEffectProvider";
|
|
14
|
+
export type { EffectEntry, EffectInputSchema, LoomEffectProviderOptions, } from "./loomEffectProvider";
|
|
15
|
+
export { executeProvider } from "./provider";
|
|
16
|
+
export { stepReferences, terminalSteps, topoWaves } from "./plan";
|
|
17
|
+
export type { DriftRecord, ExecuteOptions, InputDriftMode, ProviderOutcome } from "./provider";
|
|
18
|
+
export { DEFAULT_CACHE_MAX_ENTRIES, HydrationCache } from "./cache";
|
|
19
|
+
export type { CacheVariant, HydrationCacheOptions } from "./cache";
|
|
20
|
+
export type { HandleLoadResult } from "./scheduler";
|
|
21
|
+
export { HydrationController } from "./controller";
|
|
22
|
+
export type { ControllerOptions, DriftReport } from "./controller";
|
|
23
|
+
export { DEFAULT_MAX_BATCH, DEFAULT_MAX_CONCURRENT_CALLS, SplitHydrationController, createServeSurface, handleInventory, publicFinding, serveHandle, serveHandles, } from "./split/index";
|
|
24
|
+
export type { HandleInventory, HandleLoadRequest, HandleLoader, HandleRef, InventoryOptions, RevisionFn, ServeOptions, ServeSurface, SplitControllerOptions, } from "./split/index";
|
|
25
|
+
export { SCHEMA_REPAIRED, remapOperation } from "./repair";
|
|
26
|
+
export type { SchemaRepairedPayload } from "./repair";
|
|
27
|
+
export { connectConversation, publishChat } from "./chatSource";
|
|
28
|
+
export type { ConversationConnection, ConversationConnectionOptions, EventSourceLike, FetchResponseLike, } from "./chatSource";
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,mBAAmB,EACnB,8BAA8B,EAC9B,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,UAAU,GACX,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.publishChat = exports.connectConversation = exports.remapOperation = exports.SCHEMA_REPAIRED = exports.serveHandles = exports.serveHandle = exports.publicFinding = exports.handleInventory = exports.createServeSurface = exports.SplitHydrationController = exports.DEFAULT_MAX_CONCURRENT_CALLS = exports.DEFAULT_MAX_BATCH = exports.HydrationController = exports.HydrationCache = exports.DEFAULT_CACHE_MAX_ENTRIES = exports.topoWaves = exports.terminalSteps = exports.stepReferences = exports.executeProvider = exports.loomEffectProvider = exports.effectPin = exports.TARGET_UNREGISTERED = exports.TARGET_FAILED = exports.LOOM_EFFECT_KIND = exports.mcpProvider = exports.defineDataProviders = exports.checkDataProviderConformance = exports.DEFAULT_DATA_PROVIDERS = exports.ContentRefConfigError = exports.checkParams = exports.DEFAULT_TIME_RANGE = exports.outputShapeHashOf = exports.jsonPathSelect = exports.defineReshapers = exports.signalInvoker = exports.memoInvoker = exports.limitInvoker = exports.isReservedHandle = exports.hydrationProjection = exports.HydrationStore = exports.HydrationScopeError = exports.HydrationAudienceMismatchError = exports.HYDRATION_SET_EVENT = exports.HYDRATION_PROJECTION_VERSION = exports.HYDRATION_PROJECTION_ID = void 0;
|
|
4
|
+
var projection_1 = require("./projection");
|
|
5
|
+
Object.defineProperty(exports, "HYDRATION_PROJECTION_ID", { enumerable: true, get: function () { return projection_1.HYDRATION_PROJECTION_ID; } });
|
|
6
|
+
Object.defineProperty(exports, "HYDRATION_PROJECTION_VERSION", { enumerable: true, get: function () { return projection_1.HYDRATION_PROJECTION_VERSION; } });
|
|
7
|
+
Object.defineProperty(exports, "HYDRATION_SET_EVENT", { enumerable: true, get: function () { return projection_1.HYDRATION_SET_EVENT; } });
|
|
8
|
+
Object.defineProperty(exports, "HydrationAudienceMismatchError", { enumerable: true, get: function () { return projection_1.HydrationAudienceMismatchError; } });
|
|
9
|
+
Object.defineProperty(exports, "HydrationScopeError", { enumerable: true, get: function () { return projection_1.HydrationScopeError; } });
|
|
10
|
+
Object.defineProperty(exports, "HydrationStore", { enumerable: true, get: function () { return projection_1.HydrationStore; } });
|
|
11
|
+
Object.defineProperty(exports, "hydrationProjection", { enumerable: true, get: function () { return projection_1.hydrationProjection; } });
|
|
12
|
+
Object.defineProperty(exports, "isReservedHandle", { enumerable: true, get: function () { return projection_1.isReservedHandle; } });
|
|
13
|
+
var invokers_1 = require("./invokers");
|
|
14
|
+
Object.defineProperty(exports, "limitInvoker", { enumerable: true, get: function () { return invokers_1.limitInvoker; } });
|
|
15
|
+
Object.defineProperty(exports, "memoInvoker", { enumerable: true, get: function () { return invokers_1.memoInvoker; } });
|
|
16
|
+
Object.defineProperty(exports, "signalInvoker", { enumerable: true, get: function () { return invokers_1.signalInvoker; } });
|
|
17
|
+
var reshape_1 = require("./reshape");
|
|
18
|
+
Object.defineProperty(exports, "defineReshapers", { enumerable: true, get: function () { return reshape_1.defineReshapers; } });
|
|
19
|
+
Object.defineProperty(exports, "jsonPathSelect", { enumerable: true, get: function () { return reshape_1.jsonPathSelect; } });
|
|
20
|
+
Object.defineProperty(exports, "outputShapeHashOf", { enumerable: true, get: function () { return reshape_1.outputShapeHashOf; } });
|
|
21
|
+
var params_1 = require("./params");
|
|
22
|
+
Object.defineProperty(exports, "DEFAULT_TIME_RANGE", { enumerable: true, get: function () { return params_1.DEFAULT_TIME_RANGE; } });
|
|
23
|
+
Object.defineProperty(exports, "checkParams", { enumerable: true, get: function () { return params_1.checkParams; } });
|
|
24
|
+
var contentRefs_1 = require("./contentRefs");
|
|
25
|
+
Object.defineProperty(exports, "ContentRefConfigError", { enumerable: true, get: function () { return contentRefs_1.ContentRefConfigError; } });
|
|
26
|
+
var dataProvider_1 = require("./dataProvider");
|
|
27
|
+
Object.defineProperty(exports, "DEFAULT_DATA_PROVIDERS", { enumerable: true, get: function () { return dataProvider_1.DEFAULT_DATA_PROVIDERS; } });
|
|
28
|
+
Object.defineProperty(exports, "checkDataProviderConformance", { enumerable: true, get: function () { return dataProvider_1.checkDataProviderConformance; } });
|
|
29
|
+
Object.defineProperty(exports, "defineDataProviders", { enumerable: true, get: function () { return dataProvider_1.defineDataProviders; } });
|
|
30
|
+
Object.defineProperty(exports, "mcpProvider", { enumerable: true, get: function () { return dataProvider_1.mcpProvider; } });
|
|
31
|
+
var loomEffectProvider_1 = require("./loomEffectProvider");
|
|
32
|
+
Object.defineProperty(exports, "LOOM_EFFECT_KIND", { enumerable: true, get: function () { return loomEffectProvider_1.LOOM_EFFECT_KIND; } });
|
|
33
|
+
Object.defineProperty(exports, "TARGET_FAILED", { enumerable: true, get: function () { return loomEffectProvider_1.TARGET_FAILED; } });
|
|
34
|
+
Object.defineProperty(exports, "TARGET_UNREGISTERED", { enumerable: true, get: function () { return loomEffectProvider_1.TARGET_UNREGISTERED; } });
|
|
35
|
+
Object.defineProperty(exports, "effectPin", { enumerable: true, get: function () { return loomEffectProvider_1.effectPin; } });
|
|
36
|
+
Object.defineProperty(exports, "loomEffectProvider", { enumerable: true, get: function () { return loomEffectProvider_1.loomEffectProvider; } });
|
|
37
|
+
var provider_1 = require("./provider");
|
|
38
|
+
Object.defineProperty(exports, "executeProvider", { enumerable: true, get: function () { return provider_1.executeProvider; } });
|
|
39
|
+
var plan_1 = require("./plan");
|
|
40
|
+
Object.defineProperty(exports, "stepReferences", { enumerable: true, get: function () { return plan_1.stepReferences; } });
|
|
41
|
+
Object.defineProperty(exports, "terminalSteps", { enumerable: true, get: function () { return plan_1.terminalSteps; } });
|
|
42
|
+
Object.defineProperty(exports, "topoWaves", { enumerable: true, get: function () { return plan_1.topoWaves; } });
|
|
43
|
+
var cache_1 = require("./cache");
|
|
44
|
+
Object.defineProperty(exports, "DEFAULT_CACHE_MAX_ENTRIES", { enumerable: true, get: function () { return cache_1.DEFAULT_CACHE_MAX_ENTRIES; } });
|
|
45
|
+
Object.defineProperty(exports, "HydrationCache", { enumerable: true, get: function () { return cache_1.HydrationCache; } });
|
|
46
|
+
var controller_1 = require("./controller");
|
|
47
|
+
Object.defineProperty(exports, "HydrationController", { enumerable: true, get: function () { return controller_1.HydrationController; } });
|
|
48
|
+
var index_1 = require("./split/index");
|
|
49
|
+
Object.defineProperty(exports, "DEFAULT_MAX_BATCH", { enumerable: true, get: function () { return index_1.DEFAULT_MAX_BATCH; } });
|
|
50
|
+
Object.defineProperty(exports, "DEFAULT_MAX_CONCURRENT_CALLS", { enumerable: true, get: function () { return index_1.DEFAULT_MAX_CONCURRENT_CALLS; } });
|
|
51
|
+
Object.defineProperty(exports, "SplitHydrationController", { enumerable: true, get: function () { return index_1.SplitHydrationController; } });
|
|
52
|
+
Object.defineProperty(exports, "createServeSurface", { enumerable: true, get: function () { return index_1.createServeSurface; } });
|
|
53
|
+
Object.defineProperty(exports, "handleInventory", { enumerable: true, get: function () { return index_1.handleInventory; } });
|
|
54
|
+
Object.defineProperty(exports, "publicFinding", { enumerable: true, get: function () { return index_1.publicFinding; } });
|
|
55
|
+
Object.defineProperty(exports, "serveHandle", { enumerable: true, get: function () { return index_1.serveHandle; } });
|
|
56
|
+
Object.defineProperty(exports, "serveHandles", { enumerable: true, get: function () { return index_1.serveHandles; } });
|
|
57
|
+
var repair_1 = require("./repair");
|
|
58
|
+
Object.defineProperty(exports, "SCHEMA_REPAIRED", { enumerable: true, get: function () { return repair_1.SCHEMA_REPAIRED; } });
|
|
59
|
+
Object.defineProperty(exports, "remapOperation", { enumerable: true, get: function () { return repair_1.remapOperation; } });
|
|
60
|
+
var chatSource_1 = require("./chatSource");
|
|
61
|
+
Object.defineProperty(exports, "connectConversation", { enumerable: true, get: function () { return chatSource_1.connectConversation; } });
|
|
62
|
+
Object.defineProperty(exports, "publishChat", { enumerable: true, get: function () { return chatSource_1.publishChat; } });
|
|
63
|
+
//# sourceMappingURL=index.js.map
|