@x12i/memorix-service 3.0.6 → 3.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.
- package/README.md +8 -1
- package/dist/ai-services/associate-prep.d.ts +37 -0
- package/dist/ai-services/associate-prep.d.ts.map +1 -0
- package/dist/ai-services/associate-prep.js +208 -0
- package/dist/ai-services/associate-prep.js.map +1 -0
- package/dist/ai-services/chunk-markdown.d.ts +22 -0
- package/dist/ai-services/chunk-markdown.d.ts.map +1 -0
- package/dist/ai-services/chunk-markdown.js +159 -0
- package/dist/ai-services/chunk-markdown.js.map +1 -0
- package/dist/ai-services/client.d.ts +31 -0
- package/dist/ai-services/client.d.ts.map +1 -0
- package/dist/ai-services/client.js +104 -0
- package/dist/ai-services/client.js.map +1 -0
- package/dist/ai-services/config.d.ts +17 -0
- package/dist/ai-services/config.d.ts.map +1 -0
- package/dist/ai-services/config.js +44 -0
- package/dist/ai-services/config.js.map +1 -0
- package/dist/ai-services/normalize-output.d.ts +29 -0
- package/dist/ai-services/normalize-output.d.ts.map +1 -0
- package/dist/ai-services/normalize-output.js +428 -0
- package/dist/ai-services/normalize-output.js.map +1 -0
- package/dist/ai-services/skill-execution.d.ts +24 -0
- package/dist/ai-services/skill-execution.d.ts.map +1 -0
- package/dist/ai-services/skill-execution.js +74 -0
- package/dist/ai-services/skill-execution.js.map +1 -0
- package/dist/ai-services/types.d.ts +62 -0
- package/dist/ai-services/types.d.ts.map +1 -0
- package/dist/ai-services/types.js +3 -0
- package/dist/ai-services/types.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +41 -6
- package/dist/app.js.map +1 -1
- package/dist/assist/ask.d.ts +35 -0
- package/dist/assist/ask.d.ts.map +1 -0
- package/dist/assist/ask.js +346 -0
- package/dist/assist/ask.js.map +1 -0
- package/dist/assist/facts.d.ts +5 -0
- package/dist/assist/facts.d.ts.map +1 -0
- package/dist/assist/facts.js +237 -0
- package/dist/assist/facts.js.map +1 -0
- package/dist/assist/merge-ask-proposal.d.ts +9 -0
- package/dist/assist/merge-ask-proposal.d.ts.map +1 -0
- package/dist/assist/merge-ask-proposal.js +57 -0
- package/dist/assist/merge-ask-proposal.js.map +1 -0
- package/dist/assist/types.d.ts +60 -0
- package/dist/assist/types.d.ts.map +1 -0
- package/dist/assist/types.js +57 -0
- package/dist/assist/types.js.map +1 -0
- package/dist/assist/validate.d.ts +4 -0
- package/dist/assist/validate.d.ts.map +1 -0
- package/dist/assist/validate.js +319 -0
- package/dist/assist/validate.js.map +1 -0
- package/dist/cli.js +29 -6
- package/dist/cli.js.map +1 -1
- package/dist/connector-catalog.d.ts +68 -0
- package/dist/connector-catalog.d.ts.map +1 -0
- package/dist/connector-catalog.js +258 -0
- package/dist/connector-catalog.js.map +1 -0
- package/dist/connector-role.d.ts +22 -0
- package/dist/connector-role.d.ts.map +1 -0
- package/dist/connector-role.js +71 -0
- package/dist/connector-role.js.map +1 -0
- package/dist/destination-runtime.d.ts +8 -0
- package/dist/destination-runtime.d.ts.map +1 -0
- package/dist/destination-runtime.js +11 -0
- package/dist/destination-runtime.js.map +1 -0
- package/dist/execution-target.d.ts +141 -0
- package/dist/execution-target.d.ts.map +1 -0
- package/dist/execution-target.js +853 -0
- package/dist/execution-target.js.map +1 -0
- package/dist/generic-connectors.d.ts +41 -0
- package/dist/generic-connectors.d.ts.map +1 -0
- package/dist/generic-connectors.js +158 -0
- package/dist/generic-connectors.js.map +1 -0
- package/dist/isolation.d.ts +1 -1
- package/dist/isolation.d.ts.map +1 -1
- package/dist/jobs-scope.d.ts +21 -0
- package/dist/jobs-scope.d.ts.map +1 -0
- package/dist/jobs-scope.js +83 -0
- package/dist/jobs-scope.js.map +1 -0
- package/dist/journey/collect.js +2 -2
- package/dist/journey/collect.js.map +1 -1
- package/dist/journey/coverage.js +3 -3
- package/dist/journey/coverage.js.map +1 -1
- package/dist/known-packs.d.ts +1 -1
- package/dist/known-packs.d.ts.map +1 -1
- package/dist/known-packs.js +1 -1
- package/dist/known-packs.js.map +1 -1
- package/dist/live.d.ts +13 -1
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +866 -2
- package/dist/live.js.map +1 -1
- package/dist/magit/magit-pack-service.d.ts +112 -0
- package/dist/magit/magit-pack-service.d.ts.map +1 -1
- package/dist/magit/magit-pack-service.js +494 -12
- package/dist/magit/magit-pack-service.js.map +1 -1
- package/dist/magit/pack-to-patchset.d.ts +20 -1
- package/dist/magit/pack-to-patchset.d.ts.map +1 -1
- package/dist/magit/pack-to-patchset.js +82 -9
- package/dist/magit/pack-to-patchset.js.map +1 -1
- package/dist/magit/package-catalog-bridge.d.ts +58 -0
- package/dist/magit/package-catalog-bridge.d.ts.map +1 -0
- package/dist/magit/package-catalog-bridge.js +220 -0
- package/dist/magit/package-catalog-bridge.js.map +1 -0
- package/dist/magit/proposal-to-pack.d.ts +22 -0
- package/dist/magit/proposal-to-pack.d.ts.map +1 -0
- package/dist/magit/proposal-to-pack.js +68 -0
- package/dist/magit/proposal-to-pack.js.map +1 -0
- package/dist/mongo-metadata-store.d.ts.map +1 -1
- package/dist/mongo-metadata-store.js +9 -3
- package/dist/mongo-metadata-store.js.map +1 -1
- package/dist/openapi/openapi.json +6262 -3139
- package/dist/org-sources.d.ts +14 -0
- package/dist/org-sources.d.ts.map +1 -0
- package/dist/org-sources.js +31 -0
- package/dist/org-sources.js.map +1 -0
- package/dist/pipeline-compile.d.ts +67 -1
- package/dist/pipeline-compile.d.ts.map +1 -1
- package/dist/pipeline-compile.js +455 -29
- package/dist/pipeline-compile.js.map +1 -1
- package/dist/pipeline-invoke.d.ts +63 -0
- package/dist/pipeline-invoke.d.ts.map +1 -0
- package/dist/pipeline-invoke.js +114 -0
- package/dist/pipeline-invoke.js.map +1 -0
- package/dist/pipeline-ports.d.ts +13 -0
- package/dist/pipeline-ports.d.ts.map +1 -0
- package/dist/pipeline-ports.js +104 -0
- package/dist/pipeline-ports.js.map +1 -0
- package/dist/platform.d.ts +47 -3
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +309 -26
- package/dist/platform.js.map +1 -1
- package/dist/routes/ai-services.d.ts +4 -0
- package/dist/routes/ai-services.d.ts.map +1 -0
- package/dist/routes/ai-services.js +239 -0
- package/dist/routes/ai-services.js.map +1 -0
- package/dist/routes/assist.d.ts +4 -0
- package/dist/routes/assist.d.ts.map +1 -0
- package/dist/routes/assist.js +75 -0
- package/dist/routes/assist.js.map +1 -0
- package/dist/routes/connector-invocations.d.ts.map +1 -1
- package/dist/routes/connector-invocations.js +18 -21
- package/dist/routes/connector-invocations.js.map +1 -1
- package/dist/routes/data-journey.js +11 -11
- package/dist/routes/data-journey.js.map +1 -1
- package/dist/routes/intelligence.d.ts.map +1 -1
- package/dist/routes/intelligence.js +19 -1
- package/dist/routes/intelligence.js.map +1 -1
- package/dist/routes/jobs.d.ts +4 -0
- package/dist/routes/jobs.d.ts.map +1 -0
- package/dist/routes/jobs.js +888 -0
- package/dist/routes/jobs.js.map +1 -0
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +278 -80
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +770 -21
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/pipelines.d.ts.map +1 -1
- package/dist/routes/pipelines.js +98 -22
- package/dist/routes/pipelines.js.map +1 -1
- package/dist/routes/relationships.d.ts.map +1 -1
- package/dist/routes/relationships.js +109 -2
- package/dist/routes/relationships.js.map +1 -1
- package/dist/routes/simulation.d.ts +7 -0
- package/dist/routes/simulation.d.ts.map +1 -0
- package/dist/routes/simulation.js +22 -0
- package/dist/routes/simulation.js.map +1 -0
- package/dist/runx/client.d.ts +18 -0
- package/dist/runx/client.d.ts.map +1 -0
- package/dist/runx/client.js +59 -0
- package/dist/runx/client.js.map +1 -0
- package/dist/simulation.d.ts +26 -0
- package/dist/simulation.d.ts.map +1 -0
- package/dist/simulation.js +46 -0
- package/dist/simulation.js.map +1 -0
- package/openapi/openapi.json +6262 -3139
- package/package.json +18 -8
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
|
|
|
69
69
|
|
|
70
70
|
| Family | Role |
|
|
71
71
|
|--------|------|
|
|
72
|
-
| `/api/metadata` | Kinds, definitions, install/publish,
|
|
72
|
+
| `/api/metadata` | Kinds, definitions, install/publish, pack versions (Magit default-on; `METADATA_MAGIT=0` disables) |
|
|
73
73
|
| `/api/data` | Content get/list/write, compose, abstract |
|
|
74
74
|
| `/api/relationships` | Query / discover / verify / rebuild (**no** ad-hoc link PUT) |
|
|
75
75
|
| `/api/memory` | Pull, raw, sources, **checkpoints**, schedules, runs, `commit-page`, connection probe |
|
|
@@ -78,6 +78,13 @@ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
|
|
|
78
78
|
| `/api/workflow` | Workflow sibling content |
|
|
79
79
|
| `/api/intelligence` | Profiles / proposals (never auto-install) |
|
|
80
80
|
| `/api/data-journey` | Evidence cone + expected-vs-filled coverage |
|
|
81
|
+
| `/api/ai-services` | Companion AI-services (function / skill / task / graph) — list, items, invoke proxy |
|
|
82
|
+
|
|
83
|
+
### AI-services companions
|
|
84
|
+
|
|
85
|
+
Point memorix-service at FR-compliant processes via env (`FUNCX_URL`, `AI_SKILLS_URL`, `AI_TASKS_URL`, `GRAPH_ENGINE_URL`).
|
|
86
|
+
Stack: `AI_SERVICES=1 node scripts/dev-stack.mjs` or `--ai-services`.
|
|
87
|
+
Ops: [`.operational/ai-services-get-started.md`](../.operational/ai-services-get-started.md).
|
|
81
88
|
|
|
82
89
|
### Memory (operator + called-service)
|
|
83
90
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared KnowX associate input prep — slim catalog, cap size, chunk drafts,
|
|
3
|
+
* merge classification / relationshipPlans across chunk invokes.
|
|
4
|
+
*
|
|
5
|
+
* Keep env knobs aligned with memorix-knowx-pack/src/associate-ai.ts:
|
|
6
|
+
* KNOWX_AI_ASSOC_EXISTING_CAP (default 48)
|
|
7
|
+
* KNOWX_AI_ASSOC_DRAFT_CHUNK (default 4)
|
|
8
|
+
* KNOWX_AI_ASSOC_SUMMARY_CHARS (default 120)
|
|
9
|
+
*
|
|
10
|
+
* Large fat catalogs (full refs/provenance + long summaries) have caused the
|
|
11
|
+
* ai-skills companion to return ok:true with empty rawText after burning the
|
|
12
|
+
* full completion budget — keep prompts tight.
|
|
13
|
+
*/
|
|
14
|
+
export declare function associateExistingCap(): number;
|
|
15
|
+
export declare function associateDraftChunkSize(): number;
|
|
16
|
+
export declare function associateSummaryChars(): number;
|
|
17
|
+
/** Slim a knowx API / draft record for the associate prompt. */
|
|
18
|
+
export declare function slimKnowxForAssociate(raw: unknown, opts?: {
|
|
19
|
+
keepRefs?: boolean;
|
|
20
|
+
}): Record<string, unknown> | null;
|
|
21
|
+
export declare function draftKey(raw: unknown): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Slim + exclude current drafts + cap existing catalog for associate prompt.
|
|
24
|
+
*/
|
|
25
|
+
export declare function prepareExistingKnowxForAssociate(input: {
|
|
26
|
+
existing: unknown[];
|
|
27
|
+
draftKeys?: Set<string>;
|
|
28
|
+
cap?: number;
|
|
29
|
+
}): Record<string, unknown>[];
|
|
30
|
+
export declare function slimDraftsForAssociate(drafts: unknown[]): Record<string, unknown>[];
|
|
31
|
+
export declare function chunkArray<T>(items: T[], size: number): T[][];
|
|
32
|
+
/**
|
|
33
|
+
* Merge chunked associate outputs; synthesize knowx-contradicts from
|
|
34
|
+
* classification.contradicts when plans omit them.
|
|
35
|
+
*/
|
|
36
|
+
export declare function mergeAssociateOutputs(chunks: Array<Record<string, unknown>>): Record<string, unknown>;
|
|
37
|
+
//# sourceMappingURL=associate-prep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associate-prep.d.ts","sourceRoot":"","sources":["../../src/ai-services/associate-prep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AASD,gEAAgE;AAChE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAyBhC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAe5B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAYnF;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAO7D;AAqBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2EzB"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared KnowX associate input prep — slim catalog, cap size, chunk drafts,
|
|
3
|
+
* merge classification / relationshipPlans across chunk invokes.
|
|
4
|
+
*
|
|
5
|
+
* Keep env knobs aligned with memorix-knowx-pack/src/associate-ai.ts:
|
|
6
|
+
* KNOWX_AI_ASSOC_EXISTING_CAP (default 48)
|
|
7
|
+
* KNOWX_AI_ASSOC_DRAFT_CHUNK (default 4)
|
|
8
|
+
* KNOWX_AI_ASSOC_SUMMARY_CHARS (default 120)
|
|
9
|
+
*
|
|
10
|
+
* Large fat catalogs (full refs/provenance + long summaries) have caused the
|
|
11
|
+
* ai-skills companion to return ok:true with empty rawText after burning the
|
|
12
|
+
* full completion budget — keep prompts tight.
|
|
13
|
+
*/
|
|
14
|
+
function asRecord(v) {
|
|
15
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
16
|
+
? v
|
|
17
|
+
: null;
|
|
18
|
+
}
|
|
19
|
+
function envInt(name, fallback) {
|
|
20
|
+
const raw = process.env[name]?.trim();
|
|
21
|
+
if (!raw)
|
|
22
|
+
return fallback;
|
|
23
|
+
const n = Number(raw);
|
|
24
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;
|
|
25
|
+
}
|
|
26
|
+
export function associateExistingCap() {
|
|
27
|
+
return envInt("KNOWX_AI_ASSOC_EXISTING_CAP", 48);
|
|
28
|
+
}
|
|
29
|
+
export function associateDraftChunkSize() {
|
|
30
|
+
return envInt("KNOWX_AI_ASSOC_DRAFT_CHUNK", 4);
|
|
31
|
+
}
|
|
32
|
+
export function associateSummaryChars() {
|
|
33
|
+
return envInt("KNOWX_AI_ASSOC_SUMMARY_CHARS", 120);
|
|
34
|
+
}
|
|
35
|
+
function clipSummary(value, maxChars) {
|
|
36
|
+
if (typeof value !== "string")
|
|
37
|
+
return undefined;
|
|
38
|
+
const t = value.trim();
|
|
39
|
+
if (!t)
|
|
40
|
+
return undefined;
|
|
41
|
+
return t.length <= maxChars ? t : `${t.slice(0, maxChars - 1)}…`;
|
|
42
|
+
}
|
|
43
|
+
/** Slim a knowx API / draft record for the associate prompt. */
|
|
44
|
+
export function slimKnowxForAssociate(raw, opts) {
|
|
45
|
+
const rec = asRecord(raw);
|
|
46
|
+
if (!rec)
|
|
47
|
+
return null;
|
|
48
|
+
const recordId = String(rec.recordId ?? "").trim();
|
|
49
|
+
if (!recordId)
|
|
50
|
+
return null;
|
|
51
|
+
const data = asRecord(rec.data) ?? {};
|
|
52
|
+
const objectType = String(rec.objectType ?? "content").trim() || "content";
|
|
53
|
+
const identity = asRecord(data.identity);
|
|
54
|
+
const dataOut = {
|
|
55
|
+
kind: data.kind,
|
|
56
|
+
label: data.label,
|
|
57
|
+
summary: clipSummary(data.summary, associateSummaryChars()),
|
|
58
|
+
};
|
|
59
|
+
if (identity?.category != null) {
|
|
60
|
+
dataOut.identity = { category: identity.category };
|
|
61
|
+
}
|
|
62
|
+
// Refs only on drafts when needed — catalog refs bloat prompts hard.
|
|
63
|
+
if (opts?.keepRefs && data.refs != null) {
|
|
64
|
+
dataOut.refs = data.refs;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
objectType,
|
|
68
|
+
recordId,
|
|
69
|
+
data: dataOut,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function draftKey(raw) {
|
|
73
|
+
const rec = asRecord(raw);
|
|
74
|
+
if (!rec)
|
|
75
|
+
return null;
|
|
76
|
+
const recordId = String(rec.recordId ?? "").trim();
|
|
77
|
+
if (!recordId)
|
|
78
|
+
return null;
|
|
79
|
+
const objectType = String(rec.objectType ?? "content").trim() || "content";
|
|
80
|
+
return `${objectType}::${recordId}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Slim + exclude current drafts + cap existing catalog for associate prompt.
|
|
84
|
+
*/
|
|
85
|
+
export function prepareExistingKnowxForAssociate(input) {
|
|
86
|
+
const cap = input.cap ?? associateExistingCap();
|
|
87
|
+
const out = [];
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
for (const raw of input.existing) {
|
|
90
|
+
const slim = slimKnowxForAssociate(raw, { keepRefs: false });
|
|
91
|
+
if (!slim)
|
|
92
|
+
continue;
|
|
93
|
+
const key = draftKey(slim);
|
|
94
|
+
if (!key || seen.has(key))
|
|
95
|
+
continue;
|
|
96
|
+
if (input.draftKeys?.has(key))
|
|
97
|
+
continue;
|
|
98
|
+
seen.add(key);
|
|
99
|
+
out.push(slim);
|
|
100
|
+
if (out.length >= cap)
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
export function slimDraftsForAssociate(drafts) {
|
|
106
|
+
const out = [];
|
|
107
|
+
const seen = new Set();
|
|
108
|
+
for (const raw of drafts) {
|
|
109
|
+
const slim = slimKnowxForAssociate(raw, { keepRefs: true });
|
|
110
|
+
if (!slim)
|
|
111
|
+
continue;
|
|
112
|
+
const key = draftKey(slim);
|
|
113
|
+
if (!key || seen.has(key))
|
|
114
|
+
continue;
|
|
115
|
+
seen.add(key);
|
|
116
|
+
out.push(slim);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
export function chunkArray(items, size) {
|
|
121
|
+
const n = size > 0 ? size : 8;
|
|
122
|
+
const chunks = [];
|
|
123
|
+
for (let i = 0; i < items.length; i += n) {
|
|
124
|
+
chunks.push(items.slice(i, i + n));
|
|
125
|
+
}
|
|
126
|
+
return chunks.length ? chunks : [[]];
|
|
127
|
+
}
|
|
128
|
+
function planKey(p) {
|
|
129
|
+
return `${p.definitionId}|${p.from?.objectType}::${p.from?.recordId}|${p.to?.objectType}::${p.to?.recordId}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Merge chunked associate outputs; synthesize knowx-contradicts from
|
|
133
|
+
* classification.contradicts when plans omit them.
|
|
134
|
+
*/
|
|
135
|
+
export function mergeAssociateOutputs(chunks) {
|
|
136
|
+
const known = [];
|
|
137
|
+
const novel = [];
|
|
138
|
+
const contradicts = [];
|
|
139
|
+
const plans = [];
|
|
140
|
+
const seenPlans = new Set();
|
|
141
|
+
const pushPlan = (p) => {
|
|
142
|
+
const key = planKey(p);
|
|
143
|
+
if (!p.definitionId || !p.from?.recordId || !p.to?.recordId)
|
|
144
|
+
return;
|
|
145
|
+
if (seenPlans.has(key))
|
|
146
|
+
return;
|
|
147
|
+
seenPlans.add(key);
|
|
148
|
+
plans.push(p);
|
|
149
|
+
};
|
|
150
|
+
for (const chunk of chunks) {
|
|
151
|
+
const classification = asRecord(chunk.classification);
|
|
152
|
+
if (classification) {
|
|
153
|
+
if (Array.isArray(classification.known)) {
|
|
154
|
+
known.push(...classification.known);
|
|
155
|
+
}
|
|
156
|
+
if (Array.isArray(classification.novel)) {
|
|
157
|
+
novel.push(...classification.novel);
|
|
158
|
+
}
|
|
159
|
+
if (Array.isArray(classification.contradicts)) {
|
|
160
|
+
contradicts.push(...classification.contradicts);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (Array.isArray(chunk.relationshipPlans)) {
|
|
164
|
+
for (const p of chunk.relationshipPlans) {
|
|
165
|
+
pushPlan(p);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
for (const c of contradicts) {
|
|
170
|
+
if (!c.matchedRecordId || !c.draftRecordId)
|
|
171
|
+
continue;
|
|
172
|
+
pushPlan({
|
|
173
|
+
definitionId: "knowx-contradicts",
|
|
174
|
+
from: {
|
|
175
|
+
objectType: c.objectType || "content",
|
|
176
|
+
recordId: c.draftRecordId,
|
|
177
|
+
},
|
|
178
|
+
to: {
|
|
179
|
+
objectType: c.matchedObjectType || c.objectType || "content",
|
|
180
|
+
recordId: c.matchedRecordId,
|
|
181
|
+
},
|
|
182
|
+
reason: c.reason || "classification.contradicts",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
for (const k of known) {
|
|
186
|
+
if (!k.matchedRecordId || !k.draftRecordId)
|
|
187
|
+
continue;
|
|
188
|
+
pushPlan({
|
|
189
|
+
definitionId: "knowx-same-as",
|
|
190
|
+
from: {
|
|
191
|
+
objectType: k.objectType || "content",
|
|
192
|
+
recordId: k.draftRecordId,
|
|
193
|
+
},
|
|
194
|
+
to: {
|
|
195
|
+
objectType: k.matchedObjectType || k.objectType || "content",
|
|
196
|
+
recordId: k.matchedRecordId,
|
|
197
|
+
},
|
|
198
|
+
reason: k.reason || "classification.known",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
classification: { known, novel, contradicts },
|
|
203
|
+
relationshipPlans: plans,
|
|
204
|
+
kind: "ai-services",
|
|
205
|
+
live: true,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=associate-prep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associate-prep.js","sourceRoot":"","sources":["../../src/ai-services/associate-prep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-bounded markdown chunking for KnowX AI extract fan-out.
|
|
3
|
+
* Mirrors @x12i/memorix-knowx-pack content/chunk (keep in sync).
|
|
4
|
+
*/
|
|
5
|
+
/** ~1k tokens keeps OpenRouter cheap/default under its ~120s provider timeout. */
|
|
6
|
+
export declare const DEFAULT_CHUNK_TARGET_TOKENS = 1000;
|
|
7
|
+
export declare const DEFAULT_CHUNK_OVERLAP_RATIO = 0.1;
|
|
8
|
+
export type MarkdownChunk = {
|
|
9
|
+
index: number;
|
|
10
|
+
count: number;
|
|
11
|
+
text: string;
|
|
12
|
+
pageStart?: number;
|
|
13
|
+
pageEnd?: number;
|
|
14
|
+
approxTokens: number;
|
|
15
|
+
};
|
|
16
|
+
export type ChunkMarkdownOptions = {
|
|
17
|
+
targetTokens?: number;
|
|
18
|
+
overlapRatio?: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function chunkMarkdown(markdown: string, opts?: ChunkMarkdownOptions): MarkdownChunk[];
|
|
21
|
+
export declare function markdownApproxTokens(markdown: string): number;
|
|
22
|
+
//# sourceMappingURL=chunk-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-markdown.d.ts","sourceRoot":"","sources":["../../src/ai-services/chunk-markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AA0CF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,aAAa,EAAE,CAoHjB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-bounded markdown chunking for KnowX AI extract fan-out.
|
|
3
|
+
* Mirrors @x12i/memorix-knowx-pack content/chunk (keep in sync).
|
|
4
|
+
*/
|
|
5
|
+
/** ~1k tokens keeps OpenRouter cheap/default under its ~120s provider timeout. */
|
|
6
|
+
export const DEFAULT_CHUNK_TARGET_TOKENS = 1000;
|
|
7
|
+
export const DEFAULT_CHUNK_OVERLAP_RATIO = 0.1;
|
|
8
|
+
const PAGE_RE = /<!--\s*page:(\d+)\s*-->/i;
|
|
9
|
+
const HEADING_RE = /^#{1,6}\s+\S/;
|
|
10
|
+
function approxTokenCount(text) {
|
|
11
|
+
const n = text.length;
|
|
12
|
+
if (n <= 0)
|
|
13
|
+
return 0;
|
|
14
|
+
return Math.ceil(n / 4);
|
|
15
|
+
}
|
|
16
|
+
function splitIntoSegments(markdown) {
|
|
17
|
+
const lines = markdown.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
18
|
+
const segments = [];
|
|
19
|
+
let buf = [];
|
|
20
|
+
let page;
|
|
21
|
+
const flush = () => {
|
|
22
|
+
const text = buf.join("\n").trim();
|
|
23
|
+
if (text)
|
|
24
|
+
segments.push({ text, page });
|
|
25
|
+
buf = [];
|
|
26
|
+
};
|
|
27
|
+
for (const line of lines) {
|
|
28
|
+
const pageMatch = PAGE_RE.exec(line);
|
|
29
|
+
if (pageMatch) {
|
|
30
|
+
flush();
|
|
31
|
+
page = Number(pageMatch[1]);
|
|
32
|
+
buf.push(line);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (HEADING_RE.test(line) && buf.length > 0) {
|
|
36
|
+
flush();
|
|
37
|
+
}
|
|
38
|
+
buf.push(line);
|
|
39
|
+
}
|
|
40
|
+
flush();
|
|
41
|
+
return segments.length ? segments : [{ text: markdown.trim() }];
|
|
42
|
+
}
|
|
43
|
+
export function chunkMarkdown(markdown, opts) {
|
|
44
|
+
const target = Math.max(200, opts?.targetTokens ?? DEFAULT_CHUNK_TARGET_TOKENS);
|
|
45
|
+
const overlapRatio = Math.min(0.5, Math.max(0, opts?.overlapRatio ?? DEFAULT_CHUNK_OVERLAP_RATIO));
|
|
46
|
+
const overlapTokens = Math.floor(target * overlapRatio);
|
|
47
|
+
const trimmed = markdown.trim();
|
|
48
|
+
if (!trimmed)
|
|
49
|
+
return [];
|
|
50
|
+
const segments = splitIntoSegments(trimmed);
|
|
51
|
+
const pieces = [];
|
|
52
|
+
let cur = [];
|
|
53
|
+
let curTokens = 0;
|
|
54
|
+
let pageStart;
|
|
55
|
+
let pageEnd;
|
|
56
|
+
const pushPiece = () => {
|
|
57
|
+
if (!cur.length)
|
|
58
|
+
return;
|
|
59
|
+
const text = cur.join("\n\n").trim();
|
|
60
|
+
if (!text) {
|
|
61
|
+
cur = [];
|
|
62
|
+
curTokens = 0;
|
|
63
|
+
pageStart = undefined;
|
|
64
|
+
pageEnd = undefined;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
pieces.push({ text, pageStart, pageEnd });
|
|
68
|
+
if (overlapTokens > 0 && text.length) {
|
|
69
|
+
const overlapChars = Math.max(80, overlapTokens * 4);
|
|
70
|
+
const tail = text.slice(Math.max(0, text.length - overlapChars));
|
|
71
|
+
cur = [tail];
|
|
72
|
+
curTokens = approxTokenCount(tail);
|
|
73
|
+
pageStart = pageEnd;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
cur = [];
|
|
77
|
+
curTokens = 0;
|
|
78
|
+
pageStart = undefined;
|
|
79
|
+
pageEnd = undefined;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
for (const seg of segments) {
|
|
83
|
+
const segTokens = approxTokenCount(seg.text);
|
|
84
|
+
if (cur.length === 0) {
|
|
85
|
+
pageStart = seg.page;
|
|
86
|
+
pageEnd = seg.page;
|
|
87
|
+
}
|
|
88
|
+
else if (seg.page != null) {
|
|
89
|
+
pageEnd = seg.page;
|
|
90
|
+
if (pageStart == null)
|
|
91
|
+
pageStart = seg.page;
|
|
92
|
+
}
|
|
93
|
+
if (curTokens > 0 && curTokens + segTokens > target) {
|
|
94
|
+
pushPiece();
|
|
95
|
+
if (cur.length === 0) {
|
|
96
|
+
pageStart = seg.page ?? pageStart;
|
|
97
|
+
pageEnd = seg.page ?? pageEnd;
|
|
98
|
+
}
|
|
99
|
+
else if (seg.page != null) {
|
|
100
|
+
pageEnd = seg.page;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (segTokens > target && cur.length === 0) {
|
|
104
|
+
const parts = seg.text.split(/\n{2,}/);
|
|
105
|
+
let hard = [];
|
|
106
|
+
let hardTokens = 0;
|
|
107
|
+
for (const part of parts) {
|
|
108
|
+
const t = approxTokenCount(part);
|
|
109
|
+
if (hardTokens > 0 && hardTokens + t > target) {
|
|
110
|
+
pieces.push({
|
|
111
|
+
text: hard.join("\n\n").trim(),
|
|
112
|
+
pageStart: seg.page,
|
|
113
|
+
pageEnd: seg.page,
|
|
114
|
+
});
|
|
115
|
+
hard = [];
|
|
116
|
+
hardTokens = 0;
|
|
117
|
+
}
|
|
118
|
+
hard.push(part);
|
|
119
|
+
hardTokens += t;
|
|
120
|
+
}
|
|
121
|
+
if (hard.length) {
|
|
122
|
+
cur = hard;
|
|
123
|
+
curTokens = hardTokens;
|
|
124
|
+
pageStart = seg.page;
|
|
125
|
+
pageEnd = seg.page;
|
|
126
|
+
}
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
cur.push(seg.text);
|
|
130
|
+
curTokens += segTokens;
|
|
131
|
+
}
|
|
132
|
+
if (cur.length) {
|
|
133
|
+
const text = cur.join("\n\n").trim();
|
|
134
|
+
if (text)
|
|
135
|
+
pieces.push({ text, pageStart, pageEnd });
|
|
136
|
+
}
|
|
137
|
+
const cleaned = [];
|
|
138
|
+
for (const p of pieces) {
|
|
139
|
+
if (!p.text)
|
|
140
|
+
continue;
|
|
141
|
+
const prev = cleaned[cleaned.length - 1];
|
|
142
|
+
if (prev && prev.text === p.text)
|
|
143
|
+
continue;
|
|
144
|
+
cleaned.push(p);
|
|
145
|
+
}
|
|
146
|
+
const count = cleaned.length;
|
|
147
|
+
return cleaned.map((p, index) => ({
|
|
148
|
+
index,
|
|
149
|
+
count,
|
|
150
|
+
text: p.text,
|
|
151
|
+
pageStart: p.pageStart,
|
|
152
|
+
pageEnd: p.pageEnd,
|
|
153
|
+
approxTokens: approxTokenCount(p.text),
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
export function markdownApproxTokens(markdown) {
|
|
157
|
+
return approxTokenCount(markdown);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=chunk-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-markdown.js","sourceRoot":"","sources":["../../src/ai-services/chunk-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AiServiceDescriptor, AiServiceInvokeRequest, AiServiceInvokeResponse, AiServiceItemDetail, AiServiceItemSummary } from "./types.js";
|
|
2
|
+
export type AiServicesClientOptions = {
|
|
3
|
+
fetchImpl?: typeof fetch;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function createAiServicesClient(opts?: AiServicesClientOptions): {
|
|
7
|
+
getHealth(baseUrl: string): Promise<{
|
|
8
|
+
ok: boolean;
|
|
9
|
+
status: number;
|
|
10
|
+
body: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
getDescriptor(baseUrl: string): Promise<AiServiceDescriptor>;
|
|
13
|
+
listItems(baseUrl: string, query?: {
|
|
14
|
+
q?: string;
|
|
15
|
+
tag?: string;
|
|
16
|
+
limit?: number;
|
|
17
|
+
cursor?: string;
|
|
18
|
+
}): Promise<AiServiceItemSummary[]>;
|
|
19
|
+
getItem(baseUrl: string, id: string): Promise<AiServiceItemDetail>;
|
|
20
|
+
invoke(baseUrl: string, request: AiServiceInvokeRequest, correlationId?: string, timeoutMs?: number): Promise<{
|
|
21
|
+
status: number;
|
|
22
|
+
body: AiServiceInvokeResponse;
|
|
23
|
+
}>;
|
|
24
|
+
/** FR-AIS-6 — generic proxy helper for mutation / subresource paths. */
|
|
25
|
+
request(baseUrl: string, method: string, path: string, body?: unknown, correlationId?: string, timeoutMs?: number): Promise<{
|
|
26
|
+
status: number;
|
|
27
|
+
body: unknown;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
export type AiServicesClient = ReturnType<typeof createAiServicesClient>;
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ai-services/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgCF,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,uBAA4B;uBAE5C,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;2BAS5D,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;uBAavD,MAAM,UACP;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACpE,OAAO,CAAC,oBAAoB,EAAE,CAAC;qBAmBX,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;oBAa7D,MAAM,WACN,sBAAsB,kBACf,MAAM,cACV,MAAM,GACjB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,uBAAuB,CAAA;KAAE,CAAC;IAmB7D,wEAAwE;qBAE7D,MAAM,UACP,MAAM,QACR,MAAM,SACL,OAAO,kBACE,MAAM,cACV,MAAM,GACjB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;EAchD;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { stripTrailingSlash } from "./config.js";
|
|
2
|
+
function joinUrl(base, path) {
|
|
3
|
+
return `${stripTrailingSlash(base)}${path.startsWith("/") ? path : `/${path}`}`;
|
|
4
|
+
}
|
|
5
|
+
async function fetchJson(url, init, opts) {
|
|
6
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
7
|
+
const timeoutMs = opts.timeoutMs ?? 8_000;
|
|
8
|
+
const ctrl = new AbortController();
|
|
9
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
10
|
+
try {
|
|
11
|
+
const res = await fetchImpl(url, { ...init, signal: ctrl.signal });
|
|
12
|
+
const body = await res.json().catch(() => null);
|
|
13
|
+
return { status: res.status, body };
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function jsonHeaders(correlationId) {
|
|
20
|
+
const headers = {
|
|
21
|
+
"content-type": "application/json",
|
|
22
|
+
};
|
|
23
|
+
if (correlationId)
|
|
24
|
+
headers["x-correlation-id"] = correlationId;
|
|
25
|
+
return headers;
|
|
26
|
+
}
|
|
27
|
+
export function createAiServicesClient(opts = {}) {
|
|
28
|
+
return {
|
|
29
|
+
async getHealth(baseUrl) {
|
|
30
|
+
const { status, body } = await fetchJson(joinUrl(baseUrl, "/health"), { method: "GET" }, opts);
|
|
31
|
+
const ok = status >= 200 &&
|
|
32
|
+
status < 300 &&
|
|
33
|
+
Boolean(body && typeof body === "object" && body.ok === true);
|
|
34
|
+
return { ok, status, body };
|
|
35
|
+
},
|
|
36
|
+
async getDescriptor(baseUrl) {
|
|
37
|
+
const { status, body } = await fetchJson(joinUrl(baseUrl, "/ai-services/v1/descriptor"), { method: "GET" }, opts);
|
|
38
|
+
if (status < 200 || status >= 300 || !body || typeof body !== "object") {
|
|
39
|
+
throw new Error(`descriptor failed: HTTP ${status}`);
|
|
40
|
+
}
|
|
41
|
+
return body;
|
|
42
|
+
},
|
|
43
|
+
async listItems(baseUrl, query) {
|
|
44
|
+
const params = new URLSearchParams();
|
|
45
|
+
if (query?.q)
|
|
46
|
+
params.set("q", query.q);
|
|
47
|
+
if (query?.tag)
|
|
48
|
+
params.set("tag", query.tag);
|
|
49
|
+
if (query?.limit != null)
|
|
50
|
+
params.set("limit", String(query.limit));
|
|
51
|
+
if (query?.cursor)
|
|
52
|
+
params.set("cursor", query.cursor);
|
|
53
|
+
const qs = params.toString();
|
|
54
|
+
const path = `/ai-services/v1/items${qs ? `?${qs}` : ""}`;
|
|
55
|
+
const { status, body } = await fetchJson(joinUrl(baseUrl, path), { method: "GET" }, opts);
|
|
56
|
+
if (status < 200 || status >= 300) {
|
|
57
|
+
throw new Error(`list items failed: HTTP ${status}`);
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(body))
|
|
60
|
+
return body;
|
|
61
|
+
if (body && typeof body === "object" && Array.isArray(body.items)) {
|
|
62
|
+
return body.items;
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
},
|
|
66
|
+
async getItem(baseUrl, id) {
|
|
67
|
+
const { status, body } = await fetchJson(joinUrl(baseUrl, `/ai-services/v1/items/${encodeURIComponent(id)}`), { method: "GET" }, opts);
|
|
68
|
+
if (status < 200 || status >= 300 || !body || typeof body !== "object") {
|
|
69
|
+
throw new Error(`get item failed: HTTP ${status}`);
|
|
70
|
+
}
|
|
71
|
+
return body;
|
|
72
|
+
},
|
|
73
|
+
async invoke(baseUrl, request, correlationId, timeoutMs) {
|
|
74
|
+
const cid = correlationId ?? request.correlationId;
|
|
75
|
+
const { status, body } = await fetchJson(joinUrl(baseUrl, "/ai-services/v1/invoke"), {
|
|
76
|
+
method: "POST",
|
|
77
|
+
headers: jsonHeaders(cid),
|
|
78
|
+
body: JSON.stringify(request),
|
|
79
|
+
}, { ...opts, timeoutMs: timeoutMs ?? opts.timeoutMs ?? 120_000 });
|
|
80
|
+
return {
|
|
81
|
+
status,
|
|
82
|
+
body: (body && typeof body === "object"
|
|
83
|
+
? body
|
|
84
|
+
: { ok: false, itemId: request.itemId, error: { code: "EMPTY", message: "empty body" } }),
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
/** FR-AIS-6 — generic proxy helper for mutation / subresource paths. */
|
|
88
|
+
async request(baseUrl, method, path, body, correlationId, timeoutMs) {
|
|
89
|
+
const init = {
|
|
90
|
+
method,
|
|
91
|
+
headers: body !== undefined ? jsonHeaders(correlationId) : correlationId
|
|
92
|
+
? { "x-correlation-id": correlationId }
|
|
93
|
+
: undefined,
|
|
94
|
+
};
|
|
95
|
+
if (body !== undefined)
|
|
96
|
+
init.body = JSON.stringify(body);
|
|
97
|
+
return fetchJson(joinUrl(baseUrl, path), init, {
|
|
98
|
+
...opts,
|
|
99
|
+
timeoutMs: timeoutMs ?? opts.timeoutMs ?? 30_000,
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai-services/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AiServiceType, ConfiguredAiServiceOrigin } from "./types.js";
|
|
2
|
+
/** Registered companion types wired in Memorix. */
|
|
3
|
+
export declare const AI_SERVICE_ORIGIN_SPECS: ReadonlyArray<{
|
|
4
|
+
aiServiceType: AiServiceType;
|
|
5
|
+
env: string;
|
|
6
|
+
defaultPort: number;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function stripTrailingSlash(url: string): string;
|
|
9
|
+
export declare function resolveConfiguredAiServiceOrigins(env?: NodeJS.ProcessEnv): ConfiguredAiServiceOrigin[];
|
|
10
|
+
/** Resolve origin for a type: explicit URL, endpointEnv, or type's default env. */
|
|
11
|
+
export declare function resolveAiServiceOriginUrl(aiServiceType: string, opts?: {
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
endpointEnv?: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
}): string | null;
|
|
16
|
+
export declare function defaultEndpointEnvForType(aiServiceType: string): string | undefined;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai-services/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE3E,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC;IAClD,aAAa,EAAE,aAAa,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB,CAKA,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iCAAiC,CAC/C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,yBAAyB,EAAE,CAU7B;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GAC1E,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF"}
|