@x12i/memorix-writer 1.0.0 → 1.2.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 (87) hide show
  1. package/README.md +25 -1
  2. package/catalox-seeds/memorix-write-descriptors.manifest.json +1 -2
  3. package/dist/constants.d.ts +1 -1
  4. package/dist/constants.d.ts.map +1 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/data/collection-name.d.ts +1 -0
  8. package/dist/data/collection-name.d.ts.map +1 -1
  9. package/dist/data/collection-name.js +29 -6
  10. package/dist/data/collection-name.js.map +1 -1
  11. package/dist/data/memorix-write-adapter.d.ts +13 -6
  12. package/dist/data/memorix-write-adapter.d.ts.map +1 -1
  13. package/dist/data/memorix-write-adapter.js +22 -6
  14. package/dist/data/memorix-write-adapter.js.map +1 -1
  15. package/dist/descriptors/load-entity-descriptor.d.ts.map +1 -1
  16. package/dist/descriptors/load-entity-descriptor.js +3 -2
  17. package/dist/descriptors/load-entity-descriptor.js.map +1 -1
  18. package/dist/descriptors/write-descriptor-types.d.ts +0 -11
  19. package/dist/descriptors/write-descriptor-types.d.ts.map +1 -1
  20. package/dist/errors/issues.d.ts +1 -1
  21. package/dist/errors/issues.d.ts.map +1 -1
  22. package/dist/errors/issues.js.map +1 -1
  23. package/dist/graph-runs/clear-run.d.ts +9 -0
  24. package/dist/graph-runs/clear-run.d.ts.map +1 -0
  25. package/dist/graph-runs/clear-run.js +22 -0
  26. package/dist/graph-runs/clear-run.js.map +1 -0
  27. package/dist/graph-runs/constants.d.ts +4 -0
  28. package/dist/graph-runs/constants.d.ts.map +1 -0
  29. package/dist/graph-runs/constants.js +6 -0
  30. package/dist/graph-runs/constants.js.map +1 -0
  31. package/dist/graph-runs/context.d.ts +12 -0
  32. package/dist/graph-runs/context.d.ts.map +1 -0
  33. package/dist/graph-runs/context.js +25 -0
  34. package/dist/graph-runs/context.js.map +1 -0
  35. package/dist/graph-runs/ensure-indexes.d.ts +10 -0
  36. package/dist/graph-runs/ensure-indexes.d.ts.map +1 -0
  37. package/dist/graph-runs/ensure-indexes.js +27 -0
  38. package/dist/graph-runs/ensure-indexes.js.map +1 -0
  39. package/dist/graph-runs/logging.d.ts +9 -0
  40. package/dist/graph-runs/logging.d.ts.map +1 -0
  41. package/dist/graph-runs/logging.js +4 -0
  42. package/dist/graph-runs/logging.js.map +1 -0
  43. package/dist/graph-runs/mark-failed.d.ts +14 -0
  44. package/dist/graph-runs/mark-failed.d.ts.map +1 -0
  45. package/dist/graph-runs/mark-failed.js +35 -0
  46. package/dist/graph-runs/mark-failed.js.map +1 -0
  47. package/dist/graph-runs/mark-started.d.ts +15 -0
  48. package/dist/graph-runs/mark-started.d.ts.map +1 -0
  49. package/dist/graph-runs/mark-started.js +35 -0
  50. package/dist/graph-runs/mark-started.js.map +1 -0
  51. package/dist/graph-runs/resolve-record-collection.d.ts +14 -0
  52. package/dist/graph-runs/resolve-record-collection.d.ts.map +1 -0
  53. package/dist/graph-runs/resolve-record-collection.js +25 -0
  54. package/dist/graph-runs/resolve-record-collection.js.map +1 -0
  55. package/dist/graph-runs/write-result.d.ts +17 -0
  56. package/dist/graph-runs/write-result.d.ts.map +1 -0
  57. package/dist/graph-runs/write-result.js +97 -0
  58. package/dist/graph-runs/write-result.js.map +1 -0
  59. package/dist/index.d.ts +18 -3
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +10 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/mongo/collection-documents.d.ts +12 -1
  64. package/dist/mongo/collection-documents.d.ts.map +1 -1
  65. package/dist/mongo/collection-documents.js +14 -2
  66. package/dist/mongo/collection-documents.js.map +1 -1
  67. package/dist/mongo/env.d.ts +9 -1
  68. package/dist/mongo/env.d.ts.map +1 -1
  69. package/dist/mongo/env.js +24 -5
  70. package/dist/mongo/env.js.map +1 -1
  71. package/dist/mongo/index.d.ts +1 -1
  72. package/dist/mongo/index.d.ts.map +1 -1
  73. package/dist/mongo/index.js +1 -1
  74. package/dist/mongo/index.js.map +1 -1
  75. package/dist/mongo/target.d.ts +1 -1
  76. package/dist/mongo/target.d.ts.map +1 -1
  77. package/dist/mongo/target.js +1 -1
  78. package/dist/mongo/target.js.map +1 -1
  79. package/dist/validation/validate-fields.d.ts.map +1 -1
  80. package/dist/validation/validate-fields.js +4 -0
  81. package/dist/validation/validate-fields.js.map +1 -1
  82. package/dist/validation/validate-immutability.d.ts.map +1 -1
  83. package/dist/validation/validate-immutability.js +1 -0
  84. package/dist/validation/validate-immutability.js.map +1 -1
  85. package/docs/GRAPH-RUNS.md +93 -0
  86. package/docs/gap-analysis.md +18 -0
  87. package/package.json +3 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC"}
