@x12i/memorix-service 3.0.6 → 3.1.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 (124) hide show
  1. package/README.md +8 -1
  2. package/dist/ai-services/client.d.ts +31 -0
  3. package/dist/ai-services/client.d.ts.map +1 -0
  4. package/dist/ai-services/client.js +104 -0
  5. package/dist/ai-services/client.js.map +1 -0
  6. package/dist/ai-services/config.d.ts +17 -0
  7. package/dist/ai-services/config.d.ts.map +1 -0
  8. package/dist/ai-services/config.js +44 -0
  9. package/dist/ai-services/config.js.map +1 -0
  10. package/dist/ai-services/normalize-output.d.ts +23 -0
  11. package/dist/ai-services/normalize-output.d.ts.map +1 -0
  12. package/dist/ai-services/normalize-output.js +148 -0
  13. package/dist/ai-services/normalize-output.js.map +1 -0
  14. package/dist/ai-services/skill-execution.d.ts +23 -0
  15. package/dist/ai-services/skill-execution.d.ts.map +1 -0
  16. package/dist/ai-services/skill-execution.js +54 -0
  17. package/dist/ai-services/skill-execution.js.map +1 -0
  18. package/dist/ai-services/types.d.ts +62 -0
  19. package/dist/ai-services/types.d.ts.map +1 -0
  20. package/dist/ai-services/types.js +3 -0
  21. package/dist/ai-services/types.js.map +1 -0
  22. package/dist/app.d.ts.map +1 -1
  23. package/dist/app.js +37 -6
  24. package/dist/app.js.map +1 -1
  25. package/dist/assist/ask.d.ts +35 -0
  26. package/dist/assist/ask.d.ts.map +1 -0
  27. package/dist/assist/ask.js +346 -0
  28. package/dist/assist/ask.js.map +1 -0
  29. package/dist/assist/facts.d.ts +5 -0
  30. package/dist/assist/facts.d.ts.map +1 -0
  31. package/dist/assist/facts.js +237 -0
  32. package/dist/assist/facts.js.map +1 -0
  33. package/dist/assist/merge-ask-proposal.d.ts +9 -0
  34. package/dist/assist/merge-ask-proposal.d.ts.map +1 -0
  35. package/dist/assist/merge-ask-proposal.js +57 -0
  36. package/dist/assist/merge-ask-proposal.js.map +1 -0
  37. package/dist/assist/types.d.ts +60 -0
  38. package/dist/assist/types.d.ts.map +1 -0
  39. package/dist/assist/types.js +57 -0
  40. package/dist/assist/types.js.map +1 -0
  41. package/dist/assist/validate.d.ts +4 -0
  42. package/dist/assist/validate.d.ts.map +1 -0
  43. package/dist/assist/validate.js +319 -0
  44. package/dist/assist/validate.js.map +1 -0
  45. package/dist/cli.js +29 -6
  46. package/dist/cli.js.map +1 -1
  47. package/dist/isolation.d.ts +1 -1
  48. package/dist/isolation.d.ts.map +1 -1
  49. package/dist/journey/collect.js +2 -2
  50. package/dist/journey/collect.js.map +1 -1
  51. package/dist/journey/coverage.js +3 -3
  52. package/dist/journey/coverage.js.map +1 -1
  53. package/dist/known-packs.d.ts +1 -1
  54. package/dist/known-packs.d.ts.map +1 -1
  55. package/dist/known-packs.js +1 -1
  56. package/dist/known-packs.js.map +1 -1
  57. package/dist/live.d.ts +2 -1
  58. package/dist/live.d.ts.map +1 -1
  59. package/dist/live.js +239 -2
  60. package/dist/live.js.map +1 -1
  61. package/dist/magit/magit-pack-service.d.ts +112 -0
  62. package/dist/magit/magit-pack-service.d.ts.map +1 -1
  63. package/dist/magit/magit-pack-service.js +494 -12
  64. package/dist/magit/magit-pack-service.js.map +1 -1
  65. package/dist/magit/pack-to-patchset.d.ts +20 -1
  66. package/dist/magit/pack-to-patchset.d.ts.map +1 -1
  67. package/dist/magit/pack-to-patchset.js +82 -9
  68. package/dist/magit/pack-to-patchset.js.map +1 -1
  69. package/dist/magit/package-catalog-bridge.d.ts +58 -0
  70. package/dist/magit/package-catalog-bridge.d.ts.map +1 -0
  71. package/dist/magit/package-catalog-bridge.js +220 -0
  72. package/dist/magit/package-catalog-bridge.js.map +1 -0
  73. package/dist/magit/proposal-to-pack.d.ts +22 -0
  74. package/dist/magit/proposal-to-pack.d.ts.map +1 -0
  75. package/dist/magit/proposal-to-pack.js +68 -0
  76. package/dist/magit/proposal-to-pack.js.map +1 -0
  77. package/dist/mongo-metadata-store.d.ts.map +1 -1
  78. package/dist/mongo-metadata-store.js +9 -3
  79. package/dist/mongo-metadata-store.js.map +1 -1
  80. package/dist/openapi/openapi.json +472 -3
  81. package/dist/org-sources.d.ts +14 -0
  82. package/dist/org-sources.d.ts.map +1 -0
  83. package/dist/org-sources.js +31 -0
  84. package/dist/org-sources.js.map +1 -0
  85. package/dist/pipeline-compile.d.ts +32 -0
  86. package/dist/pipeline-compile.d.ts.map +1 -1
  87. package/dist/pipeline-compile.js +106 -1
  88. package/dist/pipeline-compile.js.map +1 -1
  89. package/dist/platform.d.ts +18 -3
  90. package/dist/platform.d.ts.map +1 -1
  91. package/dist/platform.js +82 -21
  92. package/dist/platform.js.map +1 -1
  93. package/dist/routes/ai-services.d.ts +4 -0
  94. package/dist/routes/ai-services.d.ts.map +1 -0
  95. package/dist/routes/ai-services.js +239 -0
  96. package/dist/routes/ai-services.js.map +1 -0
  97. package/dist/routes/assist.d.ts +4 -0
  98. package/dist/routes/assist.d.ts.map +1 -0
  99. package/dist/routes/assist.js +75 -0
  100. package/dist/routes/assist.js.map +1 -0
  101. package/dist/routes/data-journey.js +11 -11
  102. package/dist/routes/data-journey.js.map +1 -1
  103. package/dist/routes/intelligence.d.ts.map +1 -1
  104. package/dist/routes/intelligence.js +19 -1
  105. package/dist/routes/intelligence.js.map +1 -1
  106. package/dist/routes/memory.d.ts.map +1 -1
  107. package/dist/routes/memory.js +190 -56
  108. package/dist/routes/memory.js.map +1 -1
  109. package/dist/routes/metadata.d.ts.map +1 -1
  110. package/dist/routes/metadata.js +770 -21
  111. package/dist/routes/metadata.js.map +1 -1
  112. package/dist/routes/relationships.d.ts.map +1 -1
  113. package/dist/routes/relationships.js +29 -0
  114. package/dist/routes/relationships.js.map +1 -1
  115. package/dist/routes/simulation.d.ts +7 -0
  116. package/dist/routes/simulation.d.ts.map +1 -0
  117. package/dist/routes/simulation.js +22 -0
  118. package/dist/routes/simulation.js.map +1 -0
  119. package/dist/simulation.d.ts +26 -0
  120. package/dist/simulation.d.ts.map +1 -0
  121. package/dist/simulation.js +46 -0
  122. package/dist/simulation.js.map +1 -0
  123. package/openapi/openapi.json +472 -3
  124. package/package.json +16 -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, optional pack versions (`METADATA_MAGIT=1`) |
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,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): 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,GACrB,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) {
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: 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"}
@@ -0,0 +1,44 @@
1
+ /** Registered companion types wired in Memorix. */
2
+ export const AI_SERVICE_ORIGIN_SPECS = [
3
+ { aiServiceType: "function", env: "FUNCX_URL", defaultPort: 6120 },
4
+ { aiServiceType: "skill", env: "AI_SKILLS_URL", defaultPort: 5420 },
5
+ { aiServiceType: "task", env: "AI_TASKS_URL", defaultPort: 5440 },
6
+ { aiServiceType: "graph", env: "GRAPH_ENGINE_URL", defaultPort: 6200 },
7
+ ];
8
+ const TYPE_TO_ENV = new Map(AI_SERVICE_ORIGIN_SPECS.map((s) => [s.aiServiceType, s.env]));
9
+ export function stripTrailingSlash(url) {
10
+ return url.replace(/\/+$/, "");
11
+ }
12
+ export function resolveConfiguredAiServiceOrigins(env = process.env) {
13
+ return AI_SERVICE_ORIGIN_SPECS.map((spec) => {
14
+ const raw = env[spec.env]?.trim();
15
+ return {
16
+ aiServiceType: spec.aiServiceType,
17
+ env: spec.env,
18
+ url: raw ? stripTrailingSlash(raw) : null,
19
+ defaultPort: spec.defaultPort,
20
+ };
21
+ });
22
+ }
23
+ /** Resolve origin for a type: explicit URL, endpointEnv, or type's default env. */
24
+ export function resolveAiServiceOriginUrl(aiServiceType, opts) {
25
+ const env = opts?.env ?? process.env;
26
+ if (opts?.endpoint?.trim())
27
+ return stripTrailingSlash(opts.endpoint);
28
+ if (opts?.endpointEnv?.trim()) {
29
+ const named = env[opts.endpointEnv]?.trim();
30
+ if (named)
31
+ return stripTrailingSlash(named);
32
+ }
33
+ const defaultEnv = TYPE_TO_ENV.get(aiServiceType);
34
+ if (defaultEnv) {
35
+ const fromType = env[defaultEnv]?.trim();
36
+ if (fromType)
37
+ return stripTrailingSlash(fromType);
38
+ }
39
+ return null;
40
+ }
41
+ export function defaultEndpointEnvForType(aiServiceType) {
42
+ return TYPE_TO_ENV.get(aiServiceType);
43
+ }
44
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai-services/config.ts"],"names":[],"mappings":"AAEA,mDAAmD;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAI/B;IACH,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;IAClE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE;IACnE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE;IACjE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,WAAW,EAAE,IAAI,EAAE;CACvE,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,CAAU,CAAC,CACtE,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QAClC,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACzC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,yBAAyB,CACvC,aAAqB,EACrB,IAA2E;IAE3E,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACrC,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrE,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,KAAK;YAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,aAA8B,CAAC,CAAC;IACnE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,QAAQ;YAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC7D,OAAO,WAAW,CAAC,GAAG,CAAC,aAA8B,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Unwrap AI-services/v1 invoke envelopes into KnowX / pipeline step bags.
3
+ * Skills return RunSkillResponse under body.output; prefer parsed, then FlexMD payloads.
4
+ */
5
+ /** Extract structured domain object from a skill/function invoke response body. */
6
+ export declare function extractAiServiceDomainOutput(invokeBody: unknown): Record<string, unknown> | null;
7
+ export type NormalizeAiServiceOutputResult = {
8
+ ok: true;
9
+ output: Record<string, unknown>;
10
+ } | {
11
+ ok: false;
12
+ code: string;
13
+ message: string;
14
+ };
15
+ /**
16
+ * Normalize invoke response into a step output bag for write-record / associate.
17
+ * Maps drafts → knowxDrafts when needed; preserves classification / relationshipPlans.
18
+ */
19
+ export declare function normalizeAiServiceStepOutput(invokeBody: unknown, opts?: {
20
+ itemId?: string;
21
+ serviceId?: string;
22
+ }): NormalizeAiServiceOutputResult;
23
+ //# sourceMappingURL=normalize-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-output.d.ts","sourceRoot":"","sources":["../../src/ai-services/normalize-output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,mFAAmF;AACnF,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAmEhG;AAED,MAAM,MAAM,8BAA8B,GACtC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,OAAO,EACnB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,8BAA8B,CAsDhC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Unwrap AI-services/v1 invoke envelopes into KnowX / pipeline step bags.
3
+ * Skills return RunSkillResponse under body.output; prefer parsed, then FlexMD payloads.
4
+ */
5
+ function asRecord(value) {
6
+ return value && typeof value === "object" && !Array.isArray(value)
7
+ ? value
8
+ : null;
9
+ }
10
+ function tryParseJson(text) {
11
+ try {
12
+ return JSON.parse(text);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /** Pull a JSON object from prose / markdown fences when the model wraps the payload. */
19
+ function extractJsonObject(text) {
20
+ const direct = tryParseJson(text);
21
+ if (direct !== null)
22
+ return direct;
23
+ const fence = /```(?:json)?\s*([\s\S]*?)```/i.exec(text);
24
+ if (fence?.[1]) {
25
+ const fromFence = tryParseJson(fence[1].trim());
26
+ if (fromFence !== null)
27
+ return fromFence;
28
+ }
29
+ const start = text.indexOf("{");
30
+ const end = text.lastIndexOf("}");
31
+ if (start >= 0 && end > start) {
32
+ return tryParseJson(text.slice(start, end + 1));
33
+ }
34
+ return null;
35
+ }
36
+ /** Extract structured domain object from a skill/function invoke response body. */
37
+ export function extractAiServiceDomainOutput(invokeBody) {
38
+ const body = asRecord(invokeBody);
39
+ if (!body)
40
+ return null;
41
+ const output = body.output;
42
+ if (typeof output === "string") {
43
+ return asRecord(extractJsonObject(output));
44
+ }
45
+ const out = asRecord(output);
46
+ if (!out)
47
+ return null;
48
+ // RunSkillResponse: { parsed, flexMd, rawText, … }
49
+ const parsed = asRecord(out.parsed);
50
+ if (parsed) {
51
+ if ("knowxDrafts" in parsed ||
52
+ "drafts" in parsed ||
53
+ "classification" in parsed ||
54
+ "relationshipPlans" in parsed ||
55
+ "docHash" in parsed) {
56
+ return parsed;
57
+ }
58
+ // parsed.rawText is a common passthrough when FlexMD parse misses
59
+ if (typeof parsed.rawText === "string") {
60
+ const fromParsedRaw = asRecord(extractJsonObject(parsed.rawText));
61
+ if (fromParsedRaw)
62
+ return fromParsedRaw;
63
+ }
64
+ }
65
+ const flex = asRecord(out.flexMd);
66
+ const payloads = asRecord(flex?.payloads);
67
+ if (payloads) {
68
+ for (const key of ["knowx", "result", "json", "output"]) {
69
+ const raw = payloads[key];
70
+ if (typeof raw === "string") {
71
+ const p = asRecord(extractJsonObject(raw));
72
+ if (p)
73
+ return p;
74
+ }
75
+ else {
76
+ const p = asRecord(raw);
77
+ if (p)
78
+ return p;
79
+ }
80
+ }
81
+ const values = Object.values(payloads);
82
+ if (values.length === 1 && typeof values[0] === "string") {
83
+ const p = asRecord(extractJsonObject(values[0]));
84
+ if (p)
85
+ return p;
86
+ }
87
+ }
88
+ if (typeof out.rawText === "string") {
89
+ const p = asRecord(extractJsonObject(out.rawText));
90
+ if (p)
91
+ return p;
92
+ }
93
+ // Already a domain bag (function-style or pre-normalized)
94
+ if ("knowxDrafts" in out ||
95
+ "drafts" in out ||
96
+ "classification" in out ||
97
+ "relationshipPlans" in out) {
98
+ return out;
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Normalize invoke response into a step output bag for write-record / associate.
104
+ * Maps drafts → knowxDrafts when needed; preserves classification / relationshipPlans.
105
+ */
106
+ export function normalizeAiServiceStepOutput(invokeBody, opts) {
107
+ const domain = extractAiServiceDomainOutput(invokeBody);
108
+ if (!domain) {
109
+ return {
110
+ ok: false,
111
+ code: "AI_OUTPUT_UNPARSEABLE",
112
+ message: `AI-service ${opts?.itemId ?? "item"} did not return structured KnowX output (expected parsed knowxDrafts / classification / relationshipPlans)`,
113
+ };
114
+ }
115
+ const out = { ...domain };
116
+ if (!Array.isArray(out.knowxDrafts) && Array.isArray(out.drafts)) {
117
+ out.knowxDrafts = out.drafts;
118
+ }
119
+ const serviceId = opts?.serviceId ?? "";
120
+ const itemId = opts?.itemId ?? "";
121
+ const looksExtract = serviceId === "knowx-extract" ||
122
+ itemId === "knowx.extract" ||
123
+ Array.isArray(out.knowxDrafts);
124
+ const looksAssociate = serviceId === "knowx-associate-knowledge" ||
125
+ itemId === "knowx.associate-knowledge" ||
126
+ asRecord(out.classification) != null ||
127
+ Array.isArray(out.relationshipPlans);
128
+ if (looksExtract && !Array.isArray(out.knowxDrafts)) {
129
+ return {
130
+ ok: false,
131
+ code: "AI_OUTPUT_MISSING_DRAFTS",
132
+ message: "knowx.extract output missing knowxDrafts array",
133
+ };
134
+ }
135
+ if (looksAssociate &&
136
+ !asRecord(out.classification) &&
137
+ !Array.isArray(out.relationshipPlans)) {
138
+ return {
139
+ ok: false,
140
+ code: "AI_OUTPUT_MISSING_ASSOCIATE",
141
+ message: "knowx.associate-knowledge output missing classification / relationshipPlans",
142
+ };
143
+ }
144
+ out.kind = "ai-services";
145
+ out.live = true;
146
+ return { ok: true, output: out };
147
+ }
148
+ //# sourceMappingURL=normalize-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-output.js","sourceRoot":"","sources":["../../src/ai-services/normalize-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Default RunSkillRequest execution fields for KnowX AI-service pipeline steps.
3
+ * Merged into portConfig.execution at compile time; live invoke passes them under FR execution.
4
+ *
5
+ * ai-skills requires a concrete wire model on modelConfig (or modelId). Override with
6
+ * KNOWX_AI_SKILL_MODEL (OpenRouter-style id).
7
+ */
8
+ export type SkillExecutionDefaults = {
9
+ agentId: string;
10
+ jobId: string;
11
+ taskId: string;
12
+ jobTypeId: string;
13
+ taskTypeId: string;
14
+ modelConfig: {
15
+ model: string;
16
+ };
17
+ outputContract: string[];
18
+ };
19
+ export declare function defaultSkillExecutionForItem(itemId: string, opts?: {
20
+ runId?: string;
21
+ stepId?: string;
22
+ }): Record<string, unknown> | undefined;
23
+ //# sourceMappingURL=skill-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-execution.d.ts","sourceRoot":"","sources":["../../src/ai-services/skill-execution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAgCF,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAsBrC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Default RunSkillRequest execution fields for KnowX AI-service pipeline steps.
3
+ * Merged into portConfig.execution at compile time; live invoke passes them under FR execution.
4
+ *
5
+ * ai-skills requires a concrete wire model on modelConfig (or modelId). Override with
6
+ * KNOWX_AI_SKILL_MODEL (OpenRouter-style id).
7
+ */
8
+ function resolveKnowxSkillModel() {
9
+ return (process.env.KNOWX_AI_SKILL_MODEL?.trim() ||
10
+ process.env.AI_SKILLS_DEFAULT_MODEL?.trim() ||
11
+ "deepseek/deepseek-v4-flash");
12
+ }
13
+ const KNOWX_SKILL_EXECUTION = {
14
+ "knowx.extract": {
15
+ agentId: "knowx",
16
+ jobId: "knowx-pipeline",
17
+ taskId: "knowx-extract",
18
+ jobTypeId: "knowx-ingest",
19
+ taskTypeId: "knowx-extract",
20
+ outputContract: ["knowxDrafts", "docHash"],
21
+ },
22
+ "knowx.associate-knowledge": {
23
+ agentId: "knowx",
24
+ jobId: "knowx-pipeline",
25
+ taskId: "knowx-associate-knowledge",
26
+ jobTypeId: "knowx-ingest",
27
+ taskTypeId: "knowx-associate-knowledge",
28
+ outputContract: ["classification", "relationshipPlans"],
29
+ },
30
+ };
31
+ export function defaultSkillExecutionForItem(itemId, opts) {
32
+ const modelConfig = { model: resolveKnowxSkillModel() };
33
+ const base = KNOWX_SKILL_EXECUTION[itemId];
34
+ if (!base) {
35
+ if (itemId.startsWith("knowx.")) {
36
+ return {
37
+ agentId: "knowx",
38
+ jobId: opts?.runId ?? "knowx-pipeline",
39
+ taskId: opts?.stepId ?? itemId,
40
+ jobTypeId: "knowx-ingest",
41
+ taskTypeId: itemId,
42
+ modelConfig,
43
+ };
44
+ }
45
+ return undefined;
46
+ }
47
+ return {
48
+ ...base,
49
+ modelConfig,
50
+ jobId: opts?.runId ?? base.jobId,
51
+ taskId: opts?.stepId ?? base.taskId,
52
+ };
53
+ }
54
+ //# sourceMappingURL=skill-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-execution.js","sourceRoot":"","sources":["../../src/ai-services/skill-execution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,SAAS,sBAAsB;IAC7B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE;QAC3C,4BAA4B,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB,GAGvB;IACF,eAAe,EAAE;QACf,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,eAAe;QAC3B,cAAc,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;KAC3C;IACD,2BAA2B,EAAE;QAC3B,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,2BAA2B;QACnC,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,2BAA2B;QACvC,cAAc,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;KACxD;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAC1C,MAAc,EACd,IAA0C;IAE1C,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,gBAAgB;gBACtC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,MAAM;gBAC9B,SAAS,EAAE,cAAc;gBACzB,UAAU,EAAE,MAAM;gBAClB,WAAW;aACZ,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,GAAG,IAAI;QACP,WAAW;QACX,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;QAChC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ /** AI-services/v1 shapes (consumer side). Matches FR-AIS-1…8. */
2
+ export type AiServiceType = "function" | "skill" | "task" | "graph" | (string & {});
3
+ /** FR-AIS-7 — advertised mutation / subresource support. */
4
+ export type AiServiceCapabilities = {
5
+ itemMutation: boolean;
6
+ actions?: string[];
7
+ subresources?: string[];
8
+ bundles?: boolean;
9
+ };
10
+ export type AiServiceDescriptor = {
11
+ protocolVersion: "ai-services/1";
12
+ aiServiceType: AiServiceType;
13
+ packageId: string;
14
+ zoneId: string;
15
+ title: string;
16
+ cataloxCatalogIds: string[];
17
+ capabilities?: AiServiceCapabilities;
18
+ };
19
+ export type AiServiceItemSummary = {
20
+ id: string;
21
+ title: string;
22
+ summary?: string;
23
+ tags?: string[];
24
+ version?: string;
25
+ meta?: Record<string, unknown>;
26
+ };
27
+ export type AiServiceItemDetail = AiServiceItemSummary & {
28
+ inputSchema?: unknown;
29
+ outputSchema?: unknown;
30
+ defaults?: unknown;
31
+ };
32
+ export type AiServiceInvokeRequest = {
33
+ itemId: string;
34
+ input?: unknown;
35
+ execution?: Record<string, unknown>;
36
+ correlationId?: string;
37
+ };
38
+ export type AiServiceInvokeResponse = {
39
+ ok: boolean;
40
+ itemId: string;
41
+ output?: unknown;
42
+ error?: {
43
+ code: string;
44
+ message: string;
45
+ retryable?: boolean;
46
+ };
47
+ meta?: Record<string, unknown>;
48
+ };
49
+ /** Pack / step binding — ids only, no Catalox row copies. */
50
+ export type AiServiceBinding = {
51
+ aiServiceType: string;
52
+ itemId: string;
53
+ endpointEnv?: string;
54
+ endpoint?: string;
55
+ };
56
+ export type ConfiguredAiServiceOrigin = {
57
+ aiServiceType: AiServiceType;
58
+ env: string;
59
+ url: string | null;
60
+ defaultPort: number;
61
+ };
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai-services/types.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEpF,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,aAAa,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** AI-services/v1 shapes (consumer side). Matches FR-AIS-1…8. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai-services/types.ts"],"names":[],"mappings":"AAAA,iEAAiE"}
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,OAAO,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAIxD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAgBvB,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA0D5E;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GAAG;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,0BAA0B;;;;;GAM7E"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,OAAO,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAIxD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAqBvB,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoF5E;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GAAG;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,0BAA0B;;;;;GAM7E"}