openclaw-packager 0.1.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/dist/import.js ADDED
@@ -0,0 +1,408 @@
1
+ "use strict";
2
+ /**
3
+ * Import command for openclaw-packager
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.runImport = runImport;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const adm_zip_1 = __importDefault(require("adm-zip"));
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const manifest_1 = require("./manifest");
48
+ const paths_1 = require("./paths");
49
+ const utils_1 = require("./utils");
50
+ /**
51
+ * Run the import command
52
+ */
53
+ async function runImport(file, options) {
54
+ const logger = new utils_1.Logger();
55
+ // Validate file exists
56
+ if (!fs.existsSync(file)) {
57
+ logger.error(chalk_1.default.red(`✗ File not found: ${file}`));
58
+ process.exit(1);
59
+ }
60
+ // Open zip
61
+ let zip;
62
+ try {
63
+ zip = new adm_zip_1.default(file);
64
+ }
65
+ catch (err) {
66
+ logger.error(chalk_1.default.red(`✗ Could not open zip file: ${file}`));
67
+ logger.error(` ${err}`);
68
+ process.exit(1);
69
+ }
70
+ // Validate manifest
71
+ const manifestEntry = zip.getEntry('manifest.json');
72
+ if (!manifestEntry) {
73
+ logger.error(chalk_1.default.red('✗ Not a valid openclaw-packager export'));
74
+ logger.error(' Missing manifest.json - this file was not created by openclaw-packager');
75
+ process.exit(1);
76
+ }
77
+ let manifest;
78
+ try {
79
+ const content = manifestEntry.getData().toString('utf-8');
80
+ const parsed = JSON.parse(content);
81
+ if (!(0, manifest_1.validateManifest)(parsed)) {
82
+ throw new Error('Invalid manifest structure');
83
+ }
84
+ manifest = parsed;
85
+ }
86
+ catch (err) {
87
+ logger.error(chalk_1.default.red('✗ Invalid manifest.json'));
88
+ logger.error(` ${err}`);
89
+ process.exit(1);
90
+ }
91
+ // Determine target directory
92
+ let targetDir = options.target || '';
93
+ if (!targetDir) {
94
+ const detected = (0, paths_1.detectOpenClawDir)();
95
+ if (!detected) {
96
+ logger.error(chalk_1.default.red('✗ Could not find OpenClaw directory'));
97
+ logger.error(' Use --target to specify the destination');
98
+ process.exit(1);
99
+ }
100
+ targetDir = detected;
101
+ }
102
+ const targetPaths = (0, paths_1.getOpenClawPaths)(targetDir);
103
+ const isExisting = fs.existsSync(path.join(targetDir, 'openclaw.json')) ||
104
+ fs.existsSync(path.join(targetDir, 'agents'));
105
+ const mode = options.force ? 'force' : 'merge';
106
+ logger.heading('OpenClaw Backup Import');
107
+ logger.log(`Source: ${chalk_1.default.cyan(path.basename(file))}`);
108
+ logger.log(`Target: ${chalk_1.default.cyan(targetDir)}`);
109
+ logger.log(`Mode: ${mode === 'force' ? chalk_1.default.yellow('force (overwrite)') : chalk_1.default.green('merge (preserve existing)')}`);
110
+ logger.log(`Installation: ${isExisting ? 'existing' : chalk_1.default.green('fresh')}`);
111
+ if (options.dryRun) {
112
+ logger.log(chalk_1.default.dim('\n(Dry run - no files will be modified)\n'));
113
+ }
114
+ // What will be imported
115
+ logger.heading('Import Plan');
116
+ const willImport = {
117
+ config: manifest.includes.config && !options.skipConfig,
118
+ cron: manifest.includes.cron && !options.skipCron,
119
+ workspace: manifest.includes.workspace && !options.skipWorkspace,
120
+ agents: manifest.includes.agents.length > 0,
121
+ };
122
+ if (willImport.config)
123
+ logger.log(` ${chalk_1.default.green('✓')} Config: openclaw.json`);
124
+ if (willImport.cron)
125
+ logger.log(` ${chalk_1.default.green('✓')} Cron: ${manifest.stats.cronJobs || 0} jobs`);
126
+ if (willImport.workspace)
127
+ logger.log(` ${chalk_1.default.green('✓')} Workspace: files`);
128
+ if (willImport.agents)
129
+ logger.log(` ${chalk_1.default.green('✓')} Agents: ${manifest.includes.agents.join(', ')}`);
130
+ if (options.skipConfig)
131
+ logger.log(` ${chalk_1.default.dim('○ Config: skipped')}`);
132
+ if (options.skipCron)
133
+ logger.log(` ${chalk_1.default.dim('○ Cron: skipped')}`);
134
+ if (options.skipWorkspace)
135
+ logger.log(` ${chalk_1.default.dim('○ Workspace: skipped')}`);
136
+ if (options.dryRun) {
137
+ // Just show what would happen
138
+ await runDryRunImport(zip, manifest, targetPaths, willImport, mode, logger);
139
+ return;
140
+ }
141
+ // Actually import
142
+ const stats = await performImport(zip, manifest, targetPaths, willImport, mode, logger);
143
+ // Summary
144
+ logger.heading('Import Complete');
145
+ logger.success(`Files written: ${stats.filesWritten}`);
146
+ if (stats.filesSkipped > 0) {
147
+ logger.log(` Skipped (existing): ${stats.filesSkipped}`);
148
+ }
149
+ if (stats.filesOverwritten > 0) {
150
+ logger.log(` Overwritten: ${stats.filesOverwritten}`);
151
+ }
152
+ if (stats.cronJobsAdded > 0 || stats.cronJobsSkipped > 0) {
153
+ logger.log(` Cron jobs: ${stats.cronJobsAdded} added, ${stats.cronJobsSkipped} skipped`);
154
+ }
155
+ // Secrets warning
156
+ if (!manifest.secretsIncluded && manifest.secretsStripped > 0) {
157
+ logger.heading('⚠️ Secrets Not Included');
158
+ logger.warn('The export had secrets stripped. You need to fill in:');
159
+ const templateEntry = zip.getEntry('SECRETS_TEMPLATE.json');
160
+ if (templateEntry) {
161
+ try {
162
+ const template = JSON.parse(templateEntry.getData().toString('utf-8'));
163
+ if (template.config && Object.keys(template.config).length > 0) {
164
+ logger.log('\n Config (openclaw.json):');
165
+ for (const key of Object.keys(template.config).slice(0, 5)) {
166
+ logger.log(` - ${key}`);
167
+ }
168
+ }
169
+ if (template.credentials && template.credentials.length > 0) {
170
+ logger.log('\n Credentials (recreate these files):');
171
+ for (const cred of template.credentials.slice(0, 5)) {
172
+ logger.log(` - credentials/${cred}`);
173
+ }
174
+ }
175
+ if (template.agentAuth && Object.keys(template.agentAuth).length > 0) {
176
+ logger.log('\n Agent Auth:');
177
+ for (const [agent, auths] of Object.entries(template.agentAuth)) {
178
+ logger.log(` - ${agent}: ${auths.join(', ')}`);
179
+ }
180
+ }
181
+ }
182
+ catch {
183
+ logger.log(' See SECRETS_TEMPLATE.json in the archive for details');
184
+ }
185
+ }
186
+ }
187
+ // Next steps
188
+ logger.heading('Next Steps');
189
+ logger.log(' 1. Fill in any missing API keys/tokens');
190
+ logger.log(' 2. Run: openclaw doctor');
191
+ logger.log(' 3. Run: openclaw gateway start');
192
+ }
193
+ /**
194
+ * Dry run - show what would be imported
195
+ */
196
+ async function runDryRunImport(zip, manifest, targetPaths, willImport, mode, logger) {
197
+ const entries = zip.getEntries().filter(e => !e.isDirectory && e.entryName !== 'manifest.json' && e.entryName !== 'SECRETS_TEMPLATE.json');
198
+ let wouldWrite = 0;
199
+ let wouldSkip = 0;
200
+ let wouldOverwrite = 0;
201
+ logger.heading('Files');
202
+ for (const entry of entries) {
203
+ const targetPath = mapEntryToTarget(entry.entryName, targetPaths);
204
+ if (!targetPath)
205
+ continue;
206
+ // Check skip conditions
207
+ if (entry.entryName.startsWith('config/') && !willImport.config)
208
+ continue;
209
+ if (entry.entryName.startsWith('cron/') && !willImport.cron)
210
+ continue;
211
+ if (entry.entryName.startsWith('workspace/') && !willImport.workspace)
212
+ continue;
213
+ const exists = fs.existsSync(targetPath);
214
+ if (exists && mode === 'merge') {
215
+ wouldSkip++;
216
+ logger.log(` ${chalk_1.default.dim('skip')} ${entry.entryName}`);
217
+ }
218
+ else if (exists && mode === 'force') {
219
+ wouldOverwrite++;
220
+ logger.log(` ${chalk_1.default.yellow('overwrite')} ${entry.entryName}`);
221
+ }
222
+ else {
223
+ wouldWrite++;
224
+ logger.log(` ${chalk_1.default.green('write')} ${entry.entryName}`);
225
+ }
226
+ }
227
+ logger.heading('Summary');
228
+ logger.log(` Would write: ${wouldWrite} files`);
229
+ logger.log(` Would skip: ${wouldSkip} files`);
230
+ logger.log(` Would overwrite: ${wouldOverwrite} files`);
231
+ logger.log(`\n Run without ${chalk_1.default.cyan('--dry-run')} to perform the import.`);
232
+ }
233
+ /**
234
+ * Actually perform the import
235
+ */
236
+ async function performImport(zip, manifest, targetPaths, willImport, mode, logger) {
237
+ const stats = {
238
+ filesWritten: 0,
239
+ filesSkipped: 0,
240
+ filesOverwritten: 0,
241
+ cronJobsAdded: 0,
242
+ cronJobsSkipped: 0,
243
+ };
244
+ const entries = zip.getEntries().filter(e => !e.isDirectory);
245
+ // Handle cron specially for merge logic
246
+ if (willImport.cron) {
247
+ const cronEntry = zip.getEntry('cron/jobs.json');
248
+ if (cronEntry) {
249
+ const cronResult = importCronJobs(cronEntry, targetPaths.cron, mode, logger);
250
+ stats.cronJobsAdded = cronResult.added;
251
+ stats.cronJobsSkipped = cronResult.skipped;
252
+ if (cronResult.added > 0) {
253
+ stats.filesWritten++;
254
+ }
255
+ }
256
+ }
257
+ // Handle config specially for merge logic
258
+ if (willImport.config) {
259
+ const configEntry = zip.getEntry('config/openclaw.json');
260
+ if (configEntry) {
261
+ const result = importConfig(configEntry, targetPaths.config, mode, logger);
262
+ if (result === 'written')
263
+ stats.filesWritten++;
264
+ else if (result === 'merged')
265
+ stats.filesWritten++;
266
+ else if (result === 'skipped')
267
+ stats.filesSkipped++;
268
+ }
269
+ }
270
+ // Process other files
271
+ for (const entry of entries) {
272
+ // Skip manifest and template
273
+ if (entry.entryName === 'manifest.json' || entry.entryName === 'SECRETS_TEMPLATE.json') {
274
+ continue;
275
+ }
276
+ // Skip cron and config (handled above)
277
+ if (entry.entryName === 'cron/jobs.json' || entry.entryName === 'config/openclaw.json') {
278
+ continue;
279
+ }
280
+ // Check skip conditions
281
+ if (entry.entryName.startsWith('config/') && !willImport.config)
282
+ continue;
283
+ if (entry.entryName.startsWith('cron/') && !willImport.cron)
284
+ continue;
285
+ if (entry.entryName.startsWith('workspace/') && !willImport.workspace)
286
+ continue;
287
+ if (entry.entryName.startsWith('agents/') && !willImport.agents)
288
+ continue;
289
+ const targetPath = mapEntryToTarget(entry.entryName, targetPaths);
290
+ if (!targetPath)
291
+ continue;
292
+ const exists = fs.existsSync(targetPath);
293
+ if (exists && mode === 'merge') {
294
+ stats.filesSkipped++;
295
+ continue;
296
+ }
297
+ // Write the file
298
+ (0, utils_1.ensureDir)(path.dirname(targetPath));
299
+ fs.writeFileSync(targetPath, entry.getData());
300
+ if (exists) {
301
+ stats.filesOverwritten++;
302
+ }
303
+ else {
304
+ stats.filesWritten++;
305
+ }
306
+ }
307
+ return stats;
308
+ }
309
+ /**
310
+ * Map an archive entry path to the target filesystem path
311
+ */
312
+ function mapEntryToTarget(entryName, targetPaths) {
313
+ if (entryName.startsWith('config/')) {
314
+ return path.join(targetPaths.root, entryName.replace('config/', ''));
315
+ }
316
+ if (entryName.startsWith('cron/')) {
317
+ return path.join(targetPaths.cron, entryName.replace('cron/', ''));
318
+ }
319
+ if (entryName.startsWith('workspace/')) {
320
+ return path.join(targetPaths.workspace, entryName.replace('workspace/', ''));
321
+ }
322
+ if (entryName.startsWith('agents/')) {
323
+ // agents/main/models.json -> agents/main/agent/models.json
324
+ const parts = entryName.split('/');
325
+ if (parts.length >= 3) {
326
+ const agent = parts[1];
327
+ const rest = parts.slice(2).join('/');
328
+ return path.join(targetPaths.agents, agent, 'agent', rest);
329
+ }
330
+ }
331
+ if (entryName.startsWith('credentials/')) {
332
+ return path.join(targetPaths.credentials, entryName.replace('credentials/', ''));
333
+ }
334
+ return null;
335
+ }
336
+ /**
337
+ * Import cron jobs with merge logic
338
+ */
339
+ function importCronJobs(entry, cronDir, mode, logger) {
340
+ const result = { added: 0, skipped: 0 };
341
+ let sourceJobs;
342
+ try {
343
+ sourceJobs = JSON.parse(entry.getData().toString('utf-8'));
344
+ }
345
+ catch {
346
+ logger.warn('Could not parse source cron/jobs.json');
347
+ return result;
348
+ }
349
+ const targetPath = path.join(cronDir, 'jobs.json');
350
+ if (mode === 'force' || !fs.existsSync(targetPath)) {
351
+ // Just write it
352
+ (0, utils_1.ensureDir)(cronDir);
353
+ fs.writeFileSync(targetPath, JSON.stringify(sourceJobs, null, 2));
354
+ result.added = sourceJobs.jobs?.length || 0;
355
+ return result;
356
+ }
357
+ // Merge mode
358
+ let targetJobs;
359
+ try {
360
+ targetJobs = (0, utils_1.readJson)(targetPath) || { jobs: [] };
361
+ }
362
+ catch {
363
+ targetJobs = { jobs: [] };
364
+ }
365
+ const existingIds = new Set(targetJobs.jobs.map(j => j.id));
366
+ for (const job of sourceJobs.jobs || []) {
367
+ if (existingIds.has(job.id)) {
368
+ result.skipped++;
369
+ }
370
+ else {
371
+ targetJobs.jobs.push(job);
372
+ result.added++;
373
+ }
374
+ }
375
+ if (result.added > 0) {
376
+ (0, utils_1.writeJson)(targetPath, targetJobs);
377
+ }
378
+ return result;
379
+ }
380
+ /**
381
+ * Import config with merge logic
382
+ */
383
+ function importConfig(entry, targetPath, mode, logger) {
384
+ let sourceConfig;
385
+ try {
386
+ sourceConfig = JSON.parse(entry.getData().toString('utf-8'));
387
+ }
388
+ catch {
389
+ logger.warn('Could not parse source config');
390
+ return 'skipped';
391
+ }
392
+ if (mode === 'force' || !fs.existsSync(targetPath)) {
393
+ (0, utils_1.ensureDir)(path.dirname(targetPath));
394
+ fs.writeFileSync(targetPath, JSON.stringify(sourceConfig, null, 2));
395
+ return 'written';
396
+ }
397
+ // Merge mode - target values win
398
+ const targetConfig = (0, utils_1.readJson)(targetPath);
399
+ if (!targetConfig) {
400
+ fs.writeFileSync(targetPath, JSON.stringify(sourceConfig, null, 2));
401
+ return 'written';
402
+ }
403
+ // Deep merge with target winning
404
+ const merged = (0, utils_1.deepMerge)(sourceConfig, targetConfig, true);
405
+ (0, utils_1.writeJson)(targetPath, merged);
406
+ return 'merged';
407
+ }
408
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCH,8BAwJC;AAtLD,uCAAyB;AACzB,2CAA6B;AAC7B,sDAA6B;AAC7B,kDAA0B;AAE1B,yCAAwD;AACxD,mCAA8D;AAC9D,mCAA4E;AAoB5E;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAAsB;IAClE,MAAM,MAAM,GAAG,IAAI,cAAM,EAAE,CAAC;IAE5B,uBAAuB;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,WAAW;IACX,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,iBAAM,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAA,2BAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,SAAS,GAAW,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAA,yBAAiB,GAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,wBAAgB,EAAC,SAAS,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACpD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAE/C,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IACvH,MAAM,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE9E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG;QACjB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU;QACvD,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;QACjD,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa;QAChE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;KAC5C,CAAC;IAEF,IAAI,UAAU,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACjF,IAAI,UAAU,CAAC,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC;IACpG,IAAI,UAAU,CAAC,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC/E,IAAI,UAAU,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1G,IAAI,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,aAAa;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAEhF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,8BAA8B;QAC9B,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAExF,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,kBAAkB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,aAAa,WAAW,KAAK,CAAC,eAAe,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAErE,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAC5D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEvE,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/D,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;oBAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;wBAC3D,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;oBACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;wBACpD,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;gBAED,IAAI,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrE,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;oBAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAChE,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,KAAM,KAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,GAAW,EACX,QAAkB,EAClB,WAAgD,EAChD,UAAmC,EACnC,IAAuB,EACvB,MAAc;IAEd,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,eAAe,IAAI,CAAC,CAAC,SAAS,KAAK,uBAAuB,CAAC,CAAC;IAE3I,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,wBAAwB;QACxB,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAC1E,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI;YAAE,SAAS;QACtE,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,SAAS;QAEhF,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,SAAS,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACtC,cAAc,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,kBAAkB,UAAU,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,CAAC,iBAAiB,SAAS,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,sBAAsB,cAAc,QAAQ,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,CAAC,mBAAmB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,QAAkB,EAClB,WAAgD,EAChD,UAAmC,EACnC,IAAuB,EACvB,MAAc;IAEd,MAAM,KAAK,GAAgB;QACzB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,CAAC;KACnB,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE7D,wCAAwC;IACxC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7E,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;YACvC,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC;YAC3C,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3E,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;iBAC1C,IAAI,MAAM,KAAK,QAAQ;gBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;iBAC9C,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,6BAA6B;QAC7B,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe,IAAI,KAAK,CAAC,SAAS,KAAK,uBAAuB,EAAE,CAAC;YACvF,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,KAAK,CAAC,SAAS,KAAK,gBAAgB,IAAI,KAAK,CAAC,SAAS,KAAK,sBAAsB,EAAE,CAAC;YACvF,SAAS;QACX,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAC1E,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI;YAAE,SAAS;QACtE,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,SAAS;QAChF,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAE1E,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,iBAAiB;QACjB,IAAA,iBAAS,EAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAE9C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,SAAiB,EACjB,WAAgD;IAEhD,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,2DAA2D;QAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,KAAuB,EACvB,OAAe,EACf,IAAuB,EACvB,MAAc;IAEd,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAExC,IAAI,UAAmE,CAAC;IACxE,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEnD,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,gBAAgB;QAChB,IAAA,iBAAS,EAAC,OAAO,CAAC,CAAC;QACnB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa;IACb,IAAI,UAAmE,CAAC;IACxE,IAAI,CAAC;QACH,UAAU,GAAG,IAAA,gBAAQ,EAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5D,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,IAAA,iBAAS,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,KAAuB,EACvB,UAAkB,EAClB,IAAuB,EACvB,MAAc;IAEd,IAAI,YAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,IAAA,iBAAS,EAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,MAAM,YAAY,GAAG,IAAA,gBAAQ,EAA0B,UAAU,CAAC,CAAC;IACnE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAA,iBAAS,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * openclaw-packager - Export and import OpenClaw bot configurations
4
+ */
5
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * openclaw-packager - Export and import OpenClaw bot configurations
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const commander_1 = require("commander");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const export_1 = require("./export");
13
+ const import_1 = require("./import");
14
+ const inspect_1 = require("./inspect");
15
+ const program = new commander_1.Command();
16
+ program
17
+ .name('openclaw-packager')
18
+ .description('Export and import OpenClaw bot configurations')
19
+ .version('0.1.0');
20
+ // Export command
21
+ program
22
+ .command('export')
23
+ .description('Export OpenClaw configuration to a zip file')
24
+ .option('-o, --output <path>', 'Output file path')
25
+ .option('--workspace', 'Include workspace (default: true)')
26
+ .option('--no-workspace', 'Exclude workspace')
27
+ .option('--cron', 'Include cron jobs (default: true)')
28
+ .option('--no-cron', 'Exclude cron jobs')
29
+ .option('--config', 'Include openclaw.json config (default: true)')
30
+ .option('--no-config', 'Exclude config')
31
+ .option('--agents', 'Include agent definitions (default: true)')
32
+ .option('--no-agents', 'Exclude agents')
33
+ .option('--agent <names...>', 'Export only specific agents (e.g. --agent main worker)')
34
+ .option('--memory', 'Include MEMORY.md and memory/ folder (default: true)')
35
+ .option('--no-memory', 'Exclude memory')
36
+ .option('--auth', 'Include auth-profiles.json and credentials/ (default: false)')
37
+ .option('--include-secrets', 'Include actual secret values (tokens, keys)')
38
+ .option('--include-projects', 'Include workspace/projects/ (excluded by default, large)')
39
+ .option('--stdout', 'Write zip to stdout (for SSH piping)')
40
+ .option('--dry-run', 'Preview what would be exported')
41
+ .action(async (options) => {
42
+ try {
43
+ await (0, export_1.runExport)(options);
44
+ }
45
+ catch (err) {
46
+ console.error(chalk_1.default.red('Export failed:'), err);
47
+ process.exit(1);
48
+ }
49
+ });
50
+ // Import command
51
+ program
52
+ .command('import <file>')
53
+ .description('Import OpenClaw configuration from a backup zip')
54
+ .option('--dry-run', 'Preview what would change')
55
+ .option('--merge', 'Add missing files, skip existing (default)')
56
+ .option('--force', 'Overwrite all existing files')
57
+ .option('--target <path>', 'Target OpenClaw directory (default: ~/.openclaw)')
58
+ .option('--skip-workspace', 'Skip workspace files')
59
+ .option('--skip-cron', 'Skip cron jobs')
60
+ .option('--skip-config', 'Skip config')
61
+ .action(async (file, options) => {
62
+ try {
63
+ await (0, import_1.runImport)(file, options);
64
+ }
65
+ catch (err) {
66
+ console.error(chalk_1.default.red('Import failed:'), err);
67
+ process.exit(1);
68
+ }
69
+ });
70
+ // Inspect command
71
+ program
72
+ .command('inspect <file>')
73
+ .description('Show contents of a backup without importing')
74
+ .action(async (file, options) => {
75
+ try {
76
+ await (0, inspect_1.runInspect)(file, options);
77
+ }
78
+ catch (err) {
79
+ console.error(chalk_1.default.red('Inspect failed:'), err);
80
+ process.exit(1);
81
+ }
82
+ });
83
+ // Parse and run
84
+ program.parse();
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Inspect command for openclaw-packager
3
+ */
4
+ export interface InspectOptions {
5
+ }
6
+ /**
7
+ * Run the inspect command
8
+ */
9
+ export declare function runInspect(file: string, options: InspectOptions): Promise<void>;