synthos 0.7.1 → 0.8.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/README.md +215 -65
- package/default-pages/application.json +1 -0
- package/default-pages/json_tools.json +1 -1
- package/default-pages/oregon_trail.html +321 -0
- package/default-pages/oregon_trail.json +12 -0
- package/default-pages/sidebar_page.json +1 -0
- package/default-pages/solar_explorer.html +10 -18
- package/default-pages/solar_explorer.json +2 -2
- package/default-pages/two-panel_page.json +1 -0
- package/default-pages/us_map.html +192 -0
- package/default-pages/us_map.json +12 -0
- package/default-pages/us_map_1850.html +325 -0
- package/default-pages/us_map_1850.json +12 -0
- package/default-pages/western_cities_1850.html +526 -0
- package/default-pages/western_cities_1850.json +12 -0
- package/default-themes/{nebula-dawn.css → nebula-dawn.v2.css} +24 -0
- package/default-themes/{nebula-dusk.css → nebula-dusk.v2.css} +24 -0
- package/dist/agents/a2a/a2aProvider.d.ts +3 -0
- package/dist/agents/a2a/a2aProvider.d.ts.map +1 -0
- package/dist/agents/a2a/a2aProvider.js +126 -0
- package/dist/agents/a2a/a2aProvider.js.map +1 -0
- package/dist/agents/discovery.d.ts +30 -0
- package/dist/agents/discovery.d.ts.map +1 -0
- package/dist/agents/discovery.js +52 -0
- package/dist/agents/discovery.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +19 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/openclaw/gatewayManager.d.ts +113 -0
- package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -0
- package/dist/agents/openclaw/gatewayManager.js +470 -0
- package/dist/agents/openclaw/gatewayManager.js.map +1 -0
- package/dist/agents/openclaw/openclawProvider.d.ts +3 -0
- package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -0
- package/dist/agents/openclaw/openclawProvider.js +239 -0
- package/dist/agents/openclaw/openclawProvider.js.map +1 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts +23 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -0
- package/dist/agents/openclaw/sshTunnelManager.js +340 -0
- package/dist/agents/openclaw/sshTunnelManager.js.map +1 -0
- package/dist/agents/types.d.ts +64 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +6 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/connectors/airtable/connector.json +27 -0
- package/dist/connectors/alpha-vantage/connector.json +26 -0
- package/dist/connectors/brave-search/connector.json +26 -0
- package/dist/connectors/cloudinary/connector.json +27 -0
- package/dist/connectors/deepl/connector.json +28 -0
- package/dist/connectors/elevenlabs/connector.json +30 -0
- package/dist/connectors/giphy/connector.json +27 -0
- package/dist/connectors/github/connector.json +29 -0
- package/dist/connectors/huggingface/connector.json +27 -0
- package/dist/connectors/imgur/connector.json +29 -0
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/instagram/connector.json +43 -0
- package/dist/connectors/jira/connector.json +28 -0
- package/dist/connectors/mapbox/connector.json +26 -0
- package/dist/connectors/nasa/connector.json +27 -0
- package/dist/connectors/newsapi/connector.json +27 -0
- package/dist/connectors/notion/connector.json +28 -0
- package/dist/connectors/open-exchange-rates/connector.json +27 -0
- package/dist/connectors/openweathermap/connector.json +26 -0
- package/dist/connectors/pexels/connector.json +27 -0
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +42 -96
- package/dist/connectors/registry.js.map +1 -1
- package/dist/connectors/resend/connector.json +29 -0
- package/dist/connectors/rss2json/connector.json +27 -0
- package/dist/connectors/sendgrid/connector.json +27 -0
- package/dist/connectors/spoonacular/connector.json +28 -0
- package/dist/connectors/stability-ai/connector.json +27 -0
- package/dist/connectors/twilio/connector.json +28 -0
- package/dist/connectors/types.d.ts +23 -0
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/connectors/unsplash/connector.json +27 -0
- package/dist/connectors/wolfram-alpha/connector.json +26 -0
- package/dist/connectors/youtube-data/connector.json +30 -0
- package/dist/files.d.ts +1 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +16 -1
- package/dist/files.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +28 -0
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts +3 -2
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +122 -138
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +22 -0
- package/dist/models/anthropic.d.ts.map +1 -0
- package/dist/models/anthropic.js +76 -0
- package/dist/models/anthropic.js.map +1 -0
- package/dist/models/chainOfThought.d.ts +12 -0
- package/dist/models/chainOfThought.d.ts.map +1 -0
- package/dist/models/chainOfThought.js +45 -0
- package/dist/models/chainOfThought.js.map +1 -0
- package/dist/models/fireworksai.d.ts +30 -0
- package/dist/models/fireworksai.d.ts.map +1 -0
- package/dist/models/fireworksai.js +133 -0
- package/dist/models/fireworksai.js.map +1 -0
- package/dist/models/index.d.ts +7 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +19 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/logCompletePrompt.d.ts +3 -0
- package/dist/models/logCompletePrompt.d.ts.map +1 -0
- package/dist/models/logCompletePrompt.js +23 -0
- package/dist/models/logCompletePrompt.js.map +1 -0
- package/dist/models/openai.d.ts +24 -0
- package/dist/models/openai.d.ts.map +1 -0
- package/dist/models/openai.js +80 -0
- package/dist/models/openai.js.map +1 -0
- package/dist/models/providers.d.ts +1 -0
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +12 -4
- package/dist/models/providers.js.map +1 -1
- package/dist/models/types.d.ts +34 -2
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +16 -0
- package/dist/models/types.js.map +1 -1
- package/dist/models/utils.d.ts +6 -0
- package/dist/models/utils.d.ts.map +1 -0
- package/dist/models/utils.js +21 -0
- package/dist/models/utils.js.map +1 -0
- package/dist/scripts.d.ts +2 -1
- package/dist/scripts.d.ts.map +1 -1
- package/dist/scripts.js +4 -3
- package/dist/scripts.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts +1 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +9 -6
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/generateImage.d.ts +1 -1
- package/dist/service/generateImage.d.ts.map +1 -1
- package/dist/service/generateImage.js +3 -3
- package/dist/service/generateImage.js.map +1 -1
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +3 -0
- package/dist/service/server.js.map +1 -1
- package/dist/service/transformPage.d.ts +4 -2
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +74 -6
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useAgentRoutes.d.ts +4 -0
- package/dist/service/useAgentRoutes.d.ts.map +1 -0
- package/dist/service/useAgentRoutes.js +389 -0
- package/dist/service/useAgentRoutes.js.map +1 -0
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +157 -16
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.d.ts.map +1 -1
- package/dist/service/useConnectorRoutes.js +14 -3
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useGatewayRoutes.d.ts +4 -0
- package/dist/service/useGatewayRoutes.d.ts.map +1 -0
- package/dist/service/useGatewayRoutes.js +168 -0
- package/dist/service/useGatewayRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +16 -5
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/settings.d.ts +2 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +4 -8
- package/dist/settings.js.map +1 -1
- package/dist/themes.d.ts +14 -0
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +86 -13
- package/dist/themes.js.map +1 -1
- package/package.json +10 -5
- package/page-scripts/helpers-v2.js +222 -0
- package/page-scripts/page-v2.js +656 -0
- package/required-pages/builder.html +1 -27
- package/required-pages/pages.html +745 -22
- package/required-pages/settings.html +819 -21
- package/required-pages/synthos_apis.html +56 -1
- package/src/agents/a2a/a2aProvider.ts +110 -0
- package/src/agents/discovery.ts +74 -0
- package/src/agents/index.ts +6 -0
- package/src/agents/openclaw/gatewayManager.ts +559 -0
- package/src/agents/openclaw/openclawProvider.ts +261 -0
- package/src/agents/openclaw/sshTunnelManager.ts +385 -0
- package/src/agents/types.ts +82 -0
- package/src/connectors/airtable/connector.json +27 -0
- package/src/connectors/alpha-vantage/connector.json +26 -0
- package/src/connectors/brave-search/connector.json +26 -0
- package/src/connectors/cloudinary/connector.json +27 -0
- package/src/connectors/deepl/connector.json +28 -0
- package/src/connectors/elevenlabs/connector.json +30 -0
- package/src/connectors/giphy/connector.json +27 -0
- package/src/connectors/github/connector.json +29 -0
- package/src/connectors/huggingface/connector.json +27 -0
- package/src/connectors/imgur/connector.json +29 -0
- package/src/connectors/index.ts +2 -0
- package/src/connectors/instagram/connector.json +43 -0
- package/src/connectors/jira/connector.json +28 -0
- package/src/connectors/mapbox/connector.json +26 -0
- package/src/connectors/nasa/connector.json +27 -0
- package/src/connectors/newsapi/connector.json +27 -0
- package/src/connectors/notion/connector.json +28 -0
- package/src/connectors/open-exchange-rates/connector.json +27 -0
- package/src/connectors/openweathermap/connector.json +26 -0
- package/src/connectors/pexels/connector.json +27 -0
- package/src/connectors/registry.ts +21 -97
- package/src/connectors/resend/connector.json +29 -0
- package/src/connectors/rss2json/connector.json +27 -0
- package/src/connectors/sendgrid/connector.json +27 -0
- package/src/connectors/spoonacular/connector.json +28 -0
- package/src/connectors/stability-ai/connector.json +27 -0
- package/src/connectors/twilio/connector.json +28 -0
- package/src/connectors/types.ts +25 -0
- package/src/connectors/unsplash/connector.json +27 -0
- package/src/connectors/wolfram-alpha/connector.json +26 -0
- package/src/connectors/youtube-data/connector.json +30 -0
- package/src/files.ts +14 -0
- package/src/init.ts +27 -0
- package/src/migrations.ts +121 -138
- package/src/models/anthropic.ts +89 -0
- package/src/models/chainOfThought.ts +56 -0
- package/src/models/fireworksai.ts +136 -0
- package/src/models/index.ts +7 -1
- package/src/models/logCompletePrompt.ts +25 -0
- package/src/models/openai.ts +90 -0
- package/src/models/providers.ts +12 -3
- package/src/models/types.ts +67 -2
- package/src/models/utils.ts +16 -0
- package/src/scripts.ts +2 -2
- package/src/service/createCompletePrompt.ts +3 -1
- package/src/service/generateImage.ts +2 -2
- package/src/service/server.ts +4 -0
- package/src/service/transformPage.ts +81 -8
- package/src/service/useAgentRoutes.ts +423 -0
- package/src/service/useApiRoutes.ts +173 -18
- package/src/service/useConnectorRoutes.ts +14 -3
- package/src/service/usePageRoutes.ts +20 -6
- package/src/settings.ts +6 -10
- package/src/themes.ts +84 -12
- package/tests/README.md +12 -0
- package/tests/anthropic.spec.ts +84 -0
- package/tests/chainOfThought.spec.ts +108 -0
- package/tests/ensureScripts.spec.ts +82 -0
- package/tests/files.spec.ts +233 -0
- package/tests/fireworksai.spec.ts +92 -0
- package/tests/logCompletePrompt.spec.ts +74 -0
- package/tests/migrations.spec.ts +169 -0
- package/tests/openai.spec.ts +71 -0
- package/tests/pages.spec.ts +328 -0
- package/tests/providers.spec.ts +144 -0
- package/tests/scripts.spec.ts +209 -0
- package/tests/transformPage.spec.ts +931 -0
- package/tests/types.spec.ts +23 -0
- package/default-pages/app_builder.json +0 -1
- package/default-pages/sidebar_builder.json +0 -1
- package/default-pages/two-panel_builder.json +0 -1
- package/images/home.png +0 -0
- package/images/page-management.png +0 -0
- package/images/settings.png +0 -0
- package/images/synthos-square.png +0 -0
- /package/default-pages/{app_builder.html → application.html} +0 -0
- /package/default-pages/{sidebar_builder.html → sidebar_page.html} +0 -0
- /package/default-pages/{two-panel_builder.html → two-panel_page.html} +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openclawProvider = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const gatewayManager_1 = require("./gatewayManager");
|
|
6
|
+
/**
|
|
7
|
+
* OpenClaw provider that communicates over the gateway WebSocket.
|
|
8
|
+
*
|
|
9
|
+
* Chat flow:
|
|
10
|
+
* 1. Ensure WebSocket connection (connectAgent)
|
|
11
|
+
* 2. Resolve the main session key (sessions.resolve)
|
|
12
|
+
* 3. Send message via chat.send RPC → returns { runId, status: "started" }
|
|
13
|
+
* 4. Listen for "chat" events with matching runId for streamed response
|
|
14
|
+
*/
|
|
15
|
+
/** Get or create a WebSocket connection for an agent. */
|
|
16
|
+
async function getConnection(agent) {
|
|
17
|
+
if (!agent.token)
|
|
18
|
+
throw new Error(`Agent "${agent.name}" has no token configured`);
|
|
19
|
+
return (0, gatewayManager_1.connectAgent)({ id: agent.id, name: agent.name, url: agent.url, token: agent.token });
|
|
20
|
+
}
|
|
21
|
+
/** Get the session key from agent config or resolve it. */
|
|
22
|
+
async function resolveSessionKey(agent, conn) {
|
|
23
|
+
if (agent.sessionKey)
|
|
24
|
+
return agent.sessionKey;
|
|
25
|
+
const result = await (0, gatewayManager_1.request)(conn, 'sessions.resolve', {});
|
|
26
|
+
if (!result.key || typeof result.key !== 'string') {
|
|
27
|
+
throw new Error('Failed to resolve session key — set a Default Session Key in agent settings');
|
|
28
|
+
}
|
|
29
|
+
return result.key;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Filter out noise from chat history — heartbeats, tool output, media refs, etc.
|
|
33
|
+
* Returns true if the message should be excluded.
|
|
34
|
+
*/
|
|
35
|
+
function isNoiseMessage(role, content) {
|
|
36
|
+
const trimmed = content.trim();
|
|
37
|
+
if (!trimmed)
|
|
38
|
+
return true;
|
|
39
|
+
// Heartbeat prompts (user) and responses (assistant)
|
|
40
|
+
if (content.includes('"conversation_label"') && content.includes('heartbeat'))
|
|
41
|
+
return true;
|
|
42
|
+
if (trimmed === 'HEARTBEAT_OK')
|
|
43
|
+
return true;
|
|
44
|
+
// Raw JSON tool output (starts with { and looks like a JSON blob)
|
|
45
|
+
if (trimmed.startsWith('{') && (trimmed.includes('"targetId"') ||
|
|
46
|
+
trimmed.includes('"ok"') ||
|
|
47
|
+
trimmed.includes('"error"') ||
|
|
48
|
+
trimmed.includes('"url"') ||
|
|
49
|
+
trimmed.includes('"format"')))
|
|
50
|
+
return true;
|
|
51
|
+
// OpenClaw security notice / browser content injection
|
|
52
|
+
if (trimmed.startsWith('SECURITY NOTICE:'))
|
|
53
|
+
return true;
|
|
54
|
+
// Media file references
|
|
55
|
+
if (trimmed.startsWith('MEDIA:'))
|
|
56
|
+
return true;
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
exports.openclawProvider = {
|
|
60
|
+
async send(agent, message, attachments) {
|
|
61
|
+
const conn = await getConnection(agent);
|
|
62
|
+
const sessionKey = await resolveSessionKey(agent, conn);
|
|
63
|
+
// Collect response text from chat events
|
|
64
|
+
let responseText = '';
|
|
65
|
+
let done = false;
|
|
66
|
+
const chatListener = (payload) => {
|
|
67
|
+
const evt = payload;
|
|
68
|
+
const state = evt.state;
|
|
69
|
+
const msg = evt.message;
|
|
70
|
+
if (msg?.content && Array.isArray(msg.content)) {
|
|
71
|
+
for (const part of msg.content) {
|
|
72
|
+
const p = part;
|
|
73
|
+
if (p.type === 'text' && typeof p.text === 'string') {
|
|
74
|
+
responseText = p.text;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (state === 'final' || state === 'error') {
|
|
79
|
+
done = true;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
(0, gatewayManager_1.onEvent)(conn, 'chat', chatListener);
|
|
83
|
+
try {
|
|
84
|
+
// Send the message — returns immediately with { runId, status: "started" }
|
|
85
|
+
await (0, gatewayManager_1.request)(conn, 'chat.send', {
|
|
86
|
+
sessionKey,
|
|
87
|
+
message,
|
|
88
|
+
idempotencyKey: (0, crypto_1.randomUUID)(),
|
|
89
|
+
...(attachments?.length ? { attachments } : {}),
|
|
90
|
+
}, { expectFinal: false });
|
|
91
|
+
// Wait for the chat to complete (poll with timeout)
|
|
92
|
+
const timeout = 60_000;
|
|
93
|
+
const start = Date.now();
|
|
94
|
+
while (!done && Date.now() - start < timeout) {
|
|
95
|
+
await new Promise(r => setTimeout(r, 100));
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
kind: 'message',
|
|
99
|
+
text: responseText || undefined,
|
|
100
|
+
raw: { sessionKey, text: responseText },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
(0, gatewayManager_1.offEvent)(conn, 'chat', chatListener);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
async *sendStream(agent, message, attachments) {
|
|
108
|
+
const conn = await getConnection(agent);
|
|
109
|
+
const sessionKey = await resolveSessionKey(agent, conn);
|
|
110
|
+
// Set up an event queue for streaming
|
|
111
|
+
const queue = [];
|
|
112
|
+
let done = false;
|
|
113
|
+
let resolveWait = null;
|
|
114
|
+
// Use agent events for token-by-token streaming deltas,
|
|
115
|
+
// and chat events for final state detection.
|
|
116
|
+
const agentListener = (payload) => {
|
|
117
|
+
const evt = payload;
|
|
118
|
+
const stream = evt.stream;
|
|
119
|
+
const data = evt.data;
|
|
120
|
+
if (stream === 'assistant' && data?.delta && typeof data.delta === 'string') {
|
|
121
|
+
queue.push({ kind: 'text', data: data.delta });
|
|
122
|
+
}
|
|
123
|
+
if (stream === 'lifecycle' && data?.phase === 'end') {
|
|
124
|
+
queue.push({ kind: 'done', data: null });
|
|
125
|
+
done = true;
|
|
126
|
+
}
|
|
127
|
+
if (resolveWait) {
|
|
128
|
+
resolveWait();
|
|
129
|
+
resolveWait = null;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const chatListener = (payload) => {
|
|
133
|
+
const evt = payload;
|
|
134
|
+
const state = evt.state;
|
|
135
|
+
if (state === 'error') {
|
|
136
|
+
const errorMsg = evt.error?.message ?? 'Unknown error';
|
|
137
|
+
queue.push({ kind: 'error', data: errorMsg });
|
|
138
|
+
done = true;
|
|
139
|
+
if (resolveWait) {
|
|
140
|
+
resolveWait();
|
|
141
|
+
resolveWait = null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
(0, gatewayManager_1.onEvent)(conn, 'agent', agentListener);
|
|
146
|
+
(0, gatewayManager_1.onEvent)(conn, 'chat', chatListener);
|
|
147
|
+
try {
|
|
148
|
+
// Send the message
|
|
149
|
+
await (0, gatewayManager_1.request)(conn, 'chat.send', {
|
|
150
|
+
sessionKey,
|
|
151
|
+
message,
|
|
152
|
+
idempotencyKey: (0, crypto_1.randomUUID)(),
|
|
153
|
+
...(attachments?.length ? { attachments } : {}),
|
|
154
|
+
}, { expectFinal: false });
|
|
155
|
+
// Yield events as they arrive
|
|
156
|
+
const timeout = 60_000;
|
|
157
|
+
const start = Date.now();
|
|
158
|
+
while (!done && Date.now() - start < timeout) {
|
|
159
|
+
if (queue.length === 0) {
|
|
160
|
+
await new Promise(r => {
|
|
161
|
+
resolveWait = r;
|
|
162
|
+
setTimeout(r, 500);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
while (queue.length > 0) {
|
|
166
|
+
yield queue.shift();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!done) {
|
|
170
|
+
yield { kind: 'error', data: 'Chat response timed out' };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
(0, gatewayManager_1.offEvent)(conn, 'agent', agentListener);
|
|
175
|
+
(0, gatewayManager_1.offEvent)(conn, 'chat', chatListener);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
supportsStreaming() {
|
|
179
|
+
return true;
|
|
180
|
+
},
|
|
181
|
+
async getHistory(agent) {
|
|
182
|
+
const conn = await getConnection(agent);
|
|
183
|
+
const sessionKey = await resolveSessionKey(agent, conn);
|
|
184
|
+
const result = await (0, gatewayManager_1.request)(conn, 'chat.history', { sessionKey });
|
|
185
|
+
// Discovery log removed — response is too large for routine logging
|
|
186
|
+
// Normalize: expect result to have a messages array (adjust once we see the real shape)
|
|
187
|
+
const raw = result;
|
|
188
|
+
const items = (raw.messages ?? raw.items ?? raw.history ?? []);
|
|
189
|
+
const messages = [];
|
|
190
|
+
for (const item of items) {
|
|
191
|
+
const m = item;
|
|
192
|
+
const rawRole = m.role ?? 'assistant';
|
|
193
|
+
// Skip toolCall / toolResult pairs entirely — not user-visible
|
|
194
|
+
if (rawRole === 'toolResult' || rawRole === 'tool')
|
|
195
|
+
continue;
|
|
196
|
+
if (rawRole === 'assistant' && Array.isArray(m.content)) {
|
|
197
|
+
const hasOnlyToolCalls = m.content.every(p => p.type === 'toolCall' || p.type === 'tool_use');
|
|
198
|
+
if (hasOnlyToolCalls)
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const role = rawRole === 'user' ? 'user' : 'assistant';
|
|
202
|
+
// Extract text from content array if present
|
|
203
|
+
let content = '';
|
|
204
|
+
if (typeof m.content === 'string') {
|
|
205
|
+
content = m.content;
|
|
206
|
+
}
|
|
207
|
+
else if (Array.isArray(m.content)) {
|
|
208
|
+
for (const part of m.content) {
|
|
209
|
+
const p = part;
|
|
210
|
+
if (p.type === 'text' && typeof p.text === 'string') {
|
|
211
|
+
content += p.text;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (isNoiseMessage(role, content))
|
|
216
|
+
continue;
|
|
217
|
+
messages.push({
|
|
218
|
+
role,
|
|
219
|
+
content,
|
|
220
|
+
timestamp: m.timestamp,
|
|
221
|
+
raw: m,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return messages;
|
|
225
|
+
},
|
|
226
|
+
async abortChat(agent) {
|
|
227
|
+
const conn = await getConnection(agent);
|
|
228
|
+
const sessionKey = await resolveSessionKey(agent, conn);
|
|
229
|
+
const result = await (0, gatewayManager_1.request)(conn, 'chat.abort', { sessionKey });
|
|
230
|
+
console.log('[OpenClaw] ← raw chat.abort:', JSON.stringify(result, null, 2));
|
|
231
|
+
},
|
|
232
|
+
async clearSession(agent) {
|
|
233
|
+
const conn = await getConnection(agent);
|
|
234
|
+
const sessionKey = await resolveSessionKey(agent, conn);
|
|
235
|
+
const result = await (0, gatewayManager_1.request)(conn, 'sessions.reset', { sessionKey });
|
|
236
|
+
console.log('[OpenClaw] ← raw sessions.reset:', JSON.stringify(result, null, 2));
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=openclawProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclawProvider.js","sourceRoot":"","sources":["../../../src/agents/openclaw/openclawProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface SshTunnelConfig {
|
|
2
|
+
/** Full SSH command, e.g. "ssh -p 22 -N -L 18789:127.0.0.1:43901 root@1.2.3.4" */
|
|
3
|
+
command: string;
|
|
4
|
+
/** Password to pipe when prompted */
|
|
5
|
+
password: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Start an SSH tunnel for the given agent. Resolves once the tunnel appears
|
|
9
|
+
* ready (local port probe succeeds or delay elapses).
|
|
10
|
+
*/
|
|
11
|
+
export declare function startTunnel(agentId: string, config: SshTunnelConfig): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Stop the SSH tunnel for the given agent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function stopTunnel(agentId: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get tunnel status without starting it.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getTunnelStatus(agentId: string): {
|
|
20
|
+
running: boolean;
|
|
21
|
+
reconnecting: boolean;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=sshTunnelManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sshTunnelManager.d.ts","sourceRoot":"","sources":["../../../src/agents/openclaw/sshTunnelManager.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC5B,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CACpB;AA+ED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBzF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAM5F"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.getTunnelStatus = exports.stopTunnel = exports.startTunnel = void 0;
|
|
27
|
+
const child_process_1 = require("child_process");
|
|
28
|
+
const net = __importStar(require("net"));
|
|
29
|
+
const fs = __importStar(require("fs"));
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
const os = __importStar(require("os"));
|
|
32
|
+
const crypto_1 = require("crypto");
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Constants
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
const TUNNEL_READY_PROBE_DELAY_MS = 2_000;
|
|
37
|
+
const BASE_RECONNECT_DELAY_MS = 2_000;
|
|
38
|
+
const MAX_RECONNECT_DELAY_MS = 120_000;
|
|
39
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Shared askpass script — reads password from an env var, never touches disk
|
|
42
|
+
// with the actual secret. One script is created per process lifetime and
|
|
43
|
+
// reused by all tunnels. Each tunnel sets a unique env var name so concurrent
|
|
44
|
+
// tunnels don't collide.
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
let sharedAskpassPath = null;
|
|
47
|
+
/**
|
|
48
|
+
* Env-var-based askpass script. The script reads the env var whose name is
|
|
49
|
+
* passed via SYNTHOS_SSH_PASS_VAR and echoes its value.
|
|
50
|
+
*
|
|
51
|
+
* Windows .bat: echo %<varName>%
|
|
52
|
+
* Unix .sh: eval echo \$<varName>
|
|
53
|
+
*/
|
|
54
|
+
function getAskpassScript() {
|
|
55
|
+
if (sharedAskpassPath && fs.existsSync(sharedAskpassPath)) {
|
|
56
|
+
return sharedAskpassPath;
|
|
57
|
+
}
|
|
58
|
+
const tmpDir = os.tmpdir();
|
|
59
|
+
if (IS_WINDOWS) {
|
|
60
|
+
const p = path.join(tmpDir, 'synthos-askpass.bat');
|
|
61
|
+
// %SYNTHOS_SSH_PASS_VAR% holds the NAME of the var containing the password
|
|
62
|
+
// We use delayed expansion to read it indirectly
|
|
63
|
+
fs.writeFileSync(p, '@echo off\r\n' +
|
|
64
|
+
'setlocal enabledelayedexpansion\r\n' +
|
|
65
|
+
'echo !%SYNTHOS_SSH_PASS_VAR%!\r\n', { mode: 0o700 });
|
|
66
|
+
sharedAskpassPath = p;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const p = path.join(tmpDir, 'synthos-askpass.sh');
|
|
70
|
+
fs.writeFileSync(p, '#!/bin/sh\n' +
|
|
71
|
+
'eval echo \\$"$SYNTHOS_SSH_PASS_VAR"\n', { mode: 0o700 });
|
|
72
|
+
sharedAskpassPath = p;
|
|
73
|
+
}
|
|
74
|
+
return sharedAskpassPath;
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Module-level tunnel pool
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
const tunnels = new Map();
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Public API
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Start an SSH tunnel for the given agent. Resolves once the tunnel appears
|
|
85
|
+
* ready (local port probe succeeds or delay elapses).
|
|
86
|
+
*/
|
|
87
|
+
async function startTunnel(agentId, config) {
|
|
88
|
+
// If already running, nothing to do
|
|
89
|
+
const existing = tunnels.get(agentId);
|
|
90
|
+
if (existing?.running) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const entry = existing ?? {
|
|
94
|
+
agentId,
|
|
95
|
+
config,
|
|
96
|
+
process: null,
|
|
97
|
+
running: false,
|
|
98
|
+
reconnecting: false,
|
|
99
|
+
intentionalStop: false,
|
|
100
|
+
reconnectTimer: null,
|
|
101
|
+
reconnectAttempts: 0,
|
|
102
|
+
};
|
|
103
|
+
entry.config = config;
|
|
104
|
+
entry.intentionalStop = false;
|
|
105
|
+
tunnels.set(agentId, entry);
|
|
106
|
+
return spawnTunnel(entry);
|
|
107
|
+
}
|
|
108
|
+
exports.startTunnel = startTunnel;
|
|
109
|
+
/**
|
|
110
|
+
* Stop the SSH tunnel for the given agent.
|
|
111
|
+
*/
|
|
112
|
+
function stopTunnel(agentId) {
|
|
113
|
+
const entry = tunnels.get(agentId);
|
|
114
|
+
if (!entry)
|
|
115
|
+
return;
|
|
116
|
+
entry.intentionalStop = true;
|
|
117
|
+
if (entry.reconnectTimer) {
|
|
118
|
+
clearTimeout(entry.reconnectTimer);
|
|
119
|
+
entry.reconnectTimer = null;
|
|
120
|
+
}
|
|
121
|
+
if (entry.process) {
|
|
122
|
+
entry.process.kill();
|
|
123
|
+
entry.process = null;
|
|
124
|
+
}
|
|
125
|
+
entry.running = false;
|
|
126
|
+
entry.reconnecting = false;
|
|
127
|
+
tunnels.delete(agentId);
|
|
128
|
+
console.log(`[SSH Tunnel] Stopped tunnel for agent "${agentId}"`);
|
|
129
|
+
}
|
|
130
|
+
exports.stopTunnel = stopTunnel;
|
|
131
|
+
/**
|
|
132
|
+
* Get tunnel status without starting it.
|
|
133
|
+
*/
|
|
134
|
+
function getTunnelStatus(agentId) {
|
|
135
|
+
const entry = tunnels.get(agentId);
|
|
136
|
+
return {
|
|
137
|
+
running: entry?.running ?? false,
|
|
138
|
+
reconnecting: entry?.reconnecting ?? false,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
exports.getTunnelStatus = getTunnelStatus;
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Internal helpers
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
/**
|
|
146
|
+
* Try to extract the local port from the SSH command.
|
|
147
|
+
* Looks for -L <localPort>:<host>:<remotePort> pattern.
|
|
148
|
+
*/
|
|
149
|
+
function extractLocalPort(command) {
|
|
150
|
+
const match = command.match(/-L\s+(\d+):/);
|
|
151
|
+
return match ? parseInt(match[1], 10) : null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Probe a local TCP port to check if it's accepting connections.
|
|
155
|
+
*/
|
|
156
|
+
function probePort(port, timeoutMs = 1000) {
|
|
157
|
+
return new Promise((resolve) => {
|
|
158
|
+
const socket = new net.Socket();
|
|
159
|
+
const timer = setTimeout(() => {
|
|
160
|
+
socket.destroy();
|
|
161
|
+
resolve(false);
|
|
162
|
+
}, timeoutMs);
|
|
163
|
+
socket.connect(port, '127.0.0.1', () => {
|
|
164
|
+
clearTimeout(timer);
|
|
165
|
+
socket.destroy();
|
|
166
|
+
resolve(true);
|
|
167
|
+
});
|
|
168
|
+
socket.on('error', () => {
|
|
169
|
+
clearTimeout(timer);
|
|
170
|
+
socket.destroy();
|
|
171
|
+
resolve(false);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Spawn the SSH process and wait for the tunnel to be ready.
|
|
177
|
+
*
|
|
178
|
+
* Password delivery: SSH does NOT read passwords from stdin — it opens the
|
|
179
|
+
* TTY directly. We use a shared askpass script that reads the password from
|
|
180
|
+
* a per-tunnel env var. The password only lives in process memory (the env
|
|
181
|
+
* of the child process), never on disk.
|
|
182
|
+
*/
|
|
183
|
+
function spawnTunnel(entry) {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
console.log(`[SSH Tunnel] Starting tunnel for agent "${entry.agentId}": ${entry.config.command}`);
|
|
186
|
+
let settled = false;
|
|
187
|
+
function settle(err) {
|
|
188
|
+
if (settled)
|
|
189
|
+
return;
|
|
190
|
+
settled = true;
|
|
191
|
+
if (err)
|
|
192
|
+
reject(err);
|
|
193
|
+
else
|
|
194
|
+
resolve();
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const askpassPath = getAskpassScript();
|
|
198
|
+
// Per-tunnel env var name so concurrent tunnels don't collide
|
|
199
|
+
const passVarName = `SYNTHOS_SSHPW_${(0, crypto_1.randomBytes)(4).toString('hex')}`;
|
|
200
|
+
// Build args from the user's command, injecting StrictHostKeyChecking=no
|
|
201
|
+
// to avoid the interactive host key confirmation prompt
|
|
202
|
+
const parts = entry.config.command.trim().split(/\s+/);
|
|
203
|
+
const cmd = parts.shift();
|
|
204
|
+
const args = [
|
|
205
|
+
'-o', 'StrictHostKeyChecking=no',
|
|
206
|
+
'-o', 'UserKnownHostsFile=' + (IS_WINDOWS ? 'NUL' : '/dev/null'),
|
|
207
|
+
...parts,
|
|
208
|
+
];
|
|
209
|
+
const env = {
|
|
210
|
+
...process.env,
|
|
211
|
+
SSH_ASKPASS: askpassPath,
|
|
212
|
+
SSH_ASKPASS_REQUIRE: 'force',
|
|
213
|
+
// The askpass script reads this var name, then echoes its value
|
|
214
|
+
SYNTHOS_SSH_PASS_VAR: passVarName,
|
|
215
|
+
[passVarName]: entry.config.password,
|
|
216
|
+
};
|
|
217
|
+
// On Unix, DISPLAY must be set for SSH_ASKPASS to be used (fallback for older SSH)
|
|
218
|
+
if (!IS_WINDOWS) {
|
|
219
|
+
env.DISPLAY = env.DISPLAY || 'dummy:0';
|
|
220
|
+
}
|
|
221
|
+
console.log(`[SSH Tunnel] Spawning: ${cmd} ${args.join(' ')}`);
|
|
222
|
+
const child = (0, child_process_1.spawn)(cmd, args, {
|
|
223
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
224
|
+
env,
|
|
225
|
+
// Detach stdin from the parent's TTY so SSH uses SSH_ASKPASS
|
|
226
|
+
detached: !IS_WINDOWS,
|
|
227
|
+
});
|
|
228
|
+
entry.process = child;
|
|
229
|
+
// Log all output for diagnostics
|
|
230
|
+
const handleOutput = (source) => (data) => {
|
|
231
|
+
const text = data.toString().trim();
|
|
232
|
+
if (text) {
|
|
233
|
+
console.log(`[SSH Tunnel] [${entry.agentId}] ${source}: ${text}`);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
child.stdout?.on('data', handleOutput('stdout'));
|
|
237
|
+
child.stderr?.on('data', handleOutput('stderr'));
|
|
238
|
+
child.on('error', (err) => {
|
|
239
|
+
console.error(`[SSH Tunnel] Spawn error for agent "${entry.agentId}":`, err.message);
|
|
240
|
+
entry.running = false;
|
|
241
|
+
entry.process = null;
|
|
242
|
+
settle(err);
|
|
243
|
+
});
|
|
244
|
+
child.on('exit', (code, signal) => {
|
|
245
|
+
const wasRunning = entry.running;
|
|
246
|
+
entry.running = false;
|
|
247
|
+
entry.process = null;
|
|
248
|
+
console.log(`[SSH Tunnel] Process exited for agent "${entry.agentId}" (code=${code}, signal=${signal})`);
|
|
249
|
+
// If we never settled (tunnel never came up), reject
|
|
250
|
+
settle(new Error(`SSH tunnel exited before becoming ready (code=${code})`));
|
|
251
|
+
// Auto-reconnect if the tunnel was running and this wasn't intentional
|
|
252
|
+
if (wasRunning && !entry.intentionalStop) {
|
|
253
|
+
scheduleReconnect(entry);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// Wait for the tunnel to be ready by probing the local port
|
|
257
|
+
const localPort = extractLocalPort(entry.config.command);
|
|
258
|
+
if (localPort) {
|
|
259
|
+
waitForPort(entry, localPort, settle);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// No port to probe — use delay heuristic
|
|
263
|
+
setTimeout(() => {
|
|
264
|
+
if (entry.process && !entry.intentionalStop) {
|
|
265
|
+
entry.running = true;
|
|
266
|
+
entry.reconnecting = false;
|
|
267
|
+
entry.reconnectAttempts = 0;
|
|
268
|
+
console.log(`[SSH Tunnel] Tunnel ready (delay heuristic) for agent "${entry.agentId}"`);
|
|
269
|
+
settle();
|
|
270
|
+
}
|
|
271
|
+
}, TUNNEL_READY_PROBE_DELAY_MS);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
entry.running = false;
|
|
276
|
+
settle(err instanceof Error ? err : new Error(String(err)));
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Poll for the local port to accept connections, then declare the tunnel ready.
|
|
282
|
+
*/
|
|
283
|
+
function waitForPort(entry, port, settle) {
|
|
284
|
+
let attempts = 0;
|
|
285
|
+
const maxAttempts = 15; // 15 * 1000ms = 15s max (SSH + password can take a few seconds)
|
|
286
|
+
const intervalMs = 1000;
|
|
287
|
+
const timer = setInterval(async () => {
|
|
288
|
+
attempts++;
|
|
289
|
+
if (entry.intentionalStop || !entry.process) {
|
|
290
|
+
clearInterval(timer);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const ok = await probePort(port);
|
|
294
|
+
if (ok) {
|
|
295
|
+
clearInterval(timer);
|
|
296
|
+
entry.running = true;
|
|
297
|
+
entry.reconnecting = false;
|
|
298
|
+
entry.reconnectAttempts = 0;
|
|
299
|
+
console.log(`[SSH Tunnel] Tunnel ready (port ${port} open) for agent "${entry.agentId}"`);
|
|
300
|
+
settle();
|
|
301
|
+
}
|
|
302
|
+
else if (attempts >= maxAttempts) {
|
|
303
|
+
clearInterval(timer);
|
|
304
|
+
// Declare ready anyway — the port might only open on first inbound connection
|
|
305
|
+
entry.running = true;
|
|
306
|
+
entry.reconnecting = false;
|
|
307
|
+
entry.reconnectAttempts = 0;
|
|
308
|
+
console.log(`[SSH Tunnel] Tunnel assumed ready (port probe timed out) for agent "${entry.agentId}"`);
|
|
309
|
+
settle();
|
|
310
|
+
}
|
|
311
|
+
}, intervalMs);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Schedule an automatic reconnect with exponential backoff.
|
|
315
|
+
*/
|
|
316
|
+
function scheduleReconnect(entry) {
|
|
317
|
+
if (entry.reconnectTimer || entry.intentionalStop)
|
|
318
|
+
return;
|
|
319
|
+
entry.reconnecting = true;
|
|
320
|
+
entry.reconnectAttempts++;
|
|
321
|
+
const delay = Math.min(BASE_RECONNECT_DELAY_MS * Math.pow(2, entry.reconnectAttempts - 1), MAX_RECONNECT_DELAY_MS);
|
|
322
|
+
console.log(`[SSH Tunnel] Scheduling reconnect for agent "${entry.agentId}" in ${delay}ms (attempt ${entry.reconnectAttempts})`);
|
|
323
|
+
entry.reconnectTimer = setTimeout(async () => {
|
|
324
|
+
entry.reconnectTimer = null;
|
|
325
|
+
if (entry.intentionalStop)
|
|
326
|
+
return;
|
|
327
|
+
try {
|
|
328
|
+
await spawnTunnel(entry);
|
|
329
|
+
console.log(`[SSH Tunnel] Reconnected tunnel for agent "${entry.agentId}"`);
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
console.error(`[SSH Tunnel] Reconnect failed for agent "${entry.agentId}":`, err instanceof Error ? err.message : err);
|
|
333
|
+
// Schedule another attempt
|
|
334
|
+
if (!entry.intentionalStop) {
|
|
335
|
+
scheduleReconnect(entry);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}, delay);
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=sshTunnelManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sshTunnelManager.js","sourceRoot":"","sources":["../../../src/agents/openclaw/sshTunnelManager.ts"],"names":[],"mappings":"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"}
|