@openreef/cli 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/dist/commands/install.d.ts +13 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +560 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +81 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +198 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +8 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +132 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/core/agents-md-generator.d.ts +3 -0
- package/dist/core/agents-md-generator.d.ts.map +1 -0
- package/dist/core/agents-md-generator.js +24 -0
- package/dist/core/agents-md-generator.js.map +1 -0
- package/dist/core/config-patcher.d.ts +32 -0
- package/dist/core/config-patcher.d.ts.map +1 -0
- package/dist/core/config-patcher.js +147 -0
- package/dist/core/config-patcher.js.map +1 -0
- package/dist/core/device-identity.d.ts +37 -0
- package/dist/core/device-identity.d.ts.map +1 -0
- package/dist/core/device-identity.js +135 -0
- package/dist/core/device-identity.js.map +1 -0
- package/dist/core/gateway-client.d.ts +98 -0
- package/dist/core/gateway-client.d.ts.map +1 -0
- package/dist/core/gateway-client.js +238 -0
- package/dist/core/gateway-client.js.map +1 -0
- package/dist/core/openclaw-paths.d.ts +17 -0
- package/dist/core/openclaw-paths.d.ts.map +1 -0
- package/dist/core/openclaw-paths.js +175 -0
- package/dist/core/openclaw-paths.js.map +1 -0
- package/dist/core/state-manager.d.ts +7 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +61 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/core/variable-resolver.d.ts +1 -0
- package/dist/core/variable-resolver.d.ts.map +1 -1
- package/dist/core/variable-resolver.js +21 -10
- package/dist/core/variable-resolver.js.map +1 -1
- package/dist/index.js +71 -1
- package/dist/index.js.map +1 -1
- package/dist/types/state.d.ts +41 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +2 -0
- package/dist/types/state.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { loadOrCreateDeviceIdentity, signDevicePayload, publicKeyRawBase64Url, buildDeviceAuthPayload, loadDeviceAuthToken, storeDeviceAuthToken, } from './device-identity.js';
|
|
4
|
+
const PROTOCOL_VERSION = 3;
|
|
5
|
+
const CLIENT_ID = 'cli';
|
|
6
|
+
const CLIENT_MODE = 'cli';
|
|
7
|
+
const ROLE = 'operator';
|
|
8
|
+
const SCOPES = ['operator.admin', 'operator.approvals', 'operator.pairing'];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve Gateway auth credentials from multiple sources.
|
|
11
|
+
* If gatewayUrl is explicitly provided (override), ONLY explicit --gateway-token
|
|
12
|
+
* or --gateway-password satisfy auth — env/config fallbacks are NOT accepted.
|
|
13
|
+
* For local (non-overridden) URLs: explicit CLI → env vars → config file values.
|
|
14
|
+
*/
|
|
15
|
+
export function resolveGatewayAuth(opts) {
|
|
16
|
+
// If URL was explicitly overridden, require explicit CLI auth (no env/config fallback)
|
|
17
|
+
if (opts.gatewayUrl) {
|
|
18
|
+
if (!opts.gatewayToken && !opts.gatewayPassword) {
|
|
19
|
+
throw new Error('Gateway URL override requires --gateway-token or --gateway-password.');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
token: opts.gatewayToken ?? undefined,
|
|
23
|
+
password: opts.gatewayPassword ?? undefined,
|
|
24
|
+
skipStoredAuth: true,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Local/default URL: full resolution chain
|
|
28
|
+
const e = opts.env ?? process.env;
|
|
29
|
+
const gw = (opts.config?.gateway ?? {});
|
|
30
|
+
const auth = (gw.auth ?? {});
|
|
31
|
+
const token = opts.gatewayToken ??
|
|
32
|
+
e.OPENCLAW_GATEWAY_TOKEN ??
|
|
33
|
+
auth.token;
|
|
34
|
+
const password = opts.gatewayPassword ??
|
|
35
|
+
e.OPENCLAW_GATEWAY_PASSWORD ??
|
|
36
|
+
auth.password;
|
|
37
|
+
return {
|
|
38
|
+
token: token ?? undefined,
|
|
39
|
+
password: password ?? undefined,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export class GatewayClient {
|
|
43
|
+
ws = null;
|
|
44
|
+
pending = new Map();
|
|
45
|
+
connected = false;
|
|
46
|
+
options;
|
|
47
|
+
timeoutMs;
|
|
48
|
+
constructor(options) {
|
|
49
|
+
this.options = options;
|
|
50
|
+
this.timeoutMs = options.timeoutMs ?? 15000;
|
|
51
|
+
}
|
|
52
|
+
async connect() {
|
|
53
|
+
const identity = loadOrCreateDeviceIdentity(this.options.env);
|
|
54
|
+
// Load stored device auth token as fallback (only for local URLs)
|
|
55
|
+
const storedAuth = this.options.skipStoredAuth
|
|
56
|
+
? null
|
|
57
|
+
: loadDeviceAuthToken({
|
|
58
|
+
deviceId: identity.deviceId,
|
|
59
|
+
role: ROLE,
|
|
60
|
+
env: this.options.env,
|
|
61
|
+
});
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const ws = new WebSocket(this.options.url);
|
|
64
|
+
this.ws = ws;
|
|
65
|
+
let challengeNonce;
|
|
66
|
+
let connectSent = false;
|
|
67
|
+
let connectTimer;
|
|
68
|
+
const sendConnect = (nonce) => {
|
|
69
|
+
if (connectSent)
|
|
70
|
+
return;
|
|
71
|
+
connectSent = true;
|
|
72
|
+
const signedAt = Date.now();
|
|
73
|
+
const authToken = this.options.token ?? storedAuth?.token ?? undefined;
|
|
74
|
+
const authPayload = buildDeviceAuthPayload({
|
|
75
|
+
deviceId: identity.deviceId,
|
|
76
|
+
clientId: CLIENT_ID,
|
|
77
|
+
clientMode: CLIENT_MODE,
|
|
78
|
+
role: ROLE,
|
|
79
|
+
scopes: SCOPES,
|
|
80
|
+
signedAtMs: signedAt,
|
|
81
|
+
token: authToken ?? null,
|
|
82
|
+
nonce,
|
|
83
|
+
});
|
|
84
|
+
const signature = signDevicePayload(identity.privateKeyPem, authPayload);
|
|
85
|
+
const connectParams = {
|
|
86
|
+
minProtocol: PROTOCOL_VERSION,
|
|
87
|
+
maxProtocol: PROTOCOL_VERSION,
|
|
88
|
+
client: {
|
|
89
|
+
id: CLIENT_ID,
|
|
90
|
+
version: '0.2.0',
|
|
91
|
+
platform: process.platform,
|
|
92
|
+
mode: CLIENT_MODE,
|
|
93
|
+
},
|
|
94
|
+
role: ROLE,
|
|
95
|
+
scopes: SCOPES,
|
|
96
|
+
device: {
|
|
97
|
+
id: identity.deviceId,
|
|
98
|
+
publicKey: publicKeyRawBase64Url(identity.publicKeyPem),
|
|
99
|
+
signature,
|
|
100
|
+
signedAt: signedAt,
|
|
101
|
+
...(nonce ? { nonce } : {}),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
// Add auth if available
|
|
105
|
+
const auth = {};
|
|
106
|
+
if (authToken)
|
|
107
|
+
auth.token = authToken;
|
|
108
|
+
if (this.options.password)
|
|
109
|
+
auth.password = this.options.password;
|
|
110
|
+
if (Object.keys(auth).length > 0) {
|
|
111
|
+
connectParams.auth = auth;
|
|
112
|
+
}
|
|
113
|
+
const reqId = randomUUID();
|
|
114
|
+
const frame = {
|
|
115
|
+
type: 'req',
|
|
116
|
+
id: reqId,
|
|
117
|
+
method: 'connect',
|
|
118
|
+
params: connectParams,
|
|
119
|
+
};
|
|
120
|
+
ws.send(JSON.stringify(frame));
|
|
121
|
+
// Wait for connect response
|
|
122
|
+
const timer = setTimeout(() => {
|
|
123
|
+
this.pending.delete(reqId);
|
|
124
|
+
reject(new Error('Gateway connect handshake timed out'));
|
|
125
|
+
}, this.timeoutMs);
|
|
126
|
+
this.pending.set(reqId, {
|
|
127
|
+
resolve: (payload) => {
|
|
128
|
+
this.connected = true;
|
|
129
|
+
// Store device token if returned
|
|
130
|
+
const p = payload;
|
|
131
|
+
const authResult = p?.auth;
|
|
132
|
+
if (authResult?.deviceToken) {
|
|
133
|
+
storeDeviceAuthToken({
|
|
134
|
+
deviceId: identity.deviceId,
|
|
135
|
+
role: ROLE,
|
|
136
|
+
token: authResult.deviceToken,
|
|
137
|
+
scopes: SCOPES,
|
|
138
|
+
env: this.options.env,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
resolve();
|
|
142
|
+
},
|
|
143
|
+
reject,
|
|
144
|
+
timer,
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
ws.on('open', () => {
|
|
148
|
+
// Queue connect with 750ms delay — allows challenge to arrive first
|
|
149
|
+
connectTimer = setTimeout(() => sendConnect(), 750);
|
|
150
|
+
});
|
|
151
|
+
ws.on('message', (data) => {
|
|
152
|
+
let frame;
|
|
153
|
+
try {
|
|
154
|
+
frame = JSON.parse(data.toString());
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Handle connect.challenge event
|
|
160
|
+
if (frame.type === 'event' &&
|
|
161
|
+
frame.event === 'connect.challenge') {
|
|
162
|
+
const payload = frame.payload;
|
|
163
|
+
challengeNonce = payload.nonce;
|
|
164
|
+
clearTimeout(connectTimer);
|
|
165
|
+
sendConnect(challengeNonce);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Handle response frames
|
|
169
|
+
if (frame.type === 'res') {
|
|
170
|
+
const id = frame.id;
|
|
171
|
+
const pending = this.pending.get(id);
|
|
172
|
+
if (!pending)
|
|
173
|
+
return;
|
|
174
|
+
clearTimeout(pending.timer);
|
|
175
|
+
this.pending.delete(id);
|
|
176
|
+
if (frame.ok) {
|
|
177
|
+
pending.resolve(frame.payload);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const err = frame.error;
|
|
181
|
+
pending.reject(new Error(`Gateway error: ${err?.code ?? 'unknown'} — ${err?.message ?? 'no message'}`));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
ws.on('error', (err) => {
|
|
186
|
+
reject(new Error(`Gateway connection failed: ${err.message}`));
|
|
187
|
+
});
|
|
188
|
+
ws.on('close', () => {
|
|
189
|
+
this.connected = false;
|
|
190
|
+
for (const [id, pending] of this.pending) {
|
|
191
|
+
clearTimeout(pending.timer);
|
|
192
|
+
pending.reject(new Error('Gateway connection closed'));
|
|
193
|
+
this.pending.delete(id);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
async call(method, params) {
|
|
199
|
+
if (!this.ws || !this.connected) {
|
|
200
|
+
throw new Error('Gateway not connected. Call connect() first.');
|
|
201
|
+
}
|
|
202
|
+
const id = randomUUID();
|
|
203
|
+
const frame = { type: 'req', id, method, params: params ?? {} };
|
|
204
|
+
return new Promise((resolve, reject) => {
|
|
205
|
+
const timer = setTimeout(() => {
|
|
206
|
+
this.pending.delete(id);
|
|
207
|
+
reject(new Error(`Gateway call "${method}" timed out`));
|
|
208
|
+
}, this.timeoutMs);
|
|
209
|
+
this.pending.set(id, {
|
|
210
|
+
resolve: resolve,
|
|
211
|
+
reject,
|
|
212
|
+
timer,
|
|
213
|
+
});
|
|
214
|
+
this.ws.send(JSON.stringify(frame));
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
close() {
|
|
218
|
+
if (this.ws) {
|
|
219
|
+
this.ws.close();
|
|
220
|
+
this.ws = null;
|
|
221
|
+
this.connected = false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async cronAdd(params) {
|
|
225
|
+
return this.call('cron.add', params);
|
|
226
|
+
}
|
|
227
|
+
async cronRemove(id) {
|
|
228
|
+
await this.call('cron.remove', { id });
|
|
229
|
+
}
|
|
230
|
+
async cronUpdate(id, patch) {
|
|
231
|
+
await this.call('cron.update', { id, patch });
|
|
232
|
+
}
|
|
233
|
+
async cronList(options) {
|
|
234
|
+
const result = await this.call('cron.list', options ?? {});
|
|
235
|
+
return result.jobs ?? [];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=gateway-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../../src/core/gateway-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function resolveHomeDir(env?: NodeJS.ProcessEnv): string;
|
|
2
|
+
export declare function resolveStateDir(env?: NodeJS.ProcessEnv): string;
|
|
3
|
+
export declare function resolveConfigPath(env?: NodeJS.ProcessEnv): string;
|
|
4
|
+
export declare function resolveWorkspacePath(agentId: string, env?: NodeJS.ProcessEnv): string;
|
|
5
|
+
export declare function resolveReefStateDir(env?: NodeJS.ProcessEnv): string;
|
|
6
|
+
export declare function resolveGatewayUrl(config?: Record<string, unknown>, env?: NodeJS.ProcessEnv): string;
|
|
7
|
+
export declare function validateAgentId(id: string): {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
normalized: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function validateAgentIds(slugs: string[], namespace: string): {
|
|
13
|
+
valid: boolean;
|
|
14
|
+
ids: Map<string, string>;
|
|
15
|
+
errors: string[];
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=openclaw-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-paths.d.ts","sourceRoot":"","sources":["../../src/core/openclaw-paths.ts"],"names":[],"mappings":"AAcA,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAU9D;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAe/D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAsCjE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,MAAM,CAER;AAED,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,MAAM,CA4BR;AAyBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CA4BA;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BhE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { networkInterfaces } from 'node:os';
|
|
5
|
+
const CONFIG_FILENAMES = [
|
|
6
|
+
'openclaw.json',
|
|
7
|
+
'clawdbot.json',
|
|
8
|
+
'moldbot.json',
|
|
9
|
+
'moltbot.json',
|
|
10
|
+
];
|
|
11
|
+
const LEGACY_DIRS = ['.clawdbot', '.moldbot', '.moltbot'];
|
|
12
|
+
export function resolveHomeDir(env) {
|
|
13
|
+
const e = env ?? process.env;
|
|
14
|
+
const raw = e.OPENCLAW_HOME ?? e.HOME ?? e.USERPROFILE;
|
|
15
|
+
if (raw) {
|
|
16
|
+
if (raw.startsWith('~')) {
|
|
17
|
+
return join(os.homedir(), raw.slice(1));
|
|
18
|
+
}
|
|
19
|
+
return raw;
|
|
20
|
+
}
|
|
21
|
+
return os.homedir();
|
|
22
|
+
}
|
|
23
|
+
export function resolveStateDir(env) {
|
|
24
|
+
const e = env ?? process.env;
|
|
25
|
+
const explicit = e.OPENCLAW_STATE_DIR ?? e.CLAWDBOT_STATE_DIR;
|
|
26
|
+
if (explicit)
|
|
27
|
+
return explicit;
|
|
28
|
+
const homeDir = resolveHomeDir(env);
|
|
29
|
+
const primary = join(homeDir, '.openclaw');
|
|
30
|
+
if (existsSync(primary))
|
|
31
|
+
return primary;
|
|
32
|
+
for (const legacy of LEGACY_DIRS) {
|
|
33
|
+
const candidate = join(homeDir, legacy);
|
|
34
|
+
if (existsSync(candidate))
|
|
35
|
+
return candidate;
|
|
36
|
+
}
|
|
37
|
+
return primary;
|
|
38
|
+
}
|
|
39
|
+
export function resolveConfigPath(env) {
|
|
40
|
+
const e = env ?? process.env;
|
|
41
|
+
// 1. Explicit config path env
|
|
42
|
+
const explicitPath = e.OPENCLAW_CONFIG_PATH ?? e.CLAWDBOT_CONFIG_PATH;
|
|
43
|
+
if (explicitPath)
|
|
44
|
+
return explicitPath;
|
|
45
|
+
const stateDir = resolveStateDir(env);
|
|
46
|
+
// 2. Search state dir for first existing config file
|
|
47
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
48
|
+
const candidate = join(stateDir, filename);
|
|
49
|
+
if (existsSync(candidate))
|
|
50
|
+
return candidate;
|
|
51
|
+
}
|
|
52
|
+
// 3. If OPENCLAW_STATE_DIR was explicitly set, return canonical path (skip home search)
|
|
53
|
+
const hasExplicitStateDir = !!(e.OPENCLAW_STATE_DIR ?? e.CLAWDBOT_STATE_DIR);
|
|
54
|
+
if (hasExplicitStateDir) {
|
|
55
|
+
return join(stateDir, 'openclaw.json');
|
|
56
|
+
}
|
|
57
|
+
// 4. Only for default state dir: search across all home directories
|
|
58
|
+
const homeDir = resolveHomeDir(env);
|
|
59
|
+
const homeDirs = [
|
|
60
|
+
join(homeDir, '.openclaw'),
|
|
61
|
+
join(homeDir, '.clawdbot'),
|
|
62
|
+
join(homeDir, '.moldbot'),
|
|
63
|
+
join(homeDir, '.moltbot'),
|
|
64
|
+
];
|
|
65
|
+
for (const dir of homeDirs) {
|
|
66
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
67
|
+
const candidate = join(dir, filename);
|
|
68
|
+
if (existsSync(candidate))
|
|
69
|
+
return candidate;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 5. Ultimate fallback
|
|
73
|
+
return join(stateDir, 'openclaw.json');
|
|
74
|
+
}
|
|
75
|
+
export function resolveWorkspacePath(agentId, env) {
|
|
76
|
+
return join(resolveStateDir(env), `workspace-${agentId}`);
|
|
77
|
+
}
|
|
78
|
+
export function resolveReefStateDir(env) {
|
|
79
|
+
return join(resolveStateDir(env), '.reef');
|
|
80
|
+
}
|
|
81
|
+
export function resolveGatewayUrl(config, env) {
|
|
82
|
+
const e = env ?? process.env;
|
|
83
|
+
const gw = (config?.gateway ?? {});
|
|
84
|
+
const tls = (gw.tls ?? {});
|
|
85
|
+
const bind = gw.bind ?? 'loopback';
|
|
86
|
+
const envPort = e.OPENCLAW_GATEWAY_PORT
|
|
87
|
+
? parseInt(e.OPENCLAW_GATEWAY_PORT, 10)
|
|
88
|
+
: null;
|
|
89
|
+
const port = gw.port ??
|
|
90
|
+
(envPort !== null && !isNaN(envPort) ? envPort : null) ??
|
|
91
|
+
18789;
|
|
92
|
+
const scheme = tls.enabled ? 'wss' : 'ws';
|
|
93
|
+
if (bind === 'tailnet') {
|
|
94
|
+
const ip = findIPv4('tailscale');
|
|
95
|
+
// Tailnet uses scheme from TLS config, not hardcoded wss
|
|
96
|
+
if (ip)
|
|
97
|
+
return `${scheme}://${ip}:${port}`;
|
|
98
|
+
}
|
|
99
|
+
if (bind === 'lan') {
|
|
100
|
+
const ip = findLanIPv4();
|
|
101
|
+
if (ip)
|
|
102
|
+
return `${scheme}://${ip}:${port}`;
|
|
103
|
+
}
|
|
104
|
+
return `${scheme}://127.0.0.1:${port}`;
|
|
105
|
+
}
|
|
106
|
+
function findIPv4(interfacePrefix) {
|
|
107
|
+
const ifaces = networkInterfaces();
|
|
108
|
+
for (const [name, addrs] of Object.entries(ifaces)) {
|
|
109
|
+
if (!name.toLowerCase().startsWith(interfacePrefix))
|
|
110
|
+
continue;
|
|
111
|
+
for (const addr of addrs ?? []) {
|
|
112
|
+
if (addr.family === 'IPv4' && !addr.internal)
|
|
113
|
+
return addr.address;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
function findLanIPv4() {
|
|
119
|
+
const ifaces = networkInterfaces();
|
|
120
|
+
for (const addrs of Object.values(ifaces)) {
|
|
121
|
+
for (const addr of addrs ?? []) {
|
|
122
|
+
if (addr.family === 'IPv4' && !addr.internal)
|
|
123
|
+
return addr.address;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
129
|
+
export function validateAgentId(id) {
|
|
130
|
+
const normalized = id.toLowerCase();
|
|
131
|
+
if (normalized.includes('.')) {
|
|
132
|
+
return {
|
|
133
|
+
valid: false,
|
|
134
|
+
normalized,
|
|
135
|
+
error: `Agent ID "${id}" contains dots — OpenClaw collapses dots to dashes. Use dashes instead.`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (normalized.length > 64) {
|
|
139
|
+
return {
|
|
140
|
+
valid: false,
|
|
141
|
+
normalized,
|
|
142
|
+
error: `Agent ID "${id}" exceeds 64 characters (${normalized.length}).`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (!AGENT_ID_RE.test(normalized)) {
|
|
146
|
+
return {
|
|
147
|
+
valid: false,
|
|
148
|
+
normalized,
|
|
149
|
+
error: `Agent ID "${id}" does not match [a-z0-9][a-z0-9_-]{0,63}.`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return { valid: true, normalized };
|
|
153
|
+
}
|
|
154
|
+
export function validateAgentIds(slugs, namespace) {
|
|
155
|
+
const ids = new Map();
|
|
156
|
+
const errors = [];
|
|
157
|
+
const seen = new Map();
|
|
158
|
+
for (const slug of slugs) {
|
|
159
|
+
const id = `${namespace}-${slug}`;
|
|
160
|
+
const result = validateAgentId(id);
|
|
161
|
+
if (!result.valid) {
|
|
162
|
+
errors.push(result.error);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const existing = seen.get(result.normalized);
|
|
166
|
+
if (existing) {
|
|
167
|
+
errors.push(`Slugs "${existing}" and "${slug}" produce the same normalized ID "${result.normalized}".`);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
seen.set(result.normalized, slug);
|
|
171
|
+
ids.set(slug, result.normalized);
|
|
172
|
+
}
|
|
173
|
+
return { valid: errors.length === 0, ids, errors };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=openclaw-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-paths.js","sourceRoot":"","sources":["../../src/core/openclaw-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FormationState } from '../types/state.js';
|
|
2
|
+
export declare function loadState(namespace: string, name: string, env?: NodeJS.ProcessEnv): Promise<FormationState | null>;
|
|
3
|
+
export declare function saveState(state: FormationState, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
4
|
+
export declare function deleteState(namespace: string, name: string, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
5
|
+
export declare function listStates(env?: NodeJS.ProcessEnv): Promise<FormationState[]>;
|
|
6
|
+
export declare function computeFileHash(content: Buffer): string;
|
|
7
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMxD,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAShC;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,EACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,UAAU,CAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC,CAqB3B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { readFile, writeFile, unlink, readdir, mkdir, } from 'node:fs/promises';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { resolveReefStateDir } from './openclaw-paths.js';
|
|
5
|
+
function stateFileName(namespace, name) {
|
|
6
|
+
return `${namespace}--${name}.state.json`;
|
|
7
|
+
}
|
|
8
|
+
export async function loadState(namespace, name, env) {
|
|
9
|
+
const dir = resolveReefStateDir(env);
|
|
10
|
+
const filePath = join(dir, stateFileName(namespace, name));
|
|
11
|
+
try {
|
|
12
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function saveState(state, env) {
|
|
20
|
+
const dir = resolveReefStateDir(env);
|
|
21
|
+
await mkdir(dir, { recursive: true });
|
|
22
|
+
const filePath = join(dir, stateFileName(state.namespace, state.name));
|
|
23
|
+
await writeFile(filePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
export async function deleteState(namespace, name, env) {
|
|
26
|
+
const dir = resolveReefStateDir(env);
|
|
27
|
+
const filePath = join(dir, stateFileName(namespace, name));
|
|
28
|
+
try {
|
|
29
|
+
await unlink(filePath);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Already gone
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function listStates(env) {
|
|
36
|
+
const dir = resolveReefStateDir(env);
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = await readdir(dir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const states = [];
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (!entry.endsWith('.state.json'))
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
const raw = await readFile(join(dir, entry), 'utf-8');
|
|
50
|
+
states.push(JSON.parse(raw));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Skip corrupt state files
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return states;
|
|
57
|
+
}
|
|
58
|
+
export function computeFileHash(content) {
|
|
59
|
+
return createHash('sha256').update(content).digest('hex');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variable-resolver.d.ts","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"variable-resolver.d.ts","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
|
@@ -4,15 +4,17 @@ import { parse as parseDotenv } from 'dotenv';
|
|
|
4
4
|
export async function resolveVariables(variables, formationDir, options = {}) {
|
|
5
5
|
const resolved = {};
|
|
6
6
|
const missing = [];
|
|
7
|
-
// Load .env file if present
|
|
7
|
+
// Load .env file if present (skip with --no-env)
|
|
8
8
|
let envFileVars = {};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
if (!options.noEnv) {
|
|
10
|
+
const envPath = options.envFilePath ?? join(formationDir, '.env');
|
|
11
|
+
try {
|
|
12
|
+
const envContent = await readFile(envPath, 'utf-8');
|
|
13
|
+
envFileVars = parseDotenv(Buffer.from(envContent));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// .env file not found — that's fine
|
|
17
|
+
}
|
|
16
18
|
}
|
|
17
19
|
for (const [name, config] of Object.entries(variables)) {
|
|
18
20
|
// Precedence: CLI > .env > env > defaults
|
|
@@ -29,8 +31,17 @@ export async function resolveVariables(variables, formationDir, options = {}) {
|
|
|
29
31
|
resolved[name] = String(config.default);
|
|
30
32
|
}
|
|
31
33
|
else if (config.required) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
if (options.interactive) {
|
|
35
|
+
const { input, password } = await import('@inquirer/prompts');
|
|
36
|
+
const promptFn = config.sensitive ? password : input;
|
|
37
|
+
const answer = await promptFn({
|
|
38
|
+
message: `${name}${config.description ? ` (${config.description})` : ''}:`,
|
|
39
|
+
});
|
|
40
|
+
resolved[name] = answer;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
missing.push(name);
|
|
44
|
+
}
|
|
34
45
|
}
|
|
35
46
|
}
|
|
36
47
|
return { resolved, missing };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variable-resolver.js","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"variable-resolver.js","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAe9C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAmC,EACnC,YAAoB,EACpB,UAA0B,EAAE;IAE5B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,iDAAiD;IACjD,IAAI,WAAW,GAA2B,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,0CAA0C;QAC1C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACtC,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;oBAC5B,OAAO,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;iBAC3E,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|