@superbee/core 0.1.4 → 0.1.6

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 (58) hide show
  1. package/dist/document-mutation.d.ts +5 -1
  2. package/dist/document-mutation.d.ts.map +1 -1
  3. package/dist/document-mutation.js +28 -34
  4. package/dist/document-mutation.js.map +1 -1
  5. package/dist/document-write-policy.d.ts +19 -5
  6. package/dist/document-write-policy.d.ts.map +1 -1
  7. package/dist/document-write-policy.js +116 -66
  8. package/dist/document-write-policy.js.map +1 -1
  9. package/dist/errors.d.ts +9 -0
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/errors.js +13 -0
  12. package/dist/errors.js.map +1 -1
  13. package/dist/freshness.d.ts +4 -2
  14. package/dist/freshness.d.ts.map +1 -1
  15. package/dist/freshness.js +15 -23
  16. package/dist/freshness.js.map +1 -1
  17. package/dist/index.d.ts +8 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +8 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/kinds-load.d.ts.map +1 -1
  22. package/dist/kinds-load.js +11 -3
  23. package/dist/kinds-load.js.map +1 -1
  24. package/dist/kinds.d.ts +7 -3
  25. package/dist/kinds.d.ts.map +1 -1
  26. package/dist/kinds.js +13 -4
  27. package/dist/kinds.js.map +1 -1
  28. package/dist/okf-actor.d.ts +37 -0
  29. package/dist/okf-actor.d.ts.map +1 -0
  30. package/dist/okf-actor.js +87 -0
  31. package/dist/okf-actor.js.map +1 -0
  32. package/dist/okf-authored-values.d.ts +11 -0
  33. package/dist/okf-authored-values.d.ts.map +1 -0
  34. package/dist/okf-authored-values.js +37 -0
  35. package/dist/okf-authored-values.js.map +1 -0
  36. package/dist/okf-lifecycle.d.ts +4 -0
  37. package/dist/okf-lifecycle.d.ts.map +1 -0
  38. package/dist/okf-lifecycle.js +6 -0
  39. package/dist/okf-lifecycle.js.map +1 -0
  40. package/dist/okf-standard-fields.d.ts +10 -0
  41. package/dist/okf-standard-fields.d.ts.map +1 -0
  42. package/dist/okf-standard-fields.js +111 -0
  43. package/dist/okf-standard-fields.js.map +1 -0
  44. package/dist/okf-timestamps.d.ts +10 -0
  45. package/dist/okf-timestamps.d.ts.map +1 -0
  46. package/dist/okf-timestamps.js +48 -0
  47. package/dist/okf-timestamps.js.map +1 -0
  48. package/dist/types.d.ts +1 -1
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/verification.d.ts +64 -0
  51. package/dist/verification.d.ts.map +1 -0
  52. package/dist/verification.js +175 -0
  53. package/dist/verification.js.map +1 -0
  54. package/dist/view-admission.d.ts +9 -0
  55. package/dist/view-admission.d.ts.map +1 -0
  56. package/dist/view-admission.js +22 -0
  57. package/dist/view-admission.js.map +1 -0
  58. package/package.json +9 -1
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The OKF v0.2 actor convention (SPEC 7). One grammar owns every identity-bearing field
3
+ * (`generated.by`, `verified[].by`, the resolved mutation actor) so trust classification and
4
+ * provenance validation cannot drift apart.
5
+ */
6
+ /** OKF v0.2 actor spellings: human/process identities or a producer/version pair. */
7
+ export function isOkfActor(value) {
8
+ if (typeof value !== "string" || value.trim() !== value || value.length === 0 || /\s/.test(value)) {
9
+ return false;
10
+ }
11
+ if (/^(?:human|process):[^\s:]+$/.test(value))
12
+ return true;
13
+ return /^[^\s/:]+\/[^\s/]+$/.test(value);
14
+ }
15
+ /**
16
+ * A person, per the `human:<id>` prefix consumers key trust tiers off (SPEC 5.3, 7).
17
+ *
18
+ * Prefix-only on purpose, unlike {@link isOkfActor}: classification is a READ rule, and a consumer
19
+ * must surface a human signal even when a producer's spelling breaks the rest of the grammar
20
+ * (`human:Jane Doe`) rather than silently downgrade it to machine-confirmed (SPEC 11). The write
21
+ * path enforces the full grammar before any verifier is recorded. Case-sensitive, and the id must
22
+ * be non-empty: `Human:x` and a bare `human:` name nobody.
23
+ */
24
+ export function isHumanActor(value) {
25
+ return typeof value === "string" && value.startsWith("human:") && value.length > "human:".length;
26
+ }
27
+ /** The three accepted forms, worded once for every help line, refusal, and orientation surface. */
28
+ export const OKF_ACTOR_FORMS = "human:<id> for a person, process:<id> for an automated job or a role-specific agent session, "
29
+ + "or <producer>/<version> for an agent or tool (e.g. openai/codex, anthropic/claude)";
30
+ /** Trim leading/trailing dashes with a linear scan: `/^-+|-+$/` is polynomial on dash-heavy input. */
31
+ function trimDashes(value) {
32
+ let start = 0;
33
+ let end = value.length;
34
+ while (start < end && value.charCodeAt(start) === 45)
35
+ start += 1;
36
+ while (end > start && value.charCodeAt(end - 1) === 45)
37
+ end -= 1;
38
+ return value.slice(start, end);
39
+ }
40
+ function slugSegment(value) {
41
+ return trimDashes(value.trim().replace(/[\s:/]+/g, "-"));
42
+ }
43
+ /**
44
+ * Derive a conforming spelling from a rejected actor so a refusal can say what to type instead.
45
+ * Deterministic and kind-preserving where the value already hints at a kind; ambiguous bare names
46
+ * offer both the process and the human reading, because only the caller knows which they are.
47
+ */
48
+ export function suggestOkfActor(value) {
49
+ const raw = value.trim();
50
+ // A boolean, not the type guard: the guard would narrow `raw` to `never` past this return.
51
+ const conforming = isOkfActor(raw);
52
+ if (conforming)
53
+ return { primary: raw, alternatives: [], placeholder: false };
54
+ // `[\s\S]` rather than `.`: an embedded line terminator must not demote a human: prefix to a bare name.
55
+ const prefixed = /^(human|process):([\s\S]*)$/i.exec(raw);
56
+ if (prefixed) {
57
+ const kind = prefixed[1].toLowerCase();
58
+ const id = slugSegment(prefixed[2] ?? "");
59
+ if (id)
60
+ return { primary: `${kind}:${id}`, alternatives: [], placeholder: false };
61
+ return { primary: `${kind}:<id>`, alternatives: [], placeholder: true };
62
+ }
63
+ const segments = raw.split("/").filter((segment) => segment.trim() !== "");
64
+ if (segments.length >= 3) {
65
+ // A producer path with a role qualifier (openai/codex/root): keep the two-segment identity,
66
+ // and offer the role as a process id for callers who need per-session attribution. A segment
67
+ // that slugs to nothing (a/:/b) falls through to the bare-name rule below, so every emitted
68
+ // spelling conforms.
69
+ const producer = slugSegment(segments[0]);
70
+ const version = slugSegment(segments[1]);
71
+ const role = slugSegment(segments.slice(1).join("-"));
72
+ if (producer && version) {
73
+ return { primary: `${producer}/${version}`, alternatives: role ? [`process:${role}`] : [], placeholder: false };
74
+ }
75
+ }
76
+ if (segments.length === 2) {
77
+ const producer = slugSegment(segments[0]);
78
+ const version = slugSegment(segments[1]);
79
+ if (producer && version)
80
+ return { primary: `${producer}/${version}`, alternatives: [], placeholder: false };
81
+ }
82
+ const id = slugSegment(raw);
83
+ if (!id)
84
+ return { primary: "process:<id>", alternatives: ["human:<id>", "<producer>/<version>"], placeholder: true };
85
+ return { primary: `process:${id}`, alternatives: [`human:${id}`], placeholder: false };
86
+ }
87
+ //# sourceMappingURL=okf-actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-actor.js","sourceRoot":"","sources":["../src/okf-actor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qFAAqF;AACrF,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACnG,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,eAAe,GAC1B,+FAA+F;MAC7F,oFAAoF,CAAC;AAEzF,sGAAsG;AACtG,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IACjE,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,GAAG,GAAW,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,2FAA2F;IAC3F,MAAM,UAAU,GAAY,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC9E,wGAAwG;IACxG,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAClF,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1E,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,4FAA4F;QAC5F,6FAA6F;QAC7F,4FAA4F;QAC5F,qBAAqB;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,IAAI,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAClH,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;QAC1C,IAAI,QAAQ,IAAI,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,IAAI,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC9G,CAAC;IACD,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,sBAAsB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACrH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACzF,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Structural preservation policy shared by authored standard fields and timestamp diagnostics. */
2
+ export type OkfRecord = Readonly<Record<string, unknown>>;
3
+ export declare function isOkfRecord(value: unknown): value is OkfRecord;
4
+ export declare function okfValuesEqual(a: unknown, b: unknown): boolean;
5
+ export declare function okfRows(value: unknown, allowBare: boolean): unknown[];
6
+ /** Each exact old row can exempt one candidate row; edits and additional copies are newly authored. */
7
+ export declare function authoredOkfRows(value: unknown, previous: unknown, allowBare: boolean): Array<{
8
+ entry: unknown;
9
+ index: number;
10
+ }>;
11
+ //# sourceMappingURL=okf-authored-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-authored-values.d.ts","sourceRoot":"","sources":["../src/okf-authored-values.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAM9D;AACD,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAQ9D;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,EAAE,CAErE;AACD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAS/H"}
@@ -0,0 +1,37 @@
1
+ export function isOkfRecord(value) {
2
+ if (value === null || typeof value !== "object")
3
+ return false;
4
+ // Runtime objects such as Date serialize as scalars, not YAML mappings. Only ordinary
5
+ // records (including null-prototype dictionaries) establish the shape authoring relies on.
6
+ const prototype = Object.getPrototypeOf(value);
7
+ return prototype === Object.prototype || prototype === null;
8
+ }
9
+ export function okfValuesEqual(a, b) {
10
+ if (Object.is(a, b))
11
+ return true;
12
+ // Unknown producer fields may retain native timestamp scalars in in-memory backends.
13
+ if (a instanceof Date && b instanceof Date)
14
+ return Object.is(a.getTime(), b.getTime());
15
+ if (Array.isArray(a) && Array.isArray(b))
16
+ return a.length === b.length && Array.from(a).every((value, i) => okfValuesEqual(value, b[i]));
17
+ if (!isOkfRecord(a) || !isOkfRecord(b))
18
+ return false;
19
+ const keys = Object.keys(a);
20
+ return keys.length === Object.keys(b).length && keys.every(key => Object.hasOwn(b, key) && okfValuesEqual(a[key], b[key]));
21
+ }
22
+ export function okfRows(value, allowBare) {
23
+ return Array.isArray(value) ? Array.from(value) : allowBare && isOkfRecord(value) ? [value] : [];
24
+ }
25
+ /** Each exact old row can exempt one candidate row; edits and additional copies are newly authored. */
26
+ export function authoredOkfRows(value, previous, allowBare) {
27
+ const prior = okfRows(previous, allowBare);
28
+ const used = new Set();
29
+ return okfRows(value, allowBare).flatMap((entry, index) => {
30
+ const match = prior.findIndex((old, i) => !used.has(i) && okfValuesEqual(entry, old));
31
+ if (match === -1)
32
+ return [{ entry, index }];
33
+ used.add(match);
34
+ return [];
35
+ });
36
+ }
37
+ //# sourceMappingURL=okf-authored-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-authored-values.js","sourceRoot":"","sources":["../src/okf-authored-values.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,sFAAsF;IACtF,2FAA2F;IAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,CAAU,EAAE,CAAU;IACnD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,qFAAqF;IACrF,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7H,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,SAAkB;IACxD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnG,CAAC;AACD,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAiB,EAAE,SAAkB;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** OKF v0.2 document lifecycle vocabulary, shared by authoring and Kind diagnostics. */
2
+ export declare const OKF_LIFECYCLE_STATUSES: readonly string[];
3
+ export declare function isOkfLifecycleStatus(value: unknown): value is string;
4
+ //# sourceMappingURL=okf-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-lifecycle.d.ts","sourceRoot":"","sources":["../src/okf-lifecycle.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAqD,CAAC;AAE1G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE"}
@@ -0,0 +1,6 @@
1
+ /** OKF v0.2 document lifecycle vocabulary, shared by authoring and Kind diagnostics. */
2
+ export const OKF_LIFECYCLE_STATUSES = Object.freeze(["draft", "stable", "deprecated"]);
3
+ export function isOkfLifecycleStatus(value) {
4
+ return typeof value === "string" && OKF_LIFECYCLE_STATUSES.includes(value);
5
+ }
6
+ //# sourceMappingURL=okf-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-lifecycle.js","sourceRoot":"","sources":["../src/okf-lifecycle.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,CAAC,MAAM,sBAAsB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AAE1G,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type OkfRecord } from "./okf-authored-values.js";
2
+ /**
3
+ * Existing imported scalar values survive unchanged. Collection exemptions apply to exact rows
4
+ * once each, so a row edit validates all standard children without losing producer extensions.
5
+ * Input may omit generated.by for engine completion; final newly authored records require it.
6
+ */
7
+ export declare function assertAuthoredOkfStandardFields(frontmatter: OkfRecord, existing?: OkfRecord, options?: {
8
+ phase?: "input" | "final";
9
+ }): void;
10
+ //# sourceMappingURL=okf-standard-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-standard-fields.d.ts","sourceRoot":"","sources":["../src/okf-standard-fields.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AASxG;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,SAAS,EACtB,QAAQ,CAAC,EAAE,SAAS,EACpB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAO,GAC1C,IAAI,CA2EN"}
@@ -0,0 +1,111 @@
1
+ /** OKF v0.2 authoring rules, independent of bundle-specific Kind conventions and raw imports. */
2
+ import { isOkfLifecycleStatus } from "./okf-lifecycle.js";
3
+ import { InvalidInputError } from "./errors.js";
4
+ import { isOkfActor } from "./okf-actor.js";
5
+ import { assertAuthoredOkfTimestamps } from "./okf-timestamps.js";
6
+ import { authoredOkfRows, isOkfRecord, okfValuesEqual } from "./okf-authored-values.js";
7
+ const string = (value) => typeof value === "string";
8
+ const nonempty = (value) => typeof value === "string" && value.trim().length > 0;
9
+ const count = (value) => typeof value === "number" && Number.isFinite(value) && Number.isInteger(value) && value >= 0;
10
+ function fail(path, expected) {
11
+ throw new InvalidInputError(`OKF v0.2 ${path} must be ${expected}`);
12
+ }
13
+ /**
14
+ * Existing imported scalar values survive unchanged. Collection exemptions apply to exact rows
15
+ * once each, so a row edit validates all standard children without losing producer extensions.
16
+ * Input may omit generated.by for engine completion; final newly authored records require it.
17
+ */
18
+ export function assertAuthoredOkfStandardFields(frontmatter, existing, options = {}) {
19
+ const field = (owner, key, path, valid, expected, previous, required = false) => {
20
+ if (!Object.hasOwn(owner, key)) {
21
+ if (required && !(previous && !Object.hasOwn(previous, key)))
22
+ fail(path, expected);
23
+ return;
24
+ }
25
+ if (previous && Object.hasOwn(previous, key) && okfValuesEqual(owner[key], previous[key]))
26
+ return;
27
+ if (!valid(owner[key]))
28
+ fail(path, expected);
29
+ };
30
+ const strings = (value, path) => {
31
+ if (!Array.isArray(value))
32
+ fail(path, "a list of strings");
33
+ Array.from(value).forEach((entry, index) => { if (!string(entry))
34
+ fail(`${path}[${index}]`, "a string"); });
35
+ };
36
+ const mapping = (owner, key, path, previous) => {
37
+ if (!Object.hasOwn(owner, key))
38
+ return undefined;
39
+ if (!isOkfRecord(owner[key])) {
40
+ if (previous && Object.hasOwn(previous, key) && okfValuesEqual(owner[key], previous[key]))
41
+ return undefined;
42
+ fail(path, "a mapping when present");
43
+ }
44
+ return owner[key];
45
+ };
46
+ const list = (key, previous, validate, allowBare = false) => {
47
+ if (!Object.hasOwn(frontmatter, key))
48
+ return;
49
+ const value = frontmatter[key];
50
+ if (!Array.isArray(value) && !(allowBare && isOkfRecord(value))) {
51
+ if (previous && Object.hasOwn(previous, key) && okfValuesEqual(value, previous[key]))
52
+ return;
53
+ fail(key, allowBare ? "a list of events or one event mapping" : "a list");
54
+ }
55
+ for (const { entry, index } of authoredOkfRows(value, previous?.[key], allowBare)) {
56
+ const path = allowBare && !Array.isArray(value) ? key : `${key}[${index}]`;
57
+ if (!isOkfRecord(entry))
58
+ fail(path, "a mapping");
59
+ validate(entry, path);
60
+ }
61
+ };
62
+ field(frontmatter, "type", "type", nonempty, "a nonempty string", undefined, true);
63
+ for (const key of ["title", "description", "resource"])
64
+ field(frontmatter, key, key, string, "a string", existing);
65
+ if (Object.hasOwn(frontmatter, "tags") && !(existing && Object.hasOwn(existing, "tags") && okfValuesEqual(frontmatter.tags, existing.tags)))
66
+ strings(frontmatter.tags, "tags");
67
+ field(frontmatter, "status", "status", isOkfLifecycleStatus, "draft, stable, or deprecated", existing);
68
+ mapping(frontmatter, "usage_window", "usage_window", existing);
69
+ const generated = mapping(frontmatter, "generated", "generated", existing);
70
+ if (generated) {
71
+ const previous = isOkfRecord(existing?.generated) ? existing.generated : undefined;
72
+ // A missing actor is grandfathered only on an entirely unchanged imported record.
73
+ const required = options.phase !== "input" && !(previous && okfValuesEqual(generated, previous));
74
+ field(generated, "by", "generated.by", isOkfActor, "human:<id>, process:<id>, or <producer>/<version>", previous, false);
75
+ if (required && !Object.hasOwn(generated, "by"))
76
+ fail("generated.by", "present when generated is authored");
77
+ }
78
+ list("verified", existing, (entry, path) => {
79
+ field(entry, "by", `${path}.by`, isOkfActor, "human:<id>, process:<id>, or <producer>/<version>", undefined, true);
80
+ field(entry, "at", `${path}.at`, string, "an ISO-8601 datetime with an explicit UTC offset", undefined, true);
81
+ }, true);
82
+ list("sources", existing, (entry, path) => {
83
+ field(entry, "resource", `${path}.resource`, nonempty, "a nonempty string", undefined, true);
84
+ for (const key of ["id", "title"])
85
+ field(entry, key, `${path}.${key}`, string, "a string");
86
+ field(entry, "author", `${path}.author`, nonempty, "a nonempty string");
87
+ field(entry, "usage_count", `${path}.usage_count`, count, "a finite nonnegative integer");
88
+ mapping(entry, "usage_window", `${path}.usage_window`);
89
+ });
90
+ if (frontmatter.type === "Attested Computation") {
91
+ const previous = existing?.type === frontmatter.type ? existing : undefined;
92
+ field(frontmatter, "runtime", "runtime", nonempty, "a nonempty string", previous, true);
93
+ field(frontmatter, "computation", "computation", string, "a string", previous);
94
+ list("parameters", previous, (entry, path) => {
95
+ for (const key of ["name", "type"])
96
+ field(entry, key, `${path}.${key}`, string, "a string", undefined, true);
97
+ field(entry, "required", `${path}.required`, value => typeof value === "boolean", "a boolean");
98
+ });
99
+ for (const key of ["executor", "attester"]) {
100
+ const entry = mapping(frontmatter, key, key, previous);
101
+ if (!entry)
102
+ continue;
103
+ const prior = isOkfRecord(previous?.[key]) ? previous[key] : undefined;
104
+ field(entry, "resource", `${key}.resource`, string, "a string", prior);
105
+ if (key === "executor" && Object.hasOwn(entry, "receipt") && !(prior && Object.hasOwn(prior, "receipt") && okfValuesEqual(entry.receipt, prior.receipt)))
106
+ strings(entry.receipt, "executor.receipt");
107
+ }
108
+ }
109
+ assertAuthoredOkfTimestamps(frontmatter, existing);
110
+ }
111
+ //# sourceMappingURL=okf-standard-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-standard-fields.js","sourceRoot":"","sources":["../src/okf-standard-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type OkfRecord as RecordValue } from "./okf-authored-values.js";
2
+ export interface InvalidOkfTimestamp {
3
+ field: string;
4
+ value: unknown;
5
+ }
6
+ /** Inspect stored values without normalizing, inferring offsets, or validating arbitrary extensions. */
7
+ export declare function invalidOkfTimestamps(frontmatter: RecordValue): InvalidOkfTimestamp[];
8
+ /** Reject newly supplied invalid timestamps while preserving unchanged imported values. */
9
+ export declare function assertAuthoredOkfTimestamps(frontmatter: RecordValue, existing?: RecordValue): void;
10
+ //# sourceMappingURL=okf-timestamps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-timestamps.d.ts","sourceRoot":"","sources":["../src/okf-timestamps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmE,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1I,MAAM,WAAW,mBAAmB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AA+BtE,wGAAwG;AACxG,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,mBAAmB,EAAE,CAEpF;AAED,2FAA2F;AAC3F,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAKlG"}
@@ -0,0 +1,48 @@
1
+ /** Known OKF v0.2 timestamp slots, shared by authored-write validation and read-only diagnostics. */
2
+ import { InvalidInputError } from "./errors.js";
3
+ import { parseIsoInstant } from "./verification.js";
4
+ import { isOkfRecord as record, okfValuesEqual as equal, authoredOkfRows } from "./okf-authored-values.js";
5
+ function scan(frontmatter, existing) {
6
+ const findings = [];
7
+ const slot = (owner, key, field, previous) => {
8
+ if (!record(owner) || !Object.hasOwn(owner, key))
9
+ return;
10
+ const value = owner[key];
11
+ if (typeof value === "string" && parseIsoInstant(value) !== null)
12
+ return;
13
+ if (record(previous) && Object.hasOwn(previous, key) && equal(value, previous[key]))
14
+ return;
15
+ findings.push({ field, value });
16
+ };
17
+ const window = (owner, prefix, previous) => {
18
+ slot(owner, "from", `${prefix}.from`, previous);
19
+ slot(owner, "to", `${prefix}.to`, previous);
20
+ };
21
+ slot(frontmatter.generated, "at", "generated.at", existing?.generated);
22
+ slot(frontmatter, "stale_after", "stale_after", existing);
23
+ window(frontmatter.usage_window, "usage_window", existing?.usage_window);
24
+ for (const key of ["verified", "sources"]) {
25
+ authoredOkfRows(frontmatter[key], existing?.[key], key === "verified").forEach(({ entry, index }) => {
26
+ const path = key === "verified" && !Array.isArray(frontmatter.verified) ? key : `${key}[${index}]`;
27
+ if (key === "verified")
28
+ slot(entry, "at", `${path}.at`);
29
+ else {
30
+ slot(entry, "last_modified", `${path}.last_modified`);
31
+ if (record(entry))
32
+ window(entry.usage_window, `${path}.usage_window`);
33
+ }
34
+ });
35
+ }
36
+ return findings;
37
+ }
38
+ /** Inspect stored values without normalizing, inferring offsets, or validating arbitrary extensions. */
39
+ export function invalidOkfTimestamps(frontmatter) {
40
+ return scan(frontmatter);
41
+ }
42
+ /** Reject newly supplied invalid timestamps while preserving unchanged imported values. */
43
+ export function assertAuthoredOkfTimestamps(frontmatter, existing) {
44
+ const first = scan(frontmatter, existing)[0];
45
+ if (first)
46
+ throw new InvalidInputError(`OKF v0.2 ${first.field} requires a valid ISO-8601 date and time with an explicit UTC offset (e.g. 2026-09-08T18:30:00Z or 2026-09-08T12:30:00-06:00)`);
47
+ }
48
+ //# sourceMappingURL=okf-timestamps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-timestamps.js","sourceRoot":"","sources":["../src/okf-timestamps.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -413,7 +413,7 @@ export interface EdgeFilter {
413
413
  /** Restrict to edges whose display text exactly equals this value. */
