@easynet/agent-llm 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -60,3 +60,28 @@ apiKey: ${OPENAI_API_KEY}
60
60
  ```
61
61
 
62
62
  Optional: pass a path when calling `createAgentLlM({ configPath: "/path/to/llm.yaml" })`.
63
+
64
+ ## npm: protocol in provider (install on demand)
65
+
66
+ You can set the provider by **npm package name** (and optional version) in config. If the package is not installed, the framework will **install it** and then use it as the provider.
67
+
68
+ **Recommended format:** `npm:<package>@<version>#<provider>` — e.g. **`provider: "npm:wallee-llm@0.1.0#cis"`**.
69
+
70
+ - **`provider: "npm:wallee-llm@0.1.0#cis"`** – **(recommended)** install `wallee-llm@0.1.0` if missing, then use provider `cis`.
71
+ - **`provider: "npm:wallee-llm@0.1.0"`** – use a specific version; default provider is used.
72
+ - **`provider: "npm:wallee-llm#cis"`** – load wallee-llm and use the provider named `cis`.
73
+ - **`provider: "npm:wallee-llm"`** – load wallee-llm and use its default provider (e.g. `cis`).
74
+
75
+ Use **createChatModelFromLlmConfigWithNpm** or **createAgentLlMAsync** so npm: providers are resolved (and optionally installed) before creating the model:
76
+
77
+ ```ts
78
+ import { createChatModelFromLlmConfigWithNpm, createAgentLlMAsync } from "@easynet/agent-llm";
79
+
80
+ // From a raw llm section (e.g. from loadLlmConfig)
81
+ const model = await createChatModelFromLlmConfigWithNpm({ llmSection });
82
+
83
+ // From config file (llm.yaml / config/llm.yaml)
84
+ const llm = await createAgentLlMAsync();
85
+ ```
86
+
87
+ Options: **installNpmIfMissing** (default `true`) and **cwd** (default `process.cwd()` for npm install). Exports: `parseNpmProviderSpec`, `ensureNpmPackageInstalled`, `resolveNpmProvider`, `resolveLlmSectionWithNpm`, `isNpmProviderSpec`, `createChatModelFromLlmConfigWithNpm`, `createAgentLlMAsync`.
@@ -353,25 +353,8 @@ function createChatModelFromLlmConfig(options) {
353
353
  return new ChatOpenAI(constructorOptions);
354
354
  }
355
355
 
356
- // src/createAgentLlM.ts
357
- import { join } from "path";
358
- import { existsSync as existsSync2 } from "fs";
359
- function resolveDefaultConfigPath() {
360
- const cwd = process.cwd();
361
- if (existsSync2(join(cwd, "llm.yaml"))) return join(cwd, "llm.yaml");
362
- if (existsSync2(join(cwd, "config", "llm.yaml"))) return join(cwd, "config", "llm.yaml");
363
- const parentConfig = join(cwd, "..", "config", "llm.yaml");
364
- if (existsSync2(parentConfig)) return parentConfig;
365
- return join(cwd, "config", "llm.yaml");
366
- }
367
- function createAgentLlM(options = {}) {
368
- const configPath = options.configPath ?? resolveDefaultConfigPath();
369
- const llmSection = loadLlmConfig(configPath);
370
- if (llmSection == null) {
371
- throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);
372
- }
373
- return createChatModelFromLlmConfig({ llmSection });
374
- }
356
+ // src/npmProviderProtocol.ts
357
+ import { execSync } from "child_process";
375
358
 
376
359
  // src/loadLLMExtensions.ts
377
360
  var loadedPackages = /* @__PURE__ */ new Set();
@@ -401,6 +384,147 @@ async function loadLLMExtensions(extensionPackages) {
401
384
  }
402
385
  }
403
386
 
