@x12i/memorix-hippox 1.0.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 (58) hide show
  1. package/README.md +96 -0
  2. package/dist/collection-resolver.d.ts +16 -0
  3. package/dist/collection-resolver.d.ts.map +1 -0
  4. package/dist/collection-resolver.js +121 -0
  5. package/dist/collection-resolver.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +24 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/filters.d.ts +10 -0
  11. package/dist/filters.d.ts.map +1 -0
  12. package/dist/filters.js +75 -0
  13. package/dist/filters.js.map +1 -0
  14. package/dist/http/register-routes.d.ts +12 -0
  15. package/dist/http/register-routes.d.ts.map +1 -0
  16. package/dist/http/register-routes.js +90 -0
  17. package/dist/http/register-routes.js.map +1 -0
  18. package/dist/index-recommendations.d.ts +4 -0
  19. package/dist/index-recommendations.d.ts.map +1 -0
  20. package/dist/index-recommendations.js +40 -0
  21. package/dist/index-recommendations.js.map +1 -0
  22. package/dist/index.d.ts +14 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +13 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/legacy-bridge.d.ts +27 -0
  27. package/dist/legacy-bridge.d.ts.map +1 -0
  28. package/dist/legacy-bridge.js +53 -0
  29. package/dist/legacy-bridge.js.map +1 -0
  30. package/dist/paths.d.ts +15 -0
  31. package/dist/paths.d.ts.map +1 -0
  32. package/dist/paths.js +79 -0
  33. package/dist/paths.js.map +1 -0
  34. package/dist/resolve.d.ts +11 -0
  35. package/dist/resolve.d.ts.map +1 -0
  36. package/dist/resolve.js +180 -0
  37. package/dist/resolve.js.map +1 -0
  38. package/dist/service.d.ts +43 -0
  39. package/dist/service.d.ts.map +1 -0
  40. package/dist/service.js +96 -0
  41. package/dist/service.js.map +1 -0
  42. package/dist/simulate.d.ts +11 -0
  43. package/dist/simulate.d.ts.map +1 -0
  44. package/dist/simulate.js +211 -0
  45. package/dist/simulate.js.map +1 -0
  46. package/dist/store.d.ts +39 -0
  47. package/dist/store.d.ts.map +1 -0
  48. package/dist/store.js +180 -0
  49. package/dist/store.js.map +1 -0
  50. package/dist/types.d.ts +135 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/validation.d.ts +18 -0
  55. package/dist/validation.d.ts.map +1 -0
  56. package/dist/validation.js +107 -0
  57. package/dist/validation.js.map +1 -0
  58. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-bridge.d.ts","sourceRoot":"","sources":["../src/legacy-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGzF,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,GAAG;IAC3D,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,GAAG;IAC9E,KAAK,EAAE,wBAAwB,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,oBAAoB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAiCtE;AASD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAUjE"}
