@easynet/agent-model 1.0.53

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 (118) hide show
  1. package/README.md +72 -0
  2. package/dist/api/create-agent-llm.d.ts +15 -0
  3. package/dist/api/create-agent-llm.d.ts.map +1 -0
  4. package/dist/api/create-embed-fn.d.ts +10 -0
  5. package/dist/api/create-embed-fn.d.ts.map +1 -0
  6. package/dist/api/get-default-llm-config.d.ts +16 -0
  7. package/dist/api/get-default-llm-config.d.ts.map +1 -0
  8. package/dist/api/get-default-vlm-config.d.ts +15 -0
  9. package/dist/api/get-default-vlm-config.d.ts.map +1 -0
  10. package/dist/chunk-4OLU43SH.js +165 -0
  11. package/dist/chunk-4OLU43SH.js.map +1 -0
  12. package/dist/chunk-5YPJ43HW.js +205 -0
  13. package/dist/chunk-5YPJ43HW.js.map +1 -0
  14. package/dist/chunk-EPVJLBGC.js +118 -0
  15. package/dist/chunk-EPVJLBGC.js.map +1 -0
  16. package/dist/chunk-FZKECZUY.js +148 -0
  17. package/dist/chunk-FZKECZUY.js.map +1 -0
  18. package/dist/chunk-G7MKWPEI.js +14 -0
  19. package/dist/chunk-G7MKWPEI.js.map +1 -0
  20. package/dist/chunk-HCU4AWIV.js +19 -0
  21. package/dist/chunk-HCU4AWIV.js.map +1 -0
  22. package/dist/chunk-HSU6XZOI.js +354 -0
  23. package/dist/chunk-HSU6XZOI.js.map +1 -0
  24. package/dist/chunk-K3JR2N4E.js +250 -0
  25. package/dist/chunk-K3JR2N4E.js.map +1 -0
  26. package/dist/chunk-PZ5AY32C.js +10 -0
  27. package/dist/chunk-PZ5AY32C.js.map +1 -0
  28. package/dist/chunk-SPDXNDDD.js +114 -0
  29. package/dist/chunk-SPDXNDDD.js.map +1 -0
  30. package/dist/chunk-TKIZELZQ.js +255 -0
  31. package/dist/chunk-TKIZELZQ.js.map +1 -0
  32. package/dist/chunk-VBXTOU4S.js +50 -0
  33. package/dist/chunk-VBXTOU4S.js.map +1 -0
  34. package/dist/chunk-YOOYQBGK.js +43 -0
  35. package/dist/chunk-YOOYQBGK.js.map +1 -0
  36. package/dist/cli/index.d.ts +3 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +11 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/cli/utils.d.ts +12 -0
  41. package/dist/cli/utils.d.ts.map +1 -0
  42. package/dist/config/index.d.ts +6 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +28 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/loader.d.ts +23 -0
  47. package/dist/config/loader.d.ts.map +1 -0
  48. package/dist/config/parser.d.ts +5 -0
  49. package/dist/config/parser.d.ts.map +1 -0
  50. package/dist/config/yaml-utils.d.ts +13 -0
  51. package/dist/config/yaml-utils.d.ts.map +1 -0
  52. package/dist/config/yaml.d.ts +9 -0
  53. package/dist/config/yaml.d.ts.map +1 -0
  54. package/dist/connectivity/check.d.ts +18 -0
  55. package/dist/connectivity/check.d.ts.map +1 -0
  56. package/dist/connectivity/index.d.ts +3 -0
  57. package/dist/connectivity/index.d.ts.map +1 -0
  58. package/dist/connectivity/index.js +12 -0
  59. package/dist/connectivity/index.js.map +1 -0
  60. package/dist/connectivity/types.d.ts +13 -0
  61. package/dist/connectivity/types.d.ts.map +1 -0
  62. package/dist/extensions/index.d.ts +8 -0
  63. package/dist/extensions/index.d.ts.map +1 -0
  64. package/dist/extensions/index.js +38 -0
  65. package/dist/extensions/index.js.map +1 -0
  66. package/dist/extensions/loader.d.ts +12 -0
  67. package/dist/extensions/loader.d.ts.map +1 -0
  68. package/dist/extensions/npm-protocol.d.ts +36 -0
  69. package/dist/extensions/npm-protocol.d.ts.map +1 -0
  70. package/dist/index.d.ts +58 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +133 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/langchain/index.d.ts +17 -0
  75. package/dist/langchain/index.d.ts.map +1 -0
  76. package/dist/langchain/index.js +12 -0
  77. package/dist/langchain/index.js.map +1 -0
  78. package/dist/langchain/openai-compatible.d.ts +21 -0
  79. package/dist/langchain/openai-compatible.d.ts.map +1 -0
  80. package/dist/langchain/tool-choice.d.ts +9 -0
  81. package/dist/langchain/tool-choice.d.ts.map +1 -0
  82. package/dist/model/chat.d.ts +30 -0
  83. package/dist/model/chat.d.ts.map +1 -0
  84. package/dist/model/embed-parser.d.ts +25 -0
  85. package/dist/model/embed-parser.d.ts.map +1 -0
  86. package/dist/model/embedding.d.ts +25 -0
  87. package/dist/model/embedding.d.ts.map +1 -0
  88. package/dist/model/hub.d.ts +29 -0
  89. package/dist/model/hub.d.ts.map +1 -0
  90. package/dist/model/index.d.ts +13 -0
  91. package/dist/model/index.d.ts.map +1 -0
  92. package/dist/model/index.js +18 -0
  93. package/dist/model/index.js.map +1 -0
  94. package/dist/model/llm-parser.d.ts +10 -0
  95. package/dist/model/llm-parser.d.ts.map +1 -0
  96. package/dist/model/types.d.ts +31 -0
  97. package/dist/model/types.d.ts.map +1 -0
  98. package/dist/npm/command.d.ts +37 -0
  99. package/dist/npm/command.d.ts.map +1 -0
  100. package/dist/npm/index.d.ts +5 -0
  101. package/dist/npm/index.d.ts.map +1 -0
  102. package/dist/npm/index.js +40 -0
  103. package/dist/npm/index.js.map +1 -0
  104. package/dist/npm/install.d.ts +9 -0
  105. package/dist/npm/install.d.ts.map +1 -0
  106. package/dist/npm/provider.d.ts +15 -0
  107. package/dist/npm/provider.d.ts.map +1 -0
  108. package/dist/npm/version.d.ts +12 -0
  109. package/dist/npm/version.d.ts.map +1 -0
  110. package/dist/registry/chat-model.d.ts +10 -0
  111. package/dist/registry/chat-model.d.ts.map +1 -0
  112. package/dist/registry/index.d.ts +3 -0
  113. package/dist/registry/index.d.ts.map +1 -0
  114. package/dist/registry/index.js +11 -0
  115. package/dist/registry/index.js.map +1 -0
  116. package/dist/types.d.ts +20 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/package.json +98 -0
