@easynet/agent-model 1.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +72 -0
  2. package/dist/api/create-agent-llm.d.ts +15 -0
  3. package/dist/api/create-agent-llm.d.ts.map +1 -0
  4. package/dist/api/create-embed-fn.d.ts +10 -0
  5. package/dist/api/create-embed-fn.d.ts.map +1 -0
  6. package/dist/api/get-default-llm-config.d.ts +16 -0
  7. package/dist/api/get-default-llm-config.d.ts.map +1 -0
  8. package/dist/api/get-default-vlm-config.d.ts +15 -0
  9. package/dist/api/get-default-vlm-config.d.ts.map +1 -0
  10. package/dist/chunk-4OLU43SH.js +165 -0
  11. package/dist/chunk-4OLU43SH.js.map +1 -0
  12. package/dist/chunk-5YPJ43HW.js +205 -0
  13. package/dist/chunk-5YPJ43HW.js.map +1 -0
  14. package/dist/chunk-EPVJLBGC.js +118 -0
  15. package/dist/chunk-EPVJLBGC.js.map +1 -0
  16. package/dist/chunk-FZKECZUY.js +148 -0
  17. package/dist/chunk-FZKECZUY.js.map +1 -0
  18. package/dist/chunk-G7MKWPEI.js +14 -0
  19. package/dist/chunk-G7MKWPEI.js.map +1 -0
  20. package/dist/chunk-HCU4AWIV.js +19 -0
  21. package/dist/chunk-HCU4AWIV.js.map +1 -0
  22. package/dist/chunk-HSU6XZOI.js +354 -0
  23. package/dist/chunk-HSU6XZOI.js.map +1 -0
  24. package/dist/chunk-K3JR2N4E.js +250 -0
  25. package/dist/chunk-K3JR2N4E.js.map +1 -0
  26. package/dist/chunk-PZ5AY32C.js +10 -0
  27. package/dist/chunk-PZ5AY32C.js.map +1 -0
  28. package/dist/chunk-SPDXNDDD.js +114 -0
  29. package/dist/chunk-SPDXNDDD.js.map +1 -0
  30. package/dist/chunk-TKIZELZQ.js +255 -0
  31. package/dist/chunk-TKIZELZQ.js.map +1 -0
  32. package/dist/chunk-VBXTOU4S.js +50 -0
  33. package/dist/chunk-VBXTOU4S.js.map +1 -0
  34. package/dist/chunk-YOOYQBGK.js +43 -0
  35. package/dist/chunk-YOOYQBGK.js.map +1 -0
  36. package/dist/cli/index.d.ts +3 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +11 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/cli/utils.d.ts +12 -0
  41. package/dist/cli/utils.d.ts.map +1 -0
  42. package/dist/config/index.d.ts +6 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +28 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/loader.d.ts +23 -0
  47. package/dist/config/loader.d.ts.map +1 -0
  48. package/dist/config/parser.d.ts +5 -0
  49. package/dist/config/parser.d.ts.map +1 -0
  50. package/dist/config/yaml-utils.d.ts +13 -0
  51. package/dist/config/yaml-utils.d.ts.map +1 -0
  52. package/dist/config/yaml.d.ts +9 -0
  53. package/dist/config/yaml.d.ts.map +1 -0
  54. package/dist/connectivity/check.d.ts +18 -0
  55. package/dist/connectivity/check.d.ts.map +1 -0
  56. package/dist/connectivity/index.d.ts +3 -0
  57. package/dist/connectivity/index.d.ts.map +1 -0
  58. package/dist/connectivity/index.js +12 -0
  59. package/dist/connectivity/index.js.map +1 -0
  60. package/dist/connectivity/types.d.ts +13 -0
  61. package/dist/connectivity/types.d.ts.map +1 -0
  62. package/dist/extensions/index.d.ts +8 -0
  63. package/dist/extensions/index.d.ts.map +1 -0
  64. package/dist/extensions/index.js +38 -0
  65. package/dist/extensions/index.js.map +1 -0
  66. package/dist/extensions/loader.d.ts +12 -0
  67. package/dist/extensions/loader.d.ts.map +1 -0
  68. package/dist/extensions/npm-protocol.d.ts +36 -0
  69. package/dist/extensions/npm-protocol.d.ts.map +1 -0
  70. package/dist/index.d.ts +58 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +133 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/langchain/index.d.ts +17 -0
  75. package/dist/langchain/index.d.ts.map +1 -0
  76. package/dist/langchain/index.js +12 -0
  77. package/dist/langchain/index.js.map +1 -0
  78. package/dist/langchain/openai-compatible.d.ts +21 -0
  79. package/dist/langchain/openai-compatible.d.ts.map +1 -0
  80. package/dist/langchain/tool-choice.d.ts +9 -0
  81. package/dist/langchain/tool-choice.d.ts.map +1 -0
  82. package/dist/model/chat.d.ts +30 -0
  83. package/dist/model/chat.d.ts.map +1 -0
  84. package/dist/model/embed-parser.d.ts +25 -0
  85. package/dist/model/embed-parser.d.ts.map +1 -0
  86. package/dist/model/embedding.d.ts +25 -0
  87. package/dist/model/embedding.d.ts.map +1 -0
  88. package/dist/model/hub.d.ts +29 -0
  89. package/dist/model/hub.d.ts.map +1 -0
  90. package/dist/model/index.d.ts +13 -0
  91. package/dist/model/index.d.ts.map +1 -0
  92. package/dist/model/index.js +18 -0
  93. package/dist/model/index.js.map +1 -0
  94. package/dist/model/llm-parser.d.ts +10 -0
  95. package/dist/model/llm-parser.d.ts.map +1 -0
  96. package/dist/model/types.d.ts +31 -0
  97. package/dist/model/types.d.ts.map +1 -0
  98. package/dist/npm/command.d.ts +37 -0
  99. package/dist/npm/command.d.ts.map +1 -0
  100. package/dist/npm/index.d.ts +5 -0
  101. package/dist/npm/index.d.ts.map +1 -0
  102. package/dist/npm/index.js +40 -0
  103. package/dist/npm/index.js.map +1 -0
  104. package/dist/npm/install.d.ts +9 -0
  105. package/dist/npm/install.d.ts.map +1 -0
  106. package/dist/npm/provider.d.ts +15 -0
  107. package/dist/npm/provider.d.ts.map +1 -0
  108. package/dist/npm/version.d.ts +12 -0
  109. package/dist/npm/version.d.ts.map +1 -0
  110. package/dist/registry/chat-model.d.ts +10 -0
  111. package/dist/registry/chat-model.d.ts.map +1 -0
  112. package/dist/registry/index.d.ts +3 -0
  113. package/dist/registry/index.d.ts.map +1 -0
  114. package/dist/registry/index.js +11 -0
  115. package/dist/registry/index.js.map +1 -0
  116. package/dist/types.d.ts +20 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/package.json +98 -0
