@superbee/core 0.2.0-pre.15 → 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.
- package/README.md +316 -0
- package/dist/backend.d.ts +3 -0
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +7 -0
- package/dist/backend.js.map +1 -1
- package/dist/blob-contract.d.ts +80 -0
- package/dist/blob-contract.d.ts.map +1 -0
- package/dist/blob-contract.js +131 -0
- package/dist/blob-contract.js.map +1 -0
- package/dist/blob-journal.d.ts +117 -0
- package/dist/blob-journal.d.ts.map +1 -0
- package/dist/blob-journal.js +168 -0
- package/dist/blob-journal.js.map +1 -0
- package/dist/bundle-health/index.d.ts +14 -0
- package/dist/bundle-health/index.d.ts.map +1 -0
- package/dist/bundle-health/index.js +12 -0
- package/dist/bundle-health/index.js.map +1 -0
- package/dist/bundle-health/kind-findings.d.ts +44 -0
- package/dist/bundle-health/kind-findings.d.ts.map +1 -0
- package/dist/bundle-health/kind-findings.js +68 -0
- package/dist/bundle-health/kind-findings.js.map +1 -0
- package/dist/bundle-health/legacy-page.d.ts +39 -0
- package/dist/bundle-health/legacy-page.d.ts.map +1 -0
- package/dist/bundle-health/legacy-page.js +50 -0
- package/dist/bundle-health/legacy-page.js.map +1 -0
- package/dist/bundle-health/report.d.ts +202 -0
- package/dist/bundle-health/report.d.ts.map +1 -0
- package/dist/bundle-health/report.js +438 -0
- package/dist/bundle-health/report.js.map +1 -0
- package/dist/engine.d.ts +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/file-journaled-backend-internal.d.ts +2 -0
- package/dist/file-journaled-backend-internal.d.ts.map +1 -1
- package/dist/file-journaled-backend-internal.js +2 -0
- package/dist/file-journaled-backend-internal.js.map +1 -1
- package/dist/file-journaled-backend.d.ts +14 -2
- package/dist/file-journaled-backend.d.ts.map +1 -1
- package/dist/file-journaled-backend.js +245 -37
- package/dist/file-journaled-backend.js.map +1 -1
- package/dist/hosted-client/binding.d.ts +7 -0
- package/dist/hosted-client/binding.d.ts.map +1 -0
- package/dist/hosted-client/binding.js +10 -0
- package/dist/hosted-client/binding.js.map +1 -0
- package/dist/hosted-client/blob-delivery.d.ts +61 -0
- package/dist/hosted-client/blob-delivery.d.ts.map +1 -0
- package/dist/hosted-client/blob-delivery.js +147 -0
- package/dist/hosted-client/blob-delivery.js.map +1 -0
- package/dist/hosted-client/bundle-listing.d.ts +46 -0
- package/dist/hosted-client/bundle-listing.d.ts.map +1 -0
- package/dist/hosted-client/bundle-listing.js +36 -0
- package/dist/hosted-client/bundle-listing.js.map +1 -0
- package/dist/hosted-client/client.d.ts +155 -0
- package/dist/hosted-client/client.d.ts.map +1 -0
- package/dist/hosted-client/client.js +278 -0
- package/dist/hosted-client/client.js.map +1 -0
- package/dist/hosted-client/errors.d.ts +16 -0
- package/dist/hosted-client/errors.d.ts.map +1 -0
- package/dist/hosted-client/errors.js +22 -0
- package/dist/hosted-client/errors.js.map +1 -0
- package/dist/hosted-client/index.d.ts +23 -0
- package/dist/hosted-client/index.d.ts.map +1 -0
- package/dist/hosted-client/index.js +25 -0
- package/dist/hosted-client/index.js.map +1 -0
- package/dist/hosted-client/node.d.ts +70 -0
- package/dist/hosted-client/node.d.ts.map +1 -0
- package/dist/hosted-client/node.js +214 -0
- package/dist/hosted-client/node.js.map +1 -0
- package/dist/hosted-client/reference.d.ts +12 -0
- package/dist/hosted-client/reference.d.ts.map +1 -0
- package/dist/hosted-client/reference.js +29 -0
- package/dist/hosted-client/reference.js.map +1 -0
- package/dist/hosted-client/write.d.ts +200 -0
- package/dist/hosted-client/write.d.ts.map +1 -0
- package/dist/hosted-client/write.js +401 -0
- package/dist/hosted-client/write.js.map +1 -0
- package/dist/hosted-transport/answer-rows.d.ts +29 -2
- package/dist/hosted-transport/answer-rows.d.ts.map +1 -1
- package/dist/hosted-transport/answer-rows.js +60 -2
- package/dist/hosted-transport/answer-rows.js.map +1 -1
- package/dist/hosted-transport/blob-reads.d.ts +35 -0
- package/dist/hosted-transport/blob-reads.d.ts.map +1 -0
- package/dist/hosted-transport/blob-reads.js +179 -0
- package/dist/hosted-transport/blob-reads.js.map +1 -0
- package/dist/hosted-transport/blob-write.d.ts +34 -0
- package/dist/hosted-transport/blob-write.d.ts.map +1 -0
- package/dist/hosted-transport/blob-write.js +115 -0
- package/dist/hosted-transport/blob-write.js.map +1 -0
- package/dist/hosted-transport/carrier.d.ts +8 -9
- package/dist/hosted-transport/carrier.d.ts.map +1 -1
- package/dist/hosted-transport/carrier.js +40 -41
- package/dist/hosted-transport/carrier.js.map +1 -1
- package/dist/hosted-transport/index.d.ts +4 -4
- package/dist/hosted-transport/index.d.ts.map +1 -1
- package/dist/hosted-transport/index.js +4 -4
- package/dist/hosted-transport/index.js.map +1 -1
- package/dist/hosted-transport/read-adapter.d.ts +6 -0
- package/dist/hosted-transport/read-adapter.d.ts.map +1 -1
- package/dist/hosted-transport/read-adapter.js +11 -0
- package/dist/hosted-transport/read-adapter.js.map +1 -1
- package/dist/hosted-transport/whole-document-transport.d.ts +1 -1
- package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -1
- package/dist/hosted-transport/whole-document-transport.js +20 -12
- package/dist/hosted-transport/whole-document-transport.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/journaled-backend.d.ts +10 -2
- package/dist/journaled-backend.d.ts.map +1 -1
- package/dist/journaled-backend.js +3 -3
- package/dist/journaled-backend.js.map +1 -1
- package/dist/kinds-load.js +4 -4
- package/dist/kinds-load.js.map +1 -1
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +3 -2
- package/dist/kinds.js.map +1 -1
- package/dist/link-types.d.ts +26 -0
- package/dist/link-types.d.ts.map +1 -0
- package/dist/link-types.js +57 -0
- package/dist/link-types.js.map +1 -0
- package/dist/paths.d.ts +16 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +25 -0
- package/dist/paths.js.map +1 -1
- package/dist/platform.d.ts +4 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +16 -0
- package/dist/platform.js.map +1 -1
- package/dist/query-filter.d.ts +9 -0
- package/dist/query-filter.d.ts.map +1 -1
- package/dist/query-filter.js +19 -3
- package/dist/query-filter.js.map +1 -1
- package/dist/recipe-lifecycle/errors.d.ts +77 -0
- package/dist/recipe-lifecycle/errors.d.ts.map +1 -0
- package/dist/recipe-lifecycle/errors.js +96 -0
- package/dist/recipe-lifecycle/errors.js.map +1 -0
- package/dist/recipe-lifecycle/evolution.d.ts +71 -0
- package/dist/recipe-lifecycle/evolution.d.ts.map +1 -0
- package/dist/recipe-lifecycle/evolution.js +659 -0
- package/dist/recipe-lifecycle/evolution.js.map +1 -0
- package/dist/recipe-lifecycle/index.d.ts +23 -0
- package/dist/recipe-lifecycle/index.d.ts.map +1 -0
- package/dist/recipe-lifecycle/index.js +19 -0
- package/dist/recipe-lifecycle/index.js.map +1 -0
- package/dist/recipe-lifecycle/install.d.ts +111 -0
- package/dist/recipe-lifecycle/install.d.ts.map +1 -0
- package/dist/recipe-lifecycle/install.js +412 -0
- package/dist/recipe-lifecycle/install.js.map +1 -0
- package/dist/recipe-lifecycle/legacy-aliases.d.ts +16 -0
- package/dist/recipe-lifecycle/legacy-aliases.d.ts.map +1 -0
- package/dist/recipe-lifecycle/legacy-aliases.js +51 -0
- package/dist/recipe-lifecycle/legacy-aliases.js.map +1 -0
- package/dist/recipe-lifecycle/stamp.d.ts +98 -0
- package/dist/recipe-lifecycle/stamp.d.ts.map +1 -0
- package/dist/recipe-lifecycle/stamp.js +260 -0
- package/dist/recipe-lifecycle/stamp.js.map +1 -0
- package/dist/recipes.d.ts +5 -0
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +5 -0
- package/dist/recipes.js.map +1 -1
- package/dist/record-overlay/apply.d.ts +43 -0
- package/dist/record-overlay/apply.d.ts.map +1 -0
- package/dist/record-overlay/apply.js +490 -0
- package/dist/record-overlay/apply.js.map +1 -0
- package/dist/record-overlay/canonical.d.ts +14 -0
- package/dist/record-overlay/canonical.d.ts.map +1 -0
- package/dist/record-overlay/canonical.js +31 -0
- package/dist/record-overlay/canonical.js.map +1 -0
- package/dist/record-overlay/digest.d.ts +4 -0
- package/dist/record-overlay/digest.d.ts.map +1 -0
- package/dist/record-overlay/digest.js +11 -0
- package/dist/record-overlay/digest.js.map +1 -0
- package/dist/record-overlay/errors.d.ts +40 -0
- package/dist/record-overlay/errors.d.ts.map +1 -0
- package/dist/record-overlay/errors.js +51 -0
- package/dist/record-overlay/errors.js.map +1 -0
- package/dist/record-overlay/findings.d.ts +5 -0
- package/dist/record-overlay/findings.d.ts.map +1 -0
- package/dist/record-overlay/findings.js +83 -0
- package/dist/record-overlay/findings.js.map +1 -0
- package/dist/record-overlay/index.d.ts +23 -0
- package/dist/record-overlay/index.d.ts.map +1 -0
- package/dist/record-overlay/index.js +21 -0
- package/dist/record-overlay/index.js.map +1 -0
- package/dist/record-overlay/plan.d.ts +12 -0
- package/dist/record-overlay/plan.d.ts.map +1 -0
- package/dist/record-overlay/plan.js +284 -0
- package/dist/record-overlay/plan.js.map +1 -0
- package/dist/record-overlay/policy.d.ts +60 -0
- package/dist/record-overlay/policy.d.ts.map +1 -0
- package/dist/record-overlay/policy.js +209 -0
- package/dist/record-overlay/policy.js.map +1 -0
- package/dist/record-overlay/redact.d.ts +3 -0
- package/dist/record-overlay/redact.d.ts.map +1 -0
- package/dist/record-overlay/redact.js +27 -0
- package/dist/record-overlay/redact.js.map +1 -0
- package/dist/record-overlay/signal-kind.d.ts +30 -0
- package/dist/record-overlay/signal-kind.d.ts.map +1 -0
- package/dist/record-overlay/signal-kind.js +38 -0
- package/dist/record-overlay/signal-kind.js.map +1 -0
- package/dist/record-overlay/signal-text.d.ts +45 -0
- package/dist/record-overlay/signal-text.d.ts.map +1 -0
- package/dist/record-overlay/signal-text.js +116 -0
- package/dist/record-overlay/signal-text.js.map +1 -0
- package/dist/record-overlay/source-index.d.ts +19 -0
- package/dist/record-overlay/source-index.d.ts.map +1 -0
- package/dist/record-overlay/source-index.js +102 -0
- package/dist/record-overlay/source-index.js.map +1 -0
- package/dist/record-overlay/types.d.ts +286 -0
- package/dist/record-overlay/types.d.ts.map +1 -0
- package/dist/record-overlay/types.js +2 -0
- package/dist/record-overlay/types.js.map +1 -0
- package/dist/remote-operations.js +5 -2
- package/dist/remote-operations.js.map +1 -1
- package/dist/storage.d.ts +5 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +4 -1
- package/dist/storage.js.map +1 -1
- package/dist/uncertain-write.d.ts +107 -6
- package/dist/uncertain-write.d.ts.map +1 -1
- package/dist/uncertain-write.js +67 -32
- package/dist/uncertain-write.js.map +1 -1
- package/dist/write-identity.d.ts +5 -0
- package/dist/write-identity.d.ts.map +1 -0
- package/dist/write-identity.js +9 -0
- package/dist/write-identity.js.map +1 -0
- package/package.json +21 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Feed policy: which fields a feed owns and what each change kind may do. Reads the feed's
|
|
3
|
+
* frontmatter and decides per change, purely.
|
|
4
|
+
*/
|
|
5
|
+
import { type KindConvention } from "../kinds.js";
|
|
6
|
+
import type { ConceptId, Frontmatter } from "../types.js";
|
|
7
|
+
import type { ChangeDecision, OverlayPolicy, PolicyContext, RecordChange, Tell, TextGate } from "./types.js";
|
|
8
|
+
export declare const DEFAULT_AUTO_APPLY: readonly string[];
|
|
9
|
+
export declare const DEFAULT_NEEDS_REVIEW: readonly string[];
|
|
10
|
+
/** Fields a feed may never own: identity, provenance and trust stay with Superbee and editors. */
|
|
11
|
+
export declare const NEVER_OWNED: ReadonlySet<string>;
|
|
12
|
+
/**
|
|
13
|
+
* The work state of a target Kind, which no feed may own whatever the Kind declares: both editions'
|
|
14
|
+
* progress storage fields and the Kind's resolved claim coordinates on the given editions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function workStateFields(kind: KindConvention | undefined, editions: readonly ("0.1" | "0.2")[]): Set<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Read the generic keys of a Source Feed document. Every refusal is `POLICY_INVALID`. A
|
|
19
|
+
* presentation-only feed never writes documents, so names a document could never own (a
|
|
20
|
+
* Condition's `status`) are plain record fields there, and its policy carries no `target_kind`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readOverlayPolicy(doc: {
|
|
23
|
+
id: ConceptId;
|
|
24
|
+
frontmatter: Frontmatter;
|
|
25
|
+
}, ctx?: PolicyContext): OverlayPolicy;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a record is editorially excluded: its title matches `exclude`, or its source id (or, for
|
|
28
|
+
* a recurrence occurrence `<series id>#<date>`, its series id) is in `exclude_ids`. Excluded records
|
|
29
|
+
* are never projected and never raise Signals.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isExcludedRecord(policy: OverlayPolicy, externalId: string | undefined, title: unknown): boolean;
|
|
32
|
+
export declare const severity: (kind: unknown) => number;
|
|
33
|
+
export declare const maxPriority: <T>(a: T, b: T) => T;
|
|
34
|
+
/**
|
|
35
|
+
* Decide one change. Per owned field, with B the last accepted feed value (`change.before`), N the
|
|
36
|
+
* new feed value and C the overlay document's value: C equal to N is converged (nothing to write);
|
|
37
|
+
* C equal to B writes N; anything else is `OVERLAY_DOC_CONFLICT`. Changes to fields the feed does
|
|
38
|
+
* not own are never written; on an overlay document they need judgment.
|
|
39
|
+
*
|
|
40
|
+
* A value is written as the text gate words it, and C is compared with B and N as gated too, so a
|
|
41
|
+
* document that already says the normalized value converges. A value the gate still refuses is
|
|
42
|
+
* not written: it is listed in `wording` and raises a low-priority Signal.
|
|
43
|
+
*/
|
|
44
|
+
export declare function decideChange(policy: OverlayPolicy, change: RecordChange, { overlay, featured, textGate }?: {
|
|
45
|
+
overlay?: {
|
|
46
|
+
frontmatter: Record<string, unknown>;
|
|
47
|
+
} | null;
|
|
48
|
+
featured?: boolean;
|
|
49
|
+
textGate?: TextGate;
|
|
50
|
+
}): ChangeDecision;
|
|
51
|
+
/**
|
|
52
|
+
* A feed value as an overlay document may carry it. A string goes through the text gate for its
|
|
53
|
+
* field and the overlay's Kind; any other value passes when every string inside it passes as it is.
|
|
54
|
+
*/
|
|
55
|
+
export declare function gateSafeValue(value: unknown, field: string, kind: string | undefined, textGate?: TextGate): {
|
|
56
|
+
value: unknown;
|
|
57
|
+
ok: boolean;
|
|
58
|
+
tells: Tell[];
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/record-overlay/policy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAgD,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7G,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAA+B,CAAC;AAChF,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAsE,CAAC;AACzH,kGAAkG;AAClG,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAE1C,CAAC;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAInH;AAUD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,EAAE,GAAG,GAAE,aAAkB,GAAG,aAAa,CA4C1H;AASD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAO/G;AAGD,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,MAAuC,CAAC;AAEjF,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAG,CAAqF,CAAC;AAElI;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,EACpB,EAAE,OAAc,EAAE,QAAgB,EAAE,QAAQ,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,GAC1J,cAAc,CA6ChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,QAAQ,GAAE,QAAuB,GAChC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAiBhD"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Feed policy: which fields a feed owns and what each change kind may do. Reads the feed's
|
|
3
|
+
* frontmatter and decides per change, purely.
|
|
4
|
+
*/
|
|
5
|
+
import { claimCoordinates, progressStatusStorageField } from "../kinds.js";
|
|
6
|
+
import { same } from "./canonical.js";
|
|
7
|
+
import { OverlayRefusal, REFUSAL_CODES } from "./errors.js";
|
|
8
|
+
export const DEFAULT_AUTO_APPLY = Object.freeze(["changed"]);
|
|
9
|
+
export const DEFAULT_NEEDS_REVIEW = Object.freeze(["new", "canceled", "disappeared", "page-changed"]);
|
|
10
|
+
/** Fields a feed may never own: identity, provenance and trust stay with Superbee and editors. */
|
|
11
|
+
export const NEVER_OWNED = new Set([
|
|
12
|
+
"type", "sources", "verified", "generated", "status", "stale_after", "tags", "superbee_updated_by",
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* The work state of a target Kind, which no feed may own whatever the Kind declares: both editions'
|
|
16
|
+
* progress storage fields and the Kind's resolved claim coordinates on the given editions.
|
|
17
|
+
*/
|
|
18
|
+
export function workStateFields(kind, editions) {
|
|
19
|
+
const fields = new Set([progressStatusStorageField("0.1"), progressStatusStorageField("0.2")]);
|
|
20
|
+
if (kind)
|
|
21
|
+
for (const edition of editions)
|
|
22
|
+
for (const field of claimCoordinates(edition, kind)?.fields ?? [])
|
|
23
|
+
fields.add(field);
|
|
24
|
+
return fields;
|
|
25
|
+
}
|
|
26
|
+
const list = (v) => (Array.isArray(v) ? v.map(String).filter(Boolean)
|
|
27
|
+
: typeof v === "string" && v ? v.split(",").map((s) => s.trim()).filter(Boolean)
|
|
28
|
+
: undefined);
|
|
29
|
+
const identityGate = (text) => ({ text, ok: true, tells: [], changed: false });
|
|
30
|
+
/**
|
|
31
|
+
* Read the generic keys of a Source Feed document. Every refusal is `POLICY_INVALID`. A
|
|
32
|
+
* presentation-only feed never writes documents, so names a document could never own (a
|
|
33
|
+
* Condition's `status`) are plain record fields there, and its policy carries no `target_kind`.
|
|
34
|
+
*/
|
|
35
|
+
export function readOverlayPolicy(doc, ctx = {}) {
|
|
36
|
+
const fm = (doc.frontmatter ?? {});
|
|
37
|
+
const refuse = (message, details = {}) => {
|
|
38
|
+
throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${doc.id}: ${message}`, { feed: doc.id, ...details });
|
|
39
|
+
};
|
|
40
|
+
if (ctx.targetKind !== undefined && ctx.presentationFields !== undefined)
|
|
41
|
+
refuse("a target Kind and presentation fields are mutually exclusive");
|
|
42
|
+
const presentation = ctx.presentationFields !== undefined;
|
|
43
|
+
const owned = list(fm.owned_fields);
|
|
44
|
+
if (!owned || owned.length === 0)
|
|
45
|
+
refuse("owned_fields is required");
|
|
46
|
+
const ownedFields = owned;
|
|
47
|
+
const bad = presentation ? [] : ownedFields.filter((f) => NEVER_OWNED.has(f));
|
|
48
|
+
if (bad.length)
|
|
49
|
+
refuse(`fields can never be feed-owned: ${bad.join(", ")}`, { fields: bad });
|
|
50
|
+
if (ctx.targetKind) {
|
|
51
|
+
const work = workStateFields(ctx.targetKind, ["0.1", "0.2"]);
|
|
52
|
+
const claimed = ownedFields.filter((f) => work.has(f));
|
|
53
|
+
if (claimed.length)
|
|
54
|
+
refuse(`fields hold the work state of ${ctx.targetKind.governs} and can never be feed-owned: ${claimed.join(", ")}`, { fields: claimed });
|
|
55
|
+
}
|
|
56
|
+
if (ctx.targetKind) {
|
|
57
|
+
const declared = new Set([...ctx.targetKind.fields.required, ...ctx.targetKind.fields.optional, "title"]);
|
|
58
|
+
const undeclared = ownedFields.filter((f) => !declared.has(f));
|
|
59
|
+
if (undeclared.length)
|
|
60
|
+
refuse(`owned_fields not declared by ${ctx.targetKind.governs}: ${undeclared.join(", ")}`, { fields: undeclared });
|
|
61
|
+
}
|
|
62
|
+
if (presentation) {
|
|
63
|
+
const allowed = new Set(ctx.presentationFields);
|
|
64
|
+
const undeclared = ownedFields.filter((f) => !allowed.has(f));
|
|
65
|
+
if (undeclared.length)
|
|
66
|
+
refuse(`owned_fields not part of the presentation kind: ${undeclared.join(", ")}`, { fields: undeclared });
|
|
67
|
+
}
|
|
68
|
+
const threshold = fm.missing_threshold === undefined || fm.missing_threshold === null ? undefined : Number(fm.missing_threshold);
|
|
69
|
+
if (threshold !== undefined && !(Number.isInteger(threshold) && threshold >= 1))
|
|
70
|
+
refuse("missing_threshold must be a whole number >= 1");
|
|
71
|
+
if (typeof fm.url !== "string" || !fm.url)
|
|
72
|
+
refuse("url (provider identity) is required");
|
|
73
|
+
const zone = fm.wall_time_zone === undefined || fm.wall_time_zone === null ? undefined : String(fm.wall_time_zone).trim();
|
|
74
|
+
const targetKind = !presentation && typeof fm.target_kind === "string" && fm.target_kind ? fm.target_kind : undefined;
|
|
75
|
+
return {
|
|
76
|
+
feed: doc.id,
|
|
77
|
+
provider: fm.url,
|
|
78
|
+
...(targetKind ? { target_kind: targetKind } : {}),
|
|
79
|
+
owned_fields: ownedFields,
|
|
80
|
+
auto_apply: list(fm.auto_apply) ?? [...DEFAULT_AUTO_APPLY],
|
|
81
|
+
needs_review: list(fm.needs_review) ?? [...DEFAULT_NEEDS_REVIEW],
|
|
82
|
+
exclude: excludeOf(doc.id, fm.exclude_pattern),
|
|
83
|
+
...(threshold !== undefined ? { missing_threshold: threshold } : {}),
|
|
84
|
+
...(fm.completeness === "complete" || fm.completeness === "partial" ? { completeness: fm.completeness } : {}),
|
|
85
|
+
...(zone ? { time_zone: zone } : {}),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Optional editorial exclusion: a case-insensitive pattern on the record title. */
|
|
89
|
+
function excludeOf(feed, pattern) {
|
|
90
|
+
if (pattern === undefined || pattern === null || pattern === "")
|
|
91
|
+
return null;
|
|
92
|
+
try {
|
|
93
|
+
return new RegExp(String(pattern), "i");
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${feed}: exclude_pattern is not a valid pattern`, { feed });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether a record is editorially excluded: its title matches `exclude`, or its source id (or, for
|
|
101
|
+
* a recurrence occurrence `<series id>#<date>`, its series id) is in `exclude_ids`. Excluded records
|
|
102
|
+
* are never projected and never raise Signals.
|
|
103
|
+
*/
|
|
104
|
+
export function isExcludedRecord(policy, externalId, title) {
|
|
105
|
+
if (policy.exclude && policy.exclude.test(String(title ?? "")))
|
|
106
|
+
return true;
|
|
107
|
+
if (!policy.exclude_ids || externalId === undefined || externalId === null)
|
|
108
|
+
return false;
|
|
109
|
+
const id = String(externalId);
|
|
110
|
+
if (policy.exclude_ids.has(id))
|
|
111
|
+
return true;
|
|
112
|
+
const hash = id.indexOf("#");
|
|
113
|
+
return hash > 0 && policy.exclude_ids.has(id.slice(0, hash));
|
|
114
|
+
}
|
|
115
|
+
const SEVERITY = { new: 1, changed: 2, "page-changed": 2, disappeared: 3, canceled: 4 };
|
|
116
|
+
export const severity = (kind) => SEVERITY[kind] ?? 0;
|
|
117
|
+
const PRIORITY_RANK = { low: 1, normal: 2, urgent: 3 };
|
|
118
|
+
export const maxPriority = (a, b) => ((PRIORITY_RANK[a] ?? 0) >= (PRIORITY_RANK[b] ?? 0) ? a : b);
|
|
119
|
+
/**
|
|
120
|
+
* Decide one change. Per owned field, with B the last accepted feed value (`change.before`), N the
|
|
121
|
+
* new feed value and C the overlay document's value: C equal to N is converged (nothing to write);
|
|
122
|
+
* C equal to B writes N; anything else is `OVERLAY_DOC_CONFLICT`. Changes to fields the feed does
|
|
123
|
+
* not own are never written; on an overlay document they need judgment.
|
|
124
|
+
*
|
|
125
|
+
* A value is written as the text gate words it, and C is compared with B and N as gated too, so a
|
|
126
|
+
* document that already says the normalized value converges. A value the gate still refuses is
|
|
127
|
+
* not written: it is listed in `wording` and raises a low-priority Signal.
|
|
128
|
+
*/
|
|
129
|
+
export function decideChange(policy, change, { overlay = null, featured = false, textGate } = {}) {
|
|
130
|
+
const owned = new Set(policy.owned_fields);
|
|
131
|
+
const apply = {};
|
|
132
|
+
const conflicts = [];
|
|
133
|
+
const wording = [];
|
|
134
|
+
let editorFields = [];
|
|
135
|
+
const reasons = [];
|
|
136
|
+
const autoApply = policy.auto_apply.includes(change.change_kind);
|
|
137
|
+
const kind = policy.target_kind;
|
|
138
|
+
if (overlay && change.after && change.before && autoApply) {
|
|
139
|
+
for (const f of change.changed_fields) {
|
|
140
|
+
if (!owned.has(f))
|
|
141
|
+
continue;
|
|
142
|
+
const C = overlay.frontmatter[f], B = change.before[f], N = change.after[f];
|
|
143
|
+
const n = gateSafeValue(N, f, kind, textGate), b = gateSafeValue(B, f, kind, textGate);
|
|
144
|
+
if (same(C, N) || same(C, n.value))
|
|
145
|
+
continue;
|
|
146
|
+
if (same(C, B) || same(C, b.value)) {
|
|
147
|
+
if (n.ok)
|
|
148
|
+
apply[f] = { from: C, to: n.value };
|
|
149
|
+
else
|
|
150
|
+
wording.push({ field: f, text: typeof N === "string" ? N : JSON.stringify(N), tells: n.tells });
|
|
151
|
+
}
|
|
152
|
+
else
|
|
153
|
+
conflicts.push({ field: f, doc_value: C, feed_before: B, feed_after: N });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// An editor-owned change needs judgment only when the document does not already say the new value.
|
|
157
|
+
if (overlay && change.before && change.after) {
|
|
158
|
+
const after = change.after;
|
|
159
|
+
editorFields = change.changed_fields.filter((f) => !owned.has(f) && !same(overlay.frontmatter[f], after[f]));
|
|
160
|
+
}
|
|
161
|
+
if (policy.needs_review.includes(change.change_kind))
|
|
162
|
+
reasons.push(`needs_review:${change.change_kind}`);
|
|
163
|
+
if (conflicts.length)
|
|
164
|
+
reasons.push(REFUSAL_CODES.OVERLAY_DOC_CONFLICT);
|
|
165
|
+
if (editorFields.length)
|
|
166
|
+
reasons.push("editor-owned-field-changed");
|
|
167
|
+
if (overlay && !autoApply && !policy.needs_review.includes(change.change_kind) && change.changed_fields.some((f) => owned.has(f))) {
|
|
168
|
+
reasons.push("owned-field-changed-without-auto-apply");
|
|
169
|
+
}
|
|
170
|
+
if (wording.length)
|
|
171
|
+
reasons.push("needs-human-safe-wording");
|
|
172
|
+
let signal = null;
|
|
173
|
+
if (reasons.length) {
|
|
174
|
+
// Text held back for a wording is not news: alone, it is a low-priority Signal.
|
|
175
|
+
let priority = wording.length && reasons.length === 1 ? "low" : "normal";
|
|
176
|
+
if (change.change_kind === "new" && !overlay)
|
|
177
|
+
priority = "low";
|
|
178
|
+
if (change.change_kind === "canceled" && (overlay || featured))
|
|
179
|
+
priority = "urgent";
|
|
180
|
+
signal = { priority, reasons };
|
|
181
|
+
}
|
|
182
|
+
return { apply, conflicts, editorFields, wording, signal };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* A feed value as an overlay document may carry it. A string goes through the text gate for its
|
|
186
|
+
* field and the overlay's Kind; any other value passes when every string inside it passes as it is.
|
|
187
|
+
*/
|
|
188
|
+
export function gateSafeValue(value, field, kind, textGate = identityGate) {
|
|
189
|
+
if (typeof value === "string") {
|
|
190
|
+
const r = textGate(value, { field, kind });
|
|
191
|
+
return { value: r.text, ok: r.ok, tells: r.tells };
|
|
192
|
+
}
|
|
193
|
+
const strings = [];
|
|
194
|
+
const walk = (v) => {
|
|
195
|
+
if (typeof v === "string")
|
|
196
|
+
strings.push(v);
|
|
197
|
+
else if (Array.isArray(v))
|
|
198
|
+
v.forEach(walk);
|
|
199
|
+
else if (v && typeof v === "object")
|
|
200
|
+
Object.values(v).forEach(walk);
|
|
201
|
+
};
|
|
202
|
+
walk(value);
|
|
203
|
+
const tells = strings.flatMap((s) => {
|
|
204
|
+
const r = textGate(s, { field, kind });
|
|
205
|
+
return r.changed || !r.ok ? (r.tells.length ? r.tells : [{ code: "NEEDS_NORMALIZING", match: s.slice(0, 80) }]) : [];
|
|
206
|
+
});
|
|
207
|
+
return { value, ok: tells.length === 0, tells };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/record-overlay/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/record-overlay/redact.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;AAC/C,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Provider URLs may carry credentials in userinfo or query parameters; no Signal echoes them.
|
|
2
|
+
const SECRET_PARAM = /^(token|access_token|api[_-]?key|key|secret|signature|sig|auth|password|pass|apikey|client_secret|session)$/i;
|
|
3
|
+
export function redactUrl(raw) {
|
|
4
|
+
if (typeof raw !== "string" || raw === "")
|
|
5
|
+
return raw;
|
|
6
|
+
let u;
|
|
7
|
+
try {
|
|
8
|
+
u = new URL(raw);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return raw;
|
|
12
|
+
}
|
|
13
|
+
let changed = false;
|
|
14
|
+
if (u.username || u.password) {
|
|
15
|
+
u.username = "";
|
|
16
|
+
u.password = "";
|
|
17
|
+
changed = true;
|
|
18
|
+
}
|
|
19
|
+
for (const k of [...u.searchParams.keys()]) {
|
|
20
|
+
if (SECRET_PARAM.test(k)) {
|
|
21
|
+
u.searchParams.set(k, "REDACTED");
|
|
22
|
+
changed = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return changed ? u.toString() : raw;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/record-overlay/redact.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,YAAY,GAAG,8GAA8G,CAAC;AAIpI,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IACtD,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,CAAC;IAAC,CAAC;IAC/C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;QAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;QAAC,OAAO,GAAG,IAAI,CAAC;IAAC,CAAC;IACnF,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;QAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attention Kind: the one Kind record-overlay may create documents of, and the only Kind whose
|
|
3
|
+
* documents it updates outside the owned-field guard. Resolved from the ops registry at plan time
|
|
4
|
+
* and again at apply time, by the same rules.
|
|
5
|
+
*/
|
|
6
|
+
import { type KindConvention, type KindRegistry } from "../kinds.js";
|
|
7
|
+
/** Fields an attention Kind must declare: the Signal record a raise and a collapse write. */
|
|
8
|
+
export declare const ATTENTION_FIELDS: readonly string[];
|
|
9
|
+
export interface AttentionKind {
|
|
10
|
+
name: string;
|
|
11
|
+
kind: KindConvention;
|
|
12
|
+
/** The only id prefix a Signal create may target and a Signal update may touch. */
|
|
13
|
+
prefix: string;
|
|
14
|
+
stateField: string;
|
|
15
|
+
ownerField: string;
|
|
16
|
+
}
|
|
17
|
+
export type AttentionResolution = {
|
|
18
|
+
ok: true;
|
|
19
|
+
value: AttentionKind;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
reason: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The attention Kind must be declared in the ops registry, differ from the overlay target Kind,
|
|
26
|
+
* resolve both claim coordinates on this edition, and declare every {@link ATTENTION_FIELDS} member.
|
|
27
|
+
* Its declared `path` (default `signals/`) bounds where its documents may live.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveAttentionKind(registry: KindRegistry, okfVersion: string, name: string, targetKind: string | undefined): AttentionResolution;
|
|
30
|
+
//# sourceMappingURL=signal-kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-kind.d.ts","sourceRoot":"","sources":["../../src/record-overlay/signal-kind.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvF,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA6F,CAAC;AAE5I,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErG;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,mBAAmB,CAmBrB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attention Kind: the one Kind record-overlay may create documents of, and the only Kind whose
|
|
3
|
+
* documents it updates outside the owned-field guard. Resolved from the ops registry at plan time
|
|
4
|
+
* and again at apply time, by the same rules.
|
|
5
|
+
*/
|
|
6
|
+
import { claimCoordinates } from "../kinds.js";
|
|
7
|
+
/** Fields an attention Kind must declare: the Signal record a raise and a collapse write. */
|
|
8
|
+
export const ATTENTION_FIELDS = Object.freeze(["change_kind", "observed_at", "provider", "external_id", "diff_summary"]);
|
|
9
|
+
/**
|
|
10
|
+
* The attention Kind must be declared in the ops registry, differ from the overlay target Kind,
|
|
11
|
+
* resolve both claim coordinates on this edition, and declare every {@link ATTENTION_FIELDS} member.
|
|
12
|
+
* Its declared `path` (default `signals/`) bounds where its documents may live.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveAttentionKind(registry, okfVersion, name, targetKind) {
|
|
15
|
+
const kind = registry.kinds.get(name);
|
|
16
|
+
if (!kind)
|
|
17
|
+
return { ok: false, reason: `the attention Kind ${name} is not declared in the ops bundle` };
|
|
18
|
+
if (targetKind !== undefined && name === targetKind)
|
|
19
|
+
return { ok: false, reason: `the attention Kind ${name} is the overlay target Kind` };
|
|
20
|
+
const claim = claimCoordinates(okfVersion, kind);
|
|
21
|
+
if (!claim?.ownerField || !claim.stateField)
|
|
22
|
+
return { ok: false, reason: `the attention Kind ${name} declares no resolvable claim owner and state fields` };
|
|
23
|
+
const declared = new Set([...kind.fields.required, ...kind.fields.optional]);
|
|
24
|
+
const missing = ATTENTION_FIELDS.filter((field) => !declared.has(field));
|
|
25
|
+
if (missing.length)
|
|
26
|
+
return { ok: false, reason: `the attention Kind ${name} does not declare ${missing.join(", ")}` };
|
|
27
|
+
return {
|
|
28
|
+
ok: true,
|
|
29
|
+
value: {
|
|
30
|
+
name,
|
|
31
|
+
kind,
|
|
32
|
+
prefix: (kind.path ?? "signals/").replace(/\/?$/, "/"),
|
|
33
|
+
stateField: claim.stateField,
|
|
34
|
+
ownerField: claim.ownerField,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=signal-kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-kind.js","sourceRoot":"","sources":["../../src/record-overlay/signal-kind.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAA0C,MAAM,aAAa,CAAC;AAEvF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,gBAAgB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAa5I;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsB,EACtB,UAAkB,EAClB,IAAY,EACZ,UAA8B;IAE9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,IAAI,oCAAoC,EAAE,CAAC;IACxG,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,IAAI,6BAA6B,EAAE,CAAC;IAC3I,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,IAAI,sDAAsD,EAAE,CAAC;IAC5J,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,IAAI,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACtH,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE;YACL,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;YACtD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The text of a Signal: its observation line and its body. One rendering for the planner, which
|
|
3
|
+
* writes it, and for the apply's Signal guards, which accept a Signal's text only when it is what
|
|
4
|
+
* this rendering produces from the Signal's own fields and the run, so every honest plan passes and
|
|
5
|
+
* free text does not.
|
|
6
|
+
*/
|
|
7
|
+
import type { KindConvention } from "../kinds.js";
|
|
8
|
+
/** Text kept on one line: every line break becomes a space. */
|
|
9
|
+
export declare function oneLine(text: string): string;
|
|
10
|
+
export declare function isConceptId(value: unknown): value is string;
|
|
11
|
+
/** The attention Kind's link vocabulary, derived from its convention, never hard-coded. */
|
|
12
|
+
export declare function signalLinkTexts(signalKind: KindConvention | undefined, targetKind: string | undefined, feedKind?: string): {
|
|
13
|
+
fromFeed?: string;
|
|
14
|
+
about?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function observationLine(observedAt: unknown, changeKind: unknown, digest: unknown, summary: unknown): string;
|
|
17
|
+
export declare const linkLine: (text: string, fromId: string, targetId: string) => string;
|
|
18
|
+
export declare const overlayLine: (id: string) => string;
|
|
19
|
+
export declare const relatedLine: (id: string, reason?: string) => string;
|
|
20
|
+
export declare const adoptionHint: (targetKind: unknown, provider: unknown, externalId: unknown) => string;
|
|
21
|
+
export declare function signalBody(links: readonly string[], hint: string | undefined, line: string): string;
|
|
22
|
+
export interface SignalTextContext {
|
|
23
|
+
/** The Signal's id. */
|
|
24
|
+
target: string;
|
|
25
|
+
/** The feed its plan was made for, when the plan names one. */
|
|
26
|
+
feed: string | null | undefined;
|
|
27
|
+
/** The run's target Kind, for the adoption hint and the typed overlay link. */
|
|
28
|
+
targetKind: string | undefined;
|
|
29
|
+
links: {
|
|
30
|
+
fromFeed?: string;
|
|
31
|
+
about?: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A created Signal's body is the planner's: its link lines, the adoption hint for this record when
|
|
36
|
+
* present, and the observation line rendered from the Signal's own `observed_at`, `change_kind`,
|
|
37
|
+
* `diff_summary` and the step's digest.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isPlannedSignalBody(body: string, frontmatter: Record<string, unknown>, digest: string, context: SignalTextContext): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* A collapse's observation line is the planner's: rendered from the update's own `observed_at`,
|
|
42
|
+
* `diff_summary` and the step's digest, around the change kind it records.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isPlannedObservation(line: string, set: Record<string, unknown>, digest: string): boolean;
|
|
45
|
+
//# sourceMappingURL=signal-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-text.d.ts","sourceRoot":"","sources":["../../src/record-overlay/signal-text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASlD,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAG3D;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAgB,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAKvK;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAEnH;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,MAAwD,CAAC;AACnI,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,MAAoC,CAAC;AAC9E,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,EAAE,SAAS,MAAM,KAAG,MAAiF,CAAC;AAC5I,eAAO,MAAM,YAAY,GAAI,YAAY,OAAO,EAAE,UAAU,OAAO,EAAE,YAAY,OAAO,KAAG,MAC2C,CAAC;AAEvI,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnG;AAeD,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAuBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOxG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { relativeHref } from "../links.js";
|
|
2
|
+
import { assertSafeConceptId } from "../paths.js";
|
|
3
|
+
const LINE_BREAKS = /\r\n|[\r\n\u0085\u2028\u2029]/g;
|
|
4
|
+
const LINE_BREAK = /[\r\n\u0085\u2028\u2029]/;
|
|
5
|
+
const OVERLAY_PREFIX = "Overlay document (content bundle): `";
|
|
6
|
+
const RELATED_PREFIX = "Related document (content bundle): `";
|
|
7
|
+
/** Text kept on one line: every line break becomes a space. */
|
|
8
|
+
export function oneLine(text) {
|
|
9
|
+
return text.replace(LINE_BREAKS, " ");
|
|
10
|
+
}
|
|
11
|
+
export function isConceptId(value) {
|
|
12
|
+
if (typeof value !== "string")
|
|
13
|
+
return false;
|
|
14
|
+
try {
|
|
15
|
+
assertSafeConceptId(value);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** The attention Kind's link vocabulary, derived from its convention, never hard-coded. */
|
|
23
|
+
export function signalLinkTexts(signalKind, targetKind, feedKind = "Source Feed") {
|
|
24
|
+
const links = signalKind?.links ?? {};
|
|
25
|
+
const fromFeed = Object.keys(links).find((t) => links[t] === feedKind);
|
|
26
|
+
const about = targetKind ? Object.keys(links).find((t) => links[t] === targetKind) : undefined;
|
|
27
|
+
return { fromFeed, about };
|
|
28
|
+
}
|
|
29
|
+
export function observationLine(observedAt, changeKind, digest, summary) {
|
|
30
|
+
return `- ${observedAt} · ${changeKind} · ${digest} · ${summary}`;
|
|
31
|
+
}
|
|
32
|
+
export const linkLine = (text, fromId, targetId) => `[${text}](${relativeHref(fromId, targetId)})`;
|
|
33
|
+
export const overlayLine = (id) => `${OVERLAY_PREFIX}${id}\``;
|
|
34
|
+
export const relatedLine = (id, reason) => `${RELATED_PREFIX}${id}\`${reason === undefined ? "" : ` (${reason})`}`;
|
|
35
|
+
export const adoptionHint = (targetKind, provider, externalId) => `To overlay this record, give a document of Kind "${targetKind}" the source entry \`resource: ${provider}\`, \`id: ${externalId}\`.`;
|
|
36
|
+
export function signalBody(links, hint, line) {
|
|
37
|
+
return `${links.join("\n")}\n${hint === undefined ? "" : `\n${hint}\n`}\n# Observations\n\n${line}\n`;
|
|
38
|
+
}
|
|
39
|
+
/** The concept id a relative link from `fromId` names, or null. */
|
|
40
|
+
function linkTarget(fromId, href) {
|
|
41
|
+
const slash = fromId.lastIndexOf("/");
|
|
42
|
+
const parts = slash >= 0 ? fromId.slice(0, slash).split("/") : [];
|
|
43
|
+
for (const segment of href.split("/")) {
|
|
44
|
+
if (segment === "..") {
|
|
45
|
+
if (parts.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
parts.pop();
|
|
48
|
+
}
|
|
49
|
+
else if (segment === "" || segment === ".")
|
|
50
|
+
return null;
|
|
51
|
+
else
|
|
52
|
+
parts.push(segment);
|
|
53
|
+
}
|
|
54
|
+
const path = parts.join("/");
|
|
55
|
+
return path.endsWith(".md") ? path.slice(0, -3) : null;
|
|
56
|
+
}
|
|
57
|
+
function plannedLink(text, context) {
|
|
58
|
+
const { target, feed, links } = context;
|
|
59
|
+
if (links.fromFeed !== undefined && isConceptId(feed) && isConceptId(target) && text === linkLine(links.fromFeed, target, feed))
|
|
60
|
+
return true;
|
|
61
|
+
if (links.about !== undefined && text.startsWith(`[${links.about}](`) && text.endsWith(")")) {
|
|
62
|
+
const id = linkTarget(target, text.slice(links.about.length + 3, -1));
|
|
63
|
+
if (isConceptId(id) && isConceptId(target) && text === linkLine(links.about, target, id))
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (text.startsWith(OVERLAY_PREFIX) && text.endsWith("`") && isConceptId(text.slice(OVERLAY_PREFIX.length, -1)))
|
|
67
|
+
return true;
|
|
68
|
+
if (text.startsWith(RELATED_PREFIX)) {
|
|
69
|
+
const rest = text.slice(RELATED_PREFIX.length);
|
|
70
|
+
if (rest.endsWith("`") && isConceptId(rest.slice(0, -1)))
|
|
71
|
+
return true;
|
|
72
|
+
if (rest.endsWith(")")) {
|
|
73
|
+
for (let at = rest.indexOf("` ("); at > 0; at = rest.indexOf("` (", at + 1)) {
|
|
74
|
+
const reason = rest.slice(at + 3, -1);
|
|
75
|
+
if (isConceptId(rest.slice(0, at)) && reason.length <= 120 && !LINE_BREAK.test(reason))
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A created Signal's body is the planner's: its link lines, the adoption hint for this record when
|
|
84
|
+
* present, and the observation line rendered from the Signal's own `observed_at`, `change_kind`,
|
|
85
|
+
* `diff_summary` and the step's digest.
|
|
86
|
+
*/
|
|
87
|
+
export function isPlannedSignalBody(body, frontmatter, digest, context) {
|
|
88
|
+
const suffix = `# Observations\n\n${observationLine(frontmatter.observed_at, frontmatter.change_kind, digest, frontmatter.diff_summary)}\n`;
|
|
89
|
+
if (!body.endsWith(suffix))
|
|
90
|
+
return false;
|
|
91
|
+
const preamble = body.slice(0, -suffix.length);
|
|
92
|
+
const hint = context.targetKind === undefined ? undefined : adoptionHint(context.targetKind, frontmatter.provider, frontmatter.external_id);
|
|
93
|
+
let links;
|
|
94
|
+
if (hint !== undefined && preamble.endsWith(`\n\n${hint}\n\n`))
|
|
95
|
+
links = preamble.slice(0, preamble.length - hint.length - 4);
|
|
96
|
+
else if (preamble.endsWith("\n\n"))
|
|
97
|
+
links = preamble.slice(0, -2);
|
|
98
|
+
else
|
|
99
|
+
return false;
|
|
100
|
+
return links === "" || links.split("\n").every((text) => plannedLink(text, context));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A collapse's observation line is the planner's: rendered from the update's own `observed_at`,
|
|
104
|
+
* `diff_summary` and the step's digest, around the change kind it records.
|
|
105
|
+
*/
|
|
106
|
+
export function isPlannedObservation(line, set, digest) {
|
|
107
|
+
if (typeof set.observed_at !== "string" || typeof set.diff_summary !== "string")
|
|
108
|
+
return false;
|
|
109
|
+
const prefix = `- ${set.observed_at} · `;
|
|
110
|
+
const suffix = ` · ${digest} · ${set.diff_summary}`;
|
|
111
|
+
if (line.length <= prefix.length + suffix.length || !line.startsWith(prefix) || !line.endsWith(suffix))
|
|
112
|
+
return false;
|
|
113
|
+
const kind = line.slice(prefix.length, line.length - suffix.length);
|
|
114
|
+
return kind === set.change_kind || !LINE_BREAK.test(kind);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=signal-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-text.js","sourceRoot":"","sources":["../../src/record-overlay/signal-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Bundle, HeadResult, OkfDocument, QueryFilter, Version } from "../types.js";
|
|
2
|
+
export declare class SourceIndex {
|
|
3
|
+
#private;
|
|
4
|
+
static fromHeads(heads: Iterable<HeadResult>): SourceIndex;
|
|
5
|
+
/**
|
|
6
|
+
* Heads whose `sources` carry `(resource, id)`, in id order. A document carrying the identity
|
|
7
|
+
* twice is returned twice, so the caller sees it as ambiguous.
|
|
8
|
+
*/
|
|
9
|
+
lookup(resource: string, id: string, opts?: {
|
|
10
|
+
type?: string;
|
|
11
|
+
}): readonly HeadResult[];
|
|
12
|
+
/** Re-derive one document's entries from a write's result. */
|
|
13
|
+
replace(doc: OkfDocument, version: Version): void;
|
|
14
|
+
/** Documents carrying at least one well-formed identity. */
|
|
15
|
+
get size(): number;
|
|
16
|
+
}
|
|
17
|
+
/** One head read of `bundle` (optionally narrowed by type or prefix), indexed by identity. */
|
|
18
|
+
export declare function buildSourceIndex(bundle: Bundle, filter?: Pick<QueryFilter, "type" | "prefix">): Promise<SourceIndex>;
|
|
19
|
+
//# sourceMappingURL=source-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-index.d.ts","sourceRoot":"","sources":["../../src/record-overlay/source-index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAa,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgBpG,qBAAa,WAAW;;IAItB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW;IAO1D;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,SAAS,UAAU,EAAE;IAKzF,8DAA8D;IAC9D,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IASjD,4DAA4D;IAC5D,IAAI,IAAI,IAAI,MAAM,CAEjB;CA4BF;AAED,8FAA8F;AAC9F,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAK9H"}
|