@pleri/olam-cli 0.1.144 → 0.1.146

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 (117) hide show
  1. package/dist/commands/doctor.d.ts +53 -23
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +117 -46
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/logs.d.ts +17 -3
  6. package/dist/commands/logs.d.ts.map +1 -1
  7. package/dist/commands/logs.js +38 -35
  8. package/dist/commands/logs.js.map +1 -1
  9. package/dist/commands/memory/bridge.d.ts +57 -0
  10. package/dist/commands/memory/bridge.d.ts.map +1 -0
  11. package/dist/commands/memory/bridge.js +156 -0
  12. package/dist/commands/memory/bridge.js.map +1 -0
  13. package/dist/commands/memory/index.d.ts +3 -0
  14. package/dist/commands/memory/index.d.ts.map +1 -1
  15. package/dist/commands/memory/index.js +10 -1
  16. package/dist/commands/memory/index.js.map +1 -1
  17. package/dist/commands/memory/reclassify.d.ts +56 -0
  18. package/dist/commands/memory/reclassify.d.ts.map +1 -0
  19. package/dist/commands/memory/reclassify.js +177 -0
  20. package/dist/commands/memory/reclassify.js.map +1 -0
  21. package/dist/commands/memory/stats.d.ts +69 -0
  22. package/dist/commands/memory/stats.d.ts.map +1 -0
  23. package/dist/commands/memory/stats.js +164 -0
  24. package/dist/commands/memory/stats.js.map +1 -0
  25. package/dist/commands/skills-doctor.d.ts +14 -0
  26. package/dist/commands/skills-doctor.d.ts.map +1 -0
  27. package/dist/commands/skills-doctor.js +126 -0
  28. package/dist/commands/skills-doctor.js.map +1 -0
  29. package/dist/commands/skills-hook.d.ts +19 -0
  30. package/dist/commands/skills-hook.d.ts.map +1 -0
  31. package/dist/commands/skills-hook.js +99 -0
  32. package/dist/commands/skills-hook.js.map +1 -0
  33. package/dist/commands/skills-migrate-back.d.ts +21 -0
  34. package/dist/commands/skills-migrate-back.d.ts.map +1 -0
  35. package/dist/commands/skills-migrate-back.js +222 -0
  36. package/dist/commands/skills-migrate-back.js.map +1 -0
  37. package/dist/commands/skills-migrate.d.ts +33 -0
  38. package/dist/commands/skills-migrate.d.ts.map +1 -0
  39. package/dist/commands/skills-migrate.js +216 -0
  40. package/dist/commands/skills-migrate.js.map +1 -0
  41. package/dist/commands/skills-onboard.d.ts +26 -0
  42. package/dist/commands/skills-onboard.d.ts.map +1 -0
  43. package/dist/commands/skills-onboard.js +227 -0
  44. package/dist/commands/skills-onboard.js.map +1 -0
  45. package/dist/commands/skills-shadow-backups.d.ts +15 -0
  46. package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
  47. package/dist/commands/skills-shadow-backups.js +132 -0
  48. package/dist/commands/skills-shadow-backups.js.map +1 -0
  49. package/dist/commands/skills-source.d.ts +37 -0
  50. package/dist/commands/skills-source.d.ts.map +1 -0
  51. package/dist/commands/skills-source.js +431 -0
  52. package/dist/commands/skills-source.js.map +1 -0
  53. package/dist/commands/skills.d.ts +11 -0
  54. package/dist/commands/skills.d.ts.map +1 -0
  55. package/dist/commands/skills.js +170 -0
  56. package/dist/commands/skills.js.map +1 -0
  57. package/dist/commands/status.d.ts +27 -0
  58. package/dist/commands/status.d.ts.map +1 -1
  59. package/dist/commands/status.js +102 -1
  60. package/dist/commands/status.js.map +1 -1
  61. package/dist/commands/substrate-audit-log.d.ts +49 -0
  62. package/dist/commands/substrate-audit-log.d.ts.map +1 -0
  63. package/dist/commands/substrate-audit-log.js +148 -0
  64. package/dist/commands/substrate-audit-log.js.map +1 -0
  65. package/dist/commands/substrate.d.ts +60 -0
  66. package/dist/commands/substrate.d.ts.map +1 -0
  67. package/dist/commands/substrate.js +175 -0
  68. package/dist/commands/substrate.js.map +1 -0
  69. package/dist/commands/upgrade.d.ts +10 -0
  70. package/dist/commands/upgrade.d.ts.map +1 -1
  71. package/dist/commands/upgrade.js +30 -0
  72. package/dist/commands/upgrade.js.map +1 -1
  73. package/dist/image-digests.json +7 -7
  74. package/dist/index.js +8394 -3876
  75. package/dist/index.js.map +1 -1
  76. package/dist/lib/config.d.ts +69 -0
  77. package/dist/lib/config.d.ts.map +1 -0
  78. package/dist/lib/config.js +146 -0
  79. package/dist/lib/config.js.map +1 -0
  80. package/dist/lib/health-probes.d.ts +72 -0
  81. package/dist/lib/health-probes.d.ts.map +1 -1
  82. package/dist/lib/health-probes.js +218 -0
  83. package/dist/lib/health-probes.js.map +1 -1
  84. package/dist/lib/instrumentation.d.ts +85 -0
  85. package/dist/lib/instrumentation.d.ts.map +1 -0
  86. package/dist/lib/instrumentation.js +104 -0
  87. package/dist/lib/instrumentation.js.map +1 -0
  88. package/dist/lib/kubectl-wrap.d.ts +59 -0
  89. package/dist/lib/kubectl-wrap.d.ts.map +1 -0
  90. package/dist/lib/kubectl-wrap.js +130 -0
  91. package/dist/lib/kubectl-wrap.js.map +1 -0
  92. package/dist/lib/manifest-refresh.d.ts +95 -0
  93. package/dist/lib/manifest-refresh.d.ts.map +1 -0
  94. package/dist/lib/manifest-refresh.js +222 -0
  95. package/dist/lib/manifest-refresh.js.map +1 -0
  96. package/dist/lib/port-forward.d.ts +101 -0
  97. package/dist/lib/port-forward.d.ts.map +1 -0
  98. package/dist/lib/port-forward.js +240 -0
  99. package/dist/lib/port-forward.js.map +1 -0
  100. package/dist/lib/upgrade-kubernetes.d.ts +77 -0
  101. package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
  102. package/dist/lib/upgrade-kubernetes.js +277 -0
  103. package/dist/lib/upgrade-kubernetes.js.map +1 -0
  104. package/dist/mcp-server.js +3328 -1166
  105. package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
  106. package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
  107. package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
  108. package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
  109. package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
  110. package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
  111. package/host-cp/k8s/manifests/60-service.yaml +22 -0
  112. package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
  113. package/host-cp/src/agent-runtime-trigger.mjs +74 -4
  114. package/host-cp/src/engine-identity.mjs +32 -0
  115. package/host-cp/src/plan-chat-service.mjs +31 -7
  116. package/host-cp/src/server.mjs +219 -9
  117. package/package.json +3 -2
