@x12i/memorix-retrieval 1.35.0 → 1.37.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 (114) hide show
  1. package/catalox-seeds/inputs/entity-descriptors/assets.json +166 -0
  2. package/catalox-seeds/inputs/entity-descriptors/subnets.json +115 -1
  3. package/catalox-seeds/inputs/entity-descriptors/topology-zones.json +52 -1
  4. package/catalox-seeds/inputs/entity-descriptors/vulnerabilities-groups.json +10 -2
  5. package/catalox-seeds/inputs/entity-descriptors/vulnerabilities.json +79 -7
  6. package/catalox-seeds/inputs/graph-descriptors/asset-subnet-paths-graph.json +41 -0
  7. package/catalox-seeds/inputs/graph-descriptors/asset-topology-vulnerabilities-graph.json +81 -0
  8. package/catalox-seeds/inputs/graph-descriptors/asset-vulnerability-group-graph.json +38 -0
  9. package/catalox-seeds/inputs/graph-descriptors/vulnerability-asset-subnet-graph.json +40 -0
  10. package/catalox-seeds/inputs/list-descriptors/assets-exploitability-decisions-list.json +4 -0
  11. package/catalox-seeds/inputs/list-descriptors/assets-potential-impact-decisions-list.json +16 -8
  12. package/catalox-seeds/inputs/manifest.json +4 -0
  13. package/catalox-seeds/inputs/memorix-catalog-ids.json +2 -1
  14. package/catalox-seeds/memorix-retrieval-descriptors.manifest.json +1186 -34
  15. package/dist/client/catalox-adapter.d.ts.map +1 -1
  16. package/dist/client/catalox-adapter.js +10 -1
  17. package/dist/client/catalox-adapter.js.map +1 -1
  18. package/dist/client/catalox-like.d.ts +6 -0
  19. package/dist/client/catalox-like.d.ts.map +1 -1
  20. package/dist/data/identity.d.ts +19 -1
  21. package/dist/data/identity.d.ts.map +1 -1
  22. package/dist/data/identity.js +41 -25
  23. package/dist/data/identity.js.map +1 -1
  24. package/dist/data/record-info.d.ts +1 -1
  25. package/dist/data/record-info.d.ts.map +1 -1
  26. package/dist/descriptors/catalog-ids.d.ts +1 -0
  27. package/dist/descriptors/catalog-ids.d.ts.map +1 -1
  28. package/dist/descriptors/catalog-ids.js +1 -0
  29. package/dist/descriptors/catalog-ids.js.map +1 -1
  30. package/dist/descriptors/descriptor-types.d.ts +3 -1
  31. package/dist/descriptors/descriptor-types.d.ts.map +1 -1
  32. package/dist/errors/issues.d.ts +2 -0
  33. package/dist/errors/issues.d.ts.map +1 -1
  34. package/dist/errors/issues.js.map +1 -1
  35. package/dist/graphs/build-graph-directory.d.ts +28 -0
  36. package/dist/graphs/build-graph-directory.d.ts.map +1 -0
  37. package/dist/graphs/build-graph-directory.js +253 -0
  38. package/dist/graphs/build-graph-directory.js.map +1 -0
  39. package/dist/graphs/build-graph-document.d.ts +13 -0
  40. package/dist/graphs/build-graph-document.d.ts.map +1 -0
  41. package/dist/graphs/build-graph-document.js +888 -0
  42. package/dist/graphs/build-graph-document.js.map +1 -0
  43. package/dist/graphs/fallback-graph-capabilities.d.ts +16 -0
  44. package/dist/graphs/fallback-graph-capabilities.d.ts.map +1 -0
  45. package/dist/graphs/fallback-graph-capabilities.js +376 -0
  46. package/dist/graphs/fallback-graph-capabilities.js.map +1 -0
  47. package/dist/graphs/index.d.ts +9 -0
  48. package/dist/graphs/index.d.ts.map +1 -0
  49. package/dist/graphs/index.js +8 -0
  50. package/dist/graphs/index.js.map +1 -0
  51. package/dist/graphs/infer-graph-descriptor.d.ts +17 -0
  52. package/dist/graphs/infer-graph-descriptor.d.ts.map +1 -0
  53. package/dist/graphs/infer-graph-descriptor.js +234 -0
  54. package/dist/graphs/infer-graph-descriptor.js.map +1 -0
  55. package/dist/graphs/load-graph-descriptor.d.ts +31 -0
  56. package/dist/graphs/load-graph-descriptor.d.ts.map +1 -0
  57. package/dist/graphs/load-graph-descriptor.js +141 -0
  58. package/dist/graphs/load-graph-descriptor.js.map +1 -0
  59. package/dist/graphs/record-access.d.ts +36 -0
  60. package/dist/graphs/record-access.d.ts.map +1 -0
  61. package/dist/graphs/record-access.js +178 -0
  62. package/dist/graphs/record-access.js.map +1 -0
  63. package/dist/graphs/types.d.ts +70 -0
  64. package/dist/graphs/types.d.ts.map +1 -0
  65. package/dist/graphs/types.js +17 -0
  66. package/dist/graphs/types.js.map +1 -0
  67. package/dist/graphs/validate-graph-metadata.d.ts +36 -0
  68. package/dist/graphs/validate-graph-metadata.d.ts.map +1 -0
  69. package/dist/graphs/validate-graph-metadata.js +71 -0
  70. package/dist/graphs/validate-graph-metadata.js.map +1 -0
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +1 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/retrieval/fetch-list.d.ts.map +1 -1
  76. package/dist/retrieval/fetch-list.js +3 -1
  77. package/dist/retrieval/fetch-list.js.map +1 -1
  78. package/dist/retrieval/resolve-fields.d.ts.map +1 -1
  79. package/dist/retrieval/resolve-fields.js +7 -1
  80. package/dist/retrieval/resolve-fields.js.map +1 -1
  81. package/dist/retrieval/resolve-list-analytics.d.ts +2 -2
  82. package/dist/retrieval/resolve-list-analytics.d.ts.map +1 -1
  83. package/dist/retrieval/resolve-list-analytics.js.map +1 -1
  84. package/dist/retrieval/resolve-property-source.d.ts.map +1 -1
  85. package/dist/retrieval/resolve-property-source.js +10 -3
  86. package/dist/retrieval/resolve-property-source.js.map +1 -1
  87. package/dist/seeds/default-seed-spec.d.ts.map +1 -1
  88. package/dist/seeds/default-seed-spec.js +25 -1
  89. package/dist/seeds/default-seed-spec.js.map +1 -1
  90. package/dist/tests/catalox-adapter-scope.test.d.ts +2 -0
  91. package/dist/tests/catalox-adapter-scope.test.d.ts.map +1 -0
  92. package/dist/tests/catalox-adapter-scope.test.js +26 -0
  93. package/dist/tests/catalox-adapter-scope.test.js.map +1 -0
  94. package/dist/tests/fetch-list.test.js +28 -0
  95. package/dist/tests/fetch-list.test.js.map +1 -1
  96. package/dist/tests/graphs.test.d.ts +2 -0
  97. package/dist/tests/graphs.test.d.ts.map +1 -0
  98. package/dist/tests/graphs.test.js +423 -0
  99. package/dist/tests/graphs.test.js.map +1 -0
  100. package/dist/tests/identity.test.js +13 -1
  101. package/dist/tests/identity.test.js.map +1 -1
  102. package/dist/tests/infer-graph.test.d.ts +2 -0
  103. package/dist/tests/infer-graph.test.d.ts.map +1 -0
  104. package/dist/tests/infer-graph.test.js +19 -0
  105. package/dist/tests/infer-graph.test.js.map +1 -0
  106. package/dist/tests/resolve-filters.test.js +8 -0
  107. package/dist/tests/resolve-filters.test.js.map +1 -1
  108. package/dist/tests/seed-manifest.test.js +3 -0
  109. package/dist/tests/seed-manifest.test.js.map +1 -1
  110. package/dist/tests/validate-graph-metadata.test.d.ts +2 -0
  111. package/dist/tests/validate-graph-metadata.test.d.ts.map +1 -0
  112. package/dist/tests/validate-graph-metadata.test.js +81 -0
  113. package/dist/tests/validate-graph-metadata.test.js.map +1 -0
  114. package/package.json +13 -2
