@superbee/core 0.1.6 → 0.2.0-pre.10

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 (248) hide show
  1. package/README.md +127 -0
  2. package/dist/artifact-contract.d.ts +90 -0
  3. package/dist/artifact-contract.d.ts.map +1 -0
  4. package/dist/artifact-contract.js +205 -0
  5. package/dist/artifact-contract.js.map +1 -0
  6. package/dist/backend.d.ts +16 -1
  7. package/dist/backend.d.ts.map +1 -1
  8. package/dist/backend.js +112 -47
  9. package/dist/backend.js.map +1 -1
  10. package/dist/bundle-ops.d.ts +42 -0
  11. package/dist/bundle-ops.d.ts.map +1 -0
  12. package/dist/bundle-ops.js +88 -0
  13. package/dist/bundle-ops.js.map +1 -0
  14. package/dist/bundle.d.ts +10 -28
  15. package/dist/bundle.d.ts.map +1 -1
  16. package/dist/bundle.js +12 -69
  17. package/dist/bundle.js.map +1 -1
  18. package/dist/document-codec.d.ts +6 -1
  19. package/dist/document-codec.d.ts.map +1 -1
  20. package/dist/document-codec.js +8 -4
  21. package/dist/document-codec.js.map +1 -1
  22. package/dist/document-field-actions.d.ts +107 -0
  23. package/dist/document-field-actions.d.ts.map +1 -0
  24. package/dist/document-field-actions.js +302 -0
  25. package/dist/document-field-actions.js.map +1 -0
  26. package/dist/document-mutation.d.ts +61 -3
  27. package/dist/document-mutation.d.ts.map +1 -1
  28. package/dist/document-mutation.js +116 -25
  29. package/dist/document-mutation.js.map +1 -1
  30. package/dist/document-write-policy.d.ts +0 -1
  31. package/dist/document-write-policy.d.ts.map +1 -1
  32. package/dist/document-write-policy.js +7 -4
  33. package/dist/document-write-policy.js.map +1 -1
  34. package/dist/engine.d.ts +3 -1
  35. package/dist/engine.d.ts.map +1 -1
  36. package/dist/engine.js +6 -4
  37. package/dist/engine.js.map +1 -1
  38. package/dist/file-journaled-backend-internal.d.ts +19 -0
  39. package/dist/file-journaled-backend-internal.d.ts.map +1 -0
  40. package/dist/file-journaled-backend-internal.js +10 -0
  41. package/dist/file-journaled-backend-internal.js.map +1 -0
  42. package/dist/file-journaled-backend.d.ts +162 -0
  43. package/dist/file-journaled-backend.d.ts.map +1 -0
  44. package/dist/file-journaled-backend.js +1113 -0
  45. package/dist/file-journaled-backend.js.map +1 -0
  46. package/dist/filesystem-host.d.ts +15 -0
  47. package/dist/filesystem-host.d.ts.map +1 -0
  48. package/dist/filesystem-host.js +20 -0
  49. package/dist/filesystem-host.js.map +1 -0
  50. package/dist/filesystem-identity.d.ts +86 -4
  51. package/dist/filesystem-identity.d.ts.map +1 -1
  52. package/dist/filesystem-identity.js +338 -102
  53. package/dist/filesystem-identity.js.map +1 -1
  54. package/dist/filesystem-lock.d.ts +16 -3
  55. package/dist/filesystem-lock.d.ts.map +1 -1
  56. package/dist/filesystem-lock.js +323 -77
  57. package/dist/filesystem-lock.js.map +1 -1
  58. package/dist/filesystem-push-role.d.ts +77 -0
  59. package/dist/filesystem-push-role.d.ts.map +1 -0
  60. package/dist/filesystem-push-role.js +165 -0
  61. package/dist/filesystem-push-role.js.map +1 -0
  62. package/dist/filesystem.d.ts +17 -0
  63. package/dist/filesystem.d.ts.map +1 -0
  64. package/dist/filesystem.js +18 -0
  65. package/dist/filesystem.js.map +1 -0
  66. package/dist/freshness.d.ts +10 -7
  67. package/dist/freshness.d.ts.map +1 -1
  68. package/dist/freshness.js +14 -11
  69. package/dist/freshness.js.map +1 -1
  70. package/dist/frontmatter-contract.d.ts +2 -2
  71. package/dist/frontmatter-contract.js +2 -2
  72. package/dist/frontmatter.d.ts +11 -1
  73. package/dist/frontmatter.d.ts.map +1 -1
  74. package/dist/frontmatter.js +20 -7
  75. package/dist/frontmatter.js.map +1 -1
  76. package/dist/governed-body-write.d.ts +106 -0
  77. package/dist/governed-body-write.d.ts.map +1 -0
  78. package/dist/governed-body-write.js +251 -0
  79. package/dist/governed-body-write.js.map +1 -0
  80. package/dist/heads-digest.d.ts +32 -0
  81. package/dist/heads-digest.d.ts.map +1 -0
  82. package/dist/heads-digest.js +37 -0
  83. package/dist/heads-digest.js.map +1 -0
  84. package/dist/host-policy-snapshot.d.ts +9 -0
  85. package/dist/host-policy-snapshot.d.ts.map +1 -0
  86. package/dist/host-policy-snapshot.js +33 -0
  87. package/dist/host-policy-snapshot.js.map +1 -0
  88. package/dist/host-text.d.ts +31 -0
  89. package/dist/host-text.d.ts.map +1 -0
  90. package/dist/host-text.js +77 -0
  91. package/dist/host-text.js.map +1 -0
  92. package/dist/hosted-transport/answer-rows.d.ts +216 -0
  93. package/dist/hosted-transport/answer-rows.d.ts.map +1 -0
  94. package/dist/hosted-transport/answer-rows.js +396 -0
  95. package/dist/hosted-transport/answer-rows.js.map +1 -0
  96. package/dist/hosted-transport/carrier.d.ts +142 -0
  97. package/dist/hosted-transport/carrier.d.ts.map +1 -0
  98. package/dist/hosted-transport/carrier.js +241 -0
  99. package/dist/hosted-transport/carrier.js.map +1 -0
  100. package/dist/hosted-transport/history-pages.d.ts +55 -0
  101. package/dist/hosted-transport/history-pages.d.ts.map +1 -0
  102. package/dist/hosted-transport/history-pages.js +69 -0
  103. package/dist/hosted-transport/history-pages.js.map +1 -0
  104. package/dist/hosted-transport/index.d.ts +18 -0
  105. package/dist/hosted-transport/index.d.ts.map +1 -0
  106. package/dist/hosted-transport/index.js +18 -0
  107. package/dist/hosted-transport/index.js.map +1 -0
  108. package/dist/hosted-transport/operations.d.ts +85 -0
  109. package/dist/hosted-transport/operations.d.ts.map +1 -0
  110. package/dist/hosted-transport/operations.js +128 -0
  111. package/dist/hosted-transport/operations.js.map +1 -0
  112. package/dist/hosted-transport/paged-reads.d.ts +87 -0
  113. package/dist/hosted-transport/paged-reads.d.ts.map +1 -0
  114. package/dist/hosted-transport/paged-reads.js +238 -0
  115. package/dist/hosted-transport/paged-reads.js.map +1 -0
  116. package/dist/hosted-transport/read-adapter.d.ts +250 -0
  117. package/dist/hosted-transport/read-adapter.d.ts.map +1 -0
  118. package/dist/hosted-transport/read-adapter.js +557 -0
  119. package/dist/hosted-transport/read-adapter.js.map +1 -0
  120. package/dist/hosted-transport/root-write.d.ts +114 -0
  121. package/dist/hosted-transport/root-write.d.ts.map +1 -0
  122. package/dist/hosted-transport/root-write.js +171 -0
  123. package/dist/hosted-transport/root-write.js.map +1 -0
  124. package/dist/hosted-transport/whole-document-transport.d.ts +174 -0
  125. package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -0
  126. package/dist/hosted-transport/whole-document-transport.js +411 -0
  127. package/dist/hosted-transport/whole-document-transport.js.map +1 -0
  128. package/dist/index.d.ts +29 -8
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +26 -6
  131. package/dist/index.js.map +1 -1
  132. package/dist/indexeddb-backend.d.ts +197 -0
  133. package/dist/indexeddb-backend.d.ts.map +1 -0
  134. package/dist/indexeddb-backend.js +1183 -0
  135. package/dist/indexeddb-backend.js.map +1 -0
  136. package/dist/journaled-backend.d.ts +467 -0
  137. package/dist/journaled-backend.d.ts.map +1 -0
  138. package/dist/journaled-backend.js +389 -0
  139. package/dist/journaled-backend.js.map +1 -0
  140. package/dist/kind-coverage.d.ts +99 -0
  141. package/dist/kind-coverage.d.ts.map +1 -0
  142. package/dist/kind-coverage.js +186 -0
  143. package/dist/kind-coverage.js.map +1 -0
  144. package/dist/kind-field-mutation.d.ts +15 -0
  145. package/dist/kind-field-mutation.d.ts.map +1 -0
  146. package/dist/kind-field-mutation.js +160 -0
  147. package/dist/kind-field-mutation.js.map +1 -0
  148. package/dist/kinds.d.ts +31 -1
  149. package/dist/kinds.d.ts.map +1 -1
  150. package/dist/kinds.js +86 -17
  151. package/dist/kinds.js.map +1 -1
  152. package/dist/links.d.ts +1 -1
  153. package/dist/links.d.ts.map +1 -1
  154. package/dist/links.js +5 -10
  155. package/dist/links.js.map +1 -1
  156. package/dist/managed-document-metadata.d.ts +2 -0
  157. package/dist/managed-document-metadata.d.ts.map +1 -0
  158. package/dist/managed-document-metadata.js +9 -0
  159. package/dist/managed-document-metadata.js.map +1 -0
  160. package/dist/meaningful-change-time.d.ts +6 -6
  161. package/dist/meaningful-change-time.d.ts.map +1 -1
  162. package/dist/meaningful-change-time.js +12 -13
  163. package/dist/meaningful-change-time.js.map +1 -1
  164. package/dist/memory-backend.d.ts +2 -2
  165. package/dist/memory-backend.d.ts.map +1 -1
  166. package/dist/memory-backend.js +32 -16
  167. package/dist/memory-backend.js.map +1 -1
  168. package/dist/mutation.d.ts.map +1 -1
  169. package/dist/mutation.js +2 -2
  170. package/dist/mutation.js.map +1 -1
  171. package/dist/page.d.ts.map +1 -1
  172. package/dist/page.js +2 -1
  173. package/dist/page.js.map +1 -1
  174. package/dist/paths.d.ts +6 -2
  175. package/dist/paths.d.ts.map +1 -1
  176. package/dist/paths.js +35 -33
  177. package/dist/paths.js.map +1 -1
  178. package/dist/platform.d.ts +239 -0
  179. package/dist/platform.d.ts.map +1 -0
  180. package/dist/platform.js +82 -0
  181. package/dist/platform.js.map +1 -0
  182. package/dist/portable-export.d.ts +119 -0
  183. package/dist/portable-export.d.ts.map +1 -0
  184. package/dist/portable-export.js +501 -0
  185. package/dist/portable-export.js.map +1 -0
  186. package/dist/publication-filesystem.d.ts +1 -1
  187. package/dist/publication-filesystem.d.ts.map +1 -1
  188. package/dist/publication-filesystem.js +1 -1
  189. package/dist/publication-filesystem.js.map +1 -1
  190. package/dist/query-filter.d.ts +7 -2
  191. package/dist/query-filter.d.ts.map +1 -1
  192. package/dist/query-filter.js +24 -1
  193. package/dist/query-filter.js.map +1 -1
  194. package/dist/query-order.d.ts +22 -0
  195. package/dist/query-order.d.ts.map +1 -0
  196. package/dist/query-order.js +42 -0
  197. package/dist/query-order.js.map +1 -0
  198. package/dist/recipes.d.ts +3 -1
  199. package/dist/recipes.d.ts.map +1 -1
  200. package/dist/recipes.js +4 -4
  201. package/dist/recipes.js.map +1 -1
  202. package/dist/remote-backend.d.ts +114 -22
  203. package/dist/remote-backend.d.ts.map +1 -1
  204. package/dist/remote-backend.js +285 -44
  205. package/dist/remote-backend.js.map +1 -1
  206. package/dist/remote-document-codec.d.ts +15 -0
  207. package/dist/remote-document-codec.d.ts.map +1 -0
  208. package/dist/remote-document-codec.js +103 -0
  209. package/dist/remote-document-codec.js.map +1 -0
  210. package/dist/remote-error.d.ts +38 -0
  211. package/dist/remote-error.d.ts.map +1 -0
  212. package/dist/remote-error.js +59 -0
  213. package/dist/remote-error.js.map +1 -0
  214. package/dist/remote-operations.d.ts +63 -0
  215. package/dist/remote-operations.d.ts.map +1 -0
  216. package/dist/remote-operations.js +125 -0
  217. package/dist/remote-operations.js.map +1 -0
  218. package/dist/remote-parsers.d.ts +86 -0
  219. package/dist/remote-parsers.d.ts.map +1 -0
  220. package/dist/remote-parsers.js +181 -0
  221. package/dist/remote-parsers.js.map +1 -0
  222. package/dist/remote.d.ts +7 -2
  223. package/dist/remote.d.ts.map +1 -1
  224. package/dist/remote.js +6 -1
  225. package/dist/remote.js.map +1 -1
  226. package/dist/sha256.d.ts +21 -0
  227. package/dist/sha256.d.ts.map +1 -0
  228. package/dist/sha256.js +114 -0
  229. package/dist/sha256.js.map +1 -0
  230. package/dist/storage.d.ts +8 -2
  231. package/dist/storage.d.ts.map +1 -1
  232. package/dist/storage.js +11 -2
  233. package/dist/storage.js.map +1 -1
  234. package/dist/types.d.ts +40 -5
  235. package/dist/types.d.ts.map +1 -1
  236. package/dist/uncertain-write.d.ts +178 -0
  237. package/dist/uncertain-write.d.ts.map +1 -0
  238. package/dist/uncertain-write.js +198 -0
  239. package/dist/uncertain-write.js.map +1 -0
  240. package/dist/version-transport.d.ts +7 -0
  241. package/dist/version-transport.d.ts.map +1 -1
  242. package/dist/version-transport.js +9 -0
  243. package/dist/version-transport.js.map +1 -1
  244. package/dist/versioning.d.ts +18 -7
  245. package/dist/versioning.d.ts.map +1 -1
  246. package/dist/versioning.js +23 -14
  247. package/dist/versioning.js.map +1 -1
  248. package/package.json +75 -4
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { type Outcome, type OperationState, type UncertainWriteOptions } from "./uncertain-write.js";
2
+ import type { IntentRecord } from "./journaled-backend.js";
3
+ import type { Version } from "./types.js";
4
+ /**
5
+ * One body update's bounds. `bodyBytes` is a library ceiling in UTF-8 bytes, equal to the hosted
6
+ * kernel's document write bound (983,040) in raw bytes; a host that measures differently (the
7
+ * kernel measures canonical JSON and keeps definition documents at 64 KiB) preflights its own
8
+ * measure. The envelope carries the body twice (the operation and the prepared content),
9
+ * JSON-escaped, so it is 4 MiB.
10
+ */
11
+ export declare const BODY_DELIVERY_LIMITS: Readonly<{
12
+ labelBytes: 2048;
13
+ bodyBytes: 983040;
14
+ envelopeBytes: number;
15
+ }>;
16
+ /** Complete journal reconciliation has a separate bound from each delivery envelope. */
17
+ export declare const BODY_RECONCILIATION_BYTES: number;
18
+ export interface BodyUpdateOperation {
19
+ readonly kind: "document.body.update";
20
+ readonly body: string;
21
+ }
22
+ export interface PreparedBodyDelivery {
23
+ readonly schema: 1;
24
+ readonly scope: string;
25
+ readonly requestId: string;
26
+ readonly target: string;
27
+ readonly okfVersion: "0.1" | "0.2";
28
+ readonly operation: BodyUpdateOperation;
29
+ readonly expectedVersion: Version;
30
+ readonly local: Version;
31
+ readonly content: string;
32
+ readonly createdAt: string;
33
+ readonly predecessor?: Readonly<{
34
+ requestId: string;
35
+ acknowledgedVersion: Version;
36
+ }>;
37
+ }
38
+ export interface CommittedBodyReceipt {
39
+ readonly scope: string;
40
+ readonly requestId: string;
41
+ readonly target: string;
42
+ readonly expectedVersion: Version;
43
+ readonly body: string;
44
+ readonly version: Version;
45
+ readonly content: string;
46
+ }
47
+ export type BodyDeliveryOutcome = {
48
+ readonly kind: "committed";
49
+ readonly receipt: CommittedBodyReceipt;
50
+ } | Exclude<Outcome, {
51
+ kind: "committed";
52
+ }>;
53
+ export interface BodyDeliveryTransport {
54
+ submit(prepared: PreparedBodyDelivery, options?: {
55
+ signal?: AbortSignal;
56
+ }): Promise<BodyDeliveryOutcome>;
57
+ /** null positively means never recorded; unavailable evidence must be unknown or throw. */
58
+ lookup(prepared: PreparedBodyDelivery): Promise<BodyDeliveryOutcome | null>;
59
+ }
60
+ export interface BodyDeliveryResult {
61
+ readonly prepared: PreparedBodyDelivery;
62
+ readonly attempts: number;
63
+ readonly state: OperationState;
64
+ readonly lookups: number;
65
+ readonly outcome: BodyDeliveryOutcome;
66
+ readonly diagnostic?: string;
67
+ }
68
+ /** Capture a serialized envelope without changing its request identity or original history. */
69
+ export declare function validatePreparedBodyDelivery(value: unknown): PreparedBodyDelivery;
70
+ export type BodyDeliveryInput = Omit<PreparedBodyDelivery, "schema" | "expectedVersion" | "predecessor">;
71
+ export type BodyDeliveryPremise = {
72
+ expectedVersion: Version;
73
+ } | {
74
+ prepared: PreparedBodyDelivery;
75
+ receipt: CommittedBodyReceipt;
76
+ };
77
+ /** Successors derive their premise only from a fully bound predecessor receipt. */
78
+ export declare function prepareBodyDelivery(input: BodyDeliveryInput, premise: BodyDeliveryPremise): PreparedBodyDelivery;
79
+ export declare function assertSameBodyDelivery(recorded: unknown, candidate: unknown): void;
80
+ /** Content/version association is asserted by the trusted authority, not inferred from a later head. */
81
+ export declare function validateBodyReceipt(prepared: PreparedBodyDelivery, value: unknown): CommittedBodyReceipt;
82
+ /** Persist the envelope and attempted claim atomically BEFORE calling; this function does no persistence. */
83
+ export declare function performBodyDelivery(transport: BodyDeliveryTransport, prepared: PreparedBodyDelivery, attempts: number, options?: Omit<UncertainWriteOptions, "settlement">): Promise<BodyDeliveryResult>;
84
+ export interface BodyLocalSnapshot {
85
+ readonly version: Version | null;
86
+ readonly intents: readonly IntentRecord[];
87
+ readonly shared: Readonly<{
88
+ version: Version;
89
+ content: string;
90
+ }> | null;
91
+ }
92
+ export interface BodyReconciliationProposal {
93
+ readonly action: "preserve-local" | "replace-local-under-CAS";
94
+ readonly receipt: CommittedBodyReceipt;
95
+ readonly shared: Readonly<{
96
+ action: "preserve-shared";
97
+ } | {
98
+ action: "replace-shared-under-CAS";
99
+ version: Version;
100
+ content: string;
101
+ }>;
102
+ readonly expected: BodyLocalSnapshot;
103
+ }
104
+ /** Pure proposal only. Replacement requires an atomic full-journal, document AND shared-base CAS. */
105
+ export declare function reconcileBodyReceipt(prepared: PreparedBodyDelivery, receipt: CommittedBodyReceipt, snapshot: BodyLocalSnapshot): BodyReconciliationProposal;
106
+ //# sourceMappingURL=governed-body-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-body-write.d.ts","sourceRoot":"","sources":["../src/governed-body-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,251 @@
1
+ /** Immutable delivery evidence for body-only updates whose authority owns document metadata. */
2
+ import { parseMarkdown, normalizeDocumentBodyForStorage } from "./frontmatter.js";
3
+ import { assertSafeConceptId, isReservedFile, pathFromConceptId } from "./paths.js";
4
+ import { parseIsoInstant } from "./verification.js";
5
+ import { isContentVersion, versionOfBytes } from "./versioning.js";
6
+ import { isRequestIdentity, performUncertainWrite } from "./uncertain-write.js";
7
+ /**
8
+ * One body update's bounds. `bodyBytes` is a library ceiling in UTF-8 bytes, equal to the hosted
9
+ * kernel's document write bound (983,040) in raw bytes; a host that measures differently (the
10
+ * kernel measures canonical JSON and keeps definition documents at 64 KiB) preflights its own
11
+ * measure. The envelope carries the body twice (the operation and the prepared content),
12
+ * JSON-escaped, so it is 4 MiB.
13
+ */
14
+ export const BODY_DELIVERY_LIMITS = Object.freeze({ labelBytes: 2048, bodyBytes: 983_040, envelopeBytes: 4 * 1024 * 1024 });
15
+ /** Complete journal reconciliation has a separate bound from each delivery envelope. */
16
+ export const BODY_RECONCILIATION_BYTES = 32 * 1024 * 1024;
17
+ function fail(message) { throw new Error(`Invalid body delivery: ${message}`); }
18
+ function record(value, keys, optional = []) {
19
+ if (!value || typeof value !== "object" || Array.isArray(value) ||
20
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
21
+ fail("expected a plain record");
22
+ const descriptors = Object.getOwnPropertyDescriptors(value);
23
+ if (Reflect.ownKeys(value).some(key => typeof key !== "string" || !keys.includes(key) && !optional.includes(key)) ||
24
+ Object.values(descriptors).some(d => !d.enumerable || !("value" in d)) || keys.some(key => !Object.hasOwn(value, key)))
25
+ fail("unexpected or missing fields");
26
+ return value;
27
+ }
28
+ function string(value, max = BODY_DELIVERY_LIMITS.labelBytes, nonempty = true) {
29
+ if (typeof value !== "string" || nonempty && !value.trim() || new TextEncoder().encode(value).length > max)
30
+ fail("invalid string or size limit");
31
+ return value;
32
+ }
33
+ function version(value) { if (!isContentVersion(value))
34
+ fail("invalid version"); return value; }
35
+ function request(value) { const id = string(value); if (!isRequestIdentity(id))
36
+ fail("invalid request identity"); return id; }
37
+ function timestamp(value) { const text = string(value); if (parseIsoInstant(text) === null)
38
+ fail("invalid timestamp"); return text; }
39
+ function integer(value) { if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
40
+ fail("invalid count"); return value; }
41
+ function target(value) {
42
+ const id = string(value);
43
+ assertSafeConceptId(id);
44
+ if (isReservedFile(pathFromConceptId(id)))
45
+ fail("reserved target");
46
+ return id;
47
+ }
48
+ function bounded(value) { string(JSON.stringify(value), BODY_DELIVERY_LIMITS.envelopeBytes); return value; }
49
+ function bodyContent(content, body, id, okfVersion) {
50
+ const raw = string(content, BODY_DELIVERY_LIMITS.envelopeBytes, false);
51
+ const parsed = parseMarkdown(raw, id, { okfVersion });
52
+ if (typeof parsed.frontmatter.type !== "string" || !parsed.frontmatter.type.trim())
53
+ fail("concept type required");
54
+ if (normalizeDocumentBodyForStorage(parsed.body) !== normalizeDocumentBodyForStorage(body))
55
+ fail("content body differs from operation");
56
+ return raw;
57
+ }
58
+ /** Capture a serialized envelope without changing its request identity or original history. */
59
+ export function validatePreparedBodyDelivery(value) {
60
+ const raw = record(value, ["schema", "scope", "requestId", "target", "okfVersion", "operation", "expectedVersion", "local", "content", "createdAt"], ["predecessor"]);
61
+ if (raw.schema !== 1 || raw.okfVersion !== "0.1" && raw.okfVersion !== "0.2")
62
+ fail("unsupported schema or edition");
63
+ const op = record(raw.operation, ["kind", "body"]);
64
+ if (op.kind !== "document.body.update")
65
+ fail("unsupported operation");
66
+ const operation = Object.freeze({ kind: "document.body.update", body: string(op.body, BODY_DELIVERY_LIMITS.bodyBytes, false) });
67
+ const id = target(raw.target);
68
+ const content = bodyContent(raw.content, operation.body, id, raw.okfVersion);
69
+ const local = version(raw.local);
70
+ if (versionOfBytes(content) !== local)
71
+ fail("local content hash mismatch");
72
+ let predecessor;
73
+ if (Object.hasOwn(raw, "predecessor")) {
74
+ const p = record(raw.predecessor, ["requestId", "acknowledgedVersion"]);
75
+ predecessor = Object.freeze({ requestId: request(p.requestId), acknowledgedVersion: version(p.acknowledgedVersion) });
76
+ if (predecessor.requestId === raw.requestId || predecessor.acknowledgedVersion !== raw.expectedVersion)
77
+ fail("invalid predecessor");
78
+ }
79
+ return Object.freeze(bounded({ schema: 1, scope: string(raw.scope), requestId: request(raw.requestId), target: id,
80
+ okfVersion: raw.okfVersion, operation, expectedVersion: version(raw.expectedVersion), local, content,
81
+ createdAt: timestamp(raw.createdAt), ...(predecessor ? { predecessor } : {}) }));
82
+ }
83
+ /** Successors derive their premise only from a fully bound predecessor receipt. */
84
+ export function prepareBodyDelivery(input, premise) {
85
+ const fields = record(input, ["scope", "requestId", "target", "okfVersion", "operation", "local", "content", "createdAt"]);
86
+ if (Object.hasOwn(premise, "expectedVersion")) {
87
+ const initial = record(premise, ["expectedVersion"]);
88
+ return validatePreparedBodyDelivery({ ...fields, schema: 1, expectedVersion: initial.expectedVersion });
89
+ }
90
+ const prior = record(premise, ["prepared", "receipt"]);
91
+ const prepared = validatePreparedBodyDelivery(prior.prepared);
92
+ const receipt = validateBodyReceipt(prepared, prior.receipt);
93
+ if (fields.scope !== prepared.scope || fields.target !== prepared.target || fields.okfVersion !== prepared.okfVersion || fields.requestId === prepared.requestId)
94
+ fail("successor identity mismatch");
95
+ return validatePreparedBodyDelivery({ ...fields, schema: 1, expectedVersion: receipt.version,
96
+ predecessor: { requestId: prepared.requestId, acknowledgedVersion: receipt.version } });
97
+ }
98
+ export function assertSameBodyDelivery(recorded, candidate) {
99
+ if (JSON.stringify(validatePreparedBodyDelivery(recorded)) !== JSON.stringify(validatePreparedBodyDelivery(candidate)))
100
+ fail("request identity reused with different input");
101
+ }
102
+ /** Content/version association is asserted by the trusted authority, not inferred from a later head. */
103
+ export function validateBodyReceipt(prepared, value) {
104
+ const p = validatePreparedBodyDelivery(prepared);
105
+ const raw = record(value, ["scope", "requestId", "target", "expectedVersion", "body", "version", "content"]);
106
+ if (raw.scope !== p.scope || raw.requestId !== p.requestId || raw.target !== p.target ||
107
+ raw.expectedVersion !== p.expectedVersion || raw.body !== p.operation.body)
108
+ fail("receipt binding mismatch");
109
+ return Object.freeze(bounded({ scope: p.scope, requestId: p.requestId, target: p.target, expectedVersion: p.expectedVersion,
110
+ body: p.operation.body, version: version(raw.version), content: bodyContent(raw.content, p.operation.body, p.target, p.okfVersion) }));
111
+ }
112
+ function captureOutcome(prepared, value) {
113
+ try {
114
+ if (!value || typeof value !== "object")
115
+ fail("invalid outcome");
116
+ switch (value.kind) {
117
+ case "committed": {
118
+ const raw = record(value, ["kind", "receipt"]);
119
+ const receipt = validateBodyReceipt(prepared, raw.receipt);
120
+ return Object.freeze({ kind: "committed", version: receipt.version, receipt });
121
+ }
122
+ case "conflict": {
123
+ const raw = record(value, ["kind", "actual"]);
124
+ return { kind: "conflict", actual: raw.actual === null ? null : version(raw.actual) };
125
+ }
126
+ case "refused": {
127
+ const raw = record(value, ["kind", "code", "message"]);
128
+ return { kind: "refused", code: string(raw.code), message: string(raw.message) };
129
+ }
130
+ case "unknown":
131
+ record(value, ["kind"]);
132
+ return { kind: "unknown" };
133
+ default: fail("unknown outcome kind");
134
+ }
135
+ }
136
+ catch {
137
+ return { kind: "unknown", diagnostic: "Invalid or incomplete delivery evidence" };
138
+ }
139
+ }
140
+ /** Persist the envelope and attempted claim atomically BEFORE calling; this function does no persistence. */
141
+ export async function performBodyDelivery(transport, prepared, attempts, options = {}) {
142
+ const p = validatePreparedBodyDelivery(prepared);
143
+ integer(attempts);
144
+ const raw = record(options, [], ["deadlineMs", "maxLookups", "lookupDelayMs", "maxSubmissions", "sleep"]);
145
+ for (const key of ["deadlineMs", "maxLookups", "lookupDelayMs", "maxSubmissions"])
146
+ if (Object.hasOwn(raw, key))
147
+ integer(raw[key]);
148
+ if (raw.sleep !== undefined && typeof raw.sleep !== "function")
149
+ fail("invalid timer");
150
+ if (attempts > Number.MAX_SAFE_INTEGER - Math.max(1, options.maxSubmissions ?? 2))
151
+ fail("attempt counter overflow");
152
+ const result = await performUncertainWrite({
153
+ submit: async (_intent, signal) => captureOutcome(p, await transport.submit(p, signal)),
154
+ lookup: async () => { const value = await transport.lookup(p); return value === null ? null : captureOutcome(p, value); },
155
+ }, { requestId: p.requestId, kind: p.operation.kind, target: p.target, base: p.expectedVersion, local: p.local,
156
+ content: p.content, createdAt: p.createdAt, attempts, state: "pending" }, { ...options, settlement: "recorded-only" });
157
+ // Evidence travels on the chosen outcome, so a deadline-late response cannot replace it.
158
+ const chosen = result.outcome;
159
+ const outcome = chosen.kind === "committed"
160
+ ? chosen.receipt && chosen.receipt.version === chosen.version ? { kind: "committed", receipt: chosen.receipt } : { kind: "unknown" }
161
+ : chosen.kind === "unknown" ? { kind: "unknown" } : chosen;
162
+ return Object.freeze({ prepared: p, attempts: result.intent.attempts, state: outcome.kind === "committed" ? "acknowledged" : outcome.kind,
163
+ lookups: result.lookups, outcome: Object.freeze(outcome), ...(chosen.diagnostic ? { diagnostic: chosen.diagnostic } : {}) });
164
+ }
165
+ function freezeDeep(value) {
166
+ if (value && typeof value === "object") {
167
+ for (const child of Object.values(value))
168
+ freezeDeep(child);
169
+ Object.freeze(value);
170
+ }
171
+ return value;
172
+ }
173
+ function captureIntent(value) {
174
+ const row = record(value, ["requestId", "kind", "target", "base", "local", "content", "createdAt", "attempts", "state", "sequence", "updatedAt", "baseContent"], ["after", "acknowledgedVersion", "remote", "refusal", "finding"]);
175
+ request(row.requestId);
176
+ string(row.kind);
177
+ target(row.target);
178
+ version(row.local);
179
+ if (row.base !== null)
180
+ version(row.base);
181
+ string(row.content, BODY_DELIVERY_LIMITS.envelopeBytes, false);
182
+ if (row.baseContent !== null)
183
+ string(row.baseContent, BODY_DELIVERY_LIMITS.envelopeBytes, false);
184
+ timestamp(row.createdAt);
185
+ timestamp(row.updatedAt);
186
+ integer(row.attempts);
187
+ integer(row.sequence);
188
+ if (!["pending", "in_flight", "acknowledged", "conflict", "refused", "unknown"].includes(row.state))
189
+ fail("invalid journal state");
190
+ if (Object.hasOwn(row, "after"))
191
+ request(row.after);
192
+ if (Object.hasOwn(row, "acknowledgedVersion"))
193
+ version(row.acknowledgedVersion);
194
+ if (Object.hasOwn(row, "finding"))
195
+ string(row.finding);
196
+ if (Object.hasOwn(row, "remote")) {
197
+ const remote = record(row.remote, ["version", "content"]);
198
+ if (remote.version !== null)
199
+ version(remote.version);
200
+ if (remote.content !== null)
201
+ string(remote.content, BODY_DELIVERY_LIMITS.envelopeBytes, false);
202
+ }
203
+ if (Object.hasOwn(row, "refusal")) {
204
+ const refusal = record(row.refusal, ["code", "message"]);
205
+ string(refusal.code);
206
+ string(refusal.message);
207
+ }
208
+ return JSON.parse(JSON.stringify(row));
209
+ }
210
+ /** Pure proposal only. Replacement requires an atomic full-journal, document AND shared-base CAS. */
211
+ export function reconcileBodyReceipt(prepared, receipt, snapshot) {
212
+ const p = validatePreparedBodyDelivery(prepared), r = validateBodyReceipt(p, receipt);
213
+ record(snapshot, ["version", "intents", "shared"]);
214
+ if (snapshot.version !== null)
215
+ version(snapshot.version);
216
+ if (!Array.isArray(snapshot.intents))
217
+ fail("invalid journal snapshot");
218
+ if (Object.keys(snapshot.intents).length !== snapshot.intents.length)
219
+ fail("invalid journal list");
220
+ let shared = null;
221
+ if (snapshot.shared !== null) {
222
+ const raw = record(snapshot.shared, ["version", "content"]);
223
+ const content = string(raw.content, BODY_DELIVERY_LIMITS.envelopeBytes, false);
224
+ const parsed = parseMarkdown(content, p.target, { okfVersion: p.okfVersion });
225
+ if (typeof parsed.frontmatter.type !== "string" || !parsed.frontmatter.type.trim())
226
+ fail("shared concept type required");
227
+ shared = { version: version(raw.version), content };
228
+ }
229
+ // Shared refresh can advance independently of the document and journal; compare all three.
230
+ const expected = { version: snapshot.version, intents: snapshot.intents.map(captureIntent), shared };
231
+ string(JSON.stringify(expected), BODY_RECONCILIATION_BYTES);
232
+ const ids = new Set(), sequences = new Set();
233
+ for (const row of expected.intents) {
234
+ request(row.requestId);
235
+ integer(row.sequence);
236
+ if (ids.has(row.requestId) || sequences.has(row.sequence))
237
+ fail("ambiguous journal snapshot");
238
+ ids.add(row.requestId);
239
+ sequences.add(row.sequence);
240
+ }
241
+ const anchor = expected.intents.find(row => row.requestId === p.requestId);
242
+ const boundAnchor = anchor?.target === p.target && anchor.local === p.local && anchor.content === p.content && anchor.createdAt === p.createdAt;
243
+ const newer = anchor ? expected.intents.filter(row => row.target === p.target && row.sequence > anchor.sequence) : [];
244
+ const compatible = boundAnchor && !newer.some(row => row.state === "acknowledged");
245
+ const alreadyShared = shared?.version === r.version && shared.content === r.content;
246
+ const advanceShared = compatible && shared?.version === p.expectedVersion && shared.version !== r.version;
247
+ const replace = compatible && (advanceShared || alreadyShared) && expected.version === p.local && newer.length === 0;
248
+ return freezeDeep({ action: replace ? "replace-local-under-CAS" : "preserve-local", receipt: r,
249
+ shared: advanceShared ? { action: "replace-shared-under-CAS", version: r.version, content: r.content } : { action: "preserve-shared" }, expected });
250
+ }
251
+ //# sourceMappingURL=governed-body-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-body-write.js","sourceRoot":"","sources":["../src/governed-body-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The heads digest: one content-addressed token over every document id and version a bundle
3
+ * holds, so a client can learn in one round trip whether anything changed
4
+ * (`docs/WIRE-PROTOCOL.md`, "Heads and snapshot").
5
+ *
6
+ * The recipe is fixed so any host computes the same token from the same heads: sort the heads by
7
+ * id in UTF-16 code unit order (plain `<` on the id strings, which no locale can change; the
8
+ * list route's `localeCompare` collation is host dependent and is not this order), concatenate
9
+ * `id`, `\n`, `version`, `\n` for each head, hash the UTF-8 bytes with SHA-256, and prefix the
10
+ * lowercase hex with `sha256:`. An empty bundle digests the empty byte string. The digest
11
+ * changes whenever a document is created, updated (its version changes) or deleted (its id
12
+ * disappears). Precondition: no id contains a line feed. The id rule in `paths.ts` does not
13
+ * reject control characters, so a digest over such an id would not be injective over its heads;
14
+ * the wire refuses control characters in document ids on every route and fails heads and
15
+ * snapshot closed when a bundle already holds one (`docs/WIRE-PROTOCOL.md`).
16
+ *
17
+ * Runtime-neutral: the reference router, a Worker host and a browser working copy all mint the
18
+ * same token through the one pure SHA-256 in `sha256.ts`.
19
+ */
20
+ import type { ConceptId, Version } from "./types.js";
21
+ /** One document's identity on the wire: its id and current content-addressed version. */
22
+ export interface DocumentHead {
23
+ id: ConceptId;
24
+ version: Version;
25
+ }
26
+ /** Sort heads into the wire's id order (UTF-16 code unit order) without mutating the input. */
27
+ export declare function sortHeads<Head extends DocumentHead>(heads: readonly Head[]): Head[];
28
+ /** The digest of `heads` by the documented recipe; the input is sorted first, so order does not matter. */
29
+ export declare function headsDigest(heads: readonly DocumentHead[]): string;
30
+ /** True for a well-formed heads digest token (`sha256:` plus 64 lowercase hex characters). */
31
+ export declare function isHeadsDigest(value: unknown): value is string;
32
+ //# sourceMappingURL=heads-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heads-digest.d.ts","sourceRoot":"","sources":["../src/heads-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErD,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,SAAS,YAAY,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CAEnF;AAED,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAIlE;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE7D"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The heads digest: one content-addressed token over every document id and version a bundle
3
+ * holds, so a client can learn in one round trip whether anything changed
4
+ * (`docs/WIRE-PROTOCOL.md`, "Heads and snapshot").
5
+ *
6
+ * The recipe is fixed so any host computes the same token from the same heads: sort the heads by
7
+ * id in UTF-16 code unit order (plain `<` on the id strings, which no locale can change; the
8
+ * list route's `localeCompare` collation is host dependent and is not this order), concatenate
9
+ * `id`, `\n`, `version`, `\n` for each head, hash the UTF-8 bytes with SHA-256, and prefix the
10
+ * lowercase hex with `sha256:`. An empty bundle digests the empty byte string. The digest
11
+ * changes whenever a document is created, updated (its version changes) or deleted (its id
12
+ * disappears). Precondition: no id contains a line feed. The id rule in `paths.ts` does not
13
+ * reject control characters, so a digest over such an id would not be injective over its heads;
14
+ * the wire refuses control characters in document ids on every route and fails heads and
15
+ * snapshot closed when a bundle already holds one (`docs/WIRE-PROTOCOL.md`).
16
+ *
17
+ * Runtime-neutral: the reference router, a Worker host and a browser working copy all mint the
18
+ * same token through the one pure SHA-256 in `sha256.ts`.
19
+ */
20
+ import { sha256HexOfUtf8 } from "./sha256.js";
21
+ const HEADS_DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
22
+ /** Sort heads into the wire's id order (UTF-16 code unit order) without mutating the input. */
23
+ export function sortHeads(heads) {
24
+ return [...heads].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
25
+ }
26
+ /** The digest of `heads` by the documented recipe; the input is sorted first, so order does not matter. */
27
+ export function headsDigest(heads) {
28
+ let input = "";
29
+ for (const head of sortHeads(heads))
30
+ input += `${head.id}\n${head.version}\n`;
31
+ return `sha256:${sha256HexOfUtf8(input)}`;
32
+ }
33
+ /** True for a well-formed heads digest token (`sha256:` plus 64 lowercase hex characters). */
34
+ export function isHeadsDigest(value) {
35
+ return typeof value === "string" && HEADS_DIGEST_RE.test(value);
36
+ }
37
+ //# sourceMappingURL=heads-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heads-digest.js","sourceRoot":"","sources":["../src/heads-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS9C,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAA4B,KAAsB;IACzE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,WAAW,CAAC,KAA8B;IACxD,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC;QAAE,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC;IAC9E,OAAO,UAAU,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Capture structural host policy: public fields, nested records/arrays, and prototype methods.
3
+ * Methods compose through the captured receiver, never through the caller's mutable object.
4
+ * Getters are evaluated once. Callbacks may still observe external OS facts. Policies must not
5
+ * require opaque internal slots/private fields or functions pre-bound to a mutable receiver;
6
+ * those cannot be reconstructed from a structural interface. Caller objects are never frozen.
7
+ */
8
+ export declare function snapshotHostPolicy<T extends object>(input: T, seen?: WeakMap<object, object>): T;
9
+ //# sourceMappingURL=host-policy-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-policy-snapshot.d.ts","sourceRoot":"","sources":["../src/host-policy-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,0BAAgC,GAAG,CAAC,CAuBtG"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Capture structural host policy: public fields, nested records/arrays, and prototype methods.
3
+ * Methods compose through the captured receiver, never through the caller's mutable object.
4
+ * Getters are evaluated once. Callbacks may still observe external OS facts. Policies must not
5
+ * require opaque internal slots/private fields or functions pre-bound to a mutable receiver;
6
+ * those cannot be reconstructed from a structural interface. Caller objects are never frozen.
7
+ */
8
+ export function snapshotHostPolicy(input, seen = new WeakMap()) {
9
+ const existing = seen.get(input);
10
+ if (existing)
11
+ return existing;
12
+ const result = (Array.isArray(input) ? [] : {});
13
+ seen.set(input, result);
14
+ const keys = new Set();
15
+ for (let owner = input; owner && owner !== Object.prototype && owner !== Array.prototype; owner = Object.getPrototypeOf(owner)) {
16
+ for (const key of Reflect.ownKeys(owner)) {
17
+ if (key !== "constructor" && !(Array.isArray(input) && key === "length"))
18
+ keys.add(key);
19
+ }
20
+ }
21
+ for (const key of keys) {
22
+ const value = input[key];
23
+ Object.defineProperty(result, key, {
24
+ value: typeof value === "function" ? value.bind(result)
25
+ : value && typeof value === "object" ? snapshotHostPolicy(value, seen) : value,
26
+ enumerable: true,
27
+ });
28
+ }
29
+ if (Array.isArray(input))
30
+ result.length = input.length;
31
+ return Object.freeze(result);
32
+ }
33
+ //# sourceMappingURL=host-policy-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-policy-snapshot.js","sourceRoot":"","sources":["../src/host-policy-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAmB,KAAQ,EAAE,OAAO,IAAI,OAAO,EAAkB;IACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,QAAQ;QAAE,OAAO,QAAa,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAiC,CAAC;IAChF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;IACpC,KAAK,IAAI,KAAK,GAAkB,KAAK,EACnC,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,KAAK,CAAC,SAAS,EAChE,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,GAAG,KAAK,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAI,KAAsC,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;YACjC,KAAK,EAAE,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrD,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;YAChF,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAG,MAA+B,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACjF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAM,CAAC;AACpC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Text that came from a host (a bundle's name, a person's name, a label) made safe to show a person
3
+ * or an agent: control and format characters removed (escape sequences, bidi overrides such as
4
+ * U+202E, zero-width characters), surrounding space trimmed, and at most `max` UTF-16 units kept,
5
+ * cut only between whole characters (never half a surrogate pair). The one rule every surface that
6
+ * shows host text uses.
7
+ */
8
+ export declare function stripHostText(value: string, max: number): string;
9
+ /**
10
+ * Host data (a result's keys and strings) with control and format characters and the line and
11
+ * paragraph separators (U+2028, U+2029) removed, except tab, newline and carriage return, with no
12
+ * length cap: the rule of {@link stripHostText} for text that is shown whole.
13
+ */
14
+ export declare function stripHostControls(value: string): string;
15
+ /**
16
+ * A copy of parsed JSON data with every key and string through {@link stripHostControls}, and
17
+ * whether anything was removed (a key that collides with an earlier one once stripped is dropped,
18
+ * and counts as removed). Iterative, so a deeply nested answer cannot exhaust the stack.
19
+ */
20
+ export declare function stripHostData(input: unknown): {
21
+ value: unknown;
22
+ removed: boolean;
23
+ };
24
+ /**
25
+ * JSON text with every C1 control, U+2028, U+2029 and format character (bidi controls, zero-width
26
+ * characters, tag characters) escaped as `\uXXXX`, one escape per UTF-16 unit. `JSON.stringify`
27
+ * already escapes the C0 controls; these can occur only inside strings, so the text stays valid
28
+ * JSON and parses back to the same data.
29
+ */
30
+ export declare function escapeHostJson(json: string): string;
31
+ //# sourceMappingURL=host-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-text.d.ts","sourceRoot":"","sources":["../src/host-text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiClF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD"}