@superbee/core 0.2.0-pre.16 → 0.2.0-pre.17

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 (109) hide show
  1. package/README.md +107 -4
  2. package/dist/bundle-health/index.d.ts +14 -0
  3. package/dist/bundle-health/index.d.ts.map +1 -0
  4. package/dist/bundle-health/index.js +12 -0
  5. package/dist/bundle-health/index.js.map +1 -0
  6. package/dist/bundle-health/kind-findings.d.ts +44 -0
  7. package/dist/bundle-health/kind-findings.d.ts.map +1 -0
  8. package/dist/bundle-health/kind-findings.js +68 -0
  9. package/dist/bundle-health/kind-findings.js.map +1 -0
  10. package/dist/bundle-health/legacy-page.d.ts +39 -0
  11. package/dist/bundle-health/legacy-page.d.ts.map +1 -0
  12. package/dist/bundle-health/legacy-page.js +50 -0
  13. package/dist/bundle-health/legacy-page.js.map +1 -0
  14. package/dist/bundle-health/report.d.ts +202 -0
  15. package/dist/bundle-health/report.d.ts.map +1 -0
  16. package/dist/bundle-health/report.js +438 -0
  17. package/dist/bundle-health/report.js.map +1 -0
  18. package/dist/hosted-client/write.d.ts +10 -1
  19. package/dist/hosted-client/write.d.ts.map +1 -1
  20. package/dist/hosted-client/write.js +9 -4
  21. package/dist/hosted-client/write.js.map +1 -1
  22. package/dist/hosted-transport/answer-rows.d.ts +3 -2
  23. package/dist/hosted-transport/answer-rows.d.ts.map +1 -1
  24. package/dist/hosted-transport/answer-rows.js +1 -1
  25. package/dist/hosted-transport/answer-rows.js.map +1 -1
  26. package/dist/hosted-transport/whole-document-transport.d.ts +1 -1
  27. package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -1
  28. package/dist/hosted-transport/whole-document-transport.js +20 -12
  29. package/dist/hosted-transport/whole-document-transport.js.map +1 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/kinds-load.js +4 -4
  35. package/dist/kinds-load.js.map +1 -1
  36. package/dist/kinds.d.ts.map +1 -1
  37. package/dist/kinds.js +3 -2
  38. package/dist/kinds.js.map +1 -1
  39. package/dist/paths.d.ts +16 -0
  40. package/dist/paths.d.ts.map +1 -1
  41. package/dist/paths.js +25 -0
  42. package/dist/paths.js.map +1 -1
  43. package/dist/query-filter.d.ts +9 -0
  44. package/dist/query-filter.d.ts.map +1 -1
  45. package/dist/query-filter.js +19 -3
  46. package/dist/query-filter.js.map +1 -1
  47. package/dist/record-overlay/apply.d.ts +43 -0
  48. package/dist/record-overlay/apply.d.ts.map +1 -0
  49. package/dist/record-overlay/apply.js +490 -0
  50. package/dist/record-overlay/apply.js.map +1 -0
  51. package/dist/record-overlay/canonical.d.ts +14 -0
  52. package/dist/record-overlay/canonical.d.ts.map +1 -0
  53. package/dist/record-overlay/canonical.js +31 -0
  54. package/dist/record-overlay/canonical.js.map +1 -0
  55. package/dist/record-overlay/digest.d.ts +4 -0
  56. package/dist/record-overlay/digest.d.ts.map +1 -0
  57. package/dist/record-overlay/digest.js +11 -0
  58. package/dist/record-overlay/digest.js.map +1 -0
  59. package/dist/record-overlay/errors.d.ts +40 -0
  60. package/dist/record-overlay/errors.d.ts.map +1 -0
  61. package/dist/record-overlay/errors.js +51 -0
  62. package/dist/record-overlay/errors.js.map +1 -0
  63. package/dist/record-overlay/findings.d.ts +5 -0
  64. package/dist/record-overlay/findings.d.ts.map +1 -0
  65. package/dist/record-overlay/findings.js +83 -0
  66. package/dist/record-overlay/findings.js.map +1 -0
  67. package/dist/record-overlay/index.d.ts +23 -0
  68. package/dist/record-overlay/index.d.ts.map +1 -0
  69. package/dist/record-overlay/index.js +21 -0
  70. package/dist/record-overlay/index.js.map +1 -0
  71. package/dist/record-overlay/plan.d.ts +12 -0
  72. package/dist/record-overlay/plan.d.ts.map +1 -0
  73. package/dist/record-overlay/plan.js +284 -0
  74. package/dist/record-overlay/plan.js.map +1 -0
  75. package/dist/record-overlay/policy.d.ts +60 -0
  76. package/dist/record-overlay/policy.d.ts.map +1 -0
  77. package/dist/record-overlay/policy.js +209 -0
  78. package/dist/record-overlay/policy.js.map +1 -0
  79. package/dist/record-overlay/redact.d.ts +3 -0
  80. package/dist/record-overlay/redact.d.ts.map +1 -0
  81. package/dist/record-overlay/redact.js +27 -0
  82. package/dist/record-overlay/redact.js.map +1 -0
  83. package/dist/record-overlay/signal-kind.d.ts +30 -0
  84. package/dist/record-overlay/signal-kind.d.ts.map +1 -0
  85. package/dist/record-overlay/signal-kind.js +38 -0
  86. package/dist/record-overlay/signal-kind.js.map +1 -0
  87. package/dist/record-overlay/signal-text.d.ts +45 -0
  88. package/dist/record-overlay/signal-text.d.ts.map +1 -0
  89. package/dist/record-overlay/signal-text.js +116 -0
  90. package/dist/record-overlay/signal-text.js.map +1 -0
  91. package/dist/record-overlay/source-index.d.ts +19 -0
  92. package/dist/record-overlay/source-index.d.ts.map +1 -0
  93. package/dist/record-overlay/source-index.js +102 -0
  94. package/dist/record-overlay/source-index.js.map +1 -0
  95. package/dist/record-overlay/types.d.ts +286 -0
  96. package/dist/record-overlay/types.d.ts.map +1 -0
  97. package/dist/record-overlay/types.js +2 -0
  98. package/dist/record-overlay/types.js.map +1 -0
  99. package/dist/remote-operations.js +5 -2
  100. package/dist/remote-operations.js.map +1 -1
  101. package/dist/storage.d.ts +2 -1
  102. package/dist/storage.d.ts.map +1 -1
  103. package/dist/storage.js +1 -1
  104. package/dist/storage.js.map +1 -1
  105. package/dist/uncertain-write.d.ts +39 -6
  106. package/dist/uncertain-write.d.ts.map +1 -1
  107. package/dist/uncertain-write.js +25 -3
  108. package/dist/uncertain-write.js.map +1 -1
  109. package/package.json +9 -1
