clawconnect-agent 0.1.6 → 0.1.8

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 (216) hide show
  1. package/README.md +142 -34
  2. package/README.zh-CN.md +152 -44
  3. package/dist/commands/install.js +10 -4
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/pair.d.ts +6 -0
  6. package/dist/commands/pair.js +78 -10
  7. package/dist/commands/pair.js.map +1 -1
  8. package/dist/commands/run.js +14 -17
  9. package/dist/commands/run.js.map +1 -1
  10. package/dist/commands/send-file.d.ts +3 -24
  11. package/dist/commands/send-file.js +22 -449
  12. package/dist/commands/send-file.js.map +1 -1
  13. package/dist/commands/status.d.ts +13 -1
  14. package/dist/commands/status.js +58 -15
  15. package/dist/commands/status.js.map +1 -1
  16. package/dist/config/config.d.ts +6 -11
  17. package/dist/config/config.js +19 -48
  18. package/dist/config/config.js.map +1 -1
  19. package/dist/config/env.d.ts +1 -1
  20. package/dist/config/env.js +4 -5
  21. package/dist/config/env.js.map +1 -1
  22. package/dist/config/profile.d.ts +11 -0
  23. package/dist/config/profile.js +80 -0
  24. package/dist/config/profile.js.map +1 -0
  25. package/dist/core/command-types.d.ts +18 -0
  26. package/dist/core/command-types.js +2 -0
  27. package/dist/core/command-types.js.map +1 -0
  28. package/dist/core/relay/attachment-staging.js.map +1 -0
  29. package/dist/{relay → core/relay}/chat-payload.js +17 -3
  30. package/dist/core/relay/chat-payload.js.map +1 -0
  31. package/dist/{commands/send-file-utils.js → core/relay/file-upload-utils.js} +1 -1
  32. package/dist/core/relay/file-upload-utils.js.map +1 -0
  33. package/dist/core/relay/file-upload.d.ts +40 -0
  34. package/dist/core/relay/file-upload.js +401 -0
  35. package/dist/core/relay/file-upload.js.map +1 -0
  36. package/dist/core/relay/mobile-chat-run-bridge.d.ts +201 -0
  37. package/dist/core/relay/mobile-chat-run-bridge.js +192 -0
  38. package/dist/core/relay/mobile-chat-run-bridge.js.map +1 -0
  39. package/dist/core/relay/office-payload.js.map +1 -0
  40. package/dist/core/relay/reconnect.js.map +1 -0
  41. package/dist/core/relay/relay-server-connection.d.ts +6 -0
  42. package/dist/core/relay/relay-server-connection.js +32 -0
  43. package/dist/core/relay/relay-server-connection.js.map +1 -0
  44. package/dist/core/relay/slash-command-types.d.ts +7 -0
  45. package/dist/core/relay/slash-command-types.js +2 -0
  46. package/dist/core/relay/slash-command-types.js.map +1 -0
  47. package/dist/core/relay/timeline-event-builder.d.ts +86 -0
  48. package/dist/core/relay/timeline-event-builder.js +199 -0
  49. package/dist/core/relay/timeline-event-builder.js.map +1 -0
  50. package/dist/core/relay/timeline-event-log.d.ts +81 -0
  51. package/dist/core/relay/timeline-event-log.js +254 -0
  52. package/dist/core/relay/timeline-event-log.js.map +1 -0
  53. package/dist/core/relay/voice-input.d.ts +11 -0
  54. package/dist/core/relay/voice-input.js +120 -0
  55. package/dist/core/relay/voice-input.js.map +1 -0
  56. package/dist/gateway-profiles.d.ts +8 -0
  57. package/dist/gateway-profiles.js +24 -0
  58. package/dist/gateway-profiles.js.map +1 -0
  59. package/dist/hermes/hermes-relay-manager.d.ts +59 -0
  60. package/dist/hermes/hermes-relay-manager.js +754 -0
  61. package/dist/hermes/hermes-relay-manager.js.map +1 -0
  62. package/dist/hermes/hermes-runtime.d.ts +9 -0
  63. package/dist/hermes/hermes-runtime.js +9 -0
  64. package/dist/hermes/hermes-runtime.js.map +1 -0
  65. package/dist/hermes/hermes-session-store.d.ts +15 -0
  66. package/dist/hermes/hermes-session-store.js +174 -0
  67. package/dist/hermes/hermes-session-store.js.map +1 -0
  68. package/dist/hermes/hermes-voice-input.d.ts +13 -0
  69. package/dist/hermes/hermes-voice-input.js +27 -0
  70. package/dist/hermes/hermes-voice-input.js.map +1 -0
  71. package/dist/hermes/runtime/hermes-runtime-artifacts.d.ts +3 -0
  72. package/dist/hermes/runtime/hermes-runtime-artifacts.js +65 -0
  73. package/dist/hermes/runtime/hermes-runtime-artifacts.js.map +1 -0
  74. package/dist/hermes/runtime/hermes-runtime-backups.d.ts +5 -0
  75. package/dist/hermes/runtime/hermes-runtime-backups.js +128 -0
  76. package/dist/hermes/runtime/hermes-runtime-backups.js.map +1 -0
  77. package/dist/hermes/runtime/hermes-runtime-chat.d.ts +41 -0
  78. package/dist/hermes/runtime/hermes-runtime-chat.js +723 -0
  79. package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -0
  80. package/dist/hermes/runtime/hermes-runtime-command-router.d.ts +2 -0
  81. package/dist/hermes/runtime/hermes-runtime-command-router.js +96 -0
  82. package/dist/hermes/runtime/hermes-runtime-command-router.js.map +1 -0
  83. package/dist/hermes/runtime/hermes-runtime-command-utils.d.ts +3 -0
  84. package/dist/hermes/runtime/hermes-runtime-command-utils.js +19 -0
  85. package/dist/hermes/runtime/hermes-runtime-command-utils.js.map +1 -0
  86. package/dist/hermes/runtime/hermes-runtime-cron.d.ts +11 -0
  87. package/dist/hermes/runtime/hermes-runtime-cron.js +301 -0
  88. package/dist/hermes/runtime/hermes-runtime-cron.js.map +1 -0
  89. package/dist/hermes/runtime/hermes-runtime-history.d.ts +2 -0
  90. package/dist/hermes/runtime/hermes-runtime-history.js +249 -0
  91. package/dist/hermes/runtime/hermes-runtime-history.js.map +1 -0
  92. package/dist/hermes/runtime/hermes-runtime-lifecycle.d.ts +9 -0
  93. package/dist/hermes/runtime/hermes-runtime-lifecycle.js +111 -0
  94. package/dist/hermes/runtime/hermes-runtime-lifecycle.js.map +1 -0
  95. package/dist/hermes/runtime/hermes-runtime-models.d.ts +29 -0
  96. package/dist/hermes/runtime/hermes-runtime-models.js +125 -0
  97. package/dist/hermes/runtime/hermes-runtime-models.js.map +1 -0
  98. package/dist/hermes/runtime/hermes-runtime-process.d.ts +24 -0
  99. package/dist/hermes/runtime/hermes-runtime-process.js +147 -0
  100. package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -0
  101. package/dist/hermes/runtime/hermes-runtime-sessions.d.ts +5 -0
  102. package/dist/hermes/runtime/hermes-runtime-sessions.js +88 -0
  103. package/dist/hermes/runtime/hermes-runtime-sessions.js.map +1 -0
  104. package/dist/hermes/runtime/hermes-runtime-skills.d.ts +13 -0
  105. package/dist/hermes/runtime/hermes-runtime-skills.js +322 -0
  106. package/dist/hermes/runtime/hermes-runtime-skills.js.map +1 -0
  107. package/dist/hermes/runtime/hermes-runtime-types.d.ts +19 -0
  108. package/dist/hermes/runtime/hermes-runtime-types.js +2 -0
  109. package/dist/hermes/runtime/hermes-runtime-types.js.map +1 -0
  110. package/dist/hermes/runtime/hermes-runtime-usage.d.ts +22 -0
  111. package/dist/hermes/runtime/hermes-runtime-usage.js +211 -0
  112. package/dist/hermes/runtime/hermes-runtime-usage.js.map +1 -0
  113. package/dist/hermes/runtime/hermes-runtime-values.d.ts +14 -0
  114. package/dist/hermes/runtime/hermes-runtime-values.js +105 -0
  115. package/dist/hermes/runtime/hermes-runtime-values.js.map +1 -0
  116. package/dist/i18n/index.js +4 -0
  117. package/dist/i18n/index.js.map +1 -1
  118. package/dist/index.js +115 -9
  119. package/dist/index.js.map +1 -1
  120. package/dist/openclaw/backups/backup-manager.js.map +1 -0
  121. package/dist/{commands → openclaw/config}/provider-config.js +1 -1
  122. package/dist/openclaw/config/provider-config.js.map +1 -0
  123. package/dist/openclaw/config/provider-registry.js.map +1 -0
  124. package/dist/{relay → openclaw}/gateway-client.js +4 -3
  125. package/dist/openclaw/gateway-client.js.map +1 -0
  126. package/dist/{commands → openclaw/handlers}/local-handlers.d.ts +1 -1
  127. package/dist/{commands → openclaw/handlers}/local-handlers.js +2 -30
  128. package/dist/openclaw/handlers/local-handlers.js.map +1 -0
  129. package/dist/{commands → openclaw/handlers}/provider-handlers.d.ts +1 -1
  130. package/dist/{commands → openclaw/handlers}/provider-handlers.js +3 -3
  131. package/dist/openclaw/handlers/provider-handlers.js.map +1 -0
  132. package/dist/openclaw/relay/chat-history.d.ts +51 -0
  133. package/dist/openclaw/relay/chat-history.js +347 -0
  134. package/dist/openclaw/relay/chat-history.js.map +1 -0
  135. package/dist/{relay → openclaw/relay}/chat-send-attachments.js +12 -1
  136. package/dist/openclaw/relay/chat-send-attachments.js.map +1 -0
  137. package/dist/openclaw/relay/openclaw-voice-input.d.ts +13 -0
  138. package/dist/openclaw/relay/openclaw-voice-input.js +18 -0
  139. package/dist/openclaw/relay/openclaw-voice-input.js.map +1 -0
  140. package/dist/openclaw/relay/outgoing-media-relay.d.ts +11 -0
  141. package/dist/openclaw/relay/outgoing-media-relay.js +120 -0
  142. package/dist/openclaw/relay/outgoing-media-relay.js.map +1 -0
  143. package/dist/{relay → openclaw/relay}/session-context.d.ts +6 -0
  144. package/dist/{relay → openclaw/relay}/session-context.js +53 -3
  145. package/dist/openclaw/relay/session-context.js.map +1 -0
  146. package/dist/openclaw/relay/slash-command-catalog.d.ts +2 -0
  147. package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.d.ts +0 -5
  148. package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.js +0 -6
  149. package/dist/openclaw/relay/slash-command-catalog.generated.js.map +1 -0
  150. package/dist/openclaw/relay/slash-command-catalog.js.map +1 -0
  151. package/dist/openclaw/relay/transcript-dedupe.d.ts +21 -0
  152. package/dist/openclaw/relay/transcript-dedupe.js +211 -0
  153. package/dist/openclaw/relay/transcript-dedupe.js.map +1 -0
  154. package/dist/{relay → openclaw}/relay-manager.d.ts +1 -4
  155. package/dist/openclaw/relay-manager.js +787 -0
  156. package/dist/openclaw/relay-manager.js.map +1 -0
  157. package/dist/{commands → openclaw/runtime}/local-runtime.d.ts +1 -17
  158. package/dist/openclaw/runtime/local-runtime.js.map +1 -0
  159. package/dist/openclaw/session-store.d.ts +1 -0
  160. package/dist/openclaw/session-store.js +70 -0
  161. package/dist/openclaw/session-store.js.map +1 -0
  162. package/dist/platform/service-manager-common.d.ts +5 -2
  163. package/dist/platform/service-manager-common.js +18 -7
  164. package/dist/platform/service-manager-common.js.map +1 -1
  165. package/dist/platform/service-manager.d.ts +16 -5
  166. package/dist/platform/service-manager.js +85 -50
  167. package/dist/platform/service-manager.js.map +1 -1
  168. package/dist/runtime-adapters.d.ts +19 -0
  169. package/dist/runtime-adapters.js +39 -0
  170. package/dist/runtime-adapters.js.map +1 -0
  171. package/package.json +3 -3
  172. package/dist/commands/backup-manager.js.map +0 -1
  173. package/dist/commands/local-handlers.js.map +0 -1
  174. package/dist/commands/local-runtime.js.map +0 -1
  175. package/dist/commands/provider-config.js.map +0 -1
  176. package/dist/commands/provider-handlers.js.map +0 -1
  177. package/dist/commands/provider-registry.js.map +0 -1
  178. package/dist/commands/send-file-utils.js.map +0 -1
  179. package/dist/commands/voice-reply.d.ts +0 -39
  180. package/dist/commands/voice-reply.js +0 -329
  181. package/dist/commands/voice-reply.js.map +0 -1
  182. package/dist/relay/attachment-staging.js.map +0 -1
  183. package/dist/relay/chat-history.d.ts +0 -29
  184. package/dist/relay/chat-history.js +0 -69
  185. package/dist/relay/chat-history.js.map +0 -1
  186. package/dist/relay/chat-payload.js.map +0 -1
  187. package/dist/relay/chat-send-attachments.js.map +0 -1
  188. package/dist/relay/gateway-client.js.map +0 -1
  189. package/dist/relay/office-payload.js.map +0 -1
  190. package/dist/relay/reconnect.js.map +0 -1
  191. package/dist/relay/relay-manager.js +0 -644
  192. package/dist/relay/relay-manager.js.map +0 -1
  193. package/dist/relay/session-context.js.map +0 -1
  194. package/dist/relay/slash-command-catalog.d.ts +0 -8
  195. package/dist/relay/slash-command-catalog.generated.js.map +0 -1
  196. package/dist/relay/slash-command-catalog.js.map +0 -1
  197. package/dist/relay/voice-reply-preference.d.ts +0 -25
  198. package/dist/relay/voice-reply-preference.js +0 -103
  199. package/dist/relay/voice-reply-preference.js.map +0 -1
  200. /package/dist/{relay → core/relay}/attachment-staging.d.ts +0 -0
  201. /package/dist/{relay → core/relay}/attachment-staging.js +0 -0
  202. /package/dist/{relay → core/relay}/chat-payload.d.ts +0 -0
  203. /package/dist/{commands/send-file-utils.d.ts → core/relay/file-upload-utils.d.ts} +0 -0
  204. /package/dist/{relay → core/relay}/office-payload.d.ts +0 -0
  205. /package/dist/{relay → core/relay}/office-payload.js +0 -0
  206. /package/dist/{relay → core/relay}/reconnect.d.ts +0 -0
  207. /package/dist/{relay → core/relay}/reconnect.js +0 -0
  208. /package/dist/{commands → openclaw/backups}/backup-manager.d.ts +0 -0
  209. /package/dist/{commands → openclaw/backups}/backup-manager.js +0 -0
  210. /package/dist/{commands → openclaw/config}/provider-config.d.ts +0 -0
  211. /package/dist/{commands → openclaw/config}/provider-registry.d.ts +0 -0
  212. /package/dist/{commands → openclaw/config}/provider-registry.js +0 -0
  213. /package/dist/{relay → openclaw}/gateway-client.d.ts +0 -0
  214. /package/dist/{relay → openclaw/relay}/chat-send-attachments.d.ts +0 -0
  215. /package/dist/{relay → openclaw/relay}/slash-command-catalog.js +0 -0
  216. /package/dist/{commands → openclaw/runtime}/local-runtime.js +0 -0