@@ -0,0 +1,431 @@
1
+ /**
2
+ * olam skills source — manage registered skill sources.
3
+ *
4
+ * olam skills source list
5
+ * olam skills source add --name <n> --git-url <url> [--branch <b>]
6
+ * olam skills source remove <id>
7
+ * olam skills source pull <id>
8
+ * olam skills source show <id>
9
+ */
10
+ import * as readline from 'node:readline';
11
+ import pc from 'picocolors';
12
+ import { listSkillSources, getSkillSource, addSkillSource, removeSkillSource, reorderSkillSource, updateSkillSource, cloneSkillSource, pullSkillSource, removeSkillSourceClone, skillSourceClonePath, appendTrustAudit, redactUrl, installSkillsHookToFile, isSkillsHookInstalled, skillsHookSettingsPathFor, syncSkills, } from '@olam/core/src/skill-sources/index.js';
13
+ import { printError, printSuccess, printInfo, printHeader } from '../output.js';
14
+ function asMessage(err) {
15
+ return err instanceof Error ? err.message : String(err);
16
+ }
17
+ /**
18
+ * Capability-class trust gate (C4 / T6 mitigation). Registering a source
19
+ * grants symlink-into-`~/.claude/` permission; auditable + gated:
20
+ * - `--trust` → grant (audit: method=flag)
21
+ * - non-TTY + no flag → refuse (audit: action=auto-rejected)
22
+ * - TTY + no flag → prompt; ack → grant, cancel → refuse
23
+ *
24
+ * Injectable `promptFn` lets tests skip readline by passing a function that
25
+ * returns 'y' / 'n'. Production code uses the readline-based default.
26
+ */
27
+ async function decideTrust(opts) {
28
+ if (opts.trustFlag) {
29
+ return { granted: true, method: 'flag' };
30
+ }
31
+ if (!opts.isTTY) {
32
+ return {
33
+ granted: false,
34
+ method: 'auto-reject-tty',
35
+ reason: 'non-interactive context (no TTY) requires explicit `--trust` flag. ' +
36
+ 'Adding a skill source grants it permission to symlink into ~/.claude/ — ' +
37
+ 'pass `--trust` to acknowledge, or re-run interactively.',
38
+ };
39
+ }
40
+ const fn = opts.promptFn ?? (() => defaultTrustPrompt(opts.gitUrl));
41
+ const answer = (await fn()).trim().toLowerCase();
42
+ const yes = answer === 'y' || answer === 'yes';
43
+ return { granted: yes, method: 'interactive' };
44
+ }
45
+ function defaultTrustPrompt(gitUrl) {
46
+ return new Promise((resolve) => {
47
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
48
+ process.stdout.write(`${pc.yellow('Trust gate:')} register "${gitUrl}" as a skill source?\n` +
49
+ ' This grants the source permission to symlink artifacts into\n' +
50
+ ' ~/.claude/ on every `olam skills sync`.\n' +
51
+ `Type ${pc.bold('y')} to add + trust, anything else to cancel: `);
52
+ rl.question('', (a) => {
53
+ rl.close();
54
+ resolve(a);
55
+ });
56
+ });
57
+ }
58
+ function defaultPostAddPrompt(input) {
59
+ return new Promise((resolve) => {
60
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
61
+ process.stdout.write(`\n${pc.bold('Sync now?')} ${pc.dim('[Y/n] ')}`);
62
+ rl.question('', (syncAnswer) => {
63
+ const sync = !/^n(o)?$/i.test(syncAnswer.trim());
64
+ if (input.hookAlreadyInstalled) {
65
+ rl.close();
66
+ resolve({ syncNow: sync, installHook: false });
67
+ return;
68
+ }
69
+ process.stdout.write(`${pc.bold('Install SessionStart hook so future sessions auto-sync?')} ${pc.dim('[Y/n] ')}`);
70
+ rl.question('', (hookAnswer) => {
71
+ rl.close();
72
+ const installHook = !/^n(o)?$/i.test(hookAnswer.trim());
73
+ resolve({ syncNow: sync, installHook });
74
+ });
75
+ });
76
+ });
77
+ }
78
+ export function registerSkillsSource(program) {
79
+ const skills = program.command('skills').description('Manage skill sources and synchronization');
80
+ const source = skills.command('source').description('Manage registered skill sources');
81
+ source
82
+ .command('list')
83
+ .description('List all registered skill sources')
84
+ .action(() => {
85
+ const all = listSkillSources();
86
+ if (all.length === 0) {
87
+ console.log(pc.dim('0 skill source(s) registered. Add one with: olam skills source add --name <n> --git-url <url>'));
88
+ return;
89
+ }
90
+ printHeader(`${all.length} skill source(s)`);
91
+ // Ordinal prefix exposes the multi-source precedence order
92
+ // (first-registered wins). Mutate via `olam skills source reorder`.
93
+ for (let i = 0; i < all.length; i += 1) {
94
+ const s = all[i];
95
+ const when = new Date(s.addedAt).toISOString().slice(0, 10);
96
+ const sha = s.lastPulledSha ? s.lastPulledSha.slice(0, 8) : pc.dim('(unpulled)');
97
+ const ord = pc.dim(`[${i + 1}]`);
98
+ console.log(` ${ord} ${pc.bold(s.id.padEnd(14))} ${s.name.padEnd(24)} ${s.branch.padEnd(12)} ${sha.padEnd(12)} ${pc.dim(when)} ${pc.dim(s.gitUrl)}`);
99
+ }
100
+ });
101
+ source
102
+ .command('add')
103
+ .description('Register and clone a skill source (T6 capability-class: requires --trust OR interactive ack)')
104
+ .requiredOption('--name <name>', 'Display name (lowercase, digits, dash)')
105
+ .requiredOption('--git-url <url>', 'git URL (https://, git@, ssh://, file://, or absolute path)')
106
+ .option('--branch <branch>', 'Branch to track', 'main')
107
+ .option('--trust', 'Acknowledge that registering grants symlink-into-~/.claude permission (skips interactive picker)')
108
+ // Post-add follow-up flags. In TTY context the operator is prompted;
109
+ // these flags let scripts override or skip the prompt non-interactively.
110
+ .option('--sync-now', 'Run `olam skills sync` immediately after add (skips interactive prompt)')
111
+ .option('--no-sync-now', 'Skip the post-add sync (skips interactive prompt)')
112
+ .option('--install-hook', 'Install the SessionStart hook after add (skips interactive prompt)')
113
+ .option('--no-install-hook', 'Skip installing the SessionStart hook (skips interactive prompt)')
114
+ .option('--hook-scope <scope>', 'When installing the hook (post-add): project (<cwd>/.claude) or user (~/.claude)', 'project')
115
+ .action(async (opts) => {
116
+ // T6 / C4 — capability-class trust gate. Audits every decision.
117
+ const isTTY = Boolean(process.stdout.isTTY);
118
+ const testPromptFn = globalThis.__olamTestTrustPrompt;
119
+ let decision;
120
+ try {
121
+ decision = await decideTrust({
122
+ trustFlag: opts.trust === true,
123
+ gitUrl: opts.gitUrl,
124
+ isTTY,
125
+ promptFn: testPromptFn,
126
+ });
127
+ }
128
+ catch (err) {
129
+ printError(`trust gate errored: ${asMessage(err)}`);
130
+ process.exitCode = 1;
131
+ return;
132
+ }
133
+ if (!decision.granted) {
134
+ try {
135
+ appendTrustAudit({
136
+ gitUrl: redactUrl(opts.gitUrl),
137
+ action: decision.method === 'auto-reject-tty' ? 'auto-rejected' : 'rejected',
138
+ trustMethod: decision.method,
139
+ ...(decision.reason ? { note: decision.reason } : {}),
140
+ });
141
+ }
142
+ catch {
143
+ // audit-log failure must not block the user-facing error path
144
+ }
145
+ printError(decision.reason ?? 'trust gate declined; skill source NOT added');
146
+ process.exitCode = 1;
147
+ return;
148
+ }
149
+ let entry;
150
+ try {
151
+ // `trustMethod` is required at the store layer — CP3 trust-coverage
152
+ // fix. addSkillSource() writes the 'added' audit entry internally;
153
+ // CLI no longer duplicates the audit append on success.
154
+ entry = addSkillSource({
155
+ name: opts.name,
156
+ gitUrl: opts.gitUrl,
157
+ branch: opts.branch,
158
+ trustMethod: decision.method,
159
+ });
160
+ }
161
+ catch (err) {
162
+ try {
163
+ appendTrustAudit({
164
+ gitUrl: redactUrl(opts.gitUrl),
165
+ action: 'failed',
166
+ trustMethod: decision.method,
167
+ note: `addSkillSource: ${asMessage(err)}`,
168
+ });
169
+ }
170
+ catch {
171
+ // best-effort
172
+ }
173
+ printError(asMessage(err));
174
+ process.exitCode = 1;
175
+ return;
176
+ }
177
+ try {
178
+ const result = cloneSkillSource({
179
+ gitUrl: entry.gitUrl,
180
+ branch: entry.branch,
181
+ id: entry.id,
182
+ });
183
+ updateSkillSource(entry.id, { lastPulledSha: result.headSha });
184
+ // 'added' audit entry already written by addSkillSource() itself.
185
+ printSuccess(`registered skill source "${entry.name}" (${entry.id}) at ${result.clonePath} @ ${result.headSha.slice(0, 8)}`);
186
+ }
187
+ catch (err) {
188
+ // Roll back the state-store entry so add stays atomic
189
+ try {
190
+ removeSkillSource(entry.id);
191
+ }
192
+ catch {
193
+ // best-effort rollback
194
+ }
195
+ try {
196
+ appendTrustAudit({
197
+ gitUrl: redactUrl(entry.gitUrl),
198
+ action: 'failed',
199
+ trustMethod: decision.method,
200
+ sourceId: entry.id,
201
+ note: `clone: ${asMessage(err)}`,
202
+ });
203
+ }
204
+ catch {
205
+ // best-effort
206
+ }
207
+ printError(asMessage(err));
208
+ process.exitCode = 1;
209
+ return;
210
+ }
211
+ // -------------------------------------------------------------
212
+ // Post-add follow-ups (#4): offer sync + hook install to the
213
+ // operator. Flag-driven in scripts; prompt-driven in TTY.
214
+ // -------------------------------------------------------------
215
+ const hookScope = opts.hookScope === 'user' ? 'user' : 'project';
216
+ const hookFilePath = skillsHookSettingsPathFor(hookScope);
217
+ const hookAlreadyInstalled = isSkillsHookInstalled(hookFilePath);
218
+ const flagSyncSet = opts.syncNow !== undefined;
219
+ const flagHookSet = opts.installHook !== undefined;
220
+ const decideOutcome = async () => {
221
+ // Explicit flags always win, even in TTY: scripts that pass
222
+ // `--sync-now` shouldn't unexpectedly hit an interactive prompt
223
+ // when run from a terminal.
224
+ if (flagSyncSet && (flagHookSet || hookAlreadyInstalled)) {
225
+ return {
226
+ syncNow: opts.syncNow === true,
227
+ installHook: hookAlreadyInstalled ? false : opts.installHook === true,
228
+ };
229
+ }
230
+ if (!process.stdout.isTTY) {
231
+ // Non-interactive: use whichever flags are set, default false
232
+ // for the rest. Preserves the pre-#4 silent behavior.
233
+ return {
234
+ syncNow: opts.syncNow === true,
235
+ installHook: hookAlreadyInstalled ? false : opts.installHook === true,
236
+ };
237
+ }
238
+ const testPostAddPrompt = globalThis
239
+ .__olamTestPostAddPrompt;
240
+ const promptFn = testPostAddPrompt ?? defaultPostAddPrompt;
241
+ const fromPrompt = await promptFn({ hookAlreadyInstalled });
242
+ // Flag-overrides on top of the prompt's defaults (a script using
243
+ // --sync-now in a TTY still wants that to stick).
244
+ return {
245
+ syncNow: flagSyncSet ? opts.syncNow === true : fromPrompt.syncNow,
246
+ installHook: hookAlreadyInstalled
247
+ ? false
248
+ : flagHookSet
249
+ ? opts.installHook === true
250
+ : fromPrompt.installHook,
251
+ };
252
+ };
253
+ let outcome;
254
+ try {
255
+ outcome = await decideOutcome();
256
+ }
257
+ catch (err) {
258
+ printError(`post-add picker errored: ${asMessage(err)}`);
259
+ process.exitCode = 1;
260
+ return;
261
+ }
262
+ if (outcome.installHook) {
263
+ try {
264
+ const hookResult = installSkillsHookToFile(hookFilePath);
265
+ switch (hookResult.status) {
266
+ case 'installed':
267
+ printInfo('hook', `installed (${hookScope} scope) at ${hookFilePath}`);
268
+ if (hookResult.backupPath)
269
+ printInfo('backup', hookResult.backupPath);
270
+ break;
271
+ case 'already-present':
272
+ printInfo('hook', `already installed at ${hookFilePath}`);
273
+ break;
274
+ case 'no-op':
275
+ printInfo('hook', `no change at ${hookFilePath}`);
276
+ break;
277
+ }
278
+ }
279
+ catch (err) {
280
+ // Hook install failure must NOT roll back the source — the
281
+ // source registration is still valid + useful. Surface a
282
+ // warning + audit row instead.
283
+ printError(`install-hook failed: ${asMessage(err)}`);
284
+ try {
285
+ appendTrustAudit({
286
+ gitUrl: redactUrl(entry.gitUrl),
287
+ action: 'failed',
288
+ trustMethod: decision.method,
289
+ sourceId: entry.id,
290
+ note: `post-add install-hook: ${asMessage(err)}`,
291
+ });
292
+ }
293
+ catch {
294
+ // best-effort
295
+ }
296
+ }
297
+ }
298
+ if (outcome.syncNow) {
299
+ try {
300
+ const summary = await syncSkills({});
301
+ printInfo('sync', `${summary.artifactCount} artifact(s) deployed`);
302
+ }
303
+ catch (err) {
304
+ printError(`sync failed: ${asMessage(err)}`);
305
+ try {
306
+ appendTrustAudit({
307
+ gitUrl: redactUrl(entry.gitUrl),
308
+ action: 'failed',
309
+ trustMethod: decision.method,
310
+ sourceId: entry.id,
311
+ note: `post-add sync: ${asMessage(err)}`,
312
+ });
313
+ }
314
+ catch {
315
+ // best-effort
316
+ }
317
+ }
318
+ }
319
+ // Audit the picker outcome ONLY when the picker actually ran (TTY
320
+ // context) or when post-add flags were explicitly set. Skipping
321
+ // the row in non-TTY + no-flag context preserves the pre-Phase-D
322
+ // single-row-per-add invariant existing audit tests rely on. When
323
+ // emitted, the row carries `action: 'added'` (passthrough-extended
324
+ // with a post-add note) so audit:trust-coverage stays satisfied
325
+ // even if a future caller checks counts beyond first match.
326
+ const pickerRan = flagSyncSet || flagHookSet || Boolean(process.stdout.isTTY);
327
+ if (pickerRan) {
328
+ try {
329
+ const syncNote = outcome.syncNow ? 'yes' : 'no';
330
+ const hookNote = hookAlreadyInstalled
331
+ ? 'already-installed'
332
+ : outcome.installHook
333
+ ? 'yes'
334
+ : 'no';
335
+ appendTrustAudit({
336
+ gitUrl: redactUrl(entry.gitUrl),
337
+ action: 'added',
338
+ trustMethod: decision.method,
339
+ sourceId: entry.id,
340
+ note: `post-add: sync=${syncNote} hook=${hookNote}`,
341
+ });
342
+ }
343
+ catch {
344
+ // best-effort
345
+ }
346
+ }
347
+ });
348
+ source
349
+ .command('remove')
350
+ .description('Remove a registered skill source (deletes its clone)')
351
+ .argument('<id>', 'Skill source id (from "olam skills source list")')
352
+ .action((id) => {
353
+ try {
354
+ removeSkillSourceClone(id);
355
+ removeSkillSource(id);
356
+ printSuccess(`removed skill source "${id}"`);
357
+ }
358
+ catch (err) {
359
+ printError(asMessage(err));
360
+ process.exitCode = 1;
361
+ }
362
+ });
363
+ source
364
+ .command('pull')
365
+ .description('Fetch + reset the clone to upstream HEAD')
366
+ .argument('<id>', 'Skill source id')
367
+ .action((id) => {
368
+ try {
369
+ const entry = getSkillSource(id);
370
+ if (!entry) {
371
+ printError(`skill source "${id}" is not registered`);
372
+ process.exitCode = 1;
373
+ return;
374
+ }
375
+ const result = pullSkillSource({
376
+ gitUrl: entry.gitUrl,
377
+ branch: entry.branch,
378
+ id: entry.id,
379
+ });
380
+ updateSkillSource(entry.id, { lastPulledSha: result.headSha });
381
+ printSuccess(`pulled "${entry.name}" → ${result.headSha.slice(0, 8)}`);
382
+ }
383
+ catch (err) {
384
+ printError(asMessage(err));
385
+ process.exitCode = 1;
386
+ }
387
+ });
388
+ source
389
+ .command('reorder')
390
+ .description('Move a registered source to a new ordinal (1-indexed; mutates precedence)')
391
+ .argument('<id>', 'Skill source id (from "olam skills source list")')
392
+ .argument('<position>', 'New 1-indexed ordinal (1 = first / highest precedence)')
393
+ .action((id, positionRaw) => {
394
+ const position = Number.parseInt(positionRaw, 10);
395
+ if (!Number.isInteger(position)) {
396
+ printError(`position must be an integer (got "${positionRaw}")`);
397
+ process.exitCode = 1;
398
+ return;
399
+ }
400
+ try {
401
+ const next = reorderSkillSource(id, position);
402
+ const idx = next.findIndex((s) => s.id === id);
403
+ printSuccess(`reordered "${id}" → position ${idx + 1} of ${next.length}`);
404
+ }
405
+ catch (err) {
406
+ printError(asMessage(err));
407
+ process.exitCode = 1;
408
+ }
409
+ });
410
+ source
411
+ .command('show')
412
+ .description('Show details for a single skill source')
413
+ .argument('<id>', 'Skill source id')
414
+ .action((id) => {
415
+ const entry = getSkillSource(id);
416
+ if (!entry) {
417
+ printError(`skill source "${id}" is not registered`);
418
+ process.exitCode = 1;
419
+ return;
420
+ }
421
+ const when = new Date(entry.addedAt).toISOString();
422
+ console.log(`${pc.bold('id:')} ${entry.id}`);
423
+ console.log(`${pc.bold('name:')} ${entry.name}`);
424
+ console.log(`${pc.bold('gitUrl:')} ${entry.gitUrl}`);
425
+ console.log(`${pc.bold('branch:')} ${entry.branch}`);
426
+ console.log(`${pc.bold('addedAt:')} ${when}`);
427
+ console.log(`${pc.bold('lastPulledSha:')} ${entry.lastPulledSha ?? pc.dim('(unpulled)')}`);
428
+ console.log(`${pc.bold('clonePath:')} ${skillSourceClonePath(entry.id)}`);
429
+ });
430
+ }
431
+ //# sourceMappingURL=skills-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-source.js","sourceRoot":"","sources":["../../src/commands/skills-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * olam skills — sync, dry-run/diff, list-installed, show.
3
+ *
4
+ * olam skills sync [--dry-run] [--atlas-user <u>]
5
+ * olam skills diff [--atlas-user <u>] (alias of `sync --dry-run`)
6
+ * olam skills list (lists deployed artifacts)
7
+ * olam skills show <name> (shows details for a deployed artifact)
8
+ */
9
+ import type { Command } from 'commander';
10
+ export declare function registerSkills(program: Command): void;
11
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoGzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgFrD"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * olam skills — sync, dry-run/diff, list-installed, show.
3
+ *
4
+ * olam skills sync [--dry-run] [--atlas-user <u>]
5
+ * olam skills diff [--atlas-user <u>] (alias of `sync --dry-run`)
6
+ * olam skills list (lists deployed artifacts)
7
+ * olam skills show <name> (shows details for a deployed artifact)
8
+ */
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ import pc from 'picocolors';
12
+ import { syncSkills, claudeDir, listSkillSources, skillSourceClonePath, } from '@olam/core/src/skill-sources/index.js';
13
+ import { printError, printSuccess, printHeader } from '../output.js';
14
+ function asMessage(err) {
15
+ return err instanceof Error ? err.message : String(err);
16
+ }
17
+ function listDeployed() {
18
+ const dir = claudeDir();
19
+ const sources = listSkillSources();
20
+ const sourcePaths = new Map(sources.map((s) => [skillSourceClonePath(s.id), s.id]));
21
+ const entries = [];
22
+ for (const bucket of ['skills', 'agents', 'scripts', 'rules', 'commands']) {
23
+ const bucketDir = path.join(dir, bucket);
24
+ if (!fs.existsSync(bucketDir))
25
+ continue;
26
+ for (const name of fs.readdirSync(bucketDir)) {
27
+ const full = path.join(bucketDir, name);
28
+ try {
29
+ const stat = fs.lstatSync(full);
30
+ if (!stat.isSymbolicLink())
31
+ continue;
32
+ const target = fs.readlinkSync(full);
33
+ let sourceId;
34
+ for (const [clonePath, id] of sourcePaths.entries()) {
35
+ if (target.startsWith(clonePath)) {
36
+ sourceId = id;
37
+ break;
38
+ }
39
+ }
40
+ entries.push({ bucket, name, target, sourceId });
41
+ }
42
+ catch {
43
+ // ignore
44
+ }
45
+ }
46
+ }
47
+ return entries;
48
+ }
49
+ function printSyncSummary(summary, dryRun) {
50
+ printHeader(dryRun ? 'dry-run summary' : 'sync summary');
51
+ console.log(` sources: ${summary.sourceCount}`);
52
+ console.log(` artifacts: ${summary.artifactCount}`);
53
+ console.log(` hook files: ${summary.hookFileCount}`);
54
+ console.log(` permission files:${summary.permissionFileCount}`);
55
+ if (summary.deploy) {
56
+ console.log(` symlinks made: ${summary.deploy.linked}`);
57
+ if (summary.deploy.shadowBackups.length > 0) {
58
+ console.log(` ${pc.yellow('shadow backups:')} ${summary.deploy.shadowBackups.length}`);
59
+ for (const p of summary.deploy.shadowBackups)
60
+ console.log(` ${pc.dim(p)}`);
61
+ }
62
+ }
63
+ // Cross-source artifact-name collisions — surfaced for both sync + dry-run.
64
+ // Resolution rule: first-registered source wins (mutate ordering via
65
+ // `olam skills source reorder`).
66
+ if (summary.collisions.length > 0) {
67
+ console.log(` ${pc.yellow('[conflict] name collisions:')} ${summary.collisions.length}`);
68
+ for (const c of summary.collisions) {
69
+ const winnerIdShort = c.winnerSourceId.slice(0, 8);
70
+ console.log(` ${pc.bold(`${c.bucket}/${c.basename}`)}: ${c.loserSourceIds.length + 1} sources export — using source [${winnerIdShort}]`);
71
+ console.log(` ${pc.dim('(winner)')} ${c.winnerSourcePath}`);
72
+ for (let i = 0; i < c.loserSourcePaths.length; i += 1) {
73
+ const loserIdShort = c.loserSourceIds[i].slice(0, 8);
74
+ console.log(` ${pc.dim(`(skipped, source ${loserIdShort})`)} ${c.loserSourcePaths[i]}`);
75
+ }
76
+ }
77
+ }
78
+ if (summary.merge) {
79
+ console.log(` hooks added: ${summary.merge.hooksAdded}`);
80
+ console.log(` permissions: ${summary.merge.permissionsCount}`);
81
+ if (summary.merge.backupPath) {
82
+ console.log(` settings backup: ${pc.dim(summary.merge.backupPath)}`);
83
+ }
84
+ }
85
+ console.log();
86
+ for (const s of summary.perSource) {
87
+ const sub = s.fromSubscriptionsFile ? '(subscribed)' : '(all categories)';
88
+ console.log(` ${pc.bold(s.name.padEnd(24))} ${s.artifactCount} artifacts · ${s.categories.join(', ') || '(none)'} ${pc.dim(sub)}`);
89
+ }
90
+ }
91
+ export function registerSkills(program) {
92
+ const skills = program.commands.find((c) => c.name() === 'skills') ?? program.command('skills').description('Manage skill sources and synchronization');
93
+ skills
94
+ .command('sync')
95
+ .description('Sync registered skill sources to ~/.claude/')
96
+ .option('--dry-run', 'Resolve artifacts but do not deploy or merge')
97
+ .option('--atlas-user <user>', 'Override atlas-user (defaults to ~/.claude/.atlas-user)')
98
+ .action(async (opts) => {
99
+ try {
100
+ const summary = await syncSkills({ dryRun: opts.dryRun, atlasUser: opts.atlasUser });
101
+ printSyncSummary(summary, !!opts.dryRun);
102
+ if (!opts.dryRun) {
103
+ printSuccess(`synced ${summary.sourceCount} source(s), ${summary.artifactCount} artifact(s)`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ printError(asMessage(err));
108
+ process.exitCode = 1;
109
+ }
110
+ });
111
+ skills
112
+ .command('diff')
113
+ .description('Show what `olam skills sync` would deploy (no on-disk changes)')
114
+ .option('--atlas-user <user>', 'Override atlas-user')
115
+ .action(async (opts) => {
116
+ try {
117
+ const summary = await syncSkills({ dryRun: true, atlasUser: opts.atlasUser });
118
+ printSyncSummary(summary, true);
119
+ }
120
+ catch (err) {
121
+ printError(asMessage(err));
122
+ process.exitCode = 1;
123
+ }
124
+ });
125
+ skills
126
+ .command('list')
127
+ .description('List artifacts currently deployed to ~/.claude/')
128
+ .action(() => {
129
+ const entries = listDeployed();
130
+ if (entries.length === 0) {
131
+ console.log(pc.dim('0 deployed artifact(s). Run "olam skills sync" first.'));
132
+ return;
133
+ }
134
+ const byBucket = new Map();
135
+ for (const e of entries) {
136
+ const list = byBucket.get(e.bucket) ?? [];
137
+ list.push(e);
138
+ byBucket.set(e.bucket, list);
139
+ }
140
+ printHeader(`${entries.length} deployed artifact(s)`);
141
+ for (const [bucket, list] of byBucket.entries()) {
142
+ console.log(` ${pc.bold(bucket)} (${list.length})`);
143
+ for (const e of list) {
144
+ const src = e.sourceId ? `[${e.sourceId}]` : pc.yellow('[unknown]');
145
+ console.log(` ${e.name.padEnd(40)} ${pc.dim(src)} → ${pc.dim(e.target)}`);
146
+ }
147
+ }
148
+ });
149
+ skills
150
+ .command('show')
151
+ .description('Show details for a deployed artifact (by name)')
152
+ .argument('<name>', 'Artifact name (e.g. plan-hard, codex-second-opinion.md)')
153
+ .action((name) => {
154
+ const entries = listDeployed();
155
+ const matches = entries.filter((e) => e.name === name);
156
+ if (matches.length === 0) {
157
+ printError(`no deployed artifact matches "${name}"`);
158
+ process.exitCode = 1;
159
+ return;
160
+ }
161
+ for (const e of matches) {
162
+ console.log(`${pc.bold('bucket:')} ${e.bucket}`);
163
+ console.log(`${pc.bold('name:')} ${e.name}`);
164
+ console.log(`${pc.bold('target:')} ${e.target}`);
165
+ console.log(`${pc.bold('source:')} ${e.sourceId ?? pc.dim('(unknown — not from a registered olam source)')}`);
166
+ console.log();
167
+ }
168
+ });
169
+ }
170
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AASD,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACvD,CAAC;IAEF,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACxC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBAAE,SAAS;gBACrC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,QAA4B,CAAC;gBACjC,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpD,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBACjC,QAAQ,GAAG,EAAE,CAAC;wBACd,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA+C,EAAE,MAAe;IACxF,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YACxF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,4EAA4E;IAC5E,qEAAqE;IACrE,iCAAiC;IACjC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CACT,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,mCAAmC,aAAa,GAAG,CAC/H,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,YAAY,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,oBAAoB,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,gBAAgB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAExJ,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,WAAW,EAAE,8CAA8C,CAAC;SACnE,MAAM,CAAC,qBAAqB,EAAE,yDAAyD,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,IAA8C,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACrF,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,YAAY,CAAC,UAAU,OAAO,CAAC,WAAW,eAAe,OAAO,CAAC,aAAa,cAAc,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAA4B,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9E,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,QAAQ,CAAC,QAAQ,EAAE,yDAAyD,CAAC;SAC7E,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,iCAAiC,IAAI,GAAG,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,+CAA+C,CAAC,EAAE,CAAC,CAAC;YAChH,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}