@winmatrix/agent-sdk 0.1.6 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/claude/ClaudeAdapter.d.ts +7 -0
- package/dist/adapters/claude/ClaudeAdapter.d.ts.map +1 -1
- package/dist/adapters/claude/ClaudeAdapter.js +69 -9
- package/dist/adapters/claude/ClaudeAdapter.js.map +1 -1
- package/dist/adapters/claude/ClaudeStreamParser.d.ts +7 -2
- package/dist/adapters/claude/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/adapters/claude/ClaudeStreamParser.js +90 -3
- package/dist/adapters/claude/ClaudeStreamParser.js.map +1 -1
- package/dist/adapters/claude/claudeCommand.d.ts +2 -1
- package/dist/adapters/claude/claudeCommand.d.ts.map +1 -1
- package/dist/adapters/claude/claudeCommand.js +88 -7
- package/dist/adapters/claude/claudeCommand.js.map +1 -1
- package/dist/adapters/codex/CodexAdapter.d.ts +20 -0
- package/dist/adapters/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/adapters/codex/CodexAdapter.js +286 -0
- package/dist/adapters/codex/CodexAdapter.js.map +1 -0
- package/dist/adapters/hermes/HermesAdapter.d.ts +1 -0
- package/dist/adapters/hermes/HermesAdapter.d.ts.map +1 -1
- package/dist/adapters/hermes/HermesAdapter.js +79 -14
- package/dist/adapters/hermes/HermesAdapter.js.map +1 -1
- package/dist/adapters/openclaw/OpenClawAdapter.d.ts +12 -37
- package/dist/adapters/openclaw/OpenClawAdapter.d.ts.map +1 -1
- package/dist/adapters/openclaw/OpenClawAdapter.js +168 -634
- package/dist/adapters/openclaw/OpenClawAdapter.js.map +1 -1
- package/dist/core/AgentAdapter.d.ts +31 -0
- package/dist/core/AgentAdapter.d.ts.map +1 -1
- package/dist/core/AgentAdapter.js +25 -0
- package/dist/core/AgentAdapter.js.map +1 -1
- package/dist/core/ClaudeRuntimeDoctor.d.ts +20 -0
- package/dist/core/ClaudeRuntimeDoctor.d.ts.map +1 -0
- package/dist/core/ClaudeRuntimeDoctor.js +50 -0
- package/dist/core/ClaudeRuntimeDoctor.js.map +1 -0
- package/dist/core/RuntimeDetector.d.ts.map +1 -1
- package/dist/core/RuntimeDetector.js +53 -33
- package/dist/core/RuntimeDetector.js.map +1 -1
- package/dist/core/WinMatrixAgentClient.d.ts +8 -4
- package/dist/core/WinMatrixAgentClient.d.ts.map +1 -1
- package/dist/core/WinMatrixAgentClient.js +9 -2
- package/dist/core/WinMatrixAgentClient.js.map +1 -1
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -7
- package/dist/index.js.map +1 -1
- package/dist/utils/resumeFallback.d.ts +4 -0
- package/dist/utils/resumeFallback.d.ts.map +1 -0
- package/dist/utils/resumeFallback.js +55 -0
- package/dist/utils/resumeFallback.js.map +1 -0
- package/package.json +7 -2
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.d.ts +0 -6
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.d.ts.map +0 -1
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.js +0 -24
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.js.map +0 -1
- package/dist/runtime/DualRuntimeBridge.d.ts +0 -38
- package/dist/runtime/DualRuntimeBridge.d.ts.map +0 -1
- package/dist/runtime/DualRuntimeBridge.js +0 -321
- package/dist/runtime/DualRuntimeBridge.js.map +0 -1
- package/dist/runtime/bridgeConfigLoader.d.ts +0 -14
- package/dist/runtime/bridgeConfigLoader.d.ts.map +0 -1
- package/dist/runtime/bridgeConfigLoader.js +0 -133
- package/dist/runtime/bridgeConfigLoader.js.map +0 -1
- package/dist/runtime/bridgeConfigTypes.d.ts +0 -26
- package/dist/runtime/bridgeConfigTypes.d.ts.map +0 -1
- package/dist/runtime/bridgeConfigTypes.js +0 -6
- package/dist/runtime/bridgeConfigTypes.js.map +0 -1
- package/dist/runtime/bridgeHome.d.ts +0 -19
- package/dist/runtime/bridgeHome.d.ts.map +0 -1
- package/dist/runtime/bridgeHome.js +0 -61
- package/dist/runtime/bridgeHome.js.map +0 -1
- package/dist/runtime/bridgeReconnectPolicy.d.ts +0 -8
- package/dist/runtime/bridgeReconnectPolicy.d.ts.map +0 -1
- package/dist/runtime/bridgeReconnectPolicy.js +0 -16
- package/dist/runtime/bridgeReconnectPolicy.js.map +0 -1
- package/dist/runtime/bridgeTaskJournal.d.ts +0 -7
- package/dist/runtime/bridgeTaskJournal.d.ts.map +0 -1
- package/dist/runtime/bridgeTaskJournal.js +0 -66
- package/dist/runtime/bridgeTaskJournal.js.map +0 -1
- package/dist/runtime/localRuntimeAvailabilityMonitor.d.ts +0 -22
- package/dist/runtime/localRuntimeAvailabilityMonitor.d.ts.map +0 -1
- package/dist/runtime/localRuntimeAvailabilityMonitor.js +0 -81
- package/dist/runtime/localRuntimeAvailabilityMonitor.js.map +0 -1
- package/dist/runtime/runDualRuntimeBridge.d.ts +0 -2
- package/dist/runtime/runDualRuntimeBridge.d.ts.map +0 -1
- package/dist/runtime/runDualRuntimeBridge.js +0 -32
- package/dist/runtime/runDualRuntimeBridge.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeConfigLoader.d.ts","sourceRoot":"","sources":["../../src/runtime/bridgeConfigLoader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,wBAAwB,CAAC;AAK1E,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AA8EnE,sCAAsC;AACtC,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAgB1E;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAS1E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAY/C"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 从用户目录下的 `bridge.config.json` 加载 Dual Runtime Bridge 配置(不再支持 `.env`)。
|
|
3
|
-
*/
|
|
4
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { validateBridgeRuntimeList } from './DualRuntimeBridge.js';
|
|
7
|
-
import { getBridgeConfigPath } from './bridgeHome.js';
|
|
8
|
-
export const DEFAULT_BRIDGE_CONFIG_BASENAME = 'bridge.config.json';
|
|
9
|
-
function resolveExplicitPathFromEnv() {
|
|
10
|
-
const fromEnv = process.env.WINMATRIX_BRIDGE_CONFIG?.trim();
|
|
11
|
-
if (!fromEnv)
|
|
12
|
-
return null;
|
|
13
|
-
return path.isAbsolute(fromEnv) ? fromEnv : path.join(process.cwd(), fromEnv);
|
|
14
|
-
}
|
|
15
|
-
function resolveConfigPath() {
|
|
16
|
-
const explicit = resolveExplicitPathFromEnv();
|
|
17
|
-
return explicit ?? getBridgeConfigPath();
|
|
18
|
-
}
|
|
19
|
-
function readStr(v) {
|
|
20
|
-
if (v === undefined || v === null)
|
|
21
|
-
return undefined;
|
|
22
|
-
if (typeof v === 'string')
|
|
23
|
-
return v.trim() || undefined;
|
|
24
|
-
if (typeof v === 'number' && Number.isFinite(v))
|
|
25
|
-
return String(v);
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
function readBool(v) {
|
|
29
|
-
if (typeof v === 'boolean')
|
|
30
|
-
return v;
|
|
31
|
-
if (typeof v === 'string') {
|
|
32
|
-
const t = v.trim().toLowerCase();
|
|
33
|
-
if (t === '1' || t === 'true' || t === 'yes')
|
|
34
|
-
return true;
|
|
35
|
-
if (t === '0' || t === 'false' || t === 'no')
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
function readPositiveInt(v, fallback) {
|
|
41
|
-
if (typeof v === 'number' && Number.isFinite(v) && v >= 1)
|
|
42
|
-
return Math.floor(v);
|
|
43
|
-
if (typeof v === 'string' && v.trim()) {
|
|
44
|
-
const p = Number.parseInt(v, 10);
|
|
45
|
-
if (Number.isFinite(p) && p >= 1)
|
|
46
|
-
return p;
|
|
47
|
-
}
|
|
48
|
-
return fallback;
|
|
49
|
-
}
|
|
50
|
-
function readTimeoutMs(v) {
|
|
51
|
-
if (typeof v === 'number' && Number.isFinite(v) && v >= 1000)
|
|
52
|
-
return Math.floor(v);
|
|
53
|
-
if (typeof v === 'string' && v.trim()) {
|
|
54
|
-
const p = Number.parseInt(v, 10);
|
|
55
|
-
if (Number.isFinite(p) && p >= 1000)
|
|
56
|
-
return p;
|
|
57
|
-
}
|
|
58
|
-
return 180000;
|
|
59
|
-
}
|
|
60
|
-
function runtimeFromJson(kind, block) {
|
|
61
|
-
if (!block)
|
|
62
|
-
return null;
|
|
63
|
-
if (readBool(block.disabled) === true)
|
|
64
|
-
return null;
|
|
65
|
-
const agentId = readStr(block.agentId);
|
|
66
|
-
const apiKey = readStr(block.apiKey);
|
|
67
|
-
if (!agentId || !apiKey) {
|
|
68
|
-
throw new Error(`bridge.config.json: "${kind}" requires agentId and apiKey when not disabled`);
|
|
69
|
-
}
|
|
70
|
-
const command = readStr(block.command);
|
|
71
|
-
const endpoint = readStr(block.endpoint);
|
|
72
|
-
const agentName = readStr(block.agentName) ?? (kind === 'hermes' ? 'local-hermes-bridge' : 'local-openclaw-bridge');
|
|
73
|
-
const endpointToken = readStr(block.endpointToken);
|
|
74
|
-
return {
|
|
75
|
-
kind,
|
|
76
|
-
command,
|
|
77
|
-
endpoint,
|
|
78
|
-
endpointToken,
|
|
79
|
-
commandTimeoutMs: readTimeoutMs(block.commandTimeoutMs),
|
|
80
|
-
maxConcurrentTasks: readPositiveInt(block.maxConcurrentTasks, 1),
|
|
81
|
-
agentId,
|
|
82
|
-
apiKey,
|
|
83
|
-
agentName,
|
|
84
|
-
agentType: kind,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/** 解析任意 JSON 对象为运行时配置(供测试或外部嵌入调用)。 */
|
|
88
|
-
export function loadBridgeConfigFromJsonObject(data) {
|
|
89
|
-
if (data === null || typeof data !== 'object' || Array.isArray(data)) {
|
|
90
|
-
throw new Error('bridge.config.json: root must be a JSON object');
|
|
91
|
-
}
|
|
92
|
-
const raw = data;
|
|
93
|
-
const wsUrl = readStr(raw.externalWsUrl) ?? 'ws://localhost:8400/api/v1/external-agents/connect';
|
|
94
|
-
const runtimes = [];
|
|
95
|
-
const hermes = runtimeFromJson('hermes', raw.hermes);
|
|
96
|
-
if (hermes)
|
|
97
|
-
runtimes.push(hermes);
|
|
98
|
-
const openclaw = runtimeFromJson('openclaw', raw.openclaw);
|
|
99
|
-
if (openclaw)
|
|
100
|
-
runtimes.push(openclaw);
|
|
101
|
-
validateBridgeRuntimeList(runtimes);
|
|
102
|
-
return { wsUrl, runtimes };
|
|
103
|
-
}
|
|
104
|
-
export function loadBridgeConfigFromJsonFile(absPath) {
|
|
105
|
-
const text = readFileSync(absPath, 'utf8');
|
|
106
|
-
let parsed;
|
|
107
|
-
try {
|
|
108
|
-
parsed = JSON.parse(text);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
throw new Error(`bridge.config.json: invalid JSON (${absPath})`);
|
|
112
|
-
}
|
|
113
|
-
return loadBridgeConfigFromJsonObject(parsed);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 解析顺序:
|
|
117
|
-
* 1. 若设置了 `WINMATRIX_BRIDGE_CONFIG`,仅从该路径读 JSON(文件必须存在);
|
|
118
|
-
* 2. 否则读取用户目录 `{WINMATRIX_BRIDGE_HOME or ~/.winmatrix-bridge}/bridge.config.json`。
|
|
119
|
-
*
|
|
120
|
-
* 不再从 `.env` 或进程环境变量读取桥接配置。
|
|
121
|
-
*/
|
|
122
|
-
export function loadBridgeConfig() {
|
|
123
|
-
const configPath = resolveConfigPath();
|
|
124
|
-
if (!existsSync(configPath)) {
|
|
125
|
-
throw new Error(`Dual Runtime Bridge config not found: ${configPath}\n` +
|
|
126
|
-
`Copy bridge.config.example.json to this path or run: npm run bridge:setup\n` +
|
|
127
|
-
`Directories: override home with WINMATRIX_BRIDGE_HOME; override file with WINMATRIX_BRIDGE_CONFIG.`);
|
|
128
|
-
}
|
|
129
|
-
const cfg = loadBridgeConfigFromJsonFile(configPath);
|
|
130
|
-
console.log(`[bridge] config source=json path=${configPath}`);
|
|
131
|
-
return cfg;
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=bridgeConfigLoader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeConfigLoader.js","sourceRoot":"","sources":["../../src/runtime/bridgeConfigLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `bridge.config.json` 约定结构(与 SDK 内 `loadBridgeConfigFromJsonObject` 对应)。
|
|
3
|
-
* `version` 便于未来做迁移;当前为 `1`。
|
|
4
|
-
*/
|
|
5
|
-
export declare const BRIDGE_CONFIG_FILE_VERSION: 1;
|
|
6
|
-
/** 单条运行时(Hermes / OpenClaw)在 JSON 中的形态 */
|
|
7
|
-
export type BridgeRuntimeFileJson = {
|
|
8
|
-
/** 为 `true` 时不注册该运行时 */
|
|
9
|
-
disabled?: boolean;
|
|
10
|
-
agentId?: string;
|
|
11
|
-
apiKey?: string;
|
|
12
|
-
agentName?: string;
|
|
13
|
-
maxConcurrentTasks?: number;
|
|
14
|
-
command?: string;
|
|
15
|
-
endpoint?: string;
|
|
16
|
-
endpointToken?: string;
|
|
17
|
-
commandTimeoutMs?: number;
|
|
18
|
-
};
|
|
19
|
-
export type BridgeConfigFileJson = {
|
|
20
|
-
version?: number;
|
|
21
|
-
/** WinMatrix WebSocket 接入点 */
|
|
22
|
-
externalWsUrl?: string;
|
|
23
|
-
hermes?: BridgeRuntimeFileJson;
|
|
24
|
-
openclaw?: BridgeRuntimeFileJson;
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=bridgeConfigTypes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeConfigTypes.d.ts","sourceRoot":"","sources":["../../src/runtime/bridgeConfigTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAC;AAErD,0CAA0C;AAC1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeConfigTypes.js","sourceRoot":"","sources":["../../src/runtime/bridgeConfigTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAU,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_BRIDGE_DIR_NAME = ".winmatrix-bridge";
|
|
2
|
-
/** 与 {@link bridgeConfigLoader.DEFAULT_BRIDGE_CONFIG_BASENAME} 一致 */
|
|
3
|
-
export declare const BRIDGE_CONFIG_FILENAME = "bridge.config.json";
|
|
4
|
-
/** 日志目录(相对 bridge home) */
|
|
5
|
-
export declare const REL_LOG_DIR = "logs";
|
|
6
|
-
/** 进行中任务快照(崩溃后可对照 recovery) */
|
|
7
|
-
export declare const REL_TASKS_PENDING: string;
|
|
8
|
-
/** 已完成任务追加日志(JSON Lines) */
|
|
9
|
-
export declare const REL_TASKS_RECOVERY: string;
|
|
10
|
-
export declare function getBridgeHomeDir(): string;
|
|
11
|
-
export declare function getBridgeConfigPath(): string;
|
|
12
|
-
/** 创建 ~/.winmatrix-bridge/{logs,tasks/pending,tasks/recovery}(幂等) */
|
|
13
|
-
export declare function ensureBridgeHomeLayout(): string;
|
|
14
|
-
/**
|
|
15
|
-
* 若上次异常退出后 `tasks/pending` 仍有快照,启动时打印一行提示(仅人工对照,不触发服务端重派)。
|
|
16
|
-
* 详见 README「tasks/pending 与 tasks/recovery 的语义」。
|
|
17
|
-
*/
|
|
18
|
-
export declare function logPendingTasksRecoveryHint(): void;
|
|
19
|
-
//# sourceMappingURL=bridgeHome.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeHome.d.ts","sourceRoot":"","sources":["../../src/runtime/bridgeHome.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAE3D,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,2BAA2B;AAC3B,eAAO,MAAM,WAAW,SAAS,CAAC;AAElC,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAE/D,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AAEjE,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,IAAI,MAAM,CAY/C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAWlD"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dual Runtime Bridge 用户目录布局(类似 Hermes:固定用户目录下的状态与配置)。
|
|
3
|
-
*
|
|
4
|
-
* 默认:`~/.winmatrix-bridge/`
|
|
5
|
-
* 覆盖:`WINMATRIX_BRIDGE_HOME`(绝对路径或相对于 cwd)
|
|
6
|
-
*/
|
|
7
|
-
import { mkdirSync, existsSync, readdirSync } from 'node:fs';
|
|
8
|
-
import { homedir } from 'node:os';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
export const DEFAULT_BRIDGE_DIR_NAME = '.winmatrix-bridge';
|
|
11
|
-
/** 与 {@link bridgeConfigLoader.DEFAULT_BRIDGE_CONFIG_BASENAME} 一致 */
|
|
12
|
-
export const BRIDGE_CONFIG_FILENAME = 'bridge.config.json';
|
|
13
|
-
/** 日志目录(相对 bridge home) */
|
|
14
|
-
export const REL_LOG_DIR = 'logs';
|
|
15
|
-
/** 进行中任务快照(崩溃后可对照 recovery) */
|
|
16
|
-
export const REL_TASKS_PENDING = path.join('tasks', 'pending');
|
|
17
|
-
/** 已完成任务追加日志(JSON Lines) */
|
|
18
|
-
export const REL_TASKS_RECOVERY = path.join('tasks', 'recovery');
|
|
19
|
-
export function getBridgeHomeDir() {
|
|
20
|
-
const override = process.env.WINMATRIX_BRIDGE_HOME?.trim();
|
|
21
|
-
if (override) {
|
|
22
|
-
return path.isAbsolute(override) ? override : path.join(process.cwd(), override);
|
|
23
|
-
}
|
|
24
|
-
return path.join(homedir(), DEFAULT_BRIDGE_DIR_NAME);
|
|
25
|
-
}
|
|
26
|
-
export function getBridgeConfigPath() {
|
|
27
|
-
return path.join(getBridgeHomeDir(), BRIDGE_CONFIG_FILENAME);
|
|
28
|
-
}
|
|
29
|
-
/** 创建 ~/.winmatrix-bridge/{logs,tasks/pending,tasks/recovery}(幂等) */
|
|
30
|
-
export function ensureBridgeHomeLayout() {
|
|
31
|
-
const root = getBridgeHomeDir();
|
|
32
|
-
const dirs = [
|
|
33
|
-
root,
|
|
34
|
-
path.join(root, REL_LOG_DIR),
|
|
35
|
-
path.join(root, REL_TASKS_PENDING),
|
|
36
|
-
path.join(root, REL_TASKS_RECOVERY),
|
|
37
|
-
];
|
|
38
|
-
for (const d of dirs) {
|
|
39
|
-
mkdirSync(d, { recursive: true });
|
|
40
|
-
}
|
|
41
|
-
return root;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* 若上次异常退出后 `tasks/pending` 仍有快照,启动时打印一行提示(仅人工对照,不触发服务端重派)。
|
|
45
|
-
* 详见 README「tasks/pending 与 tasks/recovery 的语义」。
|
|
46
|
-
*/
|
|
47
|
-
export function logPendingTasksRecoveryHint() {
|
|
48
|
-
const dir = path.join(getBridgeHomeDir(), REL_TASKS_PENDING);
|
|
49
|
-
if (!existsSync(dir))
|
|
50
|
-
return;
|
|
51
|
-
try {
|
|
52
|
-
const n = readdirSync(dir).filter((f) => f.endsWith('.json')).length;
|
|
53
|
-
if (n > 0) {
|
|
54
|
-
console.log(`[bridge] recovery hint: ${n} pending task record(s) under ${dir}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
/* ignore */
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=bridgeHome.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeHome.js","sourceRoot":"","sources":["../../src/runtime/bridgeHome.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE3D,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAElC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAE/D,4BAA4B;AAC5B,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAEjE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,sBAAsB,CAAC,CAAC;AAC/D,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;KACpC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAC7B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decide whether bridge should keep retrying after a WinMatrixAgentClient connect error.
|
|
3
|
-
*
|
|
4
|
-
* Credential / registration mismatches won't fix themselves by reconnecting alone.
|
|
5
|
-
*/
|
|
6
|
-
export declare function isNonRecoverableExternalAgentAuthError(err: unknown): boolean;
|
|
7
|
-
export declare function nextReconnectDelayMs(current: number): number;
|
|
8
|
-
//# sourceMappingURL=bridgeReconnectPolicy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeReconnectPolicy.d.ts","sourceRoot":"","sources":["../../src/runtime/bridgeReconnectPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAgB,sCAAsC,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI5E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decide whether bridge should keep retrying after a WinMatrixAgentClient connect error.
|
|
3
|
-
*
|
|
4
|
-
* Credential / registration mismatches won't fix themselves by reconnecting alone.
|
|
5
|
-
*/
|
|
6
|
-
const MAX_BACKOFF_MS = 60_000;
|
|
7
|
-
export function isNonRecoverableExternalAgentAuthError(err) {
|
|
8
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
9
|
-
if (/invalid_credentials/i.test(msg))
|
|
10
|
-
return true;
|
|
11
|
-
return /Registration failed:/i.test(msg) && /invalid_credentials/i.test(msg);
|
|
12
|
-
}
|
|
13
|
-
export function nextReconnectDelayMs(current) {
|
|
14
|
-
return Math.min(current * 2, MAX_BACKOFF_MS);
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=bridgeReconnectPolicy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeReconnectPolicy.js","sourceRoot":"","sources":["../../src/runtime/bridgeReconnectPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,UAAU,sCAAsC,CAAC,GAAY;IACjE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { TaskInput } from '../core/WinMatrixAgentClient.js';
|
|
2
|
-
export type BridgeRuntimeKindJournal = 'hermes' | 'openclaw';
|
|
3
|
-
/** task.assign 收到后写入 pending(供崩溃对照;不负责服务端重派语义) */
|
|
4
|
-
export declare function recordTaskStarted(runtime: BridgeRuntimeKindJournal, task: TaskInput): void;
|
|
5
|
-
/** complete / fail 后删除 pending,并追加一行 recovery */
|
|
6
|
-
export declare function recordTaskFinished(runtime: BridgeRuntimeKindJournal, taskId: string, outcome: 'complete' | 'fail'): void;
|
|
7
|
-
//# sourceMappingURL=bridgeTaskJournal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeTaskJournal.d.ts","sourceRoot":"","sources":["../../src/runtime/bridgeTaskJournal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAmB7D,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAe1F;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,GAAG,MAAM,GAC3B,IAAI,CAuBN"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 本地任务快照:进行中写入 tasks/pending,结束后移至 recovery(JSON Lines)。
|
|
3
|
-
*/
|
|
4
|
-
import { appendFileSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { ensureBridgeHomeLayout, getBridgeHomeDir, REL_TASKS_PENDING, REL_TASKS_RECOVERY } from './bridgeHome.js';
|
|
7
|
-
function sanitizeTaskId(taskId) {
|
|
8
|
-
const safe = taskId.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
9
|
-
return safe.slice(0, 180) || 'unknown';
|
|
10
|
-
}
|
|
11
|
-
function pendingFile(taskId) {
|
|
12
|
-
ensureBridgeHomeLayout();
|
|
13
|
-
return path.join(getBridgeHomeDir(), REL_TASKS_PENDING, `${sanitizeTaskId(taskId)}.json`);
|
|
14
|
-
}
|
|
15
|
-
function recoveryLogFile() {
|
|
16
|
-
ensureBridgeHomeLayout();
|
|
17
|
-
const dir = path.join(getBridgeHomeDir(), REL_TASKS_RECOVERY);
|
|
18
|
-
mkdirSync(dir, { recursive: true });
|
|
19
|
-
return path.join(dir, 'completed.jsonl');
|
|
20
|
-
}
|
|
21
|
-
/** task.assign 收到后写入 pending(供崩溃对照;不负责服务端重派语义) */
|
|
22
|
-
export function recordTaskStarted(runtime, task) {
|
|
23
|
-
try {
|
|
24
|
-
ensureBridgeHomeLayout();
|
|
25
|
-
const payload = {
|
|
26
|
-
taskId: task.taskId,
|
|
27
|
-
runtime,
|
|
28
|
-
receivedAt: Date.now(),
|
|
29
|
-
inputPreview: task.input.slice(0, 4000),
|
|
30
|
-
...(task.context?.projectId ? { projectId: task.context.projectId } : {}),
|
|
31
|
-
};
|
|
32
|
-
writeFileSync(pendingFile(task.taskId), `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
36
|
-
console.warn(`[bridge] task journal pending write failed: ${msg}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** complete / fail 后删除 pending,并追加一行 recovery */
|
|
40
|
-
export function recordTaskFinished(runtime, taskId, outcome) {
|
|
41
|
-
try {
|
|
42
|
-
ensureBridgeHomeLayout();
|
|
43
|
-
const pf = pendingFile(taskId);
|
|
44
|
-
let snapshot = { taskId, runtime };
|
|
45
|
-
if (existsSync(pf)) {
|
|
46
|
-
try {
|
|
47
|
-
snapshot = JSON.parse(readFileSync(pf, 'utf8'));
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
/* ignore parse */
|
|
51
|
-
}
|
|
52
|
-
unlinkSync(pf);
|
|
53
|
-
}
|
|
54
|
-
const line = {
|
|
55
|
-
...snapshot,
|
|
56
|
-
outcome,
|
|
57
|
-
finishedAt: Date.now(),
|
|
58
|
-
};
|
|
59
|
-
appendFileSync(recoveryLogFile(), `${JSON.stringify(line)}\n`, 'utf8');
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
63
|
-
console.warn(`[bridge] task journal finish failed: ${msg}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=bridgeTaskJournal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeTaskJournal.js","sourceRoot":"","sources":["../../src/runtime/bridgeTaskJournal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Probe local Hermes/OpenClaw HTTP endpoints and notify WinMatrix via runtime.availability events.
|
|
3
|
-
*/
|
|
4
|
-
import type { WinMatrixAgentClient } from '../core/WinMatrixAgentClient.js';
|
|
5
|
-
export type LocalRuntimeKindBridge = 'hermes' | 'openclaw';
|
|
6
|
-
/**
|
|
7
|
-
* Lightweight reachability probe: HEAD the base URL — process down ⇒ fetch throws before status.
|
|
8
|
-
*/
|
|
9
|
-
export declare function probeLocalHttpEndpoint(endpointUrl: string): Promise<{
|
|
10
|
-
reachable: boolean;
|
|
11
|
-
error?: string;
|
|
12
|
-
}>;
|
|
13
|
-
export declare function startLocalRuntimeAvailabilityMonitor(options: {
|
|
14
|
-
client: WinMatrixAgentClient;
|
|
15
|
-
runtimeKind: LocalRuntimeKindBridge;
|
|
16
|
-
mode: 'endpoint' | 'command';
|
|
17
|
-
/** Required when mode is endpoint */
|
|
18
|
-
endpointUrl?: string;
|
|
19
|
-
probeIntervalMs?: number;
|
|
20
|
-
isStopped: () => boolean;
|
|
21
|
-
}): () => void;
|
|
22
|
-
//# sourceMappingURL=localRuntimeAvailabilityMonitor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"localRuntimeAvailabilityMonitor.d.ts","sourceRoot":"","sources":["../../src/runtime/localRuntimeAvailabilityMonitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5E,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAK3D;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYjH;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,sBAAsB,CAAC;IACpC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,OAAO,CAAC;CAC1B,GAAG,MAAM,IAAI,CA4Db"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Probe local Hermes/OpenClaw HTTP endpoints and notify WinMatrix via runtime.availability events.
|
|
3
|
-
*/
|
|
4
|
-
const DEFAULT_PROBE_INTERVAL_MS = 15_000;
|
|
5
|
-
const FETCH_TIMEOUT_MS = 10_000;
|
|
6
|
-
/**
|
|
7
|
-
* Lightweight reachability probe: HEAD the base URL — process down ⇒ fetch throws before status.
|
|
8
|
-
*/
|
|
9
|
-
export async function probeLocalHttpEndpoint(endpointUrl) {
|
|
10
|
-
const ctl = new AbortController();
|
|
11
|
-
const tid = setTimeout(() => ctl.abort(), FETCH_TIMEOUT_MS);
|
|
12
|
-
try {
|
|
13
|
-
await fetch(endpointUrl, { method: 'HEAD', signal: ctl.signal, redirect: 'manual' });
|
|
14
|
-
return { reachable: true };
|
|
15
|
-
}
|
|
16
|
-
catch (err) {
|
|
17
|
-
const error = err instanceof Error ? err.message : String(err);
|
|
18
|
-
return { reachable: false, error };
|
|
19
|
-
}
|
|
20
|
-
finally {
|
|
21
|
-
clearTimeout(tid);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export function startLocalRuntimeAvailabilityMonitor(options) {
|
|
25
|
-
const intervalMs = options.probeIntervalMs ?? DEFAULT_PROBE_INTERVAL_MS;
|
|
26
|
-
/** null = never emitted yet */
|
|
27
|
-
let lastReachableEmitted = null;
|
|
28
|
-
const notify = (payload) => {
|
|
29
|
-
if (options.isStopped())
|
|
30
|
-
return;
|
|
31
|
-
options.client.notifyRuntimeAvailability(payload);
|
|
32
|
-
};
|
|
33
|
-
const tick = async () => {
|
|
34
|
-
if (options.isStopped())
|
|
35
|
-
return;
|
|
36
|
-
if (options.mode === 'command') {
|
|
37
|
-
const reachable = true;
|
|
38
|
-
if (lastReachableEmitted === reachable)
|
|
39
|
-
return;
|
|
40
|
-
lastReachableEmitted = reachable;
|
|
41
|
-
notify({
|
|
42
|
-
runtimeKind: options.runtimeKind,
|
|
43
|
-
reachable,
|
|
44
|
-
mode: 'command',
|
|
45
|
-
checkedAtIso: new Date().toISOString(),
|
|
46
|
-
});
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const url = options.endpointUrl?.trim();
|
|
50
|
-
if (!url) {
|
|
51
|
-
if (lastReachableEmitted === false)
|
|
52
|
-
return;
|
|
53
|
-
lastReachableEmitted = false;
|
|
54
|
-
notify({
|
|
55
|
-
runtimeKind: options.runtimeKind,
|
|
56
|
-
reachable: false,
|
|
57
|
-
mode: 'endpoint',
|
|
58
|
-
checkedAtIso: new Date().toISOString(),
|
|
59
|
-
error: 'missing_endpoint',
|
|
60
|
-
});
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const { reachable, error } = await probeLocalHttpEndpoint(url);
|
|
64
|
-
if (lastReachableEmitted === reachable)
|
|
65
|
-
return;
|
|
66
|
-
lastReachableEmitted = reachable;
|
|
67
|
-
notify({
|
|
68
|
-
runtimeKind: options.runtimeKind,
|
|
69
|
-
reachable,
|
|
70
|
-
mode: 'endpoint',
|
|
71
|
-
checkedAtIso: new Date().toISOString(),
|
|
72
|
-
...(error !== undefined ? { error } : {}),
|
|
73
|
-
});
|
|
74
|
-
};
|
|
75
|
-
void tick();
|
|
76
|
-
const timer = setInterval(() => void tick(), intervalMs);
|
|
77
|
-
return () => {
|
|
78
|
-
clearInterval(timer);
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=localRuntimeAvailabilityMonitor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"localRuntimeAvailabilityMonitor.js","sourceRoot":"","sources":["../../src/runtime/localRuntimeAvailabilityMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runDualRuntimeBridge.d.ts","sourceRoot":"","sources":["../../src/runtime/runDualRuntimeBridge.ts"],"names":[],"mappings":""}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { loadBridgeConfig } from './bridgeConfigLoader.js';
|
|
2
|
-
import { startDualRuntimeBridge } from './DualRuntimeBridge.js';
|
|
3
|
-
async function main() {
|
|
4
|
-
const config = loadBridgeConfig();
|
|
5
|
-
const bridge = await startDualRuntimeBridge(config);
|
|
6
|
-
console.log('[bridge] started. Press Ctrl+C to stop.');
|
|
7
|
-
const shutdown = () => {
|
|
8
|
-
console.log('[bridge] shutting down...');
|
|
9
|
-
bridge.stop();
|
|
10
|
-
process.exit(0);
|
|
11
|
-
};
|
|
12
|
-
process.on('SIGINT', shutdown);
|
|
13
|
-
process.on('SIGTERM', shutdown);
|
|
14
|
-
}
|
|
15
|
-
main().catch((err) => {
|
|
16
|
-
if (err instanceof Error) {
|
|
17
|
-
const msg = err.message?.trim()
|
|
18
|
-
? err.message
|
|
19
|
-
: [err.name, err.code && `code=${err.code}`]
|
|
20
|
-
.filter(Boolean)
|
|
21
|
-
.join(' ')
|
|
22
|
-
|| '(empty error message; see stack below)';
|
|
23
|
-
console.error(`[bridge] failed: ${msg}`);
|
|
24
|
-
if (err.stack)
|
|
25
|
-
console.error(err.stack);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
console.error('[bridge] failed:', err);
|
|
29
|
-
}
|
|
30
|
-
process.exit(1);
|
|
31
|
-
});
|
|
32
|
-
//# sourceMappingURL=runDualRuntimeBridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runDualRuntimeBridge.js","sourceRoot":"","sources":["../../src/runtime/runDualRuntimeBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAG,GAA6B,CAAC,IAAI,IAAI,QAAS,GAA6B,CAAC,IAAI,EAAE,CAAC;iBAC7F,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC;mBACX,wCAAwC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|