@yagr/agent 0.2.9 → 0.2.11
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/dist/cli.js +251 -9
- package/dist/cli.js.map +1 -1
- package/dist/config/n8n-config-service.d.ts +2 -1
- package/dist/config/n8n-config-service.d.ts.map +1 -1
- package/dist/config/n8n-config-service.js +2 -1
- package/dist/config/n8n-config-service.js.map +1 -1
- package/dist/config/yagr-config-service.d.ts +1 -1
- package/dist/config/yagr-config-service.d.ts.map +1 -1
- package/dist/config/yagr-home.d.ts +7 -0
- package/dist/config/yagr-home.d.ts.map +1 -1
- package/dist/config/yagr-home.js +19 -0
- package/dist/config/yagr-home.js.map +1 -1
- package/dist/gateway/format-message.d.ts +3 -0
- package/dist/gateway/format-message.d.ts.map +1 -1
- package/dist/gateway/format-message.js +63 -10
- package/dist/gateway/format-message.js.map +1 -1
- package/dist/gateway/interactive-ui.d.ts.map +1 -1
- package/dist/gateway/interactive-ui.js +49 -4
- package/dist/gateway/interactive-ui.js.map +1 -1
- package/dist/gateway/local-open-bridge.d.ts +3 -0
- package/dist/gateway/local-open-bridge.d.ts.map +1 -0
- package/dist/gateway/local-open-bridge.js +54 -0
- package/dist/gateway/local-open-bridge.js.map +1 -0
- package/dist/gateway/webui.d.ts.map +1 -1
- package/dist/gateway/webui.js +50 -53
- package/dist/gateway/webui.js.map +1 -1
- package/dist/gateway/workflow-links.d.ts +12 -0
- package/dist/gateway/workflow-links.d.ts.map +1 -0
- package/dist/gateway/workflow-links.js +53 -0
- package/dist/gateway/workflow-links.js.map +1 -0
- package/dist/llm/anthropic-account.d.ts +20 -0
- package/dist/llm/anthropic-account.d.ts.map +1 -0
- package/dist/llm/anthropic-account.js +111 -0
- package/dist/llm/anthropic-account.js.map +1 -0
- package/dist/llm/copilot-account.d.ts +36 -0
- package/dist/llm/copilot-account.d.ts.map +1 -0
- package/dist/llm/copilot-account.js +573 -0
- package/dist/llm/copilot-account.js.map +1 -0
- package/dist/llm/create-language-model.d.ts +2 -2
- package/dist/llm/create-language-model.d.ts.map +1 -1
- package/dist/llm/create-language-model.js +187 -38
- package/dist/llm/create-language-model.js.map +1 -1
- package/dist/llm/google-account.d.ts +31 -0
- package/dist/llm/google-account.d.ts.map +1 -0
- package/dist/llm/google-account.js +851 -0
- package/dist/llm/google-account.js.map +1 -0
- package/dist/llm/model-catalog-cache.d.ts +4 -0
- package/dist/llm/model-catalog-cache.d.ts.map +1 -0
- package/dist/llm/model-catalog-cache.js +46 -0
- package/dist/llm/model-catalog-cache.js.map +1 -0
- package/dist/llm/openai-account.d.ts +33 -0
- package/dist/llm/openai-account.d.ts.map +1 -0
- package/dist/llm/openai-account.js +578 -0
- package/dist/llm/openai-account.js.map +1 -0
- package/dist/llm/provider-discovery.d.ts +3 -0
- package/dist/llm/provider-discovery.d.ts.map +1 -0
- package/dist/llm/provider-discovery.js +40 -0
- package/dist/llm/provider-discovery.js.map +1 -0
- package/dist/llm/provider-registry.d.ts +37 -0
- package/dist/llm/provider-registry.d.ts.map +1 -0
- package/dist/llm/provider-registry.js +186 -0
- package/dist/llm/provider-registry.js.map +1 -0
- package/dist/llm/proxy-runtime.d.ts +37 -0
- package/dist/llm/proxy-runtime.d.ts.map +1 -0
- package/dist/llm/proxy-runtime.js +462 -0
- package/dist/llm/proxy-runtime.js.map +1 -0
- package/dist/llm/test-model-policy.d.ts +3 -0
- package/dist/llm/test-model-policy.d.ts.map +1 -0
- package/dist/llm/test-model-policy.js +16 -0
- package/dist/llm/test-model-policy.js.map +1 -0
- package/dist/n8n-local/bootstrap.d.ts +12 -0
- package/dist/n8n-local/bootstrap.d.ts.map +1 -0
- package/dist/n8n-local/bootstrap.js +281 -0
- package/dist/n8n-local/bootstrap.js.map +1 -0
- package/dist/n8n-local/browser-auth.d.ts +12 -0
- package/dist/n8n-local/browser-auth.d.ts.map +1 -0
- package/dist/n8n-local/browser-auth.js +159 -0
- package/dist/n8n-local/browser-auth.js.map +1 -0
- package/dist/n8n-local/detect.d.ts +50 -0
- package/dist/n8n-local/detect.d.ts.map +1 -0
- package/dist/n8n-local/detect.js +207 -0
- package/dist/n8n-local/detect.js.map +1 -0
- package/dist/n8n-local/direct-manager.d.ts +15 -0
- package/dist/n8n-local/direct-manager.d.ts.map +1 -0
- package/dist/n8n-local/direct-manager.js +232 -0
- package/dist/n8n-local/direct-manager.js.map +1 -0
- package/dist/n8n-local/docker-manager.d.ts +18 -0
- package/dist/n8n-local/docker-manager.d.ts.map +1 -0
- package/dist/n8n-local/docker-manager.js +217 -0
- package/dist/n8n-local/docker-manager.js.map +1 -0
- package/dist/n8n-local/managed-runtime.d.ts +17 -0
- package/dist/n8n-local/managed-runtime.d.ts.map +1 -0
- package/dist/n8n-local/managed-runtime.js +122 -0
- package/dist/n8n-local/managed-runtime.js.map +1 -0
- package/dist/n8n-local/owner-credentials.d.ts +15 -0
- package/dist/n8n-local/owner-credentials.d.ts.map +1 -0
- package/dist/n8n-local/owner-credentials.js +50 -0
- package/dist/n8n-local/owner-credentials.js.map +1 -0
- package/dist/n8n-local/plan.d.ts +16 -0
- package/dist/n8n-local/plan.d.ts.map +1 -0
- package/dist/n8n-local/plan.js +48 -0
- package/dist/n8n-local/plan.js.map +1 -0
- package/dist/n8n-local/state.d.ts +42 -0
- package/dist/n8n-local/state.d.ts.map +1 -0
- package/dist/n8n-local/state.js +108 -0
- package/dist/n8n-local/state.js.map +1 -0
- package/dist/n8n-local/workflow-open.d.ts +21 -0
- package/dist/n8n-local/workflow-open.d.ts.map +1 -0
- package/dist/n8n-local/workflow-open.js +50 -0
- package/dist/n8n-local/workflow-open.js.map +1 -0
- package/dist/runtime/context-compaction.d.ts.map +1 -1
- package/dist/runtime/context-compaction.js +7 -0
- package/dist/runtime/context-compaction.js.map +1 -1
- package/dist/runtime/run-engine.d.ts.map +1 -1
- package/dist/runtime/run-engine.js +52 -1
- package/dist/runtime/run-engine.js.map +1 -1
- package/dist/setup/setup-wizard.d.ts +36 -3
- package/dist/setup/setup-wizard.d.ts.map +1 -1
- package/dist/setup/setup-wizard.js +470 -62
- package/dist/setup/setup-wizard.js.map +1 -1
- package/dist/setup.d.ts +2 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +204 -89
- package/dist/setup.js.map +1 -1
- package/dist/system/open-external.d.ts +2 -0
- package/dist/system/open-external.d.ts.map +1 -0
- package/dist/system/open-external.js +25 -0
- package/dist/system/open-external.js.map +1 -0
- package/dist/system/package-manager.d.ts +6 -0
- package/dist/system/package-manager.d.ts.map +1 -0
- package/dist/system/package-manager.js +13 -0
- package/dist/system/package-manager.js.map +1 -0
- package/dist/tools/build-tools.d.ts +110 -65
- package/dist/tools/build-tools.d.ts.map +1 -1
- package/dist/tools/deploy.d.ts +14 -14
- package/dist/tools/generate-workflow.d.ts +5 -5
- package/dist/tools/n8nac.d.ts +96 -53
- package/dist/tools/n8nac.d.ts.map +1 -1
- package/dist/tools/n8nac.js +52 -20
- package/dist/tools/n8nac.js.map +1 -1
- package/dist/tools/observer.d.ts +1 -0
- package/dist/tools/observer.d.ts.map +1 -1
- package/dist/tools/observer.js.map +1 -1
- package/dist/tools/present-workflow-result.d.ts +2 -0
- package/dist/tools/present-workflow-result.d.ts.map +1 -1
- package/dist/tools/present-workflow-result.js +11 -2
- package/dist/tools/present-workflow-result.js.map +1 -1
- package/dist/tools/request-required-action.d.ts +7 -7
- package/dist/tools/request-required-action.js +4 -4
- package/dist/tools/request-required-action.js.map +1 -1
- package/dist/tools/validate.d.ts +14 -14
- package/dist/tools/write-workspace-file.d.ts +5 -5
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webui/app.js +14 -1
- package/dist/webui/app.js.map +2 -2
- package/package.json +15 -2
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { ensureYagrHomeDir, getYagrPaths } from '../config/yagr-home.js';
|
|
5
|
+
import { resolvePackageManagerCommand, resolvePackageManagerSpawnOptions } from '../system/package-manager.js';
|
|
6
|
+
import { ensureGitHubCopilotSession, fetchGitHubCopilotModels, resolveCopilotApiToken, validateGitHubCopilotRuntime, } from './copilot-account.js';
|
|
7
|
+
import { ensureGeminiAccountSession, fetchGeminiOAuthModels, } from './google-account.js';
|
|
8
|
+
import { writeCachedModelCatalog } from './model-catalog-cache.js';
|
|
9
|
+
import { ANTHROPIC_ACCOUNT_DEFAULT_MODEL, ensureAnthropicAccountSession, fetchAnthropicAccountModels, validateAnthropicAccountRuntime, } from './anthropic-account.js';
|
|
10
|
+
import { ensureOpenAiAccountSession, fetchOpenAiAccountModels, OPENAI_ACCOUNT_BASE_URL, OPENAI_ACCOUNT_DEFAULT_MODEL, validateOpenAiAccountRuntime } from './openai-account.js';
|
|
11
|
+
import { fetchAvailableModels } from './provider-discovery.js';
|
|
12
|
+
import { getDefaultBaseUrlForProvider, getProviderDefinition, isOAuthAccountProvider } from './provider-registry.js';
|
|
13
|
+
export async function prepareProviderRuntime(provider, options = {}) {
|
|
14
|
+
if (provider === 'openai-proxy') {
|
|
15
|
+
const session = await ensureOpenAiAccountSession();
|
|
16
|
+
if (!session) {
|
|
17
|
+
return {
|
|
18
|
+
ready: false,
|
|
19
|
+
reason: 'No OpenAI account session found. Run `yagr setup` to authenticate with OpenAI.',
|
|
20
|
+
notes: ['OpenAI account login uses a native PKCE OAuth flow managed by Yagr.'],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const probe = await validateOpenAiAccountRuntime(OPENAI_ACCOUNT_DEFAULT_MODEL);
|
|
24
|
+
if (!probe.ok) {
|
|
25
|
+
return {
|
|
26
|
+
ready: false,
|
|
27
|
+
reason: probe.error || 'OpenAI account runtime validation failed.',
|
|
28
|
+
notes: ['OpenAI session found, but the API endpoint did not validate successfully.'],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let models = [];
|
|
32
|
+
let discoveryError;
|
|
33
|
+
try {
|
|
34
|
+
const discovered = await withTimeout(fetchOpenAiAccountModels(session.accessToken), 6_000);
|
|
35
|
+
if (discovered.length > 0) {
|
|
36
|
+
models = discovered;
|
|
37
|
+
writeCachedModelCatalog(provider, discovered);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
discoveryError = error instanceof Error ? error.message : String(error);
|
|
42
|
+
}
|
|
43
|
+
const sessionNote = session.source === 'codex'
|
|
44
|
+
? 'Connected through backward-compatible Codex CLI session.'
|
|
45
|
+
: 'Connected through Yagr-managed OpenAI OAuth.';
|
|
46
|
+
const notes = [sessionNote];
|
|
47
|
+
if (discoveryError) {
|
|
48
|
+
notes.push(`Model discovery failed: ${discoveryError}`);
|
|
49
|
+
}
|
|
50
|
+
else if (models.length > 0) {
|
|
51
|
+
notes.push('Model discovery completed from OpenAI account.');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
notes.push('Model discovery returned no models for this account.');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
ready: true,
|
|
58
|
+
runtime: {
|
|
59
|
+
provider,
|
|
60
|
+
baseUrl: OPENAI_ACCOUNT_BASE_URL,
|
|
61
|
+
apiKey: session.accessToken,
|
|
62
|
+
models,
|
|
63
|
+
notes,
|
|
64
|
+
autoStarted: false,
|
|
65
|
+
},
|
|
66
|
+
notes,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (provider === 'anthropic-proxy') {
|
|
70
|
+
const manualCredential = options.apiKey?.trim();
|
|
71
|
+
const session = await ensureAnthropicAccountSession();
|
|
72
|
+
const resolvedCredential = manualCredential || session?.apiKey;
|
|
73
|
+
if (!resolvedCredential) {
|
|
74
|
+
return {
|
|
75
|
+
ready: false,
|
|
76
|
+
reason: 'No Anthropic credential found. Paste a setup-token or Anthropic API key in setup.',
|
|
77
|
+
notes: ['Anthropic credentials can come from setup input, Claude Code config (~/.claude/config.json), or ANTHROPIC_API_KEY.'],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const probe = await validateAnthropicAccountRuntime(ANTHROPIC_ACCOUNT_DEFAULT_MODEL, resolvedCredential);
|
|
81
|
+
if (!probe.ok) {
|
|
82
|
+
return {
|
|
83
|
+
ready: false,
|
|
84
|
+
reason: probe.error || 'Anthropic account runtime validation failed.',
|
|
85
|
+
notes: ['Anthropic credentials found, but the API endpoint did not validate successfully.'],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
let models = [];
|
|
89
|
+
let discoveryError;
|
|
90
|
+
try {
|
|
91
|
+
const discovered = await withTimeout(fetchAnthropicAccountModels(resolvedCredential), 6_000);
|
|
92
|
+
if (discovered.length > 0) {
|
|
93
|
+
models = discovered;
|
|
94
|
+
writeCachedModelCatalog(provider, discovered);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
discoveryError = error instanceof Error ? error.message : String(error);
|
|
99
|
+
}
|
|
100
|
+
const sourceNote = manualCredential
|
|
101
|
+
? 'Connected through credential pasted during setup.'
|
|
102
|
+
: session?.source === 'env'
|
|
103
|
+
? 'Connected through ANTHROPIC_API_KEY environment variable.'
|
|
104
|
+
: 'Connected through Claude Code CLI credentials.';
|
|
105
|
+
const notes = [sourceNote];
|
|
106
|
+
if (discoveryError) {
|
|
107
|
+
notes.push(`Model discovery failed: ${discoveryError}`);
|
|
108
|
+
}
|
|
109
|
+
else if (models.length > 0) {
|
|
110
|
+
notes.push('Model discovery completed from Anthropic API.');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
notes.push('Model discovery returned no models for this account.');
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
ready: true,
|
|
117
|
+
runtime: {
|
|
118
|
+
provider,
|
|
119
|
+
baseUrl: '',
|
|
120
|
+
apiKey: resolvedCredential,
|
|
121
|
+
models,
|
|
122
|
+
notes,
|
|
123
|
+
autoStarted: false,
|
|
124
|
+
},
|
|
125
|
+
notes,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (provider === 'google-proxy') {
|
|
129
|
+
const session = await ensureGeminiAccountSession();
|
|
130
|
+
if (!session) {
|
|
131
|
+
return {
|
|
132
|
+
ready: false,
|
|
133
|
+
reason: 'Unable to sign in to Gemini. Complete the Google OAuth flow and retry.',
|
|
134
|
+
notes: ['Gemini OAuth is handled directly by Yagr without a localhost callback server.'],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
let models = [];
|
|
138
|
+
let discoveryError;
|
|
139
|
+
try {
|
|
140
|
+
const discovered = await withTimeout(fetchGeminiOAuthModels(session.accessToken), 13_000);
|
|
141
|
+
if (discovered.length > 0) {
|
|
142
|
+
models = discovered;
|
|
143
|
+
writeCachedModelCatalog(provider, discovered);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
discoveryError = error instanceof Error ? error.message : String(error);
|
|
148
|
+
}
|
|
149
|
+
const notes = ['Connected through Yagr-managed Gemini OAuth.'];
|
|
150
|
+
if (discoveryError) {
|
|
151
|
+
notes.push(`Model discovery failed: ${discoveryError}`);
|
|
152
|
+
}
|
|
153
|
+
else if (models.length > 0) {
|
|
154
|
+
notes.push('Model discovery completed from Gemini OAuth.');
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
notes.push('Model discovery returned no models for this account/session.');
|
|
158
|
+
}
|
|
159
|
+
if (process.env.YAGR_DEBUG_MODEL_DISCOVERY === '1') {
|
|
160
|
+
notes.push(`Gemini models discovered: ${models.length}.`);
|
|
161
|
+
if (models.length > 0) {
|
|
162
|
+
notes.push(`Gemini model IDs: ${models.join(', ')}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
ready: true,
|
|
167
|
+
runtime: {
|
|
168
|
+
provider,
|
|
169
|
+
baseUrl: options.baseUrl || '',
|
|
170
|
+
models,
|
|
171
|
+
notes,
|
|
172
|
+
autoStarted: false,
|
|
173
|
+
},
|
|
174
|
+
notes,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (provider === 'copilot-proxy') {
|
|
178
|
+
const session = await ensureGitHubCopilotSession();
|
|
179
|
+
if (!session) {
|
|
180
|
+
return {
|
|
181
|
+
ready: false,
|
|
182
|
+
reason: 'Unable to sign in to GitHub Copilot. Complete the device login flow and retry.',
|
|
183
|
+
notes: ['GitHub Copilot OAuth is handled directly by Yagr with GitHub device flow.'],
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const runtimeAuth = await resolveCopilotApiToken(session.githubToken);
|
|
187
|
+
const probe = await validateGitHubCopilotRuntime();
|
|
188
|
+
if (!probe.ok) {
|
|
189
|
+
return {
|
|
190
|
+
ready: false,
|
|
191
|
+
reason: probe.error || 'GitHub Copilot runtime validation failed after login.',
|
|
192
|
+
notes: ['GitHub sign-in exists, but the Copilot runtime did not validate successfully.'],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
let models = [];
|
|
196
|
+
let discoveryError;
|
|
197
|
+
try {
|
|
198
|
+
const discovered = await withTimeout(fetchGitHubCopilotModels(runtimeAuth.token, runtimeAuth.baseUrl), 6_000);
|
|
199
|
+
if (discovered.length > 0) {
|
|
200
|
+
models = discovered;
|
|
201
|
+
writeCachedModelCatalog(provider, discovered);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
discoveryError = error instanceof Error ? error.message : String(error);
|
|
206
|
+
}
|
|
207
|
+
const copilotNotes = [
|
|
208
|
+
'Connected through Yagr-managed GitHub device login and Copilot token exchange.',
|
|
209
|
+
'Runtime validated with GitHub Copilot.',
|
|
210
|
+
];
|
|
211
|
+
if (discoveryError) {
|
|
212
|
+
copilotNotes.push(`Model discovery failed: ${discoveryError}`);
|
|
213
|
+
}
|
|
214
|
+
else if (models.length > 0) {
|
|
215
|
+
copilotNotes.push('Model discovery completed from Copilot runtime.');
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
copilotNotes.push('Model discovery returned no models for this account.');
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
ready: true,
|
|
222
|
+
runtime: {
|
|
223
|
+
provider,
|
|
224
|
+
baseUrl: runtimeAuth.baseUrl,
|
|
225
|
+
models,
|
|
226
|
+
notes: copilotNotes,
|
|
227
|
+
autoStarted: false,
|
|
228
|
+
},
|
|
229
|
+
notes: copilotNotes,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const definition = getProviderDefinition(provider);
|
|
233
|
+
const baseUrl = options.baseUrl || getDefaultBaseUrlForProvider(provider);
|
|
234
|
+
if (!definition.usesOpenAiCompatibleApi || !baseUrl) {
|
|
235
|
+
return {
|
|
236
|
+
ready: false,
|
|
237
|
+
notes: [],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const existingModels = await fetchAvailableModels(provider, options.apiKey, baseUrl);
|
|
241
|
+
if (existingModels.length > 0) {
|
|
242
|
+
return {
|
|
243
|
+
ready: true,
|
|
244
|
+
runtime: {
|
|
245
|
+
provider,
|
|
246
|
+
baseUrl,
|
|
247
|
+
apiKey: options.apiKey,
|
|
248
|
+
models: existingModels,
|
|
249
|
+
notes: [],
|
|
250
|
+
autoStarted: false,
|
|
251
|
+
},
|
|
252
|
+
notes: [],
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (!definition.managedProxy) {
|
|
256
|
+
if (isOAuthAccountProvider(provider)) {
|
|
257
|
+
return {
|
|
258
|
+
ready: false,
|
|
259
|
+
reason: `OAuth runtime for ${provider} is not ready.`,
|
|
260
|
+
notes: [],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
ready: false,
|
|
265
|
+
notes: [],
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const stateEntry = getRuntimeState().providers?.[provider];
|
|
269
|
+
if (stateEntry?.pid && isProcessRunning(stateEntry.pid)) {
|
|
270
|
+
const runningModels = await waitForModels(provider, options.apiKey, stateEntry.baseUrl, definition.managedProxy.readyTimeoutMs ?? 30_000);
|
|
271
|
+
if (runningModels.length > 0) {
|
|
272
|
+
return {
|
|
273
|
+
ready: true,
|
|
274
|
+
runtime: {
|
|
275
|
+
provider,
|
|
276
|
+
baseUrl: stateEntry.baseUrl,
|
|
277
|
+
apiKey: options.apiKey,
|
|
278
|
+
models: runningModels,
|
|
279
|
+
notes: definition.managedProxy.startupNotes ?? [],
|
|
280
|
+
logPath: stateEntry.logPath,
|
|
281
|
+
autoStarted: false,
|
|
282
|
+
},
|
|
283
|
+
notes: definition.managedProxy.startupNotes ?? [],
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const started = startManagedProxy(provider, baseUrl);
|
|
288
|
+
const models = await waitForModels(provider, options.apiKey, started.baseUrl, definition.managedProxy.readyTimeoutMs ?? 30_000);
|
|
289
|
+
if (models.length > 0) {
|
|
290
|
+
return {
|
|
291
|
+
ready: true,
|
|
292
|
+
runtime: {
|
|
293
|
+
provider,
|
|
294
|
+
baseUrl: started.baseUrl,
|
|
295
|
+
apiKey: options.apiKey,
|
|
296
|
+
models,
|
|
297
|
+
notes: definition.managedProxy.startupNotes ?? [],
|
|
298
|
+
logPath: started.logPath,
|
|
299
|
+
autoStarted: true,
|
|
300
|
+
},
|
|
301
|
+
notes: definition.managedProxy.startupNotes ?? [],
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
ready: false,
|
|
306
|
+
reason: `Managed proxy for ${provider} did not become ready. Check ${started.logPath}.`,
|
|
307
|
+
notes: [
|
|
308
|
+
...(definition.managedProxy.startupNotes ?? []),
|
|
309
|
+
`Proxy logs: ${started.logPath}`,
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function startManagedProxy(provider, baseUrl) {
|
|
314
|
+
const definition = getProviderDefinition(provider);
|
|
315
|
+
const managed = definition.managedProxy;
|
|
316
|
+
if (!managed) {
|
|
317
|
+
throw new Error(`Provider ${provider} does not have a managed proxy runtime.`);
|
|
318
|
+
}
|
|
319
|
+
ensureYagrHomeDir();
|
|
320
|
+
const paths = getYagrPaths();
|
|
321
|
+
const logDir = path.join(paths.proxyRuntimeDir, 'logs');
|
|
322
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
323
|
+
const logPath = path.join(logDir, `${provider}.log`);
|
|
324
|
+
const logFd = fs.openSync(logPath, 'a');
|
|
325
|
+
const args = ['--yes', '--package', managed.packageName, managed.executable, ...(managed.args ?? [])];
|
|
326
|
+
const child = spawn(resolvePackageManagerCommand('npx'), args, {
|
|
327
|
+
detached: true,
|
|
328
|
+
stdio: ['ignore', logFd, logFd],
|
|
329
|
+
...resolvePackageManagerSpawnOptions(),
|
|
330
|
+
env: process.env,
|
|
331
|
+
});
|
|
332
|
+
child.unref();
|
|
333
|
+
fs.closeSync(logFd);
|
|
334
|
+
const entry = {
|
|
335
|
+
provider,
|
|
336
|
+
pid: child.pid,
|
|
337
|
+
command: `${resolvePackageManagerCommand('npx')} ${args.join(' ')}`,
|
|
338
|
+
baseUrl,
|
|
339
|
+
logPath,
|
|
340
|
+
startedAt: new Date().toISOString(),
|
|
341
|
+
};
|
|
342
|
+
updateRuntimeState((state) => ({
|
|
343
|
+
...state,
|
|
344
|
+
providers: {
|
|
345
|
+
...(state.providers ?? {}),
|
|
346
|
+
[provider]: entry,
|
|
347
|
+
},
|
|
348
|
+
}));
|
|
349
|
+
return entry;
|
|
350
|
+
}
|
|
351
|
+
export function startProviderProxy(provider, options = {}) {
|
|
352
|
+
const definition = getProviderDefinition(provider);
|
|
353
|
+
if (!definition.managedProxy) {
|
|
354
|
+
throw new Error(`Provider ${provider} does not have a managed proxy runtime yet.`);
|
|
355
|
+
}
|
|
356
|
+
const baseUrl = options.baseUrl || getDefaultBaseUrlForProvider(provider);
|
|
357
|
+
if (!baseUrl) {
|
|
358
|
+
throw new Error(`Provider ${provider} does not define a default proxy base URL.`);
|
|
359
|
+
}
|
|
360
|
+
const existing = getProxyRuntimeStatus(provider);
|
|
361
|
+
if (existing.running) {
|
|
362
|
+
return existing;
|
|
363
|
+
}
|
|
364
|
+
const entry = startManagedProxy(provider, baseUrl);
|
|
365
|
+
return {
|
|
366
|
+
provider,
|
|
367
|
+
configuredBaseUrl: entry.baseUrl,
|
|
368
|
+
running: true,
|
|
369
|
+
pid: entry.pid,
|
|
370
|
+
command: entry.command,
|
|
371
|
+
logPath: entry.logPath,
|
|
372
|
+
startedAt: entry.startedAt,
|
|
373
|
+
managed: true,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
export function stopProviderProxy(provider) {
|
|
377
|
+
const currentState = getRuntimeState();
|
|
378
|
+
const entry = currentState.providers?.[provider];
|
|
379
|
+
if (entry?.pid && isProcessRunning(entry.pid)) {
|
|
380
|
+
process.kill(entry.pid, 'SIGTERM');
|
|
381
|
+
}
|
|
382
|
+
updateRuntimeState((state) => ({
|
|
383
|
+
...state,
|
|
384
|
+
providers: {
|
|
385
|
+
...(state.providers ?? {}),
|
|
386
|
+
[provider]: undefined,
|
|
387
|
+
},
|
|
388
|
+
}));
|
|
389
|
+
return getProxyRuntimeStatus(provider);
|
|
390
|
+
}
|
|
391
|
+
export function getProxyRuntimeStatus(provider) {
|
|
392
|
+
const definition = getProviderDefinition(provider);
|
|
393
|
+
const entry = getRuntimeState().providers?.[provider];
|
|
394
|
+
return {
|
|
395
|
+
provider,
|
|
396
|
+
configuredBaseUrl: entry?.baseUrl || getDefaultBaseUrlForProvider(provider),
|
|
397
|
+
running: Boolean(entry?.pid && isProcessRunning(entry.pid)),
|
|
398
|
+
pid: entry?.pid,
|
|
399
|
+
command: entry?.command,
|
|
400
|
+
logPath: entry?.logPath,
|
|
401
|
+
startedAt: entry?.startedAt,
|
|
402
|
+
managed: Boolean(definition.managedProxy),
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
export function listProxyRuntimeStatuses() {
|
|
406
|
+
return Object.keys(getRuntimeState().providers ?? {}).map((provider) => getProxyRuntimeStatus(provider));
|
|
407
|
+
}
|
|
408
|
+
async function waitForModels(provider, apiKey, baseUrl, timeoutMs) {
|
|
409
|
+
const deadline = Date.now() + timeoutMs;
|
|
410
|
+
while (Date.now() < deadline) {
|
|
411
|
+
const models = await fetchAvailableModels(provider, apiKey, baseUrl);
|
|
412
|
+
if (models.length > 0) {
|
|
413
|
+
return models;
|
|
414
|
+
}
|
|
415
|
+
await delay(1_000);
|
|
416
|
+
}
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
function getRuntimeState() {
|
|
420
|
+
const paths = getYagrPaths();
|
|
421
|
+
if (!fs.existsSync(paths.proxyRuntimeStatePath)) {
|
|
422
|
+
return {};
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
return JSON.parse(fs.readFileSync(paths.proxyRuntimeStatePath, 'utf-8'));
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
return {};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function updateRuntimeState(updater) {
|
|
432
|
+
const paths = getYagrPaths();
|
|
433
|
+
fs.mkdirSync(paths.proxyRuntimeDir, { recursive: true });
|
|
434
|
+
fs.writeFileSync(paths.proxyRuntimeStatePath, JSON.stringify(updater(getRuntimeState()), null, 2));
|
|
435
|
+
}
|
|
436
|
+
function isProcessRunning(pid) {
|
|
437
|
+
try {
|
|
438
|
+
process.kill(pid, 0);
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
async function withTimeout(promise, timeoutMs) {
|
|
446
|
+
return await new Promise((resolve, reject) => {
|
|
447
|
+
const timer = setTimeout(() => reject(new Error('timeout')), timeoutMs);
|
|
448
|
+
promise
|
|
449
|
+
.then((value) => {
|
|
450
|
+
clearTimeout(timer);
|
|
451
|
+
resolve(value);
|
|
452
|
+
})
|
|
453
|
+
.catch((error) => {
|
|
454
|
+
clearTimeout(timer);
|
|
455
|
+
reject(error);
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
function delay(ms) {
|
|
460
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=proxy-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-runtime.js","sourceRoot":"","sources":["../../src/llm/proxy-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-model-policy.d.ts","sourceRoot":"","sources":["../../src/llm/test-model-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAehE,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAErF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const TEST_MODEL_PREFERENCES = {
|
|
2
|
+
openai: ['gpt-4.1-mini', 'gpt-5-mini', 'gpt-4o-mini', 'gpt-4o'],
|
|
3
|
+
anthropic: ['claude-3-haiku-20240307', 'claude-sonnet-4-5'],
|
|
4
|
+
google: ['gemini-2.5-flash', 'gemini-2.0-flash', 'gemini-2.5-pro'],
|
|
5
|
+
groq: ['llama-3.1-8b-instant', 'llama-3.3-70b-versatile', 'allam-2-7b'],
|
|
6
|
+
mistral: ['ministral-8b-latest', 'mistral-small-latest', 'mistral-large-latest'],
|
|
7
|
+
openrouter: ['google/gemini-3-flash-preview', 'openai/gpt-4.1-mini', 'openai/gpt-4o-mini'],
|
|
8
|
+
'openai-proxy': ['gpt-5.1-codex-mini', 'gpt-5.1'],
|
|
9
|
+
'anthropic-proxy': ['claude-3-haiku-20240307', 'claude-sonnet-4-5'],
|
|
10
|
+
'google-proxy': ['gemini-3-flash-preview', 'gemini-2.5-flash', 'gemini-2.5-pro'],
|
|
11
|
+
'copilot-proxy': ['gpt-4.1'],
|
|
12
|
+
};
|
|
13
|
+
export function getProviderTestModelPreferences(provider) {
|
|
14
|
+
return [...(TEST_MODEL_PREFERENCES[provider] ?? [])];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=test-model-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-model-policy.js","sourceRoot":"","sources":["../../src/llm/test-model-policy.ts"],"names":[],"mappings":"AAEA,MAAM,sBAAsB,GAAiD;IAC3E,MAAM,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC/D,SAAS,EAAE,CAAC,yBAAyB,EAAE,mBAAmB,CAAC;IAC3D,MAAM,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;IAClE,IAAI,EAAE,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,YAAY,CAAC;IACvE,OAAO,EAAE,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,sBAAsB,CAAC;IAChF,UAAU,EAAE,CAAC,+BAA+B,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;IAC1F,cAAc,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC;IACjD,iBAAiB,EAAE,CAAC,yBAAyB,EAAE,mBAAmB,CAAC;IACnE,cAAc,EAAE,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;IAChF,eAAe,EAAE,CAAC,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,QAA2B;IACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ManagedN8nOwnerCredentialService, type ManagedN8nOwnerCredentials } from './owner-credentials.js';
|
|
2
|
+
export interface SilentManagedN8nBootstrapResult {
|
|
3
|
+
mode: 'silent' | 'assisted';
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
ownerCredentials?: ManagedN8nOwnerCredentials;
|
|
6
|
+
reason?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function bootstrapManagedLocalN8n(options: {
|
|
9
|
+
url: string;
|
|
10
|
+
ownerCredentialService?: ManagedN8nOwnerCredentialService;
|
|
11
|
+
}): Promise<SilentManagedN8nBootstrapResult>;
|
|
12
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/n8n-local/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,KAAK,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAY3G,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB,CAAC,EAAE,gCAAgC,CAAC;CAC3D,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAqC3C"}
|