@x12i/memorix-descriptors 1.4.0 → 1.4.2

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 (93) hide show
  1. package/README.md +183 -24
  2. package/dist/admin/control-plane.d.ts +12 -3
  3. package/dist/admin/control-plane.d.ts.map +1 -1
  4. package/dist/admin/control-plane.js +25 -8
  5. package/dist/admin/control-plane.js.map +1 -1
  6. package/dist/admin/create-admin.d.ts +1 -1
  7. package/dist/admin/create-admin.d.ts.map +1 -1
  8. package/dist/admin/create-admin.js +2 -7
  9. package/dist/admin/create-admin.js.map +1 -1
  10. package/dist/collections/collection-name.d.ts +16 -0
  11. package/dist/collections/collection-name.d.ts.map +1 -0
  12. package/dist/collections/collection-name.js +28 -0
  13. package/dist/collections/collection-name.js.map +1 -0
  14. package/dist/collections/create-xronox-from-env.d.ts +6 -0
  15. package/dist/collections/create-xronox-from-env.d.ts.map +1 -0
  16. package/dist/collections/create-xronox-from-env.js +23 -0
  17. package/dist/collections/create-xronox-from-env.js.map +1 -0
  18. package/dist/collections/env-bridge.d.ts +1 -2
  19. package/dist/collections/env-bridge.d.ts.map +1 -1
  20. package/dist/collections/env-bridge.js +1 -7
  21. package/dist/collections/env-bridge.js.map +1 -1
  22. package/dist/collections/mongo-create.js +1 -1
  23. package/dist/collections/mongo-create.js.map +1 -1
  24. package/dist/collections/mongo-env.d.ts +8 -0
  25. package/dist/collections/mongo-env.d.ts.map +1 -0
  26. package/dist/collections/mongo-env.js +79 -0
  27. package/dist/collections/mongo-env.js.map +1 -0
  28. package/dist/collections/resolve.d.ts +3 -2
  29. package/dist/collections/resolve.d.ts.map +1 -1
  30. package/dist/collections/resolve.js +2 -2
  31. package/dist/collections/resolve.js.map +1 -1
  32. package/dist/collections/xronox-like.d.ts +38 -0
  33. package/dist/collections/xronox-like.d.ts.map +1 -0
  34. package/dist/collections/xronox-like.js +2 -0
  35. package/dist/collections/xronox-like.js.map +1 -0
  36. package/dist/index.d.ts +4 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +3 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/mutations/entity.d.ts +1 -1
  41. package/dist/mutations/entity.d.ts.map +1 -1
  42. package/dist/reconcile/index.d.ts +3 -3
  43. package/dist/reconcile/index.d.ts.map +1 -1
  44. package/dist/reconcile/index.js +8 -7
  45. package/dist/reconcile/index.js.map +1 -1
  46. package/dist/reconcile/inventory-types.d.ts +81 -0
  47. package/dist/reconcile/inventory-types.d.ts.map +1 -0
  48. package/dist/reconcile/inventory-types.js +6 -0
  49. package/dist/reconcile/inventory-types.js.map +1 -0
  50. package/dist/reconcile/suggestions.d.ts +1 -1
  51. package/dist/reconcile/suggestions.d.ts.map +1 -1
  52. package/dist/reconcile/types.d.ts +3 -1
  53. package/dist/reconcile/types.d.ts.map +1 -1
  54. package/dist/reconcile/unified-inventory.d.ts +15 -0
  55. package/dist/reconcile/unified-inventory.d.ts.map +1 -0
  56. package/dist/reconcile/unified-inventory.js +540 -0
  57. package/dist/reconcile/unified-inventory.js.map +1 -0
  58. package/dist/seeds/build-manifest.d.ts +8 -0
  59. package/dist/seeds/build-manifest.d.ts.map +1 -0
  60. package/dist/seeds/build-manifest.js +83 -0
  61. package/dist/seeds/build-manifest.js.map +1 -0
  62. package/dist/seeds/default-seed-spec.d.ts +12 -0
  63. package/dist/seeds/default-seed-spec.d.ts.map +1 -0
  64. package/dist/seeds/default-seed-spec.js +90 -0
  65. package/dist/seeds/default-seed-spec.js.map +1 -0
  66. package/dist/seeds/index.d.ts +5 -2
  67. package/dist/seeds/index.d.ts.map +1 -1
  68. package/dist/seeds/index.js +4 -1
  69. package/dist/seeds/index.js.map +1 -1
  70. package/dist/seeds/merge-for-apply.d.ts +28 -0
  71. package/dist/seeds/merge-for-apply.d.ts.map +1 -0
  72. package/dist/seeds/merge-for-apply.js +31 -0
  73. package/dist/seeds/merge-for-apply.js.map +1 -0
  74. package/dist/seeds/seed-types.d.ts +57 -0
  75. package/dist/seeds/seed-types.d.ts.map +1 -0
  76. package/dist/seeds/seed-types.js +2 -0
  77. package/dist/seeds/seed-types.js.map +1 -0
  78. package/dist/tests/retrieval-free-subpaths.test.js +4 -0
  79. package/dist/tests/retrieval-free-subpaths.test.js.map +1 -1
  80. package/dist/tests/seeds.test.js +4 -4
  81. package/dist/tests/seeds.test.js.map +1 -1
  82. package/dist/tests/unified-inventory.test.d.ts +2 -0
  83. package/dist/tests/unified-inventory.test.d.ts.map +1 -0
  84. package/dist/tests/unified-inventory.test.js +53 -0
  85. package/dist/tests/unified-inventory.test.js.map +1 -0
  86. package/dist/types/descriptors.d.ts +228 -0
  87. package/dist/types/descriptors.d.ts.map +1 -0
  88. package/dist/types/descriptors.js +2 -0
  89. package/dist/types/descriptors.js.map +1 -0
  90. package/dist/types/index.d.ts +1 -0
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/validation/descriptor-validation.d.ts +1 -1
  93. package/package.json +2 -4