387
+ // src/npmProviderProtocol.ts
388
+ var NPM_PROTOCOL_PREFIX = "npm:";
389
+ function parseNpmProviderSpec(spec) {
390
+ if (!isNpmProviderSpec(spec)) return null;
391
+ const rest = spec.slice(NPM_PROTOCOL_PREFIX.length);
392
+ const hashIdx = rest.indexOf("#");
393
+ const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx).trim() : rest.trim();
394
+ const fragmentProvider = hashIdx >= 0 ? rest.slice(hashIdx + 1).trim() : null;
395
+ const versionMatch = beforeHash.match(/@([^/]+)$/);
396
+ const packageName = versionMatch ? beforeHash.slice(0, -versionMatch[0].length).trim() : beforeHash;
397
+ const version = versionMatch ? versionMatch[1] : void 0;
398
+ if (!packageName) return null;
399
+ return { packageName, version, provider: fragmentProvider ?? void 0 };
400
+ }
401
+ function isNpmProviderSpec(spec) {
402
+ return typeof spec === "string" && spec.startsWith(NPM_PROTOCOL_PREFIX);
403
+ }
404
+ function isModuleNotFoundError(err) {
405
+ const msg = err instanceof Error ? err.message : String(err);
406
+ return msg.includes("Cannot find module") || msg.includes("Cannot find package") || msg.includes("MODULE_NOT_FOUND") || msg.includes("ERR_MODULE_NOT_FOUND");
407
+ }
408
+ async function ensureNpmPackageInstalled(packageName, options = {}) {
409
+ const cwd = options.cwd ?? process.cwd();
410
+ const version = options.version;
411
+ try {
412
+ await import(
413
+ /* @vite-ignore */
414
+ packageName
415
+ );
416
+ return;
417
+ } catch (err) {
418
+ if (!isModuleNotFoundError(err)) throw err;
419
+ }
420
+ const installSpec = version ? `${packageName}@${version}` : packageName;
421
+ execSync(`npm install ${installSpec}`, {
422
+ cwd,
423
+ stdio: "inherit",
424
+ encoding: "utf-8"
425
+ });
426
+ }
427
+ async function resolveNpmProvider(spec, options = {}) {
428
+ const parsed = parseNpmProviderSpec(spec);
429
+ if (!parsed) return null;
430
+ const { packageName, version, provider: fragmentProvider } = parsed;
431
+ const installNpmIfMissing = options.installNpmIfMissing !== false;
432
+ const cwd = options.cwd ?? process.cwd();
433
+ const load = async () => {
434
+ await loadLLMExtensions([packageName]);
435
+ };
436
+ try {
437
+ await load();
438
+ } catch (err) {
439
+ if (installNpmIfMissing && isModuleNotFoundError(err)) {
440
+ await ensureNpmPackageInstalled(packageName, { version, cwd });
441
+ await load();
442
+ } else {
443
+ throw err;
444
+ }
445
+ }
446
+ if (fragmentProvider) return fragmentProvider;
447
+ try {
448
+ const m = await import(
449
+ /* @vite-ignore */
450
+ packageName
451
+ );
452
+ if (typeof m.getDefaultProviderName === "function") {
453
+ return m.getDefaultProviderName();
454
+ }
455
+ } catch {
456
+ }
457
+ throw new Error(
458
+ `Provider spec ${spec} has no #provider fragment and the package does not export getDefaultProviderName(). Use e.g. npm:${packageName}#<provider-name>.`
459
+ );
460
+ }
461
+ async function resolveLlmSectionWithNpm(llmSection, options = {}) {
462
+ if (llmSection == null) return llmSection;
463
+ if (Array.isArray(llmSection)) {
464
+ const out = [];
465
+ for (const item of llmSection) {
466
+ out.push(await resolveLlmSectionWithNpm(item, options));
467
+ }
468
+ return out;
469
+ }
470
+ if (typeof llmSection === "object") {
471
+ const out = {};
472
+ for (const [k, v] of Object.entries(llmSection)) {
473
+ if (k === "provider" && isNpmProviderSpec(v)) {
474
+ const resolved = await resolveNpmProvider(v, options);
475
+ out[k] = resolved ?? v;
476
+ continue;
477
+ }
478
+ out[k] = await resolveLlmSectionWithNpm(v, options);
479
+ }
480
+ return out;
481
+ }
482
+ return llmSection;
483
+ }
484
+ async function createChatModelFromLlmConfigWithNpm(options) {
485
+ const { installNpmIfMissing, cwd, ...rest } = options;
486
+ const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {
487
+ installNpmIfMissing,
488
+ cwd
489
+ });
490
+ return createChatModelFromLlmConfig({
491
+ ...rest,
492
+ llmSection: resolvedSection
493
+ });
494
+ }
495
+
496
+ // src/createAgentLlM.ts
497
+ import { join } from "path";
498
+ import { existsSync as existsSync2 } from "fs";
499
+ function resolveDefaultConfigPath() {
500
+ const cwd = process.cwd();
501
+ if (existsSync2(join(cwd, "llm.yaml"))) return join(cwd, "llm.yaml");
502
+ if (existsSync2(join(cwd, "config", "llm.yaml"))) return join(cwd, "config", "llm.yaml");
503
+ const parentConfig = join(cwd, "..", "config", "llm.yaml");
504
+ if (existsSync2(parentConfig)) return parentConfig;
505
+ return join(cwd, "config", "llm.yaml");
506
+ }
507
+ function createAgentLlM(options = {}) {
508
+ const configPath = options.configPath ?? resolveDefaultConfigPath();
509
+ const llmSection = loadLlmConfig(configPath);
510
+ if (llmSection == null) {
511
+ throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);
512
+ }
513
+ return createChatModelFromLlmConfig({ llmSection });
514
+ }
515
+ async function createAgentLlMAsync(options = {}) {
516
+ const configPath = options.configPath ?? resolveDefaultConfigPath();
517
+ const llmSection = loadLlmConfig(configPath);
518
+ if (llmSection == null) {
519
+ throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);
520
+ }
521
+ return createChatModelFromLlmConfigWithNpm({
522
+ llmSection,
523
+ installNpmIfMissing: options.installNpmIfMissing !== false,
524
+ cwd: process.cwd()
525
+ });
526
+ }
527
+
404
528
  export {
405
529
  parseLlmSection,
406
530
  substituteEnv,
@@ -415,8 +539,16 @@ export {
415
539
  registerChatModelProvider,
416
540
  getChatModelFactory,
417
541
  createChatModelFromLlmConfig,
418
- createAgentLlM,
419
542
  resolveLLMExtensionPackages,
420
- loadLLMExtensions
543
+ loadLLMExtensions,
544
+ NPM_PROTOCOL_PREFIX,
545
+ parseNpmProviderSpec,
546
+ isNpmProviderSpec,
547
+ ensureNpmPackageInstalled,
548
+ resolveNpmProvider,
549
+ resolveLlmSectionWithNpm,
550
+ createChatModelFromLlmConfigWithNpm,
551
+ createAgentLlM,
552
+ createAgentLlMAsync
421
553
  };
422
- //# sourceMappingURL=chunk-3Z3KXKNU.js.map
554
+ //# sourceMappingURL=chunk-UZOGGJK7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/loadLlmConfig.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/factory.ts","../src/chatModelRegistry.ts","../src/llmAdapter.ts","../src/npmProviderProtocol.ts","../src/loadLLMExtensions.ts","../src/createAgentLlM.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\n/**\n * Parse llm section: flat (each model keyed by name), default+instances, or single object.\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. config/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 /** Replace ${VAR} with process.env.VAR. Default true. */\n substituteEnv?: boolean;\n}\n\n/**\n * Recursively replace ${VAR} in strings with process.env.VAR.\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\n/**\n * Parse YAML string and return the llm section (top-level key \"llm\").\n * Returns undefined if content has no llm key.\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\n/**\n * Load LLM config from a YAML file (e.g. config/llm.yaml).\n * Returns the llm section for use with createChatModelFromLlmConfig or parseLlmSection.\n * Returns null if file does not exist or has no llm key.\n */\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n if (!existsSync(filePath)) return null;\n try {\n const raw = readFileSync(filePath, \"utf8\");\n const llm = parseLlmYaml(raw, options);\n return llm ?? null;\n } catch {\n return null;\n }\n}\n","/**\n * OpenAI-compatible format: chat (/v1/chat/completions) and image.\n * Supports baseURL for Azure, local proxy, and other compatible endpoints.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n LLMConfig,\n ChatMessage,\n ChatResult,\n ImageResult,\n ILLMClient,\n ChatWithToolsMessage,\n ChatWithToolsResult,\n ToolDefinition,\n} from \"../types.js\";\n\nfunction getApiKey(config: LLMConfig): string {\n const key = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n if (!key) throw new Error(\"OpenAI-compatible apiKey required (config.apiKey or OPENAI_API_KEY)\");\n return key;\n}\n\nfunction createOpenAIClientOptions(config: LLMConfig): { apiKey: string; baseURL?: string } {\n const opts: { apiKey: string; baseURL?: string } = { apiKey: getApiKey(config) };\n if (typeof config.baseURL === \"string\" && config.baseURL) opts.baseURL = config.baseURL;\n return opts;\n}\n\nfunction serializeMessage(\n m: ChatWithToolsMessage\n): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (m.role === \"tool\")\n return { role: \"tool\", content: m.content, tool_call_id: m.tool_call_id };\n if (m.role === \"assistant\" && \"tool_calls\" in m && m.tool_calls?.length) {\n return {\n role: \"assistant\",\n content: m.content ?? null,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n };\n }\n return { role: m.role, content: (m as ChatMessage).content };\n}\n\nexport function createOpenAIChatClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = config.model ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n const temperature = config.temperature ?? 0;\n\n return {\n id: config.id,\n type: \"chat\",\n async chat(messages: ChatMessage[]): Promise<ChatResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n });\n const content = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return { content, usage };\n },\n async chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n });\n const msg = resp.choices[0]?.message;\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return {\n message: {\n role: \"assistant\",\n content: msg?.content ?? null,\n tool_calls: msg?.tool_calls?.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n },\n })),\n },\n usage,\n };\n },\n };\n}\n\nexport function createOpenAIImageClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = (config.model as string) ?? \"dall-e-3\";\n\n return {\n id: config.id,\n type: \"image\",\n async chat(): Promise<ChatResult> {\n throw new Error(\"OpenAI image model does not support chat; use generateImage()\");\n },\n async generateImage(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult> {\n const resp = await client.images.generate({\n model,\n prompt: options.prompt,\n size: (options.size as \"1024x1024\" | \"1792x1024\" | \"1024x1792\") ?? \"1024x1024\",\n n: options.n ?? 1,\n response_format: \"url\",\n });\n const url = resp.data?.[0]?.url ?? undefined;\n return { url };\n },\n };\n}\n\nexport function createOpenAIClient(config: LLMConfig): ILLMClient {\n if (config.type === \"image\") return createOpenAIImageClient(config);\n return createOpenAIChatClient(config);\n}\n","/**\n * Supports OpenAI-compatible and extension providers.\n */\n\nimport type { LLMConfig, ILLMClient } from \"../types.js\";\nimport { createOpenAIClient } from \"./openai.js\";\n\nconst OPENAI_COMPATIBLE = \"openai-compatible\";\n\nfunction createOpenAICompat(config: LLMConfig): ILLMClient {\n return createOpenAIClient(config);\n}\n\nconst PROVIDERS: Record<string, (config: LLMConfig) => ILLMClient> = {\n openai: createOpenAICompat,\n [OPENAI_COMPATIBLE]: createOpenAICompat,\n};\n\nexport function createClient(config: LLMConfig): ILLMClient {\n const p = (config.provider ?? \"\").toLowerCase();\n const fn = PROVIDERS[p];\n if (!fn) {\n const supported = [...new Set([...Object.keys(PROVIDERS), \"extension providers\"])].sort().join(\", \");\n throw new Error(\n `Unsupported LLM provider: ${config.provider}. Supported: ${supported}.`\n );\n }\n return fn(config);\n}\n\nexport function registerProvider(name: string, factory: (config: LLMConfig) => ILLMClient): void {\n PROVIDERS[name.toLowerCase()] = factory;\n}\n","/**\n * Create LLM registry from agent.yaml llm section.\n */\n\nimport { parseLlmSection } from \"./config.js\";\nimport { createClient } from \"./providers/index.js\";\nimport type { AgentConfigLlmSection, ILLMClient, ILLMRegistry } from \"./types.js\";\n\nexport interface CreateLLMRegistryOptions {\n /** Parsed llm section (e.g. from loadAgentConfig's config.llm) */\n llmSection: AgentConfigLlmSection | null | undefined;\n}\n\n/**\n * Create LLM registry from agent config llm section; supports multiple providers/models, each LLM has id and type.\n */\nexport function createLLMRegistry(options: CreateLLMRegistryOptions): ILLMRegistry {\n const { defaultId, configs } = parseLlmSection(options.llmSection);\n const map = new Map<string, ILLMClient>();\n\n for (const config of configs) {\n try {\n const client = createClient(config);\n map.set(config.id, client);\n } catch (err) {\n console.warn(`[agent-llm] Skip LLM \"${config.id}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n get(id: string): ILLMClient | undefined {\n return map.get(id);\n },\n defaultId(): string | undefined {\n if (map.has(defaultId)) return defaultId;\n return map.size > 0 ? [...map.keys()][0] : undefined;\n },\n ids(): string[] {\n return [...map.keys()];\n },\n };\n}\n","/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider; llmAdapter uses getChatModelFactory.\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\n/**\n * Register a ChatModel factory for a provider name.\n * Called by extensions (e.g. wallee-llm) on load.\n */\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\n/**\n * Get the ChatModel factory for a provider name, if registered.\n */\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Build LangChain ChatModel from agent.yaml llm section.\n * Supports single object, default + instances, and flat keyed configs.\n * When provider is registered by an extension, uses that extension's ChatModel;\n * otherwise uses ChatOpenAI.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"./config.js\";\nimport { getChatModelFactory } from \"./chatModelRegistry.js\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelFromLlmConfigOptions {\n /** agent.yaml llm section (raw or parsed); compatible with AgentConfigLlmSection / AgentConfigLlm */\n llmSection?: unknown;\n /** Override model from env */\n modelEnv?: string;\n /** Override API key from env */\n apiKeyEnv?: string;\n}\n\n/**\n * Create a LangChain ChatModel from agent config llm section.\n * Uses extension-registered ChatModel when available; otherwise ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelFromLlmConfigOptions\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n const { defaultId, configs } = parseLlmSection(llmSection ?? null);\n const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n if (!defaultConfig) {\n const model =\n modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n return new ChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n }\n\n const provider = (defaultConfig as { provider?: string }).provider ?? \"openai\";\n const chatModelFactory = getChatModelFactory(provider);\n if (chatModelFactory) {\n const config = {\n ...defaultConfig,\n model: modelEnv ?? defaultConfig.model,\n temperature:\n typeof defaultConfig.temperature === \"number\"\n ? defaultConfig.temperature\n : 0,\n };\n return chatModelFactory(config);\n }\n\n const model =\n modelEnv ??\n defaultConfig?.model ??\n process.env.OPENAI_MODEL ??\n DEFAULT_MODEL;\n\n let apiKey =\n apiKeyEnv ?? defaultConfig?.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = defaultConfig?.baseURL;\n // OpenAI client appends path (e.g. /chat/completions) to baseURL; Ollama and OpenAI-compatible APIs expect /v1/chat/completions.\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n // OpenAI client throws if apiKey is undefined; Ollama and many compatible endpoints accept a dummy.\n if (baseURL && apiKey === undefined) {\n apiKey = \"ollama\";\n }\n\n const temperature =\n typeof defaultConfig?.temperature === \"number\" ? defaultConfig.temperature : 0;\n\n const constructorOptions: ConstructorParameters<typeof ChatOpenAI>[0] = {\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(baseURL ? { configuration: { baseURL } } : {}),\n };\n\n return new ChatOpenAI(constructorOptions);\n}\n","/**\n * npm: protocol in provider — specify an npm package name (and optional version) in config's model provider.\n * Format: npm:<package-name> or npm:<package-name>@<version> or npm:<package-name>#<provider-name> or npm:<package-name>@<version>#<provider-name>\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { loadLLMExtensions } from \"./loadLLMExtensions.js\";\nimport { createChatModelFromLlmConfig } from \"./llmAdapter.js\";\nimport type { CreateChatModelFromLlmConfigOptions } from \"./llmAdapter.js\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\nexport const NPM_PROTOCOL_PREFIX = \"npm:\";\n\n/** Parse npm: spec into package name, optional version, and optional #provider fragment. */\nexport function parseNpmProviderSpec(spec: string): { packageName: string; version?: string; provider?: string } | null {\n if (!isNpmProviderSpec(spec)) 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 // Extract version: last @ not part of scoped package (e.g. pkg@0.1.0 or @scope/pkg@1.0.0)\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 to install (e.g. 0.1.0, latest). If set, runs npm install <package>@<version>. */\n version?: string;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Check if a provider spec uses the npm: protocol.\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 );\n}\n\n/**\n * Ensure an npm package is installed: if it cannot be resolved, run npm install <packageName>[@version] from cwd.\n * Call this before loading a provider package when the config uses npm:<package-name>[@version].\n */\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const version = options.version;\n try {\n await import(/* @vite-ignore */ packageName);\n return;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n const installSpec = version ? `${packageName}@${version}` : packageName;\n execSync(`npm install ${installSpec}`, {\n cwd,\n stdio: \"inherit\",\n encoding: \"utf-8\",\n });\n}\n\nexport interface ResolveNpmProviderOptions {\n /** If true (default), run npm install <package> when the package is not found. */\n installNpmIfMissing?: boolean;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Resolve an npm provider spec to the concrete provider name.\n * - npm:wallee-llm → load wallee-llm, use its default provider (e.g. cis)\n * - npm:wallee-llm@0.1.0 → load wallee-llm@0.1.0, use its default provider\n * - npm:wallee-llm#cis → load wallee-llm, use provider \"cis\"\n * - npm:wallee-llm@0.1.0#cis → load wallee-llm@0.1.0, use provider \"cis\"\n * When installNpmIfMissing is true, installs the package (with optional version) if not found.\n * Returns the provider name to use, or null if spec is not npm: protocol.\n */\nexport async function resolveNpmProvider(\n spec: string,\n options: ResolveNpmProviderOptions = {}\n): Promise<string | null> {\n const parsed = parseNpmProviderSpec(spec);\n if (!parsed) return null;\n const { packageName, version, provider: fragmentProvider } = parsed;\n\n const installNpmIfMissing = options.installNpmIfMissing !== false;\n const cwd = options.cwd ?? process.cwd();\n\n const load = async (): Promise<void> => {\n await loadLLMExtensions([packageName]);\n };\n\n try {\n await load();\n } catch (err) {\n if (installNpmIfMissing && isModuleNotFoundError(err)) {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n } else {\n throw err;\n }\n }\n\n if (fragmentProvider) return fragmentProvider;\n\n try {\n const m = await import(/* @vite-ignore */ packageName);\n if (\n typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\"\n ) {\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\n/**\n * Recursively resolve all provider values that use the npm: protocol in a clone of the llm section.\n * When installNpmIfMissing is true, installs any npm: package that is not found.\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 (const item of llmSection) {\n out.push(await resolveLlmSectionWithNpm(item, options));\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 const resolved = await resolveNpmProvider(v as string, options);\n out[k] = resolved ?? v;\n continue;\n }\n out[k] = await resolveLlmSectionWithNpm(v, options);\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelFromLlmConfigWithNpmOptions\n extends CreateChatModelFromLlmConfigOptions,\n ResolveNpmProviderOptions {}\n\n/**\n * Create a LangChain ChatModel from llm section, resolving any provider values that use the npm: protocol.\n * Use when config has provider: \"npm:wallee-llm\" or provider: \"npm:wallee-llm#cis\".\n * When installNpmIfMissing is true (default), the framework will run npm install <package> if the package is not found.\n */\nexport async function createChatModelFromLlmConfigWithNpm(\n options: CreateChatModelFromLlmConfigWithNpmOptions\n): Promise<BaseChatModel> {\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}\n","/**\n * Load optional LLM extensions by npm package name (e.g. wallee-llm).\n * Call before createChatModelFromLlmConfig when using extension providers.\n * Config llm.type = npm package name(s); we dynamic load those packages. No extensions field.\n */\n\nconst loadedPackages = new Set<string>();\n\nconst DEFAULT_EXTENSIONS = [\"wallee-llm\"];\n\n/**\n * Resolve llm.type to a list of npm package names to load.\n * type is the npm package name or array of package names; we load them directly (no mapping).\n */\nexport function resolveLLMExtensionPackages(types?: string | string[]): string[] {\n const typeList = types == null ? [] : Array.isArray(types) ? types : [types];\n const packages = typeList.filter(\n (t): t is string => typeof t === \"string\" && t.length > 0\n );\n return packages.length > 0 ? packages : DEFAULT_EXTENSIONS;\n}\n\n/**\n * Dynamically load LLM extensions by npm package name.\n * Each package must export registerLLMExtension() and will register its provider(s) and ChatModel factory.\n * Safe to call multiple times; each package is loaded at most once.\n * @param extensionPackages npm package names; default [\"wallee-llm\"] when omitted\n */\nexport async function loadLLMExtensions(\n extensionPackages?: string[]\n): Promise<void> {\n const packages = extensionPackages ?? DEFAULT_EXTENSIONS;\n for (const pkg of packages) {\n if (loadedPackages.has(pkg)) continue;\n loadedPackages.add(pkg);\n try {\n const m = await import(/* @vite-ignore */ pkg);\n if (\n typeof (m as { registerLLMExtension?: () => void })\n .registerLLMExtension === \"function\"\n ) {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n }\n } catch {\n // extension not installed or load failed\n }\n }\n}\n","/**\n * Return a LangChain-formatted LLM from config (llm.yaml or config/llm.yaml).\n * Use this LLM with LangChain's createAgent (e.g. createToolCallingAgent + AgentExecutor).\n */\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createChatModelFromLlmConfig } from \"./llmAdapter.js\";\nimport { createChatModelFromLlmConfigWithNpm } from \"./npmProviderProtocol.js\";\nimport { loadLlmConfig } from \"./loadLlmConfig.js\";\n\nexport interface CreateAgentLlMOptions {\n /** Path to YAML config file. If omitted, uses llm.yaml in cwd or config/llm.yaml in cwd/parent. */\n configPath?: string;\n}\n\nexport interface CreateAgentLlMAsyncOptions extends CreateAgentLlMOptions {\n /** If true (default), run npm install when provider is npm:<package> and package is not found. */\n installNpmIfMissing?: boolean;\n}\n\nfunction resolveDefaultConfigPath(): string {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"llm.yaml\"))) return join(cwd, \"llm.yaml\");\n if (existsSync(join(cwd, \"config\", \"llm.yaml\"))) return join(cwd, \"config\", \"llm.yaml\");\n const parentConfig = join(cwd, \"..\", \"config\", \"llm.yaml\");\n if (existsSync(parentConfig)) return parentConfig;\n return join(cwd, \"config\", \"llm.yaml\");\n}\n\n/**\n * Create a LangChain-formatted LLM from config.\n * Pass configPath to use a specific YAML file; otherwise uses llm.yaml (cwd) or config/llm.yaml (cwd/parent).\n */\nexport function createAgentLlM(options: CreateAgentLlMOptions = {}) {\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);\n }\n return createChatModelFromLlmConfig({ llmSection });\n}\n\n/**\n * Create a LangChain-formatted LLM from config, resolving npm: providers and installing packages if missing.\n * Use when your config has provider: \"npm:wallee-llm\" or similar.\n */\nexport async function createAgentLlMAsync(\n options: CreateAgentLlMAsyncOptions = {}\n): Promise<ReturnType<typeof createChatModelFromLlmConfig>> {\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);\n }\n return createChatModelFromLlmConfigWithNpm({\n llmSection,\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n}\n"],"mappings":";AAOA,IAAM,iBAAiB;AAEvB,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,SAAS,gBAAgB,SAA+D;AAC7F,MAAI,WAAW,QAAQ,OAAO,YAAY,UAAU;AAClD,WAAO,EAAE,WAAW,gBAAgB,SAAS,CAAC,EAAE;AAAA,EAClD;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,UAAM,UAAU,QACb,OAAO,CAAC,MAAoC,KAAK,QAAQ,OAAO,MAAM,QAAQ,EAC9E,IAAI,CAAC,MAAM,MAAM,mBAAmB,EAAE,GAAG,MAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE,CAAC,CAAC,EACvF,OAAO,CAAC,MAAsB,KAAK,IAAI;AAC1C,UAAM,YAAY,QAAQ,SAAS,IAAI,QAAQ,CAAC,EAAG,KAAK;AACxD,WAAO,EAAE,WAAW,QAAQ;AAAA,EAC9B;AAEA,QAAM,IAAI;AAEV,QAAM,cAAc,OAAO,QAAQ,CAAC,EAAE;AAAA,IACpC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,KAAK,KAAK,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,EAC7F;AACA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,UAAuB,CAAC;AAC9B,eAAW,CAAC,IAAI,KAAK,KAAK,aAAa;AACrC,YAAM,IAAI,iBAAiB,IAAI,KAAgC;AAC/D,UAAI,EAAG,SAAQ,KAAK,CAAC;AAAA,IACvB;AACA,UAAM,YACJ,OAAO,EAAE,YAAY,YAAY,EAAE,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,IACnF,EAAE,UACF,QAAQ,SAAS,IACf,QAAQ,CAAC,EAAG,KACZ;AACR,WAAO,EAAE,WAAW,QAAQ;AAAA,EAC9B;AAEA,MAAI,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC9B,UAAM,UAAW,EAAE,UAChB,OAAO,CAAC,MAAoC,KAAK,QAAQ,OAAO,MAAM,QAAQ,EAC9E,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAChC,OAAO,CAAC,MAAsB,KAAK,IAAI;AAC1C,UAAM,YACJ,OAAO,EAAE,YAAY,YAAY,EAAE,UAC/B,EAAE,UACF,QAAQ,SAAS,IACf,QAAQ,CAAC,EAAG,KACZ;AACR,WAAO,EAAE,WAAW,QAAQ;AAAA,EAC9B;AAEA,MAAI,OAAO,EAAE,aAAa,YAAY,OAAO,EAAE,UAAU,YAAY,OAAQ,EAAwB,SAAS,UAAU;AACtH,UAAM,MAAM,wBAAwB,CAAC;AACrC,WAAO,EAAE,WAAW,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE;AAAA,EAC7C;AAEA,SAAO,EAAE,WAAW,gBAAgB,SAAS,CAAC,EAAE;AAClD;AAEA,IAAM,wBAAwB,CAAC,cAAc,UAAU,aAAa,aAAa,cAAc,QAAQ,eAAe,aAAa,SAAS;AAE5I,SAAS,iBAAiB,IAAY,OAAkD;AACtF,QAAM,OAAO,MAAM;AACnB,QAAM,UACJ,OAAO,MAAM,aAAa,WACtB,MAAM,WACN,OAAO,MAAM,YAAY,WACvB,MAAM,UACN;AACR,QAAM,QAAQ,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC5G,QAAM,WAAW,OAAO,MAAM,aAAa,YAAY,MAAM,WAAW,MAAM,WAAW;AACzF,QAAM,SAAoB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,aAAa,OAAO,MAAM,gBAAgB,WAAW,KAAK,cAAc,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,IACpI,QAAQ,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,IAC3G;AAAA,EACF;AACA,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,QAAS,QAAO,OAAO;AAC5E,MAAI,QAAQ,OAAO,SAAS,SAAU,CAAC,OAAmC,UAAU;AACpF,aAAW,KAAK,uBAAuB;AACrC,QAAI,MAAM,CAAC,MAAM,OAAW,CAAC,OAAmC,CAAC,IAAI,MAAM,CAAC;AAAA,aACnE,QAAQ,KAAK,CAAC,MAAM,OAAW,CAAC,OAAmC,CAAC,IAAI,KAAK,CAAC;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,GAAuC;AACtE,QAAM,MAAiB;AAAA,IACrB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,IACxD,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAS,OAAQ,EAAwB,SAAS,WAAY,EAAuB,OAAO;AAAA,IACnI,aAAa,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc;AAAA,IACjE,QAAQ,OAAO,EAAE,WAAW,WAAW,EAAE,SAAS;AAAA,IAClD,SACE,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,EAC9F;AACA,SAAO,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM;AAC5B,QAAI,CAAC,CAAC,MAAM,QAAQ,YAAY,SAAS,QAAQ,eAAe,UAAU,WAAW,YAAY,WAAW,WAAW,EAAE,SAAS,CAAC,GAAG;AACpI,MAAC,IAAgC,CAAC,IAAI,EAAE,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,mBAAmB,GAA8C;AACxE,QAAM,KAAK,OAAO,EAAE,OAAO,YAAY,EAAE,KAAK,EAAE,KAAK;AACrD,QAAM,OAAO,EAAE,SAAS,UAAU,UAAU;AAC5C,QAAM,WAAW,OAAO,EAAE,aAAa,YAAY,EAAE,WAAW,EAAE,WAAW;AAC7E,QAAM,OAAO,EAAE;AACf,QAAM,SAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAS,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AAAA,IACtF,aACE,OAAO,EAAE,gBAAgB,WACrB,EAAE,cACF,OAAO,MAAM,gBAAgB,WAC3B,KAAK,cACL;AAAA,IACR,QACE,OAAO,EAAE,WAAW,WAChB,EAAE,SACF,OAAO,MAAM,WAAW,WACtB,KAAK,SACL;AAAA,IACR,SAAS,OAAO,EAAE,YAAY,WAAW,EAAE,UAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,EACtG;AACA,SAAO,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM;AAC5B,QAAI,CAAC,CAAC,MAAM,QAAQ,YAAY,SAAS,QAAQ,eAAe,UAAU,WAAW,UAAU,EAAE,SAAS,CAAC,GAAG;AAC5G,MAAC,OAAmC,CAAC,IAAI,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;AC5JA,SAAS,cAAc,kBAAkB;AACzC,SAAS,SAAS,iBAAiB;AAU5B,SAAS,cAAc,KAAuB;AACnD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,IAAI,MAAM,eAAe;AACnC,WAAO,IAAK,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,MAAO;AAAA,EAC1C;AACA,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,aAAa;AACpD,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAG,KAAI,CAAC,IAAI,cAAc,CAAC;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,aACd,SACA,UAAgC,CAAC,GACxB;AACT,QAAM,EAAE,eAAe,QAAQ,KAAK,IAAI;AACxC,QAAM,SAAS,UAAU,OAAO;AAChC,QAAM,MAAM,QAAQ;AACpB,MAAI,OAAO,KAAM,QAAO;AACxB,SAAO,QAAQ,cAAc,GAAG,IAAI;AACtC;AAOO,SAAS,cACd,UACA,UAAgC,CAAC,GACjB;AAChB,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,MAAM,aAAa,UAAU,MAAM;AACzC,UAAM,MAAM,aAAa,KAAK,OAAO;AACrC,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC1DA,OAAO,YAAY;AAYnB,SAAS,UAAU,QAA2B;AAC5C,QAAM,MAAM,OAAO,UAAU,QAAQ,IAAI,kBAAkB;AAC3D,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,qEAAqE;AAC/F,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAyD;AAC1F,QAAM,OAA6C,EAAE,QAAQ,UAAU,MAAM,EAAE;AAC/E,MAAI,OAAO,OAAO,YAAY,YAAY,OAAO,QAAS,MAAK,UAAU,OAAO;AAChF,SAAO;AACT;AAEA,SAAS,iBACP,GACoD;AACpD,MAAI,EAAE,SAAS;AACb,WAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,SAAS,cAAc,EAAE,aAAa;AAC1E,MAAI,EAAE,SAAS,eAAe,gBAAgB,KAAK,EAAE,YAAY,QAAQ;AACvE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,EAAE,WAAW;AAAA,MACtB,YAAY,EAAE,WAAW,IAAI,CAAC,QAAQ;AAAA,QACpC,IAAI,GAAG;AAAA,QACP,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,WAAW,GAAG,SAAS,UAAU;AAAA,MACvE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,MAAM,EAAE,MAAM,SAAU,EAAkB,QAAQ;AAC7D;AAEO,SAAS,uBAAuB,QAA+B;AACpE,QAAM,SAAS,IAAI,OAAO,0BAA0B,MAAM,CAAC;AAC3D,QAAM,QAAQ,OAAO,SAAS,QAAQ,IAAI,gBAAgB;AAC1D,QAAM,cAAc,OAAO,eAAe;AAE1C,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM,KAAK,UAA8C;AACvD,YAAM,OAAO,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,QAChD;AAAA,QACA;AAAA,QACA,UAAU,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,MACtE,CAAC;AACD,YAAM,UAAU,KAAK,QAAQ,CAAC,GAAG,SAAS,WAAW;AACrD,YAAM,QAAQ,KAAK,QACf,EAAE,cAAc,KAAK,MAAM,eAAe,kBAAkB,KAAK,MAAM,kBAAkB,IACzF;AACJ,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,MAAM,cACJ,UACA,OACA,UAC8B;AAC9B,YAAM,OAAO,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,QAChD;AAAA,QACA;AAAA,QACA,UAAU,SAAS,IAAI,gBAAgB;AAAA,QACvC,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,UACvB,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM,EAAE,SAAS;AAAA,YACjB,aAAa,EAAE,SAAS;AAAA,YACxB,YAAa,EAAE,SAAS,cAAc;AAAA,UACxC;AAAA,QACF,EAAE;AAAA,MACJ,CAAC;AACD,YAAM,MAAM,KAAK,QAAQ,CAAC,GAAG;AAC7B,YAAM,QAAQ,KAAK,QACf,EAAE,cAAc,KAAK,MAAM,eAAe,kBAAkB,KAAK,MAAM,kBAAkB,IACzF;AACJ,aAAO;AAAA,QACL,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,KAAK,WAAW;AAAA,UACzB,YAAY,KAAK,YAAY,IAAI,CAAC,QAAQ;AAAA,YACxC,IAAI,GAAG;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM,GAAG,UAAU,QAAQ;AAAA,cAC3B,WAAW,GAAG,UAAU,aAAa;AAAA,YACvC;AAAA,UACF,EAAE;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAA+B;AACrE,QAAM,SAAS,IAAI,OAAO,0BAA0B,MAAM,CAAC;AAC3D,QAAM,QAAS,OAAO,SAAoB;AAE1C,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM,OAA4B;AAChC,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACjF;AAAA,IACA,MAAM,cAAc,SAA8E;AAChG,YAAM,OAAO,MAAM,OAAO,OAAO,SAAS;AAAA,QACxC;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,MAAO,QAAQ,QAAoD;AAAA,QACnE,GAAG,QAAQ,KAAK;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,MAAM,KAAK,OAAO,CAAC,GAAG,OAAO;AACnC,aAAO,EAAE,IAAI;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,QAA+B;AAChE,MAAI,OAAO,SAAS,QAAS,QAAO,wBAAwB,MAAM;AAClE,SAAO,uBAAuB,MAAM;AACtC;;;ACjIA,IAAM,oBAAoB;AAE1B,SAAS,mBAAmB,QAA+B;AACzD,SAAO,mBAAmB,MAAM;AAClC;AAEA,IAAM,YAA+D;AAAA,EACnE,QAAQ;AAAA,EACR,CAAC,iBAAiB,GAAG;AACvB;AAEO,SAAS,aAAa,QAA+B;AAC1D,QAAM,KAAK,OAAO,YAAY,IAAI,YAAY;AAC9C,QAAM,KAAK,UAAU,CAAC;AACtB,MAAI,CAAC,IAAI;AACP,UAAM,YAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,GAAG,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI;AACnG,UAAM,IAAI;AAAA,MACR,6BAA6B,OAAO,QAAQ,gBAAgB,SAAS;AAAA,IACvE;AAAA,EACF;AACA,SAAO,GAAG,MAAM;AAClB;AAEO,SAAS,iBAAiB,MAAc,SAAkD;AAC/F,YAAU,KAAK,YAAY,CAAC,IAAI;AAClC;;;AChBO,SAAS,kBAAkB,SAAiD;AACjF,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,UAAU;AACjE,QAAM,MAAM,oBAAI,IAAwB;AAExC,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,SAAS,aAAa,MAAM;AAClC,UAAI,IAAI,OAAO,IAAI,MAAM;AAAA,IAC3B,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB,OAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACzG;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,IAAoC;AACtC,aAAO,IAAI,IAAI,EAAE;AAAA,IACnB;AAAA,IACA,YAAgC;AAC9B,UAAI,IAAI,IAAI,SAAS,EAAG,QAAO;AAC/B,aAAO,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI;AAAA,IAC7C;AAAA,IACA,MAAgB;AACd,aAAO,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,IACvB;AAAA,EACF;AACF;;;AC/BA,IAAM,uBAAuB,oBAAI,IAA8B;AAMxD,SAAS,0BAA0B,cAAsB,SAAiC;AAC/F,uBAAqB,IAAI,aAAa,YAAY,GAAG,OAAO;AAC9D;AAKO,SAAS,oBAAoB,cAAoD;AACtF,SAAO,qBAAqB,IAAI,aAAa,YAAY,CAAC;AAC5D;;;AClBA,SAAS,kBAAkB;AAK3B,IAAM,gBAAgB;AAef,SAAS,6BACd,SACe;AACf,QAAM,EAAE,YAAY,UAAU,UAAU,IAAI;AAC5C,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,cAAc,IAAI;AACjE,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC;AAE1E,MAAI,CAAC,eAAe;AAClB,UAAMA,SACJ,YAAY,QAAQ,IAAI,gBAAgB;AAC1C,UAAMC,UAAS,aAAa,QAAQ,IAAI;AACxC,WAAO,IAAI,WAAW;AAAA,MACpB,OAAAD;AAAA,MACA,aAAa;AAAA,MACb,GAAIC,UAAS,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAY,cAAwC,YAAY;AACtE,QAAM,mBAAmB,oBAAoB,QAAQ;AACrD,MAAI,kBAAkB;AACpB,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,OAAO,YAAY,cAAc;AAAA,MACjC,aACE,OAAO,cAAc,gBAAgB,WACjC,cAAc,cACd;AAAA,IACR;AACA,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,QAAM,QACJ,YACA,eAAe,SACf,QAAQ,IAAI,gBACZ;AAEF,MAAI,SACF,aAAa,eAAe,UAAU,QAAQ,IAAI;AACpD,MAAI,UAAU,eAAe;AAE7B,MAAI,WAAW,CAAC,QAAQ,QAAQ,OAAO,EAAE,EAAE,SAAS,KAAK,GAAG;AAC1D,cAAU,QAAQ,QAAQ,OAAO,EAAE,IAAI;AAAA,EACzC;AAEA,MAAI,WAAW,WAAW,QAAW;AACnC,aAAS;AAAA,EACX;AAEA,QAAM,cACJ,OAAO,eAAe,gBAAgB,WAAW,cAAc,cAAc;AAE/E,QAAM,qBAAkE;AAAA,IACtE;AAAA,IACA;AAAA,IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,GAAI,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EAClD;AAEA,SAAO,IAAI,WAAW,kBAAkB;AAC1C;;;AClFA,SAAS,gBAAgB;;;ACAzB,IAAM,iBAAiB,oBAAI,IAAY;AAEvC,IAAM,qBAAqB,CAAC,YAAY;AAMjC,SAAS,4BAA4B,OAAqC;AAC/E,QAAM,WAAW,SAAS,OAAO,CAAC,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC3E,QAAM,WAAW,SAAS;AAAA,IACxB,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS;AAAA,EAC1D;AACA,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAQA,eAAsB,kBACpB,mBACe;AACf,QAAM,WAAW,qBAAqB;AACtC,aAAW,OAAO,UAAU;AAC1B,QAAI,eAAe,IAAI,GAAG,EAAG;AAC7B,mBAAe,IAAI,GAAG;AACtB,QAAI;AACF,YAAM,IAAI,MAAM;AAAA;AAAA,QAA0B;AAAA;AAC1C,UACE,OAAQ,EACL,yBAAyB,YAC5B;AACA,QAAC,EAA2C,qBAAqB;AAAA,MACnE;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ADnCO,IAAM,sBAAsB;AAG5B,SAAS,qBAAqB,MAAmF;AACtH,MAAI,CAAC,kBAAkB,IAAI,EAAG,QAAO;AACrC,QAAM,OAAO,KAAK,MAAM,oBAAoB,MAAM;AAClD,QAAM,UAAU,KAAK,QAAQ,GAAG;AAChC,QAAM,aAAa,WAAW,IAAI,KAAK,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,KAAK;AAC5E,QAAM,mBAAmB,WAAW,IAAI,KAAK,MAAM,UAAU,CAAC,EAAE,KAAK,IAAI;AAEzE,QAAM,eAAe,WAAW,MAAM,WAAW;AACjD,QAAM,cAAc,eAAe,WAAW,MAAM,GAAG,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI;AACzF,QAAM,UAAU,eAAe,aAAa,CAAC,IAAI;AACjD,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,EAAE,aAAa,SAAS,UAAU,oBAAoB,OAAU;AACzE;AAYO,SAAS,kBAAkB,MAA+B;AAC/D,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,mBAAmB;AACxE;AAEA,SAAS,sBAAsB,KAAuB;AACpD,QAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,SACE,IAAI,SAAS,oBAAoB,KACjC,IAAI,SAAS,qBAAqB,KAClC,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,sBAAsB;AAEvC;AAMA,eAAsB,0BACpB,aACA,UAA4C,CAAC,GAC9B;AACf,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,UAAU,QAAQ;AACxB,MAAI;AACF,UAAM;AAAA;AAAA,MAA0B;AAAA;AAChC;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,CAAC,sBAAsB,GAAG,EAAG,OAAM;AAAA,EACzC;AACA,QAAM,cAAc,UAAU,GAAG,WAAW,IAAI,OAAO,KAAK;AAC5D,WAAS,eAAe,WAAW,IAAI;AAAA,IACrC;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACH;AAkBA,eAAsB,mBACpB,MACA,UAAqC,CAAC,GACd;AACxB,QAAM,SAAS,qBAAqB,IAAI;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,EAAE,aAAa,SAAS,UAAU,iBAAiB,IAAI;AAE7D,QAAM,sBAAsB,QAAQ,wBAAwB;AAC5D,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAEvC,QAAM,OAAO,YAA2B;AACtC,UAAM,kBAAkB,CAAC,WAAW,CAAC;AAAA,EACvC;AAEA,MAAI;AACF,UAAM,KAAK;AAAA,EACb,SAAS,KAAK;AACZ,QAAI,uBAAuB,sBAAsB,GAAG,GAAG;AACrD,YAAM,0BAA0B,aAAa,EAAE,SAAS,IAAI,CAAC;AAC7D,YAAM,KAAK;AAAA,IACb,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,iBAAkB,QAAO;AAE7B,MAAI;AACF,UAAM,IAAI,MAAM;AAAA;AAAA,MAA0B;AAAA;AAC1C,QACE,OAAQ,EAAgD,2BAA2B,YACnF;AACA,aAAQ,EAA+C,uBAAuB;AAAA,IAChF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,QAAM,IAAI;AAAA,IACR,iBAAiB,IAAI,qGAAqG,WAAW;AAAA,EACvI;AACF;AAQA,eAAsB,yBACpB,YACA,UAA2C,CAAC,GAC1B;AAClB,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,MAAiB,CAAC;AACxB,eAAW,QAAQ,YAAY;AAC7B,UAAI,KAAK,MAAM,yBAAyB,MAAM,OAAO,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,UAAI,MAAM,cAAc,kBAAkB,CAAC,GAAG;AAC5C,cAAM,WAAW,MAAM,mBAAmB,GAAa,OAAO;AAC9D,YAAI,CAAC,IAAI,YAAY;AACrB;AAAA,MACF;AACA,UAAI,CAAC,IAAI,MAAM,yBAAyB,GAAG,OAAO;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAWA,eAAsB,oCACpB,SACwB;AACxB,QAAM,EAAE,qBAAqB,KAAK,GAAG,KAAK,IAAI;AAC9C,QAAM,kBAAkB,MAAM,yBAAyB,QAAQ,cAAc,MAAM;AAAA,IACjF;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,6BAA6B;AAAA,IAClC,GAAG;AAAA,IACH,YAAY;AAAA,EACd,CAAC;AACH;;;AE1LA,SAAS,YAAY;AACrB,SAAS,cAAAC,mBAAkB;AAe3B,SAAS,2BAAmC;AAC1C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAIC,YAAW,KAAK,KAAK,UAAU,CAAC,EAAG,QAAO,KAAK,KAAK,UAAU;AAClE,MAAIA,YAAW,KAAK,KAAK,UAAU,UAAU,CAAC,EAAG,QAAO,KAAK,KAAK,UAAU,UAAU;AACtF,QAAM,eAAe,KAAK,KAAK,MAAM,UAAU,UAAU;AACzD,MAAIA,YAAW,YAAY,EAAG,QAAO;AACrC,SAAO,KAAK,KAAK,UAAU,UAAU;AACvC;AAMO,SAAS,eAAe,UAAiC,CAAC,GAAG;AAClE,QAAM,aAAa,QAAQ,cAAc,yBAAyB;AAClE,QAAM,aAAa,cAAc,UAAU;AAC3C,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,oBAAoB,UAAU,wDAAwD;AAAA,EACxG;AACA,SAAO,6BAA6B,EAAE,WAAW,CAAC;AACpD;AAMA,eAAsB,oBACpB,UAAsC,CAAC,GACmB;AAC1D,QAAM,aAAa,QAAQ,cAAc,yBAAyB;AAClE,QAAM,aAAa,cAAc,UAAU;AAC3C,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,oBAAoB,UAAU,wDAAwD;AAAA,EACxG;AACA,SAAO,oCAAoC;AAAA,IACzC;AAAA,IACA,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AACH;","names":["model","apiKey","existsSync","existsSync"]}
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createChatModelFromLlmConfig,
4
4
  loadLlmConfig
5
- } from "./chunk-3Z3KXKNU.js";
5
+ } from "./chunk-UZOGGJK7.js";
6
6
 
