@x12i/memorix-service 3.13.0 → 3.14.1

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 (55) hide show
  1. package/dist/analytics/host.d.ts +2 -2
  2. package/dist/analytics/host.d.ts.map +1 -1
  3. package/dist/analytics/host.js.map +1 -1
  4. package/dist/analytics/property-index.d.ts.map +1 -1
  5. package/dist/analytics/property-index.js +5 -1
  6. package/dist/analytics/property-index.js.map +1 -1
  7. package/dist/analytics/read-row.d.ts +33 -0
  8. package/dist/analytics/read-row.d.ts.map +1 -0
  9. package/dist/analytics/read-row.js +76 -0
  10. package/dist/analytics/read-row.js.map +1 -0
  11. package/dist/analytics/tracker.d.ts +14 -0
  12. package/dist/analytics/tracker.d.ts.map +1 -1
  13. package/dist/analytics/tracker.js +55 -17
  14. package/dist/analytics/tracker.js.map +1 -1
  15. package/dist/catalog-bridge.d.ts +4 -4
  16. package/dist/catalog-bridge.d.ts.map +1 -1
  17. package/dist/catalog-bridge.js +63 -34
  18. package/dist/catalog-bridge.js.map +1 -1
  19. package/dist/metadata-view.d.ts +30 -0
  20. package/dist/metadata-view.d.ts.map +1 -0
  21. package/dist/metadata-view.js +67 -0
  22. package/dist/metadata-view.js.map +1 -0
  23. package/dist/nexum-analysis/enqueue.d.ts +1 -1
  24. package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
  25. package/dist/nexum-analysis/enqueue.js +2 -1
  26. package/dist/nexum-analysis/enqueue.js.map +1 -1
  27. package/dist/openapi/openapi.json +115 -11
  28. package/dist/platform.d.ts +7 -0
  29. package/dist/platform.d.ts.map +1 -1
  30. package/dist/platform.js +68 -29
  31. package/dist/platform.js.map +1 -1
  32. package/dist/routes/data.d.ts.map +1 -1
  33. package/dist/routes/data.js +123 -12
  34. package/dist/routes/data.js.map +1 -1
  35. package/dist/writes/content-write.d.ts +38 -1
  36. package/dist/writes/content-write.d.ts.map +1 -1
  37. package/dist/writes/content-write.js +67 -7
  38. package/dist/writes/content-write.js.map +1 -1
  39. package/dist/writes/error-shape.d.ts.map +1 -1
  40. package/dist/writes/error-shape.js +8 -1
  41. package/dist/writes/error-shape.js.map +1 -1
  42. package/dist/writes/queued-write.d.ts +38 -0
  43. package/dist/writes/queued-write.d.ts.map +1 -0
  44. package/dist/writes/queued-write.js +288 -0
  45. package/dist/writes/queued-write.js.map +1 -0
  46. package/dist/writes/receipt-store.d.ts +52 -2
  47. package/dist/writes/receipt-store.d.ts.map +1 -1
  48. package/dist/writes/receipt-store.js +191 -2
  49. package/dist/writes/receipt-store.js.map +1 -1
  50. package/dist/writes/worker.d.ts +21 -0
  51. package/dist/writes/worker.d.ts.map +1 -1
  52. package/dist/writes/worker.js +81 -1
  53. package/dist/writes/worker.js.map +1 -1
  54. package/openapi/openapi.json +115 -11
  55. package/package.json +1 -1