package/README.md CHANGED
@@ -27,8 +27,86 @@ clawconnect pair --code-only
27
27
  Options:
28
28
  - `-n, --name <name>` — Display name for this host
29
29
  - `-s, --server <url>` — Relay server URL
30
+ - `-p, --profile <name>` — Local profile name. Use separate profiles when pairing more than one gateway type on the same host
31
+ - `--gateway-type <type>` — Gateway type: `openclaw` or `hermes`
30
32
  - `--code-only` — Print only the access code and skip QR code output
31
33
 
34
+ ### Pair OpenClaw and Hermes Agent on the Same Host
35
+
36
+ Use separate ClawConnect profiles so OpenClaw and Hermes Agent do not share the same local config, log file, or background service.
37
+
38
+ Pair OpenClaw:
39
+
40
+ ```bash
41
+ clawconnect pair-openclaw
42
+ ```
43
+
44
+ Pair Hermes Agent:
45
+
46
+ ```bash
47
+ clawconnect pair-hermes
48
+ ```
49
+
50
+ When using the local development relay at `http://127.0.0.1:8080`, add `--local`:
51
+
52
+ ```bash
53
+ clawconnect pair-openclaw --local
54
+ clawconnect pair-hermes --local
55
+ ```
56
+
57
+ The shortcut commands expand to the profile-aware form below.
58
+
59
+ OpenClaw:
60
+
61
+ ```bash
62
+ clawconnect pair \
63
+ --profile openclaw \
64
+ --server http://127.0.0.1:8080 \
65
+ --gateway-type openclaw \
66
+ --name "Mac OpenClaw"
67
+ ```
68
+
69
+ Hermes Agent:
70
+
71
+ ```bash
72
+ clawconnect pair \
73
+ --profile hermes \
74
+ --server http://127.0.0.1:8080 \
75
+ --gateway-type hermes \
76
+ --name "Mac Hermes Agent"
77
+ ```
78
+
79
+ After each command, scan the QR code in the mobile app or enter the printed access code. The pairing payload includes `gatewayType`, and the relay rejects mismatched pairing attempts so an OpenClaw mobile gateway cannot bind to a Hermes Agent host, or the reverse.
80
+
81
+ Check both instances:
82
+
83
+ ```bash
84
+ clawconnect status-all
85
+ ```
86
+
87
+ Restart or stop a single instance:
88
+
89
+ ```bash
90
+ clawconnect restart-openclaw
91
+ clawconnect restart-hermes
92
+ clawconnect stop-openclaw
93
+ clawconnect stop-hermes
94
+ ```
95
+
96
+ Profile config files:
97
+
98
+ ```text
99
+ ~/.clawconnect/profiles/openclaw/config.json
100
+ ~/.clawconnect/profiles/hermes/config.json
101
+ ```
102
+
103
+ macOS launchd service labels:
104
+
105
+ ```text
106
+ com.openclaw.clawconnect.agent.openclaw
107
+ com.openclaw.clawconnect.agent.hermes
108
+ ```
109
+
32
110
  ### Environment Configuration