414
414
  text?: string;
415
415
  }
416
- /** A consumer-derived freshness verdict, including OKF v0.2's absolute `stale_after` date. */
416
+ /** A consumer-derived freshness verdict, including OKF v0.2's absolute `stale_after` instant. */
417
417
  export type FreshnessVerdict = "fresh" | "stale" | "empty";
418
418
  /** Inputs for a {@link freshness} judgment. */
419
419
  export interface FreshnessOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,uJAAuJ;IACvJ,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iHAAiH;IACjH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,EAAE,EAAE,SAAS,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,MAAM,WAAW,MAAM;IACrB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,uGAAuG;AACvG,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,GAAG,EAAE,WAAW,CAAC;IACjB,iIAAiI;IACjI,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,EAAE,EAAE,SAAS,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,WAAW,CAAC;IACzB,mKAAmK;IACnK,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,KAAK,EAAE,UAAU,CAAC;IAClB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+GAA+G;AAC/G,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,iHAAiH;IACjH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,YAAY,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B,4GAA4G;IAC5G,IAAI,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjF,mDAAmD;IACnD,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,kGAAkG;IAClG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACtF;;;;;;;;OAQG;IACH,aAAa,CACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAYjE;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvD;;;;;;;;;;OAUG;IACH,SAAS,CACP,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,kIAAkI;IAClI,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C;;;;;;OAMG;IACH,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpE;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzD;;;;;;;;;;OAUG;IACH,YAAY,CAAC,IAAI,mBAAmB,CAAC;CACtC;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,iHAAiH;IACjH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,0FAA0F;AAC1F,MAAM,WAAW,IAAI;IACnB,4DAA4D;IAC5D,IAAI,EAAE,SAAS,CAAC;IAChB,uGAAuG;IACvG,EAAE,EAAE,SAAS,CAAC;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,iGAAiG;IACjG,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8FAA8F;AAC9F,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3D,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,OAAO,EAAE,gBAAgB,CAAC;IAC1B,yGAAyG;IACzG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /** One verification event. Producer extras beyond `by`/`at` are preserved, never interpreted. */
