@easynet/agent-llm 1.0.16 → 1.0.26

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.
@@ -1,4 +1,4 @@
1
- import { createChatModelFromLlmConfig } from "../langchain/index.js";
1
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
2
2
  import type { ConnectionStatus } from "../connectivity/types.js";
3
3
  export interface CreateAgentLlMOptions {
4
4
  configPath?: string;
@@ -7,5 +7,9 @@ export interface CreateAgentLlMOptions {
7
7
  onConnectionStatus?: (status: ConnectionStatus) => void;
8
8
  connectivityTimeoutMs?: number;
9
9
  }
10
- export declare function createAgentLlM(configPathOrOptions?: string | CreateAgentLlMOptions): Promise<ReturnType<typeof createChatModelFromLlmConfig>>;
10
+ /**
11
+ * Create a LangChain ChatModel from llm.yaml config.
12
+ * Returns BaseChatModel compatible with LangChain's createAgent and other tools.
13
+ */
14
+ export declare function createAgentLlM(configPathOrOptions?: string | CreateAgentLlMOptions): Promise<BaseChatModel>;
11
15
  //# sourceMappingURL=create-agent-llm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAUrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAsCjE,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAgFD,wBAAsB,cAAc,CAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,qBAAqB,GACnD,OAAO,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CA0B1D"}
1
+ {"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAWjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAsCjE,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAgFD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,qBAAqB,GACnD,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Load llm.yaml, resolve npm providers, and return the default LLMConfig.
3
+ * For use by CLIs (e.g. wallee-llm) that need config without creating a model.
4
+ */
5
+ import type { LLMConfig } from "../types.js";
6
+ export interface GetDefaultLlmConfigOptions {
7
+ /** Path to llm.yaml. Default: process.cwd() + "/llm.yaml" */
8
+ configPath?: string;
9
+ /** Install npm provider packages if missing. Default true. */
10
+ installNpmIfMissing?: boolean;
11
+ }
12
+ /**
13
+ * Returns the default LLM config from llm.yaml (after resolving npm: providers), or null if no config file.
14
+ */
15
+ export declare function getDefaultLlmConfig(options?: GetDefaultLlmConfigOptions): Promise<LLMConfig | null>;
16
+ //# sourceMappingURL=get-default-llm-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-default-llm-config.d.ts","sourceRoot":"","sources":["../../src/api/get-default-llm-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,0BAA0B;IACzC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAa3B"}
@@ -153,6 +153,31 @@ function loadLlmConfig(filePath, options = {}) {
153
153
  }
154
154
  }
155
155
 
156
+ // src/langchain/openai-compatible.ts
157
+ import { ChatOpenAI } from "@langchain/openai";
158
+ function createChatOpenAI(options) {
159
+ const {
160
+ baseURL,
161
+ model,
162
+ temperature = 0,
163
+ apiKey,
164
+ defaultHeaders,
165
+ defaultQuery,
166
+ httpAgent
167
+ } = options;
168
+ const config = {};
169
+ if (baseURL) config.baseURL = baseURL;
170
+ if (defaultHeaders) config.defaultHeaders = defaultHeaders;
171
+ if (defaultQuery) config.defaultQuery = defaultQuery;
172
+ if (httpAgent) config.httpAgent = httpAgent;
173
+ return new ChatOpenAI({
174
+ model,
175
+ temperature,
176
+ ...apiKey ? { apiKey } : {},
177
+ ...Object.keys(config).length > 0 ? { configuration: config } : {}
178
+ });
179
+ }
180
+
156
181
  // src/registry/chat-model.ts
157
182
  var CHAT_MODEL_FACTORIES = /* @__PURE__ */ new Map();
158
183
  function registerChatModelProvider(providerName, factory) {
@@ -163,13 +188,12 @@ function getChatModelFactory(providerName) {
163
188
  }
164
189
 
165
190
  // src/langchain/index.ts
166
- import { ChatOpenAI } from "@langchain/openai";
167
191
  var DEFAULT_MODEL = "gpt-4o-mini";
168
192
  function normalizeError(e, context) {
169
193
  if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });
170
194
  return new Error(`${context}: ${String(e)}`);
171
195
  }
