@x12i/memorix-service 3.12.3 → 3.13.0

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 (211) hide show
  1. package/README.md +2 -2
  2. package/dist/activity-ui.js +1 -1
  3. package/dist/agent-catalog.d.ts +32 -0
  4. package/dist/agent-catalog.d.ts.map +1 -0
  5. package/dist/agent-catalog.js +80 -0
  6. package/dist/agent-catalog.js.map +1 -0
  7. package/dist/analytics/engine.d.ts.map +1 -1
  8. package/dist/analytics/engine.js +2 -1
  9. package/dist/analytics/engine.js.map +1 -1
  10. package/dist/analytics/state.d.ts +1 -1
  11. package/dist/analytics/tracker.d.ts +2 -0
  12. package/dist/analytics/tracker.d.ts.map +1 -1
  13. package/dist/analytics/tracker.js +15 -8
  14. package/dist/analytics/tracker.js.map +1 -1
  15. package/dist/anomaly/catalog.d.ts +4 -0
  16. package/dist/anomaly/catalog.d.ts.map +1 -0
  17. package/dist/anomaly/catalog.js +315 -0
  18. package/dist/anomaly/catalog.js.map +1 -0
  19. package/dist/anomaly/descriptors.d.ts +11 -0
  20. package/dist/anomaly/descriptors.d.ts.map +1 -0
  21. package/dist/anomaly/descriptors.js +113 -0
  22. package/dist/anomaly/descriptors.js.map +1 -0
  23. package/dist/anomaly/index.d.ts +6 -0
  24. package/dist/anomaly/index.d.ts.map +1 -0
  25. package/dist/anomaly/index.js +5 -0
  26. package/dist/anomaly/index.js.map +1 -0
  27. package/dist/anomaly/records.d.ts +28 -0
  28. package/dist/anomaly/records.d.ts.map +1 -0
  29. package/dist/anomaly/records.js +384 -0
  30. package/dist/anomaly/records.js.map +1 -0
  31. package/dist/anomaly/types.d.ts +116 -0
  32. package/dist/anomaly/types.d.ts.map +1 -0
  33. package/dist/anomaly/types.js +24 -0
  34. package/dist/anomaly/types.js.map +1 -0
  35. package/dist/anomaly/values.d.ts +31 -0
  36. package/dist/anomaly/values.d.ts.map +1 -0
  37. package/dist/anomaly/values.js +171 -0
  38. package/dist/anomaly/values.js.map +1 -0
  39. package/dist/app.d.ts.map +1 -1
  40. package/dist/app.js +34 -1
  41. package/dist/app.js.map +1 -1
  42. package/dist/arrivals-backfill.d.ts +23 -0
  43. package/dist/arrivals-backfill.d.ts.map +1 -0
  44. package/dist/arrivals-backfill.js +132 -0
  45. package/dist/arrivals-backfill.js.map +1 -0
  46. package/dist/arrivals-routes.d.ts +8 -0
  47. package/dist/arrivals-routes.d.ts.map +1 -0
  48. package/dist/arrivals-routes.js +17 -0
  49. package/dist/arrivals-routes.js.map +1 -0
  50. package/dist/arrivals-ui.d.ts +3 -0
  51. package/dist/arrivals-ui.d.ts.map +1 -0
  52. package/dist/arrivals-ui.js +277 -0
  53. package/dist/arrivals-ui.js.map +1 -0
  54. package/dist/catalog-bridge.d.ts +18 -0
  55. package/dist/catalog-bridge.d.ts.map +1 -1
  56. package/dist/catalog-bridge.js +115 -7
  57. package/dist/catalog-bridge.js.map +1 -1
  58. package/dist/catalog-live-ui.js +1 -1
  59. package/dist/content-arrivals-countex.d.ts +90 -0
  60. package/dist/content-arrivals-countex.d.ts.map +1 -0
  61. package/dist/content-arrivals-countex.js +252 -0
  62. package/dist/content-arrivals-countex.js.map +1 -0
  63. package/dist/data-changes-ui.js +1 -1
  64. package/dist/data-changes.d.ts +3 -0
  65. package/dist/data-changes.d.ts.map +1 -1
  66. package/dist/data-changes.js +22 -21
  67. package/dist/data-changes.js.map +1 -1
  68. package/dist/errors.d.ts +6 -1
  69. package/dist/errors.d.ts.map +1 -1
  70. package/dist/errors.js +22 -2
  71. package/dist/errors.js.map +1 -1
  72. package/dist/hooks-live-ui.js +1 -1
  73. package/dist/knowledge-upstream.d.ts +32 -0
  74. package/dist/knowledge-upstream.d.ts.map +1 -1
  75. package/dist/knowledge-upstream.js +86 -2
  76. package/dist/knowledge-upstream.js.map +1 -1
  77. package/dist/land-v2-guards.d.ts +5 -12
  78. package/dist/land-v2-guards.d.ts.map +1 -1
  79. package/dist/land-v2-guards.js +10 -33
  80. package/dist/land-v2-guards.js.map +1 -1
  81. package/dist/live-ops-nav.d.ts.map +1 -1
  82. package/dist/live-ops-nav.js +4 -0
  83. package/dist/live-ops-nav.js.map +1 -1
  84. package/dist/mcp/nexum-tools.d.ts +1 -1
  85. package/dist/mcp/nexum-tools.d.ts.map +1 -1
  86. package/dist/mcp/nexum-tools.js +39 -22
  87. package/dist/mcp/nexum-tools.js.map +1 -1
  88. package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
  89. package/dist/nexum-analysis/enqueue.js +2 -1
  90. package/dist/nexum-analysis/enqueue.js.map +1 -1
  91. package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
  92. package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
  93. package/dist/nexum-analysis/knowledge-read.js +26 -0
  94. package/dist/nexum-analysis/knowledge-read.js.map +1 -0
  95. package/dist/nexum-analysis/outbox.d.ts +1 -1
  96. package/dist/nexum-analysis/reconcile.d.ts.map +1 -1
  97. package/dist/nexum-analysis/reconcile.js +3 -2
  98. package/dist/nexum-analysis/reconcile.js.map +1 -1
  99. package/dist/openapi/openapi.json +18354 -17673
  100. package/dist/operational-db.d.ts +2 -2
  101. package/dist/operational-db.d.ts.map +1 -1
  102. package/dist/operational-db.js +8 -11
  103. package/dist/operational-db.js.map +1 -1
  104. package/dist/patches/access.d.ts +15 -0
  105. package/dist/patches/access.d.ts.map +1 -0
  106. package/dist/patches/access.js +27 -0
  107. package/dist/patches/access.js.map +1 -0
  108. package/dist/patches/engine.d.ts +67 -0
  109. package/dist/patches/engine.d.ts.map +1 -0
  110. package/dist/patches/engine.js +966 -0
  111. package/dist/patches/engine.js.map +1 -0
  112. package/dist/patches/guards.d.ts +23 -0
  113. package/dist/patches/guards.d.ts.map +1 -0
  114. package/dist/patches/guards.js +77 -0
  115. package/dist/patches/guards.js.map +1 -0
  116. package/dist/patches/legacy-rows.d.ts +56 -0
  117. package/dist/patches/legacy-rows.d.ts.map +1 -0
  118. package/dist/patches/legacy-rows.js +162 -0
  119. package/dist/patches/legacy-rows.js.map +1 -0
  120. package/dist/patches/ops.d.ts +24 -0
  121. package/dist/patches/ops.d.ts.map +1 -0
  122. package/dist/patches/ops.js +204 -0
  123. package/dist/patches/ops.js.map +1 -0
  124. package/dist/patches/parse.d.ts +5 -0
  125. package/dist/patches/parse.d.ts.map +1 -0
  126. package/dist/patches/parse.js +323 -0
  127. package/dist/patches/parse.js.map +1 -0
  128. package/dist/patches/paths.d.ts +38 -0
  129. package/dist/patches/paths.d.ts.map +1 -0
  130. package/dist/patches/paths.js +204 -0
  131. package/dist/patches/paths.js.map +1 -0
  132. package/dist/patches/service.d.ts +16 -0
  133. package/dist/patches/service.d.ts.map +1 -0
  134. package/dist/patches/service.js +128 -0
  135. package/dist/patches/service.js.map +1 -0
  136. package/dist/patches/store.d.ts +87 -0
  137. package/dist/patches/store.d.ts.map +1 -0
  138. package/dist/patches/store.js +27 -0
  139. package/dist/patches/store.js.map +1 -0
  140. package/dist/patches/types.d.ts +112 -0
  141. package/dist/patches/types.d.ts.map +1 -0
  142. package/dist/patches/types.js +5 -0
  143. package/dist/patches/types.js.map +1 -0
  144. package/dist/platform.d.ts +17 -3
  145. package/dist/platform.d.ts.map +1 -1
  146. package/dist/platform.js +114 -11
  147. package/dist/platform.js.map +1 -1
  148. package/dist/routes/anomaly.d.ts +5 -0
  149. package/dist/routes/anomaly.d.ts.map +1 -0
  150. package/dist/routes/anomaly.js +308 -0
  151. package/dist/routes/anomaly.js.map +1 -0
  152. package/dist/routes/data.d.ts.map +1 -1
  153. package/dist/routes/data.js +252 -210
  154. package/dist/routes/data.js.map +1 -1
  155. package/dist/routes/knowledge.d.ts.map +1 -1
  156. package/dist/routes/knowledge.js +6 -22
  157. package/dist/routes/knowledge.js.map +1 -1
  158. package/dist/routes/memory.d.ts.map +1 -1
  159. package/dist/routes/memory.js +2 -4
  160. package/dist/routes/memory.js.map +1 -1
  161. package/dist/routes/metadata.d.ts.map +1 -1
  162. package/dist/routes/metadata.js +40 -1
  163. package/dist/routes/metadata.js.map +1 -1
  164. package/dist/routes/mgc-landing.d.ts.map +1 -1
  165. package/dist/routes/mgc-landing.js +64 -94
  166. package/dist/routes/mgc-landing.js.map +1 -1
  167. package/dist/routes/patches.d.ts +7 -0
  168. package/dist/routes/patches.d.ts.map +1 -0
  169. package/dist/routes/patches.js +111 -0
  170. package/dist/routes/patches.js.map +1 -0
  171. package/dist/routes/subject-roots-backfill.d.ts +4 -0
  172. package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
  173. package/dist/routes/subject-roots-backfill.js +15 -0
  174. package/dist/routes/subject-roots-backfill.js.map +1 -0
  175. package/dist/routes/workflow.d.ts.map +1 -1
  176. package/dist/routes/workflow.js +4 -10
  177. package/dist/routes/workflow.js.map +1 -1
  178. package/dist/single-read-discriminator.d.ts +17 -0
  179. package/dist/single-read-discriminator.d.ts.map +1 -0
  180. package/dist/single-read-discriminator.js +67 -0
  181. package/dist/single-read-discriminator.js.map +1 -0
  182. package/dist/subject-roots-backfill.d.ts +24 -0
  183. package/dist/subject-roots-backfill.d.ts.map +1 -0
  184. package/dist/subject-roots-backfill.js +133 -0
  185. package/dist/subject-roots-backfill.js.map +1 -0
  186. package/dist/write-precondition.d.ts +5 -1
  187. package/dist/write-precondition.d.ts.map +1 -1
  188. package/dist/write-precondition.js +11 -3
  189. package/dist/write-precondition.js.map +1 -1
  190. package/dist/writes/content-write.d.ts +170 -0
  191. package/dist/writes/content-write.d.ts.map +1 -0
  192. package/dist/writes/content-write.js +569 -0
  193. package/dist/writes/content-write.js.map +1 -0
  194. package/dist/writes/effects.d.ts +13 -0
  195. package/dist/writes/effects.d.ts.map +1 -0
  196. package/dist/writes/effects.js +28 -0
  197. package/dist/writes/effects.js.map +1 -0
  198. package/dist/writes/error-shape.d.ts +11 -0
  199. package/dist/writes/error-shape.d.ts.map +1 -0
  200. package/dist/writes/error-shape.js +100 -0
  201. package/dist/writes/error-shape.js.map +1 -0
  202. package/dist/writes/receipt-store.d.ts +81 -0
  203. package/dist/writes/receipt-store.d.ts.map +1 -0
  204. package/dist/writes/receipt-store.js +171 -0
  205. package/dist/writes/receipt-store.js.map +1 -0
  206. package/dist/writes/worker.d.ts +9 -0
  207. package/dist/writes/worker.d.ts.map +1 -0
  208. package/dist/writes/worker.js +20 -0
  209. package/dist/writes/worker.js.map +1 -0
  210. package/openapi/openapi.json +18354 -17673
  211. package/package.json +4 -4