7
7
  // src/cli.ts
8
8
  import { join } from "path";
@@ -1,10 +1,20 @@
1
+ import { createChatModelFromLlmConfig } from "./llmAdapter.js";
1
2
  export interface CreateAgentLlMOptions {
2
3
  /** Path to YAML config file. If omitted, uses llm.yaml in cwd or config/llm.yaml in cwd/parent. */
3
4
  configPath?: string;
4
5
  }
6
+ export interface CreateAgentLlMAsyncOptions extends CreateAgentLlMOptions {
7
+ /** If true (default), run npm install when provider is npm:<package> and package is not found. */
8
+ installNpmIfMissing?: boolean;
9
+ }
5
10
  /**
6
11
  * Create a LangChain-formatted LLM from config.
7
12
  * Pass configPath to use a specific YAML file; otherwise uses llm.yaml (cwd) or config/llm.yaml (cwd/parent).
8
13
  */
9
14
  export declare function createAgentLlM(options?: CreateAgentLlMOptions): import("@langchain/core/language_models/chat_models").BaseChatModel<import("@langchain/core/language_models/chat_models").BaseChatModelCallOptions, import("@langchain/core/messages").AIMessageChunk>;
15
+ /**
16
+ * Create a LangChain-formatted LLM from config, resolving npm: providers and installing packages if missing.
17
+ * Use when your config has provider: "npm:wallee-llm" or similar.
18
+ */
19
+ export declare function createAgentLlMAsync(options?: CreateAgentLlMAsyncOptions): Promise<ReturnType<typeof createChatModelFromLlmConfig>>;
10
20
  //# sourceMappingURL=createAgentLlM.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAgentLlM.d.ts","sourceRoot":"","sources":["../src/createAgentLlM.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACpC,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,0MAOjE"}