@@ -0,0 +1,67 @@
1
+ /** Wrap a store so every change to its contents moves `generation()`. */
2
+ export function trackMetadataGeneration(store) {
3
+ let generation = 0;
4
+ const tracked = {
5
+ ...store,
6
+ generation: () => generation,
7
+ replaceAgentPack(...args) {
8
+ store.replaceAgentPack(...args);
9
+ generation++;
10
+ },
11
+ appendLedger(...args) {
12
+ store.appendLedger(...args);
13
+ generation++;
14
+ },
15
+ commitFrom(...args) {
16
+ store.commitFrom(...args);
17
+ generation++;
18
+ },
19
+ };
20
+ if (typeof store.hydrate === "function") {
21
+ // Hydrate swaps the whole snapshot. Move the count before and after so no
22
+ // reader keeps an answer built from the previous snapshot.
23
+ tracked.hydrate = async () => {
24
+ generation++;
25
+ try {
26
+ await store.hydrate();
27
+ }
28
+ finally {
29
+ generation++;
30
+ }
31
+ };
32
+ }
33
+ return tracked;
34
+ }
35
+ /** Answer metadata reads from a cache that is dropped when the store changes. */
36
+ export function createMetadataView(client, generation) {
37
+ let seen = generation();
38
+ const effective = new Map();
39
+ const abstracts = new Map();
40
+ const definitions = new Map();
41
+ const fresh = () => {
42
+ const now = generation();
43
+ if (now === seen)
44
+ return;
45
+ seen = now;
46
+ effective.clear();
47
+ abstracts.clear();
48
+ definitions.clear();
49
+ };
50
+ const agentsKey = (agentIds) => agentIds.join("\u0000");
51
+ function memo(cache, key, build) {
52
+ fresh();
53
+ if (cache.has(key))
54
+ return cache.get(key);
55
+ const value = build();
56
+ // A build that itself changed the store (it should not) must not be kept.
57
+ if (generation() === seen)
58
+ cache.set(key, value);
59
+ return value;
60
+ }
61
+ return {
62
+ resolveEffective: (agentIds) => memo(effective, agentsKey(agentIds), () => client.resolveEffective(agentIds)),
63
+ resolveAbstracts: (agentIds) => memo(abstracts, agentsKey(agentIds), () => client.resolveAbstracts(agentIds)),
64
+ getDefinition: (agentIds, kind, id) => memo(definitions, `${agentsKey(agentIds)}\u0001${kind}\u0001${id}`, () => client.getDefinition(agentIds, kind, id)),
65
+ };
66
+ }
67
+ //# sourceMappingURL=metadata-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-view.js","sourceRoot":"","sources":["../src/metadata-view.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export type AnalysisEnqueueResult = {
18
18
  */
19
19
  export declare function resolveAnalyzeAgentIds(scopeAgentIds: string[], hasPipeline: (agentIds: string[]) => boolean): string[];
