@x12i/memorix-retrieval 1.1.0 → 1.2.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 (50) hide show
  1. package/dist/client/catalox-adapter.d.ts +9 -0
  2. package/dist/client/catalox-adapter.d.ts.map +1 -0
  3. package/dist/client/catalox-adapter.js +42 -0
  4. package/dist/client/catalox-adapter.js.map +1 -0
  5. package/dist/client/catalox-like.d.ts +16 -0
  6. package/dist/client/catalox-like.d.ts.map +1 -1
  7. package/dist/client/create-stack-from-env.d.ts +21 -0
  8. package/dist/client/create-stack-from-env.d.ts.map +1 -0
  9. package/dist/client/create-stack-from-env.js +34 -0
  10. package/dist/client/create-stack-from-env.js.map +1 -0
  11. package/dist/client/types.d.ts +1 -1
  12. package/dist/client/types.d.ts.map +1 -1
  13. package/dist/data/record-id.d.ts +6 -0
  14. package/dist/data/record-id.d.ts.map +1 -0
  15. package/dist/data/record-id.js +49 -0
  16. package/dist/data/record-id.js.map +1 -0
  17. package/dist/descriptors/content-type-labels.d.ts +7 -0
  18. package/dist/descriptors/content-type-labels.d.ts.map +1 -0
  19. package/dist/descriptors/content-type-labels.js +26 -0
  20. package/dist/descriptors/content-type-labels.js.map +1 -0
  21. package/dist/descriptors/discover-entities.d.ts +26 -0
  22. package/dist/descriptors/discover-entities.d.ts.map +1 -0
  23. package/dist/descriptors/discover-entities.js +123 -0
  24. package/dist/descriptors/discover-entities.js.map +1 -0
  25. package/dist/explorer/entity-graph.d.ts +59 -0
  26. package/dist/explorer/entity-graph.d.ts.map +1 -0
  27. package/dist/explorer/entity-graph.js +151 -0
  28. package/dist/explorer/entity-graph.js.map +1 -0
  29. package/dist/explorer/health.d.ts +14 -0
  30. package/dist/explorer/health.d.ts.map +1 -0
  31. package/dist/explorer/health.js +70 -0
  32. package/dist/explorer/health.js.map +1 -0
  33. package/dist/explorer/raw-reads.d.ts +25 -0
  34. package/dist/explorer/raw-reads.d.ts.map +1 -0
  35. package/dist/explorer/raw-reads.js +78 -0
  36. package/dist/explorer/raw-reads.js.map +1 -0
  37. package/dist/explorer/scoped-workspace.d.ts +24 -0
  38. package/dist/explorer/scoped-workspace.d.ts.map +1 -0
  39. package/dist/explorer/scoped-workspace.js +217 -0
  40. package/dist/explorer/scoped-workspace.js.map +1 -0
  41. package/dist/index.d.ts +12 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/mongo/read-collection.d.ts +1 -0
  46. package/dist/mongo/read-collection.d.ts.map +1 -1
  47. package/dist/mongo/read-collection.js +6 -0
  48. package/dist/mongo/read-collection.js.map +1 -1
  49. package/docs/EXPLORER-HOST-APIS.md +48 -0
  50. package/package.json +1 -1