@@ -0,0 +1,490 @@
1
+ /**
2
+ * Apply a plan. Every write goes through `mutateDocument`, and every write step carries a guard
3
+ * that core builds itself and runs through `assertCandidate` on the fresh read, so the check and
4
+ * the compare-and-swap commit or refuse together:
5
+ *
6
+ * - `apply-owned-fields`: the ownership guard admits only owned and derived fields (and, in the
7
+ * grouped shape, the record's own `sources` entry), never the body, and requires the identity;
8
+ * - `create-signal`: the Signal create guard admits only a new document of the attention Kind,
9
+ * under its path, with a fixed key set and the claim state `todo`;
10
+ * - `collapse-signal`: the Signal update guard admits only an existing attention Kind document,
11
+ * a fixed key set and one appended observation line.
12
+ *
13
+ * Nothing else is ever created, and nothing is ever deleted.
14
+ */
15
+ import { readBundleOkfVersion } from "../bundle-ops.js";
16
+ import { containsCollection, FieldActionError, prepareDocumentFieldAction, } from "../document-field-actions.js";
17
+ import { DocumentNotFoundError, KindConformanceError, mutateDocument, } from "../document-mutation.js";
18
+ import { PreconditionFailed } from "../document-precondition.js";
19
+ import { InvalidInputError } from "../errors.js";
20
+ import { isManagedDocumentMetadataField } from "../managed-document-metadata.js";
21
+ import { okfValuesEqual } from "../okf-authored-values.js";
22
+ import { assertSafeConceptId } from "../paths.js";
23
+ import { isOkfActor } from "../okf-actor.js";
24
+ import { hasSourceIdentity, matchesSourceIdentity } from "../query-filter.js";
25
+ import { VersionConflict } from "../versioning.js";
26
+ import { same } from "./canonical.js";
27
+ import { CORE_VALUE_CODES, OverlayRefusal, REFUSAL_CODES } from "./errors.js";
28
+ import { NEVER_OWNED, workStateFields } from "./policy.js";
29
+ import { redactUrl } from "./redact.js";
30
+ import { resolveAttentionKind } from "./signal-kind.js";
31
+ import { isPlannedObservation, isPlannedSignalBody, signalLinkTexts } from "./signal-text.js";
32
+ const STEP_OPS = new Set(["apply-owned-fields", "create-signal", "collapse-signal", "signal-duplicate", "record-only"]);
33
+ function record(value) {
34
+ return value !== null && typeof value === "object" && !Array.isArray(value);
35
+ }
36
+ /**
37
+ * The owned and derived lists may never name a never-owned field, core's managed metadata, or the
38
+ * target's work state (the progress storage fields always; the target Kind's claim fields when known).
39
+ */
40
+ function assertAdmissibleFields(ownedFields, derivedFields, workState = workStateFields(undefined, [])) {
41
+ for (const [list, name] of [[ownedFields, "owned_fields"], [derivedFields, "deriveFields.fields"]]) {
42
+ if (list.some((field) => typeof field !== "string")) {
43
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${name} must be a list of field names`, { list: name });
44
+ }
45
+ const bad = list.filter((field) => NEVER_OWNED.has(field) || isManagedDocumentMetadataField(field) || workState.has(field));
46
+ if (bad.length) {
47
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${name} names fields a feed can never own: ${bad.join(", ")}`, { list: name, fields: bad });
48
+ }
49
+ }
50
+ }
51
+ /**
52
+ * In the grouped shape `sources` may change only by the step's own upsert: the fresh list carries
53
+ * (provider, external id) exactly once, removing that position from both lists leaves two equal
54
+ * lists, and the candidate's entry there is the fresh entry merged with the step's properties and
55
+ * nothing else. A moved, duplicated or added identity entry leaves the remainders unequal.
56
+ */
57
+ function sourcesUpsertOnly(fresh, next, provider, externalId, properties) {
58
+ if (!Array.isArray(fresh) || !Array.isArray(next))
59
+ return false;
60
+ const identity = { resource: provider, id: externalId };
61
+ const at = fresh.flatMap((row, index) => (matchesSourceIdentity(row, identity) ? [index] : []));
62
+ if (at.length !== 1)
63
+ return false;
64
+ const index = at[0];
65
+ const rest = (rows) => rows.filter((_, i) => i !== index);
66
+ return same(rest(fresh), rest(next)) && same(next[index], { ...fresh[index], ...properties, ...identity });
67
+ }
68
+ /**
69
+ * The ownership guard: refuse any candidate that differs from the fresh document outside the
70
+ * admitted fields (`FIELD_NOT_OWNED`), whose fresh read lost the provider identity
71
+ * (`OVERLAY_IDENTITY_LOST`), or whose owned field no longer holds the value the plan was decided
72
+ * against (`OVERLAY_DOC_CONFLICT`). Synchronous. Refuses at construction (`POLICY_INVALID`) when
73
+ * a list names a never-owned field or managed metadata.
74
+ */
75
+ export function ownershipGuard(o) {
76
+ const { ownedFields, provider, externalId, expectedFrom = {}, derivedFields = [], sourceProperties, targetKind } = o;
77
+ assertAdmissibleFields(ownedFields, derivedFields);
78
+ const admitted = new Set([...ownedFields, ...derivedFields]);
79
+ return (existing, candidate) => {
80
+ if (!existing)
81
+ throw new OverlayRefusal(REFUSAL_CODES.OVERLAY_IDENTITY_LOST, "overlay document no longer exists", { external_id: externalId });
82
+ if (targetKind !== undefined && existing.frontmatter.type !== targetKind) {
83
+ throw new OverlayRefusal(REFUSAL_CODES.FIELD_NOT_OWNED, `owned-field writes reach ${targetKind} documents only`, { field: "type", external_id: externalId });
84
+ }
85
+ const before = existing.frontmatter;
86
+ const after = candidate.frontmatter;
87
+ const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
88
+ const touched = [...keys].filter((k) => !same(before[k], after[k]));
89
+ const notOwned = touched.filter((k) => !admitted.has(k)
90
+ && !(k === "sources" && sourceProperties !== undefined && sourcesUpsertOnly(before.sources, after.sources, provider, externalId, sourceProperties)));
91
+ if (candidate.body !== existing.body)
92
+ notOwned.push("(body)");
93
+ if (notOwned.length)
94
+ throw new OverlayRefusal(REFUSAL_CODES.FIELD_NOT_OWNED, `write would change non-owned fields: ${notOwned.join(", ")}`, { fields: notOwned, external_id: externalId });
95
+ if (!hasSourceIdentity(before.sources, { resource: provider, id: externalId })) {
96
+ throw new OverlayRefusal(REFUSAL_CODES.OVERLAY_IDENTITY_LOST, "document no longer carries the provider identity", { external_id: externalId });
97
+ }
98
+ for (const [f, from] of Object.entries(expectedFrom)) {
99
+ if (!same(before[f], from))
100
+ throw new OverlayRefusal(REFUSAL_CODES.OVERLAY_DOC_CONFLICT, `owned field ${f} changed since planning`, { field: f, external_id: externalId });
101
+ }
102
+ };
103
+ }
104
+ /** Run every guard in order on the same fresh read; the first refusal wins. Synchronous guards stay synchronous. */
105
+ export function composeGuards(...guards) {
106
+ const list = guards.filter((guard) => typeof guard === "function");
107
+ return (existing, candidate) => {
108
+ const run = (from) => {
109
+ for (let i = from; i < list.length; i++) {
110
+ const outcome = list[i](existing, candidate);
111
+ if (outcome && typeof outcome.then === "function")
112
+ return outcome.then(() => run(i + 1));
113
+ }
114
+ };
115
+ return run(0);
116
+ };
117
+ }
118
+ function notOwned(message, details = {}) {
119
+ return new OverlayRefusal(REFUSAL_CODES.FIELD_NOT_OWNED, message, details);
120
+ }
121
+ /**
122
+ * Signal text that is not this rendering of the Signal's own fields is held, not dropped: a plan
123
+ * the planner made always matches, and a mismatch is refused visibly and planned again next run.
124
+ */
125
+ function textNotPlanned() {
126
+ return new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "Signal text is not the planned rendering of its fields", { reason: "signal-text-not-planned", field: "(body)" });
127
+ }
128
+ /**
129
+ * The Signal create guard: a new attention Kind document under its path, fixed keys, state `todo`.
130
+ * Exported for this package's tests only; the subpath entry does not re-export it.
131
+ */
132
+ export function signalCreateGuard(attention, step, run) {
133
+ return (_existing, candidate) => {
134
+ if (!attention.ok)
135
+ throw notOwned(`record-overlay creates documents of an attention Kind only: ${attention.reason}`, { external_id: step.external_id });
136
+ const { name, prefix, stateField } = attention.value;
137
+ if (!step.target.startsWith(prefix))
138
+ throw notOwned(`create-signal target is outside ${prefix}`, { external_id: step.external_id });
139
+ const fm = candidate.frontmatter;
140
+ if (fm.type !== name)
141
+ throw notOwned(`record-overlay may only create ${name} documents`, { external_id: step.external_id });
142
+ const allowed = new Set(["type", "title", stateField, "change_kind", "observed_at", "provider", "external_id", "diff_summary", "priority", "about_doc", "sources", "content_digest", "expires_at"]);
143
+ const outside = Object.keys(fm).filter((key) => !allowed.has(key));
144
+ if (outside.length)
145
+ throw notOwned(`create-signal would write fields outside the attention record: ${outside.join(", ")}`, { fields: outside, external_id: step.external_id });
146
+ if (fm[stateField] !== "todo")
147
+ throw notOwned(`create-signal must create an unclaimed ${name} (${stateField}: todo)`, { field: stateField, external_id: step.external_id });
148
+ if (!Array.isArray(fm.sources) || !fm.sources.every((entry) => record(entry) && typeof entry.resource === "string")) {
149
+ throw notOwned("create-signal sources must be a list of entries naming a resource", { field: "sources", external_id: step.external_id });
150
+ }
151
+ if (fm.provider !== redactUrl(run.provider))
152
+ throw notOwned("create-signal must name the run's provider", { field: "provider", external_id: step.external_id });
153
+ if (fm.external_id !== step.external_id)
154
+ throw notOwned("create-signal must name the step's record", { field: "external_id", external_id: step.external_id });
155
+ const context = { target: step.target, feed: run.feed, targetKind: run.targetKind, links: signalLinkTexts(attention.value.kind, run.targetKind, run.feedKind) };
156
+ if (fm.observed_at !== run.observedAt || !isPlannedSignalBody(candidate.body, fm, step.content_digest, context))
157
+ throw textNotPlanned();
158
+ };
159
+ }
160
+ const UPDATE_FIELDS = new Set(["change_kind", "priority", "observed_at", "diff_summary", "title", "external_id", "about_doc", "content_digest", "expires_at"]);
161
+ /**
162
+ * The Signal update guard: an existing attention Kind document of this plan's provider, fixed keys,
163
+ * and one appended observation line of this observation.
164
+ * Exported for this package's tests only; the subpath entry does not re-export it.
165
+ */
166
+ export function signalUpdateGuard(attention, step, observation) {
167
+ return (existing, candidate) => {
168
+ if (!attention.ok)
169
+ throw notOwned(`record-overlay updates documents of an attention Kind only: ${attention.reason}`, { external_id: step.external_id });
170
+ const { name, prefix } = attention.value;
171
+ if (!existing || existing.frontmatter.type !== name || !step.target.startsWith(prefix)) {
172
+ throw notOwned(`collapse-signal target is not a ${name} under ${prefix}`, { external_id: step.external_id });
173
+ }
174
+ const before = existing.frontmatter;
175
+ if (before.provider !== redactUrl(observation.provider))
176
+ throw notOwned("collapse-signal target belongs to another provider", { field: "provider", external_id: step.external_id });
177
+ const after = candidate.frontmatter;
178
+ const changed = [...new Set([...Object.keys(before), ...Object.keys(after)])].filter((k) => !same(before[k], after[k]));
179
+ const outside = changed.filter((k) => !UPDATE_FIELDS.has(k));
180
+ const appended = existing.body.replace(/\n*$/, "\n") + step.observation_line + "\n";
181
+ if (candidate.body !== existing.body && candidate.body !== appended)
182
+ outside.push("(body)");
183
+ if (outside.length)
184
+ throw notOwned(`collapse-signal would change fields outside the attention update: ${outside.join(", ")}`, { fields: outside, external_id: step.external_id });
185
+ if (step.set.observed_at !== observation.observedAt || !isPlannedObservation(step.observation_line, step.set, step.content_digest))
186
+ throw textNotPlanned();
187
+ };
188
+ }
189
+ /** A FIELD_TYPE_VIOLATION refusal: field, type and code only (the value came from the feed and may carry a token). */
190
+ function typeRefusal(kind, violations) {
191
+ return { code: REFUSAL_CODES.FIELD_TYPE_VIOLATION, message: `candidate violates declared field types: ${violations.map((v) => `${v.field} (${v.type})`).join(", ")}`, details: { kind, violations } };
192
+ }
193
+ function toRefusal(err, step, registries) {
194
+ if (err instanceof OverlayRefusal)
195
+ return { code: err.code, message: err.message, details: err.details };
196
+ if (err instanceof KindConformanceError && err.violations.some((v) => CORE_VALUE_CODES.includes(v.code))) {
197
+ // Core refused a value for its declared type or vocabulary: held and value-free, named with
198
+ // whatever else core found by code and field only.
199
+ const kind = registries.map((r) => r?.kinds?.get(err.governs)).find(Boolean);
200
+ const refusal = typeRefusal(err.governs, err.violations.filter((v) => CORE_VALUE_CODES.includes(v.code)).map((v) => ({ field: v.field, type: (v.field !== undefined ? kind?.fields?.types?.[v.field] : undefined) ?? "vocabulary", code: v.code })));
201
+ const also = err.violations.filter((v) => !CORE_VALUE_CODES.includes(v.code)).map((v) => `${v.code}:${v.field ?? ""}`);
202
+ return also.length ? { ...refusal, details: { ...refusal.details, also } } : refusal;
203
+ }
204
+ if (err instanceof VersionConflict)
205
+ return { code: REFUSAL_CODES.STALE_VERSION, message: "document changed after planning (CAS lost)" };
206
+ if (err instanceof PreconditionFailed) {
207
+ const code = step.op === "collapse-signal" ? REFUSAL_CODES.SIGNAL_CLAIMED : REFUSAL_CODES.STALE_VERSION;
208
+ return { code, message: `precondition on ${err.field} no longer holds`, details: { field: err.field } };
209
+ }
210
+ if (err instanceof KindConformanceError) {
211
+ // Codes and fields only: core's sentences can quote a value that came from the feed.
212
+ const violations = err.violations.map((v) => v.code + ":" + (v.field ?? ""));
213
+ return { code: REFUSAL_CODES.KIND_REJECTED, message: `candidate does not satisfy the ${err.governs} kind: ${violations.join(", ")}`, details: { violations } };
214
+ }
215
+ if (err instanceof DocumentNotFoundError)
216
+ return { code: REFUSAL_CODES.OVERLAY_IDENTITY_LOST, message: "document not found" };
217
+ if (err instanceof FieldActionError) {
218
+ // A fixed message and the reason and field only: core's sentences and candidates can echo a provider value.
219
+ return { code: REFUSAL_CODES.INVALID_INPUT, message: "core refused the field actions for this step", details: { reason: err.details.reason, field: err.details.field } };
220
+ }
221
+ if (err instanceof InvalidInputError) {
222
+ // A value core's write policy refuses (an OKF v0.2 field type, a hook's list): held and
223
+ // value-free. The actor, editions and targets were checked before the first write.
224
+ return { code: REFUSAL_CODES.INVALID_INPUT, message: "core refused a value in this step", details: { reason: "invalid-value" } };
225
+ }
226
+ throw err;
227
+ }
228
+ const PROTOTYPE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
229
+ /** JSON data: strings, booleans, null, finite numbers other than -0, lists and plain mappings; `undefined` members only. */
230
+ function jsonData(value, depth = 0) {
231
+ if (depth > 64)
232
+ return false;
233
+ if (value === null || typeof value === "string" || typeof value === "boolean")
234
+ return true;
235
+ if (typeof value === "number")
236
+ return Number.isFinite(value) && !Object.is(value, -0);
237
+ if (Array.isArray(value))
238
+ return value.every((item) => item !== undefined && jsonData(item, depth + 1));
239
+ if (typeof value === "object" && Object.prototype.toString.call(value) === "[object Object]") {
240
+ return Object.entries(value).every(([key, item]) => !PROTOTYPE_KEYS.has(key) && (item === undefined || jsonData(item, depth + 1)));
241
+ }
242
+ return false;
243
+ }
244
+ const scalar = (value) => typeof value === "string" || typeof value === "boolean" || (typeof value === "number" && jsonData(value));
245
+ function malformed(index, op) {
246
+ return new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `plan step ${index} is not a well-formed ${typeof op === "string" ? op : "plan"} step`, { step: index });
247
+ }
248
+ /** The whole plan is checked before the first write: a malformed plan touches no document. */
249
+ function validatePlan(plan) {
250
+ if (!record(plan) || !Array.isArray(plan.steps))
251
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "a plan needs a steps list");
252
+ plan.steps.forEach((step, index) => {
253
+ if (!record(step) || typeof step.op !== "string" || !STEP_OPS.has(step.op)) {
254
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `unknown plan step ${record(step) ? String(step.op) : typeof step}`, { step: index });
255
+ }
256
+ const str = (key) => typeof step[key] === "string" && step[key] !== "";
257
+ const target = () => {
258
+ if (!str("target"))
259
+ return false;
260
+ try {
261
+ assertSafeConceptId(step.target);
262
+ return true;
263
+ }
264
+ catch {
265
+ return false;
266
+ }
267
+ };
268
+ if (step.op === "apply-owned-fields") {
269
+ const fields = step.fields;
270
+ if (!target() || !str("expected_version") || typeof step.external_id !== "string" || !record(fields) || Object.keys(fields).length === 0
271
+ || !Object.entries(fields).every(([key, v]) => !PROTOTYPE_KEYS.has(key) && record(v) && (v.to === undefined || jsonData(v.to))))
272
+ throw malformed(index, step.op);
273
+ if (step.sources !== undefined && (!record(step.sources) || Object.entries(step.sources).some(([key, value]) => key === "resource" || key === "id" || PROTOTYPE_KEYS.has(key) || !scalar(value))))
274
+ throw malformed(index, step.op);
275
+ }
276
+ else if (step.op === "create-signal") {
277
+ const candidate = step.candidate;
278
+ if (!target() || !record(candidate) || !record(candidate.frontmatter) || typeof candidate.body !== "string" || !jsonData(candidate.frontmatter))
279
+ throw malformed(index, step.op);
280
+ }
281
+ else if (step.op === "collapse-signal") {
282
+ if (!target() || !str("expected_version") || typeof step.observation_line !== "string" || !record(step.set) || !jsonData(step.set))
283
+ throw malformed(index, step.op);
284
+ }
285
+ else if (step.op === "signal-duplicate") {
286
+ if (!target())
287
+ throw malformed(index, step.op);
288
+ }
289
+ });
290
+ }
291
+ async function editionOf(bundle) {
292
+ const edition = await readBundleOkfVersion(bundle) ?? "0.1";
293
+ if (edition !== "0.1" && edition !== "0.2") {
294
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `record-overlay writes OKF 0.1 and 0.2 bundles, not ${edition}`);
295
+ }
296
+ return edition;
297
+ }
298
+ export async function applyRecordOverlay(plan, ctx) {
299
+ const { content, ops, policy, actor, overlays, hooks = {} } = ctx;
300
+ if (!isOkfActor(actor))
301
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "record-overlay writes need an OKF actor (human:<id>, process:<id> or producer/version)");
302
+ validatePlan(plan);
303
+ const contentEdition = await editionOf(content.bundle);
304
+ const opsEdition = ops.bundle === content.bundle ? contentEdition : await editionOf(ops.bundle);
305
+ const derive = hooks.deriveFields;
306
+ // Owned and derived fields matter only to owned-field steps; a plan of Signal steps alone (a
307
+ // presentation feed, a findings run) is not refused for a policy that owns record fields.
308
+ if (plan.steps.some((step) => step.op === "apply-owned-fields")) {
309
+ if (!Array.isArray(policy.owned_fields))
310
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "owned_fields must be a list of field names", { list: "owned_fields" });
311
+ if (derive !== undefined && (!Array.isArray(derive.fields) || typeof derive.derive !== "function")) {
312
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "deriveFields needs a fields list and a derive function", { list: "deriveFields.fields" });
313
+ }
314
+ const targetKind = policy.target_kind === undefined ? undefined : content.registry.kinds.get(policy.target_kind);
315
+ assertAdmissibleFields(policy.owned_fields, derive?.fields ?? [], workStateFields(targetKind, [contentEdition]));
316
+ if (typeof policy.provider !== "string" || policy.provider === "")
317
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "owned-field steps need the policy's provider identity");
318
+ if (targetKind === undefined)
319
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "owned-field steps need a target Kind declared in the content bundle");
320
+ if (policy.target_kind === (ctx.signals?.kind ?? "Signal"))
321
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "the target Kind cannot be the attention Kind");
322
+ }
323
+ const signalSteps = plan.steps.some((step) => step.op === "create-signal" || step.op === "collapse-signal");
324
+ // Signal writes are bound to the provider the caller runs for, never to a field of the plan.
325
+ if (signalSteps && (typeof policy.provider !== "string" || policy.provider === "")) {
326
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, "Signal steps need the run's provider identity");
327
+ }
328
+ const run = { observedAt: plan.observed_at, provider: policy.provider, feed: plan.feed, targetKind: policy.target_kind, feedKind: ctx.signals?.feedKind };
329
+ const attention = signalSteps
330
+ ? resolveAttentionKind(ops.registry, opsEdition, ctx.signals?.kind ?? "Signal", policy.target_kind)
331
+ : { ok: false, reason: "no Signal steps" };
332
+ const common = { strict: true, actor, producer: actor, persistActor: true };
333
+ const siteHook = (step, bundle) => {
334
+ const hook = hooks.assertCandidate;
335
+ return hook ? (existing, candidate) => hook(existing, candidate, { step: step.op, bundle }) : undefined;
336
+ };
337
+ const applyOwnedFields = async (step) => {
338
+ const derivedFields = derive?.fields ?? [];
339
+ const admitted = new Set([...policy.owned_fields, ...derivedFields]);
340
+ const expectedFrom = Object.fromEntries(Object.entries(step.fields).map(([f, v]) => [f, v.from]));
341
+ const base = {
342
+ ...common, bundle: content.bundle, registry: content.registry, id: step.target, mode: "patch", onAbsent: "fail",
343
+ expectedVersion: step.expected_version,
344
+ assertCandidate: composeGuards(ownershipGuard({ ownedFields: policy.owned_fields, provider: policy.provider, externalId: step.external_id, expectedFrom, derivedFields, sourceProperties: step.sources, targetKind: policy.target_kind }), siteHook(step, "content")),
345
+ };
346
+ // The subpath's own refusals for what core's patch would throw on: a changed field whose old or
347
+ // new value holds a list. Owned, that is INVALID_INPUT (held); not owned, FIELD_NOT_OWNED.
348
+ const assertNoListAssignment = (existing, fields) => {
349
+ const fm = existing.frontmatter;
350
+ for (const [f, to] of fields) {
351
+ if (okfValuesEqual(fm[f], to) || !(containsCollection(fm[f]) || containsCollection(to)))
352
+ continue;
353
+ if (!admitted.has(f))
354
+ throw new OverlayRefusal(REFUSAL_CODES.FIELD_NOT_OWNED, `write would change non-owned fields: ${f}`, { fields: [f], external_id: step.external_id });
355
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "an owned field holding a list cannot be written as a field value", { reason: "list-valued-field", field: f });
356
+ }
357
+ };
358
+ const entries = () => Object.entries(step.fields).map(([f, v]) => [f, v.to]);
359
+ if (step.sources !== undefined) {
360
+ if (contentEdition !== "0.2") {
361
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "the grouped sources write needs an OKF v0.2 bundle", { reason: "grouped-shape-needs-v0.2", field: "sources" });
362
+ }
363
+ const removed = Object.entries(step.fields).find(([, v]) => v.to === undefined);
364
+ if (removed)
365
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "the grouped sources write cannot remove a field", { reason: "grouped-shape-removes-field", field: removed[0] });
366
+ const properties = step.sources;
367
+ return mutateDocument({
368
+ ...base,
369
+ input: (existing) => {
370
+ // Core's field actions throw on metadata before any guard runs; refuse what the guard would.
371
+ const outside = Object.keys(step.fields).filter((f) => !admitted.has(f));
372
+ if (outside.length)
373
+ throw new OverlayRefusal(REFUSAL_CODES.FIELD_NOT_OWNED, `write would change non-owned fields: ${outside.join(", ")}`, { fields: outside, external_id: step.external_id });
374
+ assertNoListAssignment(existing, entries());
375
+ const entry = Array.isArray(existing.frontmatter.sources)
376
+ ? existing.frontmatter.sources.filter((row) => matchesSourceIdentity(row, { resource: policy.provider, id: step.external_id }))
377
+ : [];
378
+ if (entry.length === 1) {
379
+ for (const key of Object.keys(properties)) {
380
+ if (containsCollection(entry[0][key])) {
381
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "a source property holding a list cannot be written as a field value", { reason: "list-valued-source-property", field: "sources" });
382
+ }
383
+ }
384
+ }
385
+ const actions = entries().map(([field, value]) => ({ action: "set", field, value }));
386
+ actions.push({ action: "upsert", field: "sources", value: { ...properties, resource: policy.provider, id: step.external_id } });
387
+ if (derive) {
388
+ let preview = existing;
389
+ for (const action of actions) {
390
+ preview = { id: existing.id, ...prepareDocumentFieldAction(preview, action, { registry: content.registry, okfVersion: contentEdition }).candidate };
391
+ }
392
+ const derived = derive.derive(structuredClone(existing), { frontmatter: preview.frontmatter, body: preview.body });
393
+ for (const [field, value] of Object.entries(derived ?? {}))
394
+ actions.push({ action: "set", field, value });
395
+ }
396
+ return { kind: "field-actions", actions };
397
+ },
398
+ });
399
+ }
400
+ return mutateDocument({
401
+ ...base,
402
+ buildCandidate: (existing) => {
403
+ if (!existing)
404
+ throw new DocumentNotFoundError(step.target);
405
+ assertNoListAssignment(existing, entries());
406
+ const fm = { ...existing.frontmatter };
407
+ for (const [f, { to }] of Object.entries(step.fields)) {
408
+ if (to === undefined)
409
+ delete fm[f];
410
+ else
411
+ fm[f] = to;
412
+ }
413
+ let next = { frontmatter: fm, body: existing.body };
414
+ if (derive) {
415
+ const derived = derive.derive(structuredClone(existing), structuredClone(next));
416
+ if (derived && Object.keys(derived).length)
417
+ next = { frontmatter: { ...next.frontmatter, ...derived }, body: next.body };
418
+ }
419
+ return next;
420
+ },
421
+ });
422
+ };
423
+ const results = [];
424
+ for (const step of plan.steps) {
425
+ if (step.op === "record-only" || step.op === "signal-duplicate") {
426
+ // A quiet step's reason (a disappearance after the record's last known end) is kept for the receipt reader.
427
+ results.push({ op: step.op, target: step.target ?? null, external_id: step.external_id, outcome: "skipped", ...("reason" in step && step.reason ? { reason: step.reason } : {}), ...("last_known_end" in step && step.last_known_end ? { last_known_end: step.last_known_end } : {}) });
428
+ continue;
429
+ }
430
+ try {
431
+ let r;
432
+ if (step.op === "apply-owned-fields") {
433
+ r = await applyOwnedFields(step);
434
+ if (r.changed)
435
+ overlays?.replace(r.doc, r.version);
436
+ }
437
+ else if (step.op === "create-signal") {
438
+ r = await mutateDocument({
439
+ ...common, bundle: ops.bundle, registry: ops.registry, id: step.target, mode: "patch", onAbsent: "create",
440
+ // A create never overwrites. An existing Signal of this provider is the type precondition
441
+ // the reference reports (retryable); another provider's Signal holding the id, or any
442
+ // other document there, is refused outright.
443
+ buildCandidate: (existing) => {
444
+ if (existing) {
445
+ const fm = existing.frontmatter;
446
+ if (fm.type === undefined)
447
+ throw notOwned("create-signal target already exists", { external_id: step.external_id });
448
+ if (attention.ok && fm.type === attention.value.name && fm.provider !== redactUrl(run.provider)) {
449
+ throw notOwned("create-signal target holds another provider's Signal", { field: "provider", external_id: step.external_id });
450
+ }
451
+ throw new OverlayRefusal(REFUSAL_CODES.STALE_VERSION, "precondition on type no longer holds", { field: "type" });
452
+ }
453
+ return structuredClone(step.candidate);
454
+ },
455
+ assertCandidate: composeGuards(signalCreateGuard(attention, step, run), siteHook(step, "ops")),
456
+ });
457
+ }
458
+ else {
459
+ const claim = attention.ok ? attention.value : undefined;
460
+ r = await mutateDocument({
461
+ ...common, bundle: ops.bundle, registry: ops.registry, id: step.target, mode: "patch", onAbsent: "fail",
462
+ expectedVersion: step.expected_version,
463
+ ...(claim ? { preconditions: [{ field: claim.stateField, expect: { equals: "todo" } }, { field: claim.ownerField, expect: "absent" }] } : {}),
464
+ buildCandidate: (existing) => {
465
+ const fm = existing.frontmatter;
466
+ // Core's patch refuses a list change before any guard runs; no attention update field holds one.
467
+ const listed = Object.keys(step.set).filter((k) => !okfValuesEqual(fm[k], step.set[k]) && (containsCollection(fm[k]) || containsCollection(step.set[k])));
468
+ if (listed.length)
469
+ throw notOwned(`collapse-signal would change fields outside the attention update: ${listed.join(", ")}`, { fields: listed, external_id: step.external_id });
470
+ return {
471
+ frontmatter: { ...existing.frontmatter, ...step.set },
472
+ body: existing.body.includes(step.observation_line) ? existing.body : existing.body.replace(/\n*$/, "\n") + step.observation_line + "\n",
473
+ };
474
+ },
475
+ assertCandidate: composeGuards(signalUpdateGuard(attention, step, run), siteHook(step, "ops")),
476
+ });
477
+ }
478
+ results.push({ op: step.op, target: step.target, external_id: step.external_id, outcome: r.changed ? "applied" : "unchanged", version: r.version });
479
+ }
480
+ catch (err) {
481
+ results.push({ op: step.op, target: step.target, external_id: step.external_id, outcome: "refused", ...toRefusal(err, step, [content.registry, ops.registry]) });
482
+ }
483
+ }
484
+ return {
485
+ feed: plan.feed, provider: plan.provider, observed_at: plan.observed_at, results, refusals: plan.refusals ?? [],
486
+ // Records the caller could not turn into records are part of the run's outcome, not just of the plan.
487
+ diagnostics: plan.diagnostics ?? [],
488
+ };
489
+ }
490
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/record-overlay/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The overlay comparison canon: `JSON.stringify` over a recursive copy whose object keys are sorted
3
+ * by the default string order and whose `undefined` members are dropped, with no other handling.
4
+ *
5
+ * Module-private and deliberately distinct from core's other two canonicalizers
6
+ * (`recipe-lifecycle/stamp.ts`, `site-capabilities.ts`). Overlay write decisions depend on its
7
+ * exact semantics: an absent value and `null` differ, a `Date` is `{}`, a function member is
8
+ * dropped, and a top-level `undefined` stays `undefined`. Merging it with either of the others is a
9
+ * behaviour change for the three-value rule and the ownership guard.
10
+ */
11
+ export declare function overlayCanonicalJson(value: unknown): string | undefined;
12
+ /** Equality under {@link overlayCanonicalJson}. */
13
+ export declare function same(a: unknown, b: unknown): boolean;
14
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/record-overlay/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvE;AAaD,mDAAmD;AACnD,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The overlay comparison canon: `JSON.stringify` over a recursive copy whose object keys are sorted
3
+ * by the default string order and whose `undefined` members are dropped, with no other handling.
4
+ *
5
+ * Module-private and deliberately distinct from core's other two canonicalizers
6
+ * (`recipe-lifecycle/stamp.ts`, `site-capabilities.ts`). Overlay write decisions depend on its
7
+ * exact semantics: an absent value and `null` differ, a `Date` is `{}`, a function member is
8
+ * dropped, and a top-level `undefined` stays `undefined`. Merging it with either of the others is a
9
+ * behaviour change for the three-value rule and the ownership guard.
10
+ */
11
+ export function overlayCanonicalJson(value) {
12
+ return JSON.stringify(sortValue(value));
13
+ }
14
+ function sortValue(v) {
15
+ if (Array.isArray(v))
16
+ return v.map(sortValue);
17
+ if (v && typeof v === "object") {
18
+ const source = v;
19
+ const out = {};
20
+ for (const k of Object.keys(source).sort())
21
+ if (source[k] !== undefined)
22
+ out[k] = sortValue(source[k]);
23
+ return out;
24
+ }
25
+ return v;
26
+ }
27
+ /** Equality under {@link overlayCanonicalJson}. */
28
+ export function same(a, b) {
29
+ return overlayCanonicalJson(a) === overlayCanonicalJson(b);
30
+ }
31
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/record-overlay/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,CAA4B,CAAC;QAC5C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,CAAU,EAAE,CAAU;IACzC,OAAO,oBAAoB,CAAC,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function sha256(input: string): string;
2
+ /** Short stable token for ids (never a provider value used as a path). */
3
+ export declare function shortHash(...parts: unknown[]): string;
4
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/record-overlay/digest.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAErD"}
@@ -0,0 +1,11 @@
1
+ // Signal ids and finding digests. Synchronous and Node-free through core's pure SHA-256, which
2
+ // encodes strings as UTF-8 exactly as `node:crypto` does.
3
+ import { sha256Hex } from "../versioning.js";
4
+ export function sha256(input) {
5
+ return "sha256:" + sha256Hex(input);
6
+ }
7
+ /** Short stable token for ids (never a provider value used as a path). */
8
+ export function shortHash(...parts) {
9
+ return sha256Hex(parts.map(String).join("\u0000")).slice(0, 12);
10
+ }
11
+ //# sourceMappingURL=digest.js.map