@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
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @x12i/memorix-hippox
2
+
3
+ Memorix Hippox stores reusable contextual links between Memorix object types. Operators can define property-based joins without pre-modeled schema relations, simulate match quality on sampled data, approve links into long-term memory, and resolve bounded context into `jobMemory.context`.
4
+
5
+ ## Database
6
+
7
+ Approved and draft links persist in Mongo database **`memorix-hippox`** (collection **`context-links`** by default).
8
+
9
+ | Variable | Default |
10
+ |----------|---------|
11
+ | `MEMORIX_HIPPOX_DB` | `memorix-hippox` |
12
+ | `MEMORIX_HIPPOX_COLLECTION` | `context-links` |
13
+ | `MEMORIX_HIPPOX_SIMULATION_LIMIT` | `1000` |
14
+ | `MEMORIX_HIPPOX_SIMULATION_EXAMPLES_LIMIT` | `25` |
15
+ | `MEMORIX_CONTEXT_LIST_LIMIT` | `25` |
16
+
17
+ ## Example: assets → subnets (record context)
18
+
19
+ ```json
20
+ {
21
+ "sourceObjectType": "assets",
22
+ "targetObjectType": "subnets",
23
+ "direction": "downstream",
24
+ "join": [
25
+ { "sourcePath": "data.subnetId", "targetPath": "data.id", "operator": "eq" }
26
+ ],
27
+ "retrieval": { "type": "record", "outputMode": "data" }
28
+ }
29
+ ```
30
+
31
+ Resolved output:
32
+
33
+ ```json
34
+ {
35
+ "jobMemory": {
36
+ "context": {
37
+ "subnets": {
38
+ "cidr": "10.0.0.0/24",
39
+ "region": "eu-west-1"
40
+ }
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ## HTTP routes
47
+
48
+ When mounted through `memorix-schema-api`:
49
+
50
+ | Method | Path | Purpose |
51
+ |--------|------|---------|
52
+ | `GET` | `/api/hippox/links?sourceObjectType=assets` | List draft + approved links |
53
+ | `POST` | `/api/hippox/links` | Create draft link |
54
+ | `POST` | `/api/hippox/links/simulate` | Simulate unsaved definition |
55
+ | `POST` | `/api/hippox/links/:id/simulate` | Simulate + persist summary |
56
+ | `POST` | `/api/hippox/links/:id/approve` | Approve simulated link |
57
+ | `POST` | `/api/hippox/context/resolve` | Resolve runtime context |
58
+
59
+ ## Programmatic usage
60
+
61
+ ```ts
62
+ import { createMemorixRetrievalStackFromEnv } from '@x12i/memorix-retrieval';
63
+ import { HippoxService } from '@x12i/memorix-hippox';
64
+
65
+ const { client } = await createMemorixRetrievalStackFromEnv();
66
+ const hippox = await HippoxService.create({ retrieval: client });
67
+
68
+ const draft = await hippox.createDraftLink({
69
+ sourceObjectType: 'assets',
70
+ targetObjectType: 'subnets',
71
+ direction: 'downstream',
72
+ join: [{ sourcePath: 'data.subnetId', targetPath: 'data.id' }],
73
+ retrieval: { type: 'record', outputMode: 'data' },
74
+ });
75
+
76
+ const { simulation } = await hippox.simulateAndPersist(draft.id);
77
+ await hippox.approveLink(draft.id);
78
+
79
+ const resolved = await hippox.resolveContextInput({
80
+ sourceObjectType: 'assets',
81
+ sourceRecordId: 'asset-123',
82
+ linkIds: [draft.id],
83
+ });
84
+ ```
85
+
86
+ ## Legacy relation links
87
+
88
+ Use `resolveMixedContext()` to resolve Hippox links and legacy `JobContextLink` relation-based links during migration. Legacy output is returned under `legacy` while Hippox context uses object-type keys.
89
+
90
+ ## Retrieval types
91
+
92
+ - **record** — single best match (default latest `data.scopedAt`)
93
+ - **list** — bounded array (mandatory limit)
94
+ - **aggregate** — flat per-property value counts
95
+
96
+ Output modes: `data` (default), `record`, `dataWithRecordId`.
@@ -0,0 +1,16 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import type { ObjectTypeCollectionBinding } from './types.js';
3
+ export declare function resolveObjectTypeCollection(retrieval: MemorixRetrievalClient, objectType: string, contentType?: string): Promise<ObjectTypeCollectionBinding>;
4
+ export declare function readObjectTypeDocuments(retrieval: MemorixRetrievalClient, binding: ObjectTypeCollectionBinding, params?: {
5
+ query?: Record<string, unknown>;
6
+ limit?: number;
7
+ skip?: number;
8
+ sort?: Record<string, 1 | -1>;
9
+ }): Promise<Record<string, unknown>[]>;
10
+ export declare function countObjectTypeDocuments(retrieval: MemorixRetrievalClient, binding: ObjectTypeCollectionBinding, query?: Record<string, unknown>): Promise<number>;
11
+ export declare function loadSourceRecord(retrieval: MemorixRetrievalClient, objectType: string, params: {
12
+ recordId?: string;
13
+ record?: Record<string, unknown>;
14
+ contentType?: string;
15
+ }): Promise<Record<string, unknown>>;
16
+ //# sourceMappingURL=collection-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-resolver.d.ts","sourceRoot":"","sources":["../src/collection-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAQtE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAmC9D,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,sBAAsB,EACjC,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,2BAA2B,CAAC,CAYtC;AASD,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,2BAA2B,EACpC,MAAM,GAAE;IACN,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1B,GACL,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAiBpC;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,2BAA2B,EACpC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,CASjB;AA6BD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,sBAAsB,EACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACpF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBlC"}
@@ -0,0 +1,121 @@
1
+ import { resolveDefaultListDescriptorForEntity } from '@x12i/memorix-retrieval';
2
+ import { listLiveEntityCollections, readEntityCollectionDocuments, countEntityCollectionDocuments, } from '@x12i/memorix-mongo';
3
+ async function resolveEntityBinding(retrieval, objectType) {
4
+ const { entity } = await resolveDefaultListDescriptorForEntity(retrieval, objectType);
5
+ const target = entity.target === 'event' || entity.target === 'knowledge' ? 'event' : 'entity';
6
+ return {
7
+ entityName: objectType,
8
+ collectionPrefix: String(entity.collectionPrefix ?? objectType),
9
+ target,
10
+ };
11
+ }
12
+ async function resolveLeadContentType(retrieval, objectType, explicit) {
13
+ if (explicit?.trim())
14
+ return explicit.trim();
15
+ const { entity } = await resolveDefaultListDescriptorForEntity(retrieval, objectType);
16
+ const canonical = entity.defaults?.canonicalContentType
17
+ ?? Object.entries(entity.contentTypes ?? {}).find(([, ct]) => ct.isCanonical)?.[0]
18
+ ?? Object.keys(entity.contentTypes ?? {})[0];
19
+ if (canonical)
20
+ return canonical;
21
+ const binding = await resolveEntityBinding(retrieval, objectType);
22
+ const live = await listLiveEntityCollections(retrieval, binding);
23
+ if (live.length > 0)
24
+ return live[0].contentType;
25
+ return 'snapshots';
26
+ }
27
+ export async function resolveObjectTypeCollection(retrieval, objectType, contentType) {
28
+ const binding = await resolveEntityBinding(retrieval, objectType);
29
+ const resolvedContentType = await resolveLeadContentType(retrieval, objectType, contentType);
30
+ const live = await listLiveEntityCollections(retrieval, binding);
31
+ const match = live.find((row) => row.contentType === resolvedContentType);
32
+ const collectionName = match?.collectionName ?? `${binding.collectionPrefix}-${resolvedContentType}`;
33
+ return {
34
+ objectType,
35
+ contentType: resolvedContentType,
36
+ collectionName,
37
+ target: binding.target === 'event' || binding.target === 'knowledge' ? binding.target : 'entity',
38
+ };
39
+ }
40
+ async function entityBindingForObjectType(retrieval, binding) {
41
+ return resolveEntityBinding(retrieval, binding.objectType);
42
+ }
43
+ export async function readObjectTypeDocuments(retrieval, binding, params = {}) {
44
+ const entityBinding = await entityBindingForObjectType(retrieval, binding);
45
+ const result = await readEntityCollectionDocuments({
46
+ retrieval,
47
+ binding: entityBinding,
48
+ contentType: binding.contentType,
49
+ query: params.query,
50
+ limit: params.limit,
51
+ skip: params.skip,
52
+ });
53
+ let docs = result.documents;
54
+ if (params.sort && Object.keys(params.sort).length > 0) {
55
+ docs = [...docs].sort((a, b) => compareBySort(a, b, params.sort));
56
+ }
57
+ return docs;
58
+ }
59
+ export async function countObjectTypeDocuments(retrieval, binding, query) {
60
+ const entityBinding = await entityBindingForObjectType(retrieval, binding);
61
+ const result = await countEntityCollectionDocuments({
62
+ retrieval,
63
+ binding: entityBinding,
64
+ contentType: binding.contentType,
65
+ query,
66
+ });
67
+ return result.total;
68
+ }
69
+ function compareBySort(a, b, sort) {
70
+ for (const [path, direction] of Object.entries(sort)) {
71
+ const av = readNested(a, path);
72
+ const bv = readNested(b, path);
73
+ if (av === bv)
74
+ continue;
75
+ if (av === undefined || av === null)
76
+ return direction;
77
+ if (bv === undefined || bv === null)
78
+ return -direction;
79
+ if (av < bv)
80
+ return -direction;
81
+ if (av > bv)
82
+ return direction;
83
+ }
84
+ return 0;
85
+ }
86
+ function readNested(doc, path) {
87
+ if (!path.includes('.'))
88
+ return doc[path];
89
+ let current = doc;
90
+ for (const segment of path.split('.')) {
91
+ if (current === null || current === undefined || typeof current !== 'object')
92
+ return undefined;
93
+ current = current[segment];
94
+ }
95
+ return current;
96
+ }
97
+ export async function loadSourceRecord(retrieval, objectType, params) {
98
+ if (params.record && typeof params.record === 'object') {
99
+ return params.record;
100
+ }
101
+ const recordId = params.recordId?.trim();
102
+ if (!recordId) {
103
+ throw new Error('sourceRecordId or sourceRecord payload is required');
104
+ }
105
+ const binding = await resolveObjectTypeCollection(retrieval, objectType, params.contentType);
106
+ const entityBinding = await entityBindingForObjectType(retrieval, binding);
107
+ const result = await readEntityCollectionDocuments({
108
+ retrieval,
109
+ binding: entityBinding,
110
+ contentType: binding.contentType,
111
+ query: {
112
+ $or: [{ _id: recordId }, { recordId }, { entityId: recordId }, { eventId: recordId }],
113
+ },
114
+ limit: 1,
115
+ });
116
+ const doc = result.documents[0];
117
+ if (!doc)
118
+ throw new Error(`source record not found: ${recordId}`);
119
+ return doc;
120
+ }
121
+ //# sourceMappingURL=collection-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-resolver.js","sourceRoot":"","sources":["../src/collection-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { HippoxConfig } from './types.js';
2
+ declare const DEFAULT_HIPPOX_DB = "memorix-hippox";
3
+ declare const DEFAULT_HIPPOX_COLLECTION = "context-links";
4
+ declare const DEFAULT_SIMULATION_LIMIT = 1000;
5
+ declare const DEFAULT_SIMULATION_EXAMPLES_LIMIT = 25;
6
+ declare const DEFAULT_CONTEXT_LIST_LIMIT = 25;
7
+ export declare function loadHippoxConfig(processEnv?: NodeJS.ProcessEnv): HippoxConfig;
8
+ export { DEFAULT_HIPPOX_DB, DEFAULT_HIPPOX_COLLECTION, DEFAULT_SIMULATION_LIMIT, DEFAULT_SIMULATION_EXAMPLES_LIMIT, DEFAULT_CONTEXT_LIST_LIMIT, };
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,QAAA,MAAM,iBAAiB,mBAAmB,CAAC;AAC3C,QAAA,MAAM,yBAAyB,kBAAkB,CAAC;AAClD,QAAA,MAAM,wBAAwB,OAAO,CAAC;AACtC,QAAA,MAAM,iCAAiC,KAAK,CAAC;AAC7C,QAAA,MAAM,0BAA0B,KAAK,CAAC;AAStC,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAW1F;AAED,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,iCAAiC,EACjC,0BAA0B,GAC3B,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,24 @@
1
+ const DEFAULT_HIPPOX_DB = 'memorix-hippox';
2
+ const DEFAULT_HIPPOX_COLLECTION = 'context-links';
3
+ const DEFAULT_SIMULATION_LIMIT = 1000;
4
+ const DEFAULT_SIMULATION_EXAMPLES_LIMIT = 25;
5
+ const DEFAULT_CONTEXT_LIST_LIMIT = 25;
6
+ function parsePositiveInt(raw, fallback) {
7
+ if (!raw?.trim())
8
+ return fallback;
9
+ const n = Number(raw);
10
+ if (!Number.isFinite(n) || n <= 0)
11
+ return fallback;
12
+ return Math.floor(n);
13
+ }
14
+ export function loadHippoxConfig(processEnv = process.env) {
15
+ return {
16
+ dbName: processEnv.MEMORIX_HIPPOX_DB?.trim() || DEFAULT_HIPPOX_DB,
17
+ collectionName: processEnv.MEMORIX_HIPPOX_COLLECTION?.trim() || DEFAULT_HIPPOX_COLLECTION,
18
+ simulationLimit: parsePositiveInt(processEnv.MEMORIX_HIPPOX_SIMULATION_LIMIT, DEFAULT_SIMULATION_LIMIT),
19
+ simulationExamplesLimit: parsePositiveInt(processEnv.MEMORIX_HIPPOX_SIMULATION_EXAMPLES_LIMIT, DEFAULT_SIMULATION_EXAMPLES_LIMIT),
20
+ contextListLimit: parsePositiveInt(processEnv.MEMORIX_CONTEXT_LIST_LIMIT, DEFAULT_CONTEXT_LIST_LIMIT),
21
+ };
22
+ }
23
+ export { DEFAULT_HIPPOX_DB, DEFAULT_HIPPOX_COLLECTION, DEFAULT_SIMULATION_LIMIT, DEFAULT_SIMULATION_EXAMPLES_LIMIT, DEFAULT_CONTEXT_LIST_LIMIT, };
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAClD,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAC7C,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC,SAAS,gBAAgB,CAAC,GAAuB,EAAE,QAAgB;IACjE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,aAAgC,OAAO,CAAC,GAAG;IAC1E,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,iBAAiB;QACjE,cAAc,EAAE,UAAU,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,yBAAyB;QACzF,eAAe,EAAE,gBAAgB,CAAC,UAAU,CAAC,+BAA+B,EAAE,wBAAwB,CAAC;QACvG,uBAAuB,EAAE,gBAAgB,CACvC,UAAU,CAAC,wCAAwC,EACnD,iCAAiC,CAClC;QACD,gBAAgB,EAAE,gBAAgB,CAAC,UAAU,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;KACtG,CAAC;AACJ,CAAC;AAED,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,iCAAiC,EACjC,0BAA0B,GAC3B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { FixedFilter, JoinMapping } from './types.js';
2
+ export declare function compileFixedFilter(filter: FixedFilter, dateLike?: boolean): Record<string, unknown>;
3
+ export declare function compileFixedFilters(filters: FixedFilter[] | undefined): Record<string, unknown>[];
4
+ export declare function compileJoinClause(join: JoinMapping, sourceRecord: Record<string, unknown>): Record<string, unknown> | null;
5
+ export declare function buildTargetQueryFromLink(link: {
6
+ join: JoinMapping[];
7
+ fixedFilters?: FixedFilter[];
8
+ }, sourceRecord: Record<string, unknown>): Record<string, unknown> | null;
9
+ export declare function buildFixedOnlyQuery(fixedFilters: FixedFilter[] | undefined): Record<string, unknown>;
10
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AA4BzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIjG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAGjG;AAUD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKhC;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE,EAC3D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAahC;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKpG"}
@@ -0,0 +1,75 @@
1
+ import { coerceDateValue, readPath } from './paths.js';
2
+ function operatorToMongo(operator, value) {
3
+ switch (operator) {
4
+ case 'eq':
5
+ return value;
6
+ case 'ne':
7
+ return { $ne: value };
8
+ case 'in':
9
+ return { $in: Array.isArray(value) ? value : [value] };
10
+ case 'nin':
11
+ return { $nin: Array.isArray(value) ? value : [value] };
12
+ case 'exists':
13
+ return { $exists: Boolean(value ?? true) };
14
+ case 'gt':
15
+ return { $gt: value };
16
+ case 'gte':
17
+ return { $gte: value };
18
+ case 'lt':
19
+ return { $lt: value };
20
+ case 'lte':
21
+ return { $lte: value };
22
+ default:
23
+ return value;
24
+ }
25
+ }
26
+ export function compileFixedFilter(filter, dateLike = false) {
27
+ const operator = filter.operator;
28
+ const value = dateLike ? coerceDateValue(filter.value) : filter.value;
29
+ return { [filter.targetPath]: operatorToMongo(operator, value) };
30
+ }
31
+ export function compileFixedFilters(filters) {
32
+ if (!filters?.length)
33
+ return [];
34
+ return filters.map((filter) => compileFixedFilter(filter, isLikelyDateFilter(filter)));
35
+ }
36
+ function isLikelyDateFilter(filter) {
37
+ if (filter.operator === 'exists')
38
+ return false;
39
+ if (typeof filter.value === 'string') {
40
+ return /^\d{4}-\d{2}-\d{2}/.test(filter.value) || filter.targetPath.toLowerCase().includes('at');
41
+ }
42
+ return filter.targetPath.toLowerCase().includes('at');
43
+ }
44
+ export function compileJoinClause(join, sourceRecord) {
45
+ const operator = join.operator ?? 'eq';
46
+ const sourceValue = readPath(sourceRecord, join.sourcePath);
47
+ if (sourceValue === undefined || sourceValue === null)
48
+ return null;
49
+ return { [join.targetPath]: operatorToMongo(operator, sourceValue) };
50
+ }
51
+ export function buildTargetQueryFromLink(link, sourceRecord) {
52
+ const joinClauses = [];
53
+ for (const mapping of link.join) {
54
+ const clause = compileJoinClause(mapping, sourceRecord);
55
+ if (!clause)
56
+ return null;
57
+ joinClauses.push(clause);
58
+ }
59
+ const fixed = compileFixedFilters(link.fixedFilters);
60
+ const all = [...joinClauses, ...fixed];
61
+ if (all.length === 0)
62
+ return {};
63
+ if (all.length === 1)
64
+ return all[0];
65
+ return { $and: all };
66
+ }
67
+ export function buildFixedOnlyQuery(fixedFilters) {
68
+ const fixed = compileFixedFilters(fixedFilters);
69
+ if (fixed.length === 0)
70
+ return {};
71
+ if (fixed.length === 1)
72
+ return fixed[0];
73
+ return { $and: fixed };
74
+ }
75
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import { HippoxService } from '../service.js';
3
+ export type HippoxRouteApp = {
4
+ get: (path: string, handler: (...args: any[]) => any) => unknown;
5
+ post: (path: string, handler: (...args: any[]) => any) => unknown;
6
+ };
7
+ export type RegisterHippoxRoutesOptions = {
8
+ prefix?: string;
9
+ service?: HippoxService;
10
+ };
11
+ export declare function registerHippoxRoutes(app: HippoxRouteApp, retrieval: MemorixRetrievalClient, options?: RegisterHippoxRoutesOptions): void;
12
+ //# sourceMappingURL=register-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-routes.d.ts","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,eAAe,CAAC;AAGvE,MAAM,MAAM,cAAc,GAAG;IAE3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;IACjE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAWF,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,sBAAsB,EACjC,OAAO,GAAE,2BAAgC,GACxC,IAAI,CAkFN"}
@@ -0,0 +1,90 @@
1
+ import { HippoxService, isHippoxValidationError } from '../service.js';
2
+ function sendError(reply, err, fallbackStatus = 503) {
3
+ if (isHippoxValidationError(err)) {
4
+ return reply.code(400).send({ error: err.message });
5
+ }
6
+ const message = err instanceof Error ? err.message : String(err);
7
+ const status = message.includes('not found') ? 404 : fallbackStatus;
8
+ return reply.code(status).send({ error: message });
9
+ }
10
+ export function registerHippoxRoutes(app, retrieval, options = {}) {
11
+ const base = (options.prefix ?? '/api/hippox').replace(/\/$/, '');
12
+ let servicePromise = options.service
13
+ ? Promise.resolve(options.service)
14
+ : null;
15
+ const getService = async () => {
16
+ if (options.service)
17
+ return options.service;
18
+ if (!servicePromise) {
19
+ servicePromise = HippoxService.create({ retrieval });
20
+ }
21
+ return servicePromise;
22
+ };
23
+ app.get(`${base}/links`, async (req, reply) => {
24
+ const q = req.query;
25
+ if (!q.sourceObjectType?.trim()) {
26
+ return reply.code(400).send({ error: 'sourceObjectType query parameter is required' });
27
+ }
28
+ try {
29
+ const service = await getService();
30
+ return await service.listLinks(q.sourceObjectType.trim());
31
+ }
32
+ catch (err) {
33
+ return sendError(reply, err);
34
+ }
35
+ });
36
+ app.post(`${base}/links`, async (req, reply) => {
37
+ const body = (req.body ?? {});
38
+ try {
39
+ const service = await getService();
40
+ return await service.createDraftLink(body);
41
+ }
42
+ catch (err) {
43
+ return sendError(reply, err, 400);
44
+ }
45
+ });
46
+ app.post(`${base}/links/simulate`, async (req, reply) => {
47
+ const body = (req.body ?? {});
48
+ try {
49
+ const service = await getService();
50
+ return await service.simulateInlineLink(body);
51
+ }
52
+ catch (err) {
53
+ return sendError(reply, err, 400);
54
+ }
55
+ });
56
+ app.post(`${base}/links/:id/simulate`, async (req, reply) => {
57
+ const { id } = req.params;
58
+ try {
59
+ const service = await getService();
60
+ return await service.simulateAndPersist(id);
61
+ }
62
+ catch (err) {
63
+ return sendError(reply, err);
64
+ }
65
+ });
66
+ app.post(`${base}/links/:id/approve`, async (req, reply) => {
67
+ const { id } = req.params;
68
+ try {
69
+ const service = await getService();
70
+ return await service.approveLink(id);
71
+ }
72
+ catch (err) {
73
+ return sendError(reply, err, 400);
74
+ }
75
+ });
76
+ app.post(`${base}/context/resolve`, async (req, reply) => {
77
+ const body = (req.body ?? {});
78
+ try {
79
+ const service = await getService();
80
+ if (body.legacyContextLinks?.length) {
81
+ return await service.resolveMixedContextInput(body);
82
+ }
83
+ return await service.resolveContextInput(body);
84
+ }
85
+ catch (err) {
86
+ return sendError(reply, err, 400);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=register-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-routes.js","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import type { ContextLink, IndexRecommendation } from './types.js';
3
+ export declare function recommendIndexesForLink(retrieval: MemorixRetrievalClient, link: Pick<ContextLink, 'join' | 'targetObjectType' | 'targetContentType' | 'fixedFilters'>): Promise<IndexRecommendation[]>;
4
+ //# sourceMappingURL=index-recommendations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-recommendations.d.ts","sourceRoot":"","sources":["../src/index-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGnE,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,sBAAsB,EACjC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,cAAc,CAAC,GAC1F,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAsBhC"}
@@ -0,0 +1,40 @@
1
+ import { getMongoForRetrieval } from '@x12i/memorix-mongo';
2
+ import { resolveMemorixDatabaseName } from '@x12i/memorix-retrieval';
3
+ import { resolveObjectTypeCollection } from './collection-resolver.js';
4
+ export async function recommendIndexesForLink(retrieval, link) {
5
+ const binding = await resolveObjectTypeCollection(retrieval, link.targetObjectType, link.targetContentType);
6
+ const recommendations = [];
7
+ const indexedFields = await listIndexedFields(retrieval, binding.collectionName, binding.target);
8
+ const paths = new Set();
9
+ for (const join of link.join)
10
+ paths.add(join.targetPath);
11
+ for (const filter of link.fixedFilters ?? [])
12
+ paths.add(filter.targetPath);
13
+ for (const field of paths) {
14
+ if (indexedFields.has(field))
15
+ continue;
16
+ recommendations.push({
17
+ field,
18
+ reason: `Join/filter field "${field}" is not indexed on ${binding.collectionName}`,
19
+ suggestedIndex: { [field]: 1 },
20
+ });
21
+ }
22
+ return recommendations;
23
+ }
24
+ async function listIndexedFields(retrieval, collectionName, target) {
25
+ const lease = await getMongoForRetrieval(retrieval);
26
+ const memorixTarget = target === 'knowledge' ? 'knowledge' : target;
27
+ const dbName = resolveMemorixDatabaseName(retrieval, memorixTarget);
28
+ const coll = lease.client.db(dbName).collection(collectionName);
29
+ const indexes = await coll.listIndexes().toArray();
30
+ const fields = new Set();
31
+ for (const index of indexes) {
32
+ const key = index.key;
33
+ for (const field of Object.keys(key)) {
34
+ if (field !== '_id')
35
+ fields.add(field);
36
+ }
37
+ }
38
+ return fields;
39
+ }
40
+ //# sourceMappingURL=index-recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-recommendations.js","sourceRoot":"","sources":["../src/index-recommendations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiC,EACjC,IAA2F;IAE3F,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAC/C,SAAS,EACT,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,iBAAiB,CACvB,CAAC;IACF,MAAM,eAAe,GAA0B,EAAE,CAAC;IAClD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;QAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE3E,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACvC,eAAe,CAAC,IAAI,CAAC;YACnB,KAAK;YACL,MAAM,EAAE,sBAAsB,KAAK,uBAAuB,OAAO,CAAC,cAAc,EAAE;YAClF,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,SAAiC,EACjC,cAAsB,EACtB,MAAwC;IAExC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,GAA8B,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,KAAK,KAAK,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type { LinkDirection, LinkStatus, JoinOperator, FilterOperator, OutputMode, RetrievalType, JoinMapping, FixedFilter, SortSpec, RecordRetrieval, ListRetrieval, AggregateRetrieval, ContextLinkRetrieval, ContextLink, ContextLinkInput, IndexRecommendation, SimulationWarning, PropertyMatchQuality, SimulationExampleMatch, SimulationExampleMiss, SimulationSummary, ResolveContextInput, ResolveContextResult, HippoxConfig, ObjectTypeCollectionBinding, } from './types.js';
2
+ export { loadHippoxConfig, DEFAULT_HIPPOX_DB, DEFAULT_HIPPOX_COLLECTION, DEFAULT_SIMULATION_LIMIT, DEFAULT_SIMULATION_EXAMPLES_LIMIT, DEFAULT_CONTEXT_LIST_LIMIT, } from './config.js';
3
+ export { readPath, readRecordId, isDateLike, coerceDateValue, sortSpecsToMongo, extractDataPayload, formatOutputRecord, } from './paths.js';
4
+ export { compileFixedFilter, compileFixedFilters, compileJoinClause, buildTargetQueryFromLink, buildFixedOnlyQuery, } from './filters.js';
5
+ export { validateContextLinkInput, defaultRecordRetrieval, defaultListRetrieval, contextKeyForLink, detectContextKeyCollisions, HippoxValidationError, } from './validation.js';
6
+ export { resolveObjectTypeCollection, readObjectTypeDocuments, countObjectTypeDocuments, loadSourceRecord, } from './collection-resolver.js';
7
+ export { HippoxStore, createHippoxStore } from './store.js';
8
+ export { simulateContextLink, type SimulateContextLinkOptions } from './simulate.js';
9
+ export { resolveContext, type ResolveContextOptions } from './resolve.js';
10
+ export { resolveMixedContext, hippoxLinkFromRelationCandidate, type ResolveMixedContextInput, type ResolveMixedContextOptions, } from './legacy-bridge.js';
11
+ export { recommendIndexesForLink } from './index-recommendations.js';
12
+ export { HippoxService, isHippoxValidationError, type HippoxServiceOptions } from './service.js';
13
+ export { registerHippoxRoutes, type RegisterHippoxRoutesOptions, type HippoxRouteApp } from './http/register-routes.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,KAAK,2BAA2B,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { loadHippoxConfig, DEFAULT_HIPPOX_DB, DEFAULT_HIPPOX_COLLECTION, DEFAULT_SIMULATION_LIMIT, DEFAULT_SIMULATION_EXAMPLES_LIMIT, DEFAULT_CONTEXT_LIST_LIMIT, } from './config.js';
2
+ export { readPath, readRecordId, isDateLike, coerceDateValue, sortSpecsToMongo, extractDataPayload, formatOutputRecord, } from './paths.js';
3
+ export { compileFixedFilter, compileFixedFilters, compileJoinClause, buildTargetQueryFromLink, buildFixedOnlyQuery, } from './filters.js';
4
+ export { validateContextLinkInput, defaultRecordRetrieval, defaultListRetrieval, contextKeyForLink, detectContextKeyCollisions, HippoxValidationError, } from './validation.js';
5
+ export { resolveObjectTypeCollection, readObjectTypeDocuments, countObjectTypeDocuments, loadSourceRecord, } from './collection-resolver.js';
6
+ export { HippoxStore, createHippoxStore } from './store.js';
7
+ export { simulateContextLink } from './simulate.js';
8
+ export { resolveContext } from './resolve.js';
9
+ export { resolveMixedContext, hippoxLinkFromRelationCandidate, } from './legacy-bridge.js';
10
+ export { recommendIndexesForLink } from './index-recommendations.js';
11
+ export { HippoxService, isHippoxValidationError } from './service.js';
12
+ export { registerHippoxRoutes } from './http/register-routes.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4BA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAmC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,cAAc,EAA8B,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,+BAA+B,GAGhC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAA6B,MAAM,cAAc,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAyD,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type JobContextLink } from '@x12i/memorix-mongo';
2
+ import { type ResolveContextOptions } from './resolve.js';
3
+ import type { ContextLink, ResolveContextInput, ResolveContextResult } from './types.js';
4
+ export type ResolveMixedContextInput = ResolveContextInput & {
5
+ legacyContextLinks?: JobContextLink[];
6
+ sourceEntity?: string;
7
+ };
8
+ export type ResolveMixedContextOptions = Omit<ResolveContextOptions, 'input'> & {
9
+ input: ResolveMixedContextInput;
10
+ };
11
+ /**
12
+ * Resolve Hippox approved links into object-keyed `jobMemory.context` and optionally
13
+ * merge legacy relation-based context entries under `_legacy`.
14
+ */
15
+ export declare function resolveMixedContext(options: ResolveMixedContextOptions): Promise<ResolveContextResult & {
16
+ legacy?: Record<string, unknown>;
17
+ }>;
18
+ export declare function hippoxLinkFromRelationCandidate(params: {
19
+ relationKey: string;
20
+ sourceEntity: string;
21
+ targetEntity: string;
22
+ sourcePath: string;
23
+ targetPath: string;
24
+ sourceContentType?: string;
25
+ targetContentType?: string;
26
+ }): Omit<ContextLink, 'id' | 'createdAt' | 'updatedAt' | 'status'>;
27
+ //# sourceMappingURL=legacy-bridge.d.ts.map