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.
Files changed (263) hide show
  1. package/README.md +215 -65
  2. package/default-pages/application.json +1 -0
  3. package/default-pages/json_tools.json +1 -1
  4. package/default-pages/oregon_trail.html +321 -0
  5. package/default-pages/oregon_trail.json +12 -0
  6. package/default-pages/sidebar_page.json +1 -0
  7. package/default-pages/solar_explorer.html +10 -18
  8. package/default-pages/solar_explorer.json +2 -2
  9. package/default-pages/two-panel_page.json +1 -0
  10. package/default-pages/us_map.html +192 -0
  11. package/default-pages/us_map.json +12 -0
  12. package/default-pages/us_map_1850.html +325 -0
  13. package/default-pages/us_map_1850.json +12 -0
  14. package/default-pages/western_cities_1850.html +526 -0
  15. package/default-pages/western_cities_1850.json +12 -0
  16. package/default-themes/{nebula-dawn.css → nebula-dawn.v2.css} +24 -0
  17. package/default-themes/{nebula-dusk.css → nebula-dusk.v2.css} +24 -0
  18. package/dist/agents/a2a/a2aProvider.d.ts +3 -0
  19. package/dist/agents/a2a/a2aProvider.d.ts.map +1 -0
  20. package/dist/agents/a2a/a2aProvider.js +126 -0
  21. package/dist/agents/a2a/a2aProvider.js.map +1 -0
  22. package/dist/agents/discovery.d.ts +30 -0
  23. package/dist/agents/discovery.d.ts.map +1 -0
  24. package/dist/agents/discovery.js +52 -0
  25. package/dist/agents/discovery.js.map +1 -0
  26. package/dist/agents/index.d.ts +7 -0
  27. package/dist/agents/index.d.ts.map +1 -0
  28. package/dist/agents/index.js +19 -0
  29. package/dist/agents/index.js.map +1 -0
  30. package/dist/agents/openclaw/gatewayManager.d.ts +113 -0
  31. package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -0
  32. package/dist/agents/openclaw/gatewayManager.js +470 -0
  33. package/dist/agents/openclaw/gatewayManager.js.map +1 -0
  34. package/dist/agents/openclaw/openclawProvider.d.ts +3 -0
  35. package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -0
  36. package/dist/agents/openclaw/openclawProvider.js +239 -0
  37. package/dist/agents/openclaw/openclawProvider.js.map +1 -0
  38. package/dist/agents/openclaw/sshTunnelManager.d.ts +23 -0
  39. package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -0
  40. package/dist/agents/openclaw/sshTunnelManager.js +340 -0
  41. package/dist/agents/openclaw/sshTunnelManager.js.map +1 -0
  42. package/dist/agents/types.d.ts +64 -0
  43. package/dist/agents/types.d.ts.map +1 -0
  44. package/dist/agents/types.js +6 -0
  45. package/dist/agents/types.js.map +1 -0
  46. package/dist/connectors/airtable/connector.json +27 -0
  47. package/dist/connectors/alpha-vantage/connector.json +26 -0
  48. package/dist/connectors/brave-search/connector.json +26 -0
  49. package/dist/connectors/cloudinary/connector.json +27 -0
  50. package/dist/connectors/deepl/connector.json +28 -0
  51. package/dist/connectors/elevenlabs/connector.json +30 -0
  52. package/dist/connectors/giphy/connector.json +27 -0
  53. package/dist/connectors/github/connector.json +29 -0
  54. package/dist/connectors/huggingface/connector.json +27 -0
  55. package/dist/connectors/imgur/connector.json +29 -0
  56. package/dist/connectors/index.d.ts +1 -1
  57. package/dist/connectors/index.d.ts.map +1 -1
  58. package/dist/connectors/instagram/connector.json +43 -0
  59. package/dist/connectors/jira/connector.json +28 -0
  60. package/dist/connectors/mapbox/connector.json +26 -0
  61. package/dist/connectors/nasa/connector.json +27 -0
  62. package/dist/connectors/newsapi/connector.json +27 -0
  63. package/dist/connectors/notion/connector.json +28 -0
  64. package/dist/connectors/open-exchange-rates/connector.json +27 -0
  65. package/dist/connectors/openweathermap/connector.json +26 -0
  66. package/dist/connectors/pexels/connector.json +27 -0
  67. package/dist/connectors/registry.d.ts.map +1 -1
  68. package/dist/connectors/registry.js +42 -96
  69. package/dist/connectors/registry.js.map +1 -1
  70. package/dist/connectors/resend/connector.json +29 -0
  71. package/dist/connectors/rss2json/connector.json +27 -0
  72. package/dist/connectors/sendgrid/connector.json +27 -0
  73. package/dist/connectors/spoonacular/connector.json +28 -0
  74. package/dist/connectors/stability-ai/connector.json +27 -0
  75. package/dist/connectors/twilio/connector.json +28 -0
  76. package/dist/connectors/types.d.ts +23 -0
  77. package/dist/connectors/types.d.ts.map +1 -1
  78. package/dist/connectors/unsplash/connector.json +27 -0
  79. package/dist/connectors/wolfram-alpha/connector.json +26 -0
  80. package/dist/connectors/youtube-data/connector.json +30 -0
  81. package/dist/files.d.ts +1 -0
  82. package/dist/files.d.ts.map +1 -1
  83. package/dist/files.js +16 -1
  84. package/dist/files.js.map +1 -1
  85. package/dist/init.d.ts.map +1 -1
  86. package/dist/init.js +28 -0
  87. package/dist/init.js.map +1 -1
  88. package/dist/migrations.d.ts +3 -2
  89. package/dist/migrations.d.ts.map +1 -1
  90. package/dist/migrations.js +122 -138
  91. package/dist/migrations.js.map +1 -1
  92. package/dist/models/anthropic.d.ts +22 -0
  93. package/dist/models/anthropic.d.ts.map +1 -0
  94. package/dist/models/anthropic.js +76 -0
  95. package/dist/models/anthropic.js.map +1 -0
  96. package/dist/models/chainOfThought.d.ts +12 -0
  97. package/dist/models/chainOfThought.d.ts.map +1 -0
  98. package/dist/models/chainOfThought.js +45 -0
  99. package/dist/models/chainOfThought.js.map +1 -0
  100. package/dist/models/fireworksai.d.ts +30 -0
  101. package/dist/models/fireworksai.d.ts.map +1 -0
  102. package/dist/models/fireworksai.js +133 -0
  103. package/dist/models/fireworksai.js.map +1 -0
  104. package/dist/models/index.d.ts +7 -1
  105. package/dist/models/index.d.ts.map +1 -1
  106. package/dist/models/index.js +19 -1
  107. package/dist/models/index.js.map +1 -1
  108. package/dist/models/logCompletePrompt.d.ts +3 -0
  109. package/dist/models/logCompletePrompt.d.ts.map +1 -0
  110. package/dist/models/logCompletePrompt.js +23 -0
  111. package/dist/models/logCompletePrompt.js.map +1 -0
  112. package/dist/models/openai.d.ts +24 -0
  113. package/dist/models/openai.d.ts.map +1 -0
  114. package/dist/models/openai.js +80 -0
  115. package/dist/models/openai.js.map +1 -0
  116. package/dist/models/providers.d.ts +1 -0
  117. package/dist/models/providers.d.ts.map +1 -1
  118. package/dist/models/providers.js +12 -4
  119. package/dist/models/providers.js.map +1 -1
  120. package/dist/models/types.d.ts +34 -2
  121. package/dist/models/types.d.ts.map +1 -1
  122. package/dist/models/types.js +16 -0
  123. package/dist/models/types.js.map +1 -1
  124. package/dist/models/utils.d.ts +6 -0
  125. package/dist/models/utils.d.ts.map +1 -0
  126. package/dist/models/utils.js +21 -0
  127. package/dist/models/utils.js.map +1 -0
  128. package/dist/scripts.d.ts +2 -1
  129. package/dist/scripts.d.ts.map +1 -1
  130. package/dist/scripts.js +4 -3
  131. package/dist/scripts.js.map +1 -1
  132. package/dist/service/createCompletePrompt.d.ts +1 -1
  133. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  134. package/dist/service/createCompletePrompt.js +9 -6
  135. package/dist/service/createCompletePrompt.js.map +1 -1
  136. package/dist/service/generateImage.d.ts +1 -1
  137. package/dist/service/generateImage.d.ts.map +1 -1
  138. package/dist/service/generateImage.js +3 -3
  139. package/dist/service/generateImage.js.map +1 -1
  140. package/dist/service/server.d.ts.map +1 -1
  141. package/dist/service/server.js +3 -0
  142. package/dist/service/server.js.map +1 -1
  143. package/dist/service/transformPage.d.ts +4 -2
  144. package/dist/service/transformPage.d.ts.map +1 -1
  145. package/dist/service/transformPage.js +74 -6
  146. package/dist/service/transformPage.js.map +1 -1
  147. package/dist/service/useAgentRoutes.d.ts +4 -0
  148. package/dist/service/useAgentRoutes.d.ts.map +1 -0
  149. package/dist/service/useAgentRoutes.js +389 -0
  150. package/dist/service/useAgentRoutes.js.map +1 -0
  151. package/dist/service/useApiRoutes.d.ts.map +1 -1
  152. package/dist/service/useApiRoutes.js +157 -16
  153. package/dist/service/useApiRoutes.js.map +1 -1
  154. package/dist/service/useConnectorRoutes.d.ts.map +1 -1
  155. package/dist/service/useConnectorRoutes.js +14 -3
  156. package/dist/service/useConnectorRoutes.js.map +1 -1
  157. package/dist/service/useGatewayRoutes.d.ts +4 -0
  158. package/dist/service/useGatewayRoutes.d.ts.map +1 -0
  159. package/dist/service/useGatewayRoutes.js +168 -0
  160. package/dist/service/useGatewayRoutes.js.map +1 -0
  161. package/dist/service/usePageRoutes.d.ts.map +1 -1
  162. package/dist/service/usePageRoutes.js +16 -5
  163. package/dist/service/usePageRoutes.js.map +1 -1
  164. package/dist/settings.d.ts +2 -1
  165. package/dist/settings.d.ts.map +1 -1
  166. package/dist/settings.js +4 -8
  167. package/dist/settings.js.map +1 -1
  168. package/dist/themes.d.ts +14 -0
  169. package/dist/themes.d.ts.map +1 -1
  170. package/dist/themes.js +86 -13
  171. package/dist/themes.js.map +1 -1
  172. package/package.json +10 -5
  173. package/page-scripts/helpers-v2.js +222 -0
  174. package/page-scripts/page-v2.js +656 -0
  175. package/required-pages/builder.html +1 -27
  176. package/required-pages/pages.html +745 -22
  177. package/required-pages/settings.html +819 -21
  178. package/required-pages/synthos_apis.html +56 -1
  179. package/src/agents/a2a/a2aProvider.ts +110 -0
  180. package/src/agents/discovery.ts +74 -0
  181. package/src/agents/index.ts +6 -0
  182. package/src/agents/openclaw/gatewayManager.ts +559 -0
  183. package/src/agents/openclaw/openclawProvider.ts +261 -0
  184. package/src/agents/openclaw/sshTunnelManager.ts +385 -0
  185. package/src/agents/types.ts +82 -0
  186. package/src/connectors/airtable/connector.json +27 -0
  187. package/src/connectors/alpha-vantage/connector.json +26 -0
  188. package/src/connectors/brave-search/connector.json +26 -0
  189. package/src/connectors/cloudinary/connector.json +27 -0
  190. package/src/connectors/deepl/connector.json +28 -0
  191. package/src/connectors/elevenlabs/connector.json +30 -0
  192. package/src/connectors/giphy/connector.json +27 -0
  193. package/src/connectors/github/connector.json +29 -0
  194. package/src/connectors/huggingface/connector.json +27 -0
  195. package/src/connectors/imgur/connector.json +29 -0
  196. package/src/connectors/index.ts +2 -0
  197. package/src/connectors/instagram/connector.json +43 -0
  198. package/src/connectors/jira/connector.json +28 -0
  199. package/src/connectors/mapbox/connector.json +26 -0
  200. package/src/connectors/nasa/connector.json +27 -0
  201. package/src/connectors/newsapi/connector.json +27 -0
  202. package/src/connectors/notion/connector.json +28 -0
  203. package/src/connectors/open-exchange-rates/connector.json +27 -0
  204. package/src/connectors/openweathermap/connector.json +26 -0
  205. package/src/connectors/pexels/connector.json +27 -0
  206. package/src/connectors/registry.ts +21 -97
  207. package/src/connectors/resend/connector.json +29 -0
  208. package/src/connectors/rss2json/connector.json +27 -0
  209. package/src/connectors/sendgrid/connector.json +27 -0
  210. package/src/connectors/spoonacular/connector.json +28 -0
  211. package/src/connectors/stability-ai/connector.json +27 -0
  212. package/src/connectors/twilio/connector.json +28 -0
  213. package/src/connectors/types.ts +25 -0
  214. package/src/connectors/unsplash/connector.json +27 -0
  215. package/src/connectors/wolfram-alpha/connector.json +26 -0
  216. package/src/connectors/youtube-data/connector.json +30 -0
  217. package/src/files.ts +14 -0
  218. package/src/init.ts +27 -0
  219. package/src/migrations.ts +121 -138
  220. package/src/models/anthropic.ts +89 -0
  221. package/src/models/chainOfThought.ts +56 -0
  222. package/src/models/fireworksai.ts +136 -0
  223. package/src/models/index.ts +7 -1
  224. package/src/models/logCompletePrompt.ts +25 -0
  225. package/src/models/openai.ts +90 -0
  226. package/src/models/providers.ts +12 -3
  227. package/src/models/types.ts +67 -2
  228. package/src/models/utils.ts +16 -0
  229. package/src/scripts.ts +2 -2
  230. package/src/service/createCompletePrompt.ts +3 -1
  231. package/src/service/generateImage.ts +2 -2
  232. package/src/service/server.ts +4 -0
  233. package/src/service/transformPage.ts +81 -8
  234. package/src/service/useAgentRoutes.ts +423 -0
  235. package/src/service/useApiRoutes.ts +173 -18
  236. package/src/service/useConnectorRoutes.ts +14 -3
  237. package/src/service/usePageRoutes.ts +20 -6
  238. package/src/settings.ts +6 -10
  239. package/src/themes.ts +84 -12
  240. package/tests/README.md +12 -0
  241. package/tests/anthropic.spec.ts +84 -0
  242. package/tests/chainOfThought.spec.ts +108 -0
  243. package/tests/ensureScripts.spec.ts +82 -0
  244. package/tests/files.spec.ts +233 -0
  245. package/tests/fireworksai.spec.ts +92 -0
  246. package/tests/logCompletePrompt.spec.ts +74 -0
  247. package/tests/migrations.spec.ts +169 -0
  248. package/tests/openai.spec.ts +71 -0
  249. package/tests/pages.spec.ts +328 -0
  250. package/tests/providers.spec.ts +144 -0
  251. package/tests/scripts.spec.ts +209 -0
  252. package/tests/transformPage.spec.ts +931 -0
  253. package/tests/types.spec.ts +23 -0
  254. package/default-pages/app_builder.json +0 -1
  255. package/default-pages/sidebar_builder.json +0 -1
  256. package/default-pages/two-panel_builder.json +0 -1
  257. package/images/home.png +0 -0
  258. package/images/page-management.png +0 -0
  259. package/images/settings.png +0 -0
  260. package/images/synthos-square.png +0 -0
  261. /package/default-pages/{app_builder.html → application.html} +0 -0
  262. /package/default-pages/{sidebar_builder.html → sidebar_page.html} +0 -0
  263. /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":";;;AAAA,mCAAoC;AAEpC,qDAA+F;AAE/F;;;;;;;;GAQG;AAEH,yDAAyD;AACzD,KAAK,UAAU,aAAa,CAAC,KAAkB;IAC3C,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,2BAA2B,CAAC,CAAC;IACnF,OAAO,IAAA,6BAAY,EAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,2DAA2D;AAC3D,KAAK,UAAU,iBAAiB,CAAC,KAAkB,EAAE,IAAuB;IACxE,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAA4B,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE;QAC/C,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;KAClG;IACD,OAAO,MAAM,CAAC,GAAG,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,qDAAqD;IACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAE5C,kEAAkE;IAClE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC/B;QAAE,OAAO,IAAI,CAAC;IAEf,uDAAuD;IACvD,IAAI,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,wBAAwB;IACxB,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,OAAO,KAAK,CAAC;AACjB,CAAC;AAEY,QAAA,gBAAgB,GAAkB;IAC3C,KAAK,CAAC,IAAI,CAAC,KAAkB,EAAE,OAAe,EAAE,WAA0B;QACtE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAExD,yCAAyC;QACzC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,OAAkC,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAA2B,CAAC;YAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,OAA8C,CAAC;YAE/D,IAAI,GAAG,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE;oBAC5B,MAAM,CAAC,GAAG,IAA+B,CAAC;oBAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;wBACjD,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;qBACzB;iBACJ;aACJ;YAED,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE;gBACxC,IAAI,GAAG,IAAI,CAAC;aACf;QACL,CAAC,CAAC;QAEF,IAAA,wBAAO,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAEpC,IAAI;YACA,2EAA2E;YAC3E,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,WAAW,EAAE;gBAC7B,UAAU;gBACV,OAAO;gBACP,cAAc,EAAE,IAAA,mBAAU,GAAE;gBAC5B,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3B,oDAAoD;YACpD,MAAM,OAAO,GAAG,MAAM,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE;gBAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;aAC9C;YAED,OAAO;gBACH,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,YAAY,IAAI,SAAS;gBAC/B,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;aAC1C,CAAC;SACL;gBAAS;YACN,IAAA,yBAAQ,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;SACxC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,KAAkB,EAAE,OAAe,EAAE,WAA0B;QAC7E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAExD,sCAAsC;QACtC,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,WAAW,GAAwB,IAAI,CAAC;QAE5C,wDAAwD;QACxD,6CAA6C;QAC7C,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,OAAkC,CAAC;YAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4B,CAAC;YAChD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;YAE7D,IAAI,MAAM,KAAK,WAAW,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;gBACzE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aAClD;YAED,IAAI,MAAM,KAAK,WAAW,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE;gBACjD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,IAAI,GAAG,IAAI,CAAC;aACf;YAED,IAAI,WAAW,EAAE;gBAAE,WAAW,EAAE,CAAC;gBAAC,WAAW,GAAG,IAAI,CAAC;aAAE;QAC3D,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,OAAkC,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAA2B,CAAC;YAE9C,IAAI,KAAK,KAAK,OAAO,EAAE;gBACnB,MAAM,QAAQ,GAAI,GAAG,CAAC,KAAiC,EAAE,OAAO,IAAI,eAAe,CAAC;gBACpF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9C,IAAI,GAAG,IAAI,CAAC;gBACZ,IAAI,WAAW,EAAE;oBAAE,WAAW,EAAE,CAAC;oBAAC,WAAW,GAAG,IAAI,CAAC;iBAAE;aAC1D;QACL,CAAC,CAAC;QAEF,IAAA,wBAAO,EAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QACtC,IAAA,wBAAO,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAEpC,IAAI;YACA,mBAAmB;YACnB,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,WAAW,EAAE;gBAC7B,UAAU;gBACV,OAAO;gBACP,cAAc,EAAE,IAAA,mBAAU,GAAE;gBAC5B,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3B,8BAA8B;YAC9B,MAAM,OAAO,GAAG,MAAM,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE;gBAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE;wBACxB,WAAW,GAAG,CAAC,CAAC;wBAChB,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACvB,CAAC,CAAC,CAAC;iBACN;gBAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBACrB,MAAM,KAAK,CAAC,KAAK,EAAG,CAAC;iBACxB;aACJ;YAED,IAAI,CAAC,IAAI,EAAE;gBACP,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;aAC5D;SACJ;gBAAS;YACN,IAAA,yBAAQ,EAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YACvC,IAAA,yBAAQ,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;SACxC;IACL,CAAC;IAED,iBAAiB;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAkB;QAC/B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,oEAAoE;QAEpE,wFAAwF;QACxF,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAc,CAAC;QAC5E,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACtB,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,MAAM,OAAO,GAAG,CAAC,CAAC,IAAc,IAAI,WAAW,CAAC;YAEhD,+DAA+D;YAC/D,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,MAAM;gBAAE,SAAS;YAC7D,IAAI,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBACrD,MAAM,gBAAgB,GAAI,CAAC,CAAC,OAAqC,CAAC,KAAK,CACnE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CACtD,CAAC;gBACF,IAAI,gBAAgB;oBAAE,SAAS;aAClC;YAED,MAAM,IAAI,GAAyB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;YAE7E,6CAA6C;YAC7C,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE;gBAC/B,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;aACvB;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBACjC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;oBAC1B,MAAM,CAAC,GAAG,IAA+B,CAAC;oBAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;wBACjD,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC;qBACrB;iBACJ;aACJ;YAED,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;gBAAE,SAAS;YAE5C,QAAQ,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO;gBACP,SAAS,EAAE,CAAC,CAAC,SAA+B;gBAC5C,GAAG,EAAE,CAAC;aACT,CAAC,CAAC;SACN;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAkB;QAC9B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAkB;QACjC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAO,EAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;CACJ,CAAC"}
@@ -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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"}