@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.
Files changed (81) hide show
  1. package/README.md +14 -7
  2. package/dist/commands/install.d.ts +14 -0
  3. package/dist/commands/install.d.ts.map +1 -0
  4. package/dist/commands/install.js +612 -0
  5. package/dist/commands/install.js.map +1 -0
  6. package/dist/commands/list.d.ts +5 -0
  7. package/dist/commands/list.d.ts.map +1 -0
  8. package/dist/commands/list.js +81 -0
  9. package/dist/commands/list.js.map +1 -0
  10. package/dist/commands/logs.d.ts +8 -0
  11. package/dist/commands/logs.d.ts.map +1 -0
  12. package/dist/commands/logs.js +118 -0
  13. package/dist/commands/logs.js.map +1 -0
  14. package/dist/commands/repair.d.ts +10 -0
  15. package/dist/commands/repair.d.ts.map +1 -0
  16. package/dist/commands/repair.js +328 -0
  17. package/dist/commands/repair.js.map +1 -0
  18. package/dist/commands/status.d.ts +8 -0
  19. package/dist/commands/status.d.ts.map +1 -0
  20. package/dist/commands/status.js +181 -0
  21. package/dist/commands/status.js.map +1 -0
  22. package/dist/commands/uninstall.d.ts +9 -0
  23. package/dist/commands/uninstall.d.ts.map +1 -0
  24. package/dist/commands/uninstall.js +166 -0
  25. package/dist/commands/uninstall.js.map +1 -0
  26. package/dist/commands/update.d.ts +12 -0
  27. package/dist/commands/update.d.ts.map +1 -0
  28. package/dist/commands/update.js +518 -0
  29. package/dist/commands/update.js.map +1 -0
  30. package/dist/core/agents-md-generator.d.ts +3 -0
  31. package/dist/core/agents-md-generator.d.ts.map +1 -0
  32. package/dist/core/agents-md-generator.js +24 -0
  33. package/dist/core/agents-md-generator.js.map +1 -0
  34. package/dist/core/config-patcher.d.ts +32 -0
  35. package/dist/core/config-patcher.d.ts.map +1 -0
  36. package/dist/core/config-patcher.js +156 -0
  37. package/dist/core/config-patcher.js.map +1 -0
  38. package/dist/core/device-identity.d.ts +37 -0
  39. package/dist/core/device-identity.d.ts.map +1 -0
  40. package/dist/core/device-identity.js +135 -0
  41. package/dist/core/device-identity.js.map +1 -0
  42. package/dist/core/gateway-client.d.ts +98 -0
  43. package/dist/core/gateway-client.d.ts.map +1 -0
  44. package/dist/core/gateway-client.js +238 -0
  45. package/dist/core/gateway-client.js.map +1 -0
  46. package/dist/core/log-reader.d.ts +28 -0
  47. package/dist/core/log-reader.d.ts.map +1 -0
  48. package/dist/core/log-reader.js +69 -0
  49. package/dist/core/log-reader.js.map +1 -0
  50. package/dist/core/migration-planner.d.ts +37 -0
  51. package/dist/core/migration-planner.d.ts.map +1 -0
  52. package/dist/core/migration-planner.js +160 -0
  53. package/dist/core/migration-planner.js.map +1 -0
  54. package/dist/core/openclaw-paths.d.ts +23 -0
  55. package/dist/core/openclaw-paths.d.ts.map +1 -0
  56. package/dist/core/openclaw-paths.js +189 -0
  57. package/dist/core/openclaw-paths.js.map +1 -0
  58. package/dist/core/state-differ.d.ts +15 -0
  59. package/dist/core/state-differ.d.ts.map +1 -0
  60. package/dist/core/state-differ.js +135 -0
  61. package/dist/core/state-differ.js.map +1 -0
  62. package/dist/core/state-manager.d.ts +7 -0
  63. package/dist/core/state-manager.d.ts.map +1 -0
  64. package/dist/core/state-manager.js +61 -0
  65. package/dist/core/state-manager.js.map +1 -0
  66. package/dist/core/variable-resolver.d.ts +1 -0
  67. package/dist/core/variable-resolver.d.ts.map +1 -1
  68. package/dist/core/variable-resolver.js +21 -10
  69. package/dist/core/variable-resolver.js.map +1 -1
  70. package/dist/index.js +133 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/types/state.d.ts +55 -0
  73. package/dist/types/state.d.ts.map +1 -0
  74. package/dist/types/state.js +2 -0
  75. package/dist/types/state.js.map +1 -0
  76. package/dist/utils/identifiers.d.ts +18 -0
  77. package/dist/utils/identifiers.d.ts.map +1 -0
  78. package/dist/utils/identifiers.js +50 -0
  79. package/dist/utils/identifiers.js.map +1 -0
  80. package/package.json +6 -3
  81. 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":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,MAAM,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AAsE5E;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAMlC;IACC,uFAAuF;IACvF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;YACrC,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,SAAS;YAC3C,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAA4B,CAAC;IACnE,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAExD,MAAM,KAAK,GACT,IAAI,CAAC,YAAY;QACjB,CAAC,CAAC,sBAAsB;QACvB,IAAI,CAAC,KAA4B,CAAC;IAErC,MAAM,QAAQ,GACZ,IAAI,CAAC,eAAe;QACpB,CAAC,CAAC,yBAAyB;QAC1B,IAAI,CAAC,QAA+B,CAAC;IAExC,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,SAAS;QACzB,QAAQ,EAAE,QAAQ,IAAI,SAAS;KAChC,CAAC;AACJ,CAAC;AAQD,MAAM,OAAO,aAAa;IAChB,EAAE,GAAqB,IAAI,CAAC;IAC5B,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,CAAuB;IAC9B,SAAS,CAAS;IAE1B,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE9D,kEAAkE;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;YAC5C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,mBAAmB,CAAC;gBAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;aACtB,CAAC,CAAC;QAEP,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;YAEb,IAAI,cAAkC,CAAC;YACvC,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,YAA2C,CAAC;YAEhD,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,EAAE;gBACrC,IAAI,WAAW;oBAAE,OAAO;gBACxB,WAAW,GAAG,IAAI,CAAC;gBAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,MAAM,SAAS,GACb,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,EAAE,KAAK,IAAI,SAAS,CAAC;gBAEvD,MAAM,WAAW,GAAG,sBAAsB,CAAC;oBACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,QAAQ,EAAE,SAAS;oBACnB,UAAU,EAAE,WAAW;oBACvB,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,SAAS,IAAI,IAAI;oBACxB,KAAK;iBACN,CAAC,CAAC;gBAEH,MAAM,SAAS,GAAG,iBAAiB,CACjC,QAAQ,CAAC,aAAa,EACtB,WAAW,CACZ,CAAC;gBAEF,MAAM,aAAa,GAA4B;oBAC7C,WAAW,EAAE,gBAAgB;oBAC7B,WAAW,EAAE,gBAAgB;oBAC7B,MAAM,EAAE;wBACN,EAAE,EAAE,SAAS;wBACb,OAAO,EAAE,OAAO;wBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,IAAI,EAAE,WAAW;qBAClB;oBACD,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACN,EAAE,EAAE,QAAQ,CAAC,QAAQ;wBACrB,SAAS,EAAE,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC;wBACvD,SAAS;wBACT,QAAQ,EAAE,QAAQ;wBAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5B;iBACF,CAAC;gBAEF,wBAAwB;gBACxB,MAAM,IAAI,GAA4B,EAAE,CAAC;gBACzC,IAAI,SAAS;oBAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACtC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACjE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC5B,CAAC;gBAED,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG;oBACZ,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,aAAa;iBACtB,CAAC;gBAEF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAE/B,4BAA4B;gBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC3D,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;oBACtB,OAAO,EAAE,CAAC,OAAgB,EAAE,EAAE;wBAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;wBACtB,iCAAiC;wBACjC,MAAM,CAAC,GAAG,OAAyC,CAAC;wBACpD,MAAM,UAAU,GAAG,CAAC,EAAE,IAA2C,CAAC;wBAClE,IAAI,UAAU,EAAE,WAAW,EAAE,CAAC;4BAC5B,oBAAoB,CAAC;gCACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gCAC3B,IAAI,EAAE,IAAI;gCACV,KAAK,EAAE,UAAU,CAAC,WAAqB;gCACvC,MAAM,EAAE,MAAM;gCACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;6BACtB,CAAC,CAAC;wBACL,CAAC;wBACD,OAAO,EAAE,CAAC;oBACZ,CAAC;oBACD,MAAM;oBACN,KAAK;iBACN,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,oEAAoE;gBACpE,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAoB,EAAE,EAAE;gBACxC,IAAI,KAA8B,CAAC;gBACnC,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBAED,iCAAiC;gBACjC,IACE,KAAK,CAAC,IAAI,KAAK,OAAO;oBACtB,KAAK,CAAC,KAAK,KAAK,mBAAmB,EACnC,CAAC;oBACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAkC,CAAC;oBACzD,cAAc,GAAG,OAAO,CAAC,KAAe,CAAC;oBACzC,YAAY,CAAC,YAAY,CAAC,CAAC;oBAC3B,WAAW,CAAC,cAAc,CAAC,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBAED,yBAAyB;gBACzB,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACzB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAY,CAAC;oBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrC,IAAI,CAAC,OAAO;wBAAE,OAAO;oBAErB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAExB,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;wBACb,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,GAAG,KAAK,CAAC,KAA4C,CAAC;wBAC/D,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CACP,kBAAkB,GAAG,EAAE,IAAI,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,IAAI,YAAY,EAAE,CAC7E,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,MAAM,CACJ,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CACvD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACzC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;oBACvD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,MAAc,EAAE,MAAgB;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;QAEhE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,MAAM,aAAa,CAAC,CAAC,CAAC;YAC1D,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YAEH,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAiB,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,IAAI,CAAO,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,KAAmB;QAC9C,MAAM,IAAI,CAAC,IAAI,CAAO,aAAa,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAEd;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,WAAW,EACX,OAAO,IAAI,EAAE,CACd,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -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":"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"}
@@ -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"}