@@ -1,4 +1,4 @@
1
- export { resolveDefaultSourceDbName, resolveMemorixDbName, resolveMongoUri, targetCollectionEnvKey, } from "./env.js";
1
+ export { resolveDefaultSourceDbName, resolveMemorixDbName, resolveMongoUri, readTargetCollectionFromEnv, targetCollectionEnvKey, } from "./env.js";
2
2
  export { resolveMemorixWriteTarget } from "./target.js";
3
3
  export { DEFAULT_ENTITY_COLLECTION_CANDIDATES, DEFAULT_EVENT_COLLECTION_CANDIDATES, } from "./default-collections.js";
4
4
  export { createMemorixDataTier, } from "./tier.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,yBAAyB,EAAsB,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,GAGtB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,yBAAyB,EAAsB,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,GAGtB,MAAM,WAAW,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { MemorixWriteDescriptor } from "../descriptors/write-descriptor-types.js";
2
- export type MemorixTarget = "entity" | "event";
2
+ export type MemorixTarget = "entity" | "event" | "knowledge";
3
3
  export declare function resolveMemorixWriteTarget(writeDescriptor: MemorixWriteDescriptor): MemorixTarget;
4
4
  //# sourceMappingURL=target.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/mongo/target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,sBAAsB,GACtC,aAAa,CAKf"}
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/mongo/target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7D,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,sBAAsB,GACtC,aAAa,CAKf"}
@@ -1,6 +1,6 @@
1
1
  export function resolveMemorixWriteTarget(writeDescriptor) {
2
2
  const kind = writeDescriptor.target.kind?.trim();
3
- if (kind === "entity" || kind === "event")
3
+ if (kind === "entity" || kind === "event" || kind === "knowledge")
4
4
  return kind;
5
5
  if (writeDescriptor.identity.idField === "eventId")
6
6
  return "event";
@@ -1 +1 @@
1
- {"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/mongo/target.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,yBAAyB,CACvC,eAAuC;IAEvC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/mongo/target.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,yBAAyB,CACvC,eAAuC;IAEvC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-fields.d.ts","sourceRoot":"","sources":["../../src/validation/validate-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,eAAe,EAAE,sBAAsB,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,iBAAiB,EAAE,CA+DtB"}
1
+ {"version":3,"file":"validate-fields.d.ts","sourceRoot":"","sources":["../../src/validation/validate-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,eAAe,EAAE,sBAAsB,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,iBAAiB,EAAE,CAyEtB"}
@@ -17,6 +17,10 @@ export function validateInputFields(args) {
17
17
  }
18
18
  if (rejectUnknown) {
19
19
  for (const key of Object.keys(input)) {
20
+ if (key === "_graphRuns") {
21
+ issues.push(writeIssue("SYSTEM_FIELD_NOT_WRITABLE", `system field "${key}" cannot be written via writeMemorixRecord`, { path: key, severity: "error" }));
22
+ continue;
23
+ }
20
24
  if (!allowedInputPaths.has(key)) {
21
25
  issues.push(writeIssue("UNKNOWN_FIELD", `unknown input field "${key}"`, {
22
26
  path: key,
@@ -1 +1 @@
1
- {"version":3,"file":"validate-fields.js","sourceRoot":"","sources":["../../src/validation/validate-fields.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAE3E,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,EAAE,mBAAmB,IAAI,IAAI,CAAC;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;YAAE,SAAS;QACvC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACnC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,eAAe,EAAE,wBAAwB,GAAG,GAAG,EAAE;oBAC1D,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,OAAO;iBAClB,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,wBAAwB,EAAE,mBAAmB,IAAI,cAAc,EAAE;gBAC1E,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,OAAO;aAClB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACpD,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IACE,eAAe,CAAC,UAAU,EAAE,8BAA8B;QAC1D,gBAAgB,KAAK,CAAC;QACtB,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAC9B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,UAAU,CACR,mBAAmB,EACnB,8CAA8C,EAC9C,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"validate-fields.js","sourceRoot":"","sources":["../../src/validation/validate-fields.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-immutability.d.ts","sourceRoot":"","sources":["../../src/validation/validate-immutability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAY7D,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACpD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,KAAK,MAAM,CAAC;CACjF,GAAG,iBAAiB,EAAE,CA0BtB"}
1
+ {"version":3,"file":"validate-immutability.d.ts","sourceRoot":"","sources":["../../src/validation/validate-immutability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAa7D,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACpD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,KAAK,MAAM,CAAC;CACjF,GAAG,iBAAiB,EAAE,CA0BtB"}
@@ -5,6 +5,7 @@ const PROTECTED_PATHS = new Set([
5
5
  "eventId",
6
6
  "recordId",
7
7
  "createdAt",
8
+ "_graphRuns",
8
9
  "_memorix.writeDescriptorId",
9
10
  ]);
10
11
  export function validateImmutableFieldsOnPatch(args) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-immutability.js","sourceRoot":"","sources":["../../src/validation/validate-immutability.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,UAAU;IACV,SAAS;IACT,UAAU;IACV,WAAW;IACX,4BAA4B;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,8BAA8B,CAAC,IAK9C;IACC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,SAAS;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,wBAAwB,EAAE,UAAU,IAAI,gBAAgB,EAAE;gBACnE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;aACxB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,wBAAwB,EAAE,iBAAiB,IAAI,qBAAqB,EAAE;gBAC/E,IAAI;aACL,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"validate-immutability.js","sourceRoot":"","sources":["../../src/validation/validate-immutability.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,UAAU;IACV,SAAS;IACT,UAAU;IACV,WAAW;IACX,YAAY;IACZ,4BAA4B;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,8BAA8B,CAAC,IAK9C;IACC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,SAAS;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,wBAAwB,EAAE,UAAU,IAAI,gBAAgB,EAAE;gBACnE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;aACxB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,wBAAwB,EAAE,iBAAiB,IAAI,qBAAqB,EAAE;gBAC/E,IAAI;aACL,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,93 @@
1
+ # Graph-run tracking (`_graphRuns`) — MRX-FRS-001
2
+
3
+ Record-level visibility for graph execution over Memorix entity and event records.
4
+
5
+ ## Overview
6
+
7
+ The reserved system field `_graphRuns` is stored **top-level on the Mongo payload document**, outside domain `data`. It is keyed by `graphId` and holds the **latest state only** per `(record, graphId)`.
8
+
9
+ Domain `writeMemorixRecord` operations **must not** accept `_graphRuns` in user input. Only the graph-run writer APIs below may mutate it.
10
+
11
+ Shared types live in `@x12i/memorix-descriptors/types`.
12
+
13
+ ## Writer APIs (`@x12i/memorix-writer`)
14
+
15
+ ```typescript
16
+ import {
17
+ markGraphRunStarted,
18
+ markGraphRunFailed,
19
+ writeGraphRunResult,
20
+ clearGraphRun,
21
+ ensureGraphRunIndexes,
22
+ } from "@x12i/memorix-writer";
23
+ ```
24
+
25
+ ### `markGraphRunStarted(ref, graphId, opts)`
26
+
27
+ Sets `_graphRuns.<graphId>` to `{ status: "in_progress", startedAt, lastJobRunId, attempts, graphVersion? }` using a per-key dot-path `$set`.
28
+
29
+ **Idempotency:** If already `in_progress` with the same `lastJobRunId`, no-op (safe on lease-sweep re-claim). A different `lastJobRunId` overwrites the stamp.
30
+
31
+ ### `markGraphRunFailed(ref, graphId, opts)`
32
+
33
+ Sets terminal `failed` status with `error` and `completedAt`. Call only when `job_runs` has exhausted `maxAttempts`.
34
+
35
+ ### `writeGraphRunResult(ref, graphId, opts)` — combined success path
36
+
37
+ 1. Upserts the graph result document to the persistency target collection (`<entityName>-<contentType>`).
38
+ 2. Stamps the source record `_graphRuns.<graphId>` = `done` + result pointer + `completedAt`.
39
+
40
+ **Atomicity (Mongo transaction):** Result upsert and source stamp run inside a single Mongo transaction via `client.startSession().withTransaction()`. If either step fails, both are rolled back. **Requires a transaction-capable Mongo deployment** (replica set or sharded cluster). Standalone Mongo instances will fail at runtime when calling this API.
41
+
42
+ ### `clearGraphRun(ref, graphId)`
43
+
44
+ `$unset` on `_graphRuns.<graphId>` so the record re-qualifies for `graphRunNotDone` planning queries.
45
+
46
+ ### `ensureGraphRunIndexes(client, ref, graphId)`
47
+
48
+ Opt-in helper creating recommended compound indexes on the source collection:
49
+
50
+ - `{ "_graphRuns.<graphId>.status": 1, <idField>: 1 }`
51
+ - `{ "_graphRuns.<graphId>.completedAt": 1 }`
52
+
53
+ ## Retrieval filters (`@x12i/memorix-retrieval`)
54
+
55
+ ```typescript
56
+ await fetchMemorixListForEntity(client, {
57
+ entityName: "assets",
58
+ contentType: "scoped", // via list descriptor driver content type
59
+ graphRunFilter: { graphRunNotDone: { graphId: "graph-qcrbz6t" } },
60
+ page: { limit: 100, offset: 0 },
61
+ });
62
+ ```
63
+
64
+ Supported facets (via `compileGraphRunFilter` / `graphRunFilter` on list requests):
65
+
66
+ | Facet | Use case |
67
+ |-------|----------|
68
+ | `graphRunStatus` | Filter by `in_progress` / `done` / `failed` |
69
+ | `graphRunNotDone` | Planning — absent or status ≠ `done` |
70
+ | `graphRunCompletedBefore` | Stale results |
71
+ | `graphRunFailed` | Retry candidates |
72
+ | `graphRunStaleVersion` | Graph version invalidation |
73
+
74
+ Read exposure:
75
+
76
+ - **List:** `includeGraphRuns: true` adds `_graphRuns` to row projection (default off).
77
+ - **Item:** `includeGraphRuns` defaults to **true**; response includes top-level `_graphRuns` when present.
78
+
79
+ ## Error codes
80
+
81
+ | Code | When |
82
+ |------|------|
83
+ | `RECORD_NOT_FOUND` | Source record missing |
84
+ | `DESCRIPTOR_MISSING` | Result collection write failed |
85
+ | `GRAPH_RUN_STAMP_FAILED` | Transaction failed (stamp or result write) |
86
+ | `SYSTEM_FIELD_NOT_WRITABLE` | `_graphRuns` passed to `writeMemorixRecord` |
87
+
88
+ Log correlation shape: `{ jobRunId, graphId, recordRef, operation }`.
89
+
90
+ ## References
91
+
92
+ - MRX-FRS-001 change request (Exellix consumer: EXLX-CRS-001)
93
+ - [MEMORIX-DATABASE-CONVENTIONS](https://github.com/x12i/memorix-retrieval/blob/main/docs/MEMORIX-DATABASE-CONVENTIONS.md)
@@ -0,0 +1,18 @@
1
+ # @x12i/memorix-writer — gap analysis
2
+
3
+ ## Status: v1.0 core path complete
4
+
5
+ | Area | Status |
6
+ |------|--------|
7
+ | Descriptor-driven writes (add/upsert/patch/replace) | Done |
8
+ | Content upload + pointers | Done |
9
+ | Wired to `@x12i/memorix-descriptors/catalog` | Done |
10
+ | Knowledge target | Done |
11
+ | Write descriptor CRUD | Owned by `@x12i/memorix-descriptors` |
12
+ | CLI | Not planned (library-only) |
13
+ | Live integration tests | Optional via host env |
14
+
15
+ ## Non-goals
16
+
17
+ - Descriptor admin (use `@x12i/memorix-descriptors`)
18
+ - List/item layout (use `@x12i/memorix-retrieval`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/memorix-writer",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Descriptor-driven write layer for Memorix entity/event records and content objects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,11 +27,8 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@x12i/catalox": "^5.1.1",
30
- "@x12i/env": "^4.0.1",
31
- "@x12i/helpers": "^1.7.0",
32
- "@x12i/memorix-descriptors": "^1.6.0",
33
- "@x12i/memorix-retrieval": "^1.10.0",
34
- "@x12i/xronox": "^3.9.0",
30
+ "@x12i/memorix-descriptors": "^1.8.0",
31
+ "@x12i/memorix-retrieval": "^1.13.0",
35
32
  "mongodb": "^6.21.0"
36
33
  },
37
34
  "devDependencies": {