20
20
  export declare function maybeEnqueueNexumAnalysis(input: {
21
- platform: Pick<MemorixPlatform, "metadata" | "operationalDbFor" | "portsFor">;
21
+ platform: Pick<MemorixPlatform, "metadata" | "operationalDbFor" | "portsFor"> & Partial<Pick<MemorixPlatform, "metadataView">>;
22
22
  scope: MemorixScope;
23
23
  objectType: string;
24
24
  contentType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"enqueue.d.ts","sourceRoot":"","sources":["../../src/nexum-analysis/enqueue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAahD,MAAM,MAAM,qBAAqB,GAC7B;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAKN;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,GAC3C,MAAM,EAAE,CASV;AA6BD,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC,CAAC;IAC9E,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0KjC"}
1
+ {"version":3,"file":"enqueue.d.ts","sourceRoot":"","sources":["../../src/nexum-analysis/enqueue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAahD,MAAM,MAAM,qBAAqB,GAC7B;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAKN;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,GAC3C,MAAM,EAAE,CASV;AA6BD,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC,GAC3E,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;IACjD,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2KjC"}
@@ -43,7 +43,8 @@ export async function maybeEnqueueNexumAnalysis(input) {
43
43
  if (!process.env.MEMORIX_NEXUM_URL?.trim() && !process.env.NEXUM_URL?.trim()) {
44
44
  return { status: "skipped", reason: "indexing worker unset" };
45
45
  }
46
- const effective = input.platform.metadata.resolveEffective(input.scope.agentIds);
46
+ // Per-write path: read the catalog from the view so a write does not rebuild it.
47
+ const effective = (input.platform.metadataView ?? input.platform.metadata).resolveEffective(input.scope.agentIds);
47
48
  const extensionBag = {};
48
49
  for (const e of effective.effective ?? []) {
49
50
  if (!e.kind?.includes("."))
@@ -1 +1 @@
1
- {"version":3,"file":"enqueue.js","sourceRoot":"","sources":["../../src/nexum-analysis/enqueue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enqueue.js","sourceRoot":"","sources":["../../src/nexum-analysis/enqueue.ts"],"names":[],"mappings":"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"}
@@ -2769,7 +2769,7 @@
2769
2769
  "/api/data/content/batch": {
2770
2770
  "post": {
2771
2771
  "operationId": "dataWriteContentBatch",
2772
- "summary": "Write up to 500 rows. One receipt or error per row, in order. One bad row does not reject the batch.",
2772
+ "summary": "Write up to 500 rows. One receipt or error per row, in order. One bad row does not reject the batch. With queue: true on the body each row is accepted into the write queue in array order, and a row's result is the 202 body of POST /api/data/content (status queued) or an error.",
2773
2773
  "tags": ["Data"],
2774
2774
  "parameters": [
2775
2775
  { "$ref": "#/components/parameters/XMemorixCaller" },
@@ -2784,6 +2784,10 @@
2784
2784
  "type": "object",
2785
2785
  "required": ["writes"],
2786
2786
  "properties": {
2787
+ "queue": {
2788
+ "type": "boolean",
2789
+ "description": "true accepts every row into the durable write queue. Set on the body, not on a row."
2790
+ },
2787
2791
  "writes": {
2788
2792
  "type": "array",
2789
2793
  "maxItems": 500,
@@ -2818,27 +2822,114 @@
2818
2822
  "/api/data/receipts": {
2819
2823
  "get": {
2820
2824
  "operationId": "dataListWriteReceipts",
2821
- "summary": "List write receipts for x-memorix-caller. Rejected receipts stay for 7 days.",
2825
+ "summary": "List write receipts for x-memorix-caller. Without runId: rejected by default, newest first. With runId: the queued writes of that run in accept order, every status unless status is given. Stored and rejected receipts stay for 7 days.",
2822
2826
  "tags": ["Data"],
2823
2827
  "parameters": [
2824
2828
  { "$ref": "#/components/parameters/XMemorixCaller" },
2825
2829
  { "$ref": "#/components/parameters/XMemorixOrgId" },
2826
2830
  { "$ref": "#/components/parameters/XMemorixAgentIds" },
2831
+ {
2832
+ "name": "runId",
2833
+ "in": "query",
2834
+ "description": "List the queued writes of this run (_metadata.execution.runId).",
2835
+ "schema": { "type": "string" }
2836
+ },
2837
+ {
2838
+ "name": "stepId",
2839
+ "in": "query",
2840
+ "description": "With runId: only this step (_metadata.execution.stepId).",
2841
+ "schema": { "type": "string" }
2842
+ },
2827
2843
  {
2828
2844
  "name": "status",
2829
2845
  "in": "query",
2830
- "schema": { "type": "string", "enum": ["pending", "stored", "rejected", "all"], "default": "rejected" }
2846
+ "description": "Without runId: pending, queued, stored, rejected or all (default rejected). With runId: queued, stored or rejected (default every status).",
2847
+ "schema": { "type": "string", "enum": ["pending", "queued", "stored", "rejected", "all"] }
2848
+ },
2849
+ {
2850
+ "name": "limit",
2851
+ "in": "query",
2852
+ "schema": { "type": "integer", "minimum": 1, "maximum": 200, "default": 50 }
2853
+ },
2854
+ {
2855
+ "name": "cursor",
2856
+ "in": "query",
2857
+ "description": "With runId: pageInfo.nextCursor of the previous page. An invalid cursor is 400.",
2858
+ "schema": { "type": "string" }
2859
+ }
2860
+ ],
2861
+ "responses": {
2862
+ "200": {
2863
+ "description": "Receipts for this caller. With runId the body has pageInfo { nextCursor, limit }; nextCursor is null on the last page.",
2864
+ "content": {
2865
+ "application/json": {
2866
+ "schema": {
2867
+ "type": "object",
2868
+ "required": ["receipts"],
2869
+ "properties": {
2870
+ "scope": { "$ref": "#/components/schemas/MemorixScope" },
2871
+ "receipts": { "type": "array", "items": { "type": "object", "additionalProperties": true } },
2872
+ "pageInfo": {
2873
+ "type": "object",
2874
+ "properties": {
2875
+ "nextCursor": { "type": "string", "nullable": true },
2876
+ "limit": { "type": "integer" }
2877
+ }
2878
+ }
2879
+ }
2880
+ }
2881
+ }
2882
+ }
2883
+ },
2884
+ "400": { "description": "status, cursor or stepId is not valid", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }
2885
+ }
2886
+ }
2887
+ },
2888
+ "/api/data/receipts/summary": {
2889
+ "get": {
2890
+ "operationId": "dataSummarizeWriteReceipts",
2891
+ "summary": "Counts of one run's queued writes for x-memorix-caller. queued: 0 means the run's queue has drained: every accepted row is stored or rejected.",
2892
+ "tags": ["Data"],
2893
+ "parameters": [
2894
+ { "$ref": "#/components/parameters/XMemorixCaller" },
2895
+ { "$ref": "#/components/parameters/XMemorixOrgId" },
2896
+ { "$ref": "#/components/parameters/XMemorixAgentIds" },
2897
+ { "name": "runId", "in": "query", "required": true, "schema": { "type": "string" } },
2898
+ {
2899
+ "name": "stepId",
2900
+ "in": "query",
2901
+ "description": "Narrow the counts to one step.",
2902
+ "schema": { "type": "string" }
2831
2903
  }
2832
2904
  ],
2833
2905
  "responses": {
2834
- "200": { "description": "Receipts for this caller" }
2906
+ "200": {
2907
+ "description": "Counts by status",
2908
+ "content": {
2909
+ "application/json": {
2910
+ "schema": {
2911
+ "type": "object",
2912
+ "required": ["runId", "queued", "stored", "rejected"],
2913
+ "properties": {
2914
+ "scope": { "$ref": "#/components/schemas/MemorixScope" },
2915
+ "runId": { "type": "string" },
2916
+ "stepId": { "type": "string" },
2917
+ "queued": { "type": "integer" },
2918
+ "stored": { "type": "integer" },
2919
+ "rejected": { "type": "integer" }
2920
+ }
2921
+ }
2922
+ }
2923
+ }
2924
+ },
2925
+ "400": { "description": "runId is required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }
2835
2926
  }
2836
2927
  }
2837
2928
  },
2838
2929
  "/api/data/receipts/{receiptId}": {
2839
2930
  "get": {
2840
2931
  "operationId": "dataGetWriteReceipt",
2841
- "summary": "pending, stored (with receipt), or rejected (with error)",
2932
+ "summary": "pending or queued (neither a receipt nor an error), stored (with receipt), or rejected (with error). A queued-write receipt also has storageKey, runId and stepId.",
2842
2933
  "tags": ["Data"],
2843
2934
  "parameters": [
2844
2935
  { "$ref": "#/components/parameters/XMemorixCaller" },
@@ -2855,7 +2946,7 @@
2855
2946
  "/api/data/content": {
2856
2947
  "get": {
2857
2948
  "operationId": "dataGetContent",
2858
- "summary": "Concrete content get/list",
2949
+ "summary": "Concrete content get/list. An exact get (recordId) of a key that has a queued write not yet stored answers 200 with pending: true and receiptId. When no document is stored yet, record is the latest queued submission without a revision, and currentRevision is null. When a document is stored, record and currentRevision are the stored ones. A list returns stored documents only.",
2859
2950
  "tags": [
2860
2951
  "Data"
2861
2952
  ],
@@ -3106,7 +3197,7 @@
3106
3197
  },
3107
3198
  "post": {
3108
3199
  "operationId": "dataWriteContent",
3109
- "summary": "Concrete write. precondition none creates or replaces. Every 2xx includes a receipt.",
3200
+ "summary": "Concrete write. precondition none creates or replaces. A 200 includes a receipt. With queue: true the row is accepted into a durable queue and answers 202 status queued; see docs/async-content-write-FR.md. A queued write takes no writeId, no op other than upsert, and no precondition other than none. The idempotency key is the storage key plus _metadata.execution.runId plus _metadata.execution.stepId. The same tuple with a different body (data, _metadata, _audit, anything) is 409 QUEUE_KEY_REUSED.",
3110
3201
  "tags": [
3111
3202
  "Data"
3112
3203
  ],
@@ -3192,16 +3283,29 @@
3192
3283
  }
3193
3284
  },
3194
3285
  "202": {
3195
- "description": "Accepted. Memorix retries the write. Poll GET /api/data/receipts/{receiptId}.",
3286
+ "description": "Accepted. status pending: a synchronous write failed in a way a retry can fix, and Memorix retries it. status queued: the row was accepted with queue: true and is stored in the write queue, not yet in the content collection. Either way, poll GET /api/data/receipts/{receiptId}.",
3196
3287
  "content": {
3197
3288
  "application/json": {
3198
3289
  "schema": {
3199
3290
  "type": "object",
3200
- "required": ["receiptId", "status", "retryAfterMs"],
3291
+ "required": ["receiptId", "status"],
3201
3292
  "properties": {
3202
3293
  "receiptId": { "type": "string" },
3203
- "status": { "type": "string", "enum": ["pending"] },
3204
- "retryAfterMs": { "type": "integer" }
3294
+ "status": { "type": "string", "enum": ["pending", "queued"] },
3295
+ "retryAfterMs": { "type": "integer", "description": "status pending only." },
3296
+ "storageKey": {
3297
+ "type": "object",
3298
+ "description": "status queued only.",
3299
+ "required": ["objectType", "contentType", "recordId"],
3300
+ "properties": {
3301
+ "objectType": { "type": "string" },
3302
+ "contentType": { "type": "string" },
3303
+ "recordId": { "type": "string" },
3304
+ "discriminator": { "type": "string" }
3305
+ }
3306
+ },
3307
+ "runId": { "type": "string", "description": "status queued only. From _metadata.execution.runId." },
3308
+ "stepId": { "type": "string", "description": "status queued only. From _metadata.execution.stepId." }
3205
3309
  }
3206
3310
  }
3207
3311
  }
@@ -13,6 +13,7 @@ import { type RunLedger, type PipelineRuntime } from "@x12i/memorix-pipeline/v2"
13
13
  import { type OperationalStores } from "@x12i/memorix-pipeline-runtime";
14
14
  import { ServiceError } from "./errors.js";
15
15
  import { type DeliveryArtifactStore, type RawRecordStore, type TargetItemReceiptStore } from "./mgc-landing-stores.js";
16
+ import { type MetadataView } from "./metadata-view.js";
16
17
  import { type ServiceCatalog } from "./catalog-bridge.js";
17
18
  import { type MemorixScope } from "./scope.js";
18
19
  import { type WriteReceiptStore } from "./writes/receipt-store.js";
@@ -61,6 +62,12 @@ export type MemorixPlatform = {
61
62
  mode: RuntimeMode;
62
63
  client: MongoClient | null;
63
64
  metadata: UnifiedMetadataClient;
65
+ /**
66
+ * Same reads as `metadata` (`resolveEffective`, `resolveAbstracts`, `getDefinition`),
67
+ * answered once per metadata change instead of once per call. Results are shared:
68
+ * read them, do not edit them. Use this on per-request paths.
69
+ */
70
+ metadataView: MetadataView;
64
71
  isolation: IsolationSession | null;
65
72
  /**
66
73
  * Magit pack versioning. Active when Magit is enabled (default on) and durable
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAU5B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAeL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGL,KAAK,+BAA+B,EACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAQL,KAAK,SAAS,EACd,KAAK,eAAe,EAGrB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAajC,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAUL,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAaL,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAWtC,OAAO,EACL,gBAAgB,EAGjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,sEAAsE;IACtE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,cAAc,EAAE,qBAAqB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;IAC/B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,mFAAmF;IACnF,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,0DAA0D;IAC1D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,oEAAoE;IACpE,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GACrE,IAAI,CAAC;IACR,yDAAyD;IACzD,mBAAmB,CAAC,KAAK,EAAE,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9F,8DAA8D;IAC9D,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,+DAA+D;IAC/D,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,sDAAsD;IACtD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,yDAAyD;IACzD,cAAc,EAAE,cAAc,CAAC;IAC/B,iEAAiE;IACjE,kBAAkB,EAAE,sBAAsB,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,iDAAiD;IACjD,SAAS,EAAE,eAAe,CAAC;IAC3B,kDAAkD;IAClD,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,yFAAyF;IACzF,QAAQ,EAAE;QACR,QAAQ,EAAE,0BAA0B,CAAC;QACrC,aAAa,EAAE;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,GAAG,IAAI,CAAC;IACT,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;IACpC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;IACjC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACvD;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC;;;OAGG;IACH,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,0DAA0D;IAC1D,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,+BAA+B,CAAC;IACzE,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAC;IACxC;;;OAGG;IACH,uBAAuB,IAAI,IAAI,CAAC;IAChC;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC3D;;;OAGG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACzD;;;OAGG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAAC;IACvD;;;OAGG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,CAAC;IACjE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC3D,iDAAiD;IACjD,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC3D,mCAAmC;IACnC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACvD,gCAAgC;IAChC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACjD,yCAAyC;IACzC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACvD,qDAAqD;IACrD,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC1D,0EAA0E;IAC1E,SAAS,EAAE,eAAe,CAAC;IAC3B,4EAA4E;IAC5E,yBAAyB,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI,CAAC;IACxF;;;OAGG;IACH,mBAAmB,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI,CAAC;IAChE;;;OAGG;IACH,gCAAgC,CAAC,IAAI,CAAC,EAAE;QACtC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;KACpF,GAAG,MAAM,IAAI,CAAC;IACf,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2CAA2C;IAC3C,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACnD,gEAAgE;IAChE,uBAAuB,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI,CAAC;IACpE,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,oFAAoF;IACpF,sBAAsB,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI,CAAC;IACnE,gCAAgC;IAChC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,8EAA8E;IAC9E,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,+BAA+B,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;KACpF,GACA,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,kFAAkF;IAClF,cAAc,IAAI,WAAW,GAAG,IAAI,CAAC;IACrC;;;OAGG;IACH,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAwgD1B"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
package/dist/platform.js CHANGED
@@ -25,6 +25,7 @@ import { resolveKnowxWorkerBaseUrl } from "./pipeline-compile.js";
25
25
  import { createRemoteOrLocalPort, createRunPipelinePort, createRunxPort, } from "./pipeline-ports.js";
26
26
  import { createMongoMetadataStore, } from "./mongo-metadata-store.js";
27
27
  import { mergeGrantedContentTypes } from "./analytics/content-allow.js";
28
+ import { createMetadataView, trackMetadataGeneration, } from "./metadata-view.js";
28
29
  import { catalogFromMetadataClient, HOST_KNOWLEDGE_AGENT_ID, readerCatalogWithHostKnowledge, relationshipMetadataResolver, } from "./catalog-bridge.js";
29
30
  import { normalizeOrgId } from "./scope.js";
30
31
  import { createMemoryHookStore, createMongoHookStore } from "./hooks/store.js";
@@ -34,7 +35,7 @@ import { tickHookStore } from "./hooks/worker.js";
34
35
  import { createMemoryWriteReceiptStore, createMongoWriteReceiptStore, } from "./writes/receipt-store.js";
35
36
  import { runContentWrite } from "./writes/content-write.js";
36
37
  import { commitWriteEffects } from "./writes/effects.js";
37
- import { tickWriteReceipts } from "./writes/worker.js";
38
+ import { drainQueuedWrites, QUEUE_DEFAULT_CONCURRENCY, tickWriteReceipts } from "./writes/worker.js";
38
39
  import { assertSafeSandboxOrgId, recordCreatedDatabase, } from "./isolation.js";
39
40
  import { createMagitPackService, isMetadataMagitEnabled, magitPackageTypeIdConfigured, magitPackageTypeIdForDiagnostics, magitStoreSelectorConfigured, magitTypedStoreConfigured, resolveMagitCatalogTenant, resolveMagitRepoRootParent, resolveMagitStorageTokenEnv, } from "./magit/magit-pack-service.js";
40
41
  import { loadGenericConnectorsConfig, } from "./generic-connectors.js";
@@ -171,23 +172,29 @@ export async function createMemorixPlatform(deps) {
171
172
  ? deps.isolation.isolatedMetadataDb
172
173
  : "memorix_platform_metadata";
173
174
  let metadata;
175
+ let metadataGeneration;
174
176
  if (deps.mode === "prod" || (client && !deps.allowMemoryMetadata)) {
175
177
  if (deps.isolation) {
176
178
  // Touch creates DB; record in ledger
177
179
  recordCreatedDatabase(deps.isolation, durableMetadataDbName);
178
180
  }
179
181
  const metaDb = client.db(durableMetadataDbName);
180
- durableMetadata = createMongoMetadataStore(metaDb);
182
+ const tracked = trackMetadataGeneration(createMongoMetadataStore(metaDb));
183
+ durableMetadata = tracked;
184
+ metadataGeneration = tracked.generation;
181
185
  log?.(`[memorix-service] hydrating metadata (${durableMetadataDbName})…`);
182
186
  await durableMetadata.hydrate();
183
187
  log?.(`[memorix-service] metadata ready`);
184
188
  metadata = createMetadataClient(durableMetadata);
185
189
  }
186
190
  else {
187
- metadata = createMetadataClient(createInMemoryMetadataStore());
191
+ const tracked = trackMetadataGeneration(createInMemoryMetadataStore());
192
+ metadataGeneration = tracked.generation;
193
+ metadata = createMetadataClient(tracked);
188
194
  log?.(`[memorix-service] in-memory metadata store ready`);
189
195
  }
190
- const analyticsViews = createAnalyticsMetadataViews(metadata);
196
+ const metadataView = createMetadataView(metadata, metadataGeneration);
197
+ const analyticsViews = createAnalyticsMetadataViews(metadataView);
191
198
  function invalidateOrgPortsCache() {
192
199
  portsCache.clear();
193
200
  analyticsViews.invalidate();
@@ -289,6 +296,11 @@ export async function createMemorixPlatform(deps) {
289
296
  return stores;
290
297
  }
291
298
  const writeReceiptStores = new Map();
299
+ /** Queued rows applied at the same time. Each apply is an ordinary content write. */
300
+ function queueConcurrency() {
301
+ const raw = Number(process.env.MEMORIX_QUEUE_CONCURRENCY);
302
+ return Number.isFinite(raw) && raw >= 1 ? Math.min(Math.floor(raw), 64) : QUEUE_DEFAULT_CONCURRENCY;
303
+ }
292
304
  function writeReceiptsFor(orgId) {
293
305
  orgId = resolveOrgId(orgId);
294
306
  const existing = writeReceiptStores.get(orgId);
@@ -523,7 +535,7 @@ export async function createMemorixPlatform(deps) {
523
535
  recordCreatedDatabase(deps.isolation, databaseNameFor(scope.orgId, kind));
524
536
  }
525
537
  }
526
- const baseCatalog = catalogFromMetadataClient(metadata, scope.agentIds);
538
+ const baseCatalog = catalogFromMetadataClient(metadataView, scope.agentIds);
527
539
  const writerCatalog = {
528
540
  ...baseCatalog,
529
541
  getObjectType(objectType) {
@@ -532,7 +544,7 @@ export async function createMemorixPlatform(deps) {
532
544
  };
533
545
  const readerCatalog = scope.agentIds.includes(HOST_KNOWLEDGE_AGENT_ID)
534
546
  ? writerCatalog
535
- : readerCatalogWithHostKnowledge(writerCatalog, (objectType) => mergeGrantedContentTypes(scope.orgId, objectType, catalogFromMetadataClient(metadata, [HOST_KNOWLEDGE_AGENT_ID]).getObjectType(objectType)), scope.agentIds);
547
+ : readerCatalogWithHostKnowledge(writerCatalog, (objectType) => mergeGrantedContentTypes(scope.orgId, objectType, catalogFromMetadataClient(metadataView, [HOST_KNOWLEDGE_AGENT_ID]).getObjectType(objectType)), scope.agentIds);
536
548
  const catalog = writerCatalog;
537
549
  const plane = createMongoDataPlane(client);
538
550
  const { writer: contentWriter } = createMongoContentWriter({
@@ -806,6 +818,9 @@ export async function createMemorixPlatform(deps) {
806
818
  let hookTicker = null;
807
819
  let writeReceiptTicker = null;
808
820
  let lastReceiptDiscovery = 0;
821
+ /** One drain of the queued-write backlog at a time in this process. */
822
+ let queuedDrain = null;
823
+ let platformClosing = false;
809
824
  let platformRef;
810
825
  let hookPump = null;
811
826
  let hookPumpAgain = false;
@@ -1148,34 +1163,54 @@ export async function createMemorixPlatform(deps) {
1148
1163
  /* discovery is best-effort */
1149
1164
  }
1150
1165
  }
1166
+ const replay = async (row) => {
1167
+ const scope = row.request.scope;
1168
+ if (deps.isolation && scope.orgId !== deps.isolation.orgId)
1169
+ return;
1170
+ const ports = portsFor(scope);
1171
+ await runContentWrite({
1172
+ scope,
1173
+ caller: row.caller,
1174
+ datasource: {
1175
+ service: row.caller,
1176
+ declared: row.request.datasourceDeclared,
1177
+ declaration: row.request.datasourceDeclaration,
1178
+ },
1179
+ ports,
1180
+ receipts: writeReceiptsFor(row.orgId),
1181
+ onCommitted: (event) => commitWriteEffects({
1182
+ platform: platformRef,
1183
+ scope,
1184
+ caller: row.caller,
1185
+ event,
1186
+ }),
1187
+ }, {}, row);
1188
+ };
1151
1189
  await tickWriteReceipts({
1152
1190
  orgIds: [...orgIds],
1153
1191
  now: new Date().toISOString(),
1154
1192
  storeFor: (orgId) => writeReceiptsFor(orgId),
1155
- replay: async (row) => {
1156
- const scope = row.request.scope;
1157
- if (deps.isolation && scope.orgId !== deps.isolation.orgId)
1158
- return;
1159
- const ports = portsFor(scope);
1160
- await runContentWrite({
1161
- scope,
1162
- caller: row.caller,
1163
- datasource: {
1164
- service: row.caller,
1165
- declared: row.request.datasourceDeclared,
1166
- declaration: row.request.datasourceDeclaration,
1167
- },
1168
- ports,
1169
- receipts: writeReceiptsFor(row.orgId),
1170
- onCommitted: (event) => commitWriteEffects({
1171
- platform: platformRef,
1172
- scope,
1173
- caller: row.caller,
1174
- event,
1175
- }),
1176
- }, {}, row);
1177
- },
1193
+ replay,
1178
1194
  });
1195
+ // Queued writes drain on their own, so a long backlog does not hold up the retry above.
1196
+ if (!queuedDrain && !platformClosing) {
1197
+ const drain = drainQueuedWrites({
1198
+ orgIds: [...orgIds],
1199
+ now: () => new Date().toISOString(),
1200
+ storeFor: (orgId) => writeReceiptsFor(orgId),
1201
+ replay,
1202
+ concurrency: queueConcurrency(),
1203
+ shouldStop: () => platformClosing,
1204
+ })
1205
+ .then(() => undefined)
1206
+ .finally(() => {
1207
+ if (queuedDrain === drain)
1208
+ queuedDrain = null;
1209
+ });
1210
+ queuedDrain = drain;
1211
+ }
1212
+ if (queuedDrain)
1213
+ await queuedDrain;
1179
1214
  }
1180
1215
  function startWriteReceiptTicker(opts) {
1181
1216
  if (writeReceiptTicker) {
@@ -1238,6 +1273,7 @@ export async function createMemorixPlatform(deps) {
1238
1273
  mode: deps.mode,
1239
1274
  client,
1240
1275
  metadata,
1276
+ metadataView,
1241
1277
  isolation: deps.isolation ?? null,
1242
1278
  magit,
1243
1279
  rehydrateMetadata,
@@ -1320,6 +1356,9 @@ export async function createMemorixPlatform(deps) {
1320
1356
  clearInterval(writeReceiptTicker);
1321
1357
  writeReceiptTicker = null;
1322
1358
  }
1359
+ platformClosing = true;
1360
+ if (queuedDrain)
1361
+ await queuedDrain.catch(() => undefined);
1323
1362
  if (hookPump)
1324
1363
  await hookPump.catch(() => undefined);
1325
1364
  if (analytics)