@x12i/memorix-retrieval 1.2.0 → 1.5.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.
- package/README.md +64 -24
- package/catalox-seeds/inputs/entity-descriptors/assets.json +2 -0
- package/catalox-seeds/inputs/entity-descriptors/variabilities-groups.json +2 -0
- package/catalox-seeds/inputs/entity-descriptors/vulnerabilities.json +2 -0
- package/catalox-seeds/inputs/list-descriptors/memorix-workspace-records-list.json +22 -0
- package/catalox-seeds/inputs/manifest.json +3 -1
- package/catalox-seeds/inputs/memorix-list-descriptors.catalog.json +22 -0
- package/catalox-seeds/inputs/memorix-list-descriptors.items.json +22 -0
- package/catalox-seeds/memorix-retrieval-descriptors.manifest.json +40 -0
- package/dist/client/create-client.js +2 -2
- package/dist/client/create-client.js.map +1 -1
- package/dist/client/create-stack-from-env.js +4 -6
- package/dist/client/create-stack-from-env.js.map +1 -1
- package/dist/client/types.d.ts +48 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/descriptors/descriptor-types.d.ts +35 -10
- package/dist/descriptors/descriptor-types.d.ts.map +1 -1
- package/dist/descriptors/discover-entities.d.ts +3 -1
- package/dist/descriptors/discover-entities.d.ts.map +1 -1
- package/dist/descriptors/discover-entities.js +14 -43
- package/dist/descriptors/discover-entities.js.map +1 -1
- package/dist/descriptors/load-list-descriptor.d.ts +5 -1
- package/dist/descriptors/load-list-descriptor.d.ts.map +1 -1
- package/dist/descriptors/load-list-descriptor.js +23 -3
- package/dist/descriptors/load-list-descriptor.js.map +1 -1
- package/dist/descriptors/resolve-app-id.d.ts +4 -0
- package/dist/descriptors/resolve-app-id.d.ts.map +1 -0
- package/dist/descriptors/resolve-app-id.js +8 -0
- package/dist/descriptors/resolve-app-id.js.map +1 -0
- package/dist/descriptors/resolve-default-descriptors.d.ts +11 -0
- package/dist/descriptors/resolve-default-descriptors.d.ts.map +1 -0
- package/dist/descriptors/resolve-default-descriptors.js +22 -0
- package/dist/descriptors/resolve-default-descriptors.js.map +1 -0
- package/dist/descriptors/validate-descriptor.d.ts +6 -2
- package/dist/descriptors/validate-descriptor.d.ts.map +1 -1
- package/dist/descriptors/validate-descriptor.js +42 -5
- package/dist/descriptors/validate-descriptor.js.map +1 -1
- package/dist/explorer/entity-graph.d.ts +3 -1
- package/dist/explorer/entity-graph.d.ts.map +1 -1
- package/dist/explorer/entity-graph.js +4 -0
- package/dist/explorer/entity-graph.js.map +1 -1
- package/dist/index.d.ts +16 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/retrieval/compose-row.d.ts +2 -2
- package/dist/retrieval/compose-row.d.ts.map +1 -1
- package/dist/retrieval/compose-row.js.map +1 -1
- package/dist/retrieval/fetch-for-entity.d.ts +18 -0
- package/dist/retrieval/fetch-for-entity.d.ts.map +1 -0
- package/dist/retrieval/fetch-for-entity.js +21 -0
- package/dist/retrieval/fetch-for-entity.js.map +1 -0
- package/dist/retrieval/fetch-list.d.ts.map +1 -1
- package/dist/retrieval/fetch-list.js +18 -3
- package/dist/retrieval/fetch-list.js.map +1 -1
- package/dist/retrieval/fetch-workspace-list.d.ts +4 -0
- package/dist/retrieval/fetch-workspace-list.d.ts.map +1 -0
- package/dist/retrieval/fetch-workspace-list.js +164 -0
- package/dist/retrieval/fetch-workspace-list.js.map +1 -0
- package/dist/retrieval/resolve-filters.d.ts +4 -2
- package/dist/retrieval/resolve-filters.d.ts.map +1 -1
- package/dist/retrieval/resolve-filters.js +24 -3
- package/dist/retrieval/resolve-filters.js.map +1 -1
- package/dist/retrieval/resolve-list-search.d.ts +6 -0
- package/dist/retrieval/resolve-list-search.d.ts.map +1 -0
- package/dist/retrieval/resolve-list-search.js +25 -0
- package/dist/retrieval/resolve-list-search.js.map +1 -0
- package/dist/retrieval/resolve-pagination-driver.d.ts +2 -2
- package/dist/retrieval/resolve-pagination-driver.d.ts.map +1 -1
- package/dist/retrieval/resolve-pagination-driver.js.map +1 -1
- package/dist/retrieval/resolve-sort.d.ts +2 -2
- package/dist/retrieval/resolve-sort.d.ts.map +1 -1
- package/dist/retrieval/resolve-sort.js.map +1 -1
- package/dist/seeds/build-manifest.d.ts +8 -0
- package/dist/seeds/build-manifest.d.ts.map +1 -0
- package/dist/seeds/build-manifest.js +83 -0
- package/dist/seeds/build-manifest.js.map +1 -0
- package/dist/seeds/check-needs-seed.d.ts +10 -0
- package/dist/seeds/check-needs-seed.d.ts.map +1 -0
- package/dist/seeds/check-needs-seed.js +66 -0
- package/dist/seeds/check-needs-seed.js.map +1 -0
- package/dist/seeds/default-seed-spec.d.ts +12 -0
- package/dist/seeds/default-seed-spec.d.ts.map +1 -0
- package/dist/seeds/default-seed-spec.js +90 -0
- package/dist/seeds/default-seed-spec.js.map +1 -0
- package/dist/seeds/merge-for-apply.d.ts +28 -0
- package/dist/seeds/merge-for-apply.d.ts.map +1 -0
- package/dist/seeds/merge-for-apply.js +31 -0
- package/dist/seeds/merge-for-apply.js.map +1 -0
- package/dist/seeds/paths.d.ts +10 -0
- package/dist/seeds/paths.d.ts.map +1 -0
- package/dist/seeds/paths.js +40 -0
- package/dist/seeds/paths.js.map +1 -0
- package/dist/seeds/seed-types.d.ts +57 -0
- package/dist/seeds/seed-types.d.ts.map +1 -0
- package/dist/seeds/seed-types.js +2 -0
- package/dist/seeds/seed-types.js.map +1 -0
- package/dist/tests/descriptor-validation.test.js +15 -0
- package/dist/tests/descriptor-validation.test.js.map +1 -1
- package/dist/tests/fetch-workspace-list.test.d.ts +2 -0
- package/dist/tests/fetch-workspace-list.test.d.ts.map +1 -0
- package/dist/tests/fetch-workspace-list.test.js +187 -0
- package/dist/tests/fetch-workspace-list.test.js.map +1 -0
- package/dist/tests/fixtures.d.ts +5 -2
- package/dist/tests/fixtures.d.ts.map +1 -1
- package/dist/tests/fixtures.js +79 -0
- package/dist/tests/fixtures.js.map +1 -1
- package/dist/tests/relations.test.js +3 -0
- package/dist/tests/relations.test.js.map +1 -1
- package/dist/tests/resolve-app-id.test.d.ts +2 -0
- package/dist/tests/resolve-app-id.test.d.ts.map +1 -0
- package/dist/tests/resolve-app-id.test.js +19 -0
- package/dist/tests/resolve-app-id.test.js.map +1 -0
- package/dist/tests/resolve-filters.test.d.ts +2 -0
- package/dist/tests/resolve-filters.test.d.ts.map +1 -0
- package/dist/tests/resolve-filters.test.js +47 -0
- package/dist/tests/resolve-filters.test.js.map +1 -0
- package/dist/tests/seed-check.test.d.ts +2 -0
- package/dist/tests/seed-check.test.d.ts.map +1 -0
- package/dist/tests/seed-check.test.js +47 -0
- package/dist/tests/seed-check.test.js.map +1 -0
- package/dist/tests/seed-manifest.test.d.ts +2 -0
- package/dist/tests/seed-manifest.test.d.ts.map +1 -0
- package/dist/tests/seed-manifest.test.js +80 -0
- package/dist/tests/seed-manifest.test.js.map +1 -0
- package/docs/DATA-TIER-CONTRACT.md +141 -0
- package/docs/EXPLORER-HOST-APIS.md +19 -7
- package/docs/MEMORIX-CATALOX-CONTRACTS.md +587 -0
- package/package.json +5 -3
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MemorixRetrievalClient } from "../client/types.js";
|
|
2
|
+
import type { MemorixRetrievalSeedCheckResult } from "./seed-types.js";
|
|
3
|
+
export type CheckMemorixRetrievalSeedNeedsOptions = {
|
|
4
|
+
expected?: Array<{
|
|
5
|
+
catalogId: string;
|
|
6
|
+
itemIds: string[];
|
|
7
|
+
}>;
|
|
8
|
+
};
|
|
9
|
+
export declare function checkMemorixRetrievalSeedNeeds(client: MemorixRetrievalClient, options?: CheckMemorixRetrievalSeedNeedsOptions): Promise<MemorixRetrievalSeedCheckResult>;
|
|
10
|
+
//# sourceMappingURL=check-needs-seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-needs-seed.d.ts","sourceRoot":"","sources":["../../src/seeds/check-needs-seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AA6BvE,MAAM,MAAM,qCAAqC,GAAG;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5D,CAAC;AAEF,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,+BAA+B,CAAC,CA+C1C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { throwRetrievalError } from "../errors/errors.js";
|
|
2
|
+
import { listExpectedMemorixRetrievalSeedItemIds } from "./default-seed-spec.js";
|
|
3
|
+
async function listCatalogItemIds(client, catalogId) {
|
|
4
|
+
const listFn = client.catalox.listCatalogItems;
|
|
5
|
+
if (!listFn) {
|
|
6
|
+
throwRetrievalError("CATALOX_LIST_UNSUPPORTED", "Catalox client must support listCatalogItems to check seed status");
|
|
7
|
+
}
|
|
8
|
+
const ids = [];
|
|
9
|
+
let offset = 0;
|
|
10
|
+
const pageSize = 200;
|
|
11
|
+
for (;;) {
|
|
12
|
+
const page = await listFn({ appId: client.appId }, catalogId, {
|
|
13
|
+
limit: pageSize,
|
|
14
|
+
offset,
|
|
15
|
+
});
|
|
16
|
+
ids.push(...page.items.map((item) => item.id));
|
|
17
|
+
if (!page.hasMore || page.items.length === 0)
|
|
18
|
+
break;
|
|
19
|
+
offset += page.items.length;
|
|
20
|
+
if (offset > 10_000)
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
return ids;
|
|
24
|
+
}
|
|
25
|
+
export async function checkMemorixRetrievalSeedNeeds(client, options = {}) {
|
|
26
|
+
const expected = options.expected ?? listExpectedMemorixRetrievalSeedItemIds();
|
|
27
|
+
const catalogs = [];
|
|
28
|
+
let needed = false;
|
|
29
|
+
const reasons = [];
|
|
30
|
+
for (const { catalogId, itemIds } of expected) {
|
|
31
|
+
let presentItemIds = [];
|
|
32
|
+
try {
|
|
33
|
+
presentItemIds = await listCatalogItemIds(client, catalogId);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
needed = true;
|
|
37
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
38
|
+
reasons.push(`${catalogId}: ${msg}`);
|
|
39
|
+
catalogs.push({
|
|
40
|
+
catalogId,
|
|
41
|
+
expectedItemIds: itemIds,
|
|
42
|
+
presentItemIds: [],
|
|
43
|
+
missingItemIds: itemIds,
|
|
44
|
+
});
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const presentSet = new Set(presentItemIds);
|
|
48
|
+
const missingItemIds = itemIds.filter((id) => !presentSet.has(id));
|
|
49
|
+
if (missingItemIds.length) {
|
|
50
|
+
needed = true;
|
|
51
|
+
reasons.push(`${catalogId}: missing ${missingItemIds.join(", ")}`);
|
|
52
|
+
}
|
|
53
|
+
catalogs.push({
|
|
54
|
+
catalogId,
|
|
55
|
+
expectedItemIds: itemIds,
|
|
56
|
+
presentItemIds,
|
|
57
|
+
missingItemIds,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
needed,
|
|
62
|
+
reason: reasons.length ? reasons.join("; ") : undefined,
|
|
63
|
+
catalogs,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=check-needs-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-needs-seed.js","sourceRoot":"","sources":["../../src/seeds/check-needs-seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MemorixSeedCatalogSpec, MemorixSeedScope } from "./seed-types.js";
|
|
2
|
+
export declare const MEMORIX_RETRIEVAL_SEED_PRESET_ID = "memorix-retrieval-descriptors";
|
|
3
|
+
export declare const MEMORIX_RETRIEVAL_DEFAULT_SCOPE: MemorixSeedScope;
|
|
4
|
+
/** Entity descriptor id → Memorix target database role (applied at seed build). */
|
|
5
|
+
export declare const MEMORIX_RETRIEVAL_ENTITY_TARGETS: Record<string, "entity" | "event">;
|
|
6
|
+
export declare const MEMORIX_RETRIEVAL_SEED_CATALOGS: MemorixSeedCatalogSpec[];
|
|
7
|
+
export declare const MEMORIX_RETRIEVAL_SEED_APP_ID = "memorix";
|
|
8
|
+
export declare function listExpectedMemorixRetrievalSeedItemIds(): Array<{
|
|
9
|
+
catalogId: string;
|
|
10
|
+
itemIds: string[];
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=default-seed-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-seed-spec.d.ts","sourceRoot":"","sources":["../../src/seeds/default-seed-spec.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,eAAO,MAAM,gCAAgC,kCAAkC,CAAC;AAEhF,eAAO,MAAM,+BAA+B,EAAE,gBAG7C,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,gCAAgC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAI/E,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,sBAAsB,EAkEnE,CAAC;AAEF,eAAO,MAAM,6BAA6B,YAAiB,CAAC;AAE5D,wBAAgB,uCAAuC,IAAI,KAAK,CAAC;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CAQD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { MEMORIX_APP_ID, MEMORIX_ENTITY_DESCRIPTORS_CATALOG, MEMORIX_ITEM_DESCRIPTORS_CATALOG, MEMORIX_LIST_DESCRIPTORS_CATALOG, } from "../descriptors/catalog-ids.js";
|
|
2
|
+
export const MEMORIX_RETRIEVAL_SEED_PRESET_ID = "memorix-retrieval-descriptors";
|
|
3
|
+
export const MEMORIX_RETRIEVAL_DEFAULT_SCOPE = {
|
|
4
|
+
domains: ["network", "vulnerabilities"],
|
|
5
|
+
agents: ["neo"],
|
|
6
|
+
};
|
|
7
|
+
/** Entity descriptor id → Memorix target database role (applied at seed build). */
|
|
8
|
+
export const MEMORIX_RETRIEVAL_ENTITY_TARGETS = {
|
|
9
|
+
assets: "entity",
|
|
10
|
+
"variabilities-groups": "entity",
|
|
11
|
+
vulnerabilities: "event",
|
|
12
|
+
};
|
|
13
|
+
export const MEMORIX_RETRIEVAL_SEED_CATALOGS = [
|
|
14
|
+
{
|
|
15
|
+
catalogId: MEMORIX_ENTITY_DESCRIPTORS_CATALOG,
|
|
16
|
+
name: "Memorix entity descriptors",
|
|
17
|
+
catalogType: "memorix",
|
|
18
|
+
sourceMode: "native",
|
|
19
|
+
native: { itemIdField: "id", titleField: "entityName" },
|
|
20
|
+
descriptor: {
|
|
21
|
+
itemIdField: "id",
|
|
22
|
+
titleField: "entityName",
|
|
23
|
+
queryableFields: [
|
|
24
|
+
{ key: "id", label: "Id" },
|
|
25
|
+
{ key: "entityName", label: "Entity name" },
|
|
26
|
+
{ key: "target", label: "Target" },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
inputFiles: [
|
|
30
|
+
"entity-descriptors/assets.json",
|
|
31
|
+
"entity-descriptors/variabilities-groups.json",
|
|
32
|
+
"entity-descriptors/vulnerabilities.json",
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
catalogId: MEMORIX_LIST_DESCRIPTORS_CATALOG,
|
|
37
|
+
name: "Memorix list descriptors",
|
|
38
|
+
catalogType: "memorix",
|
|
39
|
+
sourceMode: "native",
|
|
40
|
+
native: { itemIdField: "id", titleField: "title" },
|
|
41
|
+
descriptor: {
|
|
42
|
+
itemIdField: "id",
|
|
43
|
+
titleField: "title",
|
|
44
|
+
queryableFields: [
|
|
45
|
+
{ key: "id", label: "Id" },
|
|
46
|
+
{ key: "entity", label: "Entity" },
|
|
47
|
+
{ key: "title", label: "Title" },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
inputFiles: [
|
|
51
|
+
"list-descriptors/assets-main-list.json",
|
|
52
|
+
"list-descriptors/vulnerabilities-main-list.json",
|
|
53
|
+
"list-descriptors/critical-vulnerabilities-list.json",
|
|
54
|
+
"list-descriptors/variabilities-groups-main-list.json",
|
|
55
|
+
"list-descriptors/memorix-workspace-records-list.json",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
catalogId: MEMORIX_ITEM_DESCRIPTORS_CATALOG,
|
|
60
|
+
name: "Memorix item descriptors",
|
|
61
|
+
catalogType: "memorix",
|
|
62
|
+
sourceMode: "native",
|
|
63
|
+
native: { itemIdField: "id", titleField: "title" },
|
|
64
|
+
descriptor: {
|
|
65
|
+
itemIdField: "id",
|
|
66
|
+
titleField: "title",
|
|
67
|
+
queryableFields: [
|
|
68
|
+
{ key: "id", label: "Id" },
|
|
69
|
+
{ key: "entity", label: "Entity" },
|
|
70
|
+
{ key: "title", label: "Title" },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
inputFiles: [
|
|
74
|
+
"item-descriptors/asset-detail-item.json",
|
|
75
|
+
"item-descriptors/vulnerability-detail-item.json",
|
|
76
|
+
"item-descriptors/variabilities-group-detail-item.json",
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
export const MEMORIX_RETRIEVAL_SEED_APP_ID = MEMORIX_APP_ID;
|
|
81
|
+
export function listExpectedMemorixRetrievalSeedItemIds() {
|
|
82
|
+
return MEMORIX_RETRIEVAL_SEED_CATALOGS.map((spec) => ({
|
|
83
|
+
catalogId: spec.catalogId,
|
|
84
|
+
itemIds: spec.inputFiles.map((file) => {
|
|
85
|
+
const base = file.split("/").pop() ?? file;
|
|
86
|
+
return base.replace(/\.json$/i, "");
|
|
87
|
+
}),
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=default-seed-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-seed-spec.js","sourceRoot":"","sources":["../../src/seeds/default-seed-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MemorixRetrievalSeedManifest, MemorixSeedScope } from "./seed-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Catalox seed apply upserts `row.data` only; merge scope into data for native items.
|
|
4
|
+
*/
|
|
5
|
+
export declare function mergeSeedItemScopeIntoUpsertData(data: Record<string, unknown>, scope: MemorixSeedScope | undefined): Record<string, unknown>;
|
|
6
|
+
export declare function prepareSeedManifestItemForApply(item: {
|
|
7
|
+
catalogId: string;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
scope?: MemorixSeedScope;
|
|
10
|
+
}): {
|
|
11
|
+
catalogId: string;
|
|
12
|
+
data: Record<string, unknown>;
|
|
13
|
+
};
|
|
14
|
+
export declare function prepareMemorixRetrievalSeedManifestForApply(manifest: MemorixRetrievalSeedManifest): MemorixRetrievalSeedManifest;
|
|
15
|
+
/** Shape expected by {@link applyCataloxSeedPreset} after scope merge into item data. */
|
|
16
|
+
export declare function prepareMemorixRetrievalSeedManifestForCataloxApply(manifest: Omit<MemorixRetrievalSeedManifest, "items"> & {
|
|
17
|
+
items: Array<{
|
|
18
|
+
catalogId: string;
|
|
19
|
+
data: Record<string, unknown>;
|
|
20
|
+
scope?: MemorixSeedScope;
|
|
21
|
+
}>;
|
|
22
|
+
}): Omit<MemorixRetrievalSeedManifest, "items"> & {
|
|
23
|
+
items: Array<{
|
|
24
|
+
catalogId: string;
|
|
25
|
+
data: Record<string, unknown>;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=merge-for-apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-for-apply.d.ts","sourceRoot":"","sources":["../../src/seeds/merge-for-apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAE5B,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAKvD;AAED,wBAAgB,2CAA2C,CACzD,QAAQ,EAAE,4BAA4B,GACrC,4BAA4B,CAQ9B;AAED,yFAAyF;AACzF,wBAAgB,kDAAkD,CAChE,QAAQ,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,GAAG;IACtD,KAAK,EAAE,KAAK,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,CAAC,EAAE,gBAAgB,CAAC;KAC1B,CAAC,CAAC;CACJ,GACA,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,GAAG;IAC/C,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACpE,CAKA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalox seed apply upserts `row.data` only; merge scope into data for native items.
|
|
3
|
+
*/
|
|
4
|
+
export function mergeSeedItemScopeIntoUpsertData(data, scope) {
|
|
5
|
+
if (scope == null)
|
|
6
|
+
return data;
|
|
7
|
+
return { ...data, scope };
|
|
8
|
+
}
|
|
9
|
+
export function prepareSeedManifestItemForApply(item) {
|
|
10
|
+
return {
|
|
11
|
+
catalogId: item.catalogId,
|
|
12
|
+
data: mergeSeedItemScopeIntoUpsertData(item.data, item.scope),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function prepareMemorixRetrievalSeedManifestForApply(manifest) {
|
|
16
|
+
return {
|
|
17
|
+
...manifest,
|
|
18
|
+
items: manifest.items.map((item) => ({
|
|
19
|
+
...item,
|
|
20
|
+
data: mergeSeedItemScopeIntoUpsertData(item.data, item.scope),
|
|
21
|
+
})),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Shape expected by {@link applyCataloxSeedPreset} after scope merge into item data. */
|
|
25
|
+
export function prepareMemorixRetrievalSeedManifestForCataloxApply(manifest) {
|
|
26
|
+
return {
|
|
27
|
+
...manifest,
|
|
28
|
+
items: manifest.items.map(prepareSeedManifestItemForApply),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=merge-for-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-for-apply.js","sourceRoot":"","sources":["../../src/seeds/merge-for-apply.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAA6B,EAC7B,KAAmC;IAEnC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,IAI/C;IACC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,gCAAgC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2CAA2C,CACzD,QAAsC;IAEtC,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,IAAI;YACP,IAAI,EAAE,gCAAgC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,kDAAkD,CAChE,QAMC;IAID,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MemorixRetrievalSeedManifest } from "./seed-types.js";
|
|
2
|
+
/** Package root (memorix-retrieval/) when running from compiled `dist/seeds/`. */
|
|
3
|
+
export declare function resolveMemorixRetrievalPackageRoot(): string;
|
|
4
|
+
export declare function resolveMemorixRetrievalSeedInputsDir(packageRoot?: string): string;
|
|
5
|
+
export declare function resolveMemorixRetrievalSeedManifestPath(packageRoot?: string): string;
|
|
6
|
+
export declare function createSeedInputsReader(inputsDir: string): (relativePath: string) => Promise<Record<string, unknown>>;
|
|
7
|
+
export declare function loadMemorixRetrievalSeedScopeFromInputs(inputsDir?: string): Promise<import("./seed-types.js").MemorixSeedScope>;
|
|
8
|
+
export declare function buildMemorixRetrievalSeedManifestFromInputs(inputsDir?: string): Promise<MemorixRetrievalSeedManifest>;
|
|
9
|
+
export declare function writeMemorixRetrievalSeedManifest(manifest: MemorixRetrievalSeedManifest, manifestPath?: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/seeds/paths.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAIpE,kFAAkF;AAClF,wBAAgB,kCAAkC,IAAI,MAAM,CAE3D;AAED,wBAAgB,oCAAoC,CAClD,WAAW,SAAuC,GACjD,MAAM,CAER;AAED,wBAAgB,uCAAuC,CACrD,WAAW,SAAuC,GACjD,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,IACxC,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAItE;AAED,wBAAsB,uCAAuC,CAC3D,SAAS,SAAyC,GACjD,OAAO,CAAC,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,CAUrD;AAED,wBAAsB,2CAA2C,CAC/D,SAAS,SAAyC,GACjD,OAAO,CAAC,4BAA4B,CAAC,CAIvC;AAED,wBAAsB,iCAAiC,CACrD,QAAQ,EAAE,4BAA4B,EACtC,YAAY,SAA4C,GACvD,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { buildMemorixRetrievalSeedManifest } from "./build-manifest.js";
|
|
5
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
/** Package root (memorix-retrieval/) when running from compiled `dist/seeds/`. */
|
|
7
|
+
export function resolveMemorixRetrievalPackageRoot() {
|
|
8
|
+
return join(moduleDir, "..", "..");
|
|
9
|
+
}
|
|
10
|
+
export function resolveMemorixRetrievalSeedInputsDir(packageRoot = resolveMemorixRetrievalPackageRoot()) {
|
|
11
|
+
return join(packageRoot, "catalox-seeds", "inputs");
|
|
12
|
+
}
|
|
13
|
+
export function resolveMemorixRetrievalSeedManifestPath(packageRoot = resolveMemorixRetrievalPackageRoot()) {
|
|
14
|
+
return join(packageRoot, "catalox-seeds", "memorix-retrieval-descriptors.manifest.json");
|
|
15
|
+
}
|
|
16
|
+
export function createSeedInputsReader(inputsDir) {
|
|
17
|
+
return async (relativePath) => {
|
|
18
|
+
const raw = await readFile(join(inputsDir, relativePath), "utf8");
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function loadMemorixRetrievalSeedScopeFromInputs(inputsDir = resolveMemorixRetrievalSeedInputsDir()) {
|
|
23
|
+
try {
|
|
24
|
+
const raw = await readFile(join(inputsDir, "scope.json"), "utf8");
|
|
25
|
+
return JSON.parse(raw);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
const { MEMORIX_RETRIEVAL_DEFAULT_SCOPE } = await import("./default-seed-spec.js");
|
|
29
|
+
return MEMORIX_RETRIEVAL_DEFAULT_SCOPE;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function buildMemorixRetrievalSeedManifestFromInputs(inputsDir = resolveMemorixRetrievalSeedInputsDir()) {
|
|
33
|
+
const readJson = createSeedInputsReader(inputsDir);
|
|
34
|
+
const scope = await loadMemorixRetrievalSeedScopeFromInputs(inputsDir);
|
|
35
|
+
return buildMemorixRetrievalSeedManifest({ readJson, scope });
|
|
36
|
+
}
|
|
37
|
+
export async function writeMemorixRetrievalSeedManifest(manifest, manifestPath = resolveMemorixRetrievalSeedManifestPath()) {
|
|
38
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/seeds/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAGxE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,kFAAkF;AAClF,MAAM,UAAU,kCAAkC;IAChD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,WAAW,GAAG,kCAAkC,EAAE;IAElD,OAAO,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,WAAW,GAAG,kCAAkC,EAAE;IAElD,OAAO,IAAI,CACT,WAAW,EACX,eAAe,EACf,6CAA6C,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,KAAK,EAAE,YAAoB,EAAoC,EAAE;QACtE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,SAAS,GAAG,oCAAoC,EAAE;IAElD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,+BAA+B,EAAE,GAAG,MAAM,MAAM,CACtD,wBAAwB,CACzB,CAAC;QACF,OAAO,+BAA+B,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2CAA2C,CAC/D,SAAS,GAAG,oCAAoC,EAAE;IAElD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,uCAAuC,CAAC,SAAS,CAAC,CAAC;IACvE,OAAO,iCAAiC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,QAAsC,EACtC,YAAY,GAAG,uCAAuC,EAAE;IAExD,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export type MemorixSeedScope = {
|
|
2
|
+
domains: string[];
|
|
3
|
+
agents: string[];
|
|
4
|
+
};
|
|
5
|
+
export type MemorixSeedCatalogSpec = {
|
|
6
|
+
catalogId: string;
|
|
7
|
+
name: string;
|
|
8
|
+
catalogType: "memorix";
|
|
9
|
+
sourceMode: "native";
|
|
10
|
+
native: {
|
|
11
|
+
itemIdField: string;
|
|
12
|
+
titleField: string;
|
|
13
|
+
};
|
|
14
|
+
descriptor: {
|
|
15
|
+
itemIdField: string;
|
|
16
|
+
titleField: string;
|
|
17
|
+
queryableFields: Array<{
|
|
18
|
+
key: string;
|
|
19
|
+
label: string;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
inputFiles: string[];
|
|
23
|
+
};
|
|
24
|
+
export type MemorixRetrievalSeedManifestItem = {
|
|
25
|
+
catalogId: string;
|
|
26
|
+
scope: MemorixSeedScope;
|
|
27
|
+
data: Record<string, unknown>;
|
|
28
|
+
};
|
|
29
|
+
export type MemorixRetrievalSeedManifest = {
|
|
30
|
+
presetVersion: 1;
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
description: string;
|
|
34
|
+
catalogs: Array<Omit<MemorixSeedCatalogSpec, "descriptor" | "inputFiles">>;
|
|
35
|
+
descriptors: unknown[];
|
|
36
|
+
bindings: Array<{
|
|
37
|
+
appId: string;
|
|
38
|
+
catalogId: string;
|
|
39
|
+
access: {
|
|
40
|
+
canRead: boolean;
|
|
41
|
+
canWrite: boolean;
|
|
42
|
+
};
|
|
43
|
+
}>;
|
|
44
|
+
items: MemorixRetrievalSeedManifestItem[];
|
|
45
|
+
};
|
|
46
|
+
export type MemorixRetrievalSeedCatalogPresence = {
|
|
47
|
+
catalogId: string;
|
|
48
|
+
expectedItemIds: string[];
|
|
49
|
+
presentItemIds: string[];
|
|
50
|
+
missingItemIds: string[];
|
|
51
|
+
};
|
|
52
|
+
export type MemorixRetrievalSeedCheckResult = {
|
|
53
|
+
needed: boolean;
|
|
54
|
+
reason?: string;
|
|
55
|
+
catalogs: MemorixRetrievalSeedCatalogPresence[];
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=seed-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-types.d.ts","sourceRoot":"","sources":["../../src/seeds/seed-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,QAAQ,CAAC;IACrB,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxD,CAAC;IACF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC;IAC3E,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC;KACjD,CAAC,CAAC;IACH,KAAK,EAAE,gCAAgC,EAAE,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mCAAmC,EAAE,CAAC;CACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-types.js","sourceRoot":"","sources":["../../src/seeds/seed-types.ts"],"names":[],"mappings":""}
|
|
@@ -7,6 +7,21 @@ describe("descriptor validation", () => {
|
|
|
7
7
|
const d = validateMemorixEntityDescriptor(assetsEntity);
|
|
8
8
|
expect(d.id).toBe("assets");
|
|
9
9
|
});
|
|
10
|
+
it("requires default list and item descriptor ids", () => {
|
|
11
|
+
expect(() => validateMemorixEntityDescriptor({
|
|
12
|
+
...assetsEntity,
|
|
13
|
+
defaultListDescriptorId: "",
|
|
14
|
+
})).toThrow(MemorixRetrievalError);
|
|
15
|
+
});
|
|
16
|
+
it("requires exactly one isCanonical content type", () => {
|
|
17
|
+
expect(() => validateMemorixEntityDescriptor({
|
|
18
|
+
...assetsEntity,
|
|
19
|
+
contentTypes: {
|
|
20
|
+
...assetsEntity.contentTypes,
|
|
21
|
+
extra: { postfix: "extra", isCanonical: true },
|
|
22
|
+
},
|
|
23
|
+
})).toThrow(MemorixRetrievalError);
|
|
24
|
+
});
|
|
10
25
|
it("rejects non-human-readable list fields", () => {
|
|
11
26
|
const badList = {
|
|
12
27
|
...assetsMainList,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor-validation.test.js","sourceRoot":"","sources":["../../src/tests/descriptor-validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,+BAA+B,CACvC,YAAkD,CACnD,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG;YACd,GAAG,cAAc;YACjB,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;SAClC,CAAC;QACF,MAAM,MAAM,GAAG;YACb,GAAG,YAAY;YACf,UAAU,EAAE;gBACV,GAAG,YAAY,CAAC,UAAU;gBAC1B,QAAQ,EAAE,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE;aACxE;SACF,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CACV,6BAA6B,CAAC,OAAO,EAAE,MAAM,CAAC,CAC/C,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"descriptor-validation.test.js","sourceRoot":"","sources":["../../src/tests/descriptor-validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,+BAA+B,CACvC,YAAkD,CACnD,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CACV,+BAA+B,CAAC;YAC9B,GAAI,YAAmD;YACvD,uBAAuB,EAAE,EAAE;SAC5B,CAAC,CACH,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CACV,+BAA+B,CAAC;YAC9B,GAAI,YAAmD;YACvD,YAAY,EAAE;gBACZ,GAAI,YAAY,CAAC,YAAwC;gBACzD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;aAC/C;SACF,CAAC,CACH,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG;YACd,GAAG,cAAc;YACjB,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;SAClC,CAAC;QACF,MAAM,MAAM,GAAG;YACb,GAAG,YAAY;YACf,UAAU,EAAE;gBACV,GAAG,YAAY,CAAC,UAAU;gBAC1B,QAAQ,EAAE,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE;aACxE;SACF,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CACV,6BAA6B,CAAC,OAAO,EAAE,MAAM,CAAC,CAC/C,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-workspace-list.test.d.ts","sourceRoot":"","sources":["../../src/tests/fetch-workspace-list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createMemorixRetrieval } from "../client/create-client.js";
|
|
3
|
+
import { MEMORIX_ENTITY_DESCRIPTORS_CATALOG, MEMORIX_LIST_DESCRIPTORS_CATALOG, } from "../descriptors/catalog-ids.js";
|
|
4
|
+
import { fetchMemorixWorkspaceList, DEFAULT_WORKSPACE_LIST_ID, } from "../retrieval/fetch-workspace-list.js";
|
|
5
|
+
import { assetsEntity, assetsMainList, vulnerabilitiesEntity, vulnerabilitiesMainList, workspaceRecordsList, } from "./fixtures.js";
|
|
6
|
+
function mockWorkspaceCatalox() {
|
|
7
|
+
const entityItems = [
|
|
8
|
+
{ id: "assets", data: assetsEntity, title: "Assets" },
|
|
9
|
+
{ id: "vulnerabilities", data: vulnerabilitiesEntity, title: "Vulnerabilities" },
|
|
10
|
+
];
|
|
11
|
+
return {
|
|
12
|
+
getCatalogItem: vi.fn(async (_ctx, catalogId, itemId) => {
|
|
13
|
+
if (catalogId === MEMORIX_LIST_DESCRIPTORS_CATALOG &&
|
|
14
|
+
itemId === "assets-main-list") {
|
|
15
|
+
return { outcome: "found", item: { data: assetsMainList } };
|
|
16
|
+
}
|
|
17
|
+
if (catalogId === MEMORIX_LIST_DESCRIPTORS_CATALOG &&
|
|
18
|
+
itemId === "vulnerabilities-main-list") {
|
|
19
|
+
return {
|
|
20
|
+
outcome: "found",
|
|
21
|
+
item: { data: vulnerabilitiesMainList },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (catalogId === MEMORIX_LIST_DESCRIPTORS_CATALOG &&
|
|
25
|
+
itemId === DEFAULT_WORKSPACE_LIST_ID) {
|
|
26
|
+
return {
|
|
27
|
+
outcome: "found",
|
|
28
|
+
item: { data: workspaceRecordsList },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (catalogId === MEMORIX_ENTITY_DESCRIPTORS_CATALOG && itemId === "assets") {
|
|
32
|
+
return { outcome: "found", item: { data: assetsEntity } };
|
|
33
|
+
}
|
|
34
|
+
if (catalogId === MEMORIX_ENTITY_DESCRIPTORS_CATALOG &&
|
|
35
|
+
itemId === "vulnerabilities") {
|
|
36
|
+
return {
|
|
37
|
+
outcome: "found",
|
|
38
|
+
item: { data: vulnerabilitiesEntity },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return { outcome: "not_found" };
|
|
42
|
+
}),
|
|
43
|
+
listCatalogItems: vi.fn(async () => ({
|
|
44
|
+
items: entityItems,
|
|
45
|
+
hasMore: false,
|
|
46
|
+
})),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function mockXronox() {
|
|
50
|
+
return vi.fn(async (params) => {
|
|
51
|
+
if (params.source === "assets-snapshots") {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
entityId: "10.0.0.1",
|
|
55
|
+
modifiedAt: "2026-01-01",
|
|
56
|
+
data: { ip_address: "10.0.0.1", xdr: { host_name: "host-a" } },
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
entityId: "10.0.0.2",
|
|
60
|
+
modifiedAt: "2026-01-02",
|
|
61
|
+
data: { ip_address: "10.0.0.2", xdr: { host_name: "host-b" } },
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
if (params.source === "vulnerabilities-snapshots") {
|
|
66
|
+
return [
|
|
67
|
+
{
|
|
68
|
+
entityId: "vuln-1",
|
|
69
|
+
modifiedAt: "2026-02-01",
|
|
70
|
+
data: {
|
|
71
|
+
vulnerabilityId: "vuln-1",
|
|
72
|
+
pluginName: "SSL",
|
|
73
|
+
priorityScore: 95,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
entityId: "vuln-2",
|
|
78
|
+
modifiedAt: "2026-03-01",
|
|
79
|
+
data: {
|
|
80
|
+
vulnerabilityId: "vuln-2",
|
|
81
|
+
pluginName: "SSH",
|
|
82
|
+
priorityScore: 50,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
return [];
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
describe("fetchMemorixWorkspaceList", () => {
|
|
91
|
+
it("merges rows from all discovered entities with entityName", async () => {
|
|
92
|
+
const xronoxRead = mockXronox();
|
|
93
|
+
const client = createMemorixRetrieval({
|
|
94
|
+
catalox: mockWorkspaceCatalox(),
|
|
95
|
+
xronox: { read: xronoxRead, readArray: xronoxRead },
|
|
96
|
+
});
|
|
97
|
+
const res = await fetchMemorixWorkspaceList(client, {
|
|
98
|
+
page: { limit: 10, offset: 0 },
|
|
99
|
+
});
|
|
100
|
+
expect(res.workspaceListDescriptorId).toBe(DEFAULT_WORKSPACE_LIST_ID);
|
|
101
|
+
expect(res.discovery.source).toBe("catalox");
|
|
102
|
+
expect(res.includedEntities).toEqual(["assets", "vulnerabilities"]);
|
|
103
|
+
expect(res.rows.length).toBeGreaterThanOrEqual(2);
|
|
104
|
+
expect(res.rows.every((r) => typeof r.entityName === "string")).toBe(true);
|
|
105
|
+
const entityNames = new Set(res.rows.map((r) => r.entityName));
|
|
106
|
+
expect(entityNames.has("assets")).toBe(true);
|
|
107
|
+
expect(entityNames.has("vulnerabilities")).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
it("paginates merged workspace rows", async () => {
|
|
110
|
+
const xronoxRead = mockXronox();
|
|
111
|
+
const client = createMemorixRetrieval({
|
|
112
|
+
catalox: mockWorkspaceCatalox(),
|
|
113
|
+
xronox: { read: xronoxRead, readArray: xronoxRead },
|
|
114
|
+
});
|
|
115
|
+
const res = await fetchMemorixWorkspaceList(client, {
|
|
116
|
+
page: { limit: 2, offset: 0 },
|
|
117
|
+
});
|
|
118
|
+
expect(res.rows).toHaveLength(2);
|
|
119
|
+
expect(res.page.limit).toBe(2);
|
|
120
|
+
expect(res.page.hasMore).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
it("sorts merged rows globally by workspace defaultSort", async () => {
|
|
123
|
+
const xronoxRead = mockXronox();
|
|
124
|
+
const client = createMemorixRetrieval({
|
|
125
|
+
catalox: mockWorkspaceCatalox(),
|
|
126
|
+
xronox: { read: xronoxRead, readArray: xronoxRead },
|
|
127
|
+
});
|
|
128
|
+
const res = await fetchMemorixWorkspaceList(client, {
|
|
129
|
+
page: { limit: 10, offset: 0 },
|
|
130
|
+
});
|
|
131
|
+
const scores = res.rows
|
|
132
|
+
.map((r) => r.priorityScore)
|
|
133
|
+
.filter((v) => typeof v === "number");
|
|
134
|
+
if (scores.length >= 2) {
|
|
135
|
+
expect(scores[0]).toBeGreaterThanOrEqual(scores[1]);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
it("delegates to per-entity list when entityName is set", async () => {
|
|
139
|
+
const xronoxRead = mockXronox();
|
|
140
|
+
const client = createMemorixRetrieval({
|
|
141
|
+
catalox: mockWorkspaceCatalox(),
|
|
142
|
+
xronox: { read: xronoxRead, readArray: xronoxRead },
|
|
143
|
+
});
|
|
144
|
+
const res = await fetchMemorixWorkspaceList(client, {
|
|
145
|
+
entityName: "assets",
|
|
146
|
+
page: { limit: 10, offset: 0 },
|
|
147
|
+
});
|
|
148
|
+
expect(res.includedEntities).toEqual(["assets"]);
|
|
149
|
+
expect(res.rows.every((r) => r.entityName === "assets")).toBe(true);
|
|
150
|
+
expect(res.rows[0]).toMatchObject({
|
|
151
|
+
entityName: "assets",
|
|
152
|
+
entityId: "10.0.0.1",
|
|
153
|
+
ipAddress: "10.0.0.1",
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
it("returns empty result when discovery finds no entities", async () => {
|
|
157
|
+
const client = createMemorixRetrieval({
|
|
158
|
+
catalox: {
|
|
159
|
+
getCatalogItem: vi.fn(async (_ctx, catalogId, itemId) => {
|
|
160
|
+
if (catalogId === MEMORIX_LIST_DESCRIPTORS_CATALOG &&
|
|
161
|
+
itemId === DEFAULT_WORKSPACE_LIST_ID) {
|
|
162
|
+
return {
|
|
163
|
+
outcome: "found",
|
|
164
|
+
item: { data: workspaceRecordsList },
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return { outcome: "not_found" };
|
|
168
|
+
}),
|
|
169
|
+
listCatalogItems: vi.fn(async () => ({ items: [], hasMore: false })),
|
|
170
|
+
},
|
|
171
|
+
xronox: { read: async () => [] },
|
|
172
|
+
});
|
|
173
|
+
const res = await fetchMemorixWorkspaceList(client);
|
|
174
|
+
expect(res.rows).toHaveLength(0);
|
|
175
|
+
expect(res.discovery.source).toBe("none");
|
|
176
|
+
expect(res.includedEntities).toEqual([]);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe("workspace list descriptor validation", () => {
|
|
180
|
+
it("accepts workspace kind", async () => {
|
|
181
|
+
const { validateMemorixWorkspaceListDescriptor } = await import("../descriptors/validate-descriptor.js");
|
|
182
|
+
const result = validateMemorixWorkspaceListDescriptor(workspaceRecordsList);
|
|
183
|
+
expect(result.kind).toBe("workspace");
|
|
184
|
+
expect(result.id).toBe(DEFAULT_WORKSPACE_LIST_ID);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=fetch-workspace-list.test.js.map
|