@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 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/record-overlay/digest.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,0DAA0D;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,GAAG,KAAgB;IAC3C,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,40 @@
1
+ /** Typed refusal vocabulary. Consumers branch on `code`, never on message text. */
2
+ export declare const REFUSAL_CODES: Readonly<{
3
+ /** A write would touch a field the feed does not own, or a Signal write left its bounded set. */
4
+ readonly FIELD_NOT_OWNED: "FIELD_NOT_OWNED";
5
+ /** An owned field diverged from the last accepted feed value. */
6
+ readonly OVERLAY_DOC_CONFLICT: "OVERLAY_DOC_CONFLICT";
7
+ /** More than one document claims the same provider identity. */
8
+ readonly OVERLAY_IDENTITY_AMBIGUOUS: "OVERLAY_IDENTITY_AMBIGUOUS";
9
+ /** The fresh read no longer carries the `sources[]` identity. */
10
+ readonly OVERLAY_IDENTITY_LOST: "OVERLAY_IDENTITY_LOST";
11
+ /** CAS lost: the document changed after planning (retryable). */
12
+ readonly STALE_VERSION: "STALE_VERSION";
13
+ /** The Signal was claimed or closed after planning (retryable). */
14
+ readonly SIGNAL_CLAIMED: "SIGNAL_CLAIMED";
15
+ /** Strict Kind admission refused the candidate. */
16
+ readonly KIND_REJECTED: "KIND_REJECTED";
17
+ /** The candidate violates a declared field type or vocabulary. */
18
+ readonly FIELD_TYPE_VIOLATION: "FIELD_TYPE_VIOLATION";
19
+ /** The input is not well-formed: a plan, an actor, or a candidate core's field actions refuse. */
20
+ readonly INVALID_INPUT: "INVALID_INPUT";
21
+ /** The Source Feed policy cannot be honoured. */
22
+ readonly POLICY_INVALID: "POLICY_INVALID";
23
+ }>;
24
+ export type RefusalCode = (typeof REFUSAL_CODES)[keyof typeof REFUSAL_CODES];
25
+ /** Codes after which the caller does not advance the record's store entry, so the next run re-plans it. */
26
+ export declare const RETRYABLE: ReadonlySet<RefusalCode>;
27
+ /**
28
+ * Refusals that also leave the store entry where it was but are not expected to succeed on a plain
29
+ * retry: the feed's value is not admissible, so every run re-plans and re-refuses it visibly until
30
+ * the provider or the recipe changes.
31
+ */
32
+ export declare const HOLD_STORE: ReadonlySet<RefusalCode>;
33
+ /** Core's Kind findings that refuse a value for its declared type, vocabulary or arity. */
34
+ export declare const CORE_VALUE_CODES: readonly string[];
35
+ export declare class OverlayRefusal extends Error {
36
+ readonly code: RefusalCode;
37
+ readonly details: Record<string, unknown>;
38
+ constructor(code: RefusalCode, message: string, details?: Record<string, unknown>);
39
+ }
40
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/record-overlay/errors.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,aAAa;IACxB,iGAAiG;;IAEjG,iEAAiE;;IAEjE,gEAAgE;;IAEhE,iEAAiE;;IAEjE,iEAAiE;;IAEjE,mEAAmE;;IAEnE,mDAAmD;;IAEnD,kEAAkE;;IAElE,kGAAkG;;IAElG,iDAAiD;;EAExC,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE7E,2GAA2G;AAC3G,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,WAAW,CAG7C,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,WAAW,CAI9C,CAAC;AAEH,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA+E,CAAC;AAE9H,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE9B,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAMtF"}
@@ -0,0 +1,51 @@
1
+ /** Typed refusal vocabulary. Consumers branch on `code`, never on message text. */
2
+ export const REFUSAL_CODES = Object.freeze({
3
+ /** A write would touch a field the feed does not own, or a Signal write left its bounded set. */
4
+ FIELD_NOT_OWNED: "FIELD_NOT_OWNED",
5
+ /** An owned field diverged from the last accepted feed value. */
6
+ OVERLAY_DOC_CONFLICT: "OVERLAY_DOC_CONFLICT",
7
+ /** More than one document claims the same provider identity. */
8
+ OVERLAY_IDENTITY_AMBIGUOUS: "OVERLAY_IDENTITY_AMBIGUOUS",
9
+ /** The fresh read no longer carries the `sources[]` identity. */
10
+ OVERLAY_IDENTITY_LOST: "OVERLAY_IDENTITY_LOST",
11
+ /** CAS lost: the document changed after planning (retryable). */
12
+ STALE_VERSION: "STALE_VERSION",
13
+ /** The Signal was claimed or closed after planning (retryable). */
14
+ SIGNAL_CLAIMED: "SIGNAL_CLAIMED",
15
+ /** Strict Kind admission refused the candidate. */
16
+ KIND_REJECTED: "KIND_REJECTED",
17
+ /** The candidate violates a declared field type or vocabulary. */
18
+ FIELD_TYPE_VIOLATION: "FIELD_TYPE_VIOLATION",
19
+ /** The input is not well-formed: a plan, an actor, or a candidate core's field actions refuse. */
20
+ INVALID_INPUT: "INVALID_INPUT",
21
+ /** The Source Feed policy cannot be honoured. */
22
+ POLICY_INVALID: "POLICY_INVALID",
23
+ });
24
+ /** Codes after which the caller does not advance the record's store entry, so the next run re-plans it. */
25
+ export const RETRYABLE = new Set([
26
+ REFUSAL_CODES.STALE_VERSION,
27
+ REFUSAL_CODES.SIGNAL_CLAIMED,
28
+ ]);
29
+ /**
30
+ * Refusals that also leave the store entry where it was but are not expected to succeed on a plain
31
+ * retry: the feed's value is not admissible, so every run re-plans and re-refuses it visibly until
32
+ * the provider or the recipe changes.
33
+ */
34
+ export const HOLD_STORE = new Set([
35
+ ...RETRYABLE,
36
+ REFUSAL_CODES.FIELD_TYPE_VIOLATION,
37
+ REFUSAL_CODES.INVALID_INPUT,
38
+ ]);
39
+ /** Core's Kind findings that refuse a value for its declared type, vocabulary or arity. */
40
+ export const CORE_VALUE_CODES = Object.freeze(["KIND_FIELD_TYPE", "KIND_FIELD_VALUE", "KIND_FIELD_ARITY"]);
41
+ export class OverlayRefusal extends Error {
42
+ code;
43
+ details;
44
+ constructor(code, message, details = {}) {
45
+ super(message);
46
+ this.name = "OverlayRefusal";
47
+ this.code = code;
48
+ this.details = details;
49
+ }
50
+ }
51
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/record-overlay/errors.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,iGAAiG;IACjG,eAAe,EAAE,iBAAiB;IAClC,iEAAiE;IACjE,oBAAoB,EAAE,sBAAsB;IAC5C,gEAAgE;IAChE,0BAA0B,EAAE,4BAA4B;IACxD,iEAAiE;IACjE,qBAAqB,EAAE,uBAAuB;IAC9C,iEAAiE;IACjE,aAAa,EAAE,eAAe;IAC9B,mEAAmE;IACnE,cAAc,EAAE,gBAAgB;IAChC,mDAAmD;IACnD,aAAa,EAAE,eAAe;IAC9B,kEAAkE;IAClE,oBAAoB,EAAE,sBAAsB;IAC5C,kGAAkG;IAClG,aAAa,EAAE,eAAe;IAC9B,iDAAiD;IACjD,cAAc,EAAE,gBAAgB;CACxB,CAAC,CAAC;AAIZ,2GAA2G;AAC3G,MAAM,CAAC,MAAM,SAAS,GAA6B,IAAI,GAAG,CAAc;IACtE,aAAa,CAAC,aAAa;IAC3B,aAAa,CAAC,cAAc;CAC7B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAA6B,IAAI,GAAG,CAAc;IACvE,GAAG,SAAS;IACZ,aAAa,CAAC,oBAAoB;IAClC,aAAa,CAAC,aAAa;CAC5B,CAAC,CAAC;AAEH,2FAA2F;AAC3F,MAAM,CAAC,MAAM,gBAAgB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAE9H,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAc;IAClB,OAAO,CAA0B;IAE1C,YAAY,IAAiB,EAAE,OAAe,EAAE,UAAmC,EAAE;QACnF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { Finding, FindingsInput, OverlayStep } from "./types.js";
2
+ export declare const FINDING_CHANGE_KIND = "status-check";
3
+ export declare function findingDigest(f: Pick<Finding, "key" | "facts">): string;
4
+ export declare function planFindings({ ops, provider, feed, slug, findings, observedAt, signals }: FindingsInput): Promise<OverlayStep[]>;
5
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/record-overlay/findings.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtE,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAIlD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,MAAM,CAEvE;AAED,wBAAsB,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgDtI"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Assessment findings as Signal steps. A caller compares the current state of records with
3
+ * documents and returns findings: conditions that need a person's judgment, not record changes.
4
+ * They become the same create, collapse and duplicate steps as change Signals, so
5
+ * `applyRecordOverlay` writes them under the same guards.
6
+ *
7
+ * A finding's `facts` with its `key` are its digest: the same finding on a later run is
8
+ * `signal-duplicate`, also after the Signal was closed, so a dismissed finding stays dismissed
9
+ * until its facts change. A Signal whose `expires_at` has passed no longer counts, so a still-true
10
+ * finding is raised again after expiry. An open, unclaimed Signal with the same provider and
11
+ * `external_id` (default: the key) whose facts changed is updated in place, never duplicated.
12
+ */
13
+ import { queryHeads } from "../bundle-ops.js";
14
+ import { overlayCanonicalJson } from "./canonical.js";
15
+ import { sha256, shortHash } from "./digest.js";
16
+ import { OverlayRefusal, REFUSAL_CODES } from "./errors.js";
17
+ import { maxPriority } from "./policy.js";
18
+ import { redactUrl } from "./redact.js";
19
+ import { isConceptId, linkLine, observationLine, relatedLine, signalBody, signalLinkTexts } from "./signal-text.js";
20
+ import { resolveAttentionKind } from "./signal-kind.js";
21
+ export const FINDING_CHANGE_KIND = "status-check";
22
+ const PRIORITIES = new Set(["low", "normal", "urgent"]);
23
+ const clip = (s, n) => (String(s).length > n ? String(s).slice(0, n - 1) + "…" : String(s));
24
+ export function findingDigest(f) {
25
+ return sha256(overlayCanonicalJson({ key: f.key, facts: f.facts ?? {} }));
26
+ }
27
+ export async function planFindings({ ops, provider, feed, slug, findings, observedAt, signals }) {
28
+ const steps = [];
29
+ const attention = resolveAttentionKind(ops.registry, ops.okfVersion, signals?.kind ?? "Signal", undefined);
30
+ if (!attention.ok)
31
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, attention.reason, {});
32
+ const { name: signalName, kind: signalKind, prefix, stateField: progressField, ownerField } = attention.value;
33
+ const { fromFeed } = signalLinkTexts(signalKind, undefined, signals?.feedKind ?? "Source Feed");
34
+ const providerOut = redactUrl(provider);
35
+ const mine = (await queryHeads(ops.bundle, { type: signalName })).filter((h) => h.frontmatter.provider === providerOut);
36
+ const live = (h) => !(typeof h.frontmatter.expires_at === "string" && h.frontmatter.expires_at <= observedAt);
37
+ const touched = new Set();
38
+ const seenKeys = new Set();
39
+ for (const f of findings ?? []) {
40
+ if (!f || typeof f.key !== "string" || !f.key || seenKeys.has(f.key))
41
+ continue;
42
+ seenKeys.add(f.key);
43
+ const digest = findingDigest(f);
44
+ const externalId = f.external_id ?? f.key;
45
+ const priority = f.priority !== undefined && PRIORITIES.has(f.priority) ? f.priority : "normal";
46
+ const summary = clip(f.summary ?? f.title, 600);
47
+ const line = observationLine(observedAt, f.change_kind ?? FINDING_CHANGE_KIND, digest, summary);
48
+ const dup = mine.find((h) => h.frontmatter.content_digest === digest && live(h));
49
+ if (dup) {
50
+ steps.push({ op: "signal-duplicate", target: dup.id, external_id: externalId, content_digest: digest, finding: f.key });
51
+ continue;
52
+ }
53
+ const open = mine.find((h) => h.frontmatter.external_id === externalId && h.frontmatter[progressField] === "todo" && !h.frontmatter[ownerField] && live(h));
54
+ const set = {
55
+ title: clip(f.title, 140), change_kind: f.change_kind ?? FINDING_CHANGE_KIND, observed_at: observedAt, diff_summary: summary,
56
+ content_digest: digest, external_id: externalId, ...(f.about_doc ? { about_doc: f.about_doc } : {}), ...(f.expires_at ? { expires_at: f.expires_at } : {}),
57
+ };
58
+ if (open && !touched.has(open.id)) {
59
+ touched.add(open.id);
60
+ steps.push({ op: "collapse-signal", target: open.id, expected_version: open.version, external_id: externalId, content_digest: digest, finding: f.key,
61
+ progress_field: progressField, observation_line: line, set: { ...set, priority: maxPriority(open.frontmatter.priority ?? "low", priority) } });
62
+ continue;
63
+ }
64
+ // An expiring finding raised again after expiry is a new Signal, so its id names the expiry too.
65
+ const id = `${prefix}${slug}-${f.expires_at ? shortHash(slug, f.key, digest, f.expires_at) : shortHash(slug, f.key, digest)}`;
66
+ const linkLines = [];
67
+ if (fromFeed && feed)
68
+ linkLines.push(linkLine(fromFeed, id, feed));
69
+ // Related documents are linked by id; a value that is not a document id has no line.
70
+ for (const r of [...new Set([f.about_doc, ...(f.related ?? [])].filter(isConceptId))])
71
+ linkLines.push(relatedLine(r));
72
+ const frontmatter = {
73
+ type: signalName, title: set.title, [progressField]: "todo", change_kind: set.change_kind, observed_at: observedAt,
74
+ provider: providerOut, external_id: externalId, diff_summary: summary, priority, content_digest: digest,
75
+ ...(f.about_doc ? { about_doc: f.about_doc } : {}), ...(f.expires_at ? { expires_at: f.expires_at } : {}),
76
+ sources: (f.sources?.length ? f.sources : [{ resource: providerOut }]).map((s) => ({ ...s, resource: redactUrl(s.resource) })),
77
+ };
78
+ steps.push({ op: "create-signal", target: id, external_id: externalId, content_digest: digest, finding: f.key, reasons: ["finding"],
79
+ candidate: { frontmatter, body: signalBody(linkLines, undefined, line) } });
80
+ }
81
+ return steps;
82
+ }
83
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/record-overlay/findings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `@superbee/core/record-overlay`: the generic write half of binding documents to external records.
3
+ *
4
+ * A Source Feed policy names the fields a feed owns. `planRecordOverlay` turns the caller's record
5
+ * changes into steps under the three-value rule (converged, write, or conflict plus a Signal), each
6
+ * carrying the version it was decided against; `applyRecordOverlay` writes them through
7
+ * `mutateDocument` with a core-owned guard per write step on the fresh read. A source writes only
8
+ * its owned fields, never the body, never a document of its target Kind, and never deletes; the
9
+ * only documents it creates are Signals of one claimable attention Kind in the ops bundle.
10
+ *
11
+ * Everything site specific is a hook with a safe default: the text gate, the occurrence interval,
12
+ * correlation, `sources` properties, site candidate rules and derived fields. Storage-neutral: no
13
+ * Node globals or builtins.
14
+ */
15
+ export { DEFAULT_AUTO_APPLY, DEFAULT_NEEDS_REVIEW, NEVER_OWNED, decideChange, gateSafeValue, isExcludedRecord, readOverlayPolicy, } from "./policy.js";
16
+ export { disappearedPhase, planRecordOverlay, summarizeChange } from "./plan.js";
17
+ export { FINDING_CHANGE_KIND, findingDigest, planFindings } from "./findings.js";
18
+ export { applyRecordOverlay, composeGuards, ownershipGuard } from "./apply.js";
19
+ export { SourceIndex, buildSourceIndex } from "./source-index.js";
20
+ export { HOLD_STORE, OverlayRefusal, REFUSAL_CODES, RETRYABLE } from "./errors.js";
21
+ export type { RefusalCode } from "./errors.js";
22
+ export type { ApplyContext, ApplyOwnedFieldsStep, AssertCandidate, ChangeDecision, CollapseSignalStep, CorrelateHook, CreateSignalStep, DisappearedPhase, Finding, FindingsInput, IntervalHook, OverlayBundle, OverlayHooks, OverlayPlan, OverlayPolicy, OverlayReceipt, OverlayStep, PlanInput, PolicyContext, RecordChange, RecordOnlyStep, RefusalRow, SignalDuplicateStep, StepResult, Tell, TextGate, } from "./types.js";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/record-overlay/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,IAAI,EACJ,QAAQ,GACT,MAAM,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `@superbee/core/record-overlay`: the generic write half of binding documents to external records.
3
+ *
4
+ * A Source Feed policy names the fields a feed owns. `planRecordOverlay` turns the caller's record
5
+ * changes into steps under the three-value rule (converged, write, or conflict plus a Signal), each
6
+ * carrying the version it was decided against; `applyRecordOverlay` writes them through
7
+ * `mutateDocument` with a core-owned guard per write step on the fresh read. A source writes only
8
+ * its owned fields, never the body, never a document of its target Kind, and never deletes; the
9
+ * only documents it creates are Signals of one claimable attention Kind in the ops bundle.
10
+ *
11
+ * Everything site specific is a hook with a safe default: the text gate, the occurrence interval,
12
+ * correlation, `sources` properties, site candidate rules and derived fields. Storage-neutral: no
13
+ * Node globals or builtins.
14
+ */
15
+ export { DEFAULT_AUTO_APPLY, DEFAULT_NEEDS_REVIEW, NEVER_OWNED, decideChange, gateSafeValue, isExcludedRecord, readOverlayPolicy, } from "./policy.js";
16
+ export { disappearedPhase, planRecordOverlay, summarizeChange } from "./plan.js";
17
+ export { FINDING_CHANGE_KIND, findingDigest, planFindings } from "./findings.js";
18
+ export { applyRecordOverlay, composeGuards, ownershipGuard } from "./apply.js";
19
+ export { SourceIndex, buildSourceIndex } from "./source-index.js";
20
+ export { HOLD_STORE, OverlayRefusal, REFUSAL_CODES, RETRYABLE } from "./errors.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/record-overlay/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ChangeDecision, DisappearedPhase, IntervalHook, OverlayPlan, PlanInput, RecordChange } from "./types.js";
2
+ /**
3
+ * Where a disappeared record stood at `observedAt`: `ended` (its last known end has passed),
4
+ * `before-start` (it vanished before it began: possibly canceled), `ongoing`, or null when its
5
+ * dates are unknown. Without an interval hook the phase is always unknown, so the record is raised.
6
+ */
7
+ export declare function disappearedPhase(fields: Record<string, unknown> | null, observedAt: string, timeZone: string | undefined, interval: IntervalHook | undefined): DisappearedPhase;
8
+ export declare function summarizeChange(change: RecordChange, decision: ChangeDecision | null, ownedFields?: readonly string[], { phase }?: {
9
+ phase?: DisappearedPhase;
10
+ }): string;
11
+ export declare function planRecordOverlay(input: PlanInput): Promise<OverlayPlan>;
12
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/record-overlay/plan.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,cAAc,EAEd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EAEX,SAAS,EACT,YAAY,EAEb,MAAM,YAAY,CAAC;AAepB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,YAAY,GAAG,SAAS,GACjC,gBAAgB,CAKlB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,WAAW,GAAE,SAAS,MAAM,EAAO,EACnC,EAAE,KAAY,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAClD,MAAM,CAqBR;AAoBD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAkK9E"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * The multi-document plan: read, classify or refuse, and emit steps that carry the exact version
3
+ * they were decided against. Pure apart from bundle reads.
4
+ *
5
+ * Two bundles: ops holds Source Feeds and Signals, content holds the overlay documents. They may be
6
+ * the same bundle.
7
+ */
8
+ import { queryHeads, readDocVersioned } from "../bundle-ops.js";
9
+ import { parseIsoInstant } from "../verification.js";
10
+ import { shortHash } from "./digest.js";
11
+ import { OverlayRefusal, REFUSAL_CODES } from "./errors.js";
12
+ import { decideChange, isExcludedRecord, maxPriority, severity } from "./policy.js";
13
+ import { redactUrl } from "./redact.js";
14
+ import { resolveAttentionKind } from "./signal-kind.js";
15
+ import { adoptionHint, linkLine, observationLine, oneLine, overlayLine, relatedLine, signalBody, signalLinkTexts } from "./signal-text.js";
16
+ import { buildSourceIndex } from "./source-index.js";
17
+ const LABEL = { new: "New", changed: "Changed", canceled: "Canceled", disappeared: "Disappeared", "page-changed": "Page changed" };
18
+ const PRIORITIES = new Set(["low", "normal", "urgent"]);
19
+ const short = (v) => {
20
+ if (v === undefined)
21
+ return "∅";
22
+ const s = typeof v === "string" ? v : JSON.stringify(v);
23
+ return s.length > 80 ? s.slice(0, 79) + "…" : s;
24
+ };
25
+ function lastKnownInterval(fields, timeZone, interval) {
26
+ return interval && fields && typeof fields === "object" ? interval(fields, timeZone) : null;
27
+ }
28
+ /**
29
+ * Where a disappeared record stood at `observedAt`: `ended` (its last known end has passed),
30
+ * `before-start` (it vanished before it began: possibly canceled), `ongoing`, or null when its
31
+ * dates are unknown. Without an interval hook the phase is always unknown, so the record is raised.
32
+ */
33
+ export function disappearedPhase(fields, observedAt, timeZone, interval) {
34
+ const span = lastKnownInterval(fields, timeZone, interval);
35
+ const at = parseIsoInstant(observedAt);
36
+ if (!span || at === null)
37
+ return null;
38
+ return at >= span[1] ? "ended" : at < span[0] ? "before-start" : "ongoing";
39
+ }
40
+ export function summarizeChange(change, decision, ownedFields = [], { phase = null } = {}) {
41
+ const parts = [];
42
+ if (change.change_kind === "new") {
43
+ parts.push(`new record${change.after?.start ? ` @ ${change.after.start}` : ""}`);
44
+ // The values the feed would own, so the claimant can judge without opening the store.
45
+ for (const f of ownedFields.filter((k) => k !== "start" && change.after?.[k] !== undefined).slice(0, 6))
46
+ parts.push(`${f}: ${short(change.after[f])}`);
47
+ }
48
+ else if (change.change_kind === "disappeared") {
49
+ parts.push(`missing from ${change.missing_count} consecutive complete observations`);
50
+ if (phase === "before-start")
51
+ parts.push("vanished before its start: possibly canceled, check the organizer's page");
52
+ else if (phase === "ended")
53
+ parts.push("ended: gone after its last known end");
54
+ // The last known facts, so triage needs no store or history.
55
+ for (const f of ["title", "start", "end"])
56
+ parts.push(`last ${f}: ${short(change.before?.[f])}`);
57
+ }
58
+ else
59
+ for (const f of change.changed_fields)
60
+ parts.push(`${f}: ${short(change.before?.[f])} → ${short(change.after?.[f])}`);
61
+ for (const c of decision?.conflicts ?? [])
62
+ parts.push(`CONFLICT ${c.field}: doc has ${short(c.doc_value)}, feed was ${short(c.feed_before)}`);
63
+ if (decision?.editorFields?.length)
64
+ parts.push(`not applied (editor-owned): ${decision.editorFields.join(", ")}`);
65
+ // Feed text the publication gate would refuse even normalized: not written, named for a person.
66
+ for (const w of decision?.wording ?? [])
67
+ parts.push(`not applied, needs a human-safe wording: ${w.field}: ${short(w.text)} (${[...new Set(w.tells.map((t) => `${t.code} "${t.match}"`))].join(", ")})`);
68
+ const s = parts.join("; ");
69
+ return s.length > 600 ? s.slice(0, 599) + "…" : s;
70
+ }
71
+ /** Scalar `sources` properties from the hook, refused when they would name the identity or hold a list. */
72
+ function sourcePropertiesOf(hook, change) {
73
+ const props = hook?.sourceProperties?.(change);
74
+ if (props === undefined)
75
+ return undefined;
76
+ if (props === null || typeof props !== "object" || Array.isArray(props)) {
77
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "sourceProperties must return a mapping of scalar properties", { external_id: change.external_id });
78
+ }
79
+ for (const [key, value] of Object.entries(props)) {
80
+ if (key === "resource" || key === "id") {
81
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `sourceProperties may not set the identity property ${key}`, { external_id: change.external_id, field: key });
82
+ }
83
+ if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value) && !Object.is(value, -0))) {
84
+ throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `sourceProperties property ${key} must be a string, finite number or boolean`, { external_id: change.external_id, field: key });
85
+ }
86
+ }
87
+ return Object.keys(props).length ? { ...props } : undefined;
88
+ }
89
+ export async function planRecordOverlay(input) {
90
+ const { ops, content, policy, changes, observedAt, records = {}, observation = {}, sameBundle = false, hooks = {} } = input;
91
+ const timeZone = input.timeZone ?? policy.time_zone;
92
+ const steps = [];
93
+ const refusals = [];
94
+ const provider = policy.provider;
95
+ const providerOut = redactUrl(provider);
96
+ const attention = resolveAttentionKind(ops.registry, ops.okfVersion, input.signals?.kind ?? "Signal", policy.target_kind);
97
+ if (!attention.ok)
98
+ throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, attention.reason, { feed: policy.feed });
99
+ const { name: signalName, kind: signalKind, prefix: signalPrefix, stateField: progressField, ownerField } = attention.value;
100
+ const { fromFeed, about } = signalLinkTexts(signalKind, policy.target_kind, input.signals?.feedKind ?? "Source Feed");
101
+ const feedSlug = policy.feed.split("/").pop().replace(/[^a-z0-9-]+/gi, "-").toLowerCase();
102
+ const overlays = policy.target_kind
103
+ ? input.overlays ?? await buildSourceIndex(content.bundle, { type: policy.target_kind })
104
+ : null;
105
+ const existingSignals = (await queryHeads(ops.bundle, { type: signalName }))
106
+ .filter((h) => h.frontmatter.provider === providerOut);
107
+ // Records superseded by a record of this same observation (`collapse_with`): their successor
108
+ // carries the news, so their own disappearance needs no Signal activity.
109
+ const related = await correlationIndex(content.bundle, hooks.correlate);
110
+ const supersededNow = new Set(changes.filter((c) => c.after).flatMap((c) => c.collapse_with ?? []));
111
+ const touchedSignals = new Set();
112
+ const isOpen = (h) => h.frontmatter[progressField] === "todo" && !h.frontmatter[ownerField];
113
+ for (const change of changes) {
114
+ if (change.change_kind === "disappeared" && supersededNow.has(change.external_id)) {
115
+ steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, superseded: true });
116
+ continue;
117
+ }
118
+ // A record that drops out after its last known end has ended: no Signal. One that vanishes
119
+ // before its start may be canceled and is still raised. The phase is judged when it first went
120
+ // missing; without that time the phase is unknown and the record is raised.
121
+ const phase = change.change_kind === "disappeared" && change.first_missing_at ? disappearedPhase(change.before, change.first_missing_at, timeZone, hooks.interval) : null;
122
+ // A record with an open, unclaimed Signal is not retired quietly: that Signal is told it ended.
123
+ const hasOpen = existingSignals.some((h) => h.frontmatter.external_id === change.external_id && isOpen(h));
124
+ if (phase === "ended" && !hasOpen) {
125
+ const [, endMs] = lastKnownInterval(change.before, timeZone, hooks.interval);
126
+ steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, ended: true, reason: "ended", last_known_end: new Date(endMs).toISOString() });
127
+ continue;
128
+ }
129
+ const matches = overlays ? overlays.lookup(provider, change.external_id, { type: policy.target_kind }) : [];
130
+ const recTitle = change.after?.title ?? change.before?.title ?? records[change.external_id]?.fields?.title;
131
+ if (matches.length > 1) {
132
+ refusals.push({ code: REFUSAL_CODES.OVERLAY_IDENTITY_AMBIGUOUS, external_id: change.external_id, targets: matches.map((m) => m.id), message: "more than one document claims this provider identity; merge or rebind needs review" });
133
+ }
134
+ const overlay = matches.length === 1 ? matches[0] : null;
135
+ // Editorially excluded records are observed and stored but never presented, so they never need judgment either.
136
+ if (isExcludedRecord(policy, change.external_id, recTitle)) {
137
+ steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, excluded: true });
138
+ continue;
139
+ }
140
+ const decision = decideChange(policy, change, { overlay, textGate: hooks.textGate });
141
+ // An ended record with an open Signal only tells that Signal so: it keeps its kind, title and
142
+ // priority (expiry is not news), with a low-priority observation line.
143
+ const endedOpen = phase === "ended" && hasOpen;
144
+ if (endedOpen)
145
+ decision.signal = { priority: "low", reasons: ["update-open-signal", "ended"] };
146
+ if (matches.length > 1)
147
+ decision.signal ??= { priority: "normal", reasons: [REFUSAL_CODES.OVERLAY_IDENTITY_AMBIGUOUS] };
148
+ if (Object.keys(decision.apply).length) {
149
+ const fields = decision.apply;
150
+ const props = sourcePropertiesOf(hooks, change);
151
+ // A removal cannot be expressed by a field action, so a step that removes keeps the patch shape.
152
+ const removes = Object.values(fields).some((v) => v.to === undefined);
153
+ steps.push({
154
+ op: "apply-owned-fields", target: overlay.id, expected_version: overlay.version, external_id: change.external_id, change_kind: change.change_kind, fields,
155
+ ...(props && !removes ? { sources: props } : {}),
156
+ });
157
+ }
158
+ for (const c of decision.conflicts) {
159
+ refusals.push({ code: REFUSAL_CODES.OVERLAY_DOC_CONFLICT, external_id: change.external_id, target: overlay.id, field: c.field, message: "owned field was edited in the document since the last accepted feed value" });
160
+ }
161
+ const mine = existingSignals.filter((h) => h.frontmatter.external_id === change.external_id);
162
+ // A record that supersedes another (`collapse_with`) joins that record's open Signal.
163
+ const predecessors = new Set(change.collapse_with ?? []);
164
+ const open = mine.find(isOpen) ?? existingSignals.find((h) => predecessors.has(h.frontmatter.external_id) && isOpen(h));
165
+ // A record with an open, unclaimed Signal keeps that Signal current even for changes that
166
+ // would otherwise be record-only, so the eventual claimant sees the latest facts.
167
+ if (!decision.signal && open)
168
+ decision.signal = { priority: "low", reasons: ["update-open-signal"] };
169
+ if (!decision.signal) {
170
+ if (!Object.keys(decision.apply).length)
171
+ steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind });
172
+ continue;
173
+ }
174
+ const signal = decision.signal;
175
+ if (change.signal_priority !== undefined && PRIORITIES.has(change.signal_priority))
176
+ signal.priority = maxPriority(signal.priority, change.signal_priority);
177
+ const links = related(change.after ?? change.before ?? records[change.external_id]?.fields ?? {}, change.external_id);
178
+ for (const r of links) {
179
+ signal.priority = maxPriority(signal.priority, r.priority !== undefined && PRIORITIES.has(r.priority) ? r.priority : "normal");
180
+ signal.reasons.push(`related:${r.id}`);
181
+ }
182
+ const aboutDoc = links.length === 1 ? { about_doc: links[0].id } : {};
183
+ const summary = withRelated(summarizeChange(change, decision, policy.owned_fields, { phase }), links);
184
+ const line = observationLine(observedAt, change.change_kind, change.content_digest, summary);
185
+ // Dedupe on (feed, external_id, change_kind, content_digest): any Signal whose observation log
186
+ // names that change of that digest. The kind matters: a disappearance carries the digest of the
187
+ // record's last presence, which a `new` Signal may already have logged.
188
+ let duplicate = null;
189
+ for (const h of mine) {
190
+ const { doc } = await readDocVersioned(ops.bundle, h.id);
191
+ if (doc.body.includes(` · ${change.change_kind} · ${change.content_digest} · `)) {
192
+ duplicate = h;
193
+ break;
194
+ }
195
+ }
196
+ if (duplicate) {
197
+ steps.push({ op: "signal-duplicate", target: duplicate.id, external_id: change.external_id, content_digest: change.content_digest });
198
+ continue;
199
+ }
200
+ if (open && touchedSignals.has(open.id)) {
201
+ // One CAS write per Signal per run: a second change for the same open Signal is recorded
202
+ // but not logged on the Signal, rather than losing the first write to STALE_VERSION.
203
+ steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, collapsed_into: open.id });
204
+ continue;
205
+ }
206
+ if (open) {
207
+ touchedSignals.add(open.id);
208
+ const prevKind = open.frontmatter.change_kind;
209
+ const kind = endedOpen ? prevKind : severity(change.change_kind) >= severity(prevKind) ? change.change_kind : prevKind;
210
+ steps.push({
211
+ op: "collapse-signal", target: open.id, expected_version: open.version, external_id: change.external_id, content_digest: change.content_digest,
212
+ progress_field: progressField, observation_line: line,
213
+ set: { change_kind: kind, priority: maxPriority(open.frontmatter.priority, signal.priority), observed_at: observedAt, diff_summary: summary, title: signalTitle(kind, recTitle, change.external_id), external_id: change.external_id, ...aboutDoc },
214
+ });
215
+ continue;
216
+ }
217
+ // A disappearance reuses the last digest, so its Signal id also names the kind.
218
+ const id = `${signalPrefix}${feedSlug}-${change.change_kind === "disappeared" ? shortHash(policy.feed, change.external_id, change.content_digest, "disappeared") : shortHash(policy.feed, change.external_id, change.content_digest)}`;
219
+ const linkLines = [];
220
+ if (fromFeed)
221
+ linkLines.push(linkLine(fromFeed, id, policy.feed));
222
+ if (overlay && about && sameBundle)
223
+ linkLines.push(linkLine(about, id, overlay.id));
224
+ else if (overlay)
225
+ linkLines.push(overlayLine(overlay.id));
226
+ for (const r of links)
227
+ linkLines.push(relatedLine(r.id, r.reason));
228
+ // Record-only feeds have nothing to overlay; the claimant decides what to author from the record.
229
+ const hint = overlay || !policy.target_kind ? undefined : adoptionHint(policy.target_kind, providerOut, change.external_id);
230
+ const frontmatter = {
231
+ type: signalName,
232
+ title: signalTitle(change.change_kind, recTitle, change.external_id),
233
+ [progressField]: "todo",
234
+ change_kind: change.change_kind,
235
+ observed_at: observedAt,
236
+ provider: providerOut,
237
+ external_id: change.external_id,
238
+ diff_summary: summary,
239
+ priority: signal.priority,
240
+ ...aboutDoc,
241
+ // A source entry's title is text on OKF v0.2; a numeric or boolean record title is written as its text.
242
+ sources: [{ resource: providerOut, id: change.external_id, ...(recTitle ? { title: typeof recTitle === "number" || typeof recTitle === "boolean" ? String(recTitle) : recTitle } : {}) }],
243
+ };
244
+ const body = signalBody(linkLines, hint, line);
245
+ steps.push({ op: "create-signal", target: id, external_id: change.external_id, content_digest: change.content_digest, reasons: signal.reasons, candidate: { frontmatter, body } });
246
+ }
247
+ return {
248
+ feed: policy.feed,
249
+ provider: providerOut,
250
+ observed_at: observedAt,
251
+ baseline: observation.baseline,
252
+ replay: observation.replay,
253
+ stats: observation.stats,
254
+ steps,
255
+ refusals,
256
+ };
257
+ }
258
+ /** Build the correlation lookup once per plan: (fields, externalId) -> related documents. */
259
+ async function correlationIndex(contentBundle, correlate) {
260
+ if (!correlate || typeof correlate.match !== "function" || typeof correlate.kind !== "string")
261
+ return () => [];
262
+ const heads = await queryHeads(contentBundle, { type: correlate.kind });
263
+ return (fields, externalId) => {
264
+ const out = [];
265
+ for (const h of heads) {
266
+ const m = correlate.match(fields, h.frontmatter, externalId);
267
+ // The reason sits on the related line of a Signal body, so it is kept to one line.
268
+ if (m && m.reason)
269
+ out.push({ id: h.id, reason: oneLine(String(m.reason).slice(0, 120)), priority: m.priority });
270
+ }
271
+ return out.sort((a, b) => a.id.localeCompare(b.id)).slice(0, 5);
272
+ };
273
+ }
274
+ function withRelated(summary, links) {
275
+ if (!links.length)
276
+ return summary;
277
+ const s = `${summary}; related: ${links.map((r) => `${r.id} (${r.reason})`).join(", ")}`;
278
+ return s.length > 600 ? s.slice(0, 599) + "…" : s;
279
+ }
280
+ function signalTitle(kind, title, externalId) {
281
+ const t = `${LABEL[kind] ?? kind}: ${title ?? externalId}`;
282
+ return t.length > 140 ? t.slice(0, 139) + "…" : t;
283
+ }
284
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/record-overlay/plan.ts"],"names":[],"mappings":"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"}