33
111
 
34
112
  For an installed agent, the CLI creates `~/.clawconnect/.env` with all configurable values documented as comments the first time `clawconnect` runs. You can edit that file to keep defaults in one place:
@@ -45,9 +123,10 @@ Supported values:
45
123
  - `CLAWCONNECT_GATEWAY_URL` — optional local Gateway websocket URL override
46
124
  - `CLAWCONNECT_ENV_FILE` — optional explicit env file path. When unset, the agent reads `~/.clawconnect/.env`, then `.env.local`, then `.env`
47
125
  - `OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` — Gateway auth fallback
48
- - `OPENCLAW_TTS_ENABLED`, `OPENCLAW_TTS_VOICE`, `OPENCLAW_TTS_RATE`, `OPENCLAW_TTS_ENGINE` — voice reply defaults
126
+ - `CLAWCONNECT_ASR_COMMAND` — host-side speech-to-text command for ClawLink `chat.voice.send` messages. The agent saves the audio to a temporary file and runs this command; it must print the transcript to stdout. Placeholders: `{file}`, `{language}`, `{mimeType}`
127
+ - `OPENCLAW_ASR_COMMAND` — legacy speech-to-text command fallback. `CLAWCONNECT_ASR_COMMAND` takes precedence when both are set.
49
128
 
50
- Shell environment variables take priority over env files. Existing pairing credentials in `~/.clawconnect/config.json` still take priority for `clawconnect run`, `status`, and `send-file`; run `clawconnect pair --server <url>` or `clawconnect reset` when you intentionally switch relay servers.
129
+ Shell environment variables take priority over env files. Existing pairing credentials in `~/.clawconnect/config.json` or `~/.clawconnect/profiles/<profile>/config.json` still take priority for `clawconnect run`, `status`, and `send-file`; run `clawconnect pair --profile <name> --server <url>` or `clawconnect reset --profile <name>` when you intentionally switch relay servers.
51
130
 
