@x12i/memorix-retrieval 1.2.0 → 1.4.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 (102) hide show
  1. package/README.md +64 -24
  2. package/catalox-seeds/inputs/entity-descriptors/assets.json +2 -0
  3. package/catalox-seeds/inputs/entity-descriptors/variabilities-groups.json +2 -0
  4. package/catalox-seeds/inputs/entity-descriptors/vulnerabilities.json +2 -0
  5. package/catalox-seeds/memorix-retrieval-descriptors.manifest.json +6 -0
  6. package/dist/client/create-client.js +2 -2
  7. package/dist/client/create-client.js.map +1 -1
  8. package/dist/client/create-stack-from-env.js +4 -6
  9. package/dist/client/create-stack-from-env.js.map +1 -1
  10. package/dist/client/types.d.ts +4 -0
  11. package/dist/client/types.d.ts.map +1 -1
  12. package/dist/descriptors/descriptor-types.d.ts +4 -0
  13. package/dist/descriptors/descriptor-types.d.ts.map +1 -1
  14. package/dist/descriptors/discover-entities.d.ts +3 -1
  15. package/dist/descriptors/discover-entities.d.ts.map +1 -1
  16. package/dist/descriptors/discover-entities.js +14 -43
  17. package/dist/descriptors/discover-entities.js.map +1 -1
  18. package/dist/descriptors/resolve-app-id.d.ts +4 -0
  19. package/dist/descriptors/resolve-app-id.d.ts.map +1 -0
  20. package/dist/descriptors/resolve-app-id.js +8 -0
  21. package/dist/descriptors/resolve-app-id.js.map +1 -0
  22. package/dist/descriptors/resolve-default-descriptors.d.ts +11 -0
  23. package/dist/descriptors/resolve-default-descriptors.d.ts.map +1 -0
  24. package/dist/descriptors/resolve-default-descriptors.js +22 -0
  25. package/dist/descriptors/resolve-default-descriptors.js.map +1 -0
  26. package/dist/descriptors/validate-descriptor.d.ts.map +1 -1
  27. package/dist/descriptors/validate-descriptor.js +11 -0
  28. package/dist/descriptors/validate-descriptor.js.map +1 -1
  29. package/dist/explorer/entity-graph.d.ts +3 -1
  30. package/dist/explorer/entity-graph.d.ts.map +1 -1
  31. package/dist/explorer/entity-graph.js +4 -0
  32. package/dist/explorer/entity-graph.js.map +1 -1
  33. package/dist/index.d.ts +12 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +11 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/retrieval/fetch-for-entity.d.ts +18 -0
  38. package/dist/retrieval/fetch-for-entity.d.ts.map +1 -0
  39. package/dist/retrieval/fetch-for-entity.js +21 -0
  40. package/dist/retrieval/fetch-for-entity.js.map +1 -0
  41. package/dist/retrieval/fetch-list.d.ts.map +1 -1
  42. package/dist/retrieval/fetch-list.js +16 -1
  43. package/dist/retrieval/fetch-list.js.map +1 -1
  44. package/dist/retrieval/resolve-filters.d.ts +2 -0
  45. package/dist/retrieval/resolve-filters.d.ts.map +1 -1
  46. package/dist/retrieval/resolve-filters.js +24 -3
  47. package/dist/retrieval/resolve-filters.js.map +1 -1
  48. package/dist/retrieval/resolve-list-search.d.ts +6 -0
  49. package/dist/retrieval/resolve-list-search.d.ts.map +1 -0
  50. package/dist/retrieval/resolve-list-search.js +25 -0
  51. package/dist/retrieval/resolve-list-search.js.map +1 -0
  52. package/dist/seeds/build-manifest.d.ts +8 -0
  53. package/dist/seeds/build-manifest.d.ts.map +1 -0
  54. package/dist/seeds/build-manifest.js +83 -0
  55. package/dist/seeds/build-manifest.js.map +1 -0
  56. package/dist/seeds/check-needs-seed.d.ts +10 -0
  57. package/dist/seeds/check-needs-seed.d.ts.map +1 -0
  58. package/dist/seeds/check-needs-seed.js +66 -0
  59. package/dist/seeds/check-needs-seed.js.map +1 -0
  60. package/dist/seeds/default-seed-spec.d.ts +12 -0
  61. package/dist/seeds/default-seed-spec.d.ts.map +1 -0
  62. package/dist/seeds/default-seed-spec.js +89 -0
  63. package/dist/seeds/default-seed-spec.js.map +1 -0
  64. package/dist/seeds/merge-for-apply.d.ts +28 -0
  65. package/dist/seeds/merge-for-apply.d.ts.map +1 -0
  66. package/dist/seeds/merge-for-apply.js +31 -0
  67. package/dist/seeds/merge-for-apply.js.map +1 -0
  68. package/dist/seeds/paths.d.ts +10 -0
  69. package/dist/seeds/paths.d.ts.map +1 -0
  70. package/dist/seeds/paths.js +40 -0
  71. package/dist/seeds/paths.js.map +1 -0
  72. package/dist/seeds/seed-types.d.ts +57 -0
  73. package/dist/seeds/seed-types.d.ts.map +1 -0
  74. package/dist/seeds/seed-types.js +2 -0
  75. package/dist/seeds/seed-types.js.map +1 -0
  76. package/dist/tests/descriptor-validation.test.js +15 -0
  77. package/dist/tests/descriptor-validation.test.js.map +1 -1
  78. package/dist/tests/fixtures.d.ts.map +1 -1
  79. package/dist/tests/fixtures.js +2 -0
  80. package/dist/tests/fixtures.js.map +1 -1
  81. package/dist/tests/relations.test.js +3 -0
  82. package/dist/tests/relations.test.js.map +1 -1
  83. package/dist/tests/resolve-app-id.test.d.ts +2 -0
  84. package/dist/tests/resolve-app-id.test.d.ts.map +1 -0
  85. package/dist/tests/resolve-app-id.test.js +19 -0
  86. package/dist/tests/resolve-app-id.test.js.map +1 -0
  87. package/dist/tests/resolve-filters.test.d.ts +2 -0
  88. package/dist/tests/resolve-filters.test.d.ts.map +1 -0
  89. package/dist/tests/resolve-filters.test.js +47 -0
  90. package/dist/tests/resolve-filters.test.js.map +1 -0
  91. package/dist/tests/seed-check.test.d.ts +2 -0
  92. package/dist/tests/seed-check.test.d.ts.map +1 -0
  93. package/dist/tests/seed-check.test.js +47 -0
  94. package/dist/tests/seed-check.test.js.map +1 -0
  95. package/dist/tests/seed-manifest.test.d.ts +2 -0
  96. package/dist/tests/seed-manifest.test.d.ts.map +1 -0
  97. package/dist/tests/seed-manifest.test.js +80 -0
  98. package/dist/tests/seed-manifest.test.js.map +1 -0
  99. package/docs/DATA-TIER-CONTRACT.md +138 -0
  100. package/docs/EXPLORER-HOST-APIS.md +8 -6
  101. package/docs/MEMORIX-CATALOX-CONTRACTS.md +540 -0
  102. package/package.json +4 -3
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createMemorixRetrieval } from "../client/create-client.js";
3
+ import { checkMemorixRetrievalSeedNeeds } from "../seeds/check-needs-seed.js";
4
+ import { MEMORIX_ENTITY_DESCRIPTORS_CATALOG } from "../descriptors/catalog-ids.js";
5
+ describe("checkMemorixRetrievalSeedNeeds", () => {
6
+ it("reports missing catalog items", async () => {
7
+ const client = createMemorixRetrieval({
8
+ catalox: {
9
+ getCatalogItem: vi.fn(),
10
+ listCatalogItems: vi.fn(async (_ctx, catalogId) => {
11
+ if (catalogId === MEMORIX_ENTITY_DESCRIPTORS_CATALOG) {
12
+ return { items: [{ id: "assets", data: {} }], hasMore: false };
13
+ }
14
+ return { items: [], hasMore: false };
15
+ }),
16
+ },
17
+ });
18
+ const result = await checkMemorixRetrievalSeedNeeds(client, {
19
+ expected: [
20
+ {
21
+ catalogId: MEMORIX_ENTITY_DESCRIPTORS_CATALOG,
22
+ itemIds: ["assets", "vulnerabilities"],
23
+ },
24
+ ],
25
+ });
26
+ expect(result.needed).toBe(true);
27
+ expect(result.catalogs[0]?.missingItemIds).toEqual(["vulnerabilities"]);
28
+ });
29
+ it("reports ok when all expected items exist", async () => {
30
+ const client = createMemorixRetrieval({
31
+ catalox: {
32
+ getCatalogItem: vi.fn(),
33
+ listCatalogItems: vi.fn(async () => ({
34
+ items: [{ id: "assets", data: {} }],
35
+ hasMore: false,
36
+ })),
37
+ },
38
+ });
39
+ const result = await checkMemorixRetrievalSeedNeeds(client, {
40
+ expected: [
41
+ { catalogId: MEMORIX_ENTITY_DESCRIPTORS_CATALOG, itemIds: ["assets"] },
42
+ ],
43
+ });
44
+ expect(result.needed).toBe(false);
45
+ });
46
+ });
47
+ //# sourceMappingURL=seed-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-check.test.js","sourceRoot":"","sources":["../../src/tests/seed-check.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AAEnF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,OAAO,EAAE;gBACP,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;gBACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;oBAChD,IAAI,SAAS,KAAK,kCAAkC,EAAE,CAAC;wBACrD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;oBACjE,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACvC,CAAC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,MAAM,EAAE;YAC1D,QAAQ,EAAE;gBACR;oBACE,SAAS,EAAE,kCAAkC;oBAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC;iBACvC;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,OAAO,EAAE;gBACP,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;gBACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;oBACnC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;oBACnC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,MAAM,EAAE;YAC1D,QAAQ,EAAE;gBACR,EAAE,SAAS,EAAE,kCAAkC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;aACvE;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seed-manifest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-manifest.test.d.ts","sourceRoot":"","sources":["../../src/tests/seed-manifest.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildMemorixRetrievalSeedManifest } from "../seeds/build-manifest.js";
3
+ import { MEMORIX_ENTITY_DESCRIPTORS_CATALOG, MEMORIX_LIST_DESCRIPTORS_CATALOG, } from "../descriptors/catalog-ids.js";
4
+ import { mergeSeedItemScopeIntoUpsertData, prepareMemorixRetrievalSeedManifestForCataloxApply, } from "../seeds/merge-for-apply.js";
5
+ import { listExpectedMemorixRetrievalSeedItemIds, MEMORIX_RETRIEVAL_SEED_CATALOGS, } from "../seeds/default-seed-spec.js";
6
+ import { buildMemorixRetrievalSeedManifestFromInputs } from "../seeds/paths.js";
7
+ describe("buildMemorixRetrievalSeedManifest", () => {
8
+ it("builds preset from input json", async () => {
9
+ const manifest = await buildMemorixRetrievalSeedManifest({
10
+ scope: { domains: ["network"], agents: ["neo"] },
11
+ readJson: async (path) => {
12
+ const base = path.split("/").pop()?.replace(/\.json$/i, "") ?? path;
13
+ if (path.startsWith("entity-descriptors/")) {
14
+ return { id: base, entityName: base };
15
+ }
16
+ if (path.startsWith("list-descriptors/")) {
17
+ return { id: base, entity: "assets", title: base };
18
+ }
19
+ if (path.startsWith("item-descriptors/")) {
20
+ return { id: base, entity: "assets", title: base };
21
+ }
22
+ throw new Error(`unexpected ${path}`);
23
+ },
24
+ });
25
+ expect(manifest.presetVersion).toBe(1);
26
+ expect(manifest.items).toHaveLength(MEMORIX_RETRIEVAL_SEED_CATALOGS.flatMap((c) => c.inputFiles).length);
27
+ const assetsEntity = manifest.items.find((i) => i.catalogId === MEMORIX_ENTITY_DESCRIPTORS_CATALOG && i.data.id === "assets");
28
+ expect(assetsEntity).toMatchObject({
29
+ scope: { domains: ["network"], agents: ["neo"] },
30
+ data: { id: "assets", entityName: "assets", target: "entity" },
31
+ });
32
+ expect(manifest.items.some((i) => i.catalogId === MEMORIX_LIST_DESCRIPTORS_CATALOG)).toBe(true);
33
+ });
34
+ it("builds full manifest from shipped catalox-seeds/inputs", async () => {
35
+ const manifest = await buildMemorixRetrievalSeedManifestFromInputs();
36
+ expect(manifest.items).toHaveLength(10);
37
+ expect(manifest.items.every((i) => i.scope.domains.length > 0)).toBe(true);
38
+ });
39
+ });
40
+ describe("seed merge for apply", () => {
41
+ it("merges scope into upsert data", () => {
42
+ expect(mergeSeedItemScopeIntoUpsertData({ id: "assets" }, {
43
+ domains: ["network"],
44
+ agents: ["neo"],
45
+ })).toEqual({
46
+ id: "assets",
47
+ scope: { domains: ["network"], agents: ["neo"] },
48
+ });
49
+ });
50
+ it("prepares manifest items for catalox apply", () => {
51
+ const prepared = prepareMemorixRetrievalSeedManifestForCataloxApply({
52
+ presetVersion: 1,
53
+ id: "x",
54
+ name: "x",
55
+ description: "x",
56
+ catalogs: [],
57
+ descriptors: [],
58
+ bindings: [],
59
+ items: [
60
+ {
61
+ catalogId: MEMORIX_ENTITY_DESCRIPTORS_CATALOG,
62
+ scope: { domains: ["network"], agents: ["neo"] },
63
+ data: { id: "assets" },
64
+ },
65
+ ],
66
+ });
67
+ expect(prepared.items[0]?.data.scope).toEqual({
68
+ domains: ["network"],
69
+ agents: ["neo"],
70
+ });
71
+ });
72
+ });
73
+ describe("listExpectedMemorixRetrievalSeedItemIds", () => {
74
+ it("lists all shipped catalog item ids", () => {
75
+ const expected = listExpectedMemorixRetrievalSeedItemIds();
76
+ expect(expected.find((c) => c.catalogId.includes("entity"))?.itemIds).toContain("assets");
77
+ expect(expected.flatMap((c) => c.itemIds)).toHaveLength(10);
78
+ });
79
+ });
80
+ //# sourceMappingURL=seed-manifest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-manifest.test.js","sourceRoot":"","sources":["../../src/tests/seed-manifest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ # Memorix data tier contract
2
+
3
+ **Reference only** — indexes the public API of `@x12i/memorix-retrieval`. It does not define new runtime behavior; see implementation in `src/index.ts`.
4
+
5
+ Public API surface for **`@x12i/memorix-retrieval`**. Host apps (Explorer, APIs, tools) should call these exports only — not ad hoc Mongo or env-based entity discovery.
6
+
7
+ See also:
8
+
9
+ - [MEMORIX-CATALOX-CONTRACTS.md](./MEMORIX-CATALOX-CONTRACTS.md) — descriptor catalogs and JSON formats
10
+ - [MEMORIX-DATABASE-CONVENTIONS.md](./MEMORIX-DATABASE-CONVENTIONS.md) — Mongo layout and env vars
11
+ - [EXPLORER-HOST-APIS.md](./EXPLORER-HOST-APIS.md) — graph, raw reads, scoped workspace (Explorer-oriented)
12
+
13
+ ---
14
+
15
+ ## Bootstrap
16
+
17
+ | Export | Purpose |
18
+ |--------|---------|
19
+ | `createMemorixRetrieval(options)` | Build client with Catalox (+ lazy Mongo from `MONGO_URI`) |
20
+ | `createMemorixRetrievalFromEnv(options)` | Same, connects Mongo up front |
21
+ | `createMemorixRetrievalStackFromEnv(options?)` | Catalox from env + adapter + retrieval client (recommended for hosts) |
22
+ | `createCataloxAdapterFromBound(bound)` | Wrap a bound Catalox client for descriptor loads |
23
+ | `resolveMemorixAppId(options?, processEnv?)` | Resolve app id: option → `CATALOX_APP_ID` → `MEMORIX_APP_ID` → `memorix` |
24
+
25
+ **Required env (simple mode):** `MONGO_URI`. Catalox credentials per `@x12i/catalox` when using the stack helper.
26
+
27
+ ---
28
+
29
+ ## Descriptor-driven reads (primary)
30
+
31
+ | Export | Purpose |
32
+ |--------|---------|
33
+ | `fetchMemorixList(client, request)` | Paginated list by list descriptor id |
34
+ | `fetchMemorixItem(client, request)` | Record detail by item descriptor id |
35
+ | `fetchMemorixListForEntity(client, { entityName, ... })` | List using entity `defaultListDescriptorId` |
36
+ | `fetchMemorixItemForEntity(client, { entityName, entityId \| eventId, ... })` | Item using entity `defaultItemDescriptorId` |
37
+
38
+ List requests support `filters`, `searchText`, `sort`, `page`, `includeExtensions`.
39
+
40
+ List descriptor `filters` with `operator` + `value` are **always applied**; request filters merge on top (same property: request wins).
41
+
42
+ ---
43
+
44
+ ## Discovery and defaults
45
+
46
+ | Export | Purpose |
47
+ |--------|---------|
48
+ | `discoverMemorixEntities(client)` | List entity descriptors from Catalox (`source: "catalox" \| "none"`) |
49
+ | `loadMemorixEntityDescriptorByName(client, entityName)` | Load full entity descriptor by `entityName` |
50
+ | `loadMemorixEntityDescriptor` / `loadMemorixListDescriptor` / `loadMemorixItemDescriptor` | Load by catalog item id |
51
+ | `resolveDefaultListDescriptorForEntity` / `resolveDefaultItemDescriptorForEntity` | Resolve Option A defaults |
52
+ | `entityDescriptorConnections(entity)` | Relation edges from entity descriptor |
53
+
54
+ **Forbidden:** env entity lists (`MEMORIX_ENTITY_NAMES`, etc.). Discovery is Catalox-only.
55
+
56
+ ---
57
+
58
+ ## Explorer / graph (optional)
59
+
60
+ | Export | Purpose |
61
+ |--------|---------|
62
+ | `buildMemorixEntityGraph(client, options?)` | Discovery + counts + relation graph |
63
+ | `buildMemorixEntitySlices(client, entityName)` | Per–content-type counts for drill-down |
64
+ | `getMemorixRetrievalHealth(client)` | Mongo ping + discovery sample |
65
+ | `countMemorixEntityContentTypeDocuments` | Count by entity + content type (descriptor-resolved collection) |
66
+ | `listMemorixEntityContentTypeDocuments` | Paginated raw documents (descriptor-resolved) |
67
+ | `getMemorixEntityContentTypeDocument` | Single document by record id |
68
+ | `listScopedWorkspaceEntityTypes` / `listScopedWorkspaceDocuments` / `countScopedWorkspaceDocuments` | Namespace-scoped cross-entity reads |
69
+ | `resolveScopedWorkspaceNamespace` / `resolveScopedNamespaceFieldPaths` | Scoped workspace env helpers |
70
+
71
+ Raw reads resolve **entity name + content type** to Mongo via descriptors — they do not accept arbitrary collection names.
72
+
73
+ ---
74
+
75
+ ## Content objects
76
+
77
+ | Export | Purpose |
78
+ |--------|---------|
79
+ | `fetchMemorixContentObject(client, ...)` | Fetch full content from GCS/S3 via host-injected `contentReaders` |
80
+ | `resolveMemorixContentObject` / `shapeContentForList` / `shapeContentForItem` | Content object parsing and shaping |
81
+
82
+ ---
83
+
84
+ ## Catalox seed helpers (library)
85
+
86
+ Build/apply logic for default descriptors lives in **`src/seeds/`** and is exported for scripts and host tooling. Runtime retrieval does not seed Catalox automatically.
87
+
88
+ | Export | Purpose |
89
+ |--------|---------|
90
+ | `buildMemorixRetrievalSeedManifest` | Build preset manifest from `readJson` + scope |
91
+ | `buildMemorixRetrievalSeedManifestFromInputs` | Build from `catalox-seeds/inputs/` on disk |
92
+ | `checkMemorixRetrievalSeedNeeds` | Compare expected vs present catalog item ids |
93
+ | `prepareMemorixRetrievalSeedManifestForCataloxApply` | Merge `scope` into item `data` for Catalox upsert |
94
+ | `listExpectedMemorixRetrievalSeedItemIds` | Expected ids per catalog (10 items shipped) |
95
+ | `MEMORIX_RETRIEVAL_SEED_CATALOGS` | Catalog spec (ids, input files, native fields) |
96
+
97
+ Scripts (not imported by hosts at runtime):
98
+
99
+ | Script | Purpose |
100
+ |--------|---------|
101
+ | `scripts/build-seed-manifest.mjs` | Write `catalox-seeds/memorix-retrieval-descriptors.manifest.json` |
102
+ | `scripts/apply-seed-manifest.mjs` | Apply manifest to Catalox |
103
+ | `scripts/ensure-catalox-seed.mjs` | Check + apply only when items missing (`--dry-run`, `--force`, `--build`) |
104
+
105
+ ---
106
+
107
+ ## Advanced / escape hatches
108
+
109
+ | Export | Purpose |
110
+ |--------|---------|
111
+ | `memorixRead` | Low-level read with entity context (Mongo default; optional Xronox) |
112
+ | `readMemorixCollection` / `countMemorixCollection` / `connectMemorixMongo` | Direct Mongo helpers |
113
+ | `resolveMemorixCollectionName` / `resolveMemorixDbNameForEntity` | Resolution utilities |
114
+ | Env helpers: `resolveMemorixDbName`, `resolveMongoUri`, `targetCollectionEnvKey` | Advanced overrides |
115
+
116
+ Pass `xronox` to `createMemorixRetrieval` only when injecting a pre-configured Xronox client.
117
+
118
+ ---
119
+
120
+ ## Catalog constants
121
+
122
+ | Export | Value |
123
+ |--------|-------|
124
+ | `MEMORIX_APP_ID` | `memorix` |
125
+ | `MEMORIX_ENTITY_DESCRIPTORS_CATALOG` | `memorix-entity-descriptors` |
126
+ | `MEMORIX_LIST_DESCRIPTORS_CATALOG` | `memorix-list-descriptors` |
127
+ | `MEMORIX_ITEM_DESCRIPTORS_CATALOG` | `memorix-item-descriptors` |
128
+
129
+ ---
130
+
131
+ ## Host rules
132
+
133
+ 1. **Entity existence** — from `discoverMemorixEntities` only.
134
+ 2. **List columns / detail layout** — from list/item descriptors only.
135
+ 3. **Mongo targeting** — from entity descriptor `target` + content types; override via env only when documented as advanced.
136
+ 4. **No credentials in descriptors** — inject storage clients via `contentReaders`.
137
+
138
+ Types: `MemorixEntityDescriptor`, `MemorixListDescriptor`, `MemorixItemDescriptor`, `MemorixRetrievalClient`, `FetchMemorixListRequest`, `FetchMemorixItemRequest`, `MemorixRetrievalIssue`.
@@ -1,6 +1,8 @@
1
- # Explorer host APIs (v1.2)
1
+ # Explorer host APIs
2
2
 