2
+ export interface VerificationEvent {
3
+ by: string;
4
+ at?: string;
5
+ [extra: string]: unknown;
6
+ }
7
+ /** Trust tiers, lowest to highest (SPEC 5.3). */
8
+ export type TrustTier = "unverified" | "machine-confirmed" | "human-reviewed";
9
+ /** The three tiers in ascending order — the one place a consumer iterates them. */
10
+ export declare const TRUST_TIERS: readonly TrustTier[];
11
+ /** The derived projection name surfaces expose (`list --fields trust`, receipts, status counts). */
12
+ export declare const TRUST_TIER_FIELD = "trust";
13
+ /**
14
+ * The document's verification events as the list the spec defines, or `[]` when the key is absent.
15
+ * A bare `{ by, at }` mapping reads as a one-element list (SPEC 5.2 MUST). Entries that carry no
16
+ * usable `by` cannot name a verifier and therefore cannot raise a tier; they are skipped here, and
17
+ * {@link appendVerificationEvent} refuses to write around them.
18
+ */
19
+ export declare function verificationEvents(frontmatter: Readonly<Record<string, unknown>>): VerificationEvent[];
20
+ /** Derive the trust tier (SPEC 5.3): keyed on the `human:` prefix of any verifier. */
21
+ export declare function trustTier(frontmatter: Readonly<Record<string, unknown>>): TrustTier;
22
+ /** The latest parseable `at` across the events ("how recently" per SPEC 5.2), or `undefined`. */
23
+ export declare function latestVerifiedAt(events: readonly VerificationEvent[]): string | undefined;
24
+ /** Documents per tier — the one fold `status` and `home` both render. */
25
+ export type TrustTierCounts = Record<TrustTier, number>;
26
+ export declare function trustTierCounts(docs: Iterable<{
27
+ frontmatter: Readonly<Record<string, unknown>>;
28
+ }>): TrustTierCounts;
29
+ /**
30
+ * Parse an instant a verifier supplies, or return `null`. Unlike `Date.parse`, this refuses what
31
+ * a caller did not say: an impossible calendar date (`2026-02-30`, a non-leap `02-29`), an
32
+ * out-of-range time, or a value without a zone designator (which would name a different instant
33
+ * on every host). Read-side consumers stay permissive (see {@link latestVerifiedAt}); this rule
34
+ * guards what gets WRITTEN. Defaults to millisecond truncation; `ceil` compares expiration
35
+ * deadlines against a millisecond clock without expiring before a fractional deadline.
36
+ */
37
+ export declare function parseIsoInstant(raw: string, rounding?: "truncate" | "ceil"): number | null;
38
+ /**
39
+ * The instant a stored `at` denotes, for comparison and "how recently" selection: the strict
40
+ * grammar first (so every spelling the write path accepts resolves identically), then the
41
+ * permissive `Date.parse` for legacy producer spellings the read side must not drop. `null` when
42
+ * neither understands the value.
43
+ */
44
+ export declare function storedInstant(value: unknown): number | null;
45
+ export interface AppendVerificationOptions {
46
+ /** The verifier; must satisfy the OKF actor convention (SPEC 7). */
47
+ by: string;
48
+ /** ISO-8601 instant of the confirmation, with a zone designator (see {@link parseIsoInstant}). */
49
+ at: string;
50
+ }
51
+ /**
52
+ * Return frontmatter with one more verification event appended. The result is always a list:
53
+ * an absent key becomes `[event]`, a bare mapping becomes `[existing, event]`, a list grows by one.
54
+ * Every other `verified` shape (a scalar, a list containing a non-event) is refused, because
55
+ * rewriting it would destroy trust history the caller did not ask to change.
56
+ *
57
+ * Idempotent: an event that already exists (same `by`, same instant) is already recorded, so the
58
+ * frontmatter is returned as-is and the caller's mutation converges to a no-op — repeating a
59
+ * satisfied verification never manufactures a duplicate confirmation or a new revision.
60
+ */
61
+ export declare function appendVerificationEvent<F extends Readonly<Record<string, unknown>>>(frontmatter: F, options: AppendVerificationOptions): F & {
62
+ verified: VerificationEvent[];
63
+ };
64
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAkBA,iGAAiG;AACjG,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,iDAAiD;AACjD,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAE9E,mFAAmF;AACnF,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAI1C,CAAC;AAEH,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAUxC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB,EAAE,CAKtG;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAInF;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,GAAG,SAAS,CASzF;AAED,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAExD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC;IAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAAC,GACjE,eAAe,CAIjB;AASD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,GAAG,MAAmB,GAAG,MAAM,GAAG,IAAI,CA8BtG;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,kGAAkG;IAClG,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACjF,WAAW,EAAE,CAAC,EACd,OAAO,EAAE,yBAAyB,GACjC,CAAC,GAAG;IAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAgCvC"}