52
131
  ### Run
53
132
 
@@ -57,13 +136,13 @@ Start the host agent:
57
136
  clawconnect run
58
137
  ```
59
138
 
60
- Optional: enable assistant voice replies only when you want audio output by setting:
139
+ Optional: let ClawLink send raw voice messages and have the host transcribe them before forwarding text to OpenClaw or Hermes Agent:
61
140
 
62
141
  ```bash
63
- OPENCLAW_TTS_ENABLED=1 clawconnect run
142
+ CLAWCONNECT_ASR_COMMAND='/usr/local/bin/transcribe-audio {file} {language}' clawconnect run
64
143
  ```
65
144
 
66
- When this flag is not set, assistant replies stay text-only.
145
+ If neither `CLAWCONNECT_ASR_COMMAND` nor legacy `OPENCLAW_ASR_COMMAND` is configured, voice messages fail with `voice_asr_not_configured`.
67
146
 
68
147
  ### Check Status
69
148
 
@@ -167,8 +246,6 @@ Notes:
167
246
  - `send-file` uploads through the relay and posts a file message to mobile.
168
247
  - Image MIME types render as preview cards in the iPhone chat UI.
169
248
  - `chat.send` attachments are local staging references, not the cross-device file transfer path.
170
- - Voice replies are disabled by default; set `OPENCLAW_TTS_ENABLED=1` to have the agent synthesize assistant replies as audio files.
171
- - The agent now prefers `edge-tts-universal` for synthesis and falls back to the computer's built-in TTS on failure.
172
249
 
173
250
  ## Project Structure
174
251
 
@@ -188,34 +265,58 @@ clawconnect-agent/
188
265
  status.ts
189
266
  install.ts
190
267
  set-token.ts
191
- local-handlers.ts
192
- local-runtime.ts
193
- provider-handlers.ts
194
- provider-config.ts
195
- provider-registry.ts
196
- backup-manager.ts
197
- send-file-utils.ts
198
268
  *.test.ts
269
+ core/
270
+ command-types.ts
271
+ relay/
272
+ file-upload.ts
273
+ file-upload-utils.ts
274
+ relay-server-connection.ts
275
+ reconnect.ts
276
+ office-payload.ts
277
+ mobile-chat-run-bridge.ts
278
+ voice-input.ts
279
+ attachment-staging.ts
280
+ chat-payload.ts
281
+ slash-command-types.ts
199
282
  config/
200
283
  config.ts
201
284
  env.ts
285
+ hermes/
286
+ hermes-relay-manager.ts
287
+ hermes-runtime.ts
288
+ hermes-session-store.ts
289
+ hermes-voice-input.ts
290
+ runtime/
291
+ hermes-runtime-*.ts
202
292
  i18n/
203
293
  index.ts
294
+ openclaw/
295
+ relay-manager.ts
296
+ gateway-client.ts
297
+ session-store.ts
298
+ runtime/
299
+ local-runtime.ts
300
+ handlers/
301
+ local-handlers.ts
302
+ provider-handlers.ts
303
+ config/
304
+ provider-config.ts
305
+ provider-registry.ts
306
+ backups/
307
+ backup-manager.ts
308
+ relay/
309
+ session-context.ts
310
+ chat-history.ts
311
+ chat-send-attachments.ts
312
+ openclaw-voice-input.ts
313
+ slash-command-catalog.ts
314
+ slash-command-catalog.generated.ts
204
315
  platform/
205
316
  service-manager.ts
206
317
  service-manager-common.ts
207
318
  service-manager-linux.ts
208
319
  *.test.ts
209
- relay/
210
- gateway-client.ts
211
- relay-manager.ts
212
- session-context.ts
213
- chat-payload.ts
214
- chat-history.ts
215
- attachment-staging.ts
216
- chat-send-attachments.ts
217
- reconnect.ts
218
- *.test.ts
219
320
  ```
220
321
 
221
322
  Tests are colocated with the source as `*.test.ts`. They run with `npm test`, and the build/publish flow excludes them from the package tarball.
@@ -225,18 +326,23 @@ Tests are colocated with the source as `*.test.ts`. They run with `npm test`, an
225
326
  - `src/index.ts` is the CLI entrypoint. It wires every command together and handles top-level errors.
226
327
  - `src/commands/pair.ts` registers a host, saves relay config, and installs the background service after pairing.
227
328
  - `src/commands/run.ts` starts the relay loop in the foreground for service-managed or debug runs.
228
- - `src/commands/send-file.ts` uploads local files or images into the paired chat session.
329
+ - `src/commands/send-file.ts` is the CLI wrapper for uploading local files or images into the paired chat session.
229
330
  - `src/commands/install.ts` manages service install, restart, stop, uninstall, and reset flows.
230
331
  - `src/commands/set-token.ts` stores a local Gateway token when token auth is required.
231
- - `src/commands/local-handlers.ts` handles legacy command prefixes and local maintenance actions such as backup, restore, logs, doctor, and gateway restart.
232
- - `src/commands/local-runtime.ts` resolves the `openclaw` binary and triggers gateway lifecycle actions.
233
- - `src/commands/provider-handlers.ts` routes provider-specific commands and reuses the same gateway restart path.
332
+ - `src/core/relay/file-upload.ts` contains the programmatic relay file upload client used by both CLI and Hermes artifact delivery.
333
+ - `src/core/relay/relay-server-connection.ts` contains shared relay URL, JSON frame, abort, and retry-close helpers.
334
+ - `src/core/relay/office-payload.ts`, `mobile-chat-run-bridge.ts`, `voice-input.ts`, `attachment-staging.ts`, and `chat-payload.ts` are gateway-neutral relay utilities.
335
+ - `src/openclaw/handlers/local-handlers.ts` handles legacy command prefixes and local maintenance actions such as backup, restore, logs, doctor, and gateway restart.
336
+ - `src/openclaw/runtime/local-runtime.ts` resolves the `openclaw` binary and triggers gateway lifecycle actions.
337
+ - `src/openclaw/handlers/provider-handlers.ts` routes provider-specific commands and reuses the same gateway restart path.
338
+ - `src/openclaw/relay-manager.ts` bridges the relay server and the local OpenClaw Gateway, dispatches commands, and handles chat/history fallbacks.
339
+ - `src/openclaw/gateway-client.ts` manages the websocket connection to OpenClaw Gateway and device authentication.
340
+ - `src/openclaw/relay/session-context.ts` reads session defaults and context usage snapshots.
341
+ - `src/openclaw/relay/chat-history.ts` and `chat-send-attachments.ts` handle OpenClaw-specific history fallback and attachment staging for `chat.send`.
342
+ - `src/hermes/hermes-relay-manager.ts` bridges Hermes runtime commands to the relay server.
343
+ - `src/hermes/runtime/` contains Hermes CLI/Python execution modules for chat, cron, skills, models, sessions, usage, and lifecycle operations.
234
344
  - `src/config/env.ts` loads `.env` files and exposes agent defaults such as relay and Gateway URLs.