@@ -0,0 +1,118 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-PZ5AY32C.js";
4
+
5
+ // src/connectivity/index.ts
6
+ var connectivity_exports = {};
7
+ __export(connectivity_exports, {
8
+ CIS_UNREACHABLE_REMINDER: () => CIS_UNREACHABLE_REMINDER,
9
+ buildUnreachableError: () => buildUnreachableError,
10
+ checkEndpointConnectivity: () => checkEndpointConnectivity
11
+ });
12
+
13
+ // src/connectivity/check.ts
14
+ import https from "https";
15
+ var DEFAULT_TIMEOUT_MS = 8e3;
16
+ function probePath(baseURL) {
17
+ const base = baseURL.replace(/\/+$/, "");
18
+ if (base.endsWith("/v1")) return `${base}/models`;
19
+ return base.includes("/v1") ? `${base}/models` : `${base}/v1/models`;
20
+ }
21
+ function resolveProbeRequest(baseURL, endpointOptions) {
22
+ let path = probePath(baseURL);
23
+ const urlObj = new URL(path);
24
+ const resolveFrom = endpointOptions?.resolveHost?.from;
25
+ const resolveTo = endpointOptions?.resolveHost?.to;
26
+ let hostHeader = endpointOptions?.host;
27
+ if (resolveFrom && resolveTo && urlObj.hostname) {
28
+ urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);
29
+ hostHeader = hostHeader ?? resolveFrom;
30
+ }
31
+ const searchParams = new URLSearchParams(urlObj.search);
32
+ if (endpointOptions?.bypassAuth === true) searchParams.set("bypass_auth", "true");
33
+ urlObj.search = searchParams.toString();
34
+ return { url: urlObj.toString(), hostHeader };
35
+ }
36
+ function checkWithHttps(url, hostHeader, options) {
37
+ return new Promise((resolve) => {
38
+ const u = new URL(url);
39
+ const reqOpts = {
40
+ hostname: u.hostname,
41
+ port: u.port || (u.protocol === "https:" ? 443 : 80),
42
+ path: u.pathname + u.search,
43
+ method: "GET",
44
+ headers: { Accept: "application/json" },
45
+ rejectUnauthorized: options.verifySSL
46
+ };
47
+ if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };
48
+ const timeoutId = setTimeout(() => {
49
+ req.destroy();
50
+ resolve({ reachable: false, message: "Connection timed out" });
51
+ }, options.timeoutMs);
52
+ const req = https.request(reqOpts, (res) => {
53
+ clearTimeout(timeoutId);
54
+ resolve({
55
+ reachable: true,
56
+ message: res.statusCode === 200 ? "OK" : `HTTP ${res.statusCode}`,
57
+ statusCode: res.statusCode
58
+ });
59
+ });
60
+ req.on("error", (err) => {
61
+ clearTimeout(timeoutId);
62
+ resolve({ reachable: false, message: err.message || "Connection failed" });
63
+ });
64
+ req.end();
65
+ });
66
+ }
67
+ async function checkEndpointConnectivity(baseURL, options) {
68
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
69
+ const useHttps = options?.resolveHost != null || options?.verifySSL === false || options?.host != null || options?.bypassAuth === true;
70
+ if (useHttps) {
71
+ const { url: url2, hostHeader } = resolveProbeRequest(baseURL, options);
72
+ return checkWithHttps(url2, hostHeader, {
73
+ timeoutMs,
74
+ verifySSL: options?.verifySSL === true
75
+ });
76
+ }
77
+ const url = probePath(baseURL);
78
+ const controller = new AbortController();
79
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
80
+ try {
81
+ const res = await fetch(url, {
82
+ method: "GET",
83
+ signal: controller.signal,
84
+ headers: { Accept: "application/json" }
85
+ });
86
+ clearTimeout(timeoutId);
87
+ return {
88
+ reachable: true,
89
+ message: res.ok ? "OK" : `HTTP ${res.status}`,
90
+ statusCode: res.status
91
+ };
92
+ } catch (err) {
93
+ clearTimeout(timeoutId);
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ const isTimeout = err instanceof Error && err.name === "AbortError";
96
+ return {
97
+ reachable: false,
98
+ message: isTimeout ? "Connection timed out" : message || "Connection failed"
99
+ };
100
+ }
101
+ }
102
+ var CIS_UNREACHABLE_REMINDER = "Please ensure you are connected to Secure VPN and try again.";
103
+ function buildUnreachableError(endpointId, baseURL, detail) {
104
+ const parts = [
105
+ `Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,
106
+ detail && ` ${detail}`,
107
+ ` ${CIS_UNREACHABLE_REMINDER}`
108
+ ];
109
+ return parts.filter(Boolean).join("").trim();
110
+ }
111
+
112
+ export {
113
+ checkEndpointConnectivity,
114
+ CIS_UNREACHABLE_REMINDER,
115
+ buildUnreachableError,
116
+ connectivity_exports
117
+ };
118
+ //# sourceMappingURL=chunk-EPVJLBGC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connectivity/index.ts","../src/connectivity/check.ts"],"sourcesContent":["export {\n checkEndpointConnectivity,\n buildUnreachableError,\n CIS_UNREACHABLE_REMINDER,\n type EndpointConnectivityOptions,\n} from \"./check.js\";\n\nexport type {\n CheckConnectivityResult,\n ConnectionPhase,\n ConnectionStatus,\n} from \"./types.js\";\n","/**\n * Check connectivity to OpenAI-compatible / CIS endpoints.\n */\nimport https from \"node:https\";\nimport type { CheckConnectivityResult } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8000;\n\nexport interface EndpointConnectivityOptions {\n timeoutMs?: number;\n resolveHost?: { from: string; to: string };\n host?: string;\n verifySSL?: boolean;\n bypassAuth?: boolean;\n featureKey?: string;\n}\n\nfunction probePath(baseURL: string): string {\n const base = baseURL.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return `${base}/models`;\n return base.includes(\"/v1\") ? `${base}/models` : `${base}/v1/models`;\n}\n\nfunction resolveProbeRequest(\n baseURL: string,\n endpointOptions?: EndpointConnectivityOptions | null\n): { url: string; hostHeader: string | undefined } {\n let path = probePath(baseURL);\n const urlObj = new URL(path);\n const resolveFrom = endpointOptions?.resolveHost?.from;\n const resolveTo = endpointOptions?.resolveHost?.to;\n let hostHeader = endpointOptions?.host;\n if (resolveFrom && resolveTo && urlObj.hostname) {\n urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);\n hostHeader = hostHeader ?? resolveFrom;\n }\n const searchParams = new URLSearchParams(urlObj.search);\n if (endpointOptions?.bypassAuth === true) searchParams.set(\"bypass_auth\", \"true\");\n urlObj.search = searchParams.toString();\n return { url: urlObj.toString(), hostHeader };\n}\n\nfunction checkWithHttps(\n url: string,\n hostHeader: string | undefined,\n options: { timeoutMs: number; verifySSL: boolean }\n): Promise<CheckConnectivityResult> {\n return new Promise((resolve) => {\n const u = new URL(url);\n const reqOpts: https.RequestOptions = {\n hostname: u.hostname,\n port: u.port || (u.protocol === \"https:\" ? 443 : 80),\n path: u.pathname + u.search,\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n rejectUnauthorized: options.verifySSL,\n };\n if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };\n\n const timeoutId = setTimeout(() => {\n req.destroy();\n resolve({ reachable: false, message: \"Connection timed out\" });\n }, options.timeoutMs);\n\n const req = https.request(reqOpts, (res) => {\n clearTimeout(timeoutId);\n resolve({\n reachable: true,\n message: res.statusCode === 200 ? \"OK\" : `HTTP ${res.statusCode}`,\n statusCode: res.statusCode,\n });\n });\n req.on(\"error\", (err) => {\n clearTimeout(timeoutId);\n resolve({ reachable: false, message: err.message || \"Connection failed\" });\n });\n req.end();\n });\n}\n\nexport async function checkEndpointConnectivity(\n baseURL: string,\n options?: { timeoutMs?: number } & EndpointConnectivityOptions\n): Promise<CheckConnectivityResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const useHttps =\n options?.resolveHost != null ||\n options?.verifySSL === false ||\n options?.host != null ||\n options?.bypassAuth === true;\n\n if (useHttps) {\n const { url, hostHeader } = resolveProbeRequest(baseURL, options);\n return checkWithHttps(url, hostHeader, {\n timeoutMs,\n verifySSL: options?.verifySSL === true,\n });\n }\n\n const url = probePath(baseURL);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeoutId);\n return {\n reachable: true,\n message: res.ok ? \"OK\" : `HTTP ${res.status}`,\n statusCode: res.status,\n };\n } catch (err) {\n clearTimeout(timeoutId);\n const message = err instanceof Error ? err.message : String(err);\n const isTimeout = err instanceof Error && err.name === \"AbortError\";\n return {\n reachable: false,\n message: isTimeout ? \"Connection timed out\" : message || \"Connection failed\",\n };\n }\n}\n\nexport const CIS_UNREACHABLE_REMINDER =\n \"Please ensure you are connected to Secure VPN and try again.\";\n\nexport function buildUnreachableError(\n endpointId: string,\n baseURL: string,\n detail?: string\n): string {\n const parts = [\n `Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,\n detail && ` ${detail}`,\n ` ${CIS_UNREACHABLE_REMINDER}`,\n ];\n return parts.filter(Boolean).join(\"\").trim();\n}\n"],"mappings":"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","names":["url"]}
@@ -0,0 +1,148 @@
1
+ // src/config/yaml-utils.ts
2
+ import { existsSync, readFileSync, statSync } from "fs";
3
+ import { readFile, stat } from "fs/promises";
4
+ import path from "path";
5
+ import { parse as parseYaml } from "yaml";
6
+ var YAML_CACHE = /* @__PURE__ */ new Map();
7
+ function clearYamlFileCache() {
8
+ YAML_CACHE.clear();
9
+ }
10
+ function substituteEnvInString(input, env, missingEnv) {
11
+ return input.replace(/\$\{(\w+)\}/g, (_, name) => {
12
+ const value = env[name];
13
+ if (value !== void 0) return value;
14
+ return missingEnv === "empty" ? "" : `\${${name}}`;
15
+ });
16
+ }
17
+ function substituteEnvInValue(input, options) {
18
+ if (typeof input === "string") {
19
+ return substituteEnvInString(input, options.env, options.missingEnv);
20
+ }
21
+ if (Array.isArray(input)) {
22
+ return input.map((item) => substituteEnvInValue(item, options));
23
+ }
24
+ if (input && typeof input === "object") {
25
+ const out = {};
26
+ for (const [k, v] of Object.entries(input)) {
27
+ out[k] = substituteEnvInValue(v, options);
28
+ }
29
+ return out;
30
+ }
31
+ return input;
32
+ }
33
+ function parseYamlContent(content, options = {}) {
34
+ const parsed = parseYaml(content);
35
+ if (options.substituteEnv === false) return parsed;
36
+ return substituteEnvInValue(parsed, {
37
+ env: options.env ?? process.env,
38
+ missingEnv: options.missingEnv ?? "keep"
39
+ });
40
+ }
41
+ function readFromCache(filePath, mtimeMs) {
42
+ const cached = YAML_CACHE.get(filePath);
43
+ if (!cached) return void 0;
44
+ if (cached.mtimeMs !== mtimeMs) return void 0;
45
+ return cached.value;
46
+ }
47
+ function writeCache(filePath, mtimeMs, value) {
48
+ YAML_CACHE.set(filePath, { mtimeMs, value });
49
+ }
50
+ function loadYamlFileSync(filePath, options = {}) {
51
+ const absPath = path.resolve(filePath);
52
+ if (!existsSync(absPath)) return void 0;
53
+ const useCache = options.cache === true;
54
+ const fileStat = statSync(absPath);
55
+ if (useCache) {
56
+ const cached = readFromCache(absPath, fileStat.mtimeMs);
57
+ if (cached !== void 0) return cached;
58
+ }
59
+ const content = readFileSync(absPath, "utf-8");
60
+ const parsed = parseYamlContent(content, options);
61
+ if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
62
+ return parsed;
63
+ }
64
+ async function loadYamlFile(filePath, options = {}) {
65
+ const absPath = path.resolve(filePath);
66
+ let fileStat;
67
+ try {
68
+ fileStat = await stat(absPath);
69
+ } catch (err) {
70
+ if (err?.code === "ENOENT") return void 0;
71
+ throw err;
72
+ }
73
+ const useCache = options.cache === true;
74
+ if (useCache) {
75
+ const cached = readFromCache(absPath, fileStat.mtimeMs);
76
+ if (cached !== void 0) return cached;
77
+ }
78
+ const content = await readFile(absPath, "utf-8");
79
+ const parsed = parseYamlContent(content, options);
80
+ if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
81
+ return parsed;
82
+ }
83
+
84
+ // src/config/loader.ts
85
+ function substituteEnv(obj) {
86
+ if (obj === null || obj === void 0) return obj;
87
+ if (typeof obj === "string") {
88
+ const m = obj.match(/^\$\{(\w+)\}$/);
89
+ return m ? process.env[m[1]] ?? obj : obj;
90
+ }
91
+ if (Array.isArray(obj)) return obj.map(substituteEnv);
92
+ if (typeof obj === "object") {
93
+ const out = {};
94
+ for (const [k, v] of Object.entries(obj)) out[k] = substituteEnv(v);
95
+ return out;
96
+ }
97
+ return obj;
98
+ }
99
+ function parseLlmYaml(content, options = {}) {
100
+ const { substituteEnv: doSub = true } = options;
101
+ const parsed = parseYamlContent(content, {
102
+ substituteEnv: doSub,
103
+ missingEnv: "keep"
104
+ });
105
+ const llm = parsed?.llm;
106
+ if (llm == null) return void 0;
107
+ return llm;
108
+ }
109
+ function loadModelsConfig(filePath, options = {}) {
110
+ if (typeof filePath !== "string" || filePath.trim().length === 0) {
111
+ throw new Error("agent-model: loadModelsConfig requires a non-empty file path");
112
+ }
113
+ try {
114
+ const parsed = loadYamlFileSync(filePath, {
115
+ substituteEnv: options.substituteEnv !== false,
116
+ missingEnv: "keep",
117
+ cache: true
118
+ });
119
+ if (parsed == null) return null;
120
+ return {
121
+ llm: parsed.llm ?? null,
122
+ vlm: parsed.vlm ?? null,
123
+ embed: parsed.embed ?? null,
124
+ runtime: {
125
+ check_connectivity: typeof parsed.runtime?.check_connectivity === "boolean" ? parsed.runtime.check_connectivity : void 0
126
+ }
127
+ };
128
+ } catch (e) {
129
+ const msg = e instanceof Error ? e.message : String(e);
130
+ throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });
131
+ }
132
+ }
133
+ function loadLlmConfig(filePath, options = {}) {
134
+ const result = loadModelsConfig(filePath, options);
135
+ return result?.llm ?? null;
136
+ }
137
+
138
+ export {
139
+ clearYamlFileCache,
140
+ parseYamlContent,
141
+ loadYamlFileSync,
142
+ loadYamlFile,
143
+ substituteEnv,
144
+ parseLlmYaml,
145
+ loadModelsConfig,
146
+ loadLlmConfig
147
+ };
148
+ //# sourceMappingURL=chunk-FZKECZUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/yaml-utils.ts","../src/config/loader.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\n\nexport interface YamlEnvOptions {\n substituteEnv?: boolean;\n missingEnv?: \"keep\" | \"empty\";\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface LoadYamlOptions extends YamlEnvOptions {\n cache?: boolean;\n}\n\ninterface CacheEntry {\n mtimeMs: number;\n value: unknown;\n}\n\nconst YAML_CACHE = new Map<string, CacheEntry>();\n\nexport function clearYamlFileCache(): void {\n YAML_CACHE.clear();\n}\n\nfunction substituteEnvInString(\n input: string,\n env: NodeJS.ProcessEnv,\n missingEnv: \"keep\" | \"empty\",\n): string {\n return input.replace(/\\$\\{(\\w+)\\}/g, (_, name: string) => {\n const value = env[name];\n if (value !== undefined) return value;\n return missingEnv === \"empty\" ? \"\" : `\\${${name}}`;\n });\n}\n\nfunction substituteEnvInValue(\n input: unknown,\n options: { env: NodeJS.ProcessEnv; missingEnv: \"keep\" | \"empty\" },\n): unknown {\n if (typeof input === \"string\") {\n return substituteEnvInString(input, options.env, options.missingEnv);\n }\n if (Array.isArray(input)) {\n return input.map((item) => substituteEnvInValue(item, options));\n }\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n out[k] = substituteEnvInValue(v, options);\n }\n return out;\n }\n return input;\n}\n\nexport function parseYamlContent<T = unknown>(\n content: string,\n options: YamlEnvOptions = {},\n): T {\n const parsed = parseYaml(content) as unknown;\n if (options.substituteEnv === false) return parsed as T;\n return substituteEnvInValue(parsed, {\n env: options.env ?? process.env,\n missingEnv: options.missingEnv ?? \"keep\",\n }) as T;\n}\n\nfunction readFromCache(filePath: string, mtimeMs: number): unknown | undefined {\n const cached = YAML_CACHE.get(filePath);\n if (!cached) return undefined;\n if (cached.mtimeMs !== mtimeMs) return undefined;\n return cached.value;\n}\n\nfunction writeCache(filePath: string, mtimeMs: number, value: unknown): void {\n YAML_CACHE.set(filePath, { mtimeMs, value });\n}\n\nexport function loadYamlFileSync<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): T | undefined {\n const absPath = path.resolve(filePath);\n if (!existsSync(absPath)) return undefined;\n const useCache = options.cache === true;\n const fileStat = statSync(absPath);\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = readFileSync(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n\nexport async function loadYamlFile<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<T | undefined> {\n const absPath = path.resolve(filePath);\n let fileStat;\n try {\n fileStat = await stat(absPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n throw err;\n }\n const useCache = options.cache === true;\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = await readFile(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n","/**\n * Load and parse LLM config from YAML (e.g. models.yaml).\n * Supports ${VAR} substitution from process.env.\n */\nimport { loadYamlFileSync, parseYamlContent } from \"./yaml-utils.js\";\n\nexport interface LoadLlmConfigOptions {\n substituteEnv?: boolean;\n}\n\nexport function substituteEnv(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === \"string\") {\n const m = obj.match(/^\\$\\{(\\w+)\\}$/);\n return m ? (process.env[m[1]] ?? obj) : obj;\n }\n if (Array.isArray(obj)) return obj.map(substituteEnv);\n if (typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = substituteEnv(v);\n return out;\n }\n return obj;\n}\n\nexport function parseLlmYaml(\n content: string,\n options: LoadLlmConfigOptions = {}\n): unknown {\n const { substituteEnv: doSub = true } = options;\n const parsed = parseYamlContent<{ llm?: unknown }>(content, {\n substituteEnv: doSub,\n missingEnv: \"keep\",\n });\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return llm;\n}\n\nexport interface ModelsConfigResult {\n llm: unknown;\n vlm: unknown;\n embed: unknown;\n runtime: { check_connectivity?: boolean };\n}\n\n/**\n * Load the full models.yaml config, returning llm, vlm, embed, and runtime sections.\n */\nexport function loadModelsConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {},\n): ModelsConfigResult | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-model: loadModelsConfig requires a non-empty file path\");\n }\n try {\n const parsed = loadYamlFileSync<{\n llm?: unknown;\n vlm?: unknown;\n embed?: unknown;\n runtime?: Record<string, unknown>;\n }>(filePath, {\n substituteEnv: options.substituteEnv !== false,\n missingEnv: \"keep\",\n cache: true,\n });\n if (parsed == null) return null;\n return {\n llm: parsed.llm ?? null,\n vlm: parsed.vlm ?? null,\n embed: parsed.embed ?? null,\n runtime: {\n check_connectivity:\n typeof parsed.runtime?.check_connectivity === \"boolean\"\n ? parsed.runtime.check_connectivity\n : undefined,\n },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n\n/**\n * Load only the llm section from a YAML config file.\n * @deprecated Use loadModelsConfig() instead.\n */\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n const result = loadModelsConfig(filePath, options);\n return result?.llm ?? null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ // src/registry/chat-model.ts
2
+ var CHAT_MODEL_FACTORIES = /* @__PURE__ */ new Map();
3
+ function registerChatModelProvider(providerName, factory) {
4
+ CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);
5
+ }
6
+ function getChatModelFactory(providerName) {
7
+ return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());
8
+ }
9
+
10
+ export {
11
+ registerChatModelProvider,
12
+ getChatModelFactory
13
+ };
14
+ //# sourceMappingURL=chunk-G7MKWPEI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/chat-model.ts"],"sourcesContent":["/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { LLMConfig } from \"../model/types.js\";\n\nexport type ChatModelFactory = (config: LLMConfig) => BaseChatModel;\n\nconst CHAT_MODEL_FACTORIES = new Map<string, ChatModelFactory>();\n\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n"],"mappings":";AAUA,IAAM,uBAAuB,oBAAI,IAA8B;AAExD,SAAS,0BAA0B,cAAsB,SAAiC;AAC/F,uBAAqB,IAAI,aAAa,YAAY,GAAG,OAAO;AAC9D;AAEO,SAAS,oBAAoB,cAAoD;AACtF,SAAO,qBAAqB,IAAI,aAAa,YAAY,CAAC;AAC5D;","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ getChatModelFactory,
3
+ registerChatModelProvider
4
+ } from "./chunk-G7MKWPEI.js";
5
+ import {
6
+ __export
7
+ } from "./chunk-PZ5AY32C.js";
8
+
9
+ // src/registry/index.ts
10
+ var registry_exports = {};
11
+ __export(registry_exports, {
12
+ getChatModelFactory: () => getChatModelFactory,
13
+ registerChatModelProvider: () => registerChatModelProvider
14
+ });
15
+
16
+ export {
17
+ registry_exports
18
+ };
19
+ //# sourceMappingURL=chunk-HCU4AWIV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/index.ts"],"sourcesContent":["export { registerChatModelProvider, getChatModelFactory } from \"./chat-model.js\";\nexport type { ChatModelFactory } from \"./chat-model.js\";\n"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}