@@ -0,0 +1,540 @@
1
+ import { MEMORIX_LIST_DESCRIPTORS_CATALOG } from "../catalog/ids.js";
2
+ import { resolveMemorixCollectionName } from "../collections/collection-name.js";
3
+ import { resolveMemorixDbName } from "../collections/mongo-env.js";
4
+ import { parseMemorixCollectionName } from "../collections/parse.js";
5
+ import { parseDescriptorData, validateMemorixEntityDescriptor, } from "../validation/descriptor-validation.js";
6
+ import { DEFAULT_INVENTORY_POLICY, isCollectionIgnored, } from "../validation/inventory-policy-validation.js";
7
+ import { ALL_MEMORIX_TARGETS } from "./inventory-types.js";
8
+ export const DEFAULT_MEMORIX_XRONOX_ROLES = {
9
+ entity: "memorix_entities",
10
+ event: "memorix_events",
11
+ knowledge: "memorix_knowledge",
12
+ };
13
+ const XRONOX_DB_SOURCE = "_db";
14
+ function resolveXronoxRole(ctx, target) {
15
+ return ctx.xronoxRoles?.[target] ?? DEFAULT_MEMORIX_XRONOX_ROLES[target];
16
+ }
17
+ function requireXronoxListCollections(xronox) {
18
+ if (!xronox?.listCollections) {
19
+ throw new Error("buildMemorixUnifiedInventory requires xronox.listCollections");
20
+ }
21
+ return xronox.listCollections;
22
+ }
23
+ function requireXronoxCountDocuments(xronox) {
24
+ if (!xronox?.countDocuments) {
25
+ throw new Error("buildMemorixUnifiedInventory requires xronox.countDocuments");
26
+ }
27
+ return xronox.countDocuments;
28
+ }
29
+ function rowKey(databaseName, collectionName) {
30
+ return `${databaseName}::${collectionName}`;
31
+ }
32
+ function makeRowId(target, databaseName, collectionName) {
33
+ return `${target}:${databaseName}:${collectionName}`;
34
+ }
35
+ function actionsForStatus(status, listable) {
36
+ const actions = [];
37
+ if (status === "mapped" || status === "collection-mismatch") {
38
+ actions.push(listable ? "open-records" : "open-raw-records");
39
+ actions.push("inspect-descriptor");
40
+ }
41
+ else if (status === "orphan-collection" || status === "unparseable") {
42
+ actions.push("open-raw-records");
43
+ actions.push("create-descriptor");
44
+ }
45
+ else if (status === "missing-collection") {
46
+ actions.push("inspect-descriptor");
47
+ actions.push("fix-binding");
48
+ }
49
+ else if (status === "object-missing" || status === "content-type-missing") {
50
+ actions.push("add-content-type");
51
+ actions.push("create-descriptor");
52
+ }
53
+ if (status === "ignored")
54
+ actions.push("ignore");
55
+ return actions;
56
+ }
57
+ function issueSeverity(kind) {
58
+ switch (kind) {
59
+ case "empty-declared-collection":
60
+ return "info";
61
+ case "orphan-collection":
62
+ case "collection-mismatch":
63
+ case "object-missing":
64
+ case "content-type-missing":
65
+ case "unparseable-collection":
66
+ return "warning";
67
+ default:
68
+ return "error";
69
+ }
70
+ }
71
+ function suggestedActionsForKind(kind) {
72
+ switch (kind) {
73
+ case "missing-collection":
74
+ return ["inspect", "fix-binding"];
75
+ case "empty-declared-collection":
76
+ return ["inspect"];
77
+ case "orphan-collection":
78
+ return ["inspect", "create-descriptor", "delete-or-archive"];
79
+ case "object-missing":
80
+ case "content-type-missing":
81
+ return ["create-descriptor", "add-content-type"];
82
+ case "collection-mismatch":
83
+ return ["inspect", "fix-binding"];
84
+ case "unparseable-collection":
85
+ return ["inspect", "ignore"];
86
+ default:
87
+ return ["inspect"];
88
+ }
89
+ }
90
+ async function scanMongoCollections(ctx, targets, includeExactCounts) {
91
+ const listCollections = requireXronoxListCollections(ctx.xronox);
92
+ const countDocuments = requireXronoxCountDocuments(ctx.xronox);
93
+ const scanned = new Map();
94
+ for (const target of targets) {
95
+ const role = resolveXronoxRole(ctx, target);
96
+ const { database, collections } = await listCollections({
97
+ dataType: "metadata",
98
+ sourceType: "database",
99
+ subSourceType: "mongo",
100
+ source: XRONOX_DB_SOURCE,
101
+ role,
102
+ excludeSystem: true,
103
+ });
104
+ for (const { name: collectionName } of collections) {
105
+ const key = rowKey(database, collectionName);
106
+ try {
107
+ const count = await countDocuments({
108
+ dataType: "metadata",
109
+ sourceType: "database",
110
+ subSourceType: "mongo",
111
+ source: collectionName,
112
+ role,
113
+ estimated: !includeExactCounts,
114
+ });
115
+ scanned.set(key, { databaseName: database, target, collectionName, count });
116
+ }
117
+ catch {
118
+ scanned.set(key, { databaseName: database, target, collectionName, count: 0 });
119
+ }
120
+ }
121
+ }
122
+ return scanned;
123
+ }
124
+ function listEntityContentTypeKeys(entity) {
125
+ return Object.keys(entity.contentTypes);
126
+ }
127
+ function loadDeclaredSlots(ctx, targets) {
128
+ const slots = [];
129
+ for (const raw of Object.values(ctx.snapshot.entityDescriptors)) {
130
+ let entity;
131
+ try {
132
+ entity = validateMemorixEntityDescriptor(raw);
133
+ }
134
+ catch {
135
+ continue;
136
+ }
137
+ const target = entity.target ?? "entity";
138
+ if (!targets.includes(target))
139
+ continue;
140
+ const databaseName = resolveMemorixDbName(target, ctx.processEnv);
141
+ const listable = Boolean(entity.defaultListDescriptorId && entity.defaultItemDescriptorId);
142
+ for (const contentType of listEntityContentTypeKeys(entity)) {
143
+ let collectionName;
144
+ try {
145
+ collectionName = resolveMemorixCollectionName(entity, contentType, ctx.processEnv);
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ slots.push({
151
+ objectName: entity.entityName,
152
+ contentType,
153
+ collectionName,
154
+ expectedCollectionName: collectionName,
155
+ databaseName,
156
+ target,
157
+ entityDescriptorId: entity.id,
158
+ defaultListDescriptorId: entity.defaultListDescriptorId,
159
+ defaultItemDescriptorId: entity.defaultItemDescriptorId,
160
+ listable,
161
+ });
162
+ }
163
+ }
164
+ return slots;
165
+ }
166
+ async function loadListDescriptorIdsByEntity(ctx) {
167
+ const map = new Map();
168
+ const listFn = ctx.catalox?.listCatalogItems;
169
+ if (!listFn)
170
+ return map;
171
+ try {
172
+ const page = await listFn(MEMORIX_LIST_DESCRIPTORS_CATALOG, {
173
+ limit: 500,
174
+ offset: 0,
175
+ });
176
+ for (const item of page.items) {
177
+ const data = parseDescriptorData((item.data ?? {}));
178
+ const entity = typeof data.entity === "string" ? data.entity : undefined;
179
+ if (!entity)
180
+ continue;
181
+ const existing = map.get(entity) ?? [];
182
+ existing.push(String(item.itemId));
183
+ map.set(entity, existing);
184
+ }
185
+ }
186
+ catch {
187
+ /* optional enrichment */
188
+ }
189
+ return map;
190
+ }
191
+ function buildIssuesFromRows(rows) {
192
+ const issues = [];
193
+ let counter = 0;
194
+ for (const row of rows) {
195
+ let kind = null;
196
+ let message = "";
197
+ switch (row.mappingStatus) {
198
+ case "missing-collection":
199
+ kind = "missing-collection";
200
+ message = `Declared collection "${row.expectedCollectionName ?? row.collectionName}" is missing in Mongo`;
201
+ break;
202
+ case "orphan-collection":
203
+ kind = "orphan-collection";
204
+ message = `Mongo collection "${row.collectionName}" has no Catalox binding`;
205
+ break;
206
+ case "collection-mismatch":
207
+ kind = "collection-mismatch";
208
+ message = `Collection "${row.collectionName}" does not match expected "${row.expectedCollectionName}"`;
209
+ break;
210
+ case "object-missing":
211
+ kind = "object-missing";
212
+ message = `Parsed object "${row.objectName}" has no entity descriptor`;
213
+ break;
214
+ case "content-type-missing":
215
+ kind = "content-type-missing";
216
+ message = `Content type "${row.contentType}" is not declared on object "${row.objectName}"`;
217
+ break;
218
+ case "unparseable":
219
+ kind = "unparseable-collection";
220
+ message = `Collection "${row.collectionName}" does not match object-contentType naming rule`;
221
+ break;
222
+ default:
223
+ break;
224
+ }
225
+ if (!kind)
226
+ continue;
227
+ const issueId = `issue-${++counter}`;
228
+ row.issueIds = [...(row.issueIds ?? []), issueId];
229
+ issues.push({
230
+ issueId,
231
+ severity: issueSeverity(kind),
232
+ kind,
233
+ target: row.target,
234
+ databaseName: row.databaseName,
235
+ objectName: row.objectName || undefined,
236
+ contentType: row.contentType || undefined,
237
+ collectionName: row.collectionName,
238
+ descriptorId: row.descriptor?.entityDescriptorId,
239
+ message,
240
+ suggestedActions: suggestedActionsForKind(kind),
241
+ });
242
+ if (row.mappingStatus === "mapped" &&
243
+ (row.counts.exact === 0 || row.counts.estimated === 0)) {
244
+ const emptyIssueId = `issue-${++counter}`;
245
+ row.issueIds = [...(row.issueIds ?? []), emptyIssueId];
246
+ issues.push({
247
+ issueId: emptyIssueId,
248
+ severity: "info",
249
+ kind: "empty-declared-collection",
250
+ target: row.target,
251
+ databaseName: row.databaseName,
252
+ objectName: row.objectName,
253
+ contentType: row.contentType,
254
+ collectionName: row.collectionName,
255
+ descriptorId: row.descriptor?.entityDescriptorId,
256
+ message: `Declared collection "${row.collectionName}" is empty`,
257
+ suggestedActions: ["inspect"],
258
+ });
259
+ }
260
+ }
261
+ return issues;
262
+ }
263
+ function summarizeTargets(rows, targets, dbs) {
264
+ const out = {};
265
+ for (const target of ALL_MEMORIX_TARGETS) {
266
+ const targetRows = rows.filter((r) => r.target === target);
267
+ const declared = targetRows.filter((r) => r.source !== "mongo-discovered");
268
+ out[target] = {
269
+ databaseName: dbs[target],
270
+ declaredCollections: declared.length,
271
+ mappedCollections: targetRows.filter((r) => r.mappingStatus === "mapped").length,
272
+ missingCollections: targetRows.filter((r) => r.mappingStatus === "missing-collection").length,
273
+ orphanCollections: targetRows.filter((r) => r.mappingStatus === "orphan-collection").length,
274
+ emptyDeclaredCollections: targetRows.filter((r) => r.mappingStatus === "mapped" &&
275
+ (r.counts.exact === 0 || r.counts.estimated === 0)).length,
276
+ mongoCollections: targetRows.filter((r) => r.source === "mongo-discovered" || r.source === "merged").length,
277
+ totalRecords: targetRows.reduce((sum, r) => sum + (r.counts.exact ?? r.counts.estimated ?? 0), 0),
278
+ };
279
+ }
280
+ for (const target of targets) {
281
+ if (!out[target]) {
282
+ out[target] = {
283
+ databaseName: dbs[target],
284
+ declaredCollections: 0,
285
+ mappedCollections: 0,
286
+ missingCollections: 0,
287
+ orphanCollections: 0,
288
+ emptyDeclaredCollections: 0,
289
+ mongoCollections: 0,
290
+ };
291
+ }
292
+ }
293
+ return out;
294
+ }
295
+ export async function buildMemorixUnifiedInventory(ctx, options = {}) {
296
+ const sourceLens = options.sourceLens ?? "catalox-first";
297
+ const targets = options.targets ?? [...ALL_MEMORIX_TARGETS];
298
+ const includeExactCounts = options.includeExactCounts ?? false;
299
+ const countMode = includeExactCounts ? "exact" : "estimated";
300
+ const dbs = {
301
+ entity: resolveMemorixDbName("entity", ctx.processEnv),
302
+ event: resolveMemorixDbName("event", ctx.processEnv),
303
+ knowledge: resolveMemorixDbName("knowledge", ctx.processEnv),
304
+ };
305
+ const declaredSlots = loadDeclaredSlots(ctx, targets);
306
+ const inventoryPolicy = options.includeIgnored === false
307
+ ? null
308
+ : (ctx.snapshot.inventoryPolicy ?? DEFAULT_INVENTORY_POLICY);
309
+ const [scanned, listIdsByEntity] = await Promise.all([
310
+ scanMongoCollections(ctx, targets, includeExactCounts),
311
+ loadListDescriptorIdsByEntity(ctx),
312
+ ]);
313
+ const declaredByKey = new Map();
314
+ const objectNames = new Set();
315
+ for (const slot of declaredSlots) {
316
+ objectNames.add(slot.objectName);
317
+ declaredByKey.set(rowKey(slot.databaseName, slot.collectionName), slot);
318
+ }
319
+ const rows = [];
320
+ const seenKeys = new Set();
321
+ function addRow(row) {
322
+ if (!targets.includes(row.target))
323
+ return;
324
+ if (inventoryPolicy &&
325
+ isCollectionIgnored(inventoryPolicy, row.target, row.collectionName, row.databaseName)) {
326
+ row.mappingStatus = "ignored";
327
+ row.actions = ["ignore"];
328
+ }
329
+ if (row.mappingStatus === "ignored" && !options.includeIgnored)
330
+ return;
331
+ rows.push(row);
332
+ seenKeys.add(rowKey(row.databaseName, row.collectionName));
333
+ }
334
+ if (sourceLens === "catalox-first") {
335
+ for (const slot of declaredSlots) {
336
+ const key = rowKey(slot.databaseName, slot.collectionName);
337
+ const scannedCol = scanned.get(key);
338
+ const count = scannedCol?.count ?? 0;
339
+ const exists = scannedCol != null;
340
+ const mappingStatus = !exists
341
+ ? "missing-collection"
342
+ : "mapped";
343
+ addRow({
344
+ rowId: makeRowId(slot.target, slot.databaseName, slot.collectionName),
345
+ target: slot.target,
346
+ databaseName: slot.databaseName,
347
+ objectName: slot.objectName,
348
+ contentType: slot.contentType,
349
+ collectionName: slot.collectionName,
350
+ expectedCollectionName: slot.expectedCollectionName,
351
+ source: exists ? "merged" : "catalox-declared",
352
+ mappingStatus,
353
+ descriptor: {
354
+ entityDescriptorId: slot.entityDescriptorId,
355
+ listDescriptorIds: listIdsByEntity.get(slot.objectName),
356
+ defaultListDescriptorId: slot.defaultListDescriptorId,
357
+ defaultItemDescriptorId: slot.defaultItemDescriptorId,
358
+ },
359
+ counts: {
360
+ ...(includeExactCounts ? { exact: count } : { estimated: count }),
361
+ countMode: exists ? countMode : "none",
362
+ },
363
+ actions: actionsForStatus(mappingStatus, slot.listable),
364
+ });
365
+ }
366
+ for (const [, col] of scanned) {
367
+ const key = rowKey(col.databaseName, col.collectionName);
368
+ if (declaredByKey.has(key))
369
+ continue;
370
+ const parsed = parseMemorixCollectionName(col.collectionName);
371
+ let objectName = "";
372
+ let contentType = "";
373
+ let mappingStatus;
374
+ if (parsed.parseStatus !== "parsed") {
375
+ mappingStatus = col.count > 0 ? "unparseable" : "ignored";
376
+ objectName = col.collectionName;
377
+ }
378
+ else {
379
+ objectName = parsed.objectName;
380
+ contentType = parsed.contentType;
381
+ if (!objectNames.has(objectName)) {
382
+ mappingStatus = col.count > 0 ? "object-missing" : "ignored";
383
+ }
384
+ else {
385
+ mappingStatus = col.count > 0 ? "orphan-collection" : "ignored";
386
+ }
387
+ }
388
+ addRow({
389
+ rowId: makeRowId(col.target, col.databaseName, col.collectionName),
390
+ target: col.target,
391
+ databaseName: col.databaseName,
392
+ objectName,
393
+ contentType,
394
+ collectionName: col.collectionName,
395
+ source: "mongo-discovered",
396
+ mappingStatus,
397
+ counts: {
398
+ ...(includeExactCounts ? { exact: col.count } : { estimated: col.count }),
399
+ countMode,
400
+ },
401
+ actions: actionsForStatus(mappingStatus, false),
402
+ });
403
+ }
404
+ }
405
+ else {
406
+ for (const [, col] of scanned) {
407
+ const parsed = parseMemorixCollectionName(col.collectionName);
408
+ const key = rowKey(col.databaseName, col.collectionName);
409
+ const slot = declaredByKey.get(key);
410
+ if (slot) {
411
+ addRow({
412
+ rowId: makeRowId(col.target, col.databaseName, col.collectionName),
413
+ target: col.target,
414
+ databaseName: col.databaseName,
415
+ objectName: slot.objectName,
416
+ contentType: slot.contentType,
417
+ collectionName: col.collectionName,
418
+ expectedCollectionName: slot.expectedCollectionName,
419
+ source: "merged",
420
+ mappingStatus: "mapped",
421
+ descriptor: {
422
+ entityDescriptorId: slot.entityDescriptorId,
423
+ listDescriptorIds: listIdsByEntity.get(slot.objectName),
424
+ defaultListDescriptorId: slot.defaultListDescriptorId,
425
+ defaultItemDescriptorId: slot.defaultItemDescriptorId,
426
+ },
427
+ counts: {
428
+ ...(includeExactCounts ? { exact: col.count } : { estimated: col.count }),
429
+ countMode,
430
+ },
431
+ actions: actionsForStatus("mapped", slot.listable),
432
+ });
433
+ continue;
434
+ }
435
+ if (parsed.parseStatus !== "parsed") {
436
+ addRow({
437
+ rowId: makeRowId(col.target, col.databaseName, col.collectionName),
438
+ target: col.target,
439
+ databaseName: col.databaseName,
440
+ objectName: col.collectionName,
441
+ contentType: "",
442
+ collectionName: col.collectionName,
443
+ source: "mongo-discovered",
444
+ mappingStatus: col.count > 0 ? "unparseable" : "ignored",
445
+ counts: {
446
+ ...(includeExactCounts ? { exact: col.count } : { estimated: col.count }),
447
+ countMode,
448
+ },
449
+ actions: actionsForStatus("unparseable", false),
450
+ });
451
+ continue;
452
+ }
453
+ const hasObject = objectNames.has(parsed.objectName);
454
+ let mappingStatus;
455
+ if (!hasObject) {
456
+ mappingStatus = col.count > 0 ? "object-missing" : "ignored";
457
+ }
458
+ else {
459
+ const declaredForObject = declaredSlots.filter((s) => s.objectName === parsed.objectName &&
460
+ s.contentType === parsed.contentType);
461
+ mappingStatus =
462
+ declaredForObject.length === 0
463
+ ? col.count > 0
464
+ ? "content-type-missing"
465
+ : "ignored"
466
+ : col.count > 0
467
+ ? "orphan-collection"
468
+ : "ignored";
469
+ }
470
+ addRow({
471
+ rowId: makeRowId(col.target, col.databaseName, col.collectionName),
472
+ target: col.target,
473
+ databaseName: col.databaseName,
474
+ objectName: parsed.objectName,
475
+ contentType: parsed.contentType,
476
+ collectionName: col.collectionName,
477
+ source: "mongo-discovered",
478
+ mappingStatus,
479
+ counts: {
480
+ ...(includeExactCounts ? { exact: col.count } : { estimated: col.count }),
481
+ countMode,
482
+ },
483
+ actions: actionsForStatus(mappingStatus, false),
484
+ });
485
+ }
486
+ for (const slot of declaredSlots) {
487
+ const key = rowKey(slot.databaseName, slot.collectionName);
488
+ if (seenKeys.has(key))
489
+ continue;
490
+ addRow({
491
+ rowId: makeRowId(slot.target, slot.databaseName, slot.collectionName),
492
+ target: slot.target,
493
+ databaseName: slot.databaseName,
494
+ objectName: slot.objectName,
495
+ contentType: slot.contentType,
496
+ collectionName: slot.collectionName,
497
+ expectedCollectionName: slot.expectedCollectionName,
498
+ source: "catalox-declared",
499
+ mappingStatus: "missing-collection",
500
+ descriptor: {
501
+ entityDescriptorId: slot.entityDescriptorId,
502
+ listDescriptorIds: listIdsByEntity.get(slot.objectName),
503
+ defaultListDescriptorId: slot.defaultListDescriptorId,
504
+ defaultItemDescriptorId: slot.defaultItemDescriptorId,
505
+ },
506
+ counts: { countMode: "none" },
507
+ actions: actionsForStatus("missing-collection", slot.listable),
508
+ });
509
+ }
510
+ }
511
+ rows.sort((a, b) => {
512
+ const db = a.databaseName.localeCompare(b.databaseName);
513
+ if (db !== 0)
514
+ return db;
515
+ return a.collectionName.localeCompare(b.collectionName);
516
+ });
517
+ const issues = buildIssuesFromRows(rows);
518
+ const targetSummary = summarizeTargets(rows, targets, dbs);
519
+ const cataloxObjects = new Set(declaredSlots.map((s) => s.objectName)).size;
520
+ return {
521
+ sourceLens,
522
+ summary: {
523
+ cataloxObjects,
524
+ mongoCollections: scanned.size,
525
+ declaredCollections: declaredSlots.length,
526
+ mappedCollections: rows.filter((r) => r.mappingStatus === "mapped").length,
527
+ missingCollections: rows.filter((r) => r.mappingStatus === "missing-collection").length,
528
+ orphanCollections: rows.filter((r) => r.mappingStatus === "orphan-collection").length,
529
+ emptyDeclaredCollections: rows.filter((r) => r.mappingStatus === "mapped" &&
530
+ (r.counts.exact === 0 || r.counts.estimated === 0)).length,
531
+ totalRecords: rows.reduce((sum, r) => sum + (r.counts.exact ?? r.counts.estimated ?? 0), 0),
532
+ issueCount: issues.length,
533
+ },
534
+ targets: targetSummary,
535
+ rows,
536
+ issues,
537
+ generatedAt: new Date().toISOString(),
538
+ };
539
+ }
540
+ //# sourceMappingURL=unified-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-inventory.js","sourceRoot":"","sources":["../../src/reconcile/unified-inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MemorixRetrievalSeedManifest, MemorixSeedScope } from "./seed-types.js";
2
+ export type BuildMemorixRetrievalSeedManifestOptions = {
3
+ readJson: (relativePath: string) => Promise<Record<string, unknown>>;
4
+ scope?: MemorixSeedScope;
5
+ appId?: string;
6
+ };
7
+ export declare function buildMemorixRetrievalSeedManifest(options: BuildMemorixRetrievalSeedManifestOptions): Promise<MemorixRetrievalSeedManifest>;
8
+ //# sourceMappingURL=build-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/seeds/build-manifest.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,4BAA4B,EAE5B,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,wCAAwC,GAAG;IACrD,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAkDF,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,wCAAwC,GAChD,OAAO,CAAC,4BAA4B,CAAC,CAwCvC"}
@@ -0,0 +1,83 @@
1
+ import { MEMORIX_RETRIEVAL_DEFAULT_SCOPE, MEMORIX_RETRIEVAL_ENTITY_TARGETS, MEMORIX_RETRIEVAL_SEED_APP_ID, MEMORIX_RETRIEVAL_SEED_CATALOGS, MEMORIX_RETRIEVAL_SEED_PRESET_ID, } from "./default-seed-spec.js";
2
+ import { MEMORIX_ENTITY_DESCRIPTORS_CATALOG, } from "../catalog/ids.js";
3
+ function buildCatalogDescriptor(spec) {
4
+ const { catalogId, name, descriptor } = spec;
5
+ return {
6
+ catalogId,
7
+ descriptorVersion: "1",
8
+ mode: "replace",
9
+ descriptor: {
10
+ catalogId,
11
+ label: name,
12
+ sourceMode: "native",
13
+ status: "active",
14
+ capabilities: {
15
+ canList: true,
16
+ canGet: true,
17
+ canCreate: true,
18
+ canEdit: true,
19
+ canDelete: true,
20
+ canImport: true,
21
+ canExport: true,
22
+ canSync: false,
23
+ canValidate: true,
24
+ canViewReferences: true,
25
+ },
26
+ queryableFields: descriptor.queryableFields.map((f) => ({
27
+ key: f.key,
28
+ label: f.label,
29
+ type: "string",
30
+ indexed: true,
31
+ filterable: true,
32
+ listVisible: true,
33
+ detailVisible: true,
34
+ })),
35
+ identity: {
36
+ itemIdStrategy: "natural",
37
+ itemIdField: descriptor.itemIdField,
38
+ titleField: descriptor.titleField,
39
+ },
40
+ },
41
+ };
42
+ }
43
+ function withEntityTarget(data) {
44
+ const id = typeof data.id === "string" ? data.id : undefined;
45
+ const target = id ? MEMORIX_RETRIEVAL_ENTITY_TARGETS[id] : undefined;
46
+ if (!target)
47
+ return data;
48
+ return { ...data, target };
49
+ }
50
+ export async function buildMemorixRetrievalSeedManifest(options) {
51
+ const itemScope = options.scope ?? MEMORIX_RETRIEVAL_DEFAULT_SCOPE;
52
+ const appId = options.appId ?? MEMORIX_RETRIEVAL_SEED_APP_ID;
53
+ const catalogs = MEMORIX_RETRIEVAL_SEED_CATALOGS.map(({ descriptor: _d, inputFiles: _f, ...catalog }) => catalog);
54
+ const descriptors = MEMORIX_RETRIEVAL_SEED_CATALOGS.map((spec) => buildCatalogDescriptor(spec));
55
+ const bindings = MEMORIX_RETRIEVAL_SEED_CATALOGS.map(({ catalogId }) => ({
56
+ appId,
57
+ catalogId,
58
+ access: { canRead: true, canWrite: true },
59
+ }));
60
+ const items = [];
61
+ for (const spec of MEMORIX_RETRIEVAL_SEED_CATALOGS) {
62
+ for (const file of spec.inputFiles) {
63
+ let data = await options.readJson(file);
64
+ if (spec.catalogId === MEMORIX_ENTITY_DESCRIPTORS_CATALOG) {
65
+ data = withEntityTarget(data);
66
+ }
67
+ items.push({ catalogId: spec.catalogId, scope: itemScope, data });
68
+ }
69
+ }
70
+ return {
71
+ presetVersion: 1,
72
+ id: MEMORIX_RETRIEVAL_SEED_PRESET_ID,
73
+ name: "Memorix retrieval descriptors",
74
+ description: "Entity, list, and item descriptors for Memorix (from catalox-seeds/inputs/). " +
75
+ "assets and variabilities-groups target memorix-entities; vulnerabilities target memorix-events. " +
76
+ "All items share scope.domains/network+vulnerabilities and scope.agents/neo.",
77
+ catalogs,
78
+ descriptors,
79
+ bindings,
80
+ items,
81
+ };
82
+ }
83
+ //# sourceMappingURL=build-manifest.js.map