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.
- package/README.md +142 -34
- package/README.zh-CN.md +152 -44
- package/dist/commands/install.js +10 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/pair.d.ts +6 -0
- package/dist/commands/pair.js +78 -10
- package/dist/commands/pair.js.map +1 -1
- package/dist/commands/run.js +14 -17
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/send-file.d.ts +3 -24
- package/dist/commands/send-file.js +22 -449
- package/dist/commands/send-file.js.map +1 -1
- package/dist/commands/status.d.ts +13 -1
- package/dist/commands/status.js +58 -15
- package/dist/commands/status.js.map +1 -1
- package/dist/config/config.d.ts +6 -11
- package/dist/config/config.js +19 -48
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.js +4 -5
- package/dist/config/env.js.map +1 -1
- package/dist/config/profile.d.ts +11 -0
- package/dist/config/profile.js +80 -0
- package/dist/config/profile.js.map +1 -0
- package/dist/core/command-types.d.ts +18 -0
- package/dist/core/command-types.js +2 -0
- package/dist/core/command-types.js.map +1 -0
- package/dist/core/relay/attachment-staging.js.map +1 -0
- package/dist/{relay → core/relay}/chat-payload.js +17 -3
- package/dist/core/relay/chat-payload.js.map +1 -0
- package/dist/{commands/send-file-utils.js → core/relay/file-upload-utils.js} +1 -1
- package/dist/core/relay/file-upload-utils.js.map +1 -0
- package/dist/core/relay/file-upload.d.ts +40 -0
- package/dist/core/relay/file-upload.js +401 -0
- package/dist/core/relay/file-upload.js.map +1 -0
- package/dist/core/relay/mobile-chat-run-bridge.d.ts +201 -0
- package/dist/core/relay/mobile-chat-run-bridge.js +192 -0
- package/dist/core/relay/mobile-chat-run-bridge.js.map +1 -0
- package/dist/core/relay/office-payload.js.map +1 -0
- package/dist/core/relay/reconnect.js.map +1 -0
- package/dist/core/relay/relay-server-connection.d.ts +6 -0
- package/dist/core/relay/relay-server-connection.js +32 -0
- package/dist/core/relay/relay-server-connection.js.map +1 -0
- package/dist/core/relay/slash-command-types.d.ts +7 -0
- package/dist/core/relay/slash-command-types.js +2 -0
- package/dist/core/relay/slash-command-types.js.map +1 -0
- package/dist/core/relay/timeline-event-builder.d.ts +86 -0
- package/dist/core/relay/timeline-event-builder.js +199 -0
- package/dist/core/relay/timeline-event-builder.js.map +1 -0
- package/dist/core/relay/timeline-event-log.d.ts +81 -0
- package/dist/core/relay/timeline-event-log.js +254 -0
- package/dist/core/relay/timeline-event-log.js.map +1 -0
- package/dist/core/relay/voice-input.d.ts +11 -0
- package/dist/core/relay/voice-input.js +120 -0
- package/dist/core/relay/voice-input.js.map +1 -0
- package/dist/gateway-profiles.d.ts +8 -0
- package/dist/gateway-profiles.js +24 -0
- package/dist/gateway-profiles.js.map +1 -0
- package/dist/hermes/hermes-relay-manager.d.ts +59 -0
- package/dist/hermes/hermes-relay-manager.js +754 -0
- package/dist/hermes/hermes-relay-manager.js.map +1 -0
- package/dist/hermes/hermes-runtime.d.ts +9 -0
- package/dist/hermes/hermes-runtime.js +9 -0
- package/dist/hermes/hermes-runtime.js.map +1 -0
- package/dist/hermes/hermes-session-store.d.ts +15 -0
- package/dist/hermes/hermes-session-store.js +174 -0
- package/dist/hermes/hermes-session-store.js.map +1 -0
- package/dist/hermes/hermes-voice-input.d.ts +13 -0
- package/dist/hermes/hermes-voice-input.js +27 -0
- package/dist/hermes/hermes-voice-input.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-artifacts.d.ts +3 -0
- package/dist/hermes/runtime/hermes-runtime-artifacts.js +65 -0
- package/dist/hermes/runtime/hermes-runtime-artifacts.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-backups.d.ts +5 -0
- package/dist/hermes/runtime/hermes-runtime-backups.js +128 -0
- package/dist/hermes/runtime/hermes-runtime-backups.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-chat.d.ts +41 -0
- package/dist/hermes/runtime/hermes-runtime-chat.js +723 -0
- package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-command-router.d.ts +2 -0
- package/dist/hermes/runtime/hermes-runtime-command-router.js +96 -0
- package/dist/hermes/runtime/hermes-runtime-command-router.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-command-utils.d.ts +3 -0
- package/dist/hermes/runtime/hermes-runtime-command-utils.js +19 -0
- package/dist/hermes/runtime/hermes-runtime-command-utils.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-cron.d.ts +11 -0
- package/dist/hermes/runtime/hermes-runtime-cron.js +301 -0
- package/dist/hermes/runtime/hermes-runtime-cron.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-history.d.ts +2 -0
- package/dist/hermes/runtime/hermes-runtime-history.js +249 -0
- package/dist/hermes/runtime/hermes-runtime-history.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-lifecycle.d.ts +9 -0
- package/dist/hermes/runtime/hermes-runtime-lifecycle.js +111 -0
- package/dist/hermes/runtime/hermes-runtime-lifecycle.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-models.d.ts +29 -0
- package/dist/hermes/runtime/hermes-runtime-models.js +125 -0
- package/dist/hermes/runtime/hermes-runtime-models.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-process.d.ts +24 -0
- package/dist/hermes/runtime/hermes-runtime-process.js +147 -0
- package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-sessions.d.ts +5 -0
- package/dist/hermes/runtime/hermes-runtime-sessions.js +88 -0
- package/dist/hermes/runtime/hermes-runtime-sessions.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-skills.d.ts +13 -0
- package/dist/hermes/runtime/hermes-runtime-skills.js +322 -0
- package/dist/hermes/runtime/hermes-runtime-skills.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-types.d.ts +19 -0
- package/dist/hermes/runtime/hermes-runtime-types.js +2 -0
- package/dist/hermes/runtime/hermes-runtime-types.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-usage.d.ts +22 -0
- package/dist/hermes/runtime/hermes-runtime-usage.js +211 -0
- package/dist/hermes/runtime/hermes-runtime-usage.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-values.d.ts +14 -0
- package/dist/hermes/runtime/hermes-runtime-values.js +105 -0
- package/dist/hermes/runtime/hermes-runtime-values.js.map +1 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +115 -9
- package/dist/index.js.map +1 -1
- package/dist/openclaw/backups/backup-manager.js.map +1 -0
- package/dist/{commands → openclaw/config}/provider-config.js +1 -1
- package/dist/openclaw/config/provider-config.js.map +1 -0
- package/dist/openclaw/config/provider-registry.js.map +1 -0
- package/dist/{relay → openclaw}/gateway-client.js +4 -3
- package/dist/openclaw/gateway-client.js.map +1 -0
- package/dist/{commands → openclaw/handlers}/local-handlers.d.ts +1 -1
- package/dist/{commands → openclaw/handlers}/local-handlers.js +2 -30
- package/dist/openclaw/handlers/local-handlers.js.map +1 -0
- package/dist/{commands → openclaw/handlers}/provider-handlers.d.ts +1 -1
- package/dist/{commands → openclaw/handlers}/provider-handlers.js +3 -3
- package/dist/openclaw/handlers/provider-handlers.js.map +1 -0
- package/dist/openclaw/relay/chat-history.d.ts +51 -0
- package/dist/openclaw/relay/chat-history.js +347 -0
- package/dist/openclaw/relay/chat-history.js.map +1 -0
- package/dist/{relay → openclaw/relay}/chat-send-attachments.js +12 -1
- package/dist/openclaw/relay/chat-send-attachments.js.map +1 -0
- package/dist/openclaw/relay/openclaw-voice-input.d.ts +13 -0
- package/dist/openclaw/relay/openclaw-voice-input.js +18 -0
- package/dist/openclaw/relay/openclaw-voice-input.js.map +1 -0
- package/dist/openclaw/relay/outgoing-media-relay.d.ts +11 -0
- package/dist/openclaw/relay/outgoing-media-relay.js +120 -0
- package/dist/openclaw/relay/outgoing-media-relay.js.map +1 -0
- package/dist/{relay → openclaw/relay}/session-context.d.ts +6 -0
- package/dist/{relay → openclaw/relay}/session-context.js +53 -3
- package/dist/openclaw/relay/session-context.js.map +1 -0
- package/dist/openclaw/relay/slash-command-catalog.d.ts +2 -0
- package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.d.ts +0 -5
- package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.js +0 -6
- package/dist/openclaw/relay/slash-command-catalog.generated.js.map +1 -0
- package/dist/openclaw/relay/slash-command-catalog.js.map +1 -0
- package/dist/openclaw/relay/transcript-dedupe.d.ts +21 -0
- package/dist/openclaw/relay/transcript-dedupe.js +211 -0
- package/dist/openclaw/relay/transcript-dedupe.js.map +1 -0
- package/dist/{relay → openclaw}/relay-manager.d.ts +1 -4
- package/dist/openclaw/relay-manager.js +787 -0
- package/dist/openclaw/relay-manager.js.map +1 -0
- package/dist/{commands → openclaw/runtime}/local-runtime.d.ts +1 -17
- package/dist/openclaw/runtime/local-runtime.js.map +1 -0
- package/dist/openclaw/session-store.d.ts +1 -0
- package/dist/openclaw/session-store.js +70 -0
- package/dist/openclaw/session-store.js.map +1 -0
- package/dist/platform/service-manager-common.d.ts +5 -2
- package/dist/platform/service-manager-common.js +18 -7
- package/dist/platform/service-manager-common.js.map +1 -1
- package/dist/platform/service-manager.d.ts +16 -5
- package/dist/platform/service-manager.js +85 -50
- package/dist/platform/service-manager.js.map +1 -1
- package/dist/runtime-adapters.d.ts +19 -0
- package/dist/runtime-adapters.js +39 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/package.json +3 -3
- package/dist/commands/backup-manager.js.map +0 -1
- package/dist/commands/local-handlers.js.map +0 -1
- package/dist/commands/local-runtime.js.map +0 -1
- package/dist/commands/provider-config.js.map +0 -1
- package/dist/commands/provider-handlers.js.map +0 -1
- package/dist/commands/provider-registry.js.map +0 -1
- package/dist/commands/send-file-utils.js.map +0 -1
- package/dist/commands/voice-reply.d.ts +0 -39
- package/dist/commands/voice-reply.js +0 -329
- package/dist/commands/voice-reply.js.map +0 -1
- package/dist/relay/attachment-staging.js.map +0 -1
- package/dist/relay/chat-history.d.ts +0 -29
- package/dist/relay/chat-history.js +0 -69
- package/dist/relay/chat-history.js.map +0 -1
- package/dist/relay/chat-payload.js.map +0 -1
- package/dist/relay/chat-send-attachments.js.map +0 -1
- package/dist/relay/gateway-client.js.map +0 -1
- package/dist/relay/office-payload.js.map +0 -1
- package/dist/relay/reconnect.js.map +0 -1
- package/dist/relay/relay-manager.js +0 -644
- package/dist/relay/relay-manager.js.map +0 -1
- package/dist/relay/session-context.js.map +0 -1
- package/dist/relay/slash-command-catalog.d.ts +0 -8
- package/dist/relay/slash-command-catalog.generated.js.map +0 -1
- package/dist/relay/slash-command-catalog.js.map +0 -1
- package/dist/relay/voice-reply-preference.d.ts +0 -25
- package/dist/relay/voice-reply-preference.js +0 -103
- package/dist/relay/voice-reply-preference.js.map +0 -1
- /package/dist/{relay → core/relay}/attachment-staging.d.ts +0 -0
- /package/dist/{relay → core/relay}/attachment-staging.js +0 -0
- /package/dist/{relay → core/relay}/chat-payload.d.ts +0 -0
- /package/dist/{commands/send-file-utils.d.ts → core/relay/file-upload-utils.d.ts} +0 -0
- /package/dist/{relay → core/relay}/office-payload.d.ts +0 -0
- /package/dist/{relay → core/relay}/office-payload.js +0 -0
- /package/dist/{relay → core/relay}/reconnect.d.ts +0 -0
- /package/dist/{relay → core/relay}/reconnect.js +0 -0
- /package/dist/{commands → openclaw/backups}/backup-manager.d.ts +0 -0
- /package/dist/{commands → openclaw/backups}/backup-manager.js +0 -0
- /package/dist/{commands → openclaw/config}/provider-config.d.ts +0 -0
- /package/dist/{commands → openclaw/config}/provider-registry.d.ts +0 -0
- /package/dist/{commands → openclaw/config}/provider-registry.js +0 -0
- /package/dist/{relay → openclaw}/gateway-client.d.ts +0 -0
- /package/dist/{relay → openclaw/relay}/chat-send-attachments.d.ts +0 -0
- /package/dist/{relay → openclaw/relay}/slash-command-catalog.js +0 -0
- /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
|
-
- `
|
|
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
|
|
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:
|
|
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
|
-
|
|
142
|
+
CLAWCONNECT_ASR_COMMAND='/usr/local/bin/transcribe-audio {file} {language}' clawconnect run
|
|
64
143
|
```
|
|
65
144
|
|
|
66
|
-
|
|
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`
|
|
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/
|
|
232
|
-
- `src/
|
|
233
|
-
- `src/
|
|
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()`
|
|
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
|
-
- `
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
199
|
+
### 7. 重启服务
|
|
121
200
|
|
|
122
201
|
重启后台代理服务:
|
|
123
202
|
|
|
@@ -125,7 +204,7 @@ clawconnect stop
|
|
|
125
204
|
clawconnect restart
|
|
126
205
|
```
|
|
127
206
|
|
|
128
|
-
###
|
|
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
|
-
###
|
|
215
|
+
### 9. 卸载服务
|
|
137
216
|
|
|
138
217
|
移除后台服务定义,但保留本地配置:
|
|
139
218
|
|
|
@@ -141,7 +220,7 @@ clawconnect set-token
|
|
|
141
220
|
clawconnect uninstall
|
|
142
221
|
```
|
|
143
222
|
|
|
144
|
-
###
|
|
223
|
+
### 10. 重置配对
|
|
145
224
|
|
|
146
225
|
停止服务并清除本地配对配置:
|
|
147
226
|
|
|
@@ -149,7 +228,7 @@ clawconnect uninstall
|
|
|
149
228
|
clawconnect reset
|
|
150
229
|
```
|
|
151
230
|
|
|
152
|
-
###
|
|
231
|
+
### 11. 升级到最新版本
|
|
153
232
|
|
|
154
233
|
升级全局 npm 安装的包;如果已安装后台服务,会在升级成功后自动重启服务:
|
|
155
234
|
|
|
@@ -163,7 +242,7 @@ clawconnect update
|
|
|
163
242
|
- 如果你当前运行的是本地源码目录,而不是全局 npm 安装,这个命令只会升级全局包
|
|
164
243
|
- 如果你的 npm 全局目录需要更高权限,请按终端提示手动执行对应命令
|
|
165
244
|
|
|
166
|
-
###
|
|
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/
|
|
247
|
-
- `src/
|
|
248
|
-
- `src/
|
|
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
|
## 工作原理
|
package/dist/commands/install.js
CHANGED
|
@@ -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,
|
|
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 =
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pair.d.ts
CHANGED
|
@@ -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 {};
|