1
+ {"version":3,"file":"createAgentLlM.d.ts","sourceRoot":"","sources":["../src/createAgentLlM.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAI/D,MAAM,WAAW,qBAAqB;IACpC,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,kGAAkG;IAClG,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,0MAOjE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAW1D"}
package/dist/index.d.ts CHANGED
@@ -13,8 +13,10 @@ export { registerChatModelProvider, getChatModelFactory } from "./chatModelRegis
13
13
  export { createOpenAIClient, createOpenAIChatClient, createOpenAIImageClient } from "./providers/openai.js";
14
14
  export { createChatModelFromLlmConfig } from "./llmAdapter.js";
15
15
  export type { CreateChatModelFromLlmConfigOptions } from "./llmAdapter.js";
16
- export { createAgentLlM } from "./createAgentLlM.js";
17
- export type { CreateAgentLlMOptions } from "./createAgentLlM.js";
16
+ export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./npmProviderProtocol.js";
17
+ export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelFromLlmConfigWithNpmOptions, } from "./npmProviderProtocol.js";
18
+ export { createAgentLlM, createAgentLlMAsync } from "./createAgentLlM.js";
19
+ export type { CreateAgentLlMOptions, CreateAgentLlMAsyncOptions } from "./createAgentLlM.js";
18
20
  export { loadLLMExtensions, resolveLLMExtensionPackages } from "./loadLLMExtensions.js";