@@ -0,0 +1,234 @@
1
+ import { discoverMemorixEntities } from "../descriptors/discover-entities.js";
2
+ import { loadMemorixEntityDescriptorByName } from "../descriptors/discover-entities.js";
3
+ import { entityDescriptorConnections } from "../descriptors/discover-entities.js";
4
+ function slugTemplateId(source, target, sourcePath) {
5
+ const pathSlug = sourcePath
6
+ .replace(/^data\./, "")
7
+ .replace(/[^a-zA-Z0-9]+/g, "-")
8
+ .replace(/^-|-$/g, "")
9
+ .toLowerCase();
10
+ return `schema-${source}-to-${target}-${pathSlug || "join"}`;
11
+ }
12
+ function humanizeGraphId(graphId) {
13
+ return graphId
14
+ .replace(/-graph$/i, "")
15
+ .split("-")
16
+ .filter(Boolean)
17
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
18
+ .join(" ");
19
+ }
20
+ export function guessFocusObjectTypeFromGraphId(graphId, objectTypes) {
21
+ if (!objectTypes.length)
22
+ return null;
23
+ const stem = graphId.replace(/-graph$/i, "").toLowerCase();
24
+ if (objectTypes.includes(stem))
25
+ return stem;
26
+ const scored = [];
27
+ for (const ot of objectTypes) {
28
+ const singular = ot.endsWith("s") ? ot.slice(0, -1) : ot;
29
+ const candidates = [ot, singular].filter((c) => c.length >= 3);
30
+ let bestIndex = -1;
31
+ let bestScore = 0;
32
+ for (const candidate of candidates) {
33
+ const idx = stem.indexOf(candidate);
34
+ if (idx < 0)
35
+ continue;
36
+ const score = 1000 - idx + (candidate === ot ? 5 : 0) + candidate.length;
37
+ if (bestIndex < 0 || idx < bestIndex || (idx === bestIndex && score > bestScore)) {
38
+ bestIndex = idx;
39
+ bestScore = score;
40
+ }
41
+ }
42
+ if (bestIndex >= 0)
43
+ scored.push({ ot, score: bestScore, index: bestIndex });
44
+ }
45
+ scored.sort((a, b) => a.index - b.index || b.score - a.score);
46
+ return scored[0]?.ot ?? objectTypes[0] ?? null;
47
+ }
48
+ /**
49
+ * Lightweight schema-only guess (no Hippox). Uses entity.relations as queryByField templates.
50
+ */
51
+ export async function inferGraphDescriptorFromSchema(client, graphId, focusObjectTypeHint) {
52
+ const discovery = await discoverMemorixEntities(client);
53
+ const objectTypes = discovery.summaries.map((s) => s.entityName).filter(Boolean);
54
+ if (objectTypes.length < 1)
55
+ return null;
56
+ const focusObjectType = focusObjectTypeHint ?? guessFocusObjectTypeFromGraphId(graphId, objectTypes);
57
+ if (!focusObjectType)
58
+ return null;
59
+ const entityCapabilities = {};
60
+ const includeEdgeTemplates = [];
61
+ const related = new Set([focusObjectType]);
62
+ const warnings = [];
63
+ for (const ot of objectTypes) {
64
+ try {
65
+ const entity = await loadMemorixEntityDescriptorByName(client, ot);
66
+ const kind = entity.graph?.node?.kind ??
67
+ (ot.replace(/s$/, "") || ot);
68
+ entityCapabilities[ot] = {
69
+ node: {
70
+ kind,
71
+ contentLenses: entity.graph?.node
72
+ ?.contentLenses ?? ["snapshot"],
73
+ directoryFields: entity.graph?.node
74
+ ?.directoryFields ?? [],
75
+ },
76
+ edgeTemplates: [],
77
+ };
78
+ // Prefer authored graph.edgeTemplates when present.
79
+ const authored = entity.graph;
80
+ if (authored?.edgeTemplates?.length) {
81
+ entityCapabilities[ot] = {
82
+ node: {
83
+ ...entityCapabilities[ot].node,
84
+ ...authored.node,
85
+ },
86
+ edgeTemplates: [...authored.edgeTemplates],
87
+ };
88
+ for (const t of authored.edgeTemplates) {
89
+ includeEdgeTemplates.push(t.id);
90
+ for (const e of t.edges)
91
+ related.add(e.toObjectType);
92
+ }
93
+ continue;
94
+ }
95
+ for (const conn of entityDescriptorConnections(entity)) {
96
+ if (!objectTypes.includes(conn.targetEntityName))
97
+ continue;
98
+ const templateId = slugTemplateId(ot, conn.targetEntityName, conn.sourceProperty);
99
+ includeEdgeTemplates.push(templateId);
100
+ related.add(conn.targetEntityName);
101
+ entityCapabilities[ot].edgeTemplates.push({
102
+ id: templateId,
103
+ source: {
104
+ kind: "queryByField",
105
+ objectType: conn.targetEntityName,
106
+ sourcePath: conn.sourceProperty,
107
+ targetPath: conn.targetProperty,
108
+ limit: 50,
109
+ },
110
+ edges: [
111
+ {
112
+ type: `linksTo${conn.targetEntityName
113
+ .split("-")
114
+ .map((p) => p.charAt(0).toUpperCase() + p.slice(1))
115
+ .join("")}`,
116
+ from: { source: "concept" },
117
+ to: { source: "relatedConcept" },
118
+ toObjectType: conn.targetEntityName,
119
+ toKind: entityCapabilities[conn.targetEntityName]?.node.kind ??
120
+ conn.targetEntityName,
121
+ neighbor: "to",
122
+ },
123
+ ],
124
+ });
125
+ }
126
+ }
127
+ catch {
128
+ warnings.push(`Could not load entity descriptor for ${ot}`);
129
+ }
130
+ }
131
+ // Restrict to neighborhood of focus using authored/schema edges only.
132
+ const adjacency = new Map();
133
+ for (const [ot, cap] of Object.entries(entityCapabilities)) {
134
+ for (const t of cap.edgeTemplates ?? []) {
135
+ for (const e of t.edges) {
136
+ if (!adjacency.has(ot))
137
+ adjacency.set(ot, new Set());
138
+ adjacency.get(ot).add(e.toObjectType);
139
+ }
140
+ }
141
+ }
142
+ const reachable = new Set([focusObjectType]);
143
+ const queue = [focusObjectType];
144
+ while (queue.length) {
145
+ const cur = queue.shift();
146
+ for (const next of adjacency.get(cur) ?? []) {
147
+ if (reachable.has(next))
148
+ continue;
149
+ reachable.add(next);
150
+ queue.push(next);
151
+ }
152
+ }
153
+ const filteredTemplates = includeEdgeTemplates.filter((id) => {
154
+ for (const [ot, cap] of Object.entries(entityCapabilities)) {
155
+ if (!reachable.has(ot))
156
+ continue;
157
+ if (cap.edgeTemplates?.some((t) => t.id === id))
158
+ return true;
159
+ }
160
+ return false;
161
+ });
162
+ const nodes = [...reachable].sort((a, b) => {
163
+ if (a === focusObjectType)
164
+ return -1;
165
+ if (b === focusObjectType)
166
+ return 1;
167
+ return a.localeCompare(b);
168
+ });
169
+ if (filteredTemplates.length === 0 && nodes.length === 1) {
170
+ warnings.push("Schema inference found no relations from focus object type.");
171
+ }
172
+ const descriptor = {
173
+ id: graphId,
174
+ title: humanizeGraphId(graphId),
175
+ focusObjectType,
176
+ maxDepth: 2,
177
+ includeEdgeTemplates: filteredTemplates,
178
+ tiers: [
179
+ { id: "focus", label: "Focus", objectTypes: [focusObjectType] },
180
+ ...(nodes.filter((n) => n !== focusObjectType).length
181
+ ? [
182
+ {
183
+ id: "related",
184
+ label: "Related",
185
+ objectTypes: nodes.filter((n) => n !== focusObjectType),
186
+ },
187
+ ]
188
+ : []),
189
+ ],
190
+ nodes: nodes.map((ot) => ({
191
+ objectType: ot,
192
+ kind: entityCapabilities[ot]?.node.kind,
193
+ tier: ot === focusObjectType ? "focus" : "related",
194
+ })),
195
+ directory: {
196
+ defaultObjectTypes: nodes,
197
+ searchFields: ["title", "identifierKey"],
198
+ },
199
+ ui: { icon: "network", group: "inferred", order: 100 },
200
+ };
201
+ return { descriptor, entityCapabilities, warnings };
202
+ }
203
+ /**
204
+ * Prefer Hippox (schema + fuzzy). Fall back to schema-only if Hippox is unavailable.
205
+ */
206
+ export async function inferGraphDescriptorBundle(client, graphId) {
207
+ try {
208
+ const hippox = await import("@x12i/memorix-hippox");
209
+ const guess = await hippox.guessMemorixGraphDescriptor({
210
+ retrieval: client,
211
+ graphId,
212
+ processEnv: client.processEnv,
213
+ sampleLimit: 200,
214
+ minInclusionRatio: 0.5,
215
+ minConfidence: 0.35,
216
+ });
217
+ if (guess) {
218
+ return {
219
+ descriptor: guess.descriptor,
220
+ entityCapabilities: guess.entityCapabilities,
221
+ warnings: guess.warnings,
222
+ };
223
+ }
224
+ }
225
+ catch (err) {
226
+ const message = err instanceof Error ? err.message : String(err);
227
+ // Package missing or runtime failure → schema-only path.
228
+ if (!message.includes("Cannot find package") && !message.includes("Cannot find module")) {
229
+ // Still try schema; keep going.
230
+ }
231
+ }
232
+ return inferGraphDescriptorFromSchema(client, graphId);
233
+ }
234
+ //# sourceMappingURL=infer-graph-descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-graph-descriptor.js","sourceRoot":"","sources":["../../src/graphs/infer-graph-descriptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type MemorixEntityGraphCapability, type MemorixGraphDescriptor } from "@x12i/memorix-descriptors";
2
+ import type { MemorixRetrievalClient } from "../client/types.js";
3
+ export { DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH } from "./fallback-graph-capabilities.js";
4
+ export type MemorixGraphDescriptorSource = "catalox" | "inferred" | "fallback";
5
+ export type MemorixGraphDescriptorResolution = {
6
+ descriptor: MemorixGraphDescriptor;
7
+ /** False when Catalox has no graph descriptor item (inferred or bundled fallback used). */
8
+ defined: boolean;
9
+ source: MemorixGraphDescriptorSource;
10
+ /** Synthesized entity graph capabilities when source is inferred. */
11
+ inferredCapabilities?: Record<string, MemorixEntityGraphCapability>;
12
+ inferenceWarnings?: string[];
13
+ /** Agent scope observed on the Catalox catalog item (when present). */
14
+ scopeAgents?: string[];
15
+ };
16
+ export declare function resolveMemorixGraphDescriptor(client: MemorixRetrievalClient, graphId: string, options?: {
17
+ agentId?: string;
18
+ }): Promise<MemorixGraphDescriptorResolution>;
19
+ export declare function loadMemorixGraphDescriptor(client: MemorixRetrievalClient, graphId: string, options?: {
20
+ agentId?: string;
21
+ }): Promise<MemorixGraphDescriptor>;
22
+ export declare function listMemorixGraphDescriptors(client: MemorixRetrievalClient, options?: {
23
+ agentId?: string;
24
+ }): Promise<Array<{
25
+ id: string;
26
+ title: string;
27
+ defined: boolean;
28
+ source: MemorixGraphDescriptorSource;
29
+ scopeAgents?: string[];
30
+ }>>;
31
+ //# sourceMappingURL=load-graph-descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-graph-descriptor.d.ts","sourceRoot":"","sources":["../../src/graphs/load-graph-descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC5B,MAAM,2BAA2B,CAAC;AAMnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAIjE,OAAO,EAAE,4CAA4C,EAAE,MAAM,kCAAkC,CAAC;AAEhG,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/E,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,sBAAsB,CAAC;IACnC,2FAA2F;IAC3F,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,4BAA4B,CAAC;IACrC,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IACpE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAsCF,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,gCAAgC,CAAC,CA+D3C;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAGjC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CACR,KAAK,CAAC;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,4BAA4B,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CACH,CA4DA"}
@@ -0,0 +1,141 @@
1
+ import { MEMORIX_GRAPH_DESCRIPTORS_CATALOG, } from "@x12i/memorix-descriptors";
2
+ import { extractScopeFromData, mergeCatalogItemScopeIntoData, objectTypeMatchesAgent, } from "@x12i/memorix-agents";
3
+ import { DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH } from "./fallback-graph-capabilities.js";
4
+ import { inferGraphDescriptorBundle } from "./infer-graph-descriptor.js";
5
+ export { DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH } from "./fallback-graph-capabilities.js";
6
+ function asGraphDescriptor(data) {
7
+ return data;
8
+ }
9
+ function isCatalogMissingError(err) {
10
+ const message = err instanceof Error ? err.message : String(err);
11
+ return (message.includes("Catalog not found") ||
12
+ message.includes("Access denied for catalog") ||
13
+ message.includes("binding_not_found_or_inactive"));
14
+ }
15
+ function scopeAgentsFromCatalogItem(item) {
16
+ const merged = mergeCatalogItemScopeIntoData(item);
17
+ return extractScopeFromData(merged).agents;
18
+ }
19
+ function assertAgentAllowed(scopeAgents, agentId, graphId) {
20
+ if (!agentId)
21
+ return;
22
+ const scope = { domains: [], agents: scopeAgents ?? [] };
23
+ if (!objectTypeMatchesAgent(scope, agentId)) {
24
+ throw new Error(`Graph descriptor "${graphId}" is out of scope for agentId="${agentId}"`);
25
+ }
26
+ }
27
+ export async function resolveMemorixGraphDescriptor(client, graphId, options) {
28
+ const agentId = options?.agentId?.trim() || undefined;
29
+ try {
30
+ const result = await client.catalox.getCatalogItem({ appId: client.appId }, MEMORIX_GRAPH_DESCRIPTORS_CATALOG, graphId);
31
+ if (result.outcome === "found" && result.item?.data) {
32
+ const scopeAgents = scopeAgentsFromCatalogItem({
33
+ data: result.item.data,
34
+ scope: result.item.scope,
35
+ metadata: result.item
36
+ .metadata,
37
+ });
38
+ assertAgentAllowed(scopeAgents, agentId, graphId);
39
+ return {
40
+ descriptor: asGraphDescriptor(result.item.data),
41
+ defined: true,
42
+ source: "catalox",
43
+ scopeAgents,
44
+ };
45
+ }
46
+ }
47
+ catch (err) {
48
+ if (err instanceof Error && err.message.includes("out of scope"))
49
+ throw err;
50
+ if (!isCatalogMissingError(err))
51
+ throw err;
52
+ }
53
+ // Prefer Hippox / schema inference over static bundled fallback.
54
+ try {
55
+ const inferred = await inferGraphDescriptorBundle(client, graphId);
56
+ if (inferred?.descriptor) {
57
+ const hasStructure = (inferred.descriptor.includeEdgeTemplates?.length ?? 0) > 0 ||
58
+ (inferred.descriptor.nodes?.length ?? 0) > 0;
59
+ if (hasStructure) {
60
+ // Inferred descriptors inherit neo product scope for cyber deployments.
61
+ assertAgentAllowed(["neo"], agentId, graphId);
62
+ return {
63
+ descriptor: inferred.descriptor,
64
+ defined: false,
65
+ source: "inferred",
66
+ inferredCapabilities: inferred.entityCapabilities,
67
+ inferenceWarnings: inferred.warnings,
68
+ scopeAgents: ["neo"],
69
+ };
70
+ }
71
+ }
72
+ }
73
+ catch (err) {
74
+ if (err instanceof Error && err.message.includes("out of scope"))
75
+ throw err;
76
+ // Fall through to bundled fallback / error.
77
+ }
78
+ if (graphId === DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH.id) {
79
+ assertAgentAllowed(["neo"], agentId, graphId);
80
+ return {
81
+ descriptor: DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH,
82
+ defined: false,
83
+ source: "fallback",
84
+ scopeAgents: ["neo"],
85
+ };
86
+ }
87
+ throw new Error(`Graph descriptor not found: ${graphId}`);
88
+ }
89
+ export async function loadMemorixGraphDescriptor(client, graphId, options) {
90
+ const resolved = await resolveMemorixGraphDescriptor(client, graphId, options);
91
+ return resolved.descriptor;
92
+ }
93
+ export async function listMemorixGraphDescriptors(client, options) {
94
+ const agentId = options?.agentId?.trim() || undefined;
95
+ const fallback = [
96
+ {
97
+ id: DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH.id,
98
+ title: DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH.title,
99
+ defined: false,
100
+ source: "fallback",
101
+ scopeAgents: ["neo"],
102
+ },
103
+ ].filter((g) => objectTypeMatchesAgent({ domains: [], agents: g.scopeAgents }, agentId));
104
+ const listFn = client.catalox.listCatalogItems;
105
+ if (!listFn)
106
+ return fallback;
107
+ try {
108
+ const page = await listFn({ appId: client.appId }, MEMORIX_GRAPH_DESCRIPTORS_CATALOG, { limit: 200, offset: 0 });
109
+ const items = (page.items ?? [])
110
+ .map((item) => {
111
+ const scopeAgents = scopeAgentsFromCatalogItem({
112
+ data: item.data,
113
+ scope: item.scope,
114
+ metadata: item
115
+ .metadata,
116
+ });
117
+ return {
118
+ id: String(item.data.id ?? item.id),
119
+ title: String(item.data.title ?? item.title ?? item.id),
120
+ defined: true,
121
+ source: "catalox",
122
+ scopeAgents,
123
+ };
124
+ })
125
+ .filter((g) => objectTypeMatchesAgent({ domains: [], agents: g.scopeAgents ?? [] }, agentId));
126
+ if (items.length === 0 ||
127
+ !items.some((i) => i.id === DEFAULT_ASSET_TOPOLOGY_VULNERABILITIES_GRAPH.id)) {
128
+ const profile = client.processEnv?.MEMORIX_DEPLOYMENT_PROFILE?.trim();
129
+ if (profile !== "ebook") {
130
+ items.unshift(...fallback);
131
+ }
132
+ }
133
+ return items;
134
+ }
135
+ catch (err) {
136
+ if (isCatalogMissingError(err))
137
+ return fallback;
138
+ throw err;
139
+ }
140
+ }
141
+ //# sourceMappingURL=load-graph-descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-graph-descriptor.js","sourceRoot":"","sources":["../../src/graphs/load-graph-descriptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { MemorixEntityDescriptor } from "../descriptors/descriptor-types.js";
2
+ import type { MemorixRetrievalClient } from "../client/types.js";
3
+ import type { JsonObject, MemorixGraphConcept, MemorixGraphContent } from "./types.js";
4
+ /**
5
+ * Infer snapshot objectType from an identifierKey kind prefix (e.g. `cidr:…` → subnets).
6
+ * Uses descriptor node `kind` when set, otherwise fallback/inferred entity graph kinds.
7
+ */
8
+ export declare function guessObjectTypeFromIdentifierKey(identifierKey: string, nodes: ReadonlyArray<{
9
+ objectType: string;
10
+ kind?: string;
11
+ }>, kindByObjectType?: Readonly<Record<string, string | undefined>>): string | undefined;
12
+ /** Ordered object types to try when resolving a Directory/Focus selection. */
13
+ export declare function focusLookupObjectTypes(input: {
14
+ focusObjectType: string;
15
+ focusIdentifierKey?: string;
16
+ nodes: ReadonlyArray<{
17
+ objectType: string;
18
+ kind?: string;
19
+ }>;
20
+ kindByObjectType?: Readonly<Record<string, string | undefined>>;
21
+ }): string[];
22
+ export declare function conceptFromRecord(doc: JsonObject): MemorixGraphConcept | null;
23
+ export declare function loadEntity(client: MemorixRetrievalClient, objectType: string): Promise<MemorixEntityDescriptor>;
24
+ export declare function findSnapshotByRecordId(client: MemorixRetrievalClient, objectType: string, recordId: string): Promise<JsonObject | null>;
25
+ export declare function findSnapshotByIdentifierKey(client: MemorixRetrievalClient, objectType: string, identifierKey: string): Promise<JsonObject | null>;
26
+ export declare function listSnapshots(client: MemorixRetrievalClient, objectType: string, options?: {
27
+ query?: JsonObject;
28
+ limit?: number;
29
+ offset?: number;
30
+ }): Promise<JsonObject[]>;
31
+ export declare function countSnapshots(client: MemorixRetrievalClient, objectType: string, options?: {
32
+ query?: JsonObject;
33
+ }): Promise<number>;
34
+ export declare function fetchContentLenses(client: MemorixRetrievalClient, objectType: string, recordId: string, lenses: string[]): Promise<MemorixGraphContent>;
35
+ export declare function recordIdOf(doc: JsonObject): string;
36
+ //# sourceMappingURL=record-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-access.d.ts","sourceRoot":"","sources":["../../src/graphs/record-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAQjE,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGvF;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,aAAa,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAC9D,MAAM,GAAG,SAAS,CAcpB;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACjE,GAAG,MAAM,EAAE,CAiBX;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,mBAAmB,GAAG,IAAI,CA2B7E;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkB5B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAW5B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAA;CAAO,GACnC,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,mBAAmB,CAAC,CA8C9B;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAElD"}
@@ -0,0 +1,178 @@
1
+ import { resolveMemorixCollectionName } from "../data/collection-name.js";
2
+ import { memorixReadByTarget } from "../data/target-read.js";
3
+ import { loadMemorixEntityDescriptorByName } from "../descriptors/discover-entities.js";
4
+ import { resolveMemorixTargetFromDescriptor, } from "../mongo/target-config.js";
5
+ import { readRecordId } from "@x12i/memorix-descriptors";
6
+ import { graphLensForStorageContentType, storageContentTypeForLens } from "./types.js";
7
+ /**
8
+ * Infer snapshot objectType from an identifierKey kind prefix (e.g. `cidr:…` → subnets).
9
+ * Uses descriptor node `kind` when set, otherwise fallback/inferred entity graph kinds.
10
+ */
11
+ export function guessObjectTypeFromIdentifierKey(identifierKey, nodes, kindByObjectType) {
12
+ const colon = identifierKey.indexOf(":");
13
+ if (colon <= 0)
14
+ return undefined;
15
+ const kind = identifierKey.slice(0, colon);
16
+ if (!kind)
17
+ return undefined;
18
+ const byExplicit = nodes.find((n) => n.kind === kind);
19
+ if (byExplicit)
20
+ return byExplicit.objectType;
21
+ for (const n of nodes) {
22
+ const inferredKind = kindByObjectType?.[n.objectType] ?? n.kind;
23
+ if (inferredKind === kind)
24
+ return n.objectType;
25
+ }
26
+ return undefined;
27
+ }
28
+ /** Ordered object types to try when resolving a Directory/Focus selection. */
29
+ export function focusLookupObjectTypes(input) {
30
+ const ordered = [];
31
+ const add = (ot) => {
32
+ if (ot && !ordered.includes(ot))
33
+ ordered.push(ot);
34
+ };
35
+ if (input.focusIdentifierKey) {
36
+ add(guessObjectTypeFromIdentifierKey(input.focusIdentifierKey, input.nodes, input.kindByObjectType));
37
+ }
38
+ add(input.focusObjectType);
39
+ for (const n of input.nodes)
40
+ add(n.objectType);
41
+ return ordered;
42
+ }
43
+ export function conceptFromRecord(doc) {
44
+ const concept = doc.concept;
45
+ if (!concept || typeof concept !== "object" || Array.isArray(concept))
46
+ return null;
47
+ const c = concept;
48
+ const identifier = c.identifier;
49
+ if (!identifier || typeof identifier !== "object" || Array.isArray(identifier))
50
+ return null;
51
+ const id = identifier;
52
+ const kind = typeof id.kind === "string" ? id.kind : "";
53
+ const identifierKey = typeof id.identifierKey === "string"
54
+ ? id.identifierKey
55
+ : kind && id[kind] != null
56
+ ? `${kind}:${String(id[kind])}`
57
+ : "";
58
+ if (!kind || !identifierKey)
59
+ return null;
60
+ const title = typeof c.title === "string" && c.title.trim()
61
+ ? c.title
62
+ : String(id[kind] ?? identifierKey);
63
+ return {
64
+ identifier: {
65
+ ...id,
66
+ kind,
67
+ identifierKey,
68
+ },
69
+ title,
70
+ };
71
+ }
72
+ export async function loadEntity(client, objectType) {
73
+ return loadMemorixEntityDescriptorByName(client, objectType);
74
+ }
75
+ export async function findSnapshotByRecordId(client, objectType, recordId) {
76
+ const entity = await loadEntity(client, objectType);
77
+ const target = resolveMemorixTargetFromDescriptor(entity);
78
+ const collection = resolveMemorixCollectionName(entity, "snapshots", client.processEnv);
79
+ const docs = await memorixReadByTarget(client, {
80
+ target,
81
+ collection,
82
+ query: {
83
+ $or: [
84
+ { recordId },
85
+ { entityId: recordId },
86
+ { eventId: recordId },
87
+ { _id: recordId },
88
+ ],
89
+ },
90
+ limit: 1,
91
+ });
92
+ return docs[0] ?? null;
93
+ }
94
+ export async function findSnapshotByIdentifierKey(client, objectType, identifierKey) {
95
+ const entity = await loadEntity(client, objectType);
96
+ const target = resolveMemorixTargetFromDescriptor(entity);
97
+ const collection = resolveMemorixCollectionName(entity, "snapshots", client.processEnv);
98
+ const docs = await memorixReadByTarget(client, {
99
+ target,
100
+ collection,
101
+ query: { "concept.identifier.identifierKey": identifierKey },
102
+ limit: 1,
103
+ });
104
+ return docs[0] ?? null;
105
+ }
106
+ export async function listSnapshots(client, objectType, options = {}) {
107
+ const entity = await loadEntity(client, objectType);
108
+ const target = resolveMemorixTargetFromDescriptor(entity);
109
+ const collection = resolveMemorixCollectionName(entity, "snapshots", client.processEnv);
110
+ const docs = await memorixReadByTarget(client, {
111
+ target,
112
+ collection,
113
+ query: options.query ?? {},
114
+ limit: options.limit ?? 50,
115
+ skip: options.offset ?? 0,
116
+ });
117
+ return docs;
118
+ }
119
+ export async function countSnapshots(client, objectType, options = {}) {
120
+ const entity = await loadEntity(client, objectType);
121
+ const collection = resolveMemorixCollectionName(entity, "snapshots", client.processEnv);
122
+ const { memorixCount } = await import("../data/memorix-count.js");
123
+ return memorixCount(client, {
124
+ entity,
125
+ source: collection,
126
+ query: options.query ?? {},
127
+ });
128
+ }
129
+ export async function fetchContentLenses(client, objectType, recordId, lenses) {
130
+ const entity = await loadEntity(client, objectType);
131
+ const target = resolveMemorixTargetFromDescriptor(entity);
132
+ const content = {};
133
+ for (const lens of lenses) {
134
+ const storageCt = storageContentTypeForLens(lens);
135
+ if (!entity.contentTypes[storageCt] && storageCt !== "snapshots") {
136
+ // try alternate decision/decisions
137
+ const alt = storageCt === "decisions"
138
+ ? "decision"
139
+ : storageCt === "decision"
140
+ ? "decisions"
141
+ : null;
142
+ if (!alt || !entity.contentTypes[alt])
143
+ continue;
144
+ const collection = resolveMemorixCollectionName(entity, alt, client.processEnv);
145
+ const docs = await memorixReadByTarget(client, {
146
+ target,
147
+ collection,
148
+ query: { $or: [{ recordId }, { entityId: recordId }] },
149
+ limit: 1,
150
+ });
151
+ const doc = docs[0];
152
+ const data = doc?.data;
153
+ if (data && typeof data === "object" && !Array.isArray(data)) {
154
+ content[graphLensForStorageContentType(alt)] = data;
155
+ }
156
+ continue;
157
+ }
158
+ if (!entity.contentTypes[storageCt])
159
+ continue;
160
+ const collection = resolveMemorixCollectionName(entity, storageCt, client.processEnv);
161
+ const docs = await memorixReadByTarget(client, {
162
+ target,
163
+ collection,
164
+ query: { $or: [{ recordId }, { entityId: recordId }] },
165
+ limit: 1,
166
+ });
167
+ const doc = docs[0];
168
+ const data = doc?.data;
169
+ if (data && typeof data === "object" && !Array.isArray(data)) {
170
+ content[lens] = data;
171
+ }
172
+ }
173
+ return content;
174
+ }
175
+ export function recordIdOf(doc) {
176
+ return readRecordId(doc) || String(doc.entityId ?? doc.eventId ?? "");
177
+ }
178
+ //# sourceMappingURL=record-access.js.map