@@ -0,0 +1,151 @@
1
+ import { discoverMemorixEntities, entityDescriptorConnections, loadMemorixEntityDescriptorByName, } from "../descriptors/discover-entities.js";
2
+ import { listEntityContentTypeKeys, memorixContentTypeLabel, primaryEntityContentType, } from "../descriptors/content-type-labels.js";
3
+ import { resolveMemorixDbNameForEntity } from "../mongo/resolve-db.js";
4
+ import { countMemorixEntityContentTypeDocuments } from "./raw-reads.js";
5
+ function resolveScopedNamespace(client, override) {
6
+ if (override !== undefined)
7
+ return override;
8
+ const env = client.processEnv;
9
+ return (env.MEMORIX_SCOPED_NAMESPACE?.trim() ||
10
+ env.TARGET_NAMESPACE?.trim() ||
11
+ env.XMEMORY_NAMESPACE?.trim() ||
12
+ null);
13
+ }
14
+ function errMsg(error) {
15
+ return error instanceof Error ? error.message : String(error);
16
+ }
17
+ export async function buildMemorixEntityGraph(client, options = {}) {
18
+ const discoveryResult = await discoverMemorixEntities(client);
19
+ const scopedNamespace = resolveScopedNamespace(client, options.scopedNamespace);
20
+ const cataloxClient = Boolean(client.catalox.listCatalogItems);
21
+ const discovery = {
22
+ source: discoveryResult.source,
23
+ memorixDb: "",
24
+ scopedNamespace,
25
+ entitiesCatalogId: discoveryResult.catalogId,
26
+ cataloxAppId: client.appId,
27
+ cataloxClient,
28
+ hint: discoveryResult.hint,
29
+ };
30
+ const entities = [];
31
+ let memorixDb = "";
32
+ for (const summary of discoveryResult.summaries) {
33
+ let entity;
34
+ try {
35
+ entity = await loadMemorixEntityDescriptorByName(client, summary.entityName);
36
+ }
37
+ catch (e) {
38
+ entities.push({
39
+ entityName: summary.entityName,
40
+ label: summary.label,
41
+ count: 0,
42
+ narratives: [],
43
+ connections: [],
44
+ connectedEntityTypes: 0,
45
+ contentTypesWithData: 0,
46
+ drillable: false,
47
+ countErrors: { contentTypes: errMsg(e) },
48
+ });
49
+ continue;
50
+ }
51
+ if (!memorixDb) {
52
+ memorixDb = resolveMemorixDbNameForEntity(entity, client);
53
+ }
54
+ const primaryType = primaryEntityContentType(entity);
55
+ const contentTypes = listEntityContentTypeKeys(entity);
56
+ const countErrors = {};
57
+ let primaryCount = 0;
58
+ let narrativesCount = 0;
59
+ let contentTypesWithData = 0;
60
+ const contentTypeCountErrors = [];
61
+ try {
62
+ primaryCount = await countMemorixEntityContentTypeDocuments(client, {
63
+ entityName: summary.entityName,
64
+ contentType: primaryType,
65
+ });
66
+ }
67
+ catch (e) {
68
+ countErrors.scoped = errMsg(e);
69
+ }
70
+ if (entity.contentTypes.narratives) {
71
+ try {
72
+ narrativesCount = await countMemorixEntityContentTypeDocuments(client, {
73
+ entityName: summary.entityName,
74
+ contentType: "narratives",
75
+ });
76
+ }
77
+ catch (e) {
78
+ countErrors.narratives = errMsg(e);
79
+ }
80
+ }
81
+ for (const contentType of contentTypes) {
82
+ try {
83
+ const ctCount = await countMemorixEntityContentTypeDocuments(client, {
84
+ entityName: summary.entityName,
85
+ contentType,
86
+ });
87
+ if (ctCount > 0)
88
+ contentTypesWithData += 1;
89
+ }
90
+ catch (e) {
91
+ contentTypeCountErrors.push(`${contentType}: ${errMsg(e)}`);
92
+ }
93
+ }
94
+ if (contentTypeCountErrors.length) {
95
+ countErrors.contentTypes = contentTypeCountErrors.join("; ");
96
+ }
97
+ const connections = entityDescriptorConnections(entity);
98
+ const narrativeRefs = narrativesCount > 0
99
+ ? [{ id: "memorix:narratives", title: "Memorix narratives collection" }]
100
+ : [];
101
+ entities.push({
102
+ entityName: summary.entityName,
103
+ label: summary.label,
104
+ count: primaryCount,
105
+ narratives: narrativeRefs,
106
+ connections,
107
+ connectedEntityTypes: new Set(connections.map((c) => c.targetEntityName)).size,
108
+ contentTypesWithData,
109
+ drillable: primaryCount > 0 || narrativeRefs.length > 0,
110
+ ...(Object.keys(countErrors).length ? { countErrors } : {}),
111
+ });
112
+ }
113
+ discovery.memorixDb = memorixDb;
114
+ return {
115
+ memorixDb,
116
+ entities,
117
+ discovery,
118
+ };
119
+ }
120
+ export async function buildMemorixEntitySlices(client, entityName) {
121
+ const entity = await loadMemorixEntityDescriptorByName(client, entityName);
122
+ const contentTypes = listEntityContentTypeKeys(entity);
123
+ const slices = [];
124
+ const sliceCountFailures = [];
125
+ let step = 0;
126
+ for (const contentType of contentTypes) {
127
+ try {
128
+ const count = await countMemorixEntityContentTypeDocuments(client, {
129
+ entityName,
130
+ contentType,
131
+ });
132
+ if (count > 0) {
133
+ slices.push({
134
+ contentType,
135
+ label: memorixContentTypeLabel(contentType),
136
+ count,
137
+ step: step++,
138
+ });
139
+ }
140
+ }
141
+ catch (e) {
142
+ sliceCountFailures.push({ contentType, error: errMsg(e) });
143
+ }
144
+ }
145
+ return {
146
+ entityName,
147
+ slices,
148
+ ...(sliceCountFailures.length ? { sliceCountFailures } : {}),
149
+ };
150
+ }
151
+ //# sourceMappingURL=entity-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-graph.js","sourceRoot":"","sources":["../../src/explorer/entity-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { MemorixRetrievalClient } from "../client/types.js";
2
+ export type MemorixRetrievalHealth = {
3
+ ok: boolean;
4
+ memorixDb: string | null;
5
+ mongoUriConfigured: boolean;
6
+ pingMs?: number;
7
+ discoverySample: string[];
8
+ cataloxAppId: string;
9
+ entitiesCatalogId: string;
10
+ discoverySource: string;
11
+ error?: string;
12
+ };
13
+ export declare function getMemorixRetrievalHealth(client: MemorixRetrievalClient): Promise<MemorixRetrievalHealth>;
14
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/explorer/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAIjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CA2EjC"}
@@ -0,0 +1,70 @@
1
+ import { discoverMemorixEntities } from "../descriptors/discover-entities.js";
2
+ import { resolveMongoUri } from "../mongo/env.js";
3
+ export async function getMemorixRetrievalHealth(client) {
4
+ const discovery = await discoverMemorixEntities(client);
5
+ const discoverySample = discovery.summaries
6
+ .slice(0, 16)
7
+ .map((s) => s.entityName);
8
+ let mongoUriConfigured = false;
9
+ try {
10
+ resolveMongoUri(client.processEnv);
11
+ mongoUriConfigured = true;
12
+ }
13
+ catch {
14
+ mongoUriConfigured = false;
15
+ }
16
+ if (!client.getMongo) {
17
+ return {
18
+ ok: discovery.summaries.length > 0,
19
+ memorixDb: null,
20
+ mongoUriConfigured,
21
+ discoverySample,
22
+ cataloxAppId: client.appId,
23
+ entitiesCatalogId: discovery.catalogId,
24
+ discoverySource: discovery.source,
25
+ error: discovery.hint,
26
+ };
27
+ }
28
+ const started = Date.now();
29
+ try {
30
+ const mongo = await client.getMongo();
31
+ await mongo.db().admin().ping();
32
+ const pingMs = Date.now() - started;
33
+ let memorixDb = null;
34
+ if (discovery.summaries[0]) {
35
+ const { loadMemorixEntityDescriptorByName } = await import("../descriptors/discover-entities.js");
36
+ const { resolveMemorixDbNameForEntity } = await import("../mongo/resolve-db.js");
37
+ try {
38
+ const entity = await loadMemorixEntityDescriptorByName(client, discovery.summaries[0].entityName);
39
+ memorixDb = resolveMemorixDbNameForEntity(entity, client);
40
+ }
41
+ catch {
42
+ memorixDb = null;
43
+ }
44
+ }
45
+ return {
46
+ ok: true,
47
+ memorixDb,
48
+ mongoUriConfigured,
49
+ pingMs,
50
+ discoverySample,
51
+ cataloxAppId: client.appId,
52
+ entitiesCatalogId: discovery.catalogId,
53
+ discoverySource: discovery.source,
54
+ ...(discovery.hint ? { error: discovery.hint } : {}),
55
+ };
56
+ }
57
+ catch (e) {
58
+ return {
59
+ ok: false,
60
+ memorixDb: null,
61
+ mongoUriConfigured,
62
+ discoverySample,
63
+ cataloxAppId: client.appId,
64
+ entitiesCatalogId: discovery.catalogId,
65
+ discoverySource: discovery.source,
66
+ error: e instanceof Error ? e.message : String(e),
67
+ };
68
+ }
69
+ }
70
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/explorer/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MemorixRetrievalClient } from "../client/types.js";
2
+ import { mergeMemorixMongoFilters, resolveMemorixRecordIdFilter, serializeMemorixDocumentForJson } from "../data/record-id.js";
3
+ export type RawMemorixEntityReadParams = {
4
+ entityName: string;
5
+ contentType: string;
6
+ filter?: Record<string, unknown>;
7
+ searchText?: string;
8
+ sort?: Record<string, 1 | -1>;
9
+ skip?: number;
10
+ limit?: number;
11
+ includeTotal?: boolean;
12
+ };
13
+ export type RawMemorixEntityListResult = {
14
+ documents: Record<string, unknown>[];
15
+ total?: number;
16
+ };
17
+ export declare function countMemorixEntityContentTypeDocuments(client: MemorixRetrievalClient, params: Pick<RawMemorixEntityReadParams, "entityName" | "contentType" | "filter" | "searchText">): Promise<number>;
18
+ export declare function listMemorixEntityContentTypeDocuments(client: MemorixRetrievalClient, params: RawMemorixEntityReadParams): Promise<RawMemorixEntityListResult>;
19
+ export declare function getMemorixEntityContentTypeDocument(client: MemorixRetrievalClient, params: {
20
+ entityName: string;
21
+ contentType: string;
22
+ recordId: string;
23
+ }): Promise<Record<string, unknown> | null>;
24
+ export { resolveMemorixRecordIdFilter, serializeMemorixDocumentForJson, mergeMemorixMongoFilters, };
25
+ //# sourceMappingURL=raw-reads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-reads.d.ts","sourceRoot":"","sources":["../../src/explorer/raw-reads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAEL,wBAAwB,EACxB,4BAA4B,EAC5B,+BAA+B,EAChC,MAAM,sBAAsB,CAAC;AAO9B,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA+BF,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,IAAI,CACV,0BAA0B,EAC1B,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,YAAY,CACvD,GACA,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CA4CrC;AAED,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAezC;AAED,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,wBAAwB,GACzB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { resolveMemorixCollectionName } from "../data/collection-name.js";
2
+ import { memorixLabelSearchFilter, mergeMemorixMongoFilters, resolveMemorixRecordIdFilter, serializeMemorixDocumentForJson, } from "../data/record-id.js";
3
+ import { loadMemorixEntityDescriptorByName } from "../descriptors/discover-entities.js";
4
+ import { memorixRead } from "../data/memorix-read.js";
5
+ import { countMemorixCollection } from "../mongo/read-collection.js";
6
+ import { resolveMemorixDbNameForEntity } from "../mongo/resolve-db.js";
7
+ async function resolveEntityAndCollection(client, entityName, contentType) {
8
+ const entity = await loadMemorixEntityDescriptorByName(client, entityName);
9
+ if (!entity.contentTypes[contentType]) {
10
+ throw new Error(`Unknown content type "${contentType}" for entity "${entityName}"`);
11
+ }
12
+ const collection = resolveMemorixCollectionName(entity, contentType, client.processEnv);
13
+ return { entity, collection };
14
+ }
15
+ function buildQuery(searchText, extraFilter) {
16
+ return mergeMemorixMongoFilters(memorixLabelSearchFilter(searchText), extraFilter);
17
+ }
18
+ export async function countMemorixEntityContentTypeDocuments(client, params) {
19
+ const { entity, collection } = await resolveEntityAndCollection(client, params.entityName, params.contentType);
20
+ const query = buildQuery(params.searchText, params.filter);
21
+ if (!client.getMongo) {
22
+ throw new Error("countMemorixEntityContentTypeDocuments requires Mongo access");
23
+ }
24
+ const mongo = await client.getMongo();
25
+ const db = resolveMemorixDbNameForEntity(entity, client);
26
+ return countMemorixCollection(mongo, { db, collection, query });
27
+ }
28
+ export async function listMemorixEntityContentTypeDocuments(client, params) {
29
+ const { entity, collection } = await resolveEntityAndCollection(client, params.entityName, params.contentType);
30
+ const query = buildQuery(params.searchText, params.filter);
31
+ const skip = Math.max(0, params.skip ?? 0);
32
+ const limit = Math.min(client.defaults.maxPageLimit, Math.max(1, params.limit ?? 50));
33
+ if (params.includeTotal && client.getMongo) {
34
+ const mongo = await client.getMongo();
35
+ const db = resolveMemorixDbNameForEntity(entity, client);
36
+ const [documents, total] = await Promise.all([
37
+ memorixRead(client, {
38
+ entity,
39
+ source: collection,
40
+ query,
41
+ sort: params.sort,
42
+ skip,
43
+ limit,
44
+ }),
45
+ countMemorixCollection(mongo, { db, collection, query }),
46
+ ]);
47
+ return {
48
+ documents: documents.map((d) => serializeMemorixDocumentForJson(d)),
49
+ total,
50
+ };
51
+ }
52
+ const documents = await memorixRead(client, {
53
+ entity,
54
+ source: collection,
55
+ query,
56
+ sort: params.sort,
57
+ skip,
58
+ limit,
59
+ });
60
+ return {
61
+ documents: documents.map((d) => serializeMemorixDocumentForJson(d)),
62
+ };
63
+ }
64
+ export async function getMemorixEntityContentTypeDocument(client, params) {
65
+ const { entity, collection } = await resolveEntityAndCollection(client, params.entityName, params.contentType);
66
+ const filter = resolveMemorixRecordIdFilter(params.recordId);
67
+ const docs = await memorixRead(client, {
68
+ entity,
69
+ source: collection,
70
+ query: filter,
71
+ limit: 1,
72
+ });
73
+ if (!docs.length)
74
+ return null;
75
+ return serializeMemorixDocumentForJson(docs[0]);
76
+ }
77
+ export { resolveMemorixRecordIdFilter, serializeMemorixDocumentForJson, mergeMemorixMongoFilters, };
78
+ //# sourceMappingURL=raw-reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-reads.js","sourceRoot":"","sources":["../../src/explorer/raw-reads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { MemorixRetrievalClient } from "../client/types.js";
2
+ export type ScopedWorkspaceOptions = {
3
+ namespace?: string;
4
+ namespaceFieldPaths?: readonly string[];
5
+ searchText?: string;
6
+ skip?: number;
7
+ limit?: number;
8
+ includeTotal?: boolean;
9
+ };
10
+ export declare function resolveScopedWorkspaceNamespace(env?: NodeJS.ProcessEnv): string | undefined;
11
+ export declare function resolveScopedNamespaceFieldPaths(env?: NodeJS.ProcessEnv): readonly string[];
12
+ export declare function listScopedWorkspaceEntityTypes(client: MemorixRetrievalClient, options?: Pick<ScopedWorkspaceOptions, "namespace" | "namespaceFieldPaths">): Promise<{
13
+ generatedAt: string;
14
+ entityTypes: Array<{
15
+ typeKey: string;
16
+ docCount: number;
17
+ }>;
18
+ }>;
19
+ export declare function listScopedWorkspaceDocuments(client: MemorixRetrievalClient, options?: ScopedWorkspaceOptions): Promise<{
20
+ documents: Record<string, unknown>[];
21
+ total?: number;
22
+ }>;
23
+ export declare function countScopedWorkspaceDocuments(client: MemorixRetrievalClient, options?: Pick<ScopedWorkspaceOptions, "namespace" | "namespaceFieldPaths" | "searchText">): Promise<number>;
24
+ //# sourceMappingURL=scoped-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-workspace.d.ts","sourceRoot":"","sources":["../../src/explorer/scoped-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAgBjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAQF,wBAAgB,+BAA+B,CAC7C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,MAAM,EAAE,CAMnB;AAoCD,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,qBAAqB,CAAM,GAC9E,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D,CAAC,CAsDD;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuHnE;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,IAAI,CACX,sBAAsB,EACtB,WAAW,GAAG,qBAAqB,GAAG,YAAY,CAC9C,GACL,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
@@ -0,0 +1,217 @@
1
+ import { resolveMemorixCollectionName } from "../data/collection-name.js";
2
+ import { memorixLabelSearchFilter, mergeMemorixMongoFilters, serializeMemorixDocumentForJson, } from "../data/record-id.js";
3
+ import { discoverMemorixEntities, loadMemorixEntityDescriptorByName, } from "../descriptors/discover-entities.js";
4
+ import { primaryEntityContentType } from "../descriptors/content-type-labels.js";
5
+ import { memorixRead } from "../data/memorix-read.js";
6
+ import { countMemorixCollection } from "../mongo/read-collection.js";
7
+ import { resolveMemorixDbNameForEntity } from "../mongo/resolve-db.js";
8
+ const DEFAULT_NAMESPACE_FIELD_PATHS = [
9
+ "namespace",
10
+ "xmemory.namespace",
11
+ "sourceDatabase",
12
+ ];
13
+ export function resolveScopedWorkspaceNamespace(env = process.env) {
14
+ return (env.MEMORIX_SCOPED_NAMESPACE?.trim() ||
15
+ env.TARGET_NAMESPACE?.trim() ||
16
+ env.XMEMORY_NAMESPACE?.trim() ||
17
+ undefined);
18
+ }
19
+ export function resolveScopedNamespaceFieldPaths(env = process.env) {
20
+ const fromEnv = env.MEMORIX_SCOPED_NAMESPACE_FIELDS?.trim();
21
+ if (fromEnv) {
22
+ return fromEnv.split(/[,;\s]+/).map((s) => s.trim()).filter(Boolean);
23
+ }
24
+ return DEFAULT_NAMESPACE_FIELD_PATHS;
25
+ }
26
+ function namespaceFilter(namespace, fieldPaths) {
27
+ const or = fieldPaths.map((path) => ({ [path]: namespace }));
28
+ return or.length === 1 ? or[0] : { $or: or };
29
+ }
30
+ async function scopedQueryForEntity(client, entityName, namespace, fieldPaths, searchText) {
31
+ const entity = await loadMemorixEntityDescriptorByName(client, entityName);
32
+ const contentType = primaryEntityContentType(entity);
33
+ if (!entity.contentTypes[contentType])
34
+ return null;
35
+ const collection = resolveMemorixCollectionName(entity, contentType, client.processEnv);
36
+ const query = mergeMemorixMongoFilters(namespaceFilter(namespace, fieldPaths), memorixLabelSearchFilter(searchText));
37
+ return { entity, collection, query };
38
+ }
39
+ export async function listScopedWorkspaceEntityTypes(client, options = {}) {
40
+ const namespace = options.namespace ?? resolveScopedWorkspaceNamespace(client.processEnv);
41
+ if (!namespace) {
42
+ throw new Error("Scoped workspace requires MEMORIX_SCOPED_NAMESPACE, TARGET_NAMESPACE, or XMEMORY_NAMESPACE");
43
+ }
44
+ const fieldPaths = options.namespaceFieldPaths ??
45
+ resolveScopedNamespaceFieldPaths(client.processEnv);
46
+ const discovery = await discoverMemorixEntities(client);
47
+ const entityTypes = [];
48
+ for (const summary of discovery.summaries) {
49
+ try {
50
+ const scoped = await scopedQueryForEntity(client, summary.entityName, namespace, fieldPaths);
51
+ if (!scoped)
52
+ continue;
53
+ let count = 0;
54
+ if (client.getMongo) {
55
+ const mongo = await client.getMongo();
56
+ const db = resolveMemorixDbNameForEntity(scoped.entity, client);
57
+ count = await countMemorixCollection(mongo, {
58
+ db,
59
+ collection: scoped.collection,
60
+ query: scoped.query,
61
+ });
62
+ }
63
+ else {
64
+ const rows = await memorixRead(client, {
65
+ entity: scoped.entity,
66
+ source: scoped.collection,
67
+ query: scoped.query,
68
+ limit: 0,
69
+ });
70
+ count = rows.length;
71
+ }
72
+ if (count > 0) {
73
+ entityTypes.push({ typeKey: summary.entityName, docCount: count });
74
+ }
75
+ }
76
+ catch {
77
+ /* skip entity on count failure */
78
+ }
79
+ }
80
+ return {
81
+ generatedAt: new Date().toISOString(),
82
+ entityTypes,
83
+ };
84
+ }
85
+ export async function listScopedWorkspaceDocuments(client, options = {}) {
86
+ const namespace = options.namespace ?? resolveScopedWorkspaceNamespace(client.processEnv);
87
+ if (!namespace) {
88
+ throw new Error("Scoped workspace requires MEMORIX_SCOPED_NAMESPACE, TARGET_NAMESPACE, or XMEMORY_NAMESPACE");
89
+ }
90
+ const fieldPaths = options.namespaceFieldPaths ??
91
+ resolveScopedNamespaceFieldPaths(client.processEnv);
92
+ const skip = Math.max(0, options.skip ?? 0);
93
+ const limit = Math.min(client.defaults.maxPageLimit, Math.max(1, options.limit ?? 50));
94
+ const discovery = await discoverMemorixEntities(client);
95
+ const documents = [];
96
+ let remainingSkip = skip;
97
+ let remainingLimit = limit;
98
+ for (const summary of discovery.summaries) {
99
+ if (remainingLimit <= 0)
100
+ break;
101
+ const scoped = await scopedQueryForEntity(client, summary.entityName, namespace, fieldPaths, options.searchText);
102
+ if (!scoped)
103
+ continue;
104
+ if (options.includeTotal && client.getMongo) {
105
+ continue;
106
+ }
107
+ const rows = await memorixRead(client, {
108
+ entity: scoped.entity,
109
+ source: scoped.collection,
110
+ query: scoped.query,
111
+ sort: { _id: -1 },
112
+ skip: remainingSkip,
113
+ limit: remainingLimit,
114
+ });
115
+ if (rows.length === 0) {
116
+ if (remainingSkip > 0) {
117
+ let entityCount = 0;
118
+ if (client.getMongo) {
119
+ const mongo = await client.getMongo();
120
+ const db = resolveMemorixDbNameForEntity(scoped.entity, client);
121
+ entityCount = await countMemorixCollection(mongo, {
122
+ db,
123
+ collection: scoped.collection,
124
+ query: scoped.query,
125
+ });
126
+ }
127
+ if (entityCount <= remainingSkip) {
128
+ remainingSkip -= entityCount;
129
+ continue;
130
+ }
131
+ remainingSkip = 0;
132
+ const retryRows = await memorixRead(client, {
133
+ entity: scoped.entity,
134
+ source: scoped.collection,
135
+ query: scoped.query,
136
+ sort: { _id: -1 },
137
+ skip: 0,
138
+ limit: remainingLimit,
139
+ });
140
+ for (const row of retryRows) {
141
+ documents.push({
142
+ entityName: summary.entityName,
143
+ contentType: primaryEntityContentType(scoped.entity),
144
+ ...serializeMemorixDocumentForJson(row),
145
+ });
146
+ remainingLimit -= 1;
147
+ if (remainingLimit <= 0)
148
+ break;
149
+ }
150
+ }
151
+ continue;
152
+ }
153
+ for (const row of rows) {
154
+ documents.push({
155
+ entityName: summary.entityName,
156
+ contentType: primaryEntityContentType(scoped.entity),
157
+ ...serializeMemorixDocumentForJson(row),
158
+ });
159
+ remainingLimit -= 1;
160
+ if (remainingLimit <= 0)
161
+ break;
162
+ }
163
+ remainingSkip = 0;
164
+ }
165
+ if (options.includeTotal && client.getMongo) {
166
+ let total = 0;
167
+ for (const summary of discovery.summaries) {
168
+ const scoped = await scopedQueryForEntity(client, summary.entityName, namespace, fieldPaths, options.searchText);
169
+ if (!scoped)
170
+ continue;
171
+ const mongo = await client.getMongo();
172
+ const db = resolveMemorixDbNameForEntity(scoped.entity, client);
173
+ total += await countMemorixCollection(mongo, {
174
+ db,
175
+ collection: scoped.collection,
176
+ query: scoped.query,
177
+ });
178
+ }
179
+ return { documents, total };
180
+ }
181
+ return { documents };
182
+ }
183
+ export async function countScopedWorkspaceDocuments(client, options = {}) {
184
+ const namespace = options.namespace ?? resolveScopedWorkspaceNamespace(client.processEnv);
185
+ if (!namespace) {
186
+ throw new Error("Scoped workspace requires MEMORIX_SCOPED_NAMESPACE, TARGET_NAMESPACE, or XMEMORY_NAMESPACE");
187
+ }
188
+ const fieldPaths = options.namespaceFieldPaths ??
189
+ resolveScopedNamespaceFieldPaths(client.processEnv);
190
+ const discovery = await discoverMemorixEntities(client);
191
+ let total = 0;
192
+ for (const summary of discovery.summaries) {
193
+ const scoped = await scopedQueryForEntity(client, summary.entityName, namespace, fieldPaths, options.searchText);
194
+ if (!scoped)
195
+ continue;
196
+ if (client.getMongo) {
197
+ const mongo = await client.getMongo();
198
+ const db = resolveMemorixDbNameForEntity(scoped.entity, client);
199
+ total += await countMemorixCollection(mongo, {
200
+ db,
201
+ collection: scoped.collection,
202
+ query: scoped.query,
203
+ });
204
+ }
205
+ else {
206
+ const rows = await memorixRead(client, {
207
+ entity: scoped.entity,
208
+ source: scoped.collection,
209
+ query: scoped.query,
210
+ limit: 0,
211
+ });
212
+ total += rows.length;
213
+ }
214
+ }
215
+ return total;
216
+ }
217
+ //# sourceMappingURL=scoped-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-workspace.js","sourceRoot":"","sources":["../../src/explorer/scoped-workspace.ts"],"names":[],"mappings":"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"}