235
345
  - `src/platform/service-manager.ts` exposes a cross-platform service facade for macOS, Linux, and Windows.
236
- - `src/relay/relay-manager.ts` bridges the relay server and the local Gateway, dispatches commands, and handles chat/history fallbacks.
237
- - `src/relay/gateway-client.ts` manages the websocket connection to OpenClaw Gateway and device authentication.
238
- - `src/relay/session-context.ts` reads session defaults and context usage snapshots.
239
- - `src/relay/chat-payload.ts`, `src/relay/chat-history.ts`, `src/relay/attachment-staging.ts`, and `src/relay/chat-send-attachments.ts` handle chat normalization, fallback, and attachment staging.
240
346
  - `src/config/config.ts` reads and writes local pairing config under `~/.clawconnect`.
241
347
  - `src/i18n/index.ts` contains the localized CLI strings.
242
348
 
@@ -244,15 +350,17 @@ Tests are colocated with the source as `*.test.ts`. They run with `npm test`, an
244
350
 
245
351
  - `pairCommand()` registers a host, generates the pairing payload, and persists relay config.
246
352
  - `runCommand()` starts the foreground relay client loop used by the background service.
247
- - `sendFileCommand()` stages a local file and uploads it into the paired chat session.
353
+ - `sendFileCommand()` handles CLI config/session defaults and delegates uploads to `uploadFileToRelay()`.
354
+ - `uploadFileToRelay()` uploads a file to the relay using explicit relay URL, secret, gateway ID, and session key.
248
355
  - `installCommand()`, `restartCommand()`, `stopCommand()`, `uninstallCommand()`, and `resetCommand()` manage the service lifecycle.
249
356
  - `statusCommand()` prints pairing config, gateway state, and service health.
250
357
  - `setTokenCommand()` stores the local OpenClaw Gateway token.
251
- - `handleLocalCommand()` and `handleProviderCommand()` process local control-plane commands before forwarding to the gateway.
358
+ - `handleLocalCommand()` and `handleProviderCommand()` process OpenClaw local control-plane commands before forwarding to the gateway.
252
359
  - `OpenClawGatewayClient` manages the gateway websocket, reconnects, and request/response frames.
253
360
  - `canonicalizeRelayParams()`, `extractGatewaySessionDefaults()`, and `buildContextUsageFingerprint()` normalize relay protocol payloads.
254
361
  - `normalizeChatEventPayload()`, `extractChatText()`, `extractHistoryOutcome()`, and `withMessageText()` keep chat payloads stable across relay and gateway responses.
255
362
  - `buildAttachmentStagingPath()` and `resolveAttachmentFileName()` manage file staging for attachments.
363
+ - `buildRelayUrl()`, `sendRelayJson()`, `parseRelayFrame()`, and `shouldRetryRelayClose()` share narrow relay transport behavior across OpenClaw and Hermes.
256
364
  - `getServiceStatus()`, `installService()`, `restartService()`, `stopService()`, and `uninstallService()` implement platform-specific service control.
257
365
 
258
366
  ## How It Works
package/README.zh-CN.md CHANGED
@@ -34,8 +34,86 @@ clawconnect pair --code-only
34
34
 
35
35
  - `-n, --name <name>`:指定这台主机在移动端显示的名称
36
36
  - `-s, --server <url>`:指定中继服务器地址
37
+ - `-p, --profile <name>`:指定本机配置 profile;同一台主机同时配对 OpenClaw 和 Hermes Agent 时必须分开
38
+ - `--gateway-type <type>`:指定网关类型,可选 `openclaw` 或 `hermes`
37
39
  - `--code-only`:只输出访问码,不打印二维码
38
40
 
41
+ ### 2. 同时配对 OpenClaw 和 Hermes Agent
42
+
43
+ 同一台电脑上同时运行 OpenClaw 和 Hermes Agent 时,必须使用不同的 `--profile`。这样两条链路会使用不同的本地配置、日志和后台服务,避免 OpenClaw 与 Hermes Agent 串到一起。
44
+
45
+ 配对 OpenClaw:
46
+
47
+ ```bash
48
+ clawconnect pair-openclaw
49
+ ```
50
+
51
+ 配对 Hermes Agent:
52
+
53
+ ```bash
54
+ clawconnect pair-hermes
55
+ ```
56
+
57
+ 如果使用本地开发 Relay `http://127.0.0.1:8080`,加一个 `--local` 即可:
58
+
59
+ ```bash
60
+ clawconnect pair-openclaw --local
61
+ clawconnect pair-hermes --local
62
+ ```
63
+
64
+ 上面的快捷命令等价于下面的完整写法。
65
+
66
+ OpenClaw:
67
+
68
+ ```bash
69
+ clawconnect pair \
70
+ --profile openclaw \
71
+ --server http://127.0.0.1:8080 \
72
+ --gateway-type openclaw \
73
+ --name "Mac OpenClaw"
74
+ ```
75
+
76
+ Hermes Agent:
77
+
78
+ ```bash
79
+ clawconnect pair \
80
+ --profile hermes \
81
+ --server http://127.0.0.1:8080 \
82
+ --gateway-type hermes \
83
+ --name "Mac Hermes Agent"
84
+ ```
85
+
86
+ 每条命令执行后,使用移动端扫码,或在移动端输入终端打印的配对码。配对 payload 会带上 `gatewayType`,Relay 会校验手机端请求的类型和主机注册的类型是否一致;类型不一致会拒绝绑定,避免 OpenClaw 手机网关绑定到 Hermes Agent 主机,或反过来绑定错误。
87
+
88
+ 查看两个实例:
89
+
90
+ ```bash
91
+ clawconnect status-all
92
+ ```
93
+
94
+ 单独重启或停止某一个实例:
95
+
96
+ ```bash
97
+ clawconnect restart-openclaw
98
+ clawconnect restart-hermes
99
+ clawconnect stop-openclaw
100
+ clawconnect stop-hermes
101
+ ```
102
+
103
+ 本机配置文件位置:
104
+
105
+ ```text
106
+ ~/.clawconnect/profiles/openclaw/config.json
107
+ ~/.clawconnect/profiles/hermes/config.json
108
+ ```
109
+
110
+ macOS 后台服务名:
111
+
112
+ ```text
113
+ com.openclaw.clawconnect.agent.openclaw
114
+ com.openclaw.clawconnect.agent.hermes
115
+ ```
116
+
39
117
  ### 环境配置
40
118
 