3
- Optional exports for host applications such as **memorix-explorer** that need graph/count/list operations without going through list/item descriptors.
3
+ Optional exports from **`@x12i/memorix-retrieval`** for host applications such as **memorix-explorer** that need graph, count, or namespace-scoped reads in addition to descriptor-driven list/item APIs.
4
+
5
+ Full export list: [DATA-TIER-CONTRACT.md](./DATA-TIER-CONTRACT.md).
4
6
 
5
7
  ## Stack bootstrap
6
8
 
@@ -12,22 +14,22 @@ const { client, cataloxBound, appId } = await createMemorixRetrievalStackFromEnv
12
14
  });
13
15
  ```
14
16
 
15
- Uses `createCataloxFromEnv` + `createCataloxAdapterFromBound` + `createMemorixRetrievalFromEnv` in one call.
17
+ Uses `createCataloxFromEnv` + `createCataloxAdapterFromBound` + `createMemorixRetrievalFromEnv` in one call. App id resolves from option → `CATALOX_APP_ID` → `MEMORIX_APP_ID` → `memorix`.
16
18
 
17
19
  ## Entity discovery
18
20
 
19
- - `discoverMemorixEntities(client)` — lists `memorix-entity-descriptors` via Catalox, or `MEMORIX_ENTITY_NAMES` env override.
21
+ - `discoverMemorixEntities(client)` — lists `memorix-entity-descriptors` via Catalox only (`source: "catalox" | "none"`). No env entity list fallback.
20
22
  - `buildMemorixEntityGraph(client)` — discovery + per–content-type counts + **relations from entity descriptors**.
21
23
  - `buildMemorixEntitySlices(client, entityName)` — slice counts for canvas drill-down.
22
24
 
23
25
  ## Raw collection reads (Explorer compatibility)
24
26
 
27
+ Descriptor-resolved reads by **entity name + content type** (not arbitrary collection names):
28
+
25
29
  - `countMemorixEntityContentTypeDocuments`
26
30
  - `listMemorixEntityContentTypeDocuments`
27
31
  - `getMemorixEntityContentTypeDocument`
28
32
 
29
- Resolve collection names and DB targets from entity descriptors.
30
-
31
33
  ## Scoped workspace
32
34
 
33
35
  - `listScopedWorkspaceEntityTypes` / `listScopedWorkspaceDocuments` / `countScopedWorkspaceDocuments`