19
21
  export type { LLMType, LLMConfig, AgentConfigLlmSection, ChatMessage, ChatResult, ImageResult, ToolDefinition, ChatWithToolsMessage, ChatWithToolsResult, ILLMClient, ILLMRegistry, } from "./types.js";
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAExF,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,0CAA0C,GAC3C,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAExF,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,37 +1,53 @@
1
1
  import {
2
+ NPM_PROTOCOL_PREFIX,
2
3
  createAgentLlM,
4
+ createAgentLlMAsync,
3
5
  createChatModelFromLlmConfig,
6
+ createChatModelFromLlmConfigWithNpm,
4
7
  createClient,
5
8
  createLLMRegistry,
6
9
  createOpenAIChatClient,
7
10
  createOpenAIClient,
8
11
  createOpenAIImageClient,
12
+ ensureNpmPackageInstalled,
9
13
  getChatModelFactory,
14
+ isNpmProviderSpec,
10
15
  loadLLMExtensions,
11
16
  loadLlmConfig,
12
17
  parseLlmSection,
13
18
  parseLlmYaml,
19
+ parseNpmProviderSpec,
14
20
  registerChatModelProvider,
15
21
  registerProvider,
16
22
  resolveLLMExtensionPackages,
23
+ resolveLlmSectionWithNpm,
24
+ resolveNpmProvider,
17
25
  substituteEnv
18
- } from "./chunk-3Z3KXKNU.js";
26
+ } from "./chunk-UZOGGJK7.js";
19
27
  export {
28
+ NPM_PROTOCOL_PREFIX,
20
29
  createAgentLlM,
30
+ createAgentLlMAsync,
21
31
  createChatModelFromLlmConfig,
32
+ createChatModelFromLlmConfigWithNpm,
22
33
  createClient,
23
34
  createLLMRegistry,
24
35
  createOpenAIChatClient,
25
36
  createOpenAIClient,
26
37
  createOpenAIImageClient,
38
+ ensureNpmPackageInstalled,
27
39
  getChatModelFactory,
40
+ isNpmProviderSpec,
28
41
  loadLLMExtensions,
29
42
  loadLlmConfig,
30
43
  parseLlmSection,
31
44
  parseLlmYaml,
45
+ parseNpmProviderSpec,
32
46
  registerChatModelProvider,
33
47
  registerProvider,
34
48
  resolveLLMExtensionPackages,
49
+ resolveLlmSectionWithNpm,
50
+ resolveNpmProvider,
35
51
  substituteEnv
36
52
  };