@@ -0,0 +1,354 @@
1
+ import {
2
+ createChatModelFromLlmConfig
3
+ } from "./chunk-4OLU43SH.js";
4
+ import {
5
+ getChatModelFactory,
6
+ registerChatModelProvider
7
+ } from "./chunk-G7MKWPEI.js";
8
+ import {
9
+ ensureNpmPackageInstalled,
10
+ getInstalledVersion,
11
+ isNpmProviderSpec,
12
+ parseNpmProviderSpec,
13
+ resolveLatestVersionFromRegistry
14
+ } from "./chunk-K3JR2N4E.js";
15
+
16
+ // src/extensions/loader.ts
17
+ import { readdirSync, readFileSync, existsSync } from "fs";
18
+ import { createRequire } from "module";
19
+ import { join } from "path";
20
+ import { pathToFileURL } from "url";
21
+
22
+ // src/types.ts
23
+ var AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
24
+
25
+ // src/extensions/loader.ts
26
+ var loadedPackages = /* @__PURE__ */ new Set();
27
+ function isLLMExtension(m) {
28
+ if (m == null || typeof m !== "object") return false;
29
+ const e = m;
30
+ if (typeof e.providerName !== "string") return false;
31
+ const hasRegister = typeof e.register === "function";
32
+ const hasChatModel = typeof e.createChatModel === "function";
33
+ return hasRegister || hasChatModel;
34
+ }
35
+ function registerExtension(ext) {
36
+ if (typeof ext.createChatModel === "function") {
37
+ registerChatModelProvider(ext.providerName, ext.createChatModel);
38
+ return;
39
+ }
40
+ if (typeof ext.register === "function") {
41
+ ext.register();
42
+ }
43
+ }
44
+ function getExtensionFromModule(m) {
45
+ if (isLLMExtension(m)) return m;
46
+ if (typeof m.getLLMExtension === "function") {
47
+ const ext = m.getLLMExtension();
48
+ return isLLMExtension(ext) ? ext : null;
49
+ }
50
+ if (isLLMExtension(m.default)) return m.default;
51
+ return null;
52
+ }
53
+ function resolveLLMExtensionPackages(types) {
54
+ if (types == null) return [];
55
+ const typeList = Array.isArray(types) ? types : [types];
56
+ return typeList.filter(
57
+ (t) => typeof t === "string" && String(t).trim().length > 0
58
+ );
59
+ }
60
+ function readPackageProviderName(pkgPath) {
61
+ if (!existsSync(pkgPath)) return null;
62
+ try {
63
+ const raw = readFileSync(pkgPath, "utf-8");
64
+ const pkg = JSON.parse(raw);
65
+ const declared = pkg[AGENT_LLM_PROVIDER_FIELD] === true || Array.isArray(pkg.keywords) && pkg.keywords.includes("agent-model-provider");
66
+ return declared && typeof pkg.name === "string" ? pkg.name : null;
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+ function discoverLLMExtensions(cwd = process.cwd()) {
72
+ const dir = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
73
+ const nodeModules = join(dir, "node_modules");
74
+ if (!existsSync(nodeModules)) return [];
75
+ const names = [];
76
+ const seen = /* @__PURE__ */ new Set();
77
+ try {
78
+ const entries = readdirSync(nodeModules, { withFileTypes: true });
79
+ for (const e of entries) {
80
+ if (e.name.startsWith(".") || e.name === "node") continue;
81
+ if (e.name.startsWith("@") && e.isDirectory()) {
82
+ const scopePath = join(nodeModules, e.name);
83
+ const scopeEntries = readdirSync(scopePath, { withFileTypes: true });
84
+ for (const se of scopeEntries) {
85
+ if (!se.isDirectory()) continue;
86
+ const name2 = readPackageProviderName(join(scopePath, se.name, "package.json"));
87
+ if (name2 && !seen.has(name2)) {
88
+ seen.add(name2);
89
+ names.push(name2);
90
+ }
91
+ }
92
+ continue;
93
+ }
94
+ const name = readPackageProviderName(join(nodeModules, e.name, "package.json"));
95
+ if (name && !seen.has(name)) {
96
+ seen.add(name);
97
+ names.push(name);
98
+ }
99
+ }
100
+ } catch {
101
+ }
102
+ return names;
103
+ }
104
+ async function loadModuleFromPath(pkgDir) {
105
+ const pkgJsonPath = join(pkgDir, "package.json");
106
+ if (!existsSync(pkgJsonPath)) {
107
+ throw new Error(`package.json not found in ${pkgDir}`);
108
+ }
109
+ const pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
110
+ const main = pkgJson?.main ?? "index.js";
111
+ const entryPath = join(pkgDir, main);
112
+ if (!existsSync(entryPath)) {
113
+ throw new Error(`Entry ${main} not found in ${pkgDir}`);
114
+ }
115
+ const entryUrl = pathToFileURL(entryPath).href;
116
+ return await import(
117
+ /* @vite-ignore */
118
+ entryUrl
119
+ );
120
+ }
121
+ function resolvePackageEntryFromCwd(pkg, cwd) {
122
+ const pkgDir = join(cwd, "node_modules", pkg);
123
+ const pkgJsonPath = join(pkgDir, "package.json");
124
+ if (!existsSync(pkgJsonPath)) return null;
125
+ try {
126
+ const req = createRequire(pkgJsonPath);
127
+ return req.resolve(pkg);
128
+ } catch {
129
+ return null;
130
+ }
131
+ }
132
+ async function loadLLMExtensions(extensionPackages, options) {
133
+ const packages = Array.isArray(extensionPackages) ? extensionPackages.filter((p) => typeof p === "string" && String(p).trim().length > 0) : [];
134
+ const cwd = options?.cwd ?? process.cwd();
135
+ for (const pkg of packages) {
136
+ if (loadedPackages.has(pkg)) continue;
137
+ loadedPackages.add(pkg);
138
+ let loaded = false;
139
+ const cwdPkgDir = join(cwd, "node_modules", pkg);
140
+ const cwdIsProject = existsSync(join(cwd, "package.json")) && (() => {
141
+ try {
142
+ const name = JSON.parse(readFileSync(join(cwd, "package.json"), "utf-8")).name;
143
+ return name === pkg;
144
+ } catch {
145
+ return false;
146
+ }
147
+ })();
148
+ const dirsToTry = [cwdPkgDir, ...cwdIsProject ? [cwd] : []];
149
+ for (const pkgDir of dirsToTry) {
150
+ if (!existsSync(join(pkgDir, "package.json"))) continue;
151
+ try {
152
+ const m = await loadModuleFromPath(pkgDir);
153
+ const ext = getExtensionFromModule(m);
154
+ if (ext) {
155
+ registerExtension(ext);
156
+ loaded = true;
157
+ break;
158
+ }
159
+ if (typeof m.registerLLMExtension === "function") {
160
+ m.registerLLMExtension();
161
+ loaded = true;
162
+ break;
163
+ }
164
+ } catch {
165
+ }
166
+ }
167
+ if (loaded) continue;
168
+ const resolvedEntry = resolvePackageEntryFromCwd(pkg, cwd);
169
+ if (resolvedEntry) {
170
+ try {
171
+ const entryUrl = pathToFileURL(resolvedEntry).href;
172
+ const m = await import(
173
+ /* @vite-ignore */
174
+ entryUrl
175
+ );
176
+ const ext = getExtensionFromModule(m);
177
+ if (ext) {
178
+ registerExtension(ext);
179
+ continue;
180
+ }
181
+ if (typeof m.registerLLMExtension === "function") {
182
+ m.registerLLMExtension();
183
+ continue;
184
+ }
185
+ } catch {
186
+ }
187
+ }
188
+ try {
189
+ const m = await import(
190
+ /* @vite-ignore */
191
+ pkg
192
+ );
193
+ const ext = getExtensionFromModule(m);
194
+ if (ext) {
195
+ registerExtension(ext);
196
+ continue;
197
+ }
198
+ if (typeof m.registerLLMExtension === "function") {
199
+ m.registerLLMExtension();
200
+ }
201
+ } catch (e) {
202
+ const msg = e instanceof Error ? e.message : String(e);
203
+ if (typeof process !== "undefined" && process.emitWarning) {
204
+ process.emitWarning(`[agent-model] Failed to load extension "${pkg}": ${msg}`, { code: "AGENT_LLM_EXTENSION_LOAD" });
205
+ }
206
+ }
207
+ }
208
+ }
209
+ async function loadDiscoveredExtensions(cwd = process.cwd()) {
210
+ const dir = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
211
+ const names = discoverLLMExtensions(dir);
212
+ await loadLLMExtensions(names);
213
+ return names;
214
+ }
215
+
216
+ // src/extensions/npm-protocol.ts
217
+ async function getLatestVersion(packageName, options = {}) {
218
+ return resolveLatestVersionFromRegistry(packageName, { cwd: options.cwd ?? process.cwd() });
219
+ }
220
+ function getInstalledVersion2(packageName, options = {}) {
221
+ return getInstalledVersion(packageName, options);
222
+ }
223
+ function isModuleNotFoundError(err) {
224
+ const msg = err instanceof Error ? err.message : String(err);
225
+ 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");
226
+ }
227
+ async function ensureNpmPackageInstalled2(packageName, options = {}) {
228
+ await ensureNpmPackageInstalled(packageName, {
229
+ version: options.version,
230
+ cwd: options.cwd,
231
+ stdio: "inherit",
232
+ noPackageLock: true,
233
+ logPrefix: "[agent-model]"
234
+ });
235
+ }
236
+ function normalizeError(e, context) {
237
+ if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });
238
+ return new Error(`${context}: ${String(e)}`);
239
+ }
240
+ async function resolveNpmProvider(spec, options = {}) {
241
+ if (typeof spec !== "string" || spec.trim().length === 0) return null;
242
+ const parsed = parseNpmProviderSpec(spec);
243
+ if (!parsed) return null;
244
+ const { packageName, version, provider: fragmentProvider } = parsed;
245
+ const installNpmIfMissing = options.installNpmIfMissing !== false;
246
+ const cwd = options.cwd ?? process.cwd();
247
+ const load = async () => {
248
+ await loadLLMExtensions([packageName], { cwd });
249
+ };
250
+ if (installNpmIfMissing) {
251
+ await ensureNpmPackageInstalled2(packageName, { version, cwd });
252
+ }
253
+ try {
254
+ await load();
255
+ } catch (err) {
256
+ if (installNpmIfMissing && isModuleNotFoundError(err)) {
257
+ try {
258
+ await ensureNpmPackageInstalled2(packageName, { version, cwd });
259
+ await load();
260
+ } catch (installErr) {
261
+ throw normalizeError(installErr, `Failed to install or load npm provider "${packageName}"`);
262
+ }
263
+ } else {
264
+ throw normalizeError(err, `Failed to load npm provider "${packageName}"`);
265
+ }
266
+ }
267
+ if (fragmentProvider && !getChatModelFactory(fragmentProvider)) {
268
+ if (installNpmIfMissing) {
269
+ await ensureNpmPackageInstalled2(packageName, { version, cwd });
270
+ await load();
271
+ }
272
+ if (!getChatModelFactory(fragmentProvider)) {
273
+ throw new Error(`Package "${packageName}" was installed but did not register provider "${fragmentProvider}". Check that the package exports getLLMExtension() or registerLLMExtension().`);
274
+ }
275
+ }
276
+ if (fragmentProvider) return fragmentProvider;
277
+ try {
278
+ const m = await import(
279
+ /* @vite-ignore */
280
+ packageName
281
+ );
282
+ if (typeof m.getDefaultProviderName === "function") {
283
+ return m.getDefaultProviderName();
284
+ }
285
+ } catch {
286
+ }
287
+ throw new Error(
288
+ `Provider spec ${spec} has no #provider fragment and the package does not export getDefaultProviderName(). Use e.g. npm:${packageName}#<provider-name>.`
289
+ );
290
+ }
291
+ async function resolveLlmSectionWithNpm(llmSection, options = {}) {
292
+ if (llmSection == null) return llmSection;
293
+ if (Array.isArray(llmSection)) {
294
+ const out = [];
295
+ for (let i = 0; i < llmSection.length; i++) {
296
+ try {
297
+ out.push(await resolveLlmSectionWithNpm(llmSection[i], options));
298
+ } catch (e) {
299
+ throw normalizeError(e, `Failed to resolve llm section at index ${i}`);
300
+ }
301
+ }
302
+ return out;
303
+ }
304
+ if (typeof llmSection === "object") {
305
+ const out = {};
306
+ for (const [k, v] of Object.entries(llmSection)) {
307
+ if (k === "provider" && isNpmProviderSpec(v)) {
308
+ try {
309
+ const resolved = await resolveNpmProvider(v, options);
310
+ out[k] = resolved ?? v;
311
+ } catch (e) {
312
+ throw normalizeError(e, `Failed to resolve provider "${String(v)}"`);
313
+ }
314
+ continue;
315
+ }
316
+ try {
317
+ out[k] = await resolveLlmSectionWithNpm(v, options);
318
+ } catch (e) {
319
+ throw normalizeError(e, `Failed to resolve llm section key "${k}"`);
320
+ }
321
+ }
322
+ return out;
323
+ }
324
+ return llmSection;
325
+ }
326
+ async function createChatModelWithNpm(options = {}) {
327
+ try {
328
+ const { installNpmIfMissing, cwd, ...rest } = options;
329
+ const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {
330
+ installNpmIfMissing,
331
+ cwd
332
+ });
333
+ return createChatModelFromLlmConfig({
334
+ ...rest,
335
+ llmSection: resolvedSection
336
+ });
337
+ } catch (e) {
338
+ throw normalizeError(e, "createChatModelWithNpm failed");
339
+ }
340
+ }
341
+
342
+ export {
343
+ resolveLLMExtensionPackages,
344
+ discoverLLMExtensions,
345
+ loadLLMExtensions,
346
+ loadDiscoveredExtensions,
347
+ getLatestVersion,
348
+ getInstalledVersion2 as getInstalledVersion,
349
+ ensureNpmPackageInstalled2 as ensureNpmPackageInstalled,
350
+ resolveNpmProvider,
351
+ resolveLlmSectionWithNpm,
352
+ createChatModelWithNpm
353
+ };
354
+ //# sourceMappingURL=chunk-HSU6XZOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/loader.ts","../src/types.ts","../src/extensions/npm-protocol.ts"],"sourcesContent":["/**\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-model-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-model] 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 * Agent LLM: OpenAI-compatible config.\n * Returns LangChain BaseChatModel instances.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\n// LLM types now live locally in agent-model\nexport type { LLMType, LLMConfig, AgentConfigLlmSection } from \"./model/types.js\";\n\n/** package.json field: when true, the package is an agent-model provider (legacy name kept for compatibility). */\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: import(\"./model/types.js\").LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\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 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\";\nimport {\n NPM_PROTOCOL_PREFIX,\n parseNpmProviderSpec,\n isNpmProviderSpec,\n resolveLatestVersionFromRegistry,\n getInstalledVersion as getInstalledVersionFromCommon,\n ensureNpmPackageInstalled as ensureNpmPackageInstalledFromCommon,\n} from \"../npm/index.js\";\n\nexport { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec };\n\nexport async function getLatestVersion(\n packageName: string,\n options: { cwd?: string } = {}\n): Promise<string> {\n return resolveLatestVersionFromRegistry(packageName, { cwd: options.cwd ?? process.cwd() });\n}\n\nexport function getInstalledVersion(packageName: string, options: { cwd?: string } = {}): string | null {\n return getInstalledVersionFromCommon(packageName, options);\n}\n\nexport interface EnsureNpmPackageInstalledOptions {\n version?: string;\n cwd?: string;\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 * 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 await ensureNpmPackageInstalledFromCommon(packageName, {\n version: options.version,\n cwd: options.cwd,\n stdio: \"inherit\",\n noPackageLock: true,\n logPrefix: \"[agent-model]\",\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"],"mappings":"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","names":["name","getInstalledVersion","ensureNpmPackageInstalled"]}
@@ -0,0 +1,250 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-PZ5AY32C.js";
4
+
5
+ // src/npm/index.ts
6
+ var npm_exports = {};
7
+ __export(npm_exports, {
8
+ NPM_PROTOCOL_PREFIX: () => NPM_PROTOCOL_PREFIX,
9
+ assertNpmCommandSuccess: () => assertNpmCommandSuccess,
10
+ clearVersionCache: () => clearVersionCache,
11
+ ensureNpmPackageInstalled: () => ensureNpmPackageInstalled,
12
+ formatProviderDisplay: () => formatProviderDisplay,
13
+ getInstalledVersion: () => getInstalledVersion,
14
+ isNpmProviderSpec: () => isNpmProviderSpec,
15
+ npmInstall: () => npmInstall,
16
+ npmPublish: () => npmPublish,
17
+ npmRoot: () => npmRoot,
18
+ npmRunScript: () => npmRunScript,
19
+ npmSearchJson: () => npmSearchJson,
20
+ parseNpmProvider: () => parseNpmProvider,
21
+ parseNpmProviderSpec: () => parseNpmProviderSpec,
22
+ resolveLatestVersionFromRegistry: () => resolveLatestVersionFromRegistry,
23
+ resolveNpmPackageVersion: () => resolveNpmPackageVersion,
24
+ runNpmCommand: () => runNpmCommand
25
+ });
26
+
27
+ // src/npm/provider.ts
28
+ var NPM_PROTOCOL_PREFIX = "npm:";
29
+ function isNpmProviderSpec(spec) {
30
+ return typeof spec === "string" && spec.startsWith(NPM_PROTOCOL_PREFIX);
31
+ }
32
+ function parseNpmProvider(provider) {
33
+ if (!isNpmProviderSpec(provider)) return null;
34
+ const rest = provider.slice(NPM_PROTOCOL_PREFIX.length);
35
+ const hashIdx = rest.indexOf("#");
36
+ const fragment = hashIdx >= 0 ? rest.slice(hashIdx + 1) : void 0;
37
+ const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx) : rest;
38
+ const atIdx = beforeHash.startsWith("@") ? beforeHash.indexOf("@", 1) : beforeHash.lastIndexOf("@");
39
+ const pkg = atIdx > 0 ? beforeHash.slice(0, atIdx) : beforeHash;
40
+ const tag = atIdx > 0 ? beforeHash.slice(atIdx + 1) : void 0;
41
+ return { pkg: pkg || beforeHash, tag: tag || void 0, fragment };
42
+ }
43
+ function parseNpmProviderSpec(spec) {
44
+ const parsed = parseNpmProvider(spec);
45
+ if (!parsed) return null;
46
+ return {
47
+ packageName: parsed.pkg,
48
+ version: parsed.tag,
49
+ provider: parsed.fragment
50
+ };
51
+ }
52
+
53
+ // src/npm/version.ts
54
+ import { execFileSync } from "child_process";
55
+ import { existsSync, readFileSync } from "fs";
56
+ import path from "path";
57
+ var versionCache = /* @__PURE__ */ new Map();
58
+ var CACHE_TTL = 5 * 60 * 1e3;
59
+ function clearVersionCache() {
60
+ versionCache.clear();
61
+ }
62
+ function resolveNpmPackageVersion(pkg, tag, options = {}) {
63
+ const cacheKey = tag ? `${pkg}@${tag}` : pkg;
64
+ const cached = versionCache.get(cacheKey);
65
+ if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
66
+ return cached.version;
67
+ }
68
+ try {
69
+ const spec = tag ? `${pkg}@${tag}` : pkg;
70
+ const out = execFileSync("npm", ["view", spec, "version"], {
71
+ cwd: options.cwd ?? process.cwd(),
72
+ encoding: "utf-8",
73
+ timeout: options.timeoutMs ?? 8e3,
74
+ stdio: ["ignore", "pipe", "pipe"]
75
+ });
76
+ const version = out?.trim() ?? null;
77
+ if (version) {
78
+ versionCache.set(cacheKey, { version, timestamp: Date.now() });
79
+ }
80
+ return version;
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+ function resolveLatestVersionFromRegistry(packageName, options = {}) {
86
+ const version = resolveNpmPackageVersion(packageName, void 0, options);
87
+ if (!version) {
88
+ throw new Error(`Failed to resolve latest version for ${packageName}`);
89
+ }
90
+ return version;
91
+ }
92
+ function formatProviderDisplay(provider) {
93
+ const parsed = parseNpmProvider(provider);
94
+ if (parsed == null) return provider;
95
+ const resolved = resolveNpmPackageVersion(parsed.pkg, parsed.tag);
96
+ const version = resolved ?? parsed.tag ?? "latest";
97
+ const frag = parsed.fragment ? `#${parsed.fragment}` : "";
98
+ return `npm:${parsed.pkg}@${version}${frag}`;
99
+ }
100
+ function getInstalledVersion(packageName, options = {}) {
101
+ let dir = path.resolve(options.cwd ?? process.cwd());
102
+ const segs = packageName.split("/");
103
+ while (true) {
104
+ const pkgJsonPath = path.join(dir, "node_modules", ...segs, "package.json");
105
+ if (existsSync(pkgJsonPath)) {
106
+ try {
107
+ const j = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
108
+ return typeof j.version === "string" ? j.version : null;
109
+ } catch {
110
+ return null;
111
+ }
112
+ }
113
+ const parent = path.dirname(dir);
114
+ if (parent === dir) return null;
115
+ dir = parent;
116
+ }
117
+ }
118
+
119
+ // src/npm/install.ts
120
+ import { execFileSync as execFileSync2 } from "child_process";
121
+ var VERSION_LATEST = "latest";
122
+ async function resolveInstallVersion(packageName, version, cwd) {
123
+ const isLatestOrEmpty = version === void 0 || version === "" || typeof version === "string" && version.toLowerCase() === VERSION_LATEST;
124
+ if (isLatestOrEmpty) {
125
+ return resolveLatestVersionFromRegistry(packageName, { cwd });
126
+ }
127
+ return version;
128
+ }
129
+ async function ensureNpmPackageInstalled(packageName, options = {}) {
130
+ if (typeof packageName !== "string" || packageName.trim().length === 0) {
131
+ throw new Error("ensureNpmPackageInstalled requires a non-empty package name");
132
+ }
133
+ const cwd = options.cwd ?? process.cwd();
134
+ const resolvedVersion = await resolveInstallVersion(packageName, options.version, cwd);
135
+ const installedVersion = getInstalledVersion(packageName, { cwd });
136
+ if (installedVersion === resolvedVersion) return;
137
+ const installSpec = `${packageName}@${resolvedVersion}`;
138
+ const prefix = options.logPrefix ?? "[agent-model]";
139
+ if (installedVersion === null) {
140
+ console.info(`${prefix} Installing provider: ${installSpec}`);
141
+ } else {
142
+ console.info(`${prefix} Updating provider: ${packageName} ${installedVersion} -> ${resolvedVersion}`);
143
+ }
144
+ const args = ["install", installSpec];
145
+ if (options.noPackageLock !== false) args.push("--no-package-lock");
146
+ const stdio = options.stdio === "pipe" ? ["ignore", "pipe", "pipe"] : options.stdio ?? "inherit";
147
+ try {
148
+ execFileSync2("npm", args, {
149
+ cwd,
150
+ stdio,
151
+ encoding: "utf-8"
152
+ });
153
+ } catch (e) {
154
+ const msg = e instanceof Error ? e.message : String(e);
155
+ throw new Error(`npm install failed for ${installSpec}: ${msg}`, { cause: e });
156
+ }
157
+ }
158
+
159
+ // src/npm/command.ts
160
+ import { spawnSync } from "child_process";
161
+ function normalizeOutput(v) {
162
+ return typeof v === "string" ? v : "";
163
+ }
164
+ function runNpmCommand(args, options = {}) {
165
+ const result = spawnSync("npm", args, {
166
+ cwd: options.cwd ?? process.cwd(),
167
+ env: options.env ?? process.env,
168
+ encoding: "utf-8",
169
+ timeout: options.timeoutMs,
170
+ stdio: options.stdio ?? "pipe",
171
+ shell: options.shell ?? false
172
+ });
173
+ return {
174
+ args,
175
+ status: result.status,
176
+ stdout: normalizeOutput(result.stdout),
177
+ stderr: normalizeOutput(result.stderr),
178
+ signal: result.signal,
179
+ error: result.error ?? void 0
180
+ };
181
+ }
182
+ function assertNpmCommandSuccess(result, context) {
183
+ if (!result.error && result.status === 0) return;
184
+ const details = result.error?.message || result.stderr.trim() || (result.status == null ? "terminated" : `exit code ${result.status}`);
185
+ throw new Error(`${context} failed: npm ${result.args.join(" ")} (${details})`);
186
+ }
187
+ function npmSearchJson(query, options = {}) {
188
+ const result = runNpmCommand(["search", query, "--json"], options);
189
+ if (result.error || result.status !== 0) return [];
190
+ const text = result.stdout.trim();
191
+ if (!text) return [];
192
+ try {
193
+ const parsed = JSON.parse(text);
194
+ return Array.isArray(parsed) ? parsed : [];
195
+ } catch {
196
+ return [];
197
+ }
198
+ }
199
+ function npmInstall(options = {}) {
200
+ const args = ["install"];
201
+ if (options.global) args.push("-g");
202
+ if (options.registry) args.push("--registry", options.registry);
203
+ if (options.legacyPeerDeps) args.push("--legacy-peer-deps");
204
+ if (options.noPackageLock) args.push("--no-package-lock");
205
+ if (Array.isArray(options.packages) && options.packages.length > 0) {
206
+ args.push(...options.packages);
207
+ }
208
+ const result = runNpmCommand(args, options);
209
+ assertNpmCommandSuccess(result, "npm install");
210
+ }
211
+ function npmRunScript(script, options = {}) {
212
+ const result = runNpmCommand(["run", script], options);
213
+ assertNpmCommandSuccess(result, `npm run ${script}`);
214
+ }
215
+ function npmPublish(options = {}) {
216
+ const args = ["publish"];
217
+ if (options.tag) args.push("--tag", options.tag);
218
+ if (options.access) args.push("--access", options.access);
219
+ if (options.registry) args.push("--registry", options.registry);
220
+ const result = runNpmCommand(args, options);
221
+ assertNpmCommandSuccess(result, "npm publish");
222
+ }
223
+ function npmRoot(options = {}) {
224
+ const args = ["root", ...options.global ? ["-g"] : []];
225
+ const result = runNpmCommand(args, options);
226
+ assertNpmCommandSuccess(result, "npm root");
227
+ return result.stdout.trim();
228
+ }
229
+
230
+ export {
231
+ NPM_PROTOCOL_PREFIX,
232
+ isNpmProviderSpec,
233
+ parseNpmProvider,
234
+ parseNpmProviderSpec,
235
+ clearVersionCache,
236
+ resolveNpmPackageVersion,
237
+ resolveLatestVersionFromRegistry,
238
+ formatProviderDisplay,
239
+ getInstalledVersion,
240
+ ensureNpmPackageInstalled,
241
+ runNpmCommand,
242
+ assertNpmCommandSuccess,
243
+ npmSearchJson,
244
+ npmInstall,
245
+ npmRunScript,
246
+ npmPublish,
247
+ npmRoot,
248
+ npm_exports
249
+ };
250
+ //# sourceMappingURL=chunk-K3JR2N4E.js.map