@@ -0,0 +1,569 @@
1
+ /**
2
+ * Guaranteed content write: one receipt or one rejection per row.
3
+ */
4
+ import { createHash } from "node:crypto";
5
+ import { canonicalJson, fillExplicitRecordIdentity, parseContentSubject, } from "@x12i/memorix-data";
6
+ import { mapErrorToHttp, ServiceError } from "../errors.js";
7
+ import { assertAddressMatchesEnvelope } from "../identity-alias.js";
8
+ import { runHookTrigger } from "../hooks/request-trigger.js";
9
+ import { normalizeWritePrecondition } from "../write-precondition.js";
10
+ import { classifyFailure } from "./error-shape.js";
11
+ import { newReceiptId, rejectedExpiry, WRITE_ATTEMPT_LEASE_MS, } from "./receipt-store.js";
12
+ export const CONTENT_BATCH_LIMIT = 500;
13
+ export async function runContentWrite(deps, body, replay) {
14
+ if (replay)
15
+ return finish(deps, replay, replay.request);
16
+ const now = (deps.now ?? (() => new Date().toISOString()))();
17
+ let prepared;
18
+ try {
19
+ prepared = prepareWrite(deps, body, now);
20
+ await deps.checkWrite?.(prepared.request);
21
+ }
22
+ catch (err) {
23
+ const error = asServiceError(err);
24
+ await rememberRejection(deps, body, error, now);
25
+ return { kind: "rejected", error };
26
+ }
27
+ if (prepared.writeId) {
28
+ const existing = await deps.receipts.findByWriteId(deps.scope.orgId, deps.caller, prepared.writeId);
29
+ if (existing)
30
+ return answerExisting(deps, existing, prepared.contentHash);
31
+ }
32
+ const row = await insertPending(deps, prepared, now);
33
+ if (!row) {
34
+ const existing = await deps.receipts.findByWriteId(deps.scope.orgId, deps.caller, prepared.writeId ?? "");
35
+ if (existing)
36
+ return answerExisting(deps, existing, prepared.contentHash);
37
+ return {
38
+ kind: "rejected",
39
+ error: new ServiceError("WRITE_ID_REUSED", "writeId was already used", 409, {
40
+ field: "writeId",
41
+ retryable: false,
42
+ }),
43
+ };
44
+ }
45
+ return finish(deps, row, prepared.request, prepared.wirePrecondition);
46
+ }
47
+ export async function runContentBatch(deps, body, datasourceFor) {
48
+ if (!body || typeof body !== "object" || Array.isArray(body) || !Array.isArray(body.writes)) {
49
+ throw new ServiceError("VALIDATION", "writes must be an array", 400, { field: "writes", retryable: false });
50
+ }
51
+ const writes = body.writes;
52
+ if (writes.length > CONTENT_BATCH_LIMIT) {
53
+ throw new ServiceError("VALIDATION", `writes accepts at most ${CONTENT_BATCH_LIMIT} rows`, 400, {
54
+ field: "writes",
55
+ retryable: false,
56
+ });
57
+ }
58
+ const results = [];
59
+ for (const item of writes) {
60
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
61
+ results.push({
62
+ error: { code: "VALIDATION", field: "writes", message: "each write must be an object", retryable: false },
63
+ });
64
+ continue;
65
+ }
66
+ const row = item;
67
+ let datasource = deps.datasource;
68
+ try {
69
+ datasource = datasourceFor(row);
70
+ }
71
+ catch (err) {
72
+ results.push(batchError(err));
73
+ continue;
74
+ }
75
+ try {
76
+ const outcome = await runContentWrite({ ...deps, datasource }, row);
77
+ if (outcome.kind === "stored") {
78
+ results.push({ receipt: outcome.body.receipt });
79
+ }
80
+ else if (outcome.kind === "pending") {
81
+ results.push(outcome.body);
82
+ }
83
+ else {
84
+ results.push(batchError(outcome.error));
85
+ }
86
+ }
87
+ catch (err) {
88
+ results.push(batchError(err));
89
+ }
90
+ }
91
+ return { results };
92
+ }
93
+ async function finish(deps, row, request, wirePrecondition) {
94
+ const now = (deps.now ?? (() => new Date().toISOString()))();
95
+ try {
96
+ const performed = await performWrite(deps, request);
97
+ const receipt = performed.receipt;
98
+ row.status = "stored";
99
+ row.receipt = receipt;
100
+ row.error = undefined;
101
+ row.expireAt = undefined;
102
+ row.updatedAt = now;
103
+ row.request = request;
104
+ await deps.receipts.save(row);
105
+ let indexing;
106
+ if (deps.onCommitted && receipt.operation !== "unchanged") {
107
+ try {
108
+ indexing = await deps.onCommitted({
109
+ operation: receipt.operation,
110
+ objectType: receipt.storageKey.objectType,
111
+ contentType: receipt.storageKey.contentType,
112
+ recordId: receipt.storageKey.recordId,
113
+ revision: receipt.revision,
114
+ data: performed.data,
115
+ hooks: performed.hooks,
116
+ });
117
+ }
118
+ catch {
119
+ indexing = { status: "failed" };
120
+ }
121
+ }
122
+ return {
123
+ kind: "stored",
124
+ httpStatus: 200,
125
+ body: {
126
+ scope: deps.scope,
127
+ written: true,
128
+ outcome: receipt.operation,
129
+ receipt,
130
+ receiptId: row.receiptId,
131
+ result: performed.result,
132
+ currentRevision: receipt.operation === "removed" ? null : receipt.revision,
133
+ precondition: wirePrecondition ?? request.precondition,
134
+ ...(indexing !== undefined ? { indexing } : {}),
135
+ },
136
+ };
137
+ }
138
+ catch (err) {
139
+ const error = asServiceError(err);
140
+ const shape = classifyFailure(error, error.statusCode);
141
+ row.updatedAt = now;
142
+ row.request = request;
143
+ if (shape.retryable) {
144
+ row.status = "pending";
145
+ row.nextAttemptAt = new Date(Date.parse(now) + (shape.retryAfterMs ?? 1_000)).toISOString();
146
+ row.error = publicError(error, shape);
147
+ await deps.receipts.save(row);
148
+ return {
149
+ kind: "pending",
150
+ httpStatus: 202,
151
+ body: { receiptId: row.receiptId, status: "pending", retryAfterMs: shape.retryAfterMs ?? 1_000 },
152
+ };
153
+ }
154
+ row.status = "rejected";
155
+ row.error = publicError(error, shape);
156
+ row.expireAt = rejectedExpiry(now);
157
+ await deps.receipts.save(row);
158
+ return { kind: "rejected", error };
159
+ }
160
+ }
161
+ async function answerExisting(deps, existing, contentHash) {
162
+ if (existing.contentHash !== contentHash) {
163
+ return {
164
+ kind: "rejected",
165
+ error: new ServiceError("WRITE_ID_REUSED", "writeId was already used for different content", 409, { field: "writeId", retryable: false }),
166
+ };
167
+ }
168
+ if (existing.status === "stored" && existing.receipt) {
169
+ const result = await replayResult(deps, existing);
170
+ return {
171
+ kind: "stored",
172
+ httpStatus: 200,
173
+ body: {
174
+ scope: deps.scope,
175
+ written: true,
176
+ outcome: existing.receipt.operation,
177
+ receipt: existing.receipt,
178
+ receiptId: existing.receiptId,
179
+ result,
180
+ currentRevision: existing.receipt.operation === "removed" ? null : existing.receipt.revision,
181
+ precondition: existing.request.precondition,
182
+ },
183
+ };
184
+ }
185
+ if (existing.status === "pending") {
186
+ return {
187
+ kind: "pending",
188
+ httpStatus: 202,
189
+ body: { receiptId: existing.receiptId, status: "pending", retryAfterMs: 1_000 },
190
+ };
191
+ }
192
+ const error = existing.error;
193
+ return {
194
+ kind: "rejected",
195
+ error: new ServiceError(error?.code ?? "VALIDATION", error?.message ?? "write was rejected", error?.status ?? 400, {
196
+ field: error?.field,
197
+ retryable: false,
198
+ receiptId: existing.receiptId,
199
+ }),
200
+ };
201
+ }
202
+ async function rememberRejection(deps, body, error, now) {
203
+ if (!body.objectType || !body.contentType)
204
+ return;
205
+ const shape = classifyFailure(error, error.statusCode);
206
+ const row = {
207
+ receiptId: newReceiptId(),
208
+ orgId: deps.scope.orgId,
209
+ caller: deps.caller,
210
+ contentHash: createHash("sha256").update(canonicalJson(body)).digest("hex"),
211
+ status: "rejected",
212
+ error: publicError(error, shape),
213
+ request: {
214
+ scope: { orgId: deps.scope.orgId, agentIds: [...deps.scope.agentIds] },
215
+ caller: deps.caller,
216
+ op: body.op ?? "upsert",
217
+ objectType: body.objectType,
218
+ contentType: body.contentType,
219
+ precondition: "none",
220
+ suppressHooks: false,
221
+ datasourceDeclared: deps.datasource.declared,
222
+ },
223
+ attempts: 1,
224
+ nextAttemptAt: now,
225
+ createdAt: now,
226
+ updatedAt: now,
227
+ expireAt: rejectedExpiry(now),
228
+ };
229
+ try {
230
+ await deps.receipts.insert(row);
231
+ }
232
+ catch {
233
+ /* the rejection still returns to the caller */
234
+ }
235
+ }
236
+ async function insertPending(deps, prepared, now) {
237
+ const row = {
238
+ receiptId: newReceiptId(),
239
+ orgId: deps.scope.orgId,
240
+ caller: deps.caller,
241
+ ...(prepared.writeId ? { writeId: prepared.writeId } : {}),
242
+ contentHash: prepared.contentHash,
243
+ status: "pending",
244
+ request: prepared.request,
245
+ attempts: 0,
246
+ nextAttemptAt: new Date(Date.parse(now) + WRITE_ATTEMPT_LEASE_MS).toISOString(),
247
+ createdAt: now,
248
+ updatedAt: now,
249
+ };
250
+ const inserted = await deps.receipts.insert(row);
251
+ return inserted === "inserted" ? row : null;
252
+ }
253
+ function prepareWrite(deps, body, now) {
254
+ if (!body.objectType || !body.contentType) {
255
+ throw new ServiceError("VALIDATION", "objectType, contentType required", 400, {
256
+ field: body.objectType ? "contentType" : "objectType",
257
+ retryable: false,
258
+ });
259
+ }
260
+ assertAddressMatchesEnvelope({
261
+ objectType: body.objectType,
262
+ contentType: body.contentType,
263
+ record: body.record,
264
+ });
265
+ const precondition = normalizeWritePrecondition(body.precondition, body.expectedRevision);
266
+ const op = body.op ?? (precondition.form === "absent" ? "add" : "upsert");
267
+ if (precondition.form === "none" && op !== "upsert") {
268
+ throw new ServiceError("VALIDATION", "precondition none is only valid for op upsert", 400, {
269
+ field: "precondition",
270
+ retryable: false,
271
+ });
272
+ }
273
+ if (op === "remove" && precondition.form !== "exact-revision") {
274
+ throw new ServiceError("VALIDATION", "remove requires precondition exact-revision", 400, {
275
+ field: "precondition",
276
+ retryable: false,
277
+ });
278
+ }
279
+ const writeId = readWriteId(body.writeId);
280
+ const discriminatorValue = typeof body.discriminatorValue === "string" && body.discriminatorValue.trim()
281
+ ? body.discriminatorValue.trim()
282
+ : undefined;
283
+ const suppressHooks = readSuppressHooks(body.suppressHooks);
284
+ const callerRecord = body.record && typeof body.record === "object" && !Array.isArray(body.record)
285
+ ? { ...body.record }
286
+ : undefined;
287
+ const subject = resolveSubject(body.subject, callerRecord?.subject);
288
+ if (callerRecord && subject)
289
+ callerRecord.subject = subject;
290
+ const contentHash = createHash("sha256")
291
+ .update(canonicalJson({
292
+ op,
293
+ objectType: body.objectType,
294
+ contentType: body.contentType,
295
+ precondition: precondition.form,
296
+ expectedRevision: precondition.form === "exact-revision" ? precondition.expectedRevision : null,
297
+ discriminatorValue: discriminatorValue ?? null,
298
+ subject: subject ?? null,
299
+ record: callerRecord ?? null,
300
+ patch: body.patch ?? null,
301
+ }))
302
+ .digest("hex");
303
+ let record = callerRecord;
304
+ if (op !== "remove") {
305
+ if (!record)
306
+ throw new ServiceError("VALIDATION", "record required", 400, { field: "record", retryable: false });
307
+ const filled = fillExplicitRecordIdentity({
308
+ draft: {
309
+ ...record,
310
+ objectType: body.objectType,
311
+ contentType: body.contentType,
312
+ },
313
+ caller: deps.caller,
314
+ catalog: deps.ports.catalog,
315
+ now,
316
+ discriminatorValue,
317
+ });
318
+ record = filled;
319
+ if (record._system && typeof record._system === "object") {
320
+ const system = { ...record._system };
321
+ delete system._datasource;
322
+ record._system = system;
323
+ }
324
+ }
325
+ const request = {
326
+ scope: { orgId: deps.scope.orgId, agentIds: [...deps.scope.agentIds] },
327
+ caller: deps.caller,
328
+ op,
329
+ objectType: body.objectType,
330
+ contentType: body.contentType,
331
+ precondition: precondition.form,
332
+ ...(precondition.form === "exact-revision" ? { expectedRevision: precondition.expectedRevision } : {}),
333
+ ...(discriminatorValue ? { discriminatorValue } : {}),
334
+ suppressHooks,
335
+ ...(record ? { record } : {}),
336
+ ...(body.patch !== undefined ? { patch: body.patch } : {}),
337
+ ...(subject ? { subject } : {}),
338
+ datasourceDeclared: deps.datasource.declared,
339
+ ...(deps.datasource.declaration !== undefined ? { datasourceDeclaration: deps.datasource.declaration } : {}),
340
+ };
341
+ return { request, contentHash, writeId, wirePrecondition: body.precondition };
342
+ }
343
+ async function performWrite(deps, request) {
344
+ const datasource = {
345
+ service: request.caller,
346
+ declared: request.datasourceDeclared,
347
+ declaration: request.datasourceDeclaration,
348
+ };
349
+ const scope = request.scope;
350
+ if (request.op === "remove") {
351
+ const recordId = readRecordId(request.record);
352
+ const expectedRevision = requireRevision(request);
353
+ const pinned = await deps.ports.publications.list();
354
+ const blocking = pinned.filter((publication) => (publication.status === "committed" || publication.status === "draft") &&
355
+ publication.members.some((member) => member.recordId === recordId &&
356
+ member.objectType === request.objectType &&
357
+ member.contentType === request.contentType));
358
+ if (blocking.length) {
359
+ throw new ServiceError("PUBLICATION_PINNED", "cannot remove a content instance referenced by a draft or committed publication", 409, { publicationIds: blocking.map((publication) => publication.publicationId), field: "recordId", retryable: false });
360
+ }
361
+ const noted = await runHookTrigger(() => deps.ports.writer.remove({
362
+ scope,
363
+ objectType: request.objectType,
364
+ contentType: request.contentType,
365
+ recordId,
366
+ ...(request.discriminatorValue ? { discriminatorValue: request.discriminatorValue } : {}),
367
+ precondition: { kind: "revision", revision: expectedRevision },
368
+ datasource,
369
+ suppressHooks: request.suppressHooks,
370
+ }));
371
+ const removed = noted.value;
372
+ return {
373
+ result: removed,
374
+ hooks: noted.hooks,
375
+ receipt: {
376
+ storageKey: storageKey(request, removed.recordId),
377
+ revision: removed.previousRevision,
378
+ writtenAt: new Date().toISOString(),
379
+ operation: "removed",
380
+ },
381
+ };
382
+ }
383
+ const record = {
384
+ ...request.record,
385
+ objectType: request.objectType,
386
+ contentType: request.contentType,
387
+ };
388
+ const noted = await runHookTrigger(() => dispatchWrite(deps, request, record, datasource));
389
+ const written = noted.value;
390
+ const operation = written.unchanged ? "unchanged" : written.created ? "created" : "updated";
391
+ const data = written.record.data && typeof written.record.data === "object" && !Array.isArray(written.record.data)
392
+ ? written.record.data
393
+ : undefined;
394
+ return {
395
+ result: written,
396
+ data,
397
+ hooks: noted.hooks,
398
+ receipt: {
399
+ storageKey: storageKey(request, written.record.recordId),
400
+ revision: written.record.revision,
401
+ writtenAt: written.record._system.writtenAt ?? written.record._system.modifiedAt,
402
+ operation,
403
+ },
404
+ };
405
+ }
406
+ async function dispatchWrite(deps, request, record, datasource) {
407
+ const scope = request.scope;
408
+ if (request.op === "add" || request.precondition === "absent") {
409
+ return deps.ports.writer.add({
410
+ scope,
411
+ precondition: { kind: "absent" },
412
+ record,
413
+ datasource,
414
+ suppressHooks: request.suppressHooks,
415
+ });
416
+ }
417
+ if (request.op === "patch") {
418
+ return deps.ports.writer.patch({
419
+ scope,
420
+ precondition: { kind: "revision", revision: requireRevision(request) },
421
+ objectType: request.objectType,
422
+ contentType: request.contentType,
423
+ recordId: readRecordId(request.record),
424
+ ...(request.discriminatorValue ? { discriminatorValue: request.discriminatorValue } : {}),
425
+ ops: request.patch ?? [],
426
+ datasource,
427
+ suppressHooks: request.suppressHooks,
428
+ });
429
+ }
430
+ if (request.op === "replace") {
431
+ return deps.ports.writer.replace({
432
+ scope,
433
+ precondition: { kind: "revision", revision: requireRevision(request) },
434
+ record,
435
+ datasource,
436
+ suppressHooks: request.suppressHooks,
437
+ });
438
+ }
439
+ if (request.precondition === "none") {
440
+ return deps.ports.writer.upsert({
441
+ scope,
442
+ precondition: { kind: "none" },
443
+ record,
444
+ datasource,
445
+ suppressHooks: request.suppressHooks,
446
+ });
447
+ }
448
+ return deps.ports.writer.upsert({
449
+ scope,
450
+ precondition: { kind: "revision", revision: requireRevision(request) },
451
+ record,
452
+ datasource,
453
+ suppressHooks: request.suppressHooks,
454
+ });
455
+ }
456
+ async function replayResult(deps, row) {
457
+ const receipt = row.receipt;
458
+ if (!receipt)
459
+ return undefined;
460
+ if (receipt.operation === "removed") {
461
+ return {
462
+ recordId: receipt.storageKey.recordId,
463
+ objectType: receipt.storageKey.objectType,
464
+ contentType: receipt.storageKey.contentType,
465
+ removed: true,
466
+ previousRevision: receipt.revision,
467
+ };
468
+ }
469
+ try {
470
+ const record = await deps.ports.reader.getContent(row.request.scope, {
471
+ objectType: receipt.storageKey.objectType,
472
+ contentType: receipt.storageKey.contentType,
473
+ recordId: receipt.storageKey.recordId,
474
+ ...(receipt.storageKey.discriminator ? { discriminatorValue: receipt.storageKey.discriminator } : {}),
475
+ });
476
+ return { record, created: receipt.operation === "created", unchanged: receipt.operation === "unchanged" };
477
+ }
478
+ catch {
479
+ return undefined;
480
+ }
481
+ }
482
+ function storageKey(request, recordId) {
483
+ return {
484
+ objectType: request.objectType,
485
+ contentType: request.contentType,
486
+ recordId,
487
+ ...(request.discriminatorValue ? { discriminator: request.discriminatorValue } : {}),
488
+ };
489
+ }
490
+ function resolveSubject(bodySubject, recordSubject) {
491
+ const fromBody = bodySubject === undefined ? undefined : parseContentSubject(bodySubject, "subject");
492
+ const fromRecord = recordSubject === undefined ? undefined : parseContentSubject(recordSubject, "record.subject");
493
+ if (fromBody && fromRecord && canonicalJson(fromBody) !== canonicalJson(fromRecord)) {
494
+ throw new ServiceError("VALIDATION", "subject and record.subject must match", 400, {
495
+ field: "subject",
496
+ retryable: false,
497
+ });
498
+ }
499
+ return fromBody ?? fromRecord;
500
+ }
501
+ function readWriteId(value) {
502
+ if (value === undefined || value === null || value === "")
503
+ return undefined;
504
+ if (typeof value !== "string" || !value.trim() || value.trim().length > 200) {
505
+ throw new ServiceError("VALIDATION", "writeId must be a string of at most 200 characters", 400, {
506
+ field: "writeId",
507
+ retryable: false,
508
+ });
509
+ }
510
+ return value.trim();
511
+ }
512
+ function readSuppressHooks(value) {
513
+ if (value === undefined)
514
+ return false;
515
+ if (typeof value !== "boolean") {
516
+ throw new ServiceError("VALIDATION", "suppressHooks must be a boolean", 400, {
517
+ field: "suppressHooks",
518
+ retryable: false,
519
+ });
520
+ }
521
+ return value;
522
+ }
523
+ function readRecordId(record) {
524
+ const recordId = record && typeof record.recordId === "string" ? record.recordId.trim() : "";
525
+ if (!recordId) {
526
+ throw new ServiceError("VALIDATION", "record.recordId is required", 400, { field: "record.recordId", retryable: false });
527
+ }
528
+ return recordId;
529
+ }
530
+ function requireRevision(request) {
531
+ if (request.expectedRevision === undefined) {
532
+ throw new ServiceError("VALIDATION", "expectedRevision required when precondition is exact-revision", 400, {
533
+ field: "expectedRevision",
534
+ retryable: false,
535
+ });
536
+ }
537
+ return request.expectedRevision;
538
+ }
539
+ function asServiceError(err) {
540
+ if (err instanceof ServiceError)
541
+ return err;
542
+ const mapped = mapErrorToHttp(err, "write");
543
+ const shape = classifyFailure(err, mapped.status);
544
+ const details = mapped.body.error.details && typeof mapped.body.error.details === "object"
545
+ ? { ...mapped.body.error.details }
546
+ : {};
547
+ return new ServiceError(mapped.body.error.code, mapped.body.error.message, mapped.status, {
548
+ ...details,
549
+ field: shape.field,
550
+ retryable: shape.retryable,
551
+ ...(shape.retryAfterMs !== undefined ? { retryAfterMs: shape.retryAfterMs } : {}),
552
+ });
553
+ }
554
+ function publicError(error, shape) {
555
+ return {
556
+ code: error.code,
557
+ field: shape.field,
558
+ message: error.message,
559
+ retryable: shape.retryable,
560
+ status: error.statusCode,
561
+ ...(shape.retryAfterMs !== undefined ? { retryAfterMs: shape.retryAfterMs } : {}),
562
+ };
563
+ }
564
+ function batchError(err) {
565
+ const error = asServiceError(err);
566
+ const shape = classifyFailure(error, error.statusCode);
567
+ return { error: publicError(error, shape) };
568
+ }
569
+ //# sourceMappingURL=content-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-write.js","sourceRoot":"","sources":["../../src/writes/content-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Side effects after a content write is stored. A failure here does not hide the receipt.
3
+ */
4
+ import type { MemorixPlatform } from "../platform.js";
5
+ import type { MemorixScope } from "../scope.js";
6
+ import type { CommittedWrite } from "./content-write.js";
7
+ export declare function commitWriteEffects(args: {
8
+ platform: MemorixPlatform;
9
+ scope: MemorixScope;
10
+ caller: string;
11
+ event: CommittedWrite;
12
+ }): Promise<unknown>;
13
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/writes/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,cAAc,CAAC;CACvB,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBnB"}
@@ -0,0 +1,28 @@
1
+ import { memorixActivityRing } from "../activity-ring.js";
2
+ import { maybeEnqueueNexumAnalysis } from "../nexum-analysis/enqueue.js";
3
+ export async function commitWriteEffects(args) {
4
+ const indexing = args.event.operation === "removed"
5
+ ? undefined
6
+ : await maybeEnqueueNexumAnalysis({
7
+ platform: args.platform,
8
+ scope: args.scope,
9
+ objectType: args.event.objectType,
10
+ contentType: args.event.contentType,
11
+ recordId: args.event.recordId,
12
+ revision: args.event.revision,
13
+ data: args.event.data,
14
+ });
15
+ memorixActivityRing.recordLand({
16
+ orgId: args.scope.orgId,
17
+ caller: args.caller,
18
+ objectType: args.event.objectType,
19
+ contentType: args.event.contentType,
20
+ recordId: args.event.recordId,
21
+ revision: args.event.revision,
22
+ outcome: args.event.operation,
23
+ indexing,
24
+ hooks: args.event.hooks,
25
+ });
26
+ return indexing;
27
+ }
28
+ //# sourceMappingURL=effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/writes/effects.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAKxC;IACC,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;QAChC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,yBAAyB,CAAC;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YACnC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;SACtB,CAAC,CAAC;IACT,mBAAmB,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;QACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;QACnC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;QAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;QAC7B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;QAC7B,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;KACxB,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * FR-6 — a rejection names the field and says whether the same request can succeed later.
3
+ */
4
+ export type FailureShape = {
5
+ field: string | null;
6
+ retryable: boolean;
7
+ retryAfterMs?: number;
8
+ };
9
+ export declare function classifyFailure(err: unknown, status: number): FailureShape;
10
+ export declare function httpStatusForCode(code: string, fallback?: number): number;
11
+ //# sourceMappingURL=error-shape.d.ts.map