41
119
  本地安装后的 agent 会在第一次运行 `clawconnect` 时自动创建 `~/.clawconnect/.env`,里面会用注释列出所有可配置项。你可以直接编辑这个文件集中维护默认配置:
@@ -52,11 +130,12 @@ $EDITOR ~/.clawconnect/.env
52
130
  - `CLAWCONNECT_GATEWAY_URL`:可选,本机 OpenClaw Gateway WebSocket 地址覆盖值
53
131
  - `CLAWCONNECT_ENV_FILE`:可选,显式指定 env 文件路径;未设置时会依次读取 `~/.clawconnect/.env`、`.env.local`、`.env`
54
132
  - `OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD`:Gateway 鉴权兜底值
55
- - `OPENCLAW_TTS_ENABLED`、`OPENCLAW_TTS_VOICE`、`OPENCLAW_TTS_RATE`、`OPENCLAW_TTS_ENGINE`:语音回复默认值
133
+ - `CLAWCONNECT_ASR_COMMAND`:宿主机语音转文字命令。ClawLink 发送 `chat.voice.send` 后,agent 会把音频保存到临时文件,并执行这个命令;命令必须把识别文本输出到 stdout。可用占位符:`{file}`、`{language}`、`{mimeType}`
134
+ - `OPENCLAW_ASR_COMMAND`:旧版语音转文字命令兜底值;同时设置时优先使用 `CLAWCONNECT_ASR_COMMAND`
56
135
 
57
- Shell 里已经设置的环境变量优先级高于 env 文件。`clawconnect run`、`status`、`send-file` 会继续使用 `~/.clawconnect/config.json` 里已配对保存的 relay;如果要切换中继服务器,请执行 `clawconnect pair --server <url>` 或 `clawconnect reset`。
136
+ Shell 里已经设置的环境变量优先级高于 env 文件。`clawconnect run`、`status`、`send-file` 会继续使用 `~/.clawconnect/config.json` 或 `~/.clawconnect/profiles/<profile>/config.json` 里已配对保存的 relay;如果要切换中继服务器,请执行 `clawconnect pair --profile <name> --server <url>` 或 `clawconnect reset --profile <name>`。
58
137
 
59
- ### 2. 前台运行
138
+ ### 3. 前台运行
60
139
 
61
140
  以当前终端前台方式启动代理:
62
141
 
@@ -66,15 +145,15 @@ clawconnect run
66
145
 
67
146
  适合调试中继连接、本地 Gateway 鉴权和日志输出。
68
147
 
69
- 如果需要语音播报助手回复,可以显式开启:
148
+ 如果需要让手机端直接发送语音、由宿主机识别后再转发给 OpenClaw 或 Hermes Agent,请配置本机 ASR 命令:
70
149
 
71
150
  ```bash
72
- OPENCLAW_TTS_ENABLED=1 clawconnect run
151
+ CLAWCONNECT_ASR_COMMAND='/usr/local/bin/transcribe-audio {file} {language}' clawconnect run
73
152
  ```
74
153
 
75
- 未设置这个开关时,助手回复保持纯文字。
154
+ 未配置 `CLAWCONNECT_ASR_COMMAND`,且也没有旧版 `OPENCLAW_ASR_COMMAND` 兜底时,宿主机收到语音消息会返回 `voice_asr_not_configured`。
76
155
 
77
- ### 3. 查看状态
156
+ ### 4. 查看状态
78
157
 
79
158
  查看当前配对信息、网关地址和后台服务状态:
80
159
 
@@ -82,7 +161,7 @@ OPENCLAW_TTS_ENABLED=1 clawconnect run
82
161
  clawconnect status
83
162
  ```
84
163
 
85
- ### 4. 安装后台服务
164
+ ### 5. 安装后台服务
86
165
 
87
166
  将代理安装成后台常驻服务:
88
167
 
@@ -109,7 +188,7 @@ clawconnect install
109
188
  bash ~/.clawconnect/clawconnect-start.sh
110
189
  ```
111
190
 
112
- ### 5. 停止服务
191
+ ### 6. 停止服务
113
192
 
114
193
  停止后台代理服务:
115
194
 
@@ -117,7 +196,7 @@ bash ~/.clawconnect/clawconnect-start.sh
117
196
  clawconnect stop
118
197
  ```
119
198
 
120
- ### 6. 重启服务
199
+ ### 7. 重启服务
121
200
 
122
201
  重启后台代理服务:
123
202
 
@@ -125,7 +204,7 @@ clawconnect stop
125
204
  clawconnect restart
126
205
  ```
127
206
 
128
- ### 7. 设置 Gateway Token
207
+ ### 8. 设置 Gateway Token
129
208
 
130
209
  当本机 Gateway 使用 token 鉴权时,可以手动保存 token:
131
210
 
@@ -133,7 +212,7 @@ clawconnect restart
133
212
  clawconnect set-token
134
213
  ```
135
214
 
136
- ### 8. 卸载服务
215
+ ### 9. 卸载服务
137
216
 
138
217
  移除后台服务定义,但保留本地配置:
139
218
 
@@ -141,7 +220,7 @@ clawconnect set-token
141
220
  clawconnect uninstall
142
221
  ```
143
222
 
144
- ### 9. 重置配对
223
+ ### 10. 重置配对
145
224
 
146
225
  停止服务并清除本地配对配置:
147
226
 
@@ -149,7 +228,7 @@ clawconnect uninstall
149
228
  clawconnect reset
