@yagr/agent 0.2.12 → 0.2.13
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/agent.d.ts +16 -12
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +40 -33
- package/dist/agent.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -15
- package/dist/cli.js.map +1 -1
- package/dist/config/n8n-config-service.d.ts +16 -0
- package/dist/config/n8n-config-service.d.ts.map +1 -1
- package/dist/config/n8n-config-service.js +32 -1
- package/dist/config/n8n-config-service.js.map +1 -1
- package/dist/config/yagr-config-service.d.ts +16 -0
- package/dist/config/yagr-config-service.d.ts.map +1 -1
- package/dist/config/yagr-config-service.js.map +1 -1
- package/dist/engine/engine.d.ts +15 -1
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/gateway/cli.d.ts +2 -2
- package/dist/gateway/cli.d.ts.map +1 -1
- package/dist/gateway/cli.js +6 -3
- package/dist/gateway/cli.js.map +1 -1
- package/dist/gateway/format-message.d.ts +8 -4
- package/dist/gateway/format-message.d.ts.map +1 -1
- package/dist/gateway/format-message.js +10 -5
- package/dist/gateway/format-message.js.map +1 -1
- package/dist/gateway/interactive-ui.d.ts +2 -2
- package/dist/gateway/interactive-ui.d.ts.map +1 -1
- package/dist/gateway/interactive-ui.js +87 -82
- package/dist/gateway/interactive-ui.js.map +1 -1
- package/dist/gateway/manager.d.ts +6 -6
- package/dist/gateway/manager.d.ts.map +1 -1
- package/dist/gateway/manager.js.map +1 -1
- package/dist/gateway/telegram.d.ts +5 -5
- package/dist/gateway/telegram.d.ts.map +1 -1
- package/dist/gateway/telegram.js +100 -101
- package/dist/gateway/telegram.js.map +1 -1
- package/dist/gateway/webui.d.ts +52 -5
- package/dist/gateway/webui.d.ts.map +1 -1
- package/dist/gateway/webui.js +107 -235
- package/dist/gateway/webui.js.map +1 -1
- package/dist/gateway/workflow-diagram.d.ts +19 -0
- package/dist/gateway/workflow-diagram.d.ts.map +1 -0
- package/dist/gateway/workflow-diagram.js +124 -0
- package/dist/gateway/workflow-diagram.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic-account.d.ts +2 -1
- package/dist/llm/anthropic-account.d.ts.map +1 -1
- package/dist/llm/anthropic-account.js +1 -1
- package/dist/llm/anthropic-account.js.map +1 -1
- package/dist/llm/capability-resolver.d.ts +10 -0
- package/dist/llm/capability-resolver.d.ts.map +1 -0
- package/dist/llm/capability-resolver.js +93 -0
- package/dist/llm/capability-resolver.js.map +1 -0
- package/dist/llm/copilot-account.d.ts +2 -1
- package/dist/llm/copilot-account.d.ts.map +1 -1
- package/dist/llm/copilot-account.js +323 -32
- package/dist/llm/copilot-account.js.map +1 -1
- package/dist/llm/create-language-model.d.ts.map +1 -1
- package/dist/llm/create-language-model.js +12 -171
- package/dist/llm/create-language-model.js.map +1 -1
- package/dist/llm/model-capabilities.d.ts +32 -0
- package/dist/llm/model-capabilities.d.ts.map +1 -0
- package/dist/llm/model-capabilities.js +144 -0
- package/dist/llm/model-capabilities.js.map +1 -0
- package/dist/llm/openai-account.d.ts +2 -1
- package/dist/llm/openai-account.d.ts.map +1 -1
- package/dist/llm/openai-account.js +29 -17
- package/dist/llm/openai-account.js.map +1 -1
- package/dist/llm/provider-discovery.d.ts +1 -1
- package/dist/llm/provider-discovery.d.ts.map +1 -1
- package/dist/llm/provider-discovery.js +3 -34
- package/dist/llm/provider-discovery.js.map +1 -1
- package/dist/llm/provider-metadata.d.ts +27 -0
- package/dist/llm/provider-metadata.d.ts.map +1 -0
- package/dist/llm/provider-metadata.js +327 -0
- package/dist/llm/provider-metadata.js.map +1 -0
- package/dist/llm/provider-plugin.d.ts +41 -0
- package/dist/llm/provider-plugin.d.ts.map +1 -0
- package/dist/llm/provider-plugin.js +429 -0
- package/dist/llm/provider-plugin.js.map +1 -0
- package/dist/llm/provider-registry.d.ts +5 -2
- package/dist/llm/provider-registry.d.ts.map +1 -1
- package/dist/llm/provider-registry.js +7 -25
- package/dist/llm/provider-registry.js.map +1 -1
- package/dist/llm/proxy-runtime.d.ts.map +1 -1
- package/dist/llm/proxy-runtime.js +16 -63
- package/dist/llm/proxy-runtime.js.map +1 -1
- package/dist/llm/test-model-policy.d.ts.map +1 -1
- package/dist/llm/test-model-policy.js +8 -10
- package/dist/llm/test-model-policy.js.map +1 -1
- package/dist/llm/tool-schema.d.ts +4 -0
- package/dist/llm/tool-schema.d.ts.map +1 -0
- package/dist/llm/tool-schema.js +80 -0
- package/dist/llm/tool-schema.js.map +1 -0
- package/dist/prompt/build-system-prompt.d.ts +3 -3
- package/dist/prompt/build-system-prompt.d.ts.map +1 -1
- package/dist/prompt/build-system-prompt.js +2 -0
- package/dist/prompt/build-system-prompt.js.map +1 -1
- package/dist/runtime/completion-gate.d.ts +4 -0
- package/dist/runtime/completion-gate.d.ts.map +1 -1
- package/dist/runtime/completion-gate.js +13 -2
- package/dist/runtime/completion-gate.js.map +1 -1
- package/dist/runtime/context-compaction.d.ts.map +1 -1
- package/dist/runtime/context-compaction.js +6 -5
- package/dist/runtime/context-compaction.js.map +1 -1
- package/dist/runtime/outcome.d.ts +3 -0
- package/dist/runtime/outcome.d.ts.map +1 -1
- package/dist/runtime/outcome.js +40 -3
- package/dist/runtime/outcome.js.map +1 -1
- package/dist/runtime/policy-hooks.d.ts +4 -0
- package/dist/runtime/policy-hooks.d.ts.map +1 -1
- package/dist/runtime/policy-hooks.js +137 -0
- package/dist/runtime/policy-hooks.js.map +1 -1
- package/dist/runtime/required-actions.d.ts +5 -0
- package/dist/runtime/required-actions.d.ts.map +1 -1
- package/dist/runtime/required-actions.js +22 -4
- package/dist/runtime/required-actions.js.map +1 -1
- package/dist/runtime/run-engine.d.ts +6 -3
- package/dist/runtime/run-engine.d.ts.map +1 -1
- package/dist/runtime/run-engine.js +699 -97
- package/dist/runtime/run-engine.js.map +1 -1
- package/dist/runtime/tool-runtime-strategy.d.ts +29 -0
- package/dist/runtime/tool-runtime-strategy.d.ts.map +1 -0
- package/dist/runtime/tool-runtime-strategy.js +102 -0
- package/dist/runtime/tool-runtime-strategy.js.map +1 -0
- package/dist/runtime/user-visible-updates.d.ts +12 -0
- package/dist/runtime/user-visible-updates.d.ts.map +1 -0
- package/dist/runtime/user-visible-updates.js +93 -0
- package/dist/runtime/user-visible-updates.js.map +1 -0
- package/dist/setup/application-services.d.ts +199 -0
- package/dist/setup/application-services.d.ts.map +1 -0
- package/dist/setup/application-services.js +468 -0
- package/dist/setup/application-services.js.map +1 -0
- package/dist/setup/setup-wizard.d.ts +1 -0
- package/dist/setup/setup-wizard.d.ts.map +1 -1
- package/dist/setup/setup-wizard.js +11 -13
- package/dist/setup/setup-wizard.js.map +1 -1
- package/dist/setup/status.d.ts +21 -0
- package/dist/setup/status.d.ts.map +1 -0
- package/dist/setup/status.js +47 -0
- package/dist/setup/status.js.map +1 -0
- package/dist/setup.d.ts +3 -14
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +30 -256
- package/dist/setup.js.map +1 -1
- package/dist/tools/build-tools.d.ts +160 -18
- package/dist/tools/build-tools.d.ts.map +1 -1
- package/dist/tools/build-tools.js +11 -1
- package/dist/tools/build-tools.js.map +1 -1
- package/dist/tools/deploy.d.ts +2 -2
- package/dist/tools/deploy.d.ts.map +1 -1
- package/dist/tools/deploy.js.map +1 -1
- package/dist/tools/generate-workflow.d.ts +9 -9
- package/dist/tools/generate-workflow.d.ts.map +1 -1
- package/dist/tools/generate-workflow.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-workflows.d.ts +2 -2
- package/dist/tools/list-workflows.d.ts.map +1 -1
- package/dist/tools/list-workflows.js.map +1 -1
- package/dist/tools/manage-workflow.d.ts +2 -2
- package/dist/tools/manage-workflow.d.ts.map +1 -1
- package/dist/tools/manage-workflow.js.map +1 -1
- package/dist/tools/n8nac.d.ts +121 -4
- package/dist/tools/n8nac.d.ts.map +1 -1
- package/dist/tools/n8nac.js +183 -38
- package/dist/tools/n8nac.js.map +1 -1
- package/dist/tools/node-info.d.ts +2 -2
- package/dist/tools/node-info.d.ts.map +1 -1
- package/dist/tools/node-info.js.map +1 -1
- package/dist/tools/observer.d.ts +6 -35
- package/dist/tools/observer.d.ts.map +1 -1
- package/dist/tools/observer.js +18 -0
- package/dist/tools/observer.js.map +1 -1
- package/dist/tools/present-workflow-result.d.ts +1 -0
- package/dist/tools/present-workflow-result.d.ts.map +1 -1
- package/dist/tools/present-workflow-result.js +24 -5
- package/dist/tools/present-workflow-result.js.map +1 -1
- package/dist/tools/request-required-action.d.ts +7 -3
- package/dist/tools/request-required-action.d.ts.map +1 -1
- package/dist/tools/request-required-action.js +5 -3
- package/dist/tools/request-required-action.js.map +1 -1
- package/dist/tools/search-nodes.d.ts +2 -2
- package/dist/tools/search-nodes.d.ts.map +1 -1
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/search-templates.d.ts +2 -2
- package/dist/tools/search-templates.d.ts.map +1 -1
- package/dist/tools/search-templates.js.map +1 -1
- package/dist/tools/toolsets.d.ts +11 -0
- package/dist/tools/toolsets.d.ts.map +1 -0
- package/dist/tools/toolsets.js +49 -0
- package/dist/tools/toolsets.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -2
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/write-workspace-file.d.ts +25 -9
- package/dist/tools/write-workspace-file.d.ts.map +1 -1
- package/dist/tools/write-workspace-file.js +27 -4
- package/dist/tools/write-workspace-file.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webui/app.js +97 -101
- package/dist/webui/app.js.map +4 -4
- package/package.json +6 -5
- package/dist/llm/google-account.d.ts +0 -31
- package/dist/llm/google-account.d.ts.map +0 -1
- package/dist/llm/google-account.js +0 -851
- package/dist/llm/google-account.js.map +0 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { N8nApiClient, type IProject } from 'n8nac';
|
|
2
|
+
import { type YagrConfigStoreLike, type YagrTelegramLinkedChat } from '../config/yagr-config-service.js';
|
|
3
|
+
import { type YagrModelProvider } from '../llm/provider-registry.js';
|
|
4
|
+
import type { GatewaySurface } from '../gateway/types.js';
|
|
5
|
+
import { type YagrSetupStatus } from './status.js';
|
|
6
|
+
type N8nProjectClient = Pick<N8nApiClient, 'testConnection' | 'getProjects'>;
|
|
7
|
+
interface SetupApplicationServiceDependencies {
|
|
8
|
+
createN8nClient?: (credentials: {
|
|
9
|
+
host: string;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
}) => N8nProjectClient;
|
|
12
|
+
ensureWorkspaceFiles?: (workflowDir: string) => void;
|
|
13
|
+
refreshAiContext?: (credentials: {
|
|
14
|
+
host: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
resolveTelegramIdentity?: (botToken: string) => Promise<{
|
|
18
|
+
username: string;
|
|
19
|
+
firstName: string;
|
|
20
|
+
}>;
|
|
21
|
+
createOnboardingToken?: () => string;
|
|
22
|
+
fetchAvailableModels?: (provider: YagrModelProvider, apiKey?: string, baseUrl?: string) => Promise<string[]>;
|
|
23
|
+
}
|
|
24
|
+
interface YagrN8nConfigStoreLike {
|
|
25
|
+
getLocalConfig(): {
|
|
26
|
+
host?: string;
|
|
27
|
+
syncFolder?: string;
|
|
28
|
+
projectId?: string;
|
|
29
|
+
projectName?: string;
|
|
30
|
+
instanceIdentifier?: string;
|
|
31
|
+
customNodesPath?: string;
|
|
32
|
+
runtimeSource?: 'managed-local' | 'external';
|
|
33
|
+
};
|
|
34
|
+
getApiKey(host: string): string | undefined;
|
|
35
|
+
saveApiKey(host: string, apiKey: string): void;
|
|
36
|
+
saveBootstrapState(host: string, syncFolder?: string, runtimeSource?: 'managed-local' | 'external'): void;
|
|
37
|
+
getOrCreateInstanceIdentifier(host: string): Promise<string>;
|
|
38
|
+
saveLocalConfig(config: {
|
|
39
|
+
host?: string;
|
|
40
|
+
syncFolder?: string;
|
|
41
|
+
projectId?: string;
|
|
42
|
+
projectName?: string;
|
|
43
|
+
instanceIdentifier?: string;
|
|
44
|
+
customNodesPath?: string;
|
|
45
|
+
runtimeSource?: 'managed-local' | 'external';
|
|
46
|
+
}): void;
|
|
47
|
+
}
|
|
48
|
+
export declare class YagrSetupApplicationService {
|
|
49
|
+
private readonly yagrConfigService;
|
|
50
|
+
private readonly n8nConfigService;
|
|
51
|
+
private readonly createN8nClient;
|
|
52
|
+
private readonly ensureWorkspaceFiles;
|
|
53
|
+
private readonly refreshAiContextRunner;
|
|
54
|
+
private readonly resolveTelegramIdentity;
|
|
55
|
+
private readonly createOnboardingToken;
|
|
56
|
+
private readonly fetchAvailableModelsRunner;
|
|
57
|
+
constructor(yagrConfigService: YagrConfigStoreLike, n8nConfigService: YagrN8nConfigStoreLike, dependencies?: SetupApplicationServiceDependencies);
|
|
58
|
+
getLlmDefaults(): {
|
|
59
|
+
provider: YagrModelProvider | undefined;
|
|
60
|
+
getApiKey: (prov: YagrModelProvider) => string | undefined;
|
|
61
|
+
getDefaultModel: (prov: YagrModelProvider) => string | undefined;
|
|
62
|
+
getBaseUrl: (prov: YagrModelProvider) => string | undefined;
|
|
63
|
+
needsBaseUrl: (prov: YagrModelProvider) => boolean;
|
|
64
|
+
};
|
|
65
|
+
prepareProvider(provider: YagrModelProvider, apiKey?: string): Promise<{
|
|
66
|
+
ready: boolean;
|
|
67
|
+
apiKey: string | undefined;
|
|
68
|
+
baseUrl: string | undefined;
|
|
69
|
+
models: string[] | undefined;
|
|
70
|
+
notes: string[];
|
|
71
|
+
error: string | undefined;
|
|
72
|
+
}>;
|
|
73
|
+
hasAccountSession(provider: YagrModelProvider): Promise<boolean>;
|
|
74
|
+
startAccountAuth(provider: YagrModelProvider): Promise<{
|
|
75
|
+
kind: "none";
|
|
76
|
+
title?: undefined;
|
|
77
|
+
instructions?: undefined;
|
|
78
|
+
placeholder?: undefined;
|
|
79
|
+
submitLabel?: undefined;
|
|
80
|
+
state?: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
kind: "input";
|
|
83
|
+
title: string;
|
|
84
|
+
instructions: string[];
|
|
85
|
+
placeholder: string;
|
|
86
|
+
submitLabel: string;
|
|
87
|
+
state?: undefined;
|
|
88
|
+
} | {
|
|
89
|
+
kind: "input";
|
|
90
|
+
title: string;
|
|
91
|
+
instructions: string[];
|
|
92
|
+
placeholder: string;
|
|
93
|
+
submitLabel: string;
|
|
94
|
+
state: string;
|
|
95
|
+
}>;
|
|
96
|
+
completeAccountAuth(provider: YagrModelProvider, input: string, state?: string): Promise<{
|
|
97
|
+
ok: boolean;
|
|
98
|
+
error?: undefined;
|
|
99
|
+
apiKey?: undefined;
|
|
100
|
+
} | {
|
|
101
|
+
ok: boolean;
|
|
102
|
+
error: string;
|
|
103
|
+
apiKey?: undefined;
|
|
104
|
+
} | {
|
|
105
|
+
ok: boolean;
|
|
106
|
+
apiKey: string;
|
|
107
|
+
error?: undefined;
|
|
108
|
+
}>;
|
|
109
|
+
fetchModels(provider: YagrModelProvider, apiKey?: string): Promise<string[]>;
|
|
110
|
+
fetchModelsForSelection(input: {
|
|
111
|
+
provider: YagrModelProvider;
|
|
112
|
+
apiKey?: string;
|
|
113
|
+
baseUrl?: string;
|
|
114
|
+
requiresApiKey: (provider: YagrModelProvider) => boolean;
|
|
115
|
+
}): Promise<string[]>;
|
|
116
|
+
getSetupStatus(options?: {
|
|
117
|
+
activeSurfaces?: GatewaySurface[];
|
|
118
|
+
}): YagrSetupStatus;
|
|
119
|
+
getSelectedN8nProjectId(): string | undefined;
|
|
120
|
+
getTelegramStatus(): {
|
|
121
|
+
configured: boolean;
|
|
122
|
+
botUsername?: string;
|
|
123
|
+
linkedChats: YagrTelegramLinkedChat[];
|
|
124
|
+
deepLink?: string;
|
|
125
|
+
};
|
|
126
|
+
getTelegramRuntimeConfig(overrideBotToken?: string): {
|
|
127
|
+
status: {
|
|
128
|
+
configured: boolean;
|
|
129
|
+
botUsername?: string;
|
|
130
|
+
linkedChats: YagrTelegramLinkedChat[];
|
|
131
|
+
deepLink?: string;
|
|
132
|
+
};
|
|
133
|
+
botToken?: string;
|
|
134
|
+
onboardingToken?: string;
|
|
135
|
+
};
|
|
136
|
+
buildWebUiSnapshot(input: {
|
|
137
|
+
activeSurfaces: GatewaySurface[];
|
|
138
|
+
webUiStatus: {
|
|
139
|
+
configured: boolean;
|
|
140
|
+
host: string;
|
|
141
|
+
port: number;
|
|
142
|
+
url: string;
|
|
143
|
+
};
|
|
144
|
+
selectableProviders: YagrModelProvider[];
|
|
145
|
+
}): Promise<Record<string, unknown>>;
|
|
146
|
+
saveLlmConfig(input: {
|
|
147
|
+
provider: YagrModelProvider;
|
|
148
|
+
apiKey?: string;
|
|
149
|
+
model: string;
|
|
150
|
+
baseUrl?: string;
|
|
151
|
+
}): void;
|
|
152
|
+
saveResolvedCliModelSelection(input: {
|
|
153
|
+
provider: YagrModelProvider;
|
|
154
|
+
model: string;
|
|
155
|
+
baseUrl?: string;
|
|
156
|
+
apiKey?: string;
|
|
157
|
+
}): void;
|
|
158
|
+
resetYagrConfig(): void;
|
|
159
|
+
getSurfaceDefaults(): {
|
|
160
|
+
surfaces: GatewaySurface[];
|
|
161
|
+
};
|
|
162
|
+
getTelegramToken(): string | undefined;
|
|
163
|
+
setupTelegram(token: string): Promise<{
|
|
164
|
+
username: string;
|
|
165
|
+
firstName: string;
|
|
166
|
+
}>;
|
|
167
|
+
saveSurfaces(input: {
|
|
168
|
+
surfaces: GatewaySurface[];
|
|
169
|
+
telegram?: {
|
|
170
|
+
token: string;
|
|
171
|
+
username: string;
|
|
172
|
+
};
|
|
173
|
+
}): void;
|
|
174
|
+
configureTelegram(botToken: string): Promise<{
|
|
175
|
+
username: string;
|
|
176
|
+
firstName: string;
|
|
177
|
+
}>;
|
|
178
|
+
resetTelegram(): void;
|
|
179
|
+
getLinkedTelegramChats(): YagrTelegramLinkedChat[];
|
|
180
|
+
isTelegramChatLinked(chatId: string): boolean;
|
|
181
|
+
linkTelegramChat(chat: YagrTelegramLinkedChat): void;
|
|
182
|
+
unlinkTelegramChat(chatId: string): void;
|
|
183
|
+
touchTelegramChat(chatId: string, userId?: number, username?: string, firstName?: string): void;
|
|
184
|
+
fetchN8nProjects(host: string, apiKeyOverride?: string): Promise<IProject[]>;
|
|
185
|
+
saveN8nConfig(input: {
|
|
186
|
+
host: string;
|
|
187
|
+
apiKey?: string;
|
|
188
|
+
projectId: string;
|
|
189
|
+
syncFolder: string;
|
|
190
|
+
runtimeSource?: 'managed-local' | 'external';
|
|
191
|
+
}): Promise<string | undefined>;
|
|
192
|
+
refreshN8nWorkspaceInstructionsFromSavedConfig(): Promise<boolean>;
|
|
193
|
+
}
|
|
194
|
+
export declare function refreshAiContext(credentials: {
|
|
195
|
+
host: string;
|
|
196
|
+
apiKey: string;
|
|
197
|
+
}): Promise<void>;
|
|
198
|
+
export {};
|
|
199
|
+
//# sourceMappingURL=application-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-services.d.ts","sourceRoot":"","sources":["../../src/setup/application-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { N8nApiClient, WorkspaceSetupService, getDisplayProjectName } from 'n8nac';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { UpdateAiCommand } from 'n8nac/dist/commands/init-ai.js';
|
|
5
|
+
import { normalizeGatewaySurfaces, } from '../config/yagr-config-service.js';
|
|
6
|
+
import { resolveWorkflowDir } from '../config/n8n-config-service.js';
|
|
7
|
+
import { getYagrN8nWorkspaceDir } from '../config/yagr-home.js';
|
|
8
|
+
import { getDefaultBaseUrlForProvider, providerNeedsBaseUrlInput, } from '../llm/provider-registry.js';
|
|
9
|
+
import { prepareProviderRuntime } from '../llm/proxy-runtime.js';
|
|
10
|
+
import { fetchAvailableModels } from '../llm/provider-discovery.js';
|
|
11
|
+
import { resolveModelProvider } from '../llm/create-language-model.js';
|
|
12
|
+
import { beginGitHubCopilotAuth, completeGitHubCopilotAuth, ensureGitHubCopilotSession } from '../llm/copilot-account.js';
|
|
13
|
+
import { beginCodexAuth, completeCodexAuth, ensureOpenAiAccountSession } from '../llm/openai-account.js';
|
|
14
|
+
import { getYagrSetupStatus } from './status.js';
|
|
15
|
+
function defaultCreateN8nClient(credentials) {
|
|
16
|
+
return new N8nApiClient(credentials);
|
|
17
|
+
}
|
|
18
|
+
function defaultCreateOnboardingToken() {
|
|
19
|
+
return randomBytes(18).toString('base64url');
|
|
20
|
+
}
|
|
21
|
+
function buildTelegramDeepLink(botUsername, onboardingToken) {
|
|
22
|
+
return `https://t.me/${botUsername}?start=${onboardingToken}`;
|
|
23
|
+
}
|
|
24
|
+
async function defaultRefreshAiContext(credentials) {
|
|
25
|
+
const updateAi = new UpdateAiCommand(new Command());
|
|
26
|
+
const previousCwd = process.cwd();
|
|
27
|
+
try {
|
|
28
|
+
process.chdir(getYagrN8nWorkspaceDir());
|
|
29
|
+
await updateAi.run({}, credentials);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
process.chdir(previousCwd);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class YagrSetupApplicationService {
|
|
36
|
+
yagrConfigService;
|
|
37
|
+
n8nConfigService;
|
|
38
|
+
createN8nClient;
|
|
39
|
+
ensureWorkspaceFiles;
|
|
40
|
+
refreshAiContextRunner;
|
|
41
|
+
resolveTelegramIdentity;
|
|
42
|
+
createOnboardingToken;
|
|
43
|
+
fetchAvailableModelsRunner;
|
|
44
|
+
constructor(yagrConfigService, n8nConfigService, dependencies = {}) {
|
|
45
|
+
this.yagrConfigService = yagrConfigService;
|
|
46
|
+
this.n8nConfigService = n8nConfigService;
|
|
47
|
+
this.createN8nClient = dependencies.createN8nClient ?? defaultCreateN8nClient;
|
|
48
|
+
this.ensureWorkspaceFiles = dependencies.ensureWorkspaceFiles ?? WorkspaceSetupService.ensureWorkspaceFiles;
|
|
49
|
+
this.refreshAiContextRunner = dependencies.refreshAiContext ?? defaultRefreshAiContext;
|
|
50
|
+
this.resolveTelegramIdentity = dependencies.resolveTelegramIdentity ?? (async () => {
|
|
51
|
+
throw new Error('Telegram identity resolver is not configured.');
|
|
52
|
+
});
|
|
53
|
+
this.createOnboardingToken = dependencies.createOnboardingToken ?? defaultCreateOnboardingToken;
|
|
54
|
+
this.fetchAvailableModelsRunner = dependencies.fetchAvailableModels ?? fetchAvailableModels;
|
|
55
|
+
}
|
|
56
|
+
getLlmDefaults() {
|
|
57
|
+
const cfg = this.yagrConfigService.getLocalConfig();
|
|
58
|
+
let initialProvider = cfg.provider;
|
|
59
|
+
if (!initialProvider) {
|
|
60
|
+
try {
|
|
61
|
+
initialProvider = resolveModelProvider(undefined, this.yagrConfigService);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
initialProvider = undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
provider: initialProvider,
|
|
69
|
+
getApiKey: (prov) => this.yagrConfigService.getApiKey(prov),
|
|
70
|
+
getDefaultModel: (prov) => cfg.provider === prov && cfg.model ? cfg.model : undefined,
|
|
71
|
+
getBaseUrl: (prov) => cfg.provider === prov ? cfg.baseUrl : getDefaultBaseUrlForProvider(prov),
|
|
72
|
+
needsBaseUrl: (prov) => providerNeedsBaseUrlInput(prov),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async prepareProvider(provider, apiKey) {
|
|
76
|
+
const cfg = this.yagrConfigService.getLocalConfig();
|
|
77
|
+
const prepared = await prepareProviderRuntime(provider, {
|
|
78
|
+
apiKey,
|
|
79
|
+
baseUrl: cfg.provider === provider ? cfg.baseUrl : getDefaultBaseUrlForProvider(provider),
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
ready: prepared.ready,
|
|
83
|
+
apiKey: prepared.runtime?.apiKey,
|
|
84
|
+
baseUrl: prepared.runtime?.baseUrl,
|
|
85
|
+
models: prepared.runtime?.models,
|
|
86
|
+
notes: prepared.notes,
|
|
87
|
+
error: prepared.reason,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async hasAccountSession(provider) {
|
|
91
|
+
if (provider === 'copilot-proxy') {
|
|
92
|
+
return (await ensureGitHubCopilotSession()) !== undefined;
|
|
93
|
+
}
|
|
94
|
+
if (provider === 'openai-proxy') {
|
|
95
|
+
return (await ensureOpenAiAccountSession()) !== undefined;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
async startAccountAuth(provider) {
|
|
100
|
+
if (provider === 'openai-proxy') {
|
|
101
|
+
const session = await ensureOpenAiAccountSession();
|
|
102
|
+
if (session) {
|
|
103
|
+
return { kind: 'none' };
|
|
104
|
+
}
|
|
105
|
+
const challenge = await beginCodexAuth();
|
|
106
|
+
const callbackHint = challenge.callbackServerStarted
|
|
107
|
+
? 'After signing in, Yagr captures the callback automatically.'
|
|
108
|
+
: 'If the browser does not open, copy the URL above and visit it manually.';
|
|
109
|
+
return {
|
|
110
|
+
kind: 'input',
|
|
111
|
+
title: 'Connect OpenAI account (ChatGPT Plus)',
|
|
112
|
+
instructions: [
|
|
113
|
+
'Open this URL in your browser and sign in with your ChatGPT account:',
|
|
114
|
+
challenge.authUrl,
|
|
115
|
+
'This uses your ChatGPT subscription — no API credits are consumed.',
|
|
116
|
+
callbackHint,
|
|
117
|
+
],
|
|
118
|
+
placeholder: challenge.callbackServerStarted
|
|
119
|
+
? 'Press Enter after signing in'
|
|
120
|
+
: 'http://localhost:1455/auth/callback?code=...',
|
|
121
|
+
submitLabel: challenge.callbackServerStarted ? 'Continue after sign-in' : 'Submit redirect URL',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (provider === 'anthropic-proxy') {
|
|
125
|
+
return {
|
|
126
|
+
kind: 'input',
|
|
127
|
+
title: 'Connect Claude token',
|
|
128
|
+
instructions: [
|
|
129
|
+
'On a machine where Claude CLI is installed and logged in, run:',
|
|
130
|
+
'claude setup-token',
|
|
131
|
+
'Paste the generated setup-token below.',
|
|
132
|
+
],
|
|
133
|
+
placeholder: 'Paste setup-token',
|
|
134
|
+
submitLabel: 'Continue with setup-token',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (provider === 'copilot-proxy') {
|
|
138
|
+
const session = await ensureGitHubCopilotSession();
|
|
139
|
+
if (session) {
|
|
140
|
+
return { kind: 'none' };
|
|
141
|
+
}
|
|
142
|
+
const challenge = await beginGitHubCopilotAuth();
|
|
143
|
+
return {
|
|
144
|
+
kind: 'input',
|
|
145
|
+
title: 'Complete GitHub Copilot OAuth',
|
|
146
|
+
instructions: [
|
|
147
|
+
`Open: ${challenge.verificationUri}`,
|
|
148
|
+
`Enter code: ${challenge.userCode}`,
|
|
149
|
+
'Authorize GitHub Copilot in your browser, then press Enter below to continue.',
|
|
150
|
+
],
|
|
151
|
+
placeholder: 'Press Enter after browser authorization',
|
|
152
|
+
submitLabel: 'Continue after authorization',
|
|
153
|
+
state: JSON.stringify(challenge),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return { kind: 'none' };
|
|
157
|
+
}
|
|
158
|
+
async completeAccountAuth(provider, input, state) {
|
|
159
|
+
if (provider === 'openai-proxy') {
|
|
160
|
+
await completeCodexAuth();
|
|
161
|
+
return { ok: true };
|
|
162
|
+
}
|
|
163
|
+
if (provider === 'copilot-proxy') {
|
|
164
|
+
if (!state) {
|
|
165
|
+
return { ok: false, error: 'GitHub Copilot device flow state is missing.' };
|
|
166
|
+
}
|
|
167
|
+
const challenge = JSON.parse(state);
|
|
168
|
+
await completeGitHubCopilotAuth(challenge);
|
|
169
|
+
return { ok: true };
|
|
170
|
+
}
|
|
171
|
+
if (provider === 'anthropic-proxy') {
|
|
172
|
+
const credential = input.trim();
|
|
173
|
+
if (!credential) {
|
|
174
|
+
return { ok: false, error: 'Paste a Claude setup-token.' };
|
|
175
|
+
}
|
|
176
|
+
return { ok: true, apiKey: credential };
|
|
177
|
+
}
|
|
178
|
+
return { ok: true };
|
|
179
|
+
}
|
|
180
|
+
async fetchModels(provider, apiKey) {
|
|
181
|
+
const cfg = this.yagrConfigService.getLocalConfig();
|
|
182
|
+
const baseUrl = cfg.provider === provider ? cfg.baseUrl : getDefaultBaseUrlForProvider(provider);
|
|
183
|
+
return this.fetchAvailableModelsRunner(provider, apiKey, baseUrl);
|
|
184
|
+
}
|
|
185
|
+
async fetchModelsForSelection(input) {
|
|
186
|
+
const configuredLlm = this.yagrConfigService.getLocalConfig();
|
|
187
|
+
const apiKey = input.apiKey ?? this.yagrConfigService.getApiKey(input.provider);
|
|
188
|
+
if (input.requiresApiKey(input.provider) && !apiKey) {
|
|
189
|
+
throw new Error(`No API key available for ${input.provider}. Save one first.`);
|
|
190
|
+
}
|
|
191
|
+
const baseUrl = input.baseUrl ?? (configuredLlm.provider === input.provider ? configuredLlm.baseUrl : undefined);
|
|
192
|
+
return this.fetchAvailableModelsRunner(input.provider, apiKey, baseUrl);
|
|
193
|
+
}
|
|
194
|
+
getSetupStatus(options = {}) {
|
|
195
|
+
return getYagrSetupStatus(this.yagrConfigService, this.n8nConfigService, options);
|
|
196
|
+
}
|
|
197
|
+
getSelectedN8nProjectId() {
|
|
198
|
+
return this.n8nConfigService.getLocalConfig().projectId;
|
|
199
|
+
}
|
|
200
|
+
getTelegramStatus() {
|
|
201
|
+
const localConfig = this.yagrConfigService.getLocalConfig();
|
|
202
|
+
const telegram = localConfig.telegram;
|
|
203
|
+
const botToken = this.yagrConfigService.getTelegramBotToken();
|
|
204
|
+
const linkedChats = telegram?.linkedChats ?? [];
|
|
205
|
+
const deepLink = telegram?.botUsername && telegram.onboardingToken
|
|
206
|
+
? buildTelegramDeepLink(telegram.botUsername, telegram.onboardingToken)
|
|
207
|
+
: undefined;
|
|
208
|
+
return {
|
|
209
|
+
configured: Boolean(botToken && telegram?.botUsername && telegram?.onboardingToken),
|
|
210
|
+
botUsername: telegram?.botUsername,
|
|
211
|
+
linkedChats,
|
|
212
|
+
deepLink,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
getTelegramRuntimeConfig(overrideBotToken) {
|
|
216
|
+
const status = this.getTelegramStatus();
|
|
217
|
+
const localConfig = this.yagrConfigService.getLocalConfig();
|
|
218
|
+
return {
|
|
219
|
+
status,
|
|
220
|
+
botToken: overrideBotToken ?? this.yagrConfigService.getTelegramBotToken(),
|
|
221
|
+
onboardingToken: localConfig.telegram?.onboardingToken,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async buildWebUiSnapshot(input) {
|
|
225
|
+
const n8nConfig = this.n8nConfigService.getLocalConfig();
|
|
226
|
+
const setupStatus = this.getSetupStatus({ activeSurfaces: input.activeSurfaces });
|
|
227
|
+
const yagrConfig = this.yagrConfigService.getLocalConfig();
|
|
228
|
+
const telegramStatus = this.getTelegramStatus();
|
|
229
|
+
const enabledSurfaces = Array.from(new Set([...this.yagrConfigService.getEnabledGatewaySurfaces(), ...input.activeSurfaces]));
|
|
230
|
+
const startableSurfaces = enabledSurfaces.filter((surface) => surface === 'webui' || (surface === 'telegram' && telegramStatus.configured));
|
|
231
|
+
let availableModels = [];
|
|
232
|
+
if (yagrConfig.provider) {
|
|
233
|
+
const apiKey = this.yagrConfigService.getApiKey(yagrConfig.provider);
|
|
234
|
+
try {
|
|
235
|
+
availableModels = await this.fetchModels(yagrConfig.provider, apiKey);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
availableModels = [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
setupStatus,
|
|
243
|
+
gatewayStatus: {
|
|
244
|
+
enabledSurfaces,
|
|
245
|
+
startableSurfaces,
|
|
246
|
+
},
|
|
247
|
+
telegram: telegramStatus,
|
|
248
|
+
webui: input.webUiStatus,
|
|
249
|
+
yagr: {
|
|
250
|
+
provider: yagrConfig.provider,
|
|
251
|
+
model: yagrConfig.model,
|
|
252
|
+
baseUrl: yagrConfig.baseUrl,
|
|
253
|
+
providers: input.selectableProviders.map((provider) => ({
|
|
254
|
+
provider,
|
|
255
|
+
apiKeyStored: Boolean(this.yagrConfigService.getApiKey(provider)),
|
|
256
|
+
})),
|
|
257
|
+
},
|
|
258
|
+
n8n: {
|
|
259
|
+
host: n8nConfig.host,
|
|
260
|
+
syncFolder: n8nConfig.syncFolder,
|
|
261
|
+
projectId: n8nConfig.projectId,
|
|
262
|
+
projectName: n8nConfig.projectName,
|
|
263
|
+
apiKeyStored: Boolean(n8nConfig.host && this.n8nConfigService.getApiKey(n8nConfig.host)),
|
|
264
|
+
projects: n8nConfig.projectId && n8nConfig.projectName ? [{ id: n8nConfig.projectId, name: n8nConfig.projectName }] : [],
|
|
265
|
+
},
|
|
266
|
+
availableModels,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
saveLlmConfig(input) {
|
|
270
|
+
const cfg = this.yagrConfigService.getLocalConfig();
|
|
271
|
+
if (input.apiKey) {
|
|
272
|
+
this.yagrConfigService.saveApiKey(input.provider, input.apiKey);
|
|
273
|
+
}
|
|
274
|
+
this.yagrConfigService.saveLocalConfig({
|
|
275
|
+
...cfg,
|
|
276
|
+
provider: input.provider,
|
|
277
|
+
model: input.model,
|
|
278
|
+
baseUrl: input.baseUrl ?? getDefaultBaseUrlForProvider(input.provider),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
saveResolvedCliModelSelection(input) {
|
|
282
|
+
this.saveLlmConfig(input);
|
|
283
|
+
}
|
|
284
|
+
resetYagrConfig() {
|
|
285
|
+
if ('clearLocalConfig' in this.yagrConfigService && typeof this.yagrConfigService.clearLocalConfig === 'function') {
|
|
286
|
+
this.yagrConfigService.clearLocalConfig();
|
|
287
|
+
}
|
|
288
|
+
if ('clearAllApiKeys' in this.yagrConfigService && typeof this.yagrConfigService.clearAllApiKeys === 'function') {
|
|
289
|
+
this.yagrConfigService.clearAllApiKeys();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
getSurfaceDefaults() {
|
|
293
|
+
return { surfaces: this.yagrConfigService.getEnabledGatewaySurfaces() };
|
|
294
|
+
}
|
|
295
|
+
getTelegramToken() {
|
|
296
|
+
return this.yagrConfigService.getTelegramBotToken();
|
|
297
|
+
}
|
|
298
|
+
async setupTelegram(token) {
|
|
299
|
+
return this.resolveTelegramIdentity(token);
|
|
300
|
+
}
|
|
301
|
+
saveSurfaces(input) {
|
|
302
|
+
if (input.telegram) {
|
|
303
|
+
this.yagrConfigService.saveTelegramBotToken(input.telegram.token);
|
|
304
|
+
this.yagrConfigService.updateLocalConfig((cfg) => ({
|
|
305
|
+
...cfg,
|
|
306
|
+
telegram: {
|
|
307
|
+
...cfg.telegram,
|
|
308
|
+
botUsername: input.telegram?.username,
|
|
309
|
+
onboardingToken: cfg.telegram?.onboardingToken ?? this.createOnboardingToken(),
|
|
310
|
+
linkedChats: cfg.telegram?.linkedChats ?? [],
|
|
311
|
+
},
|
|
312
|
+
}));
|
|
313
|
+
this.yagrConfigService.enableGatewaySurface('telegram');
|
|
314
|
+
}
|
|
315
|
+
this.yagrConfigService.setEnabledGatewaySurfaces(input.surfaces);
|
|
316
|
+
}
|
|
317
|
+
async configureTelegram(botToken) {
|
|
318
|
+
const token = botToken.trim();
|
|
319
|
+
if (!token || !token.includes(':')) {
|
|
320
|
+
throw new Error('Enter a valid Telegram BotFather token.');
|
|
321
|
+
}
|
|
322
|
+
const identity = await this.resolveTelegramIdentity(token);
|
|
323
|
+
this.saveSurfaces({
|
|
324
|
+
surfaces: normalizeGatewaySurfaces([...this.yagrConfigService.getEnabledGatewaySurfaces(), 'telegram']),
|
|
325
|
+
telegram: {
|
|
326
|
+
token,
|
|
327
|
+
username: identity.username,
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
return identity;
|
|
331
|
+
}
|
|
332
|
+
resetTelegram() {
|
|
333
|
+
this.yagrConfigService.clearTelegramBotToken();
|
|
334
|
+
this.yagrConfigService.disableGatewaySurface('telegram');
|
|
335
|
+
this.yagrConfigService.updateLocalConfig((localConfig) => {
|
|
336
|
+
const nextConfig = { ...localConfig };
|
|
337
|
+
delete nextConfig.telegram;
|
|
338
|
+
return nextConfig;
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
getLinkedTelegramChats() {
|
|
342
|
+
return this.yagrConfigService.getLocalConfig().telegram?.linkedChats ?? [];
|
|
343
|
+
}
|
|
344
|
+
isTelegramChatLinked(chatId) {
|
|
345
|
+
return this.getLinkedTelegramChats().some((entry) => String(entry.chatId) === String(chatId));
|
|
346
|
+
}
|
|
347
|
+
linkTelegramChat(chat) {
|
|
348
|
+
const normalizedChatId = String(chat.chatId);
|
|
349
|
+
this.yagrConfigService.updateLocalConfig((localConfig) => {
|
|
350
|
+
const linkedChats = localConfig.telegram?.linkedChats ?? [];
|
|
351
|
+
const existing = linkedChats.find((entry) => String(entry.chatId) === normalizedChatId);
|
|
352
|
+
const nextLinkedChats = existing
|
|
353
|
+
? linkedChats.map((entry) => (String(entry.chatId) === normalizedChatId
|
|
354
|
+
? { ...entry, ...chat, chatId: normalizedChatId }
|
|
355
|
+
: entry))
|
|
356
|
+
: [...linkedChats, { ...chat, chatId: normalizedChatId }];
|
|
357
|
+
return {
|
|
358
|
+
...localConfig,
|
|
359
|
+
telegram: {
|
|
360
|
+
...localConfig.telegram,
|
|
361
|
+
linkedChats: nextLinkedChats,
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
unlinkTelegramChat(chatId) {
|
|
367
|
+
const normalizedChatId = String(chatId);
|
|
368
|
+
this.yagrConfigService.updateLocalConfig((localConfig) => ({
|
|
369
|
+
...localConfig,
|
|
370
|
+
telegram: {
|
|
371
|
+
...localConfig.telegram,
|
|
372
|
+
linkedChats: (localConfig.telegram?.linkedChats ?? []).filter((entry) => String(entry.chatId) !== normalizedChatId),
|
|
373
|
+
},
|
|
374
|
+
}));
|
|
375
|
+
}
|
|
376
|
+
touchTelegramChat(chatId, userId, username, firstName) {
|
|
377
|
+
const existing = this.getLinkedTelegramChats().find((entry) => String(entry.chatId) === String(chatId));
|
|
378
|
+
if (!existing) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
this.linkTelegramChat({
|
|
382
|
+
...existing,
|
|
383
|
+
chatId: String(chatId),
|
|
384
|
+
userId: userId ? String(userId) : existing.userId,
|
|
385
|
+
username: username ?? existing.username,
|
|
386
|
+
firstName: firstName ?? existing.firstName,
|
|
387
|
+
lastSeenAt: new Date().toISOString(),
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
async fetchN8nProjects(host, apiKeyOverride) {
|
|
391
|
+
const normalizedHost = host.trim();
|
|
392
|
+
if (!normalizedHost) {
|
|
393
|
+
throw new Error('n8n host is required.');
|
|
394
|
+
}
|
|
395
|
+
const apiKey = apiKeyOverride ?? this.n8nConfigService.getApiKey(normalizedHost);
|
|
396
|
+
if (!apiKey) {
|
|
397
|
+
throw new Error('No n8n API key available for that host.');
|
|
398
|
+
}
|
|
399
|
+
const client = this.createN8nClient({ host: normalizedHost, apiKey });
|
|
400
|
+
const connected = await client.testConnection();
|
|
401
|
+
if (!connected) {
|
|
402
|
+
throw new Error('Unable to connect to n8n with the provided URL and API key.');
|
|
403
|
+
}
|
|
404
|
+
return client.getProjects();
|
|
405
|
+
}
|
|
406
|
+
async saveN8nConfig(input) {
|
|
407
|
+
const host = input.host.trim();
|
|
408
|
+
const projectId = input.projectId.trim();
|
|
409
|
+
const syncFolder = input.syncFolder.trim() || 'workflows';
|
|
410
|
+
const runtimeSource = input.runtimeSource ?? 'external';
|
|
411
|
+
if (!host) {
|
|
412
|
+
throw new Error('n8n host is required.');
|
|
413
|
+
}
|
|
414
|
+
if (!projectId) {
|
|
415
|
+
throw new Error('Select an n8n project first.');
|
|
416
|
+
}
|
|
417
|
+
const apiKey = input.apiKey?.trim() || this.n8nConfigService.getApiKey(host);
|
|
418
|
+
if (!apiKey) {
|
|
419
|
+
throw new Error('An n8n API key is required.');
|
|
420
|
+
}
|
|
421
|
+
const projects = await this.fetchN8nProjects(host, apiKey);
|
|
422
|
+
const selectedProject = projects.find((project) => project.id === projectId);
|
|
423
|
+
if (!selectedProject) {
|
|
424
|
+
throw new Error('The selected n8n project could not be found. Reload projects and try again.');
|
|
425
|
+
}
|
|
426
|
+
this.n8nConfigService.saveApiKey(host, apiKey);
|
|
427
|
+
this.n8nConfigService.saveBootstrapState(host, syncFolder, runtimeSource);
|
|
428
|
+
const instanceIdentifier = await this.n8nConfigService.getOrCreateInstanceIdentifier(host);
|
|
429
|
+
const currentConfig = this.n8nConfigService.getLocalConfig();
|
|
430
|
+
const projectName = getDisplayProjectName(selectedProject);
|
|
431
|
+
this.n8nConfigService.saveLocalConfig({
|
|
432
|
+
host,
|
|
433
|
+
syncFolder,
|
|
434
|
+
projectId: selectedProject.id,
|
|
435
|
+
projectName,
|
|
436
|
+
instanceIdentifier,
|
|
437
|
+
customNodesPath: currentConfig.customNodesPath,
|
|
438
|
+
runtimeSource,
|
|
439
|
+
});
|
|
440
|
+
const workflowDir = resolveWorkflowDir({ syncFolder, instanceIdentifier, projectName });
|
|
441
|
+
if (workflowDir) {
|
|
442
|
+
this.ensureWorkspaceFiles(workflowDir);
|
|
443
|
+
}
|
|
444
|
+
try {
|
|
445
|
+
await this.refreshAiContextRunner({ host, apiKey });
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
return `Workspace saved, but the n8n workspace instructions refresh failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
async refreshN8nWorkspaceInstructionsFromSavedConfig() {
|
|
453
|
+
const config = this.n8nConfigService.getLocalConfig();
|
|
454
|
+
if (!config.host) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
const apiKey = this.n8nConfigService.getApiKey(config.host);
|
|
458
|
+
if (!apiKey) {
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
await this.refreshAiContextRunner({ host: config.host, apiKey });
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
export async function refreshAiContext(credentials) {
|
|
466
|
+
await defaultRefreshAiContext(credentials);
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=application-services.js.map
|