37
53
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,61 @@
1
+ /**
2
+ * npm: protocol in provider — specify an npm package name (and optional version) in config's model provider.
3
+ * Format: npm:<package-name> or npm:<package-name>@<version> or npm:<package-name>#<provider-name> or npm:<package-name>@<version>#<provider-name>
4
+ * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.
5
+ */
6
+ import type { CreateChatModelFromLlmConfigOptions } from "./llmAdapter.js";
7
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
8
+ export declare const NPM_PROTOCOL_PREFIX = "npm:";
9
+ /** Parse npm: spec into package name, optional version, and optional #provider fragment. */
10
+ export declare function parseNpmProviderSpec(spec: string): {
11
+ packageName: string;
12
+ version?: string;
13
+ provider?: string;
14
+ } | null;
15
+ export interface EnsureNpmPackageInstalledOptions {
16
+ /** Version to install (e.g. 0.1.0, latest). If set, runs npm install <package>@<version>. */
17
+ version?: string;
18
+ /** Working directory for npm install. Default: process.cwd() */
19
+ cwd?: string;
20
+ }
21
+ /**
22
+ * Check if a provider spec uses the npm: protocol.
23
+ */
24
+ export declare function isNpmProviderSpec(spec: unknown): spec is string;
25
+ /**
26
+ * Ensure an npm package is installed: if it cannot be resolved, run npm install <packageName>[@version] from cwd.
27
+ * Call this before loading a provider package when the config uses npm:<package-name>[@version].
28
+ */
29
+ export declare function ensureNpmPackageInstalled(packageName: string, options?: EnsureNpmPackageInstalledOptions): Promise<void>;
30
+ export interface ResolveNpmProviderOptions {
31
+ /** If true (default), run npm install <package> when the package is not found. */
32
+ installNpmIfMissing?: boolean;
33
+ /** Working directory for npm install. Default: process.cwd() */
34
+ cwd?: string;
35
+ }
36
+ /**
37
+ * Resolve an npm provider spec to the concrete provider name.
38
+ * - npm:wallee-llm → load wallee-llm, use its default provider (e.g. cis)
39
+ * - npm:wallee-llm@0.1.0 → load wallee-llm@0.1.0, use its default provider
40
+ * - npm:wallee-llm#cis → load wallee-llm, use provider "cis"
41
+ * - npm:wallee-llm@0.1.0#cis → load wallee-llm@0.1.0, use provider "cis"
42
+ * When installNpmIfMissing is true, installs the package (with optional version) if not found.
43
+ * Returns the provider name to use, or null if spec is not npm: protocol.
44
+ */
45
+ export declare function resolveNpmProvider(spec: string, options?: ResolveNpmProviderOptions): Promise<string | null>;
46
+ export interface ResolveLlmSectionWithNpmOptions extends ResolveNpmProviderOptions {
47
+ }
48
+ /**
49
+ * Recursively resolve all provider values that use the npm: protocol in a clone of the llm section.
50
+ * When installNpmIfMissing is true, installs any npm: package that is not found.
51
+ */
52
+ export declare function resolveLlmSectionWithNpm(llmSection: unknown, options?: ResolveLlmSectionWithNpmOptions): Promise<unknown>;
53
+ export interface CreateChatModelFromLlmConfigWithNpmOptions extends CreateChatModelFromLlmConfigOptions, ResolveNpmProviderOptions {
54
+ }
55
+ /**
56
+ * Create a LangChain ChatModel from llm section, resolving any provider values that use the npm: protocol.
57
+ * Use when config has provider: "npm:wallee-llm" or provider: "npm:wallee-llm#cis".
58
+ * When installNpmIfMissing is true (default), the framework will run npm install <package> if the package is not found.
59
+ */
60
+ export declare function createChatModelFromLlmConfigWithNpm(options: CreateChatModelFromLlmConfigWithNpmOptions): Promise<BaseChatModel>;
61
+ //# sourceMappingURL=npmProviderProtocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npmProviderProtocol.d.ts","sourceRoot":"","sources":["../src/npmProviderProtocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAEjF,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYtH;AAED,MAAM,WAAW,gCAAgC;IAC/C,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAE/D;AAYD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAef;AAED,MAAM,WAAW,yBAAyB;IACxC,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;CAAG;AAErF;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,MAAM,WAAW,0CACf,SAAQ,mCAAmC,EACzC,yBAAyB;CAAG;AAEhC;;;;GAIG;AACH,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,0CAA0C,GAClD,OAAO,CAAC,aAAa,CAAC,CAUxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-llm",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Agent LLM: multi-provider, multi-model, simple chat/image API. Consumes agent.yaml llm section.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts","../src/loadLlmConfig.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/factory.ts","../src/chatModelRegistry.ts","../src/llmAdapter.ts","../src/createAgentLlM.ts","../src/loadLLMExtensions.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\n/**\n * Parse llm section: flat (each model keyed by name), default+instances, or single object.\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. config/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 /** Replace ${VAR} with process.env.VAR. Default true. */\n substituteEnv?: boolean;\n}\n\n/**\n * Recursively replace ${VAR} in strings with process.env.VAR.\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\n/**\n * Parse YAML string and return the llm section (top-level key \"llm\").\n * Returns undefined if content has no llm key.\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\n/**\n * Load LLM config from a YAML file (e.g. config/llm.yaml).\n * Returns the llm section for use with createChatModelFromLlmConfig or parseLlmSection.\n * Returns null if file does not exist or has no llm key.\n */\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n if (!existsSync(filePath)) return null;\n try {\n const raw = readFileSync(filePath, \"utf8\");\n const llm = parseLlmYaml(raw, options);\n return llm ?? null;\n } catch {\n return null;\n }\n}\n","/**\n * OpenAI-compatible format: chat (/v1/chat/completions) and image.\n * Supports baseURL for Azure, local proxy, and other compatible endpoints.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n LLMConfig,\n ChatMessage,\n ChatResult,\n ImageResult,\n ILLMClient,\n ChatWithToolsMessage,\n ChatWithToolsResult,\n ToolDefinition,\n} from \"../types.js\";\n\nfunction getApiKey(config: LLMConfig): string {\n const key = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n if (!key) throw new Error(\"OpenAI-compatible apiKey required (config.apiKey or OPENAI_API_KEY)\");\n return key;\n}\n\nfunction createOpenAIClientOptions(config: LLMConfig): { apiKey: string; baseURL?: string } {\n const opts: { apiKey: string; baseURL?: string } = { apiKey: getApiKey(config) };\n if (typeof config.baseURL === \"string\" && config.baseURL) opts.baseURL = config.baseURL;\n return opts;\n}\n\nfunction serializeMessage(\n m: ChatWithToolsMessage\n): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (m.role === \"tool\")\n return { role: \"tool\", content: m.content, tool_call_id: m.tool_call_id };\n if (m.role === \"assistant\" && \"tool_calls\" in m && m.tool_calls?.length) {\n return {\n role: \"assistant\",\n content: m.content ?? null,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n };\n }\n return { role: m.role, content: (m as ChatMessage).content };\n}\n\nexport function createOpenAIChatClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = config.model ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n const temperature = config.temperature ?? 0;\n\n return {\n id: config.id,\n type: \"chat\",\n async chat(messages: ChatMessage[]): Promise<ChatResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n });\n const content = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return { content, usage };\n },\n async chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n });\n const msg = resp.choices[0]?.message;\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return {\n message: {\n role: \"assistant\",\n content: msg?.content ?? null,\n tool_calls: msg?.tool_calls?.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n },\n })),\n },\n usage,\n };\n },\n };\n}\n\nexport function createOpenAIImageClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = (config.model as string) ?? \"dall-e-3\";\n\n return {\n id: config.id,\n type: \"image\",\n async chat(): Promise<ChatResult> {\n throw new Error(\"OpenAI image model does not support chat; use generateImage()\");\n },\n async generateImage(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult> {\n const resp = await client.images.generate({\n model,\n prompt: options.prompt,\n size: (options.size as \"1024x1024\" | \"1792x1024\" | \"1024x1792\") ?? \"1024x1024\",\n n: options.n ?? 1,\n response_format: \"url\",\n });\n const url = resp.data?.[0]?.url ?? undefined;\n return { url };\n },\n };\n}\n\nexport function createOpenAIClient(config: LLMConfig): ILLMClient {\n if (config.type === \"image\") return createOpenAIImageClient(config);\n return createOpenAIChatClient(config);\n}\n","/**\n * Supports OpenAI-compatible and extension providers.\n */\n\nimport type { LLMConfig, ILLMClient } from \"../types.js\";\nimport { createOpenAIClient } from \"./openai.js\";\n\nconst OPENAI_COMPATIBLE = \"openai-compatible\";\n\nfunction createOpenAICompat(config: LLMConfig): ILLMClient {\n return createOpenAIClient(config);\n}\n\nconst PROVIDERS: Record<string, (config: LLMConfig) => ILLMClient> = {\n openai: createOpenAICompat,\n [OPENAI_COMPATIBLE]: createOpenAICompat,\n};\n\nexport function createClient(config: LLMConfig): ILLMClient {\n const p = (config.provider ?? \"\").toLowerCase();\n const fn = PROVIDERS[p];\n if (!fn) {\n const supported = [...new Set([...Object.keys(PROVIDERS), \"extension providers\"])].sort().join(\", \");\n throw new Error(\n `Unsupported LLM provider: ${config.provider}. Supported: ${supported}.`\n );\n }\n return fn(config);\n}\n\nexport function registerProvider(name: string, factory: (config: LLMConfig) => ILLMClient): void {\n PROVIDERS[name.toLowerCase()] = factory;\n}\n","/**\n * Create LLM registry from agent.yaml llm section.\n */\n\nimport { parseLlmSection } from \"./config.js\";\nimport { createClient } from \"./providers/index.js\";\nimport type { AgentConfigLlmSection, ILLMClient, ILLMRegistry } from \"./types.js\";\n\nexport interface CreateLLMRegistryOptions {\n /** Parsed llm section (e.g. from loadAgentConfig's config.llm) */\n llmSection: AgentConfigLlmSection | null | undefined;\n}\n\n/**\n * Create LLM registry from agent config llm section; supports multiple providers/models, each LLM has id and type.\n */\nexport function createLLMRegistry(options: CreateLLMRegistryOptions): ILLMRegistry {\n const { defaultId, configs } = parseLlmSection(options.llmSection);\n const map = new Map<string, ILLMClient>();\n\n for (const config of configs) {\n try {\n const client = createClient(config);\n map.set(config.id, client);\n } catch (err) {\n console.warn(`[agent-llm] Skip LLM \"${config.id}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n get(id: string): ILLMClient | undefined {\n return map.get(id);\n },\n defaultId(): string | undefined {\n if (map.has(defaultId)) return defaultId;\n return map.size > 0 ? [...map.keys()][0] : undefined;\n },\n ids(): string[] {\n return [...map.keys()];\n },\n };\n}\n","/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider; llmAdapter uses getChatModelFactory.\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\n/**\n * Register a ChatModel factory for a provider name.\n * Called by extensions (e.g. wallee-llm) on load.\n */\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\n/**\n * Get the ChatModel factory for a provider name, if registered.\n */\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Build LangChain ChatModel from agent.yaml llm section.\n * Supports single object, default + instances, and flat keyed configs.\n * When provider is registered by an extension, uses that extension's ChatModel;\n * otherwise uses ChatOpenAI.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"./config.js\";\nimport { getChatModelFactory } from \"./chatModelRegistry.js\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelFromLlmConfigOptions {\n /** agent.yaml llm section (raw or parsed); compatible with AgentConfigLlmSection / AgentConfigLlm */\n llmSection?: unknown;\n /** Override model from env */\n modelEnv?: string;\n /** Override API key from env */\n apiKeyEnv?: string;\n}\n\n/**\n * Create a LangChain ChatModel from agent config llm section.\n * Uses extension-registered ChatModel when available; otherwise ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelFromLlmConfigOptions\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n const { defaultId, configs } = parseLlmSection(llmSection ?? null);\n const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n if (!defaultConfig) {\n const model =\n modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n return new ChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n }\n\n const provider = (defaultConfig as { provider?: string }).provider ?? \"openai\";\n const chatModelFactory = getChatModelFactory(provider);\n if (chatModelFactory) {\n const config = {\n ...defaultConfig,\n model: modelEnv ?? defaultConfig.model,\n temperature:\n typeof defaultConfig.temperature === \"number\"\n ? defaultConfig.temperature\n : 0,\n };\n return chatModelFactory(config);\n }\n\n const model =\n modelEnv ??\n defaultConfig?.model ??\n process.env.OPENAI_MODEL ??\n DEFAULT_MODEL;\n\n let apiKey =\n apiKeyEnv ?? defaultConfig?.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = defaultConfig?.baseURL;\n // OpenAI client appends path (e.g. /chat/completions) to baseURL; Ollama and OpenAI-compatible APIs expect /v1/chat/completions.\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n // OpenAI client throws if apiKey is undefined; Ollama and many compatible endpoints accept a dummy.\n if (baseURL && apiKey === undefined) {\n apiKey = \"ollama\";\n }\n\n const temperature =\n typeof defaultConfig?.temperature === \"number\" ? defaultConfig.temperature : 0;\n\n const constructorOptions: ConstructorParameters<typeof ChatOpenAI>[0] = {\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(baseURL ? { configuration: { baseURL } } : {}),\n };\n\n return new ChatOpenAI(constructorOptions);\n}\n","/**\n * Return a LangChain-formatted LLM from config (llm.yaml or config/llm.yaml).\n * Use this LLM with LangChain's createAgent (e.g. createToolCallingAgent + AgentExecutor).\n */\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createChatModelFromLlmConfig } from \"./llmAdapter.js\";\nimport { loadLlmConfig } from \"./loadLlmConfig.js\";\n\nexport interface CreateAgentLlMOptions {\n /** Path to YAML config file. If omitted, uses llm.yaml in cwd or config/llm.yaml in cwd/parent. */\n configPath?: string;\n}\n\nfunction resolveDefaultConfigPath(): string {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"llm.yaml\"))) return join(cwd, \"llm.yaml\");\n if (existsSync(join(cwd, \"config\", \"llm.yaml\"))) return join(cwd, \"config\", \"llm.yaml\");\n const parentConfig = join(cwd, \"..\", \"config\", \"llm.yaml\");\n if (existsSync(parentConfig)) return parentConfig;\n return join(cwd, \"config\", \"llm.yaml\");\n}\n\n/**\n * Create a LangChain-formatted LLM from config.\n * Pass configPath to use a specific YAML file; otherwise uses llm.yaml (cwd) or config/llm.yaml (cwd/parent).\n */\nexport function createAgentLlM(options: CreateAgentLlMOptions = {}) {\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml or config/llm.yaml, or pass configPath.`);\n }\n return createChatModelFromLlmConfig({ llmSection });\n}\n","/**\n * Load optional LLM extensions by npm package name (e.g. wallee-llm).\n * Call before createChatModelFromLlmConfig when using extension providers.\n * Config llm.type = npm package name(s); we dynamic load those packages. No extensions field.\n */\n\nconst loadedPackages = new Set<string>();\n\nconst DEFAULT_EXTENSIONS = [\"wallee-llm\"];\n\n/**\n * Resolve llm.type to a list of npm package names to load.\n * type is the npm package name or array of package names; we load them directly (no mapping).\n */\nexport function resolveLLMExtensionPackages(types?: string | string[]): string[] {\n const typeList = types == null ? [] : Array.isArray(types) ? types : [types];\n const packages = typeList.filter(\n (t): t is string => typeof t === \"string\" && t.length > 0\n );\n return packages.length > 0 ? packages : DEFAULT_EXTENSIONS;\n}\n\n/**\n * Dynamically load LLM extensions by npm package name.\n * Each package must export registerLLMExtension() and will register its provider(s) and ChatModel factory.\n * Safe to call multiple times; each package is loaded at most once.\n * @param extensionPackages npm package names; default [\"wallee-llm\"] when omitted\n */\nexport async function loadLLMExtensions(\n extensionPackages?: string[]\n): Promise<void> {\n const packages = extensionPackages ?? DEFAULT_EXTENSIONS;\n for (const pkg of packages) {\n if (loadedPackages.has(pkg)) continue;\n loadedPackages.add(pkg);\n try {\n const m = await import(/* @vite-ignore */ pkg);\n if (\n typeof (m as { registerLLMExtension?: () => void })\n .registerLLMExtension === \"function\"\n ) {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n }\n } catch {\n // extension not installed or load failed\n }\n }\n}\n"],"mappings":"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","names":["model","apiKey","existsSync","existsSync"]}