150
229
  ```
151
230
 
152
- ### 10. 升级到最新版本
231
+ ### 11. 升级到最新版本
153
232
 
154
233
  升级全局 npm 安装的包;如果已安装后台服务,会在升级成功后自动重启服务:
155
234
 
@@ -163,7 +242,7 @@ clawconnect update
163
242
  - 如果你当前运行的是本地源码目录,而不是全局 npm 安装,这个命令只会升级全局包
164
243
  - 如果你的 npm 全局目录需要更高权限,请按终端提示手动执行对应命令
165
244
 
166
- ### 11. 发送文件/图片
245
+ ### 12. 发送文件/图片
167
246
 
168
247
  把本地图片或其他文件发到已配对的聊天会话:
169
248
 
@@ -182,8 +261,6 @@ clawconnect send-file ~/Pictures/demo.jpg
182
261
  - `send-file` 会先把文件上传到 relay,再把文件消息发到手机端。
183
262
  - 图片类型会在 iPhone 聊天里显示预览图,其他类型则显示文件卡片。
184
263
  - `chat.send` 的 `attachments` 目前只是本地落盘引用,不是跨设备文件传输入口。
185
- - 默认不启用语音回复;只有设置 `OPENCLAW_TTS_ENABLED=1` 时,agent 才会把助手回复合成为音频文件。
186
- - 语音合成优先使用 `edge-tts-universal`,如果生成失败则回退到电脑自带的 TTS。
187
264
 
188
265
  ## 代码结构
189
266
 
@@ -203,34 +280,58 @@ clawconnect-agent/
203
280
  status.ts 查看配对与服务状态
204
281
  install.ts install / restart / stop / uninstall / reset
205
282
  set-token.ts 手动保存 Gateway Token
206
- local-handlers.ts 兼容旧命令前缀和本地维护命令
207
- local-runtime.ts 解析 OpenClaw 可执行文件并触发网关生命周期
208
- provider-handlers.ts provider 命令分发和网关重启
209
- provider-config.ts provider 配置读写
210
- provider-registry.ts provider 注册信息
211
- backup-manager.ts 本地配置备份管理
212
- send-file-utils.ts relay 地址和文件传输辅助
213
283
  *.test.ts 紧邻源码的单元测试
284
+ core/
285
+ command-types.ts 共享本地命令结果和上下文类型
286
+ relay/
287
+ file-upload.ts 纯 relay 文件上传服务
288
+ file-upload-utils.ts relay 地址和文件传输辅助
289
+ relay-server-connection.ts relay URL、JSON 帧、abort 和 close retry 辅助
290
+ reconnect.ts 重连策略
291
+ office-payload.ts office/status payload 构造
292
+ mobile-chat-run-bridge.ts 移动端 chat run payload 转换
293
+ voice-input.ts 共享语音输入 / ASR 参数处理
294
+ attachment-staging.ts 附件 MIME 和暂存路径辅助
295
+ chat-payload.ts 聊天 payload 归一化
296
+ slash-command-types.ts slash command 共享类型
214
297
  config/
215
298
  config.ts 配对配置读写
216
299
  env.ts env 文件加载和 agent 默认配置
300
+ hermes/
301
+ hermes-relay-manager.ts Hermes relay 桥接
302
+ hermes-runtime.ts Hermes runtime 聚合入口
303
+ hermes-session-store.ts Hermes 会话别名存储
304
+ hermes-voice-input.ts Hermes 语音输入适配
305
+ runtime/
306
+ hermes-runtime-*.ts Hermes CLI/Python、chat、cron、skills、models、usage 等执行模块
217
307
  i18n/
218
308
  index.ts CLI 文案
309
+ openclaw/
310
+ relay-manager.ts OpenClaw 中继服务器桥接与命令分发
311
+ gateway-client.ts 连接并认证本地 OpenClaw Gateway
312
+ session-store.ts OpenClaw 最新会话推断
313
+ runtime/
314
+ local-runtime.ts 解析 OpenClaw 可执行文件并触发网关生命周期
315
+ handlers/
316
+ local-handlers.ts 兼容旧命令前缀和本地维护命令
317
+ provider-handlers.ts provider 命令分发和网关重启
318
+ config/
319
+ provider-config.ts provider 配置读写
320
+ provider-registry.ts provider 注册信息
321
+ backups/
322
+ backup-manager.ts 本地配置备份管理
323
+ relay/
324
+ session-context.ts 会话默认值和上下文使用量快照
325
+ chat-history.ts 历史消息回退
326
+ chat-send-attachments.ts 发送带附件消息的参数准备
327
+ openclaw-voice-input.ts OpenClaw 语音命令适配
328
+ slash-command-catalog.ts OpenClaw slash command 目录
329
+ slash-command-catalog.generated.ts 生成的 OpenClaw slash command 目录
219
330
  platform/
220
331
  service-manager.ts 跨平台服务入口
221
332
  service-manager-common.ts 通用平台辅助常量
222
333
  service-manager-linux.ts Linux systemd/nohup 逻辑
223
334
  *.test.ts 平台层单元测试
224
- relay/
225
- gateway-client.ts 连接并认证本地 OpenClaw Gateway
226
- relay-manager.ts 中继服务器桥接与命令分发
227
- session-context.ts 会话默认值和上下文使用量快照
228
- chat-payload.ts 聊天 payload 归一化
229
- chat-history.ts 历史消息回退
230
- attachment-staging.ts 附件本地落盘
231
- chat-send-attachments.ts 发送带附件消息的参数准备
232
- reconnect.ts 重连策略
233
- *.test.ts relay 层单元测试
234
335
  ```
235
336
 
236
337
  测试文件和源码采用邻近放置的方式,统一以 `*.test.ts` 命名。它们会被 `npm test` 执行,但不会进入发布包。
@@ -240,18 +341,23 @@ clawconnect-agent/
240
341
  - `src/index.ts` 是 CLI 入口,负责命令注册和顶层错误处理。
241
342
  - `src/commands/pair.ts` 负责主机配对、保存 relay 配置,并在配对后安装后台服务。
242
343
  - `src/commands/run.ts` 负责前台启动 relay 循环,供服务管理或调试使用。
243
- - `src/commands/send-file.ts` 负责把本地文件或图片上传到已配对的聊天会话。
344
+ - `src/commands/send-file.ts` 是发送本地文件或图片到已配对聊天会话的 CLI wrapper。
244
345
  - `src/commands/install.ts` 负责后台服务的安装、重启、停止、卸载和重置。
245
346
  - `src/commands/set-token.ts` 负责在需要 token 鉴权时保存本地 Gateway Token。
246
- - `src/commands/local-handlers.ts` 负责兼容旧命令前缀,以及备份、恢复、日志、doctor、gateway 重启等本地维护命令。
247
- - `src/commands/local-runtime.ts` 负责解析 `openclaw` 可执行文件并触发网关生命周期动作。
248
- - `src/commands/provider-handlers.ts` 负责 provider 专属命令分发,并复用同一套 gateway 重启逻辑。
347
+ - `src/core/relay/file-upload.ts` 是纯程序化 relay 文件上传服务,供 CLI 和 Hermes artifact delivery 复用。
348
+ - `src/core/relay/relay-server-connection.ts` 提供共享 relay URL、JSON 帧、abort close 和 close retry 判断。
349
+ - `src/core/relay/office-payload.ts`、`mobile-chat-run-bridge.ts`、`voice-input.ts`、`attachment-staging.ts`、`chat-payload.ts` 是 gateway-neutral 的 relay 工具。
350
+ - `src/openclaw/handlers/local-handlers.ts` 负责兼容旧命令前缀,以及备份、恢复、日志、doctor、gateway 重启等本地维护命令。
351
+ - `src/openclaw/runtime/local-runtime.ts` 负责解析 `openclaw` 可执行文件并触发网关生命周期动作。
352
+ - `src/openclaw/handlers/provider-handlers.ts` 负责 provider 专属命令分发,并复用同一套 gateway 重启逻辑。
353
+ - `src/openclaw/relay-manager.ts` 负责中继服务器与本地 OpenClaw Gateway 的桥接、命令分发,以及 chat/history 回退处理。
354
+ - `src/openclaw/gateway-client.ts` 负责连接 OpenClaw Gateway,并处理设备身份认证。
355
+ - `src/openclaw/relay/session-context.ts` 负责读取会话默认值和上下文使用量快照。
356
+ - `src/openclaw/relay/chat-history.ts`、`chat-send-attachments.ts` 负责 OpenClaw 专属历史回退和 `chat.send` 附件暂存。
357
+ - `src/hermes/hermes-relay-manager.ts` 负责 Hermes runtime 与 relay server 的桥接。
358
+ - `src/hermes/runtime/` 放置 Hermes CLI/Python、chat、cron、skills、models、sessions、usage 和 lifecycle 等执行模块。
249
359
  - `src/config/env.ts` 负责加载 `.env` 文件,并集中维护 relay、Gateway 等 agent 默认配置。
