@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,111 @@
1
+ import { resolveScope } from "../request-scope.js";
2
+ import { requireDeploymentAccess } from "../access-gate.js";
3
+ import { requireCaller } from "../caller-identity.js";
4
+ import { ServiceError } from "../errors.js";
5
+ import { parsePatchRequest } from "../patches/parse.js";
6
+ import { assertPatchOwnership } from "../patches/access.js";
7
+ import { patchEngineDeps } from "../patches/service.js";
8
+ import { applyPatch, getPatchStatus, listPatchRecords, listPatches, loadPatchForAccess, planPatch, removePatchGuards, revertPatch, } from "../patches/engine.js";
9
+ function patchIdOf(req) {
10
+ const patchId = req.params.patchId?.trim() ?? "";
11
+ if (!patchId)
12
+ throw new ServiceError("PATCH_INVALID", "patchId required", 400, { field: "patchId" });
13
+ return patchId;
14
+ }
15
+ function limitOf(raw) {
16
+ if (raw === undefined || raw === "")
17
+ return undefined;
18
+ const n = Number(raw);
19
+ if (!Number.isInteger(n) || n < 1) {
20
+ throw new ServiceError("VALIDATION", "limit must be a positive integer", 400, { field: "limit" });
21
+ }
22
+ return n;
23
+ }
24
+ export async function registerPatchRoutes(app, platform) {
25
+ const context = async (req, access) => {
26
+ requireDeploymentAccess(req, access);
27
+ const scope = resolveScope(req);
28
+ const caller = requireCaller(req);
29
+ const deps = patchEngineDeps(platform, scope, caller);
30
+ const owns = (objectType, contentTypes) => assertPatchOwnership({
31
+ metadata: platform.metadata,
32
+ agentIds: deps.scope.agentIds,
33
+ caller,
34
+ objectType,
35
+ contentTypes,
36
+ });
37
+ return { scope, caller, deps, owns };
38
+ };
39
+ /** The stored patch must belong to content the caller's agents write. */
40
+ const ownedPatch = async (deps, owns, patchId) => {
41
+ const doc = await loadPatchForAccess(deps, patchId);
42
+ owns(doc.objectType, doc.contentTypes);
43
+ return doc;
44
+ };
45
+ app.post("/api/data/patches", async (req) => {
46
+ const { deps, owns } = await context(req, "write");
47
+ const request = parsePatchRequest(req.body);
48
+ owns(request.select.objectType, request.select.contentTypes);
49
+ return planPatch(deps, request);
50
+ });
51
+ app.get("/api/data/patches", async (req) => {
52
+ const { deps, owns } = await context(req, "read");
53
+ const q = (req.query ?? {});
54
+ const listed = (await listPatches(deps, {
55
+ ...(q.objectType ? { objectType: q.objectType } : {}),
56
+ ...(q.state ? { state: q.state } : {}),
57
+ limit: limitOf(q.limit),
58
+ }));
59
+ return {
60
+ items: listed.items.filter((item) => {
61
+ try {
62
+ owns(item.objectType, item.contentTypes);
63
+ return true;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }),
69
+ };
70
+ });
71
+ app.get("/api/data/patches/:patchId", async (req) => {
72
+ const { deps, owns } = await context(req, "read");
73
+ const patchId = patchIdOf(req);
74
+ await ownedPatch(deps, owns, patchId);
75
+ return getPatchStatus(deps, patchId);
76
+ });
77
+ app.get("/api/data/patches/:patchId/records", async (req) => {
78
+ const { deps, owns } = await context(req, "read");
79
+ const patchId = patchIdOf(req);
80
+ await ownedPatch(deps, owns, patchId);
81
+ const q = (req.query ?? {});
82
+ return listPatchRecords(deps, patchId, {
83
+ ...(q.outcome ? { outcome: q.outcome } : {}),
84
+ ...(q.cursor ? { cursor: q.cursor } : {}),
85
+ limit: limitOf(q.limit),
86
+ });
87
+ });
88
+ app.post("/api/data/patches/:patchId/apply", async (req, reply) => {
89
+ const { scope, deps, owns } = await context(req, "write");
90
+ const patchId = patchIdOf(req);
91
+ await ownedPatch(deps, owns, patchId);
92
+ await platform.analytics?.prepare(scope.orgId);
93
+ const out = await applyPatch(deps, patchId, req.body);
94
+ return reply.code(out.httpStatus).send(out.body);
95
+ });
96
+ app.post("/api/data/patches/:patchId/revert", async (req, reply) => {
97
+ const { scope, deps, owns } = await context(req, "write");
98
+ const patchId = patchIdOf(req);
99
+ await ownedPatch(deps, owns, patchId);
100
+ await platform.analytics?.prepare(scope.orgId);
101
+ const out = await revertPatch(deps, patchId, req.body);
102
+ return reply.code(out.httpStatus).send(out.body);
103
+ });
104
+ app.delete("/api/data/patches/:patchId/guards", async (req) => {
105
+ const { deps, owns } = await context(req, "write");
106
+ const patchId = patchIdOf(req);
107
+ await ownedPatch(deps, owns, patchId);
108
+ return removePatchGuards(deps, patchId);
109
+ });
110
+ }
111
+ //# sourceMappingURL=patches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patches.js","sourceRoot":"","sources":["../../src/routes/patches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { MemorixPlatform } from "../platform.js";
3
+ export declare function registerSubjectRootsBackfillRoutes(app: FastifyInstance, platform: MemorixPlatform): Promise<void>;
4
+ //# sourceMappingURL=subject-roots-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject-roots-backfill.d.ts","sourceRoot":"","sources":["../../src/routes/subject-roots-backfill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQtD,wBAAsB,kCAAkC,CACtD,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,15 @@
1
+ import { requireDeploymentAccess } from "../access-gate.js";
2
+ import { ServiceError } from "../errors.js";
3
+ import { parseSubjectRootsBackfillRequest, runSubjectRootsBackfill, } from "../subject-roots-backfill.js";
4
+ export async function registerSubjectRootsBackfillRoutes(app, platform) {
5
+ app.post("/api/admin/content/relocate-roots", async (req) => {
6
+ requireDeploymentAccess(req, "write");
7
+ const request = parseSubjectRootsBackfillRequest(req.body);
8
+ const client = platform.getMongoClient();
9
+ if (!client) {
10
+ throw new ServiceError("BACKFILL_UNAVAILABLE", "scope and context backfill requires a connected Mongo deployment", 503);
11
+ }
12
+ return runSubjectRootsBackfill(client, request, new Date().toISOString());
13
+ });
14
+ }
15
+ //# sourceMappingURL=subject-roots-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject-roots-backfill.js","sourceRoot":"","sources":["../../src/routes/subject-roots-backfill.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,GAAoB,EACpB,QAAyB;IAEzB,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1D,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,gCAAgC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,YAAY,CACpB,sBAAsB,EACtB,kEAAkE,EAClE,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CA2Hf"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAuHf"}
@@ -2,7 +2,7 @@ import { resolveScope } from "../request-scope.js";
2
2
  import { ServiceError } from "../errors.js";
3
3
  import { resolveWorkflowObjectType } from "../land-v2-guards.js";
4
4
  export async function registerWorkflowRoutes(app, platform) {
5
- app.get("/api/workflow", async (req, reply) => {
5
+ app.get("/api/workflow", async (req) => {
6
6
  const scope = resolveScope(req);
7
7
  const q = req.query;
8
8
  if (!q.id) {
@@ -14,9 +14,7 @@ export async function registerWorkflowRoutes(app, platform) {
14
14
  currentRevision: null,
15
15
  };
16
16
  }
17
- const { objectType, deprecated } = resolveWorkflowObjectType(q.objectType);
18
- if (deprecated)
19
- reply.header("Deprecation", deprecated);
17
+ const objectType = resolveWorkflowObjectType(q.objectType);
20
18
  const ports = platform.portsFor(scope);
21
19
  const record = await ports.reader.getContent(scope, {
22
20
  objectType,
@@ -30,18 +28,15 @@ export async function registerWorkflowRoutes(app, platform) {
30
28
  contentType: "workflow",
31
29
  record,
32
30
  currentRevision: record.revision,
33
- ...(deprecated ? { deprecation: deprecated } : {}),
34
31
  };
35
32
  });
36
- app.put("/api/workflow", async (req, reply) => {
33
+ app.put("/api/workflow", async (req) => {
37
34
  const scope = resolveScope(req);
38
35
  const body = req.body;
39
36
  if (!body?.id || !body.record) {
40
37
  throw new ServiceError("VALIDATION", "id and record required", 400);
41
38
  }
42
- const { objectType, deprecated } = resolveWorkflowObjectType(body.objectType);
43
- if (deprecated)
44
- reply.header("Deprecation", deprecated);
39
+ const objectType = resolveWorkflowObjectType(body.objectType);
45
40
  if (body.currentRevision !== undefined &&
46
41
  body.expectedRevision !== undefined &&
47
42
  body.currentRevision !== body.expectedRevision) {
@@ -98,7 +93,6 @@ export async function registerWorkflowRoutes(app, platform) {
98
93
  status: "accepted",
99
94
  conflict: false,
100
95
  result,
101
- ...(deprecated ? { deprecation: deprecated } : {}),
102
96
  };
103
97
  }
104
98
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SafeFilter } from "./safe-query.js";
2
+ /**
3
+ * The value that picks one instance of a discriminated content type.
4
+ * `filter` may only carry an `eq` on the discriminator path; any other filter
5
+ * with `recordId` is READ_QUERY_INVALID instead of being dropped.
6
+ */
7
+ export declare function singleReadDiscriminatorValue(args: {
8
+ discriminatorValue?: string;
9
+ filters?: SafeFilter[];
10
+ discriminatorPath?: string;
11
+ }): string | undefined;
12
+ /**
13
+ * READ_DISCRIMINATOR_REQUIRED names the query parameter that supplies the value
14
+ * and, when the pack declares them, the values it accepts.
15
+ */
16
+ export declare function withDiscriminatorHelp(err: unknown, allowedValues: () => string[] | undefined): unknown;
17
+ //# sourceMappingURL=single-read-discriminator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-read-discriminator.d.ts","sourceRoot":"","sources":["../src/single-read-discriminator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,GAAG,SAAS,CA8CrB;AAQD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,MAAM,MAAM,EAAE,GAAG,SAAS,GACxC,OAAO,CAiBT"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Discriminator selection for single-record reads (`recordId` set) on
3
+ * GET /api/data/content and GET /api/data/content/context.
4
+ */
5
+ import { ServiceError } from "./errors.js";
6
+ /**
7
+ * The value that picks one instance of a discriminated content type.
8
+ * `filter` may only carry an `eq` on the discriminator path; any other filter
9
+ * with `recordId` is READ_QUERY_INVALID instead of being dropped.
10
+ */
11
+ export function singleReadDiscriminatorValue(args) {
12
+ const explicit = args.discriminatorValue?.trim() || undefined;
13
+ if (!args.filters?.length)
14
+ return explicit;
15
+ const path = args.discriminatorPath;
16
+ const fromFilter = new Set();
17
+ const unused = [];
18
+ for (const f of args.filters) {
19
+ if (path && f.field === path && f.op === "eq" && typeof f.value === "string" && f.value.trim()) {
20
+ fromFilter.add(f.value.trim());
21
+ }
22
+ else {
23
+ unused.push(f);
24
+ }
25
+ }
26
+ if (unused.length) {
27
+ throw new ServiceError("READ_QUERY_INVALID", path
28
+ ? `filter is not allowed with recordId. Only an eq filter on the discriminator ${path} is read; pass discriminatorValue to pick the instance.`
29
+ : "filter is not allowed with recordId. This content type has no discriminator; drop filter or omit recordId to list.", 400, {
30
+ field: "filter",
31
+ parameter: "filter",
32
+ unused,
33
+ ...(path ? { discriminatorPath: path } : {}),
34
+ });
35
+ }
36
+ if (fromFilter.size > 1) {
37
+ throw new ServiceError("READ_QUERY_INVALID", `filter names more than one value for ${path}; a single-record read picks one instance.`, 400, { field: "filter", parameter: "filter", discriminatorPath: path, values: [...fromFilter] });
38
+ }
39
+ const [filtered] = [...fromFilter];
40
+ if (explicit && filtered && explicit !== filtered) {
41
+ throw new ServiceError("READ_QUERY_INVALID", `discriminatorValue '${explicit}' and the filter on ${path} ('${filtered}') disagree.`, 400, { field: "discriminatorValue", parameter: "discriminatorValue", discriminatorPath: path });
42
+ }
43
+ return explicit ?? filtered;
44
+ }
45
+ function errorCode(err) {
46
+ return err && typeof err === "object" && typeof err.code === "string"
47
+ ? err.code
48
+ : "";
49
+ }
50
+ /**
51
+ * READ_DISCRIMINATOR_REQUIRED names the query parameter that supplies the value
52
+ * and, when the pack declares them, the values it accepts.
53
+ */
54
+ export function withDiscriminatorHelp(err, allowedValues) {
55
+ if (errorCode(err) !== "READ_DISCRIMINATOR_REQUIRED")
56
+ return err;
57
+ const raw = err.details;
58
+ const details = raw && typeof raw === "object" && !Array.isArray(raw) ? { ...raw } : {};
59
+ const declared = Array.isArray(details.allowedValues) ? undefined : allowedValues();
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ return new ServiceError("READ_DISCRIMINATOR_REQUIRED", `${message}. Pass discriminatorValue in the query string to pick the instance.`, 400, {
62
+ ...details,
63
+ parameter: "discriminatorValue",
64
+ ...(declared ? { allowedValues: declared } : {}),
65
+ });
66
+ }
67
+ //# sourceMappingURL=single-read-discriminator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-read-discriminator.js","sourceRoot":"","sources":["../src/single-read-discriminator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAI5C;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC9D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/F,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,IAAI;YACF,CAAC,CAAC,+EAA+E,IAAI,yDAAyD;YAC9I,CAAC,CAAC,oHAAoH,EACxH,GAAG,EACH;YACE,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,QAAQ;YACnB,MAAM;YACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CACF,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,wCAAwC,IAAI,4CAA4C,EACxF,GAAG,EACH,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAC3F,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;IACnC,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,uBAAuB,QAAQ,uBAAuB,IAAI,MAAM,QAAQ,cAAc,EACtF,GAAG,EACH,EAAE,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ;QAC3F,CAAC,CAAE,GAAwB,CAAC,IAAI;QAChC,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAY,EACZ,aAAyC;IAEzC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,6BAA6B;QAAE,OAAO,GAAG,CAAC;IACjE,MAAM,GAAG,GAAI,GAA6B,CAAC,OAAO,CAAC;IACnD,MAAM,OAAO,GACX,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAI,GAA+B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpF,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,YAAY,CACrB,6BAA6B,EAC7B,GAAG,OAAO,qEAAqE,EAC/E,GAAG,EACH;QACE,GAAG,OAAO;QACV,SAAS,EAAE,oBAAoB;QAC/B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Move estate scope onto `_metadata`, context payloads onto `context`,
3
+ * and noise out of subject `data`.
4
+ * Does not patch security-map rows. Does not change revision or `_system.modifiedAt`.
5
+ */
6
+ import type { MongoClient } from "mongodb";
7
+ export type SubjectRootsBackfillRequest = {
8
+ confirm: true;
9
+ dryRun: boolean;
10
+ includeHistory: false;
11
+ };
12
+ export type SubjectRootsBackfillResult = {
13
+ dryRun: boolean;
14
+ scanned: number;
15
+ wouldPatch: number;
16
+ unchanged: number;
17
+ skippedSecurityMap: number;
18
+ skippedInvalid: number;
19
+ };
20
+ export declare function parseSubjectRootsBackfillRequest(body: unknown): SubjectRootsBackfillRequest;
21
+ export declare function runSubjectRootsBackfill(client: MongoClient, request: SubjectRootsBackfillRequest, now: string, options?: {
22
+ onlyOrgIds?: string[];
23
+ }): Promise<SubjectRootsBackfillResult>;
24
+ //# sourceMappingURL=subject-roots-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject-roots-backfill.d.ts","sourceRoot":"","sources":["../src/subject-roots-backfill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAc3C,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAwBF,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,GAAG,2BAA2B,CAgB3F;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,2BAA2B,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAuErC"}
@@ -0,0 +1,133 @@
1
+ import { jsonMarkdown, relocateStoredSubject } from "@x12i/memorix-data";
2
+ import { ServiceError } from "./errors.js";
3
+ import { resolveObjectAndContentType } from "./data-changes.js";
4
+ import { normalizeOrgId } from "./scope.js";
5
+ const CATEGORY_SUFFIXES = ["entity", "event", "knowledge"];
6
+ const RESERVED_COLLECTIONS = new Set([
7
+ "relationships",
8
+ "record-directory",
9
+ "system.profile",
10
+ ]);
11
+ function isContentCollectionName(name) {
12
+ if (!name || RESERVED_COLLECTIONS.has(name))
13
+ return false;
14
+ if (name.startsWith("system."))
15
+ return false;
16
+ if (name.includes("_"))
17
+ return false;
18
+ if (!name.includes("-"))
19
+ return false;
20
+ return /^[a-z][a-z0-9-]*$/.test(name);
21
+ }
22
+ function orgFromDatabase(name) {
23
+ for (const kind of CATEGORY_SUFFIXES) {
24
+ const suffix = `-memorix-${kind}`;
25
+ if (!name.endsWith(suffix))
26
+ continue;
27
+ const orgId = name.slice(0, -suffix.length);
28
+ return orgId || null;
29
+ }
30
+ return null;
31
+ }
32
+ function isPlainObject(value) {
33
+ return value !== null && typeof value === "object" && !Array.isArray(value);
34
+ }
35
+ export function parseSubjectRootsBackfillRequest(body) {
36
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
37
+ throw new ServiceError("VALIDATION", "backfill body must be an object", 400);
38
+ }
39
+ const raw = body;
40
+ if (raw.confirm !== true) {
41
+ throw new ServiceError("VALIDATION", "confirm: true is required", 400);
42
+ }
43
+ if (raw.includeHistory === true) {
44
+ throw new ServiceError("VALIDATION", "includeHistory must be false; only the current head is patched", 400);
45
+ }
46
+ return { confirm: true, dryRun: raw.dryRun !== false, includeHistory: false };
47
+ }
48
+ export async function runSubjectRootsBackfill(client, request, now, options) {
49
+ const result = {
50
+ dryRun: request.dryRun,
51
+ scanned: 0,
52
+ wouldPatch: 0,
53
+ unchanged: 0,
54
+ skippedSecurityMap: 0,
55
+ skippedInvalid: 0,
56
+ };
57
+ const listed = await client.db().admin().listDatabases();
58
+ for (const entry of listed.databases ?? []) {
59
+ const databaseName = String(entry.name ?? "");
60
+ const orgId = orgFromDatabase(databaseName);
61
+ if (!orgId)
62
+ continue;
63
+ if (options?.onlyOrgIds &&
64
+ !options.onlyOrgIds.some((id) => normalizeOrgId(id) === normalizeOrgId(orgId))) {
65
+ continue;
66
+ }
67
+ const objectTypes = await objectTypesFor(client, orgId);
68
+ const collections = await client.db(databaseName).listCollections().toArray();
69
+ for (const collection of collections) {
70
+ const collectionName = String(collection.name ?? "");
71
+ if (!isContentCollectionName(collectionName))
72
+ continue;
73
+ const fromName = resolveObjectAndContentType(collectionName, objectTypes);
74
+ const coll = client.db(databaseName).collection(collectionName);
75
+ const cursor = coll.find({});
76
+ for await (const doc of cursor) {
77
+ result.scanned += 1;
78
+ const record = doc;
79
+ if (!isPlainObject(record.data)) {
80
+ result.skippedInvalid += 1;
81
+ continue;
82
+ }
83
+ const objectType = typeof record.objectType === "string" ? record.objectType : fromName.objectType;
84
+ const contentType = typeof record.contentType === "string" ? record.contentType : fromName.contentType;
85
+ const relocated = relocateStoredSubject({
86
+ objectType,
87
+ contentType,
88
+ data: record.data,
89
+ metadata: isPlainObject(record._metadata) ? record._metadata : undefined,
90
+ context: isPlainObject(record.context) ? record.context : undefined,
91
+ });
92
+ if (relocated.skipped === "security-map") {
93
+ result.skippedSecurityMap += 1;
94
+ continue;
95
+ }
96
+ if (!relocated.changed) {
97
+ result.unchanged += 1;
98
+ continue;
99
+ }
100
+ result.wouldPatch += 1;
101
+ if (request.dryRun)
102
+ continue;
103
+ const $set = { data: relocated.data };
104
+ if (relocated.metadata)
105
+ $set._metadata = relocated.metadata;
106
+ if (relocated.context)
107
+ $set.context = relocated.context;
108
+ if (relocated.dataChanged) {
109
+ const markdown = record._markdown;
110
+ const source = isPlainObject(markdown) ? markdown.source : undefined;
111
+ if (source === undefined || source === "json") {
112
+ $set._markdown = jsonMarkdown(relocated.data, now);
113
+ }
114
+ }
115
+ await coll.updateOne({ _id: String(record._id) }, { $set });
116
+ }
117
+ }
118
+ }
119
+ return result;
120
+ }
121
+ async function objectTypesFor(client, orgId) {
122
+ try {
123
+ const types = await client
124
+ .db(`${orgId}-memorix-operational`)
125
+ .collection("record-directory")
126
+ .distinct("objectType");
127
+ return types.map((type) => String(type)).filter((type) => type.length > 0);
128
+ }
129
+ catch {
130
+ return [];
131
+ }
132
+ }
133
+ //# sourceMappingURL=subject-roots-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject-roots-backfill.js","sourceRoot":"","sources":["../src/subject-roots-backfill.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,15 @@
1
- export type WireWritePrecondition = "absent" | "exact-revision" | {
1
+ export type WireWritePrecondition = "absent" | "exact-revision" | "none" | {
2
2
  kind: "absent";
3
+ } | {
4
+ kind: "none";
3
5
  } | {
4
6
  kind: "revision";
5
7
  revision: number;
6
8
  };
7
9
  export type NormalizedWritePrecondition = {
8
10
  form: "absent";
11
+ } | {
12
+ form: "none";
9
13
  } | {
10
14
  form: "exact-revision";
11
15
  expectedRevision: number;
@@ -1 +1 @@
1
- {"version":3,"file":"write-precondition.d.ts","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,gBAAgB,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,gBAAgB,CAAC,EAAE,OAAO,GACzB,2BAA2B,CA6C7B"}
1
+ {"version":3,"file":"write-precondition.d.ts","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,gBAAgB,GAChB,MAAM,GACN;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,gBAAgB,CAAC,EAAE,OAAO,GACzB,2BAA2B,CAmD7B"}
@@ -1,15 +1,20 @@
1
1
  /**
2
2
  * Normalize POST /api/data/content write preconditions.
3
3
  *
4
- * Canonical wire form is string `"absent" | "exact-revision"` (+ `expectedRevision`).
5
- * Also accept the writer-native object form `{ kind: "absent" }` /
4
+ * Canonical wire form is string `"absent" | "exact-revision" | "none"` (+ `expectedRevision`
5
+ * when the precondition is exact-revision).
6
+ * Also accept the writer-native object form `{ kind: "absent" | "none" }` /
6
7
  * `{ kind: "revision", revision }` so clients do not silently fall through to create.
8
+ * `none` creates a missing row and replaces an existing row.
7
9
  */
8
10
  import { ServiceError } from "./errors.js";
9
11
  export function normalizeWritePrecondition(raw, expectedRevision) {
10
12
  if (raw === "absent") {
11
13
  return { form: "absent" };
12
14
  }
15
+ if (raw === "none") {
16
+ return { form: "none" };
17
+ }
13
18
  if (raw === "exact-revision") {
14
19
  if (expectedRevision === undefined || expectedRevision === null || expectedRevision === "") {
15
20
  throw new ServiceError("VALIDATION", "expectedRevision required when precondition is exact-revision", 400);
@@ -25,6 +30,9 @@ export function normalizeWritePrecondition(raw, expectedRevision) {
25
30
  if (kind === "absent") {
26
31
  return { form: "absent" };
27
32
  }
33
+ if (kind === "none") {
34
+ return { form: "none" };
35
+ }
28
36
  if (kind === "revision") {
29
37
  const fromBody = raw.revision;
30
38
  const revision = Number(fromBody !== undefined && fromBody !== null && fromBody !== ""
@@ -36,6 +44,6 @@ export function normalizeWritePrecondition(raw, expectedRevision) {
36
44
  return { form: "exact-revision", expectedRevision: revision };
37
45
  }
38
46
  }
39
- throw new ServiceError("VALIDATION", 'precondition required: "absent" | "exact-revision" | { kind: "absent" } | { kind: "revision", revision }', 400);
47
+ throw new ServiceError("VALIDATION", 'precondition required: "absent" | "exact-revision" | "none" | { kind: "absent" } | { kind: "none" } | { kind: "revision", revision }', 400);
40
48
  }
41
49
  //# sourceMappingURL=write-precondition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-precondition.js","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,MAAM,UAAU,0BAA0B,CACxC,GAAY,EACZ,gBAA0B;IAE1B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC7B,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,+DAA+D,EAC/D,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAC;QAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAI,GAA8B,CAAC,QAAQ,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CACrB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAC5D,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,4EAA4E,EAC5E,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,0GAA0G,EAC1G,GAAG,CACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"write-precondition.js","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,UAAU,0BAA0B,CACxC,GAAY,EACZ,gBAA0B;IAE1B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC7B,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,+DAA+D,EAC/D,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAC;QAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAI,GAA8B,CAAC,QAAQ,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CACrB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAC5D,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,4EAA4E,EAC5E,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,sIAAsI,EACtI,GAAG,CACJ,CAAC;AACJ,CAAC"}