@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.
- package/dist/commands/doctor.d.ts +53 -23
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +117 -46
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/logs.d.ts +17 -3
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +38 -35
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/memory/bridge.d.ts +57 -0
- package/dist/commands/memory/bridge.d.ts.map +1 -0
- package/dist/commands/memory/bridge.js +156 -0
- package/dist/commands/memory/bridge.js.map +1 -0
- package/dist/commands/memory/index.d.ts +3 -0
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +10 -1
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/reclassify.d.ts +56 -0
- package/dist/commands/memory/reclassify.d.ts.map +1 -0
- package/dist/commands/memory/reclassify.js +177 -0
- package/dist/commands/memory/reclassify.js.map +1 -0
- package/dist/commands/memory/stats.d.ts +69 -0
- package/dist/commands/memory/stats.d.ts.map +1 -0
- package/dist/commands/memory/stats.js +164 -0
- package/dist/commands/memory/stats.js.map +1 -0
- package/dist/commands/skills-doctor.d.ts +14 -0
- package/dist/commands/skills-doctor.d.ts.map +1 -0
- package/dist/commands/skills-doctor.js +126 -0
- package/dist/commands/skills-doctor.js.map +1 -0
- package/dist/commands/skills-hook.d.ts +19 -0
- package/dist/commands/skills-hook.d.ts.map +1 -0
- package/dist/commands/skills-hook.js +99 -0
- package/dist/commands/skills-hook.js.map +1 -0
- package/dist/commands/skills-migrate-back.d.ts +21 -0
- package/dist/commands/skills-migrate-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-back.js +222 -0
- package/dist/commands/skills-migrate-back.js.map +1 -0
- package/dist/commands/skills-migrate.d.ts +33 -0
- package/dist/commands/skills-migrate.d.ts.map +1 -0
- package/dist/commands/skills-migrate.js +216 -0
- package/dist/commands/skills-migrate.js.map +1 -0
- package/dist/commands/skills-onboard.d.ts +26 -0
- package/dist/commands/skills-onboard.d.ts.map +1 -0
- package/dist/commands/skills-onboard.js +227 -0
- package/dist/commands/skills-onboard.js.map +1 -0
- package/dist/commands/skills-shadow-backups.d.ts +15 -0
- package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
- package/dist/commands/skills-shadow-backups.js +132 -0
- package/dist/commands/skills-shadow-backups.js.map +1 -0
- package/dist/commands/skills-source.d.ts +37 -0
- package/dist/commands/skills-source.d.ts.map +1 -0
- package/dist/commands/skills-source.js +431 -0
- package/dist/commands/skills-source.js.map +1 -0
- package/dist/commands/skills.d.ts +11 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +170 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +27 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +102 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/substrate-audit-log.d.ts +49 -0
- package/dist/commands/substrate-audit-log.d.ts.map +1 -0
- package/dist/commands/substrate-audit-log.js +148 -0
- package/dist/commands/substrate-audit-log.js.map +1 -0
- package/dist/commands/substrate.d.ts +60 -0
- package/dist/commands/substrate.d.ts.map +1 -0
- package/dist/commands/substrate.js +175 -0
- package/dist/commands/substrate.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +30 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +8394 -3876
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +69 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +146 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/health-probes.d.ts +72 -0
- package/dist/lib/health-probes.d.ts.map +1 -1
- package/dist/lib/health-probes.js +218 -0
- package/dist/lib/health-probes.js.map +1 -1
- package/dist/lib/instrumentation.d.ts +85 -0
- package/dist/lib/instrumentation.d.ts.map +1 -0
- package/dist/lib/instrumentation.js +104 -0
- package/dist/lib/instrumentation.js.map +1 -0
- package/dist/lib/kubectl-wrap.d.ts +59 -0
- package/dist/lib/kubectl-wrap.d.ts.map +1 -0
- package/dist/lib/kubectl-wrap.js +130 -0
- package/dist/lib/kubectl-wrap.js.map +1 -0
- package/dist/lib/manifest-refresh.d.ts +95 -0
- package/dist/lib/manifest-refresh.d.ts.map +1 -0
- package/dist/lib/manifest-refresh.js +222 -0
- package/dist/lib/manifest-refresh.js.map +1 -0
- package/dist/lib/port-forward.d.ts +101 -0
- package/dist/lib/port-forward.d.ts.map +1 -0
- package/dist/lib/port-forward.js +240 -0
- package/dist/lib/port-forward.js.map +1 -0
- package/dist/lib/upgrade-kubernetes.d.ts +77 -0
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
- package/dist/lib/upgrade-kubernetes.js +277 -0
- package/dist/lib/upgrade-kubernetes.js.map +1 -0
- package/dist/mcp-server.js +3328 -1166
- package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
- package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
- package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
- package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
- package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
- package/host-cp/k8s/manifests/60-service.yaml +22 -0
- package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
- package/host-cp/src/agent-runtime-trigger.mjs +74 -4
- package/host-cp/src/engine-identity.mjs +32 -0
- package/host-cp/src/plan-chat-service.mjs +31 -7
- package/host-cp/src/server.mjs +219 -9
- 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"}
|