250
360
  - `src/platform/service-manager.ts` 负责 macOS、Linux 和 Windows 的跨平台服务管理入口。
251
- - `src/relay/relay-manager.ts` 负责中继服务器与本地 Gateway 的桥接、命令分发,以及 chat/history 回退处理。
252
- - `src/relay/gateway-client.ts` 负责连接 OpenClaw Gateway,并处理设备身份认证。
253
- - `src/relay/session-context.ts` 负责读取会话默认值和上下文使用量快照。
254
- - `src/relay/chat-payload.ts`、`src/relay/chat-history.ts`、`src/relay/attachment-staging.ts`、`src/relay/chat-send-attachments.ts` 负责聊天数据归一化、历史回退和附件暂存。
255
361
  - `src/config/config.ts` 负责读写 `~/.clawconnect` 下的本地配对配置。
256
362
  - `src/i18n/index.ts` 负责 CLI 文案。
257
363
 
@@ -259,15 +365,17 @@ clawconnect-agent/
259
365
 
260
366
  - `pairCommand()` 负责主机配对、生成配对 payload,并持久化 relay 配置。
261
367
  - `runCommand()` 负责启动前台 relay 客户端循环,供后台服务使用。
262
- - `sendFileCommand()` 负责暂存本地文件并上传到已配对的聊天会话。
368
+ - `sendFileCommand()` 负责 CLI 配置、会话默认值和输出格式,并委托 `uploadFileToRelay()` 上传。
369
+ - `uploadFileToRelay()` 使用显式 relay URL、secret、gateway ID 和 session key 上传文件。
263
370
  - `installCommand()`、`restartCommand()`、`stopCommand()`、`uninstallCommand()`、`resetCommand()` 负责服务生命周期管理。
264
371
  - `statusCommand()` 负责打印配对配置、Gateway 状态和服务健康信息。
265
372
  - `setTokenCommand()` 负责保存本地 OpenClaw Gateway Token。
266
- - `handleLocalCommand()` 和 `handleProviderCommand()` 负责在转发前处理本地控制平面命令。
373
+ - `handleLocalCommand()` 和 `handleProviderCommand()` 负责在转发前处理 OpenClaw 本地控制平面命令。
267
374
  - `OpenClawGatewayClient` 负责管理 Gateway WebSocket、重连和请求/响应帧。
268
375
  - `canonicalizeRelayParams()`、`extractGatewaySessionDefaults()`、`buildContextUsageFingerprint()` 负责统一 relay 协议 payload。
269
376
  - `normalizeChatEventPayload()`、`extractChatText()`、`extractHistoryOutcome()`、`withMessageText()` 负责稳定聊天事件与历史回退结果。
270
377
  - `buildAttachmentStagingPath()` 和 `resolveAttachmentFileName()` 负责附件暂存路径和文件名处理。
378
+ - `buildRelayUrl()`、`sendRelayJson()`、`parseRelayFrame()`、`shouldRetryRelayClose()` 负责 OpenClaw 和 Hermes 共享的窄 relay transport 行为。
271
379
  - `getServiceStatus()`、`installService()`、`restartService()`、`stopService()`、`uninstallService()` 负责跨平台服务控制。
272
380
 
273
381
  ## 工作原理
@@ -1,11 +1,11 @@
1
1
  import { existsSync, unlinkSync } from "fs";
2
2
  import { execFileSync } from "child_process";
3
- import { join } from "path";
4
- import { homedir } from "os";
5
3
  import { t } from "../i18n/index.js";
6
- import { getServicePlatform, getServiceStatus, installService, restartService, setRestrictiveFilePermissions, stopService, uninstallService, servicePaths, } from "../platform/service-manager.js";
4
+ import { getServicePlatform, getServiceStatus, getServicePaths, installService, restartService, setRestrictiveFilePermissions, stopService, uninstallService, } from "../platform/service-manager.js";
5
+ import { profileConfigPath, profileDisplayName } from "../config/profile.js";
7
6
  export function isInstalled() {
8
7
  const platform = getServicePlatform();
8
+ const servicePaths = getServicePaths();
9
9
  if (platform === "macos")
10
10
  return existsSync(servicePaths.macPlistPath);
11
11
  if (platform === "linux") {
@@ -32,9 +32,11 @@ export function installCommand() {
32
32
  const started = installService();
33
33
  if (started) {
34
34
  const service = getServiceStatus();
35
+ console.log(`Profile: ${profileDisplayName(servicePathsProfile())}`);
35
36
  console.log(t("install.serviceStarted", service.manager));
36
37
  return;
37
38
  }
39
+ const servicePaths = getServicePaths();
38
40
  console.log(t("install.installFailed", platformName(platform)));
39
41
  if (platform === "macos") {
40
42
  console.log(t("install.serviceFileWritten", servicePaths.macPlistPath));
@@ -92,7 +94,7 @@ export function stopCommand() {
92
94
  }
93
95
  export function resetCommand() {
94
96
  stopCommand();
95
- const configPath = join(homedir(), ".clawconnect", "config.json");
97
+ const configPath = profileConfigPath();
96
98
  if (existsSync(configPath)) {
97
99
  try {
98
100
  if (process.platform === "win32") {
@@ -112,6 +114,10 @@ export function resetCommand() {
112
114
  }
113
115
  console.log(t("install.resetComplete"));
114
116
  }
117
+ function servicePathsProfile() {
118
+ const profile = getServicePaths().profile;
119
+ return profile === "default" ? undefined : profile;
120
+ }
115
121
  function platformName(platform) {
116
122
  switch (platform) {
117
123
  case "macos":
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,13 @@
1
+ import { type ClawConnectConfig } from "../config/config.js";
1
2
  interface PairOptions {
2
3
  server?: string;
3
4
  name?: string;
4
5
  codeOnly?: boolean;
6
+ gatewayType?: string;
7
+ profile?: string;
5
8
  }
6
9
  export declare function pairCommand(opts: PairOptions): Promise<void>;
10
+ export declare function sameRelayServer(left: string, right: string): boolean;
11
+ export declare function shouldReuseExistingPairing(config: ClawConnectConfig | null, gatewayType: "openclaw" | "hermes", requestedRelayServerUrl: string): boolean;
12
+ export declare function normalizeRelayServerIdentity(relayServerUrl: string): string;
7
13
  export {};