172
- function createChatModelFromLlmConfig(options) {
196
+ function createChatModelFromLlmConfig(options = {}) {
173
197
  const { llmSection, modelEnv, apiKeyEnv } = options;
174
198
  let defaultId;
175
199
  let configs;
@@ -178,57 +202,54 @@ function createChatModelFromLlmConfig(options) {
178
202
  defaultId = parsed.defaultId;
179
203
  configs = parsed.configs;
180
204
  } catch (e) {
181
- throw normalizeError(e, "agent-llm: failed to parse llm section");
205
+ throw normalizeError(e, "Failed to parse llm section");
182
206
  }
183
- const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0];
184
- if (!defaultConfig) {
207
+ const config = configs.find((c) => c.id === defaultId) ?? configs[0];
208
+ if (!config) {
185
209
  const model2 = modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;
186
210
  const apiKey2 = apiKeyEnv ?? process.env.OPENAI_API_KEY;
187
- try {
188
- return new ChatOpenAI({
189
- model: model2,
190
- temperature: 0,
191
- ...apiKey2 ? { apiKey: apiKey2 } : {}
192
- });
193
- } catch (e) {
194
- throw normalizeError(e, "agent-llm: failed to create default ChatOpenAI");
195
- }
211
+ return createChatOpenAI({
212
+ model: model2,
213
+ temperature: 0,
214
+ ...apiKey2 ? { apiKey: apiKey2 } : {}
215
+ });
196
216
  }
197
- const provider = defaultConfig.provider ?? "openai";
198
- const chatModelFactory = getChatModelFactory(provider);
199
- if (chatModelFactory) {
200
- const config = {
201
- ...defaultConfig,
202
- model: modelEnv ?? defaultConfig.model,
203
- temperature: typeof defaultConfig.temperature === "number" ? defaultConfig.temperature : 0
204
- };
217
+ const provider = config.provider ?? "openai";
218
+ const factory = getChatModelFactory(provider);
219
+ if (factory) {
205
220
  try {
206
- return chatModelFactory(config);
221
+ return factory({
222
+ ...config,
223
+ model: modelEnv ?? config.model ?? DEFAULT_MODEL,
224
+ temperature: typeof config.temperature === "number" ? config.temperature : 0
225
+ });
207
226
  } catch (e) {
208
- throw normalizeError(e, `agent-llm: failed to create ChatModel for provider "${provider}"`);
227
+ throw normalizeError(e, `Failed to create ChatModel for provider "${provider}"`);
209
228
  }
210
229
  }
211
- const model = modelEnv ?? defaultConfig?.model ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;
212
- let apiKey = apiKeyEnv ?? defaultConfig?.apiKey ?? process.env.OPENAI_API_KEY;
213
- let baseURL = defaultConfig?.baseURL;
230
+ const model = modelEnv ?? config.model ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;
231
+ let apiKey = apiKeyEnv ?? config.apiKey ?? process.env.OPENAI_API_KEY;
232
+ let baseURL = config.baseURL;
214
233
  if (baseURL && !baseURL.replace(/\/$/, "").endsWith("/v1")) {
215
234
  baseURL = baseURL.replace(/\/$/, "") + "/v1";
216
235
  }
217
- if (baseURL && apiKey === void 0) {
218
- apiKey = "ollama";
236
+ if (baseURL && !apiKey) {
237
+ apiKey = "not-needed";
219
238
  }
220
- const temperature = typeof defaultConfig?.temperature === "number" ? defaultConfig.temperature : 0;
221
- const constructorOptions = {
239
+ const temperature = typeof config.temperature === "number" ? config.temperature : 0;
240
+ const opts = config.options;
241
+ const defaultHeaders = opts?.defaultHeaders;
242
+ const defaultQuery = opts?.defaultQuery;
243
+ const httpAgent = opts?.httpAgent;
244
+ return createChatOpenAI({
222
245
  model,
223
246
  temperature,
224
- ...apiKey ? { apiKey } : {},
225
- ...baseURL ? { configuration: { baseURL } } : {}
226
- };
227
- try {
228
- return new ChatOpenAI(constructorOptions);
229
- } catch (e) {
230
- throw normalizeError(e, "agent-llm: failed to create ChatOpenAI from config");
231
- }
247
+ baseURL,
248
+ apiKey,
249
+ defaultHeaders,
250
+ defaultQuery,
251
+ httpAgent
252
+ });
232
253
  }
233
254
 
234
255
  // src/types.ts
@@ -236,6 +257,7 @@ var AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
236
257
 
237
258
  // src/extensions/loader.ts
238
259
  import { readdirSync, readFileSync as readFileSync2, existsSync as existsSync2 } from "fs";
260
+ import { createRequire } from "module";
239
261
  import { join } from "path";
240
262
  import { pathToFileURL } from "url";
241
263
  var loadedPackages = /* @__PURE__ */ new Set();
@@ -333,6 +355,17 @@ async function loadModuleFromPath(pkgDir) {
333
355
  entryUrl
334
356
  );
335
357
  }
358
+ function resolvePackageEntryFromCwd(pkg, cwd) {
359
+ const pkgDir = join(cwd, "node_modules", pkg);
360
+ const pkgJsonPath = join(pkgDir, "package.json");
361
+ if (!existsSync2(pkgJsonPath)) return null;
362
+ try {
363
+ const req = createRequire(pkgJsonPath);
364
+ return req.resolve(pkg);
365
+ } catch {
366
+ return null;
367
+ }
368
+ }
336
369
  async function loadLLMExtensions(extensionPackages, options) {
337
370
  const packages = Array.isArray(extensionPackages) ? extensionPackages.filter((p) => typeof p === "string" && String(p).trim().length > 0) : [];
338
371
  const cwd = options?.cwd ?? process.cwd();
@@ -369,6 +402,26 @@ async function loadLLMExtensions(extensionPackages, options) {
369
402
  }
370
403
  }
371
404
  if (loaded) continue;
405
+ const resolvedEntry = resolvePackageEntryFromCwd(pkg, cwd);
406
+ if (resolvedEntry) {
407
+ try {
408
+ const entryUrl = pathToFileURL(resolvedEntry).href;
409
+ const m = await import(
410
+ /* @vite-ignore */
411
+ entryUrl
412
+ );
413
+ const ext = getExtensionFromModule(m);
414
+ if (ext) {
415
+ registerExtension(ext);
416
+ continue;
417
+ }
418
+ if (typeof m.registerLLMExtension === "function") {
419
+ m.registerLLMExtension();
420
+ continue;
421
+ }
422
+ } catch {
423
+ }
424
+ }
372
425
  try {
373
426
  const m = await import(
374
427
  /* @vite-ignore */
@@ -400,7 +453,7 @@ async function loadDiscoveredExtensions(cwd = process.cwd()) {
400
453
  // src/extensions/npm-protocol.ts
401
454
  import { execFileSync } from "child_process";
402
455
  import { readFileSync as readFileSync3 } from "fs";
403
- import { createRequire } from "module";
456
+ import { createRequire as createRequire2 } from "module";
404
457
  var NPM_PROTOCOL_PREFIX = "npm:";
405
458
  var VERSION_LATEST = "latest";
406
459
  async function getLatestVersion(packageName, options = {}) {
@@ -416,12 +469,12 @@ async function getLatestVersion(packageName, options = {}) {
416
469
  return version;
417
470
  } catch (e) {
418
471
  const msg = e instanceof Error ? e.message : String(e);
419
- throw new Error(`agent-llm: failed to get latest version for "${packageName}": ${msg}`, { cause: e });
472
+ throw new Error(`Failed to get latest version for "${packageName}": ${msg}`, { cause: e });
420
473
  }
421
474
  }
422
475
  function getInstalledVersion(packageName, options = {}) {
423
476
  const cwd = options.cwd ?? process.cwd();
424
- const require2 = createRequire(import.meta.url);
477
+ const require2 = createRequire2(import.meta.url);
425
478
  try {
426
479
  const p = require2.resolve(`${packageName}/package.json`, { paths: [cwd] });
427
480
  const j = JSON.parse(readFileSync3(p, "utf-8"));
@@ -450,46 +503,32 @@ function isModuleNotFoundError(err) {
450
503
  return msg.includes("Cannot find module") || msg.includes("Cannot find package") || msg.includes("MODULE_NOT_FOUND") || msg.includes("ERR_MODULE_NOT_FOUND") || msg.includes("Failed to load url") || msg.includes("Does the file exist");
451
504
  }
452
505
  async function resolveInstallVersion(packageName, version, cwd) {
453
- if (version === void 0 || version === "" || version === VERSION_LATEST) {
506
+ const isLatestOrEmpty = version === void 0 || version === "" || typeof version === "string" && version.toLowerCase() === VERSION_LATEST;
507
+ if (isLatestOrEmpty) {
454
508
  return getLatestVersion(packageName, { cwd });
455
509
  }
456
510
  return version;
457
511
  }
458
512
  async function ensureNpmPackageInstalled(packageName, options = {}) {
459
513
  if (typeof packageName !== "string" || packageName.trim().length === 0) {
460
- throw new Error("agent-llm: ensureNpmPackageInstalled requires a non-empty package name");
514
+ throw new Error("ensureNpmPackageInstalled requires a non-empty package name");
461
515
  }
462
516
  const cwd = options.cwd ?? process.cwd();
463
- const requestedVersion = options.version;
464
- const resolvedVersion = await resolveInstallVersion(packageName, requestedVersion, cwd);
465
- try {
466
- await import(
467
- /* @vite-ignore */
468
- packageName
469
- );
470
- const askedForLatest = requestedVersion === void 0 || requestedVersion === "" || requestedVersion === VERSION_LATEST;
471
- if (askedForLatest && resolvedVersion !== void 0) {
472
- const installed = getInstalledVersion(packageName, { cwd });
473
- if (installed !== null && installed !== resolvedVersion) {
474
- const installSpec2 = `${packageName}@${resolvedVersion}`;
475
- try {
476
- execFileSync("npm", ["install", installSpec2], { cwd, stdio: "inherit", encoding: "utf-8" });
477
- } catch (e) {
478
- const msg = e instanceof Error ? e.message : String(e);
479
- throw new Error(`agent-llm: npm install failed for ${installSpec2}: ${msg}`, { cause: e });
480
- }
481
- }
517
+ const resolvedVersion = await resolveInstallVersion(packageName, options.version, cwd);
518
+ const installedVersion = getInstalledVersion(packageName, { cwd });
519
+ if (installedVersion !== resolvedVersion) {
520
+ const installSpec = `${packageName}@${resolvedVersion}`;
521
+ if (installedVersion === null) {
522
+ console.info(`[agent-llm] Installing provider: ${installSpec}`);
523
+ } else {
524
+ console.info(`[agent-llm] Updating provider: ${packageName} ${installedVersion} \u2192 ${resolvedVersion}`);
525
+ }
526
+ try {
527
+ execFileSync("npm", ["install", installSpec, "--no-package-lock"], { cwd, stdio: "inherit", encoding: "utf-8" });
528
+ } catch (e) {
529
+ const msg = e instanceof Error ? e.message : String(e);
530
+ throw new Error(`npm install failed for ${installSpec}: ${msg}`, { cause: e });
482
531
  }
483
- return;
484
- } catch (err) {
485
- if (!isModuleNotFoundError(err)) throw err;
486
- }
487
- const installSpec = resolvedVersion ? `${packageName}@${resolvedVersion}` : packageName;
488
- try {
489
- execFileSync("npm", ["install", installSpec], { cwd, stdio: "inherit", encoding: "utf-8" });
490
- } catch (e) {
491
- const msg = e instanceof Error ? e.message : String(e);
492
- throw new Error(`agent-llm: npm install failed for ${installSpec}: ${msg}`, { cause: e });
493
532
  }
494
533
  }
495
534
  function normalizeError2(e, context) {
@@ -506,6 +545,9 @@ async function resolveNpmProvider(spec, options = {}) {
506
545
  const load = async () => {
507
546
  await loadLLMExtensions([packageName], { cwd });
508
547
  };
548
+ if (installNpmIfMissing) {
549
+ await ensureNpmPackageInstalled(packageName, { version, cwd });
550
+ }
509
551
  try {
510
552
  await load();
511
553
  } catch (err) {
@@ -514,21 +556,19 @@ async function resolveNpmProvider(spec, options = {}) {
514
556
  await ensureNpmPackageInstalled(packageName, { version, cwd });
515
557
  await load();
516
558
  } catch (installErr) {
517
- throw normalizeError2(installErr, `agent-llm: failed to install or load npm provider "${packageName}"`);
559
+ throw normalizeError2(installErr, `Failed to install or load npm provider "${packageName}"`);
518
560
  }
519
561
  } else {
520
- throw normalizeError2(err, `agent-llm: failed to load npm provider "${packageName}"`);
562
+ throw normalizeError2(err, `Failed to load npm provider "${packageName}"`);
521
563
  }
522
564
  }
523
- if (fragmentProvider && installNpmIfMissing && !getChatModelFactory(fragmentProvider)) {
524
- try {
565
+ if (fragmentProvider && !getChatModelFactory(fragmentProvider)) {
566
+ if (installNpmIfMissing) {
525
567
  await ensureNpmPackageInstalled(packageName, { version, cwd });
526
568
  await load();
527
- } catch (installErr) {
528
- throw normalizeError2(installErr, `agent-llm: failed to install or load npm provider "${packageName}" (provider "${fragmentProvider}" not registered)`);
529
569
  }
530
570
  if (!getChatModelFactory(fragmentProvider)) {
531
- throw new Error(`agent-llm: package "${packageName}" was installed but did not register provider "${fragmentProvider}". Check that the package exports getLLMExtension() or registerLLMExtension().`);
571
+ throw new Error(`Package "${packageName}" was installed but did not register provider "${fragmentProvider}". Check that the package exports getLLMExtension() or registerLLMExtension().`);
532
572
  }
533
573
  }
534
574
  if (fragmentProvider) return fragmentProvider;
@@ -554,7 +594,7 @@ async function resolveLlmSectionWithNpm(llmSection, options = {}) {
554
594
  try {
555
595
  out.push(await resolveLlmSectionWithNpm(llmSection[i], options));
556
596
  } catch (e) {
557
- throw normalizeError2(e, `agent-llm: failed to resolve llm section at index ${i}`);
597
+ throw normalizeError2(e, `Failed to resolve llm section at index ${i}`);
558
598
  }
559
599
  }
560
600
  return out;
@@ -567,21 +607,21 @@ async function resolveLlmSectionWithNpm(llmSection, options = {}) {
567
607
  const resolved = await resolveNpmProvider(v, options);
568
608
  out[k] = resolved ?? v;
569
609
  } catch (e) {
570
- throw normalizeError2(e, `agent-llm: failed to resolve provider "${String(v)}"`);
610
+ throw normalizeError2(e, `Failed to resolve provider "${String(v)}"`);
571
611
  }
572
612
  continue;
573
613
  }
574
614
  try {
575
615
  out[k] = await resolveLlmSectionWithNpm(v, options);
576
616
  } catch (e) {
577
- throw normalizeError2(e, `agent-llm: failed to resolve llm section key "${k}"`);
617
+ throw normalizeError2(e, `Failed to resolve llm section key "${k}"`);
578
618
  }
579
619
  }
580
620
  return out;
581
621
  }
582
622
  return llmSection;
583
623
  }
584
- async function createChatModelFromLlmConfigWithNpm(options) {
624
+ async function createChatModelWithNpm(options = {}) {
585
625
  try {
586
626
  const { installNpmIfMissing, cwd, ...rest } = options;
587
627
  const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {
@@ -593,7 +633,7 @@ async function createChatModelFromLlmConfigWithNpm(options) {
593
633
  llmSection: resolvedSection
594
634
  });
595
635
  } catch (e) {
596
- throw normalizeError2(e, "agent-llm: createChatModelFromLlmConfigWithNpm failed");
636
+ throw normalizeError2(e, "createChatModelWithNpm failed");
597
637
  }
598
638
  }
599
639
 
@@ -751,7 +791,7 @@ async function ensureConnectivity(resolvedLlmSection, options) {
751
791
  phase: "checking",
752
792
  endpointId: id,
753
793
  baseURL,
754
- message: "Checking CIS connection..."
794
+ message: "Checking connection..."
755
795
  });
756
796
  const endpointOpts = buildEndpointConnectivityOptions(config);
757
797
  const result = await checkEndpointConnectivity(baseURL, {
@@ -782,7 +822,9 @@ async function createAgentLlM(configPathOrOptions) {
782
822
  const configPath = options.configPath ?? resolveDefaultConfigPath();
783
823
  const llmSection = loadLlmConfig(configPath);
784
824
  if (llmSection == null) {
785
- throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);
825
+ throw new Error(
826
+ `No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`
827
+ );
786
828
  }
787
829
  const resolvedSection = await resolveLlmSectionWithNpm(llmSection, {
788
830
  installNpmIfMissing: options.installNpmIfMissing !== false,
@@ -796,16 +838,30 @@ async function createAgentLlM(configPathOrOptions) {
796
838
  return createChatModelFromLlmConfig({ llmSection: resolvedSection });
797
839
  } catch (e) {
798
840
  if (e instanceof Error && e.message.includes("No LLM config")) throw e;
799
- if (e instanceof Error && e.message.includes("Cannot connect to CIS")) throw e;
800
- throw normalizeError3(e, "agent-llm: createAgentLlM failed");
841
+ if (e instanceof Error && e.message.includes("Cannot connect to")) throw e;
842
+ throw normalizeError3(e, "createAgentLlM failed");
801
843
  }
802
844
  }
803
845
 
846
+ // src/cli/utils.ts
847
+ function messageContentToString(content) {
848
+ if (typeof content === "string") return content;
849
+ if (Array.isArray(content)) {
850
+ return content.map((c) => "text" in c && c.text ? c.text : "").join("");
851
+ }
852
+ return String(content ?? "");
853
+ }
854
+ function exitWithError(err, code = 1) {
855
+ console.error("Error:", err instanceof Error ? err.message : String(err));
856
+ process.exit(code);
857
+ }
858
+
804
859
  export {
805
860
  parseLlmSection,
806
861
  substituteEnv,
807
862
  parseLlmYaml,
808
863
  loadLlmConfig,
864
+ createChatOpenAI,
809
865
  registerChatModelProvider,
810
866
  getChatModelFactory,
811
867
  createChatModelFromLlmConfig,
@@ -822,10 +878,12 @@ export {
822
878
  ensureNpmPackageInstalled,
823
879
  resolveNpmProvider,
824
880
  resolveLlmSectionWithNpm,
825
- createChatModelFromLlmConfigWithNpm,
881
+ createChatModelWithNpm,
826
882
  checkEndpointConnectivity,
827
883
  CIS_UNREACHABLE_REMINDER,
828
884
  buildUnreachableError,
829
- createAgentLlM
885
+ createAgentLlM,
886
+ messageContentToString,
887
+ exitWithError
830
888
  };
831
- //# sourceMappingURL=chunk-CWU7GNFB.js.map
889
+ //# sourceMappingURL=chunk-YK2HYLIL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/parser.ts","../src/config/loader.ts","../src/langchain/openai-compatible.ts","../src/registry/chat-model.ts","../src/langchain/index.ts","../src/types.ts","../src/extensions/loader.ts","../src/extensions/npm-protocol.ts","../src/connectivity/check.ts","../src/api/create-agent-llm.ts","../src/cli/utils.ts"],"sourcesContent":["/**\n * Parse agent.yaml llm section into normalized LLMConfig[] and default id.\n * Supports: flat (each model keyed by name), instances[], or single object.\n */\n\nimport type { LLMConfig } from \"../types.js\";\n\nconst DEFAULT_LLM_ID = \"default\";\n\nconst RESERVED_KEYS = new Set([\n \"default\",\n \"instances\",\n \"catalog\",\n \"provider\",\n \"model\",\n \"temperature\",\n \"apiKey\",\n \"baseURL\",\n \"base_url\",\n \"type\",\n \"id\",\n]);\n\nexport function parseLlmSection(section: unknown): { defaultId: string; configs: LLMConfig[] } {\n if (section == null || typeof section !== \"object\") {\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n }\n\n if (Array.isArray(section)) {\n const configs = section\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((item, i) => normalizeLlmConfig({ ...item, id: item.id ?? item.name ?? String(i) }))\n .filter((c): c is LLMConfig => c != null);\n const defaultId = configs.length > 0 ? configs[0]!.id : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n const s = section as Record<string, unknown>;\n\n const flatEntries = Object.entries(s).filter(\n ([k, v]) => !RESERVED_KEYS.has(k) && v != null && typeof v === \"object\" && !Array.isArray(v)\n );\n if (flatEntries.length > 0) {\n const configs: LLMConfig[] = [];\n for (const [id, entry] of flatEntries) {\n const c = entryToLlmConfig(id, entry as Record<string, unknown>);\n if (c) configs.push(c);\n }\n const defaultId =\n typeof s.default === \"string\" && s.default && flatEntries.some(([k]) => k === s.default)\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (Array.isArray(s.instances)) {\n const configs = (s.instances as unknown[])\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((i) => normalizeLlmConfig(i))\n .filter((c): c is LLMConfig => c != null);\n const defaultId =\n typeof s.default === \"string\" && s.default\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (typeof s.provider === \"string\" || typeof s.model === \"string\" || typeof (s as { name?: string }).name === \"string\") {\n const one = singleObjectToLlmConfig(s);\n return { defaultId: one.id, configs: [one] };\n }\n\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n}\n\nconst EXTENSION_OPTION_KEYS = [\"featureKey\", \"tenant\", \"authToken\", \"verifySSL\", \"bypassAuth\", \"host\", \"resolveHost\", \"timeoutMs\", \"options\"];\n\nfunction entryToLlmConfig(id: string, entry: Record<string, unknown>): LLMConfig | null {\n const opts = entry.options as Record<string, unknown> | undefined;\n const baseURL =\n typeof entry.base_url === \"string\"\n ? entry.base_url\n : typeof entry.baseURL === \"string\"\n ? entry.baseURL\n : undefined;\n const model = typeof entry.name === \"string\" ? entry.name : typeof entry.model === \"string\" ? entry.model : undefined;\n const provider = typeof entry.provider === \"string\" && entry.provider ? entry.provider : \"openai\";\n const config: LLMConfig = {\n id,\n type: \"chat\",\n provider,\n model,\n temperature: typeof opts?.temperature === \"number\" ? opts.temperature : typeof entry.temperature === \"number\" ? entry.temperature : undefined,\n apiKey: typeof opts?.apiKey === \"string\" ? opts.apiKey : typeof entry.apiKey === \"string\" ? entry.apiKey : undefined,\n baseURL,\n };\n if (typeof entry.type === \"string\" && entry.type === \"image\") config.type = \"image\";\n if (opts && typeof opts === \"object\") (config as Record<string, unknown>).options = opts;\n for (const k of EXTENSION_OPTION_KEYS) {\n if (entry[k] !== undefined) (config as Record<string, unknown>)[k] = entry[k];\n else if (opts && opts[k] !== undefined) (config as Record<string, unknown>)[k] = opts[k];\n }\n return config;\n}\n\nfunction singleObjectToLlmConfig(s: Record<string, unknown>): LLMConfig {\n const one: LLMConfig = {\n id: DEFAULT_LLM_ID,\n type: \"chat\",\n provider: typeof s.provider === \"string\" ? s.provider : \"openai\",\n model: typeof s.model === \"string\" ? s.model : (typeof (s as { name?: string }).name === \"string\" ? (s as { name: string }).name : undefined),\n temperature: typeof s.temperature === \"number\" ? s.temperature : undefined,\n apiKey: typeof s.apiKey === \"string\" ? s.apiKey : undefined,\n baseURL:\n typeof s.baseURL === \"string\" ? s.baseURL : typeof s.base_url === \"string\" ? s.base_url : undefined,\n };\n Object.keys(s).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\", \"default\", \"instances\"].includes(k)) {\n (one as Record<string, unknown>)[k] = s[k];\n }\n });\n return one;\n}\n\nfunction normalizeLlmConfig(o: Record<string, unknown>): LLMConfig | null {\n const id = typeof o.id === \"string\" && o.id ? o.id : DEFAULT_LLM_ID;\n const type = o.type === \"image\" ? \"image\" : \"chat\";\n const provider = typeof o.provider === \"string\" && o.provider ? o.provider : \"openai\";\n const opts = o.options as Record<string, unknown> | undefined;\n const config: LLMConfig = {\n id,\n type,\n provider,\n model: typeof o.model === \"string\" ? o.model : (typeof o.name === \"string\" ? o.name : undefined),\n temperature:\n typeof o.temperature === \"number\"\n ? o.temperature\n : typeof opts?.temperature === \"number\"\n ? opts.temperature\n : undefined,\n apiKey:\n typeof o.apiKey === \"string\"\n ? o.apiKey\n : typeof opts?.apiKey === \"string\"\n ? opts.apiKey\n : undefined,\n baseURL: typeof o.baseURL === \"string\" ? o.baseURL : (typeof o.base_url === \"string\" ? o.base_url : undefined),\n };\n Object.keys(o).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\"].includes(k)) {\n (config as Record<string, unknown>)[k] = o[k];\n }\n });\n return config;\n}\n","/**\n * Load and parse LLM config from YAML (e.g. llm.yaml).\n * Supports ${VAR} substitution from process.env.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\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 = parseYaml(content) as { llm?: unknown };\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return doSub ? substituteEnv(llm) : llm;\n}\n\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-llm: loadLlmConfig requires a non-empty file path\");\n }\n if (!existsSync(filePath)) return null;\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to read config file ${filePath}: ${msg}`, { cause: e });\n }\n try {\n const llm = parseLlmYaml(raw, options);\n return llm ?? null;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n","/**\n * Create ChatOpenAI from config - works with any OpenAI-compatible provider.\n * This is the ONLY place we create ChatOpenAI instances.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { Agent } from \"node:http\";\n\nexport interface CreateChatOpenAIOptions {\n baseURL?: string;\n model: string;\n temperature?: number;\n apiKey?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n}\n\n/**\n * Create ChatOpenAI from options.\n * Works with OpenAI and any OpenAI-compatible endpoint (CIS, Ollama, etc.).\n */\nexport function createChatOpenAI(options: CreateChatOpenAIOptions): BaseChatModel {\n const {\n baseURL,\n model,\n temperature = 0,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n } = options;\n\n const config: {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n } = {};\n\n if (baseURL) config.baseURL = baseURL;\n if (defaultHeaders) config.defaultHeaders = defaultHeaders;\n if (defaultQuery) config.defaultQuery = defaultQuery;\n if (httpAgent) config.httpAgent = httpAgent;\n\n return new ChatOpenAI({\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(Object.keys(config).length > 0 ? { configuration: config } : {}),\n });\n}\n","/**\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 \"../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","/**\n * Simple LangChain module: create ChatOpenAI from llm config.\n * Extensions can register custom ChatModel factories via the registry.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatOpenAI } from \"./openai-compatible.js\";\nimport type { LLMConfig } from \"../types.js\";\nimport type { Agent } from \"node:http\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelOptions {\n llmSection?: unknown;\n modelEnv?: string;\n apiKeyEnv?: string;\n}\n\nfunction normalizeError(e: unknown, context: string): Error {\n if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });\n return new Error(`${context}: ${String(e)}`);\n}\n\n/**\n * Create a LangChain ChatModel from agent config llm section.\n * Uses extension-registered factory when available; otherwise creates ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelOptions = {}\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n\n let defaultId: string;\n let configs: LLMConfig[];\n\n try {\n const parsed = parseLlmSection(llmSection ?? null);\n defaultId = parsed.defaultId;\n configs = parsed.configs;\n } catch (e) {\n throw normalizeError(e, \"Failed to parse llm section\");\n }\n\n const config = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n // No config? Use default OpenAI\n if (!config) {\n const model = modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n\n return createChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n }\n\n // Check for registered custom factory\n const provider = config.provider ?? \"openai\";\n const factory = getChatModelFactory(provider);\n\n if (factory) {\n try {\n return factory({\n ...config,\n model: modelEnv ?? config.model ?? DEFAULT_MODEL,\n temperature: typeof config.temperature === \"number\" ? config.temperature : 0,\n });\n } catch (e) {\n throw normalizeError(e, `Failed to create ChatModel for provider \"${provider}\"`);\n }\n }\n\n // Create standard ChatOpenAI for OpenAI-compatible provider\n const model = modelEnv ?? config.model ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n let apiKey = apiKeyEnv ?? config.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = config.baseURL;\n\n // Ensure baseURL ends with /v1\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n\n // For local providers without API keys, use a placeholder\n if (baseURL && !apiKey) {\n apiKey = \"not-needed\";\n }\n\n const temperature = typeof config.temperature === \"number\" ? config.temperature : 0;\n\n // Extract options\n const opts = config.options as Record<string, unknown> | undefined;\n const defaultHeaders = opts?.defaultHeaders as Record<string, string> | undefined;\n const defaultQuery = opts?.defaultQuery as Record<string, string> | undefined;\n const httpAgent = opts?.httpAgent as Agent | undefined;\n\n return createChatOpenAI({\n model,\n temperature,\n baseURL,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n });\n}\n","/**\n * Agent LLM: OpenAI-compatible config.\n * Returns LangChain BaseChatModel instances.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\nexport type LLMType = \"chat\" | \"image\";\n\nexport interface LLMConfig {\n id: string;\n type: LLMType;\n provider: string;\n model?: string;\n temperature?: number;\n apiKey?: string;\n baseURL?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface AgentConfigLlmSection {\n default?: string;\n type?: string | string[];\n instances?: LLMConfig[];\n provider?: string;\n model?: string;\n name?: string;\n temperature?: number;\n apiKey?: string;\n baseURL?: string;\n base_url?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** package.json field: when true, the package is an agent-llm provider (for discovery). */\nexport const AGENT_LLM_PROVIDER_FIELD = \"agentLlmProvider\";\n\n/**\n * Extension interface: register a ChatModel factory by provider name.\n * Extensions implement getLLMExtension(); framework registers the factory when loading.\n */\nexport interface ILLMExtension {\n readonly providerName: string;\n /** ChatModel factory. Framework calls registerChatModelProvider(providerName, createChatModel). */\n readonly createChatModel?: (config: LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\n}\n","/**\n * Load LLM extensions by npm package name or by dynamic discovery.\n * Extensions register a ChatModel factory via registerChatModelProvider.\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ILLMExtension } from \"../types.js\";\nimport { AGENT_LLM_PROVIDER_FIELD } from \"../types.js\";\nimport { registerChatModelProvider, type ChatModelFactory } from \"../registry/chat-model.js\";\n\nconst loadedPackages = new Set<string>();\n\nfunction isLLMExtension(m: unknown): m is ILLMExtension {\n if (m == null || typeof m !== \"object\") return false;\n const e = m as ILLMExtension;\n if (typeof e.providerName !== \"string\") return false;\n const hasRegister = typeof e.register === \"function\";\n const hasChatModel = typeof e.createChatModel === \"function\";\n return hasRegister || hasChatModel;\n}\n\nfunction registerExtension(ext: ILLMExtension): void {\n if (typeof ext.createChatModel === \"function\") {\n registerChatModelProvider(ext.providerName, ext.createChatModel as ChatModelFactory);\n return;\n }\n if (typeof ext.register === \"function\") {\n ext.register();\n }\n}\n\nfunction getExtensionFromModule(m: Record<string, unknown>): ILLMExtension | null {\n if (isLLMExtension(m)) return m;\n if (typeof m.getLLMExtension === \"function\") {\n const ext = m.getLLMExtension();\n return isLLMExtension(ext) ? ext : null;\n }\n if (isLLMExtension(m.default)) return m.default;\n return null;\n}\n\nexport function resolveLLMExtensionPackages(types?: string | string[]): string[] {\n if (types == null) return [];\n const typeList = Array.isArray(types) ? types : [types];\n return typeList.filter(\n (t): t is string => typeof t === \"string\" && String(t).trim().length > 0\n );\n}\n\nfunction readPackageProviderName(pkgPath: string): string | null {\n if (!existsSync(pkgPath)) return null;\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { agentLlmProvider?: boolean; keywords?: string[]; name?: string };\n const declared =\n pkg[AGENT_LLM_PROVIDER_FIELD] === true ||\n (Array.isArray(pkg.keywords) && pkg.keywords.includes(\"agent-llm-provider\"));\n return declared && typeof pkg.name === \"string\" ? pkg.name : null;\n } catch {\n return null;\n }\n}\n\nexport function discoverLLMExtensions(cwd: string = process.cwd()): string[] {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const nodeModules = join(dir, \"node_modules\");\n if (!existsSync(nodeModules)) return [];\n const names: string[] = [];\n const seen = new Set<string>();\n try {\n const entries = readdirSync(nodeModules, { withFileTypes: true });\n for (const e of entries) {\n if (e.name.startsWith(\".\") || e.name === \"node\") continue;\n if (e.name.startsWith(\"@\") && e.isDirectory()) {\n const scopePath = join(nodeModules, e.name);\n const scopeEntries = readdirSync(scopePath, { withFileTypes: true });\n for (const se of scopeEntries) {\n if (!se.isDirectory()) continue;\n const name = readPackageProviderName(join(scopePath, se.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n continue;\n }\n const name = readPackageProviderName(join(nodeModules, e.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n } catch {\n // no node_modules or not readable\n }\n return names;\n}\n\nasync function loadModuleFromPath(pkgDir: string): Promise<Record<string, unknown>> {\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`package.json not found in ${pkgDir}`);\n }\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as { main?: string };\n const main = pkgJson?.main ?? \"index.js\";\n const entryPath = join(pkgDir, main);\n if (!existsSync(entryPath)) {\n throw new Error(`Entry ${main} not found in ${pkgDir}`);\n }\n const entryUrl = pathToFileURL(entryPath).href;\n return (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n}\n\n/**\n * Resolve package main entry from cwd so we load the copy in cwd's node_modules,\n * not a different copy from bare import (e.g. under @wallee/agent).\n */\nfunction resolvePackageEntryFromCwd(pkg: string, cwd: string): string | null {\n const pkgDir = join(cwd, \"node_modules\", pkg);\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) return null;\n try {\n const req = createRequire(pkgJsonPath);\n return req.resolve(pkg);\n } catch {\n return null;\n }\n}\n\nexport interface LoadLLMExtensionsOptions {\n cwd?: string;\n}\n\nexport async function loadLLMExtensions(\n extensionPackages?: string[],\n options?: LoadLLMExtensionsOptions\n): Promise<void> {\n const packages = Array.isArray(extensionPackages)\n ? extensionPackages.filter((p): p is string => typeof p === \"string\" && String(p).trim().length > 0)\n : [];\n const cwd = options?.cwd ?? process.cwd();\n for (const pkg of packages) {\n if (loadedPackages.has(pkg)) continue;\n loadedPackages.add(pkg);\n let loaded = false;\n const cwdPkgDir = join(cwd, \"node_modules\", pkg);\n const cwdIsProject =\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const name = (JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\")) as { name?: string }).name;\n return name === pkg;\n } catch {\n return false;\n }\n })();\n const dirsToTry = [cwdPkgDir, ...(cwdIsProject ? [cwd] : [])];\n for (const pkgDir of dirsToTry) {\n if (!existsSync(join(pkgDir, \"package.json\"))) continue;\n try {\n const m = await loadModuleFromPath(pkgDir);\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n loaded = true;\n break;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n loaded = true;\n break;\n }\n } catch {\n // try next path\n }\n }\n if (loaded) continue;\n // Prefer cwd-resolved entry so we load the copy just installed, not another copy from bare import\n const resolvedEntry = resolvePackageEntryFromCwd(pkg, cwd);\n if (resolvedEntry) {\n try {\n const entryUrl = pathToFileURL(resolvedEntry).href;\n const m = (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n continue;\n }\n } catch {\n // fall through to bare import\n }\n }\n try {\n const m = await import(/* @vite-ignore */ pkg) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (typeof process !== \"undefined\" && process.emitWarning) {\n process.emitWarning(`[agent-llm] Failed to load extension \"${pkg}\": ${msg}`, { code: \"AGENT_LLM_EXTENSION_LOAD\" });\n }\n }\n }\n}\n\nexport async function loadDiscoveredExtensions(cwd: string = process.cwd()): Promise<string[]> {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const names = discoverLLMExtensions(dir);\n await loadLLMExtensions(names);\n return names;\n}\n","/**\n * npm: protocol in provider — specify an npm package name (and optional version) in config's provider.\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { loadLLMExtensions } from \"./loader.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport type { CreateChatModelOptions } from \"../langchain/index.js\";\n\nexport const NPM_PROTOCOL_PREFIX = \"npm:\";\nconst VERSION_LATEST = \"latest\";\n\nexport async function getLatestVersion(\n packageName: string,\n options: { cwd?: string } = {}\n): Promise<string> {\n const cwd = options.cwd ?? process.cwd();\n try {\n const out = execFileSync(\"npm\", [\"view\", packageName, \"version\"], {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const version = (out ?? \"\").trim();\n if (!version) throw new Error(\"Empty version from npm view\");\n return version;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to get latest version for \"${packageName}\": ${msg}`, { cause: e });\n }\n}\n\nexport function getInstalledVersion(packageName: string, options: { cwd?: string } = {}): string | null {\n const cwd = options.cwd ?? process.cwd();\n const require = createRequire(import.meta.url);\n try {\n const p = require.resolve(`${packageName}/package.json`, { paths: [cwd] });\n const j = JSON.parse(readFileSync(p, \"utf-8\")) as { version?: string };\n return typeof j.version === \"string\" ? j.version : null;\n } catch {\n return null;\n }\n}\n\nexport function parseNpmProviderSpec(spec: string): { packageName: string; version?: string; provider?: string } | null {\n if (typeof spec !== \"string\" || !spec.startsWith(NPM_PROTOCOL_PREFIX)) return null;\n const rest = spec.slice(NPM_PROTOCOL_PREFIX.length);\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx).trim() : rest.trim();\n const fragmentProvider = hashIdx >= 0 ? rest.slice(hashIdx + 1).trim() : null;\n const versionMatch = beforeHash.match(/@([^/]+)$/);\n const packageName = versionMatch ? beforeHash.slice(0, -versionMatch[0].length).trim() : beforeHash;\n const version = versionMatch ? versionMatch[1] : undefined;\n if (!packageName) return null;\n return { packageName, version, provider: fragmentProvider ?? undefined };\n}\n\nexport interface EnsureNpmPackageInstalledOptions {\n version?: string;\n cwd?: string;\n}\n\nexport function isNpmProviderSpec(spec: unknown): spec is string {\n return typeof spec === \"string\" && spec.startsWith(NPM_PROTOCOL_PREFIX);\n}\n\nfunction isModuleNotFoundError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return (\n msg.includes(\"Cannot find module\") ||\n msg.includes(\"Cannot find package\") ||\n msg.includes(\"MODULE_NOT_FOUND\") ||\n msg.includes(\"ERR_MODULE_NOT_FOUND\") ||\n msg.includes(\"Failed to load url\") ||\n msg.includes(\"Does the file exist\")\n );\n}\n\n/**\n * Resolve install version: never use \"latest\" for management.\n * When version is missing or \"latest\", fetch actual latest from registry and return it.\n */\nasync function resolveInstallVersion(\n packageName: string,\n version: string | undefined,\n cwd: string\n): Promise<string> {\n const isLatestOrEmpty =\n version === undefined ||\n version === \"\" ||\n (typeof version === \"string\" && version.toLowerCase() === VERSION_LATEST);\n if (isLatestOrEmpty) {\n return getLatestVersion(packageName, { cwd });\n }\n return version;\n}\n\n/**\n * Ensure the npm package is installed at the required version.\n * We only use version numbers for management; \"latest\" is always resolved to the actual\n * version from the registry, then we install that version if missing or different.\n */\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n if (typeof packageName !== \"string\" || packageName.trim().length === 0) {\n throw new Error(\"ensureNpmPackageInstalled requires a non-empty package name\");\n }\n const cwd = options.cwd ?? process.cwd();\n const resolvedVersion = await resolveInstallVersion(packageName, options.version, cwd);\n const installedVersion = getInstalledVersion(packageName, { cwd });\n\n if (installedVersion !== resolvedVersion) {\n const installSpec = `${packageName}@${resolvedVersion}`;\n if (installedVersion === null) {\n console.info(`[agent-llm] Installing provider: ${installSpec}`);\n } else {\n console.info(`[agent-llm] Updating provider: ${packageName} ${installedVersion} → ${resolvedVersion}`);\n }\n try {\n // Use --no-package-lock so a damaged or conflicting lockfile in cwd does not break the install\n execFileSync(\"npm\", [\"install\", installSpec, \"--no-package-lock\"], { cwd, stdio: \"inherit\", encoding: \"utf-8\" });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`npm install failed for ${installSpec}: ${msg}`, { cause: e });\n }\n }\n}\n\nexport interface ResolveNpmProviderOptions {\n installNpmIfMissing?: boolean;\n cwd?: string;\n}\n\nfunction normalizeError(e: unknown, context: string): Error {\n if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });\n return new Error(`${context}: ${String(e)}`);\n}\n\nexport async function resolveNpmProvider(\n spec: string,\n options: ResolveNpmProviderOptions = {}\n): Promise<string | null> {\n if (typeof spec !== \"string\" || spec.trim().length === 0) return null;\n const parsed = parseNpmProviderSpec(spec);\n if (!parsed) return null;\n const { packageName, version, provider: fragmentProvider } = parsed;\n const installNpmIfMissing = options.installNpmIfMissing !== false;\n const cwd = options.cwd ?? process.cwd();\n\n const load = async (): Promise<void> => {\n await loadLLMExtensions([packageName], { cwd });\n };\n\n if (installNpmIfMissing) {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n }\n\n try {\n await load();\n } catch (err) {\n if (installNpmIfMissing && isModuleNotFoundError(err)) {\n try {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n } catch (installErr) {\n throw normalizeError(installErr, `Failed to install or load npm provider \"${packageName}\"`);\n }\n } else {\n throw normalizeError(err, `Failed to load npm provider \"${packageName}\"`);\n }\n }\n\n if (fragmentProvider && !getChatModelFactory(fragmentProvider)) {\n if (installNpmIfMissing) {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n }\n if (!getChatModelFactory(fragmentProvider)) {\n throw new Error(`Package \"${packageName}\" was installed but did not register provider \"${fragmentProvider}\". Check that the package exports getLLMExtension() or registerLLMExtension().`);\n }\n }\n\n if (fragmentProvider) return fragmentProvider;\n\n try {\n const m = await import(/* @vite-ignore */ packageName);\n if (typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\") {\n return (m as { getDefaultProviderName: () => string }).getDefaultProviderName();\n }\n } catch {\n // ignore\n }\n throw new Error(\n `Provider spec ${spec} has no #provider fragment and the package does not export getDefaultProviderName(). Use e.g. npm:${packageName}#<provider-name>.`\n );\n}\n\nexport interface ResolveLlmSectionWithNpmOptions extends ResolveNpmProviderOptions {}\n\nexport async function resolveLlmSectionWithNpm(\n llmSection: unknown,\n options: ResolveLlmSectionWithNpmOptions = {}\n): Promise<unknown> {\n if (llmSection == null) return llmSection;\n if (Array.isArray(llmSection)) {\n const out: unknown[] = [];\n for (let i = 0; i < llmSection.length; i++) {\n try {\n out.push(await resolveLlmSectionWithNpm(llmSection[i], options));\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section at index ${i}`);\n }\n }\n return out;\n }\n if (typeof llmSection === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(llmSection)) {\n if (k === \"provider\" && isNpmProviderSpec(v)) {\n try {\n const resolved = await resolveNpmProvider(v as string, options);\n out[k] = resolved ?? v;\n } catch (e) {\n throw normalizeError(e, `Failed to resolve provider \"${String(v)}\"`);\n }\n continue;\n }\n try {\n out[k] = await resolveLlmSectionWithNpm(v, options);\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section key \"${k}\"`);\n }\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelWithNpmOptions\n extends CreateChatModelOptions,\n ResolveNpmProviderOptions {}\n\nexport async function createChatModelWithNpm(\n options: CreateChatModelWithNpmOptions = {}\n): Promise<BaseChatModel> {\n try {\n const { installNpmIfMissing, cwd, ...rest } = options;\n const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {\n installNpmIfMissing,\n cwd,\n });\n return createChatModelFromLlmConfig({\n ...rest,\n llmSection: resolvedSection,\n });\n } catch (e) {\n throw normalizeError(e, \"createChatModelWithNpm failed\");\n }\n}\n","/**\n * Check connectivity to OpenAI-compatible / CIS endpoints.\n */\nimport https from \"node:https\";\nimport type { CheckConnectivityResult, ConnectionStatus } 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\nexport type { ConnectionStatus };\n","/**\n * Simple API: create LangChain ChatModel from llm.yaml config.\n * Supports OpenAI-compatible providers with optional connectivity check and npm: provider resolution.\n */\nimport { join } from \"node:path\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport { loadLlmConfig } from \"../config/loader.js\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport type { LLMConfig } from \"../types.js\";\nimport {\n checkEndpointConnectivity,\n buildUnreachableError,\n type EndpointConnectivityOptions,\n} from \"../connectivity/check.js\";\nimport type { ConnectionStatus } from \"../connectivity/types.js\";\n\nconst CIS_DEFAULT_RESOLVE_HOST = \"s0010-ml-https.s0010.us-west-2.awswd\";\nconst CIS_DEFAULT_RESOLVE_IP = \"10.210.98.124\";\n\nfunction buildEndpointConnectivityOptions(\n config: LLMConfig & { baseURL: string }\n): EndpointConnectivityOptions | undefined {\n const opts = (config.options as Record<string, unknown> | undefined) ?? config;\n const provider = typeof config.provider === \"string\" ? config.provider : \"\";\n const baseURL = config.baseURL;\n const isCis = provider === \"cis\" || provider.includes(\"cis\");\n const useCisDefault =\n isCis &&\n baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) &&\n opts?.resolveHost == null;\n\n const resolveHost =\n opts?.resolveHost != null && typeof (opts.resolveHost as { from?: string; to?: string }).from === \"string\"\n ? (opts.resolveHost as { from: string; to: string })\n : useCisDefault\n ? { from: CIS_DEFAULT_RESOLVE_HOST, to: CIS_DEFAULT_RESOLVE_IP }\n : undefined;\n const host = typeof opts?.host === \"string\" ? opts.host : (resolveHost ? resolveHost.from : undefined);\n if (resolveHost == null && host == null) return undefined;\n\n const verifySSL = opts?.verifySSL === true;\n const bypassAuth = opts?.bypassAuth !== false;\n\n return {\n resolveHost,\n host,\n verifySSL: resolveHost != null ? false : (verifySSL ? true : undefined),\n bypassAuth: bypassAuth ? true : undefined,\n featureKey: typeof opts?.featureKey === \"string\" ? opts.featureKey : undefined,\n };\n}\n\nexport interface CreateAgentLlMOptions {\n configPath?: string;\n installNpmIfMissing?: boolean;\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\n\nfunction resolveDefaultConfigPath(): string {\n return join(process.cwd(), \"llm.yaml\");\n}\n\nfunction normalizeOptions(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): CreateAgentLlMOptions {\n if (configPathOrOptions == null) return {};\n if (typeof configPathOrOptions === \"string\") return { configPath: configPathOrOptions };\n return configPathOrOptions;\n}\n\nfunction normalizeError(e: unknown, context: string): Error {\n if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });\n return new Error(`${context}: ${String(e)}`);\n}\n\nasync function ensureConnectivity(\n resolvedLlmSection: unknown,\n options: {\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n }\n): Promise<void> {\n let configs: Array<LLMConfig & { baseURL: string }>;\n try {\n const parsed = parseLlmSection(resolvedLlmSection ?? null);\n configs = parsed.configs.filter(\n (c): c is LLMConfig & { baseURL: string } =>\n typeof c.baseURL === \"string\" &&\n c.baseURL.length > 0 &&\n (c.baseURL.startsWith(\"http://\") || c.baseURL.startsWith(\"https://\")) &&\n !c.baseURL.includes(\"${\")\n );\n } catch {\n return;\n }\n const shouldCheck = options.checkConnectivity !== false && configs.length > 0;\n if (!shouldCheck) return;\n\n const report = (status: ConnectionStatus) => options.onConnectionStatus?.(status);\n const timeoutMs = options.connectivityTimeoutMs ?? 8000;\n\n for (const config of configs) {\n const { id, baseURL } = config;\n report({\n phase: \"checking\",\n endpointId: id,\n baseURL,\n message: \"Checking connection...\",\n });\n\n const endpointOpts = buildEndpointConnectivityOptions(config);\n const result = await checkEndpointConnectivity(baseURL, {\n timeoutMs,\n ...endpointOpts,\n });\n\n if (result.reachable) {\n report({\n phase: \"reachable\",\n endpointId: id,\n baseURL,\n message: result.message ?? \"Connected\",\n });\n } else {\n report({\n phase: \"unreachable\",\n endpointId: id,\n baseURL,\n message: result.message ?? \"Unreachable\",\n });\n throw new Error(buildUnreachableError(id, baseURL, result.message));\n }\n }\n}\n\n/**\n * Create a LangChain ChatModel from llm.yaml config.\n * Returns BaseChatModel compatible with LangChain's createAgent and other tools.\n */\nexport async function createAgentLlM(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): Promise<BaseChatModel> {\n try {\n const options = normalizeOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n\n if (llmSection == null) {\n throw new Error(\n `No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`\n );\n }\n\n const resolvedSection = await resolveLlmSectionWithNpm(llmSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n\n await ensureConnectivity(resolvedSection, {\n checkConnectivity: options.checkConnectivity,\n onConnectionStatus: options.onConnectionStatus,\n connectivityTimeoutMs: options.connectivityTimeoutMs,\n });\n\n return createChatModelFromLlmConfig({ llmSection: resolvedSection });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n if (e instanceof Error && e.message.includes(\"Cannot connect to\")) throw e;\n throw normalizeError(e, \"createAgentLlM failed\");\n }\n}\n","/**\n * Shared CLI helpers for agent-llm and provider CLIs.\n */\n\n/**\n * Turn LangChain message content (string | array of parts) into a single string.\n */\nexport function messageContentToString(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return (content as { type?: string; text?: string }[])\n .map((c) => (\"text\" in c && c.text ? c.text : \"\"))\n .join(\"\");\n }\n return String(content ?? \"\");\n}\n\n/**\n * Log error and exit. Use in CLIs for consistent error handling.\n */\nexport function exitWithError(err: unknown, code = 1): never {\n console.error(\"Error:\", err instanceof Error ? err.message : String(err));\n process.exit(code);\n}\n"],"mappings":"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","names":["model","apiKey","readFileSync","existsSync","existsSync","readFileSync","name","readFileSync","createRequire","require","createRequire","readFileSync","normalizeError","url","join","join","normalizeError"]}