@winmatrix/agent-sdk 0.1.0
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 +40 -0
- package/dist/adapters/claude/ClaudeAdapter.d.ts.map +1 -0
- package/dist/adapters/claude/ClaudeAdapter.js +515 -0
- package/dist/adapters/claude/ClaudeAdapter.js.map +1 -0
- package/dist/adapters/claude/ClaudeStreamParser.d.ts +39 -0
- package/dist/adapters/claude/ClaudeStreamParser.d.ts.map +1 -0
- package/dist/adapters/claude/ClaudeStreamParser.js +80 -0
- package/dist/adapters/claude/ClaudeStreamParser.js.map +1 -0
- package/dist/adapters/hermes/HermesAdapter.d.ts +37 -0
- package/dist/adapters/hermes/HermesAdapter.d.ts.map +1 -0
- package/dist/adapters/hermes/HermesAdapter.js +342 -0
- package/dist/adapters/hermes/HermesAdapter.js.map +1 -0
- package/dist/adapters/openclaw/OpenClawAdapter.d.ts +77 -0
- package/dist/adapters/openclaw/OpenClawAdapter.d.ts.map +1 -0
- package/dist/adapters/openclaw/OpenClawAdapter.js +798 -0
- package/dist/adapters/openclaw/OpenClawAdapter.js.map +1 -0
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.d.ts +6 -0
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.d.ts.map +1 -0
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.js +24 -0
- package/dist/adapters/openclaw/unwrapOpenClawPayloads.js.map +1 -0
- package/dist/core/AdapterRegistry.d.ts +21 -0
- package/dist/core/AdapterRegistry.d.ts.map +1 -0
- package/dist/core/AdapterRegistry.js +37 -0
- package/dist/core/AdapterRegistry.js.map +1 -0
- package/dist/core/AgentAdapter.d.ts +165 -0
- package/dist/core/AgentAdapter.d.ts.map +1 -0
- package/dist/core/AgentAdapter.js +23 -0
- package/dist/core/AgentAdapter.js.map +1 -0
- package/dist/core/DaemonClient.d.ts +102 -0
- package/dist/core/DaemonClient.d.ts.map +1 -0
- package/dist/core/DaemonClient.js +225 -0
- package/dist/core/DaemonClient.js.map +1 -0
- package/dist/core/Protocol.d.ts +257 -0
- package/dist/core/Protocol.d.ts.map +1 -0
- package/dist/core/Protocol.js +140 -0
- package/dist/core/Protocol.js.map +1 -0
- package/dist/core/RuntimeDetector.d.ts +7 -0
- package/dist/core/RuntimeDetector.d.ts.map +1 -0
- package/dist/core/RuntimeDetector.js +45 -0
- package/dist/core/RuntimeDetector.js.map +1 -0
- package/dist/core/WinMatrixAgentClient.d.ts +134 -0
- package/dist/core/WinMatrixAgentClient.d.ts.map +1 -0
- package/dist/core/WinMatrixAgentClient.js +382 -0
- package/dist/core/WinMatrixAgentClient.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/DualRuntimeBridge.d.ts +38 -0
- package/dist/runtime/DualRuntimeBridge.d.ts.map +1 -0
- package/dist/runtime/DualRuntimeBridge.js +305 -0
- package/dist/runtime/DualRuntimeBridge.js.map +1 -0
- package/dist/runtime/bridgeConfigLoader.d.ts +14 -0
- package/dist/runtime/bridgeConfigLoader.d.ts.map +1 -0
- package/dist/runtime/bridgeConfigLoader.js +133 -0
- package/dist/runtime/bridgeConfigLoader.js.map +1 -0
- package/dist/runtime/bridgeConfigTypes.d.ts +26 -0
- package/dist/runtime/bridgeConfigTypes.d.ts.map +1 -0
- package/dist/runtime/bridgeConfigTypes.js +6 -0
- package/dist/runtime/bridgeConfigTypes.js.map +1 -0
- package/dist/runtime/bridgeHome.d.ts +19 -0
- package/dist/runtime/bridgeHome.d.ts.map +1 -0
- package/dist/runtime/bridgeHome.js +61 -0
- package/dist/runtime/bridgeHome.js.map +1 -0
- package/dist/runtime/bridgeReconnectPolicy.d.ts +8 -0
- package/dist/runtime/bridgeReconnectPolicy.d.ts.map +1 -0
- package/dist/runtime/bridgeReconnectPolicy.js +16 -0
- package/dist/runtime/bridgeReconnectPolicy.js.map +1 -0
- package/dist/runtime/bridgeTaskJournal.d.ts +7 -0
- package/dist/runtime/bridgeTaskJournal.d.ts.map +1 -0
- package/dist/runtime/bridgeTaskJournal.js +66 -0
- package/dist/runtime/bridgeTaskJournal.js.map +1 -0
- package/dist/runtime/localRuntimeAvailabilityMonitor.d.ts +22 -0
- package/dist/runtime/localRuntimeAvailabilityMonitor.d.ts.map +1 -0
- package/dist/runtime/localRuntimeAvailabilityMonitor.js +81 -0
- package/dist/runtime/localRuntimeAvailabilityMonitor.js.map +1 -0
- package/dist/runtime/runDualRuntimeBridge.d.ts +2 -0
- package/dist/runtime/runDualRuntimeBridge.d.ts.map +1 -0
- package/dist/runtime/runDualRuntimeBridge.js +32 -0
- package/dist/runtime/runDualRuntimeBridge.js.map +1 -0
- package/dist/utils/parseSkillMd.d.ts +10 -0
- package/dist/utils/parseSkillMd.d.ts.map +1 -0
- package/dist/utils/parseSkillMd.js +34 -0
- package/dist/utils/parseSkillMd.js.map +1 -0
- package/dist/utils/processUtils.d.ts +8 -0
- package/dist/utils/processUtils.d.ts.map +1 -0
- package/dist/utils/processUtils.js +31 -0
- package/dist/utils/processUtils.js.map +1 -0
- package/dist/utils/spawnHelper.d.ts +38 -0
- package/dist/utils/spawnHelper.d.ts.map +1 -0
- package/dist/utils/spawnHelper.js +122 -0
- package/dist/utils/spawnHelper.js.map +1 -0
- package/package.json +61 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WinMatrix Agent SDK
|
|
3
|
+
*
|
|
4
|
+
* Public API surface. Re-exports client, adapters, and protocol types.
|
|
5
|
+
*/
|
|
6
|
+
export { WinMatrixAgentClient } from './core/WinMatrixAgentClient.js';
|
|
7
|
+
export { DaemonClient } from './core/DaemonClient.js';
|
|
8
|
+
export { ClaudeAdapter } from './adapters/claude/ClaudeAdapter.js';
|
|
9
|
+
export { parseClaudeLine, splitLines } from './adapters/claude/ClaudeStreamParser.js';
|
|
10
|
+
export { OpenClawAdapter } from './adapters/openclaw/OpenClawAdapter.js';
|
|
11
|
+
export { unwrapOpenClawPayloads } from './adapters/openclaw/unwrapOpenClawPayloads.js';
|
|
12
|
+
export { HermesAdapter } from './adapters/hermes/HermesAdapter.js';
|
|
13
|
+
export {
|
|
14
|
+
// Constants
|
|
15
|
+
METHODS, EVENTS, ERROR_CODES,
|
|
16
|
+
// Helpers
|
|
17
|
+
nextRequestId, createRequest, createEvent, parseFrame, parseResponse, parseEvent,
|
|
18
|
+
// Type guards
|
|
19
|
+
isResponse, isEvent, isRequest, isTaskAssignRequest, isTaskCancelEvent, isTaskResumeEvent, isSessionListRequest, isSessionGetRequest, } from './core/Protocol.js';
|
|
20
|
+
export { LOCAL_FILE_TOOLS, isLocalTool } from './core/AgentAdapter.js';
|
|
21
|
+
// AdapterRegistry
|
|
22
|
+
export { AdapterRegistry, getGlobalRegistry } from './core/AdapterRegistry.js';
|
|
23
|
+
// Runtime 检测
|
|
24
|
+
export { detectRuntimes } from './core/RuntimeDetector.js';
|
|
25
|
+
// Dual Runtime Bridge — JSON configuration(用户目录 ~/.winmatrix-bridge)
|
|
26
|
+
export { loadBridgeConfig, loadBridgeConfigFromJsonFile, loadBridgeConfigFromJsonObject, DEFAULT_BRIDGE_CONFIG_BASENAME, } from './runtime/bridgeConfigLoader.js';
|
|
27
|
+
export { BRIDGE_CONFIG_FILE_VERSION } from './runtime/bridgeConfigTypes.js';
|
|
28
|
+
export { isNonRecoverableExternalAgentAuthError, nextReconnectDelayMs, } from './runtime/bridgeReconnectPolicy.js';
|
|
29
|
+
export { probeLocalHttpEndpoint, startLocalRuntimeAvailabilityMonitor, } from './runtime/localRuntimeAvailabilityMonitor.js';
|
|
30
|
+
export { getBridgeHomeDir, getBridgeConfigPath, ensureBridgeHomeLayout, DEFAULT_BRIDGE_DIR_NAME, BRIDGE_CONFIG_FILENAME, } from './runtime/bridgeHome.js';
|
|
31
|
+
// Spawn helper
|
|
32
|
+
export { spawnHelper } from './utils/spawnHelper.js';
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQtD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAUtF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAGnE,OAAO;AACL,YAAY;AACZ,OAAO,EACP,MAAM,EACN,WAAW;AACX,UAAU;AACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU;AACV,cAAc;AACd,UAAU,EACV,OAAO,EACP,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAuD5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEvE,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG/E,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,qEAAqE;AACrE,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EACL,sCAAsC,EACtC,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,oCAAoC,GACrC,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual runtime bridge for WinMatrix Agent SDK.
|
|
3
|
+
*
|
|
4
|
+
* Connects local Hermes/OpenClaw runtimes to WinMatrix using a shared
|
|
5
|
+
* WebSocket endpoint, while each runtime keeps its own registration identity.
|
|
6
|
+
*/
|
|
7
|
+
type RuntimeKind = 'hermes' | 'openclaw';
|
|
8
|
+
export type RuntimeConfig = {
|
|
9
|
+
kind: RuntimeKind;
|
|
10
|
+
endpoint?: string;
|
|
11
|
+
endpointToken?: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
commandTimeoutMs?: number;
|
|
14
|
+
maxConcurrentTasks: number;
|
|
15
|
+
agentId: string;
|
|
16
|
+
apiKey: string;
|
|
17
|
+
agentName: string;
|
|
18
|
+
agentType: string;
|
|
19
|
+
/** WinMatrix MCP Bridge URL(统一传递给所有适配器类型) */
|
|
20
|
+
mcpBridgeUrl?: string;
|
|
21
|
+
/** MCP Bridge 认证 token */
|
|
22
|
+
mcpApiKey?: string;
|
|
23
|
+
};
|
|
24
|
+
export type BridgeConfig = {
|
|
25
|
+
wsUrl: string;
|
|
26
|
+
runtimes: RuntimeConfig[];
|
|
27
|
+
};
|
|
28
|
+
export type BridgeHandle = {
|
|
29
|
+
stop: () => void;
|
|
30
|
+
states: () => Array<{
|
|
31
|
+
runtime: RuntimeKind;
|
|
32
|
+
state: string;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
export declare function validateBridgeRuntimeList(runtimes: RuntimeConfig[]): void;
|
|
36
|
+
export declare function startDualRuntimeBridge(config: BridgeConfig): Promise<BridgeHandle>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=DualRuntimeBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DualRuntimeBridge.d.ts","sourceRoot":"","sources":["../../src/runtime/DualRuntimeBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAsEzC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AA0DF,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAazE;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA8MxF"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual runtime bridge for WinMatrix Agent SDK.
|
|
3
|
+
*
|
|
4
|
+
* Connects local Hermes/OpenClaw runtimes to WinMatrix using a shared
|
|
5
|
+
* WebSocket endpoint, while each runtime keeps its own registration identity.
|
|
6
|
+
*/
|
|
7
|
+
import { HermesAdapter } from '../adapters/hermes/HermesAdapter.js';
|
|
8
|
+
import { OpenClawAdapter } from '../adapters/openclaw/OpenClawAdapter.js';
|
|
9
|
+
import { unwrapOpenClawPayloads } from '../adapters/openclaw/unwrapOpenClawPayloads.js';
|
|
10
|
+
import { WinMatrixAgentClient } from '../core/WinMatrixAgentClient.js';
|
|
11
|
+
import { exec } from 'node:child_process';
|
|
12
|
+
import { promisify } from 'node:util';
|
|
13
|
+
import { ensureBridgeHomeLayout, getBridgeHomeDir, logPendingTasksRecoveryHint } from './bridgeHome.js';
|
|
14
|
+
import { recordTaskFinished, recordTaskStarted } from './bridgeTaskJournal.js';
|
|
15
|
+
import { isNonRecoverableExternalAgentAuthError, nextReconnectDelayMs, } from './bridgeReconnectPolicy.js';
|
|
16
|
+
import { startLocalRuntimeAvailabilityMonitor } from './localRuntimeAvailabilityMonitor.js';
|
|
17
|
+
function clearBridgeReconnectTimer(m) {
|
|
18
|
+
if (m.reconnectTimer) {
|
|
19
|
+
clearTimeout(m.reconnectTimer);
|
|
20
|
+
m.reconnectTimer = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Blocking until TCP + register succeeds, or a non-recoverable auth error propagates out.
|
|
25
|
+
*/
|
|
26
|
+
async function waitUntilBridgeRegistered(m) {
|
|
27
|
+
let delayMs = 1000;
|
|
28
|
+
for (;;) {
|
|
29
|
+
try {
|
|
30
|
+
await m.client.connect();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (isNonRecoverableExternalAgentAuthError(err)) {
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
38
|
+
console.warn(`[bridge:${m.runtime}] connect failed (${msg}), retry in ${delayMs}ms (recoverable transport/server)`);
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
40
|
+
delayMs = nextReconnectDelayMs(delayMs);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function scheduleManagedBridgeReconnect(m) {
|
|
45
|
+
if (m.stopped)
|
|
46
|
+
return;
|
|
47
|
+
if (m.reconnectTimer)
|
|
48
|
+
return;
|
|
49
|
+
const delay = m.reconnectDelayMs;
|
|
50
|
+
m.reconnectDelayMs = nextReconnectDelayMs(m.reconnectDelayMs);
|
|
51
|
+
m.reconnectTimer = setTimeout(() => {
|
|
52
|
+
m.reconnectTimer = null;
|
|
53
|
+
void (async () => {
|
|
54
|
+
try {
|
|
55
|
+
await m.client.connect();
|
|
56
|
+
m.reconnectDelayMs = 1000;
|
|
57
|
+
console.log(`[bridge:${m.runtime}] reconnected`);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (isNonRecoverableExternalAgentAuthError(err)) {
|
|
61
|
+
console.error(`[bridge:${m.runtime}] reconnect stopped: credentials/registration rejected by server (${err instanceof Error ? err.message : String(err)})`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
console.warn(`[bridge:${m.runtime}] reconnect failed: ${msg}, will retry`);
|
|
66
|
+
scheduleManagedBridgeReconnect(m);
|
|
67
|
+
}
|
|
68
|
+
})();
|
|
69
|
+
}, delay);
|
|
70
|
+
}
|
|
71
|
+
function maskSecret(value) {
|
|
72
|
+
if (value.length <= 8)
|
|
73
|
+
return '****';
|
|
74
|
+
return `${value.slice(0, 4)}***${value.slice(-4)}`;
|
|
75
|
+
}
|
|
76
|
+
const execAsync = promisify(exec);
|
|
77
|
+
function shellEscapeSingleQuoted(value) {
|
|
78
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
79
|
+
}
|
|
80
|
+
async function runCommandTask(commandTemplate, input, timeoutMs, context) {
|
|
81
|
+
const hasPlaceholder = commandTemplate.includes('{input}');
|
|
82
|
+
const command = hasPlaceholder
|
|
83
|
+
? commandTemplate.replaceAll('{input}', shellEscapeSingleQuoted(input))
|
|
84
|
+
: commandTemplate;
|
|
85
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
86
|
+
timeout: timeoutMs,
|
|
87
|
+
env: {
|
|
88
|
+
...process.env,
|
|
89
|
+
WINMATRIX_TASK_INPUT: input,
|
|
90
|
+
...(context?.projectId ? { WINMATRIX_PROJECT_ID: context.projectId } : {}),
|
|
91
|
+
...(context?.projectName ? { WINMATRIX_PROJECT_NAME: context.projectName } : {}),
|
|
92
|
+
...(context?.projectCode ? { WINMATRIX_PROJECT_CODE: context.projectCode } : {}),
|
|
93
|
+
},
|
|
94
|
+
maxBuffer: 1024 * 1024 * 8,
|
|
95
|
+
});
|
|
96
|
+
const out = (stdout ?? '').trim();
|
|
97
|
+
const err = (stderr ?? '').trim();
|
|
98
|
+
if (!out && err)
|
|
99
|
+
return err;
|
|
100
|
+
return out || '{}';
|
|
101
|
+
}
|
|
102
|
+
function summarizeOutput(value) {
|
|
103
|
+
return `len=${value.length}`;
|
|
104
|
+
}
|
|
105
|
+
function sanitizeEndpoint(url) {
|
|
106
|
+
try {
|
|
107
|
+
const parsed = new URL(url);
|
|
108
|
+
return parsed.origin;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return '<invalid-url>';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function sanitizeCommand(cmd) {
|
|
115
|
+
const binary = cmd.split(/\s+/)[0] ?? '';
|
|
116
|
+
return binary.length > 40 ? `${binary.slice(0, 37)}...` : binary;
|
|
117
|
+
}
|
|
118
|
+
export function validateBridgeRuntimeList(runtimes) {
|
|
119
|
+
if (runtimes.length === 0) {
|
|
120
|
+
throw new Error('No runtime enabled. Set at least one of hermes / openclaw in bridge.config.json (or disable flags).');
|
|
121
|
+
}
|
|
122
|
+
for (const runtime of runtimes) {
|
|
123
|
+
if (!runtime.command && !runtime.endpoint) {
|
|
124
|
+
throw new Error(`Runtime ${runtime.kind} requires either command or endpoint in bridge.config.json.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function startDualRuntimeBridge(config) {
|
|
129
|
+
ensureBridgeHomeLayout();
|
|
130
|
+
console.log(`[bridge] user data dir=${getBridgeHomeDir()}`);
|
|
131
|
+
logPendingTasksRecoveryHint();
|
|
132
|
+
const managed = [];
|
|
133
|
+
for (const runtime of config.runtimes) {
|
|
134
|
+
const client = new WinMatrixAgentClient({
|
|
135
|
+
url: config.wsUrl,
|
|
136
|
+
agentId: runtime.agentId,
|
|
137
|
+
apiKey: runtime.apiKey,
|
|
138
|
+
name: runtime.agentName,
|
|
139
|
+
agentType: runtime.agentType,
|
|
140
|
+
capabilities: {
|
|
141
|
+
streaming: true,
|
|
142
|
+
toolCall: true,
|
|
143
|
+
cancellation: true,
|
|
144
|
+
maxConcurrentTasks: runtime.maxConcurrentTasks,
|
|
145
|
+
},
|
|
146
|
+
bridgeHooks: {
|
|
147
|
+
onTaskAssigned: (task) => recordTaskStarted(runtime.kind, task),
|
|
148
|
+
onTaskCompleted: (taskId) => recordTaskFinished(runtime.kind, taskId, 'complete'),
|
|
149
|
+
onTaskFailed: (taskId) => recordTaskFinished(runtime.kind, taskId, 'fail'),
|
|
150
|
+
},
|
|
151
|
+
/** Reconnect/backoff lives in bridge (below), not in WinMatrixAgentClient. */
|
|
152
|
+
autoReconnect: false,
|
|
153
|
+
});
|
|
154
|
+
const m = {
|
|
155
|
+
runtime: runtime.kind,
|
|
156
|
+
client,
|
|
157
|
+
reconnectTimer: null,
|
|
158
|
+
reconnectDelayMs: 1000,
|
|
159
|
+
stopped: false,
|
|
160
|
+
};
|
|
161
|
+
client.on('disconnect', () => {
|
|
162
|
+
console.log(`[bridge:${runtime.kind}] disconnected`);
|
|
163
|
+
if (m.stopped)
|
|
164
|
+
return;
|
|
165
|
+
/* Fresh backoff sequence after an unexpected socket drop — bridge owns retries. */
|
|
166
|
+
m.reconnectDelayMs = 1000;
|
|
167
|
+
scheduleManagedBridgeReconnect(m);
|
|
168
|
+
});
|
|
169
|
+
client.on('error', (err) => {
|
|
170
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
171
|
+
console.error(`[bridge:${runtime.kind}] error: ${msg}`);
|
|
172
|
+
});
|
|
173
|
+
if (runtime.command) {
|
|
174
|
+
client.on('task', (async (payload) => {
|
|
175
|
+
const task = payload;
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
// 命令模式下将 systemPrompt 拼接到 input 前方
|
|
178
|
+
const effectiveInput = task.systemPrompt
|
|
179
|
+
? `${task.systemPrompt}\n\n---\n\n${task.input}`
|
|
180
|
+
: task.input;
|
|
181
|
+
console.log(`[bridge:${runtime.kind}] task start taskId=${task.taskId} inputLength=${effectiveInput.length} timeoutMs=${runtime.commandTimeoutMs ?? 180000}`);
|
|
182
|
+
try {
|
|
183
|
+
const text = await runCommandTask(runtime.command, effectiveInput, runtime.commandTimeoutMs ?? 180000, task.context);
|
|
184
|
+
console.log(`[bridge:${runtime.kind}] runtime output taskId=${task.taskId} length=${text.length} summary=${summarizeOutput(text)}`);
|
|
185
|
+
const unwrapped = unwrapOpenClawPayloads(text);
|
|
186
|
+
let result = unwrapped;
|
|
187
|
+
try {
|
|
188
|
+
result = JSON.parse(unwrapped);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Keep plain text output.
|
|
192
|
+
}
|
|
193
|
+
client.completeTask(task.taskId, result);
|
|
194
|
+
console.log(`[bridge:${runtime.kind}] task complete taskId=${task.taskId} mode=runtime durationMs=${Date.now() - startedAt}`);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
198
|
+
client.failTask(task.taskId, msg);
|
|
199
|
+
console.error(`[bridge:${runtime.kind}] task failed taskId=${task.taskId} durationMs=${Date.now() - startedAt} error=${msg}`);
|
|
200
|
+
}
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// New AgentAdapter-based execution (native protocol)
|
|
205
|
+
const adapter = runtime.kind === 'hermes'
|
|
206
|
+
? new HermesAdapter({
|
|
207
|
+
mcpBridgeUrl: runtime.mcpBridgeUrl ?? runtime.endpoint,
|
|
208
|
+
mcpApiKey: runtime.mcpApiKey ?? runtime.endpointToken,
|
|
209
|
+
})
|
|
210
|
+
: new OpenClawAdapter({
|
|
211
|
+
token: runtime.endpointToken,
|
|
212
|
+
mcpBridgeUrl: runtime.mcpBridgeUrl,
|
|
213
|
+
mcpApiKey: runtime.mcpApiKey ?? runtime.endpointToken,
|
|
214
|
+
});
|
|
215
|
+
// Session query handler: route server RPC to adapter
|
|
216
|
+
client.setSessionQueryHandler(async (method, params) => {
|
|
217
|
+
if (method === 'session.list') {
|
|
218
|
+
return adapter.listSessions?.(params) ?? { sessions: [], total: 0 };
|
|
219
|
+
}
|
|
220
|
+
if (method === 'session.get') {
|
|
221
|
+
const p = params;
|
|
222
|
+
return adapter.getSession?.(p.sessionId, p) ?? { sessionId: p.sessionId, title: 'N/A', createdAt: '', updatedAt: '' };
|
|
223
|
+
}
|
|
224
|
+
throw new Error(`Unsupported session method: ${method}`);
|
|
225
|
+
});
|
|
226
|
+
client.on('task', (async (payload) => {
|
|
227
|
+
const task = payload;
|
|
228
|
+
const startedAt = Date.now();
|
|
229
|
+
console.log(`[bridge:${runtime.kind}] task start taskId=${task.taskId} inputLength=${task.input.length}`);
|
|
230
|
+
try {
|
|
231
|
+
for await (const event of adapter.execute({
|
|
232
|
+
taskId: task.taskId,
|
|
233
|
+
input: task.input,
|
|
234
|
+
workDir: undefined,
|
|
235
|
+
systemPrompt: task.systemPrompt,
|
|
236
|
+
})) {
|
|
237
|
+
if (m.stopped)
|
|
238
|
+
break;
|
|
239
|
+
switch (event.type) {
|
|
240
|
+
case 'delta':
|
|
241
|
+
client.streamDelta(task.taskId, event.content);
|
|
242
|
+
break;
|
|
243
|
+
case 'thinking':
|
|
244
|
+
client.streamDelta(task.taskId, `[思考] ${event.content}`);
|
|
245
|
+
break;
|
|
246
|
+
case 'tool_call':
|
|
247
|
+
try {
|
|
248
|
+
const toolResult = await client.callTool(event.name, event.args, task.taskId);
|
|
249
|
+
// Tool result handled by adapter via MCP bridge
|
|
250
|
+
void toolResult;
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.error(`[bridge:${runtime.kind}] tool call failed tool=${event.name} error=${err instanceof Error ? err.message : String(err)}`);
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
case 'result':
|
|
257
|
+
client.completeTask(task.taskId, event.content, event.sessionId, event.usage);
|
|
258
|
+
console.log(`[bridge:${runtime.kind}] task complete taskId=${task.taskId} sessionId=${event.sessionId ?? '-'} durationMs=${Date.now() - startedAt}`);
|
|
259
|
+
return;
|
|
260
|
+
case 'error':
|
|
261
|
+
client.failTask(task.taskId, event.message);
|
|
262
|
+
console.error(`[bridge:${runtime.kind}] task error taskId=${task.taskId} error=${event.message}`);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
269
|
+
client.failTask(task.taskId, msg);
|
|
270
|
+
console.error(`[bridge:${runtime.kind}] task failed taskId=${task.taskId} durationMs=${Date.now() - startedAt} error=${msg}`);
|
|
271
|
+
}
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
console.log(`[bridge:${runtime.kind}] connecting ws=${sanitizeEndpoint(config.wsUrl)} agentId=${runtime.agentId} apiKey=${maskSecret(runtime.apiKey)} mode=${runtime.command ? 'command' : 'http'} maxConcurrentTasks=${runtime.maxConcurrentTasks} target=${runtime.command ? sanitizeCommand(runtime.command) : (runtime.endpoint ? sanitizeEndpoint(runtime.endpoint) : '(none)')}`);
|
|
275
|
+
managed.push(m);
|
|
276
|
+
await waitUntilBridgeRegistered(m);
|
|
277
|
+
console.log(`[bridge:${runtime.kind}] registered state=${client.getState()}`);
|
|
278
|
+
m.disposeLocalRuntimeAvailability = startLocalRuntimeAvailabilityMonitor({
|
|
279
|
+
client,
|
|
280
|
+
runtimeKind: runtime.kind,
|
|
281
|
+
mode: runtime.command ? 'command' : 'endpoint',
|
|
282
|
+
endpointUrl: runtime.endpoint,
|
|
283
|
+
isStopped: () => m.stopped,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
const heartbeat = setInterval(() => {
|
|
287
|
+
const line = managed
|
|
288
|
+
.map((item) => `${item.runtime}:${item.client.getState()}`)
|
|
289
|
+
.join(' ');
|
|
290
|
+
console.log(`[bridge] states ${line}`);
|
|
291
|
+
}, 20_000);
|
|
292
|
+
return {
|
|
293
|
+
stop: () => {
|
|
294
|
+
clearInterval(heartbeat);
|
|
295
|
+
for (const item of managed) {
|
|
296
|
+
item.stopped = true;
|
|
297
|
+
clearBridgeReconnectTimer(item);
|
|
298
|
+
item.disposeLocalRuntimeAvailability?.();
|
|
299
|
+
item.client.disconnect();
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
states: () => managed.map((item) => ({ runtime: item.runtime, state: item.client.getState() })),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=DualRuntimeBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DualRuntimeBridge.js","sourceRoot":"","sources":["../../src/runtime/DualRuntimeBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BridgeConfig } from './DualRuntimeBridge.js';
|
|
2
|
+
export declare const DEFAULT_BRIDGE_CONFIG_BASENAME = "bridge.config.json";
|
|
3
|
+
/** 解析任意 JSON 对象为运行时配置(供测试或外部嵌入调用)。 */
|
|
4
|
+
export declare function loadBridgeConfigFromJsonObject(data: unknown): BridgeConfig;
|
|
5
|
+
export declare function loadBridgeConfigFromJsonFile(absPath: string): BridgeConfig;
|
|
6
|
+
/**
|
|
7
|
+
* 解析顺序:
|
|
8
|
+
* 1. 若设置了 `WINMATRIX_BRIDGE_CONFIG`,仅从该路径读 JSON(文件必须存在);
|
|
9
|
+
* 2. 否则读取用户目录 `{WINMATRIX_BRIDGE_HOME or ~/.winmatrix-bridge}/bridge.config.json`。
|
|
10
|
+
*
|
|
11
|
+
* 不再从 `.env` 或进程环境变量读取桥接配置。
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadBridgeConfig(): BridgeConfig;
|
|
14
|
+
//# sourceMappingURL=bridgeConfigLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridgeConfigLoader.js","sourceRoot":"","sources":["../../src/runtime/bridgeConfigLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridgeConfigTypes.js","sourceRoot":"","sources":["../../src/runtime/bridgeConfigTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAU,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|