helmpilot 0.4.2 → 0.4.4
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 +5 -5
- package/__tests__/setup-adapter.test.ts +8 -8
- package/adapters.ts +3 -3
- package/index.ts +1 -1
- package/package.json +5 -4
- package/setup-entry.ts +3 -3
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ The Helmpilot Desktop Channel plugin for OpenClaw — registers Helmpilot as a f
|
|
|
4
4
|
in the OpenClaw gateway, providing interactive tools, outbound messaging, and relay-based
|
|
5
5
|
cross-network tunneling.
|
|
6
6
|
|
|
7
|
-
**Channel ID**: `helmpilot
|
|
7
|
+
**Channel ID**: `helmpilot`
|
|
8
8
|
**Config Section**: `channels.helmpilot`
|
|
9
9
|
|
|
10
10
|
## Architecture
|
|
@@ -60,7 +60,7 @@ plugins/helmpilot-channel/
|
|
|
60
60
|
adapters.ts ← Messaging/Setup/Status/Pairing/Security adapters
|
|
61
61
|
types.ts ← Question/Answer TypeBox schemas
|
|
62
62
|
preload.cjs ← CJS→ESM bridge + SDK symlink
|
|
63
|
-
openclaw.plugin.json ← Manifest (declares channel: "helmpilot
|
|
63
|
+
openclaw.plugin.json ← Manifest (declares channel: "helmpilot")
|
|
64
64
|
package.json ← Package metadata and OpenClaw compatibility
|
|
65
65
|
__tests__/ ← Outbound adapter + config adapter tests
|
|
66
66
|
```
|
|
@@ -162,16 +162,16 @@ The fastest way to configure helmpilot-channel is via the OpenClaw CLI:
|
|
|
162
162
|
|
|
163
163
|
```bash
|
|
164
164
|
# Full non-interactive setup (all three fields at once)
|
|
165
|
-
openclaw channels add --channel helmpilot
|
|
165
|
+
openclaw channels add --channel helmpilot \
|
|
166
166
|
--url wss://relay.example.com \
|
|
167
167
|
--code helmpilot-abc123 \
|
|
168
168
|
--token ck_xyz789
|
|
169
169
|
|
|
170
170
|
# Interactive wizard mode (guided step-by-step)
|
|
171
|
-
openclaw channels add --channel helmpilot
|
|
171
|
+
openclaw channels add --channel helmpilot
|
|
172
172
|
|
|
173
173
|
# Partial update (e.g. rotate channel key only)
|
|
174
|
-
openclaw channels add --channel helmpilot
|
|
174
|
+
openclaw channels add --channel helmpilot --token ck_new_key
|
|
175
175
|
```
|
|
176
176
|
|
|
177
177
|
| CLI Flag | Config Field | Validation | Example |
|
|
@@ -29,20 +29,20 @@ describe('createSetupAdapter', () => {
|
|
|
29
29
|
const result = setup.applyAccountConfig({
|
|
30
30
|
cfg: emptyCfg,
|
|
31
31
|
accountId: 'default',
|
|
32
|
-
input: { code: '
|
|
32
|
+
input: { code: 'helmpilot-abc123' },
|
|
33
33
|
});
|
|
34
|
-
expect((result as any).channels.helmpilot.channelId).toBe('
|
|
34
|
+
expect((result as any).channels.helmpilot.channelId).toBe('helmpilot-abc123');
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
it('maps all three fields at once', () => {
|
|
38
38
|
const result = setup.applyAccountConfig({
|
|
39
39
|
cfg: emptyCfg,
|
|
40
40
|
accountId: 'default',
|
|
41
|
-
input: { url: 'wss://relay.example.com', code: '
|
|
41
|
+
input: { url: 'wss://relay.example.com', code: 'helmpilot-abc', token: 'ck_xyz' },
|
|
42
42
|
});
|
|
43
43
|
const hp = (result as any).channels.helmpilot;
|
|
44
44
|
expect(hp.relayUrl).toBe('wss://relay.example.com');
|
|
45
|
-
expect(hp.channelId).toBe('
|
|
45
|
+
expect(hp.channelId).toBe('helmpilot-abc');
|
|
46
46
|
expect(hp.channelKey).toBe('ck_xyz');
|
|
47
47
|
expect(hp.enabled).toBe(true);
|
|
48
48
|
});
|
|
@@ -98,13 +98,13 @@ describe('createSetupAdapter', () => {
|
|
|
98
98
|
expect(err).toContain('ck_');
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
it('rejects code without
|
|
101
|
+
it('rejects code without helmpilot- prefix', () => {
|
|
102
102
|
const err = setup.validateInput({
|
|
103
103
|
cfg: emptyCfg,
|
|
104
104
|
accountId: 'default',
|
|
105
105
|
input: { code: 'bad_channel' },
|
|
106
106
|
});
|
|
107
|
-
expect(err).toContain('
|
|
107
|
+
expect(err).toContain('helmpilot-');
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
it('accepts valid url only', () => {
|
|
@@ -115,7 +115,7 @@ describe('createSetupAdapter', () => {
|
|
|
115
115
|
|
|
116
116
|
it('accepts valid code only', () => {
|
|
117
117
|
expect(
|
|
118
|
-
setup.validateInput({ cfg: emptyCfg, accountId: 'default', input: { code: '
|
|
118
|
+
setup.validateInput({ cfg: emptyCfg, accountId: 'default', input: { code: 'helmpilot-abc' } }),
|
|
119
119
|
).toBeNull();
|
|
120
120
|
});
|
|
121
121
|
|
|
@@ -130,7 +130,7 @@ describe('createSetupAdapter', () => {
|
|
|
130
130
|
setup.validateInput({
|
|
131
131
|
cfg: emptyCfg,
|
|
132
132
|
accountId: 'default',
|
|
133
|
-
input: { url: 'wss://r.com', code: '
|
|
133
|
+
input: { url: 'wss://r.com', code: 'helmpilot-abc', token: 'ck_xyz' },
|
|
134
134
|
}),
|
|
135
135
|
).toBeNull();
|
|
136
136
|
});
|
package/adapters.ts
CHANGED
|
@@ -93,8 +93,8 @@ export function createSetupAdapter() {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
if (code && !code.startsWith('
|
|
97
|
-
return 'Channel ID must start with "
|
|
96
|
+
if (code && !code.startsWith('helmpilot-')) {
|
|
97
|
+
return 'Channel ID must start with "helmpilot-"';
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
if (token && !token.startsWith('ck_')) {
|
|
@@ -110,7 +110,7 @@ export function createSetupAdapter() {
|
|
|
110
110
|
|
|
111
111
|
if (!hasUrl && !hasCode && !hasToken) {
|
|
112
112
|
return 'Helmpilot requires --url (Relay URL), --code (channel ID), and --token (channel key).\n'
|
|
113
|
-
+ 'Example: openclaw channels add --channel helmpilot --url ws://localhost:4800 --code
|
|
113
|
+
+ 'Example: openclaw channels add --channel helmpilot --url ws://localhost:4800 --code helmpilot-xxx --token ck_xxx';
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
return null;
|
package/index.ts
CHANGED
|
@@ -51,7 +51,7 @@ export default definePluginEntry({
|
|
|
51
51
|
api.registerChannel({ plugin: helmpilotPlugin });
|
|
52
52
|
|
|
53
53
|
// ── Timeout helper for client-blocking tool calls ──
|
|
54
|
-
const FILE_TOOL_TIMEOUT_MS =
|
|
54
|
+
const FILE_TOOL_TIMEOUT_MS = 120_000;
|
|
55
55
|
|
|
56
56
|
function waitForClientResponse(toolCallId: string, params: unknown, timeoutMs: number): Promise<string> {
|
|
57
57
|
const pendingMap = getPendingMap();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "helmpilot",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "Helmpilot desktop channel plugin for OpenClaw — interactive tools and gateway RPC bridge",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.ts",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"blurb": "Connect to the Helmpilot desktop AI assistant client"
|
|
25
25
|
},
|
|
26
26
|
"compat": {
|
|
27
|
-
"pluginApi": ">=2026.
|
|
28
|
-
"minGatewayVersion": "2026.
|
|
27
|
+
"pluginApi": ">=2026.4.2",
|
|
28
|
+
"minGatewayVersion": "2026.4.2"
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"@types/ws": ">=8.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@types/ws": "^8.18.1"
|
|
36
|
+
"@types/ws": "^8.18.1",
|
|
37
|
+
"openclaw": "2026.4.2"
|
|
37
38
|
}
|
|
38
39
|
}
|
package/setup-entry.ts
CHANGED
|
@@ -90,8 +90,8 @@ function createInlinedSetupAdapter() {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
if (code && !code.startsWith('
|
|
94
|
-
return 'Channel ID must start with "
|
|
93
|
+
if (code && !code.startsWith('helmpilot-')) {
|
|
94
|
+
return 'Channel ID must start with "helmpilot-"';
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
if (token && !token.startsWith('ck_')) {
|
|
@@ -107,7 +107,7 @@ function createInlinedSetupAdapter() {
|
|
|
107
107
|
|
|
108
108
|
if (!hasUrl && !hasCode && !hasToken) {
|
|
109
109
|
return 'Helmpilot requires --url (Relay URL), --code (channel ID), and --token (channel key).\n'
|
|
110
|
-
+ 'Example: openclaw channels add --channel helmpilot --url ws://localhost:4800 --code
|
|
110
|
+
+ 'Example: openclaw channels add --channel helmpilot --url ws://localhost:4800 --code helmpilot-xxx --token ck_xxx';
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
return null;
|