@@ -0,0 +1,53 @@
1
+ import { resolveJobMemoryFromLinks, } from '@x12i/memorix-mongo';
2
+ import { resolveContext } from './resolve.js';
3
+ /**
4
+ * Resolve Hippox approved links into object-keyed `jobMemory.context` and optionally
5
+ * merge legacy relation-based context entries under `_legacy`.
6
+ */
7
+ export async function resolveMixedContext(options) {
8
+ const { retrieval, store, input, processEnv } = options;
9
+ const hippoxResult = await resolveContext({
10
+ retrieval,
11
+ store,
12
+ processEnv,
13
+ input,
14
+ });
15
+ if (!input.legacyContextLinks?.length) {
16
+ return hippoxResult;
17
+ }
18
+ const sourceEntity = input.sourceEntity
19
+ ?? input.sourceObjectType
20
+ ?? inferSourceEntity(input.sourceRecord);
21
+ if (!sourceEntity) {
22
+ throw new Error('sourceEntity is required when resolving legacy context links');
23
+ }
24
+ const sourceRecord = input.sourceRecord ?? {};
25
+ const legacyJobMemory = await resolveJobMemoryFromLinks(retrieval, {
26
+ input: sourceRecord,
27
+ sourceEntity,
28
+ contextLinks: input.legacyContextLinks,
29
+ });
30
+ return {
31
+ ...hippoxResult,
32
+ legacy: legacyJobMemory,
33
+ };
34
+ }
35
+ function inferSourceEntity(record) {
36
+ const ref = record?._memorixRef;
37
+ if (!ref || typeof ref !== 'object' || Array.isArray(ref))
38
+ return undefined;
39
+ const entityName = ref.entityName;
40
+ return typeof entityName === 'string' && entityName.trim() ? entityName.trim() : undefined;
41
+ }
42
+ export function hippoxLinkFromRelationCandidate(params) {
43
+ return {
44
+ sourceObjectType: params.sourceEntity,
45
+ targetObjectType: params.targetEntity,
46
+ direction: 'downstream',
47
+ sourceContentType: params.sourceContentType,
48
+ targetContentType: params.targetContentType,
49
+ join: [{ sourcePath: params.sourcePath, targetPath: params.targetPath, operator: 'eq' }],
50
+ retrieval: { type: 'record', outputMode: 'data' },
51
+ };
52
+ }
53
+ //# sourceMappingURL=legacy-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-bridge.js","sourceRoot":"","sources":["../src/legacy-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAA8B,MAAM,cAAc,CAAC;AAa1E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmC;IAEnC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC;QACxC,SAAS;QACT,KAAK;QACL,UAAU;QACV,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QACtC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAChB,KAAK,CAAC,YAAY;WACf,KAAK,CAAC,gBAAgB;WACtB,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IAC9C,MAAM,eAAe,GAAG,MAAM,yBAAyB,CAAC,SAAS,EAAE;QACjE,KAAK,EAAE,YAAY;QACnB,YAAY;QACZ,YAAY,EAAE,KAAK,CAAC,kBAAkB;KACvC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,YAAY;QACf,MAAM,EAAE,eAAe;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAgC;IACzD,MAAM,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5E,MAAM,UAAU,GAAI,GAA+B,CAAC,UAAU,CAAC;IAC/D,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,MAQ/C;IACC,OAAO;QACL,gBAAgB,EAAE,MAAM,CAAC,YAAY;QACrC,gBAAgB,EAAE,MAAM,CAAC,YAAY;QACrC,SAAS,EAAE,YAAY;QACvB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACxF,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Read a nested dot-path from a plain object. */
2
+ export declare function readPath(doc: Record<string, unknown>, path: string): unknown;
3
+ export declare function readRecordId(doc: Record<string, unknown>): string;
4
+ export declare function isDateLike(value: unknown): boolean;
5
+ export declare function coerceDateValue(value: unknown): Date | unknown;
6
+ export declare function sortSpecsToMongo(specs: Array<{
7
+ path: string;
8
+ direction: 'asc' | 'desc';
9
+ }> | undefined, fallback: Array<{
10
+ path: string;
11
+ direction: 'asc' | 'desc';
12
+ }>): Record<string, 1 | -1>;
13
+ export declare function extractDataPayload(doc: Record<string, unknown>): Record<string, unknown>;
14
+ export declare function formatOutputRecord(doc: Record<string, unknown>, mode: 'data' | 'record' | 'dataWithRecordId'): unknown;
15
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAY5E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAiBjE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOlD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAI9D;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,EACrE,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,GAC3D,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAOxB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMxF;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,kBAAkB,GAC3C,OAAO,CAOT"}
package/dist/paths.js ADDED
@@ -0,0 +1,79 @@
1
+ /** Read a nested dot-path from a plain object. */
2
+ export function readPath(doc, path) {
3
+ const trimmed = path.trim();
4
+ if (!trimmed)
5
+ return undefined;
6
+ if (!trimmed.includes('.'))
7
+ return doc[trimmed];
8
+ let current = doc;
9
+ for (const segment of trimmed.split('.')) {
10
+ if (current === null || current === undefined || typeof current !== 'object' || Array.isArray(current)) {
11
+ return undefined;
12
+ }
13
+ current = current[segment];
14
+ }
15
+ return current;
16
+ }
17
+ export function readRecordId(doc) {
18
+ const candidates = [
19
+ doc._id,
20
+ doc.recordId,
21
+ doc.entityId,
22
+ doc.eventId,
23
+ doc.knowledgeId,
24
+ readPath(doc, 'data.entityId'),
25
+ readPath(doc, 'data.eventId'),
26
+ readPath(doc, 'data.knowledgeId'),
27
+ ];
28
+ for (const value of candidates) {
29
+ if (value === null || value === undefined)
30
+ continue;
31
+ const str = String(value).trim();
32
+ if (str)
33
+ return str;
34
+ }
35
+ return '';
36
+ }
37
+ export function isDateLike(value) {
38
+ if (value instanceof Date)
39
+ return true;
40
+ if (typeof value !== 'string')
41
+ return false;
42
+ const trimmed = value.trim();
43
+ if (!trimmed)
44
+ return false;
45
+ const parsed = Date.parse(trimmed);
46
+ return Number.isFinite(parsed);
47
+ }
48
+ export function coerceDateValue(value) {
49
+ if (value instanceof Date)
50
+ return value;
51
+ if (typeof value === 'string' && isDateLike(value))
52
+ return new Date(value);
53
+ return value;
54
+ }
55
+ export function sortSpecsToMongo(specs, fallback) {
56
+ const chosen = specs?.length ? specs : fallback;
57
+ const out = {};
58
+ for (const spec of chosen) {
59
+ out[spec.path] = spec.direction === 'asc' ? 1 : -1;
60
+ }
61
+ return out;
62
+ }
63
+ export function extractDataPayload(doc) {
64
+ const data = doc.data;
65
+ if (data && typeof data === 'object' && !Array.isArray(data)) {
66
+ return data;
67
+ }
68
+ return doc;
69
+ }
70
+ export function formatOutputRecord(doc, mode) {
71
+ if (mode === 'record')
72
+ return doc;
73
+ const data = extractDataPayload(doc);
74
+ if (mode === 'dataWithRecordId') {
75
+ return { ...data, recordId: readRecordId(doc) };
76
+ }
77
+ return data;
78
+ }
79
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import type { ResolveContextInput, ResolveContextResult } from './types.js';
3
+ import type { HippoxStore } from './store.js';
4
+ export type ResolveContextOptions = {
5
+ retrieval: MemorixRetrievalClient;
6
+ store?: HippoxStore;
7
+ input: ResolveContextInput;
8
+ processEnv?: NodeJS.ProcessEnv;
9
+ };
10
+ export declare function resolveContext(options: ResolveContextOptions): Promise<ResolveContextResult>;
11
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAStE,OAAO,KAAK,EAMV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC,CAAC;AAQF,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoElG"}
@@ -0,0 +1,180 @@
1
+ import { loadHippoxConfig } from './config.js';
2
+ import { buildTargetQueryFromLink } from './filters.js';
3
+ import { loadSourceRecord, readObjectTypeDocuments, resolveObjectTypeCollection, } from './collection-resolver.js';
4
+ import { readPath, readRecordId, formatOutputRecord, sortSpecsToMongo } from './paths.js';
5
+ import { contextKeyForLink, detectContextKeyCollisions } from './validation.js';
6
+ const DEFAULT_SCOPED_AT_SORT = [{ path: 'data.scopedAt', direction: 'desc' }];
7
+ const FALLBACK_RECORD_SORT = [
8
+ { path: 'updatedAt', direction: 'desc' },
9
+ { path: '_id', direction: 'asc' },
10
+ ];
11
+ export async function resolveContext(options) {
12
+ const { retrieval, store, input } = options;
13
+ const config = loadHippoxConfig(options.processEnv);
14
+ const links = [];
15
+ if (input.linkIds?.length) {
16
+ if (!store)
17
+ throw new Error('store is required when resolving by linkIds');
18
+ const stored = await store.getApprovedByIds(input.linkIds);
19
+ if (stored.length !== input.linkIds.length) {
20
+ const found = new Set(stored.map((l) => l.id));
21
+ const missing = input.linkIds.filter((id) => !found.has(id));
22
+ throw new Error(`approved links not found: ${missing.join(', ')}`);
23
+ }
24
+ links.push(...stored);
25
+ }
26
+ if (input.links?.length) {
27
+ for (const link of input.links) {
28
+ if (link.status !== 'approved') {
29
+ throw new Error(`link ${link.id} must be approved for runtime resolution`);
30
+ }
31
+ if (!links.some((existing) => existing.id === link.id)) {
32
+ links.push(link);
33
+ }
34
+ }
35
+ }
36
+ if (links.length === 0) {
37
+ return { jobMemory: { context: {} } };
38
+ }
39
+ const collision = detectContextKeyCollisions(links);
40
+ if (collision) {
41
+ throw new Error(`context key collision for "${collision}" — assign aliases or reduce links targeting the same object type`);
42
+ }
43
+ const sourceObjectType = input.sourceObjectType
44
+ ?? inferSourceObjectType(links)
45
+ ?? inferSourceObjectTypeFromRecord(input.sourceRecord);
46
+ if (!sourceObjectType) {
47
+ throw new Error('sourceObjectType could not be inferred');
48
+ }
49
+ const sourceRecord = await loadSourceRecord(retrieval, sourceObjectType, {
50
+ recordId: input.sourceRecordId,
51
+ record: input.sourceRecord,
52
+ contentType: links[0]?.sourceContentType,
53
+ });
54
+ const context = {};
55
+ const usedLinkIds = [];
56
+ for (const link of links) {
57
+ const key = contextKeyForLink(link);
58
+ const outputMode = input.outputMode ?? defaultOutputMode(link);
59
+ context[key] = await resolveLinkContext(retrieval, link, sourceRecord, outputMode, config.contextListLimit);
60
+ usedLinkIds.push(link.id);
61
+ }
62
+ if (store && usedLinkIds.length > 0) {
63
+ await store.recordUsage(usedLinkIds);
64
+ }
65
+ return { jobMemory: { context } };
66
+ }
67
+ function inferSourceObjectType(links) {
68
+ return links[0]?.sourceObjectType;
69
+ }
70
+ function inferSourceObjectTypeFromRecord(record) {
71
+ const ref = record?._memorixRef;
72
+ if (!ref || typeof ref !== 'object' || Array.isArray(ref))
73
+ return undefined;
74
+ const entityName = ref.entityName;
75
+ return typeof entityName === 'string' && entityName.trim() ? entityName.trim() : undefined;
76
+ }
77
+ function defaultOutputMode(link) {
78
+ const retrieval = link.retrieval;
79
+ if (retrieval.type === 'record')
80
+ return retrieval.outputMode ?? 'data';
81
+ if (retrieval.type === 'list')
82
+ return retrieval.outputMode ?? 'data';
83
+ return 'data';
84
+ }
85
+ async function resolveLinkContext(retrieval, link, sourceRecord, outputMode, defaultListLimit) {
86
+ const query = buildTargetQueryFromLink(link, sourceRecord);
87
+ if (!query)
88
+ return link.retrieval.type === 'aggregate' ? {} : null;
89
+ const targetBinding = await resolveObjectTypeCollection(retrieval, link.targetObjectType, link.targetContentType);
90
+ if (link.retrieval.type === 'record') {
91
+ return resolveRecordContext(retrieval, targetBinding, query, link.retrieval, outputMode);
92
+ }
93
+ if (link.retrieval.type === 'list') {
94
+ return resolveListContext(retrieval, targetBinding, query, link.retrieval, outputMode, defaultListLimit);
95
+ }
96
+ return resolveAggregateContext(retrieval, targetBinding, query, link.retrieval);
97
+ }
98
+ async function resolveRecordContext(retrieval, targetBinding, query, retrievalSpec, outputModeOverride) {
99
+ const dateField = retrievalSpec.dateField ?? 'data.scopedAt';
100
+ const sort = sortSpecsToMongo(retrievalSpec.sort, [
101
+ { path: dateField, direction: 'desc' },
102
+ ...FALLBACK_RECORD_SORT,
103
+ ]);
104
+ const docs = await readObjectTypeDocuments(retrieval, targetBinding, {
105
+ query,
106
+ limit: 25,
107
+ sort,
108
+ });
109
+ if (docs.length === 0)
110
+ return null;
111
+ const best = pickBestRecord(docs, dateField, sort);
112
+ const mode = outputModeOverride ?? retrievalSpec.outputMode ?? 'data';
113
+ return formatOutputRecord(best, mode);
114
+ }
115
+ function pickBestRecord(docs, dateField, sort) {
116
+ const sorted = [...docs].sort((a, b) => compareBySortSpec(a, b, sort));
117
+ return sorted[0] ?? docs[0];
118
+ }
119
+ async function resolveListContext(retrieval, targetBinding, query, retrievalSpec, outputModeOverride, defaultListLimit) {
120
+ const limit = retrievalSpec.limit ?? defaultListLimit;
121
+ if (!Number.isFinite(limit) || limit <= 0) {
122
+ throw new Error('list context limit is mandatory and must be positive');
123
+ }
124
+ const sort = sortSpecsToMongo(retrievalSpec.sort, DEFAULT_SCOPED_AT_SORT);
125
+ const docs = await readObjectTypeDocuments(retrieval, targetBinding, {
126
+ query,
127
+ limit,
128
+ sort,
129
+ });
130
+ const mode = outputModeOverride ?? retrievalSpec.outputMode ?? 'data';
131
+ return docs.map((doc) => formatOutputRecord(doc, mode));
132
+ }
133
+ async function resolveAggregateContext(retrieval, targetBinding, query, retrievalSpec) {
134
+ const docs = await readObjectTypeDocuments(retrieval, targetBinding, {
135
+ query,
136
+ limit: 5000,
137
+ });
138
+ const out = {};
139
+ for (const propertyPath of retrievalSpec.properties) {
140
+ const leaf = propertyPath.split('.').pop() ?? propertyPath;
141
+ const counts = {};
142
+ for (const doc of docs) {
143
+ const value = readPath(doc, propertyPath);
144
+ const key = normalizeAggregateKey(value);
145
+ counts[key] = (counts[key] ?? 0) + 1;
146
+ }
147
+ out[leaf] = counts;
148
+ }
149
+ return out;
150
+ }
151
+ function normalizeAggregateKey(value) {
152
+ if (value === null || value === undefined)
153
+ return 'null';
154
+ if (typeof value === 'object')
155
+ return JSON.stringify(value);
156
+ return String(value);
157
+ }
158
+ function compareBySortSpec(a, b, sort) {
159
+ for (const [path, direction] of Object.entries(sort)) {
160
+ const av = readPath(a, path) ?? a[path];
161
+ const bv = readPath(b, path) ?? b[path];
162
+ if (av === bv)
163
+ continue;
164
+ if (av === undefined || av === null)
165
+ return direction;
166
+ if (bv === undefined || bv === null)
167
+ return -direction;
168
+ if (av < bv)
169
+ return -direction;
170
+ if (av > bv)
171
+ return direction;
172
+ }
173
+ return compareIds(readRecordId(a), readRecordId(b));
174
+ }
175
+ function compareIds(a, b) {
176
+ if (a === b)
177
+ return 0;
178
+ return a < b ? -1 : 1;
179
+ }
180
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import { HippoxStore } from './store.js';
3
+ import type { ContextLink, ContextLinkInput, ResolveContextInput, SimulationSummary } from './types.js';
4
+ import { HippoxValidationError } from './validation.js';
5
+ export type HippoxServiceOptions = {
6
+ retrieval: MemorixRetrievalClient;
7
+ processEnv?: NodeJS.ProcessEnv;
8
+ store?: HippoxStore;
9
+ };
10
+ export declare class HippoxService {
11
+ readonly retrieval: MemorixRetrievalClient;
12
+ readonly store: HippoxStore;
13
+ private readonly processEnv;
14
+ private constructor();
15
+ static create(options: HippoxServiceOptions): Promise<HippoxService>;
16
+ close(): Promise<void>;
17
+ listLinks(sourceObjectType: string): Promise<ContextLink[]>;
18
+ createDraftLink(input: ContextLinkInput): Promise<ContextLink>;
19
+ getLink(id: string): Promise<ContextLink | null>;
20
+ simulateLinkById(id: string): Promise<{
21
+ link: ContextLink;
22
+ simulation: SimulationSummary;
23
+ }>;
24
+ simulateInlineLink(input: ContextLinkInput): Promise<{
25
+ link: ContextLink;
26
+ simulation: SimulationSummary;
27
+ }>;
28
+ simulateAndPersist(id: string): Promise<{
29
+ link: ContextLink;
30
+ simulation: SimulationSummary;
31
+ }>;
32
+ approveLink(id: string): Promise<ContextLink>;
33
+ resolveContextInput(input: ResolveContextInput): Promise<import("./types.js").ResolveContextResult>;
34
+ resolveMixedContextInput(input: ResolveContextInput & {
35
+ legacyContextLinks?: import('@x12i/memorix-mongo').JobContextLink[];
36
+ sourceEntity?: string;
37
+ }): Promise<import("./types.js").ResolveContextResult & {
38
+ legacy?: Record<string, unknown>;
39
+ }>;
40
+ private simulateLinkDefinition;
41
+ }
42
+ export declare function isHippoxValidationError(err: unknown): err is HippoxValidationError;
43
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAI5D,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAA4B,MAAM,iBAAiB,CAAC;AAElF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,sBAAsB,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C,OAAO;WAMM,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQpE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI3D,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIhD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAM3F,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAqB1G,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAU7F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI7C,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAS9C,wBAAwB,CAC5B,KAAK,EAAE,mBAAmB,GAAG;QAC3B,kBAAkB,CAAC,EAAE,OAAO,qBAAqB,EAAE,cAAc,EAAE,CAAC;QACpE,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;;;YAUW,sBAAsB;CAQrC;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAElF"}
@@ -0,0 +1,96 @@
1
+ import { HippoxStore, createHippoxStore } from './store.js';
2
+ import { simulateContextLink } from './simulate.js';
3
+ import { resolveContext } from './resolve.js';
4
+ import { resolveMixedContext } from './legacy-bridge.js';
5
+ import { HippoxValidationError, validateContextLinkInput } from './validation.js';
6
+ export class HippoxService {
7
+ retrieval;
8
+ store;
9
+ processEnv;
10
+ constructor(options) {
11
+ this.retrieval = options.retrieval;
12
+ this.store = options.store;
13
+ this.processEnv = options.processEnv ?? process.env;
14
+ }
15
+ static async create(options) {
16
+ const store = options.store ?? await createHippoxStore({
17
+ retrieval: options.retrieval,
18
+ processEnv: options.processEnv,
19
+ });
20
+ return new HippoxService({ ...options, store });
21
+ }
22
+ async close() {
23
+ await this.store.close();
24
+ }
25
+ async listLinks(sourceObjectType) {
26
+ return this.store.listBySourceObjectType(sourceObjectType);
27
+ }
28
+ async createDraftLink(input) {
29
+ return this.store.createDraft(validateContextLinkInput(input));
30
+ }
31
+ async getLink(id) {
32
+ return this.store.getById(id);
33
+ }
34
+ async simulateLinkById(id) {
35
+ const link = await this.store.getById(id);
36
+ if (!link)
37
+ throw new Error(`context link not found: ${id}`);
38
+ return this.simulateLinkDefinition(link);
39
+ }
40
+ async simulateInlineLink(input) {
41
+ const validated = validateContextLinkInput(input);
42
+ const now = new Date().toISOString();
43
+ const link = {
44
+ id: validated.id ?? 'inline',
45
+ sourceObjectType: validated.sourceObjectType,
46
+ targetObjectType: validated.targetObjectType,
47
+ alias: validated.alias,
48
+ direction: validated.direction,
49
+ sourceContentType: validated.sourceContentType,
50
+ targetContentType: validated.targetContentType,
51
+ join: validated.join,
52
+ fixedFilters: validated.fixedFilters,
53
+ retrieval: validated.retrieval,
54
+ status: 'draft',
55
+ createdAt: now,
56
+ updatedAt: now,
57
+ };
58
+ return this.simulateLinkDefinition(link);
59
+ }
60
+ async simulateAndPersist(id) {
61
+ const { link, simulation } = await this.simulateLinkById(id);
62
+ const updated = await this.store.saveSimulationResult(id, simulation, simulation.indexRecommendations);
63
+ return { link: updated, simulation };
64
+ }
65
+ async approveLink(id) {
66
+ return this.store.approve(id);
67
+ }
68
+ async resolveContextInput(input) {
69
+ return resolveContext({
70
+ retrieval: this.retrieval,
71
+ store: this.store,
72
+ input,
73
+ processEnv: this.processEnv,
74
+ });
75
+ }
76
+ async resolveMixedContextInput(input) {
77
+ return resolveMixedContext({
78
+ retrieval: this.retrieval,
79
+ store: this.store,
80
+ input,
81
+ processEnv: this.processEnv,
82
+ });
83
+ }
84
+ async simulateLinkDefinition(link) {
85
+ const simulation = await simulateContextLink({
86
+ retrieval: this.retrieval,
87
+ link,
88
+ processEnv: this.processEnv,
89
+ });
90
+ return { link, simulation };
91
+ }
92
+ }
93
+ export function isHippoxValidationError(err) {
94
+ return err instanceof HippoxValidationError;
95
+ }
96
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import type { ContextLink, SimulationSummary } from './types.js';
3
+ export type SimulateContextLinkOptions = {
4
+ retrieval: MemorixRetrievalClient;
5
+ link: ContextLink;
6
+ processEnv?: NodeJS.ProcessEnv;
7
+ sampleLimit?: number;
8
+ examplesLimit?: number;
9
+ };
10
+ export declare function simulateContextLink(options: SimulateContextLinkOptions): Promise<SimulationSummary>;
11
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAUtE,OAAO,KAAK,EACV,WAAW,EAIX,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,sBAAsB,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAmJ5B"}