@openreef/cli 0.1.1 → 0.3.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 +14 -7
- package/dist/commands/install.d.ts +14 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +612 -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/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +118 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/repair.d.ts +10 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +328 -0
- package/dist/commands/repair.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 +181 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +9 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +166 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +12 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +518 -0
- package/dist/commands/update.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 +156 -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/log-reader.d.ts +28 -0
- package/dist/core/log-reader.d.ts.map +1 -0
- package/dist/core/log-reader.js +69 -0
- package/dist/core/log-reader.js.map +1 -0
- package/dist/core/migration-planner.d.ts +37 -0
- package/dist/core/migration-planner.d.ts.map +1 -0
- package/dist/core/migration-planner.js +160 -0
- package/dist/core/migration-planner.js.map +1 -0
- package/dist/core/openclaw-paths.d.ts +23 -0
- package/dist/core/openclaw-paths.d.ts.map +1 -0
- package/dist/core/openclaw-paths.js +189 -0
- package/dist/core/openclaw-paths.js.map +1 -0
- package/dist/core/state-differ.d.ts +15 -0
- package/dist/core/state-differ.d.ts.map +1 -0
- package/dist/core/state-differ.js +135 -0
- package/dist/core/state-differ.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 +133 -1
- package/dist/index.js.map +1 -1
- package/dist/types/state.d.ts +55 -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/dist/utils/identifiers.d.ts +18 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +50 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/package.json +6 -3
- package/template/reef.json +6 -6
|
@@ -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.3.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,28 @@
|
|
|
1
|
+
export interface LogEntry {
|
|
2
|
+
timestamp?: string;
|
|
3
|
+
agentId: string;
|
|
4
|
+
file: string;
|
|
5
|
+
line: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LogDiscoveryResult {
|
|
8
|
+
agentId: string;
|
|
9
|
+
sessionDir: string;
|
|
10
|
+
logFiles: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Discover log files (session transcripts) for an agent.
|
|
14
|
+
* OpenClaw stores sessions at $STATE_DIR/agents/{agentId}/sessions/*.jsonl
|
|
15
|
+
*/
|
|
16
|
+
export declare function discoverLogs(agentId: string, env?: NodeJS.ProcessEnv): Promise<LogDiscoveryResult | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Read the last N lines from a log file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readLogTail(filePath: string, lines: number): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Read logs for an agent, returning the most recent entries.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readAgentLogs(agentId: string, options?: {
|
|
25
|
+
lines?: number;
|
|
26
|
+
env?: NodeJS.ProcessEnv;
|
|
27
|
+
}): Promise<LogEntry[]>;
|
|
28
|
+
//# sourceMappingURL=log-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-reader.d.ts","sourceRoot":"","sources":["../../src/core/log-reader.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAepC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACxD,OAAO,CAAC,QAAQ,EAAE,CAAC,CA8BrB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { resolveStateDir } from './openclaw-paths.js';
|
|
5
|
+
/**
|
|
6
|
+
* Discover log files (session transcripts) for an agent.
|
|
7
|
+
* OpenClaw stores sessions at $STATE_DIR/agents/{agentId}/sessions/*.jsonl
|
|
8
|
+
*/
|
|
9
|
+
export async function discoverLogs(agentId, env) {
|
|
10
|
+
const stateDir = resolveStateDir(env);
|
|
11
|
+
const sessionDir = join(stateDir, 'agents', agentId, 'sessions');
|
|
12
|
+
if (!existsSync(sessionDir))
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const entries = await readdir(sessionDir);
|
|
16
|
+
const logFiles = entries
|
|
17
|
+
.filter((e) => e.endsWith('.jsonl'))
|
|
18
|
+
.sort();
|
|
19
|
+
return { agentId, sessionDir, logFiles };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read the last N lines from a log file.
|
|
27
|
+
*/
|
|
28
|
+
export async function readLogTail(filePath, lines) {
|
|
29
|
+
try {
|
|
30
|
+
const content = await readFile(filePath, 'utf-8');
|
|
31
|
+
const allLines = content.split('\n').filter((l) => l.trim().length > 0);
|
|
32
|
+
return allLines.slice(-lines);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read logs for an agent, returning the most recent entries.
|
|
40
|
+
*/
|
|
41
|
+
export async function readAgentLogs(agentId, options = {}) {
|
|
42
|
+
const maxLines = options.lines ?? 50;
|
|
43
|
+
const discovery = await discoverLogs(agentId, options.env);
|
|
44
|
+
if (!discovery || discovery.logFiles.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
const entries = [];
|
|
47
|
+
// Read from most recent files first
|
|
48
|
+
const sortedFiles = [...discovery.logFiles].reverse();
|
|
49
|
+
for (const file of sortedFiles) {
|
|
50
|
+
if (entries.length >= maxLines)
|
|
51
|
+
break;
|
|
52
|
+
const filePath = join(discovery.sessionDir, file);
|
|
53
|
+
const remaining = maxLines - entries.length;
|
|
54
|
+
const lines = await readLogTail(filePath, remaining);
|
|
55
|
+
for (const line of lines) {
|
|
56
|
+
let timestamp;
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(line);
|
|
59
|
+
timestamp = parsed.ts ?? parsed.timestamp ?? parsed.createdAt;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Not valid JSON — use raw line
|
|
63
|
+
}
|
|
64
|
+
entries.push({ timestamp, agentId, file, line });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return entries.reverse();
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=log-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-reader.js","sourceRoot":"","sources":["../../src/core/log-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAQ,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAetD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,GAAuB;IAEvB,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAEjE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACnC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,UAAuD,EAAE;IAEzD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,oCAAoC;IACpC,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;YAAE,MAAM;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,SAAS,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { FormationState, OpenClawBinding, CronJobState } from '../types/state.js';
|
|
2
|
+
import type { ReefManifest, CronJob as ManifestCron } from '../types/manifest.js';
|
|
3
|
+
export interface AgentChange {
|
|
4
|
+
slug: string;
|
|
5
|
+
agentId: string;
|
|
6
|
+
type: 'add' | 'remove' | 'update' | 'unchanged';
|
|
7
|
+
changedFiles?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface BindingChange {
|
|
10
|
+
binding: OpenClawBinding;
|
|
11
|
+
type: 'add' | 'remove';
|
|
12
|
+
}
|
|
13
|
+
export interface CronChange {
|
|
14
|
+
type: 'add' | 'remove' | 'update';
|
|
15
|
+
name: string;
|
|
16
|
+
agentSlug: string;
|
|
17
|
+
oldCron?: CronJobState;
|
|
18
|
+
newCron?: ManifestCron;
|
|
19
|
+
}
|
|
20
|
+
export interface A2aChange {
|
|
21
|
+
type: 'add' | 'remove' | 'reapply';
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
}
|
|
25
|
+
export interface MigrationPlan {
|
|
26
|
+
agents: AgentChange[];
|
|
27
|
+
bindings: BindingChange[];
|
|
28
|
+
cron: CronChange[];
|
|
29
|
+
a2a: A2aChange[];
|
|
30
|
+
versionChange: {
|
|
31
|
+
from: string;
|
|
32
|
+
to: string;
|
|
33
|
+
} | null;
|
|
34
|
+
isEmpty: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function computeMigrationPlan(state: FormationState, manifest: ReefManifest, namespace: string, idMap: Map<string, string>, newFileHashes: Record<string, string>): MigrationPlan;
|
|
37
|
+
//# sourceMappingURL=migration-planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-planner.d.ts","sourceRoot":"","sources":["../../src/core/migration-planner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,GAAG,EAAE,SAAS,EAAE,CAAC;IACjB,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,aAAa,CAyKf"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { bindingsEqual } from './config-patcher.js';
|
|
2
|
+
export function computeMigrationPlan(state, manifest, namespace, idMap, newFileHashes) {
|
|
3
|
+
const agents = [];
|
|
4
|
+
const bindings = [];
|
|
5
|
+
const cron = [];
|
|
6
|
+
const a2a = [];
|
|
7
|
+
const oldSlugs = new Set(Object.keys(state.agents));
|
|
8
|
+
const newSlugs = new Set(Object.keys(manifest.agents));
|
|
9
|
+
// Agent changes
|
|
10
|
+
for (const slug of newSlugs) {
|
|
11
|
+
const agentId = idMap.get(slug);
|
|
12
|
+
if (!oldSlugs.has(slug)) {
|
|
13
|
+
agents.push({ slug, agentId, type: 'add' });
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
// Check for file changes
|
|
17
|
+
const changedFiles = [];
|
|
18
|
+
for (const [key, newHash] of Object.entries(newFileHashes)) {
|
|
19
|
+
if (!key.startsWith(`${agentId}:`))
|
|
20
|
+
continue;
|
|
21
|
+
const relativePath = key.slice(agentId.length + 1);
|
|
22
|
+
const oldHash = state.fileHashes[key];
|
|
23
|
+
if (oldHash !== newHash) {
|
|
24
|
+
changedFiles.push(relativePath);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Check for removed files
|
|
28
|
+
for (const key of Object.keys(state.fileHashes)) {
|
|
29
|
+
if (!key.startsWith(`${agentId}:`))
|
|
30
|
+
continue;
|
|
31
|
+
if (!(key in newFileHashes)) {
|
|
32
|
+
const relativePath = key.slice(agentId.length + 1);
|
|
33
|
+
changedFiles.push(relativePath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (changedFiles.length > 0) {
|
|
37
|
+
agents.push({ slug, agentId, type: 'update', changedFiles });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
agents.push({ slug, agentId, type: 'unchanged' });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const slug of oldSlugs) {
|
|
45
|
+
if (!newSlugs.has(slug)) {
|
|
46
|
+
const agentId = state.agents[slug].id;
|
|
47
|
+
agents.push({ slug, agentId, type: 'remove' });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Binding changes
|
|
51
|
+
const newBindings = [];
|
|
52
|
+
for (const binding of manifest.bindings ?? []) {
|
|
53
|
+
const resolvedAgentId = idMap.get(binding.agent);
|
|
54
|
+
if (!resolvedAgentId)
|
|
55
|
+
continue;
|
|
56
|
+
newBindings.push({
|
|
57
|
+
agentId: resolvedAgentId,
|
|
58
|
+
match: { channel: binding.channel },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Find added bindings
|
|
62
|
+
for (const newBinding of newBindings) {
|
|
63
|
+
const found = state.bindings.some((b) => bindingsEqual(b, newBinding));
|
|
64
|
+
if (!found) {
|
|
65
|
+
bindings.push({ binding: newBinding, type: 'add' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Find removed bindings
|
|
69
|
+
for (const oldBinding of state.bindings) {
|
|
70
|
+
const found = newBindings.some((b) => bindingsEqual(b, oldBinding));
|
|
71
|
+
if (!found) {
|
|
72
|
+
bindings.push({ binding: oldBinding, type: 'remove' });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Cron changes
|
|
76
|
+
const oldCronByName = new Map();
|
|
77
|
+
for (const job of state.cronJobs) {
|
|
78
|
+
oldCronByName.set(job.name, job);
|
|
79
|
+
}
|
|
80
|
+
const newCronNames = new Set();
|
|
81
|
+
for (const [i, cronEntry] of (manifest.cron ?? []).entries()) {
|
|
82
|
+
const jobName = `reef:${namespace}:${cronEntry.agent}-${i}`;
|
|
83
|
+
newCronNames.add(jobName);
|
|
84
|
+
const old = oldCronByName.get(jobName);
|
|
85
|
+
if (!old) {
|
|
86
|
+
cron.push({
|
|
87
|
+
type: 'add',
|
|
88
|
+
name: jobName,
|
|
89
|
+
agentSlug: cronEntry.agent,
|
|
90
|
+
newCron: cronEntry,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Check for updates (only if state has schedule/prompt fields)
|
|
95
|
+
const scheduleChanged = old.schedule && old.schedule !== cronEntry.schedule;
|
|
96
|
+
const promptChanged = old.prompt && old.prompt !== cronEntry.prompt;
|
|
97
|
+
const timezoneChanged = old.timezone !== cronEntry.timezone;
|
|
98
|
+
if (scheduleChanged || promptChanged || timezoneChanged) {
|
|
99
|
+
cron.push({
|
|
100
|
+
type: 'update',
|
|
101
|
+
name: jobName,
|
|
102
|
+
agentSlug: cronEntry.agent,
|
|
103
|
+
oldCron: old,
|
|
104
|
+
newCron: cronEntry,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Find removed cron jobs
|
|
110
|
+
for (const job of state.cronJobs) {
|
|
111
|
+
if (!newCronNames.has(job.name)) {
|
|
112
|
+
cron.push({
|
|
113
|
+
type: 'remove',
|
|
114
|
+
name: job.name,
|
|
115
|
+
agentSlug: job.agentSlug,
|
|
116
|
+
oldCron: job,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// A2a changes
|
|
121
|
+
const newEdges = manifest.agentToAgent ?? {};
|
|
122
|
+
const oldEdges = state.agentToAgentEdges;
|
|
123
|
+
if (oldEdges === undefined) {
|
|
124
|
+
// v0.2.0 state — can't diff, reapply all
|
|
125
|
+
for (const [from, targets] of Object.entries(newEdges)) {
|
|
126
|
+
for (const to of targets) {
|
|
127
|
+
a2a.push({ type: 'reapply', from, to });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Find added edges
|
|
133
|
+
for (const [from, targets] of Object.entries(newEdges)) {
|
|
134
|
+
for (const to of targets) {
|
|
135
|
+
if (!oldEdges[from]?.includes(to)) {
|
|
136
|
+
a2a.push({ type: 'add', from, to });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Find removed edges
|
|
141
|
+
for (const [from, targets] of Object.entries(oldEdges)) {
|
|
142
|
+
for (const to of targets) {
|
|
143
|
+
if (!newEdges[from]?.includes(to)) {
|
|
144
|
+
a2a.push({ type: 'remove', from, to });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Version change
|
|
150
|
+
const versionChange = state.version !== manifest.version
|
|
151
|
+
? { from: state.version, to: manifest.version }
|
|
152
|
+
: null;
|
|
153
|
+
const isEmpty = agents.every((a) => a.type === 'unchanged') &&
|
|
154
|
+
bindings.length === 0 &&
|
|
155
|
+
cron.length === 0 &&
|
|
156
|
+
a2a.length === 0 &&
|
|
157
|
+
!versionChange;
|
|
158
|
+
return { agents, bindings, cron, a2a, versionChange, isEmpty };
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=migration-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-planner.js","sourceRoot":"","sources":["../../src/core/migration-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
/**
|
|
18
|
+
* Return paths under $STATE_DIR/agents/{agentId}/ that should be cleaned up
|
|
19
|
+
* on uninstall: sessions, agent state, qmd memory, and the parent directory.
|
|
20
|
+
* Order: children first, so the parent can be rmdir'd if empty.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveAgentStatePaths(agentId: string, env?: NodeJS.ProcessEnv): string[];
|
|
23
|
+
//# 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;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,MAAM,EAAE,CAQV"}
|