@yagr/agent 0.2.11 → 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 +109 -17
- 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 +109 -237
- 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 -1
- package/dist/llm/provider-registry.d.ts.map +1 -1
- package/dist/llm/provider-registry.js +7 -24
- 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 +16 -18
- 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
package/dist/gateway/webui.d.ts
CHANGED
|
@@ -1,13 +1,60 @@
|
|
|
1
|
-
import { YagrConfigService } from '../config/yagr-config-service.js';
|
|
2
|
-
import type {
|
|
1
|
+
import { YagrConfigService, type YagrConfigStoreLike } from '../config/yagr-config-service.js';
|
|
2
|
+
import type { EngineRuntimePort } from '../engine/engine.js';
|
|
3
3
|
import type { GatewayRuntimeHandle } from './types.js';
|
|
4
|
-
import type { YagrRunOptions } from '../types.js';
|
|
4
|
+
import type { YagrPhaseEvent, YagrRunOptions, YagrStateEvent, YagrToolEvent } from '../types.js';
|
|
5
5
|
export interface WebUiGatewayStatus {
|
|
6
6
|
configured: boolean;
|
|
7
7
|
host: string;
|
|
8
8
|
port: number;
|
|
9
9
|
url: string;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
type WebUiChatStreamEvent = {
|
|
12
|
+
type: 'start';
|
|
13
|
+
sessionId: string;
|
|
14
|
+
message: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'phase';
|
|
17
|
+
phase: string;
|
|
18
|
+
status: 'started' | 'completed';
|
|
19
|
+
message: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'state';
|
|
22
|
+
state: string;
|
|
23
|
+
message: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'progress';
|
|
26
|
+
tone: 'info' | 'success' | 'error';
|
|
27
|
+
title: string;
|
|
28
|
+
detail?: string;
|
|
29
|
+
phase?: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'text-delta';
|
|
32
|
+
delta: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'final';
|
|
35
|
+
sessionId: string;
|
|
36
|
+
response: string;
|
|
37
|
+
finalState: string;
|
|
38
|
+
requiredActions?: Array<{
|
|
39
|
+
title: string;
|
|
40
|
+
message: string;
|
|
41
|
+
}>;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'error';
|
|
44
|
+
error: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'embed';
|
|
47
|
+
kind: 'workflow';
|
|
48
|
+
workflowId: string;
|
|
49
|
+
url: string;
|
|
50
|
+
targetUrl?: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
diagram?: string;
|
|
53
|
+
};
|
|
54
|
+
export declare function mapToolEventToWebUiStreamEvent(event: YagrToolEvent): WebUiChatStreamEvent | undefined;
|
|
55
|
+
export declare function mapPhaseEventToWebUiStreamEvent(event: YagrPhaseEvent): WebUiChatStreamEvent | undefined;
|
|
56
|
+
export declare function mapStateEventToWebUiStreamEvent(event: YagrStateEvent): WebUiChatStreamEvent | undefined;
|
|
57
|
+
export declare function getWebUiGatewayStatus(configService?: YagrConfigStoreLike): WebUiGatewayStatus;
|
|
58
|
+
export declare function createWebUiGatewayRuntime(engineResolver: () => Promise<EngineRuntimePort>, options?: YagrRunOptions, configService?: YagrConfigService): GatewayRuntimeHandle;
|
|
59
|
+
export {};
|
|
13
60
|
//# sourceMappingURL=webui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../../src/gateway/webui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../../src/gateway/webui.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAGV,cAAc,EACd,cAAc,EACd,cAAc,EACd,aAAa,EACd,MAAM,aAAa,CAAC;AAkCrB,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,KAAK,oBAAoB,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GACvI;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/H,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,GAAG,SAAS,CAyBrG;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAavG;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAavG;AA0BD,wBAAgB,qBAAqB,CAAC,aAAa,GAAE,mBAA6C,GAAG,kBAAkB,CAQtH;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,EAChD,OAAO,GAAE,cAAmB,EAC5B,aAAa,oBAA0B,GACtC,oBAAoB,CAUtB"}
|
package/dist/gateway/webui.js
CHANGED
|
@@ -3,24 +3,21 @@ import { createServer } from 'node:http';
|
|
|
3
3
|
import { readFile } from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { YagrAgent } from '../agent.js';
|
|
10
|
-
import { resolveWorkflowDir, YagrN8nConfigService } from '../config/n8n-config-service.js';
|
|
6
|
+
import { getDisplayProjectName, } from 'n8nac';
|
|
7
|
+
import { YagrSessionAgent } from '../agent.js';
|
|
8
|
+
import { YagrN8nConfigService } from '../config/n8n-config-service.js';
|
|
11
9
|
import { YagrConfigService } from '../config/yagr-config-service.js';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { getYagrSetupStatus } from '../setup.js';
|
|
10
|
+
import { resolveTelegramBotIdentity } from './telegram.js';
|
|
11
|
+
import { YagrSetupApplicationService } from '../setup/application-services.js';
|
|
15
12
|
import { resolveLanguageModelConfig } from '../llm/create-language-model.js';
|
|
16
|
-
import {
|
|
17
|
-
import { providerRequiresApiKey, YAGR_MODEL_PROVIDERS, } from '../llm/provider-registry.js';
|
|
13
|
+
import { providerRequiresApiKey, YAGR_SELECTABLE_MODEL_PROVIDERS, } from '../llm/provider-registry.js';
|
|
18
14
|
import { resolveManagedN8nWorkflowOpen } from '../n8n-local/workflow-open.js';
|
|
15
|
+
import { mapPhaseEventToUserVisibleUpdate, mapStateEventToUserVisibleUpdate, mapToolEventToUserVisibleUpdate, } from '../runtime/user-visible-updates.js';
|
|
19
16
|
const __filename = fileURLToPath(import.meta.url);
|
|
20
17
|
const __dirname = path.dirname(__filename);
|
|
21
18
|
const DEFAULT_HOST = '127.0.0.1';
|
|
22
19
|
const DEFAULT_PORT = 3789;
|
|
23
|
-
const VALID_PROVIDERS = [...
|
|
20
|
+
const VALID_PROVIDERS = [...YAGR_SELECTABLE_MODEL_PROVIDERS];
|
|
24
21
|
const ACTIVE_WEBUI_SURFACES = ['webui'];
|
|
25
22
|
const WEB_UI_HTML = `<!doctype html>
|
|
26
23
|
<html lang="en">
|
|
@@ -35,6 +32,56 @@ const WEB_UI_HTML = `<!doctype html>
|
|
|
35
32
|
<div id="root"></div>
|
|
36
33
|
</body>
|
|
37
34
|
</html>`;
|
|
35
|
+
export function mapToolEventToWebUiStreamEvent(event) {
|
|
36
|
+
const userFacingStatus = mapToolEventToUserVisibleUpdate(event);
|
|
37
|
+
if (userFacingStatus) {
|
|
38
|
+
return {
|
|
39
|
+
type: 'progress',
|
|
40
|
+
tone: userFacingStatus.tone,
|
|
41
|
+
title: userFacingStatus.title,
|
|
42
|
+
detail: userFacingStatus.detail,
|
|
43
|
+
...(userFacingStatus.phase ? { phase: userFacingStatus.phase } : {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (event.type === 'embed') {
|
|
47
|
+
return {
|
|
48
|
+
type: 'embed',
|
|
49
|
+
kind: event.kind,
|
|
50
|
+
workflowId: event.workflowId,
|
|
51
|
+
url: event.url,
|
|
52
|
+
targetUrl: event.targetUrl,
|
|
53
|
+
title: event.title,
|
|
54
|
+
diagram: event.diagram,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
export function mapPhaseEventToWebUiStreamEvent(event) {
|
|
60
|
+
const update = mapPhaseEventToUserVisibleUpdate(event);
|
|
61
|
+
if (!update) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
type: 'progress',
|
|
66
|
+
tone: update.tone,
|
|
67
|
+
title: update.title,
|
|
68
|
+
detail: update.detail,
|
|
69
|
+
...(update.phase ? { phase: update.phase } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function mapStateEventToWebUiStreamEvent(event) {
|
|
73
|
+
const update = mapStateEventToUserVisibleUpdate(event);
|
|
74
|
+
if (!update) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
type: 'progress',
|
|
79
|
+
tone: update.tone,
|
|
80
|
+
title: update.title,
|
|
81
|
+
detail: update.detail,
|
|
82
|
+
...(update.phase ? { phase: update.phase } : {}),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
38
85
|
function isAbortError(error) {
|
|
39
86
|
return error instanceof Error && error.name === 'AbortError';
|
|
40
87
|
}
|
|
@@ -55,22 +102,8 @@ function getWebUiConfig(configService = new YagrConfigService()) {
|
|
|
55
102
|
port: sanitizePort(config.gateway?.webui?.port),
|
|
56
103
|
};
|
|
57
104
|
}
|
|
58
|
-
function persistWebUiConfig(configService = new YagrConfigService(), nextConfig) {
|
|
59
|
-
const normalized = {
|
|
60
|
-
host: sanitizeHost(nextConfig.host),
|
|
61
|
-
port: sanitizePort(nextConfig.port),
|
|
62
|
-
};
|
|
63
|
-
configService.updateLocalConfig((localConfig) => ({
|
|
64
|
-
...localConfig,
|
|
65
|
-
gateway: {
|
|
66
|
-
...localConfig.gateway,
|
|
67
|
-
webui: normalized,
|
|
68
|
-
},
|
|
69
|
-
}));
|
|
70
|
-
return normalized;
|
|
71
|
-
}
|
|
72
105
|
export function getWebUiGatewayStatus(configService = new YagrConfigService()) {
|
|
73
|
-
const config =
|
|
106
|
+
const config = getWebUiConfig(configService);
|
|
74
107
|
return {
|
|
75
108
|
configured: true,
|
|
76
109
|
host: config.host,
|
|
@@ -97,11 +130,15 @@ class WebUiGateway {
|
|
|
97
130
|
server;
|
|
98
131
|
enginePromise;
|
|
99
132
|
agents = new Map();
|
|
133
|
+
setupService;
|
|
100
134
|
constructor(engineResolver, options, configService, status) {
|
|
101
135
|
this.engineResolver = engineResolver;
|
|
102
136
|
this.options = options;
|
|
103
137
|
this.configService = configService;
|
|
104
138
|
this.status = status;
|
|
139
|
+
this.setupService = new YagrSetupApplicationService(this.configService, new YagrN8nConfigService(), {
|
|
140
|
+
resolveTelegramIdentity: resolveTelegramBotIdentity,
|
|
141
|
+
});
|
|
105
142
|
}
|
|
106
143
|
async start() {
|
|
107
144
|
if (this.server) {
|
|
@@ -160,11 +197,10 @@ class WebUiGateway {
|
|
|
160
197
|
}
|
|
161
198
|
if (method === 'POST' && url.pathname === '/api/n8n/projects') {
|
|
162
199
|
const body = await this.readJson(request);
|
|
163
|
-
const projects = await this.fetchN8nProjects(String(body.host ?? ''), body.apiKey ? String(body.apiKey) : undefined);
|
|
164
|
-
const current = new YagrN8nConfigService().getLocalConfig();
|
|
200
|
+
const projects = await this.setupService.fetchN8nProjects(String(body.host ?? ''), body.apiKey ? String(body.apiKey) : undefined);
|
|
165
201
|
this.sendJson(response, 200, {
|
|
166
202
|
projects: projects.map((project) => ({ id: project.id, name: getDisplayProjectName(project) })),
|
|
167
|
-
selectedProjectId:
|
|
203
|
+
selectedProjectId: this.setupService.getSelectedN8nProjectId(),
|
|
168
204
|
});
|
|
169
205
|
return;
|
|
170
206
|
}
|
|
@@ -185,18 +221,13 @@ class WebUiGateway {
|
|
|
185
221
|
if (method === 'POST' && url.pathname === '/api/llm/models') {
|
|
186
222
|
const body = await this.readJson(request);
|
|
187
223
|
const provider = this.assertProvider(String(body.provider ?? ''));
|
|
188
|
-
const apiKey = body.apiKey !== undefined ? String(body.apiKey) : this.configService.getApiKey(provider);
|
|
189
|
-
if (providerRequiresApiKey(provider) && !apiKey) {
|
|
190
|
-
throw new Error(`No API key available for ${provider}. Save one first.`);
|
|
191
|
-
}
|
|
192
|
-
const configuredLlm = this.configService.getLocalConfig();
|
|
193
|
-
const baseUrl = body.baseUrl
|
|
194
|
-
? String(body.baseUrl)
|
|
195
|
-
: configuredLlm.provider === provider
|
|
196
|
-
? configuredLlm.baseUrl
|
|
197
|
-
: undefined;
|
|
198
224
|
this.sendJson(response, 200, {
|
|
199
|
-
models: await
|
|
225
|
+
models: await this.setupService.fetchModelsForSelection({
|
|
226
|
+
provider,
|
|
227
|
+
apiKey: body.apiKey !== undefined ? String(body.apiKey) : undefined,
|
|
228
|
+
baseUrl: body.baseUrl ? String(body.baseUrl) : undefined,
|
|
229
|
+
requiresApiKey: providerRequiresApiKey,
|
|
230
|
+
}),
|
|
200
231
|
});
|
|
201
232
|
return;
|
|
202
233
|
}
|
|
@@ -208,15 +239,12 @@ class WebUiGateway {
|
|
|
208
239
|
if (!model) {
|
|
209
240
|
throw new Error('Model is required.');
|
|
210
241
|
}
|
|
211
|
-
|
|
212
|
-
this.configService.saveApiKey(provider, apiKey);
|
|
213
|
-
}
|
|
214
|
-
this.configService.updateLocalConfig((localConfig) => ({
|
|
215
|
-
...localConfig,
|
|
242
|
+
this.setupService.saveLlmConfig({
|
|
216
243
|
provider,
|
|
244
|
+
apiKey,
|
|
217
245
|
model,
|
|
218
246
|
baseUrl: body.baseUrl ? String(body.baseUrl) : undefined,
|
|
219
|
-
})
|
|
247
|
+
});
|
|
220
248
|
this.sendJson(response, 200, { snapshot: await this.buildSnapshot() });
|
|
221
249
|
return;
|
|
222
250
|
}
|
|
@@ -225,33 +253,18 @@ class WebUiGateway {
|
|
|
225
253
|
const enabledSurfaces = Array.isArray(body.enabledSurfaces)
|
|
226
254
|
? body.enabledSurfaces.filter((surface) => surface === 'telegram' || surface === 'whatsapp')
|
|
227
255
|
: [];
|
|
228
|
-
this.
|
|
256
|
+
this.setupService.saveSurfaces({ surfaces: enabledSurfaces });
|
|
229
257
|
this.sendJson(response, 200, { snapshot: await this.buildSnapshot() });
|
|
230
258
|
return;
|
|
231
259
|
}
|
|
232
260
|
if (method === 'POST' && url.pathname === '/api/telegram/configure') {
|
|
233
261
|
const body = await this.readJson(request);
|
|
234
|
-
|
|
235
|
-
if (!botToken || !botToken.includes(':')) {
|
|
236
|
-
throw new Error('Enter a valid Telegram BotFather token.');
|
|
237
|
-
}
|
|
238
|
-
const identity = await resolveTelegramBotIdentity(botToken);
|
|
239
|
-
this.configService.saveTelegramBotToken(botToken);
|
|
240
|
-
this.configService.enableGatewaySurface('telegram');
|
|
241
|
-
this.configService.updateLocalConfig((localConfig) => ({
|
|
242
|
-
...localConfig,
|
|
243
|
-
telegram: {
|
|
244
|
-
...localConfig.telegram,
|
|
245
|
-
botUsername: identity.username,
|
|
246
|
-
onboardingToken: localConfig.telegram?.onboardingToken ?? createOnboardingToken(),
|
|
247
|
-
linkedChats: localConfig.telegram?.linkedChats ?? [],
|
|
248
|
-
},
|
|
249
|
-
}));
|
|
262
|
+
await this.setupService.configureTelegram(String(body.botToken ?? ''));
|
|
250
263
|
this.sendJson(response, 200, { snapshot: await this.buildSnapshot() });
|
|
251
264
|
return;
|
|
252
265
|
}
|
|
253
266
|
if (method === 'POST' && url.pathname === '/api/telegram/reset') {
|
|
254
|
-
|
|
267
|
+
this.setupService.resetTelegram();
|
|
255
268
|
this.sendJson(response, 200, { snapshot: await this.buildSnapshot() });
|
|
256
269
|
return;
|
|
257
270
|
}
|
|
@@ -262,7 +275,7 @@ class WebUiGateway {
|
|
|
262
275
|
if (!message) {
|
|
263
276
|
throw new Error('Message is required.');
|
|
264
277
|
}
|
|
265
|
-
const setupStatus =
|
|
278
|
+
const setupStatus = this.setupService.getSetupStatus({
|
|
266
279
|
activeSurfaces: [...ACTIVE_WEBUI_SURFACES],
|
|
267
280
|
});
|
|
268
281
|
if (!setupStatus.ready) {
|
|
@@ -317,70 +330,12 @@ class WebUiGateway {
|
|
|
317
330
|
this.sendJson(response, 404, { error: 'Not found' });
|
|
318
331
|
}
|
|
319
332
|
async buildSnapshot() {
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
const setupStatus = getYagrSetupStatus(this.configService, n8nService, {
|
|
333
|
+
const webUiStatus = getWebUiGatewayStatus(this.configService);
|
|
334
|
+
return this.setupService.buildWebUiSnapshot({
|
|
323
335
|
activeSurfaces: [...ACTIVE_WEBUI_SURFACES],
|
|
336
|
+
webUiStatus,
|
|
337
|
+
selectableProviders: VALID_PROVIDERS,
|
|
324
338
|
});
|
|
325
|
-
const telegramStatus = getTelegramGatewayStatus(this.configService);
|
|
326
|
-
const webUiStatus = getWebUiGatewayStatus(this.configService);
|
|
327
|
-
const yagrConfig = this.configService.getLocalConfig();
|
|
328
|
-
const enabledSurfaces = Array.from(new Set([...this.configService.getEnabledGatewaySurfaces(), ...ACTIVE_WEBUI_SURFACES]));
|
|
329
|
-
const startableSurfaces = enabledSurfaces.filter((surface) => surface === 'webui' || (surface === 'telegram' && telegramStatus.configured));
|
|
330
|
-
let availableModels = [];
|
|
331
|
-
if (yagrConfig.provider) {
|
|
332
|
-
const apiKey = this.configService.getApiKey(yagrConfig.provider);
|
|
333
|
-
try {
|
|
334
|
-
availableModels = await fetchAvailableModels(yagrConfig.provider, apiKey, yagrConfig.baseUrl);
|
|
335
|
-
}
|
|
336
|
-
catch {
|
|
337
|
-
availableModels = [];
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
return {
|
|
341
|
-
setupStatus,
|
|
342
|
-
gatewayStatus: {
|
|
343
|
-
enabledSurfaces,
|
|
344
|
-
startableSurfaces,
|
|
345
|
-
},
|
|
346
|
-
telegram: telegramStatus,
|
|
347
|
-
webui: webUiStatus,
|
|
348
|
-
yagr: {
|
|
349
|
-
provider: yagrConfig.provider,
|
|
350
|
-
model: yagrConfig.model,
|
|
351
|
-
baseUrl: yagrConfig.baseUrl,
|
|
352
|
-
providers: VALID_PROVIDERS.map((provider) => ({
|
|
353
|
-
provider,
|
|
354
|
-
apiKeyStored: this.configService.hasApiKey(provider),
|
|
355
|
-
})),
|
|
356
|
-
},
|
|
357
|
-
n8n: {
|
|
358
|
-
host: n8nConfig.host,
|
|
359
|
-
syncFolder: n8nConfig.syncFolder,
|
|
360
|
-
projectId: n8nConfig.projectId,
|
|
361
|
-
projectName: n8nConfig.projectName,
|
|
362
|
-
apiKeyStored: Boolean(n8nConfig.host && n8nService.getApiKey(n8nConfig.host)),
|
|
363
|
-
projects: n8nConfig.projectId && n8nConfig.projectName ? [{ id: n8nConfig.projectId, name: n8nConfig.projectName }] : [],
|
|
364
|
-
},
|
|
365
|
-
availableModels,
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
async fetchN8nProjects(host, apiKeyOverride) {
|
|
369
|
-
const normalizedHost = host.trim();
|
|
370
|
-
if (!normalizedHost) {
|
|
371
|
-
throw new Error('n8n host is required.');
|
|
372
|
-
}
|
|
373
|
-
const configService = new YagrN8nConfigService();
|
|
374
|
-
const apiKey = apiKeyOverride ?? configService.getApiKey(normalizedHost);
|
|
375
|
-
if (!apiKey) {
|
|
376
|
-
throw new Error('No n8n API key available for that host.');
|
|
377
|
-
}
|
|
378
|
-
const client = new N8nApiClient({ host: normalizedHost, apiKey });
|
|
379
|
-
const connected = await client.testConnection();
|
|
380
|
-
if (!connected) {
|
|
381
|
-
throw new Error('Unable to connect to n8n with the provided URL and API key.');
|
|
382
|
-
}
|
|
383
|
-
return client.getProjects();
|
|
384
339
|
}
|
|
385
340
|
async sendManagedN8nWorkflowSession(response, target) {
|
|
386
341
|
const session = resolveManagedN8nWorkflowOpen(target);
|
|
@@ -404,51 +359,12 @@ class WebUiGateway {
|
|
|
404
359
|
this.sendText(response, 200, session.payload.fallbackPage, 'text/html; charset=utf-8');
|
|
405
360
|
}
|
|
406
361
|
async saveN8nConfig(input) {
|
|
407
|
-
const
|
|
408
|
-
const projectId = input.projectId.trim();
|
|
409
|
-
const syncFolder = input.syncFolder.trim() || 'workflows';
|
|
410
|
-
if (!host) {
|
|
411
|
-
throw new Error('n8n host is required.');
|
|
412
|
-
}
|
|
413
|
-
if (!projectId) {
|
|
414
|
-
throw new Error('Select an n8n project first.');
|
|
415
|
-
}
|
|
416
|
-
const configService = new YagrN8nConfigService();
|
|
417
|
-
const apiKey = input.apiKey?.trim() || configService.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
|
-
configService.saveApiKey(host, apiKey);
|
|
427
|
-
configService.saveBootstrapState(host, syncFolder);
|
|
428
|
-
const instanceIdentifier = await configService.getOrCreateInstanceIdentifier(host);
|
|
429
|
-
const projectName = getDisplayProjectName(selectedProject);
|
|
430
|
-
configService.saveLocalConfig({
|
|
431
|
-
host,
|
|
432
|
-
syncFolder,
|
|
433
|
-
projectId: selectedProject.id,
|
|
434
|
-
projectName,
|
|
435
|
-
instanceIdentifier,
|
|
436
|
-
});
|
|
437
|
-
const workflowDir = resolveWorkflowDir({ syncFolder, instanceIdentifier, projectName });
|
|
438
|
-
if (workflowDir) {
|
|
439
|
-
WorkspaceSetupService.ensureWorkspaceFiles(workflowDir);
|
|
440
|
-
}
|
|
362
|
+
const warning = await this.setupService.saveN8nConfig(input);
|
|
441
363
|
// Invalidate the cached engine and all agent sessions so the next request
|
|
442
364
|
// picks up a fresh engine built from the new config (new host, new API key).
|
|
443
365
|
this.enginePromise = undefined;
|
|
444
366
|
this.agents.clear();
|
|
445
|
-
|
|
446
|
-
await refreshAiContext({ host, apiKey });
|
|
447
|
-
return undefined;
|
|
448
|
-
}
|
|
449
|
-
catch (error) {
|
|
450
|
-
return `Workspace saved, but the n8n workspace instructions refresh failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
451
|
-
}
|
|
367
|
+
return warning;
|
|
452
368
|
}
|
|
453
369
|
assertProvider(value) {
|
|
454
370
|
if (!VALID_PROVIDERS.includes(value)) {
|
|
@@ -465,7 +381,7 @@ class WebUiGateway {
|
|
|
465
381
|
this.enginePromise = this.engineResolver();
|
|
466
382
|
}
|
|
467
383
|
const engine = await this.enginePromise;
|
|
468
|
-
const agent = new
|
|
384
|
+
const agent = new YagrSessionAgent(engine);
|
|
469
385
|
this.agents.set(sessionId, agent);
|
|
470
386
|
return agent;
|
|
471
387
|
}
|
|
@@ -499,7 +415,7 @@ class WebUiGateway {
|
|
|
499
415
|
this.sendText(response, 200, content, contentType);
|
|
500
416
|
}
|
|
501
417
|
async handleStreamingChat(response, sessionId, message) {
|
|
502
|
-
const setupStatus =
|
|
418
|
+
const setupStatus = this.setupService.getSetupStatus({
|
|
503
419
|
activeSurfaces: [...ACTIVE_WEBUI_SURFACES],
|
|
504
420
|
});
|
|
505
421
|
if (!setupStatus.ready) {
|
|
@@ -528,59 +444,38 @@ class WebUiGateway {
|
|
|
528
444
|
response.write(`${JSON.stringify(event)}\n`);
|
|
529
445
|
};
|
|
530
446
|
const pushPhaseEvent = (event) => {
|
|
531
|
-
|
|
447
|
+
const mappedEvent = mapPhaseEventToWebUiStreamEvent(event);
|
|
448
|
+
if (mappedEvent) {
|
|
449
|
+
writeEvent(mappedEvent);
|
|
532
450
|
return;
|
|
533
451
|
}
|
|
534
|
-
|
|
535
|
-
type: 'phase',
|
|
536
|
-
phase: event.phase,
|
|
537
|
-
status: event.status,
|
|
538
|
-
message: event.message,
|
|
539
|
-
});
|
|
540
|
-
};
|
|
541
|
-
const pushStateEvent = (event) => {
|
|
542
|
-
if (event.state === 'running' || event.state === 'streaming' || event.state === 'completed') {
|
|
543
|
-
return;
|
|
544
|
-
}
|
|
545
|
-
writeEvent({
|
|
546
|
-
type: 'state',
|
|
547
|
-
state: event.state,
|
|
548
|
-
message: event.message,
|
|
549
|
-
});
|
|
550
|
-
};
|
|
551
|
-
const pushToolEvent = (event) => {
|
|
552
|
-
if (event.type === 'status') {
|
|
452
|
+
if (event.status === 'started') {
|
|
553
453
|
writeEvent({
|
|
554
|
-
type: '
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
454
|
+
type: 'phase',
|
|
455
|
+
phase: event.phase,
|
|
456
|
+
status: event.status,
|
|
457
|
+
message: event.message,
|
|
558
458
|
});
|
|
559
|
-
return;
|
|
560
459
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
writeEvent(
|
|
566
|
-
type: 'progress',
|
|
567
|
-
tone: 'info',
|
|
568
|
-
title: 'Correcting commands',
|
|
569
|
-
detail: event.message,
|
|
570
|
-
});
|
|
460
|
+
};
|
|
461
|
+
const pushStateEvent = (event) => {
|
|
462
|
+
const mappedEvent = mapStateEventToWebUiStreamEvent(event);
|
|
463
|
+
if (mappedEvent) {
|
|
464
|
+
writeEvent(mappedEvent);
|
|
571
465
|
return;
|
|
572
466
|
}
|
|
573
|
-
if (event.
|
|
467
|
+
if (event.state !== 'running' && event.state !== 'streaming' && event.state !== 'completed') {
|
|
574
468
|
writeEvent({
|
|
575
|
-
type: '
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
url: event.url,
|
|
579
|
-
targetUrl: event.targetUrl,
|
|
580
|
-
title: event.title,
|
|
581
|
-
diagram: event.diagram,
|
|
469
|
+
type: 'state',
|
|
470
|
+
state: event.state,
|
|
471
|
+
message: event.message,
|
|
582
472
|
});
|
|
583
|
-
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
const pushToolEvent = (event) => {
|
|
476
|
+
const mappedEvent = mapToolEventToWebUiStreamEvent(event);
|
|
477
|
+
if (mappedEvent) {
|
|
478
|
+
writeEvent(mappedEvent);
|
|
584
479
|
}
|
|
585
480
|
};
|
|
586
481
|
const pushCompactionEvent = (event) => {
|
|
@@ -664,27 +559,4 @@ class WebUiGateway {
|
|
|
664
559
|
}
|
|
665
560
|
}
|
|
666
561
|
}
|
|
667
|
-
async function resolveTelegramBotIdentity(botToken) {
|
|
668
|
-
const { Telegraf } = await import('telegraf');
|
|
669
|
-
const bot = new Telegraf(botToken);
|
|
670
|
-
const me = await bot.telegram.getMe();
|
|
671
|
-
if (!me.username) {
|
|
672
|
-
throw new Error('Telegram bot username is missing. Configure the bot with BotFather first.');
|
|
673
|
-
}
|
|
674
|
-
return {
|
|
675
|
-
username: me.username,
|
|
676
|
-
firstName: me.first_name,
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
async function refreshAiContext(credentials) {
|
|
680
|
-
const updateAi = new UpdateAiCommand(new Command());
|
|
681
|
-
const previousCwd = process.cwd();
|
|
682
|
-
try {
|
|
683
|
-
process.chdir(getYagrN8nWorkspaceDir());
|
|
684
|
-
await updateAi.run({}, credentials);
|
|
685
|
-
}
|
|
686
|
-
finally {
|
|
687
|
-
process.chdir(previousCwd);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
562
|
//# sourceMappingURL=webui.js.map
|