coolhand-cli 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/api/last-sync.d.ts.map +1 -1
- package/dist/api/last-sync.js +2 -1
- package/dist/api/last-sync.js.map +1 -1
- package/dist/api/llm-reference-client.d.ts +25 -0
- package/dist/api/llm-reference-client.d.ts.map +1 -0
- package/dist/api/llm-reference-client.js +49 -0
- package/dist/api/llm-reference-client.js.map +1 -0
- package/dist/api/template-client.d.ts +19 -0
- package/dist/api/template-client.d.ts.map +1 -0
- package/dist/api/template-client.js +47 -0
- package/dist/api/template-client.js.map +1 -0
- package/dist/auth/open-browser.d.ts.map +1 -1
- package/dist/auth/open-browser.js +3 -1
- package/dist/auth/open-browser.js.map +1 -1
- package/dist/base-url.d.ts +7 -0
- package/dist/base-url.d.ts.map +1 -0
- package/dist/base-url.js +14 -0
- package/dist/base-url.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +325 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze-claude-sessions.d.ts.map +1 -1
- package/dist/commands/analyze-claude-sessions.js +10 -21
- package/dist/commands/analyze-claude-sessions.js.map +1 -1
- package/dist/commands/get-template.d.ts +3 -0
- package/dist/commands/get-template.d.ts.map +1 -0
- package/dist/commands/get-template.js +66 -0
- package/dist/commands/get-template.js.map +1 -0
- package/dist/commands/list-referenced-file-sessions.d.ts +3 -0
- package/dist/commands/list-referenced-file-sessions.d.ts.map +1 -0
- package/dist/commands/list-referenced-file-sessions.js +44 -0
- package/dist/commands/list-referenced-file-sessions.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +3 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/map-claude-projects.d.ts +22 -0
- package/dist/commands/map-claude-projects.d.ts.map +1 -0
- package/dist/commands/map-claude-projects.js +302 -0
- package/dist/commands/map-claude-projects.js.map +1 -0
- package/dist/commands/search-referenced-files.d.ts +3 -0
- package/dist/commands/search-referenced-files.d.ts.map +1 -0
- package/dist/commands/search-referenced-files.js +53 -0
- package/dist/commands/search-referenced-files.js.map +1 -0
- package/dist/commands/search-templates.d.ts +3 -0
- package/dist/commands/search-templates.d.ts.map +1 -0
- package/dist/commands/search-templates.js +63 -0
- package/dist/commands/search-templates.js.map +1 -0
- package/dist/commands/sync-skills.d.ts +18 -0
- package/dist/commands/sync-skills.d.ts.map +1 -0
- package/dist/commands/sync-skills.js +222 -0
- package/dist/commands/sync-skills.js.map +1 -0
- package/dist/commands/upload-client-file.d.ts +3 -0
- package/dist/commands/upload-client-file.d.ts.map +1 -0
- package/dist/commands/upload-client-file.js +43 -0
- package/dist/commands/upload-client-file.js.map +1 -0
- package/dist/commands/wildcard.d.ts +6 -6
- package/dist/commands/wildcard.d.ts.map +1 -1
- package/dist/commands/wildcard.js +14 -11
- package/dist/commands/wildcard.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +31 -8
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/log-request.d.ts +4 -0
- package/dist/log-request.d.ts.map +1 -1
- package/dist/log-request.js +8 -1
- package/dist/log-request.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +30 -1
- package/dist/logger.js.map +1 -1
- package/dist/proxy/certs.d.ts.map +1 -1
- package/dist/proxy/certs.js +145 -5
- package/dist/proxy/certs.js.map +1 -1
- package/dist/proxy/interceptor.d.ts +8 -1
- package/dist/proxy/interceptor.d.ts.map +1 -1
- package/dist/proxy/interceptor.js +36 -3
- package/dist/proxy/interceptor.js.map +1 -1
- package/dist/proxy/proxy.d.ts.map +1 -1
- package/dist/proxy/proxy.js +75 -6
- package/dist/proxy/proxy.js.map +1 -1
- package/dist/proxy/wrap-runner.d.ts +2 -17
- package/dist/proxy/wrap-runner.d.ts.map +1 -1
- package/dist/proxy/wrap-runner.js +13 -29
- package/dist/proxy/wrap-runner.js.map +1 -1
- package/dist/sessions/claude-scanner.d.ts +3 -0
- package/dist/sessions/claude-scanner.d.ts.map +1 -1
- package/dist/sessions/claude-scanner.js +8 -0
- package/dist/sessions/claude-scanner.js.map +1 -1
- package/dist/sessions/cowork-scanner.d.ts.map +1 -1
- package/dist/sessions/cowork-scanner.js +6 -1
- package/dist/sessions/cowork-scanner.js.map +1 -1
- package/dist/sessions/redact-secrets.d.ts.map +1 -1
- package/dist/sessions/redact-secrets.js +13 -2
- package/dist/sessions/redact-secrets.js.map +1 -1
- package/dist/sessions/session-filter.d.ts +3 -1
- package/dist/sessions/session-filter.d.ts.map +1 -1
- package/dist/sessions/session-filter.js +9 -3
- package/dist/sessions/session-filter.js.map +1 -1
- package/dist/skills/skill-scanner.d.ts +55 -0
- package/dist/skills/skill-scanner.d.ts.map +1 -0
- package/dist/skills/skill-scanner.js +132 -0
- package/dist/skills/skill-scanner.js.map +1 -0
- package/dist/skills/skill-state.d.ts +29 -0
- package/dist/skills/skill-state.d.ts.map +1 -0
- package/dist/skills/skill-state.js +111 -0
- package/dist/skills/skill-state.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/upload-client-file.d.ts +31 -0
- package/dist/upload-client-file.d.ts.map +1 -0
- package/dist/upload-client-file.js +81 -0
- package/dist/upload-client-file.js.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/win-spawn.d.ts +6 -0
- package/dist/win-spawn.d.ts.map +1 -0
- package/dist/win-spawn.js +32 -0
- package/dist/win-spawn.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
|
+
/** Priority order when picking the canonical file within a (skillName, contentHash) group —
|
|
5
|
+
* lower index wins. An authored, user-facing copy is preferred over an installed runtime copy
|
|
6
|
+
* of the identical content, since it's the more meaningful "source" location to cite. */
|
|
7
|
+
const SOURCE_KIND_PRIORITY = ['authored', 'claude-code', 'installed', 'custom'];
|
|
8
|
+
/**
|
|
9
|
+
* Recursively find every `SKILL.md` file under `root`. Any `fs.readdir` failure (missing
|
|
10
|
+
* directory, permissions, etc.) is treated as "zero matches from this root" — not fatal — since
|
|
11
|
+
* a machine commonly won't have all of `~/Documents/Claude`, the Cowork sessions directory, or
|
|
12
|
+
* `~/.claude/skills` present at once.
|
|
13
|
+
*/
|
|
14
|
+
async function findSkillFilesInRoot(root) {
|
|
15
|
+
let names;
|
|
16
|
+
try {
|
|
17
|
+
names = await fs.readdir(root, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return names.filter((name) => path.basename(name) === 'SKILL.md').map((name) => path.join(root, name));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract `name:`/`description:` from a SKILL.md's YAML frontmatter block (`---\n...\n---` at
|
|
26
|
+
* the top of the file) with a small regex extractor rather than a YAML dependency — `js-yaml`
|
|
27
|
+
* is only an `overrides` pin in package.json (a transitive-dependency version pin), not a direct
|
|
28
|
+
* dependency, so parsing full YAML here would require adding one for a single flat key lookup.
|
|
29
|
+
* Values may be quoted or bare; quotes are stripped. Returns {} when there's no frontmatter block
|
|
30
|
+
* or it has no `name:`/`description:` field.
|
|
31
|
+
*/
|
|
32
|
+
export function parseSkillFrontmatter(content) {
|
|
33
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
34
|
+
if (!match) {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
const block = match[1];
|
|
38
|
+
const nameMatch = block.match(/^name:\s*["']?(.+?)["']?\s*$/m);
|
|
39
|
+
const descriptionMatch = block.match(/^description:\s*["']?(.+?)["']?\s*$/m);
|
|
40
|
+
const result = {};
|
|
41
|
+
if (nameMatch) {
|
|
42
|
+
result.name = nameMatch[1];
|
|
43
|
+
}
|
|
44
|
+
if (descriptionMatch) {
|
|
45
|
+
result.description = descriptionMatch[1];
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Discover SKILL.md files across every root, reading and hashing each one. A file that can't be
|
|
51
|
+
* read (permissions, a race with deletion, etc.) is skipped with a warning via `onWarn` rather
|
|
52
|
+
* than aborting the whole scan — same convention as `map-claude-projects`' directory walk.
|
|
53
|
+
*/
|
|
54
|
+
export async function findSkillFiles(roots, onWarn) {
|
|
55
|
+
const discovered = [];
|
|
56
|
+
for (const { root, sourceKind } of roots) {
|
|
57
|
+
const filePaths = await findSkillFilesInRoot(root);
|
|
58
|
+
for (const filePath of filePaths) {
|
|
59
|
+
let stat;
|
|
60
|
+
let content;
|
|
61
|
+
try {
|
|
62
|
+
stat = await fs.stat(filePath);
|
|
63
|
+
if (!stat.isFile()) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
content = await fs.readFile(filePath);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
onWarn?.(`Skipping unreadable skill file "${filePath}": ${err.message}`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const contentHash = createHash('sha256').update(content).digest('hex');
|
|
73
|
+
const frontmatter = parseSkillFrontmatter(content.toString('utf8'));
|
|
74
|
+
const skillName = frontmatter.name ?? path.basename(path.dirname(filePath));
|
|
75
|
+
discovered.push({
|
|
76
|
+
filePath,
|
|
77
|
+
sourceKind,
|
|
78
|
+
root,
|
|
79
|
+
mtimeMs: stat.mtimeMs,
|
|
80
|
+
contentHash,
|
|
81
|
+
skillName,
|
|
82
|
+
description: frontmatter.description,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return discovered;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Group discovered files by `(skillName, contentHash)` — not skill name alone, so a genuinely
|
|
90
|
+
* edited authored copy is never silently squashed by a stale installed duplicate of the same
|
|
91
|
+
* name — and pick one canonical file per group to actually upload. Within a group, prefer
|
|
92
|
+
* (in order): `sourceKind` priority (authored > claude-code > installed > custom), then newest
|
|
93
|
+
* `mtimeMs`, then path ascending for a deterministic tie-break.
|
|
94
|
+
*/
|
|
95
|
+
export function dedupeSkillFiles(files) {
|
|
96
|
+
const groups = new Map();
|
|
97
|
+
for (const file of files) {
|
|
98
|
+
const key = JSON.stringify([file.skillName, file.contentHash]);
|
|
99
|
+
const group = groups.get(key);
|
|
100
|
+
if (group) {
|
|
101
|
+
group.push(file);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
groups.set(key, [file]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const candidates = [];
|
|
108
|
+
for (const group of groups.values()) {
|
|
109
|
+
const sorted = [...group].sort((a, b) => {
|
|
110
|
+
const priorityDiff = SOURCE_KIND_PRIORITY.indexOf(a.sourceKind) - SOURCE_KIND_PRIORITY.indexOf(b.sourceKind);
|
|
111
|
+
if (priorityDiff !== 0) {
|
|
112
|
+
return priorityDiff;
|
|
113
|
+
}
|
|
114
|
+
if (b.mtimeMs !== a.mtimeMs) {
|
|
115
|
+
return b.mtimeMs - a.mtimeMs;
|
|
116
|
+
}
|
|
117
|
+
return a.filePath.localeCompare(b.filePath);
|
|
118
|
+
});
|
|
119
|
+
const chosen = sorted[0];
|
|
120
|
+
candidates.push({
|
|
121
|
+
skillName: chosen.skillName,
|
|
122
|
+
contentHash: chosen.contentHash,
|
|
123
|
+
filePath: chosen.filePath,
|
|
124
|
+
sourceKind: chosen.sourceKind,
|
|
125
|
+
root: chosen.root,
|
|
126
|
+
description: chosen.description,
|
|
127
|
+
duplicateCount: group.length,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return candidates;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=skill-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-scanner.js","sourceRoot":"","sources":["../../src/skills/skill-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local record of which skills have already been uploaded to Coolhand for each client, so
|
|
3
|
+
* re-running `sync-skills` does not re-upload a skill whose content hasn't changed — but DOES
|
|
4
|
+
* re-upload one whose authored content changed since last time.
|
|
5
|
+
*
|
|
6
|
+
* Kept as its own file (not merged into `capture-state.json`) because the tracking model differs:
|
|
7
|
+
* a session transcript accumulates turns over time (tracked by a growing count), while a skill
|
|
8
|
+
* file is a monolithic blob (tracked by a simple content-hash comparison). Keyed per client id,
|
|
9
|
+
* since the same skill may legitimately be uploaded for more than one client.
|
|
10
|
+
*/
|
|
11
|
+
export interface SkillUploadRecord {
|
|
12
|
+
contentHash: string;
|
|
13
|
+
uploadedAt: string;
|
|
14
|
+
clientFileId?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SkillState {
|
|
17
|
+
version: number;
|
|
18
|
+
uploaded: Record<string, Record<string, SkillUploadRecord>>;
|
|
19
|
+
}
|
|
20
|
+
export declare function skillStatePath(): string;
|
|
21
|
+
export declare function loadSkillState(): Promise<SkillState>;
|
|
22
|
+
/** The upload record for this exact (skillName, contentHash) pair and client, or undefined if
|
|
23
|
+
* this exact content has never been uploaded under this name for this client — a differently-
|
|
24
|
+
* hashed prior upload of the same skillName does not count as a match. */
|
|
25
|
+
export declare function getUploadRecord(state: SkillState, clientId: string, skillName: string, contentHash: string): SkillUploadRecord | undefined;
|
|
26
|
+
/** Record that this exact (skillName, contentHash) pair has now been uploaded for this client. */
|
|
27
|
+
export declare function recordUpload(state: SkillState, clientId: string, skillName: string, contentHash: string, record: SkillUploadRecord): void;
|
|
28
|
+
export declare function saveSkillState(state: SkillState): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=skill-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-state.d.ts","sourceRoot":"","sources":["../../src/skills/skill-state.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;CAC7D;AAsBD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AA0CD,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAoB1D;AAED;;2EAE2E;AAC3E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,iBAAiB,GAAG,SAAS,CAE/B;AAED,kGAAkG;AAClG,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAGN;AAWD,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { configDir, atomicWriteFile } from '../config.js';
|
|
4
|
+
import { CliError } from '../errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* Composite key for the per-client `uploaded` map: `(skillName, contentHash)`, not skillName
|
|
7
|
+
* alone. `dedupeSkillFiles` (skill-scanner.ts) can legitimately produce two candidates that share
|
|
8
|
+
* a skillName but have different content — e.g. a just-edited authored copy alongside a stale
|
|
9
|
+
* `installed` duplicate of the pre-edit content that hasn't been cleaned up yet. Keying state by
|
|
10
|
+
* skillName alone would make the second recorded upload overwrite the first's record, so on every
|
|
11
|
+
* later run whichever candidate's hash no longer matches the single stored one would be
|
|
12
|
+
* re-uploaded and immediately overwrite the record again — an unbounded re-upload loop for
|
|
13
|
+
* exactly the scenario the (skillName, contentHash) dedup grouping exists to handle correctly.
|
|
14
|
+
* Keying state at the same granularity as the candidates themselves avoids that collision.
|
|
15
|
+
*/
|
|
16
|
+
function stateKey(skillName, contentHash) {
|
|
17
|
+
return JSON.stringify([skillName, contentHash]);
|
|
18
|
+
}
|
|
19
|
+
const STATE_VERSION = 1;
|
|
20
|
+
const STATE_FILENAME = 'skills-state.json';
|
|
21
|
+
const DIR_MODE = 0o700;
|
|
22
|
+
const FILE_MODE = 0o600;
|
|
23
|
+
export function skillStatePath() {
|
|
24
|
+
return path.join(configDir(), STATE_FILENAME);
|
|
25
|
+
}
|
|
26
|
+
function emptyState() {
|
|
27
|
+
return { version: STATE_VERSION, uploaded: {} };
|
|
28
|
+
}
|
|
29
|
+
function toUploadRecord(value) {
|
|
30
|
+
if (!value || typeof value !== 'object') {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const entry = value;
|
|
34
|
+
if (typeof entry.contentHash !== 'string' || typeof entry.uploadedAt !== 'string') {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
contentHash: entry.contentHash,
|
|
39
|
+
uploadedAt: entry.uploadedAt,
|
|
40
|
+
...(typeof entry.clientFileId === 'string' && { clientFileId: entry.clientFileId }),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function normalizeUploaded(raw) {
|
|
44
|
+
if (!raw || typeof raw !== 'object') {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const [clientId, value] of Object.entries(raw)) {
|
|
49
|
+
if (!value || typeof value !== 'object') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const skills = {};
|
|
53
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
54
|
+
const record = toUploadRecord(entry);
|
|
55
|
+
if (record) {
|
|
56
|
+
skills[key] = record;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
out[clientId] = skills;
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
export async function loadSkillState() {
|
|
64
|
+
const filePath = skillStatePath();
|
|
65
|
+
let raw;
|
|
66
|
+
try {
|
|
67
|
+
raw = await fs.readFile(filePath, 'utf8');
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (err.code === 'ENOENT') {
|
|
71
|
+
return emptyState();
|
|
72
|
+
}
|
|
73
|
+
throw new CliError('CONFIG_READ_FAILED', `Failed to read ${filePath}: ${err.message}`);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(raw);
|
|
77
|
+
return {
|
|
78
|
+
version: STATE_VERSION,
|
|
79
|
+
uploaded: normalizeUploaded(parsed.uploaded),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new CliError('CONFIG_READ_FAILED', `Skill state at ${filePath} is not valid JSON: ${err.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** The upload record for this exact (skillName, contentHash) pair and client, or undefined if
|
|
87
|
+
* this exact content has never been uploaded under this name for this client — a differently-
|
|
88
|
+
* hashed prior upload of the same skillName does not count as a match. */
|
|
89
|
+
export function getUploadRecord(state, clientId, skillName, contentHash) {
|
|
90
|
+
return state.uploaded[clientId]?.[stateKey(skillName, contentHash)];
|
|
91
|
+
}
|
|
92
|
+
/** Record that this exact (skillName, contentHash) pair has now been uploaded for this client. */
|
|
93
|
+
export function recordUpload(state, clientId, skillName, contentHash, record) {
|
|
94
|
+
const skills = state.uploaded[clientId] ?? (state.uploaded[clientId] = {});
|
|
95
|
+
skills[stateKey(skillName, contentHash)] = record;
|
|
96
|
+
}
|
|
97
|
+
async function ensureDir(dir) {
|
|
98
|
+
await fs.mkdir(dir, { recursive: true, mode: DIR_MODE });
|
|
99
|
+
try {
|
|
100
|
+
await fs.chmod(dir, DIR_MODE);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// POSIX-only — Windows rejects chmod with this mode; ignore.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function saveSkillState(state) {
|
|
107
|
+
const filePath = skillStatePath();
|
|
108
|
+
await ensureDir(path.dirname(filePath));
|
|
109
|
+
await atomicWriteFile(filePath, `${JSON.stringify(state, null, 2)}\n`, FILE_MODE);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=skill-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-state.js","sourceRoot":"","sources":["../../src/skills/skill-state.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -99,6 +99,25 @@ export interface SearchLogsOptions {
|
|
|
99
99
|
json?: boolean;
|
|
100
100
|
clientId?: string;
|
|
101
101
|
}
|
|
102
|
+
export interface SearchTemplatesOptions {
|
|
103
|
+
/** Literal, case-insensitive substring match on the template name. `%` and `_` are escaped
|
|
104
|
+
* server-side, so they match themselves and must not be escaped again here. */
|
|
105
|
+
search?: string;
|
|
106
|
+
workloadId?: string;
|
|
107
|
+
status?: 'draft' | 'published' | 'failure';
|
|
108
|
+
includeDeprecated?: boolean;
|
|
109
|
+
/** Include the `Unmatched` / `Ignored API Calls` buckets, hidden by default. */
|
|
110
|
+
includeSystem?: boolean;
|
|
111
|
+
page?: number;
|
|
112
|
+
perPage?: number;
|
|
113
|
+
json?: boolean;
|
|
114
|
+
clientId?: string;
|
|
115
|
+
}
|
|
116
|
+
export interface GetTemplateOptions {
|
|
117
|
+
id: string;
|
|
118
|
+
json?: boolean;
|
|
119
|
+
clientId?: string;
|
|
120
|
+
}
|
|
102
121
|
export interface SearchOptimizationsOptions {
|
|
103
122
|
status?: string;
|
|
104
123
|
type?: string;
|
|
@@ -151,6 +170,46 @@ export interface AnalyzeClaudeSessionsOptions {
|
|
|
151
170
|
/** Never upload sessions whose project folder matches one of these (--exclude-project). */
|
|
152
171
|
excludeProjects?: string[];
|
|
153
172
|
}
|
|
173
|
+
export interface UploadClientFileOptions {
|
|
174
|
+
/** Local path of the file to upload (positional arg). */
|
|
175
|
+
filePath: string;
|
|
176
|
+
clientId?: string;
|
|
177
|
+
json?: boolean;
|
|
178
|
+
/** Size and validate the file without uploading. */
|
|
179
|
+
dryRun?: boolean;
|
|
180
|
+
/** Display name for the client file; defaults to the file's basename. */
|
|
181
|
+
name?: string;
|
|
182
|
+
fileType?: 'slide_deck' | 'report' | 'document';
|
|
183
|
+
description?: string;
|
|
184
|
+
}
|
|
185
|
+
export interface MapClaudeProjectsOptions {
|
|
186
|
+
clientId?: string;
|
|
187
|
+
json?: boolean;
|
|
188
|
+
/** Build and size the map without uploading. */
|
|
189
|
+
dryRun?: boolean;
|
|
190
|
+
/** Override for the search root (--root); defaults to the home directory. */
|
|
191
|
+
root?: string;
|
|
192
|
+
/** Also write the generated markdown report to this local path, for inspection. */
|
|
193
|
+
output?: string;
|
|
194
|
+
/** Skip the confirmation prompt when --output already exists. */
|
|
195
|
+
force?: boolean;
|
|
196
|
+
}
|
|
197
|
+
export interface SyncSkillsOptions {
|
|
198
|
+
clientId?: string;
|
|
199
|
+
json?: boolean;
|
|
200
|
+
/** Scan, dedupe, and report counts without uploading or touching skills-state.json. */
|
|
201
|
+
dryRun?: boolean;
|
|
202
|
+
/** Search only this path (recursively) instead of the 3 default roots (--root). */
|
|
203
|
+
root?: string;
|
|
204
|
+
/** Restrict the default scan to these sourceKinds: authored, installed, claude-code (--source, repeatable). */
|
|
205
|
+
sources?: string[];
|
|
206
|
+
/** Only upload skills whose name matches one of these (--skill, repeatable). */
|
|
207
|
+
skills?: string[];
|
|
208
|
+
/** Never upload skills whose name matches one of these (--exclude-skill, repeatable). */
|
|
209
|
+
excludeSkills?: string[];
|
|
210
|
+
/** Bypass the unchanged-content skip in skills-state.json; re-upload every matched skill. */
|
|
211
|
+
force?: boolean;
|
|
212
|
+
}
|
|
154
213
|
export interface SearchFeedbackOptions {
|
|
155
214
|
sentiment?: 'positive' | 'negative' | 'neutral';
|
|
156
215
|
search?: string;
|
|
@@ -173,6 +232,24 @@ export interface GetFeedbackOptions {
|
|
|
173
232
|
json?: boolean;
|
|
174
233
|
clientId?: string;
|
|
175
234
|
}
|
|
235
|
+
export interface SearchReferencedFilesOptions {
|
|
236
|
+
filePathContains?: string;
|
|
237
|
+
createdAtGteq?: string;
|
|
238
|
+
createdAtLteq?: string;
|
|
239
|
+
page?: number;
|
|
240
|
+
perPage?: number;
|
|
241
|
+
json?: boolean;
|
|
242
|
+
clientId?: string;
|
|
243
|
+
}
|
|
244
|
+
export interface ListReferencedFileSessionsOptions {
|
|
245
|
+
/** Exact file_path to look up. Required — checked in the CLI flag layer, not left to the
|
|
246
|
+
* server's 422, since this is a flag the CLI's own parser can validate before any request. */
|
|
247
|
+
filePath: string;
|
|
248
|
+
page?: number;
|
|
249
|
+
perPage?: number;
|
|
250
|
+
json?: boolean;
|
|
251
|
+
clientId?: string;
|
|
252
|
+
}
|
|
176
253
|
export interface ComplaintBoxOptions {
|
|
177
254
|
complaint: string;
|
|
178
255
|
agentName: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+SA,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type CoolhandClientFileResponse } from 'coolhand-node';
|
|
2
|
+
export interface UploadClientFilePayload {
|
|
3
|
+
filePath: string;
|
|
4
|
+
/** Display name for the client file; defaults to the file's basename. */
|
|
5
|
+
name?: string;
|
|
6
|
+
fileType?: 'slide_deck' | 'report' | 'document';
|
|
7
|
+
description?: string;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface UploadClientFileResult {
|
|
11
|
+
status: 'uploaded' | 'dry-run';
|
|
12
|
+
sizeBytes: number;
|
|
13
|
+
response: CoolhandClientFileResponse | null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read a local file and upload it as a Coolhand client file via `Coolhand#uploadClientFile`
|
|
17
|
+
* (private-key tier, like `getLogClient`/`getFeedbackClient` — the public key used by
|
|
18
|
+
* `logRequest`/`createFeedback` 401s here). Shared core used by both the `upload-client-file`
|
|
19
|
+
* command and `map-claude-projects` (which uploads a generated markdown report through the same
|
|
20
|
+
* path rather than duplicating auth/upload logic).
|
|
21
|
+
*
|
|
22
|
+
* Resolution mirrors `log-request.ts`: `resolveClientForDryRun` tolerates "no clients configured
|
|
23
|
+
* at all" only when `opts.dryRun` is set, so `--dry-run` works fully logged-out. `--dry-run` also
|
|
24
|
+
* tolerates a resolved client that hasn't granted a private key yet (the default `coolhand login`
|
|
25
|
+
* flow only grants the public key) — only a real, non-dry-run upload requires one.
|
|
26
|
+
*/
|
|
27
|
+
export declare function uploadClientFile(payload: UploadClientFilePayload, opts?: {
|
|
28
|
+
clientId?: string;
|
|
29
|
+
dryRun?: boolean;
|
|
30
|
+
}): Promise<UploadClientFileResult>;
|
|
31
|
+
//# sourceMappingURL=upload-client-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-client-file.d.ts","sourceRoot":"","sources":["../src/upload-client-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAU1E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAAC;CAC7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,EAChC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,OAAO,CAAC,sBAAsB,CAAC,CAoEjC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { Coolhand } from 'coolhand-node';
|
|
4
|
+
import { CliError } from './errors.js';
|
|
5
|
+
import { loadConfig, resolveClientForDryRun } from './config.js';
|
|
6
|
+
/** Matches coolhand-node's own documented `uploadClientFile` guidance ("File contents, up to
|
|
7
|
+
* 20MB") — checked client-side so an oversize file fails fast with an actionable message
|
|
8
|
+
* locally rather than hang on a slow upload only to be rejected server-side. */
|
|
9
|
+
const MAX_UPLOAD_BYTES = 20 * 1024 * 1024;
|
|
10
|
+
const MAX_UPLOAD_MB = MAX_UPLOAD_BYTES / (1024 * 1024);
|
|
11
|
+
/**
|
|
12
|
+
* Read a local file and upload it as a Coolhand client file via `Coolhand#uploadClientFile`
|
|
13
|
+
* (private-key tier, like `getLogClient`/`getFeedbackClient` — the public key used by
|
|
14
|
+
* `logRequest`/`createFeedback` 401s here). Shared core used by both the `upload-client-file`
|
|
15
|
+
* command and `map-claude-projects` (which uploads a generated markdown report through the same
|
|
16
|
+
* path rather than duplicating auth/upload logic).
|
|
17
|
+
*
|
|
18
|
+
* Resolution mirrors `log-request.ts`: `resolveClientForDryRun` tolerates "no clients configured
|
|
19
|
+
* at all" only when `opts.dryRun` is set, so `--dry-run` works fully logged-out. `--dry-run` also
|
|
20
|
+
* tolerates a resolved client that hasn't granted a private key yet (the default `coolhand login`
|
|
21
|
+
* flow only grants the public key) — only a real, non-dry-run upload requires one.
|
|
22
|
+
*/
|
|
23
|
+
export async function uploadClientFile(payload, opts = {}) {
|
|
24
|
+
const cfg = await loadConfig();
|
|
25
|
+
const entry = await resolveClientForDryRun(cfg, opts.clientId);
|
|
26
|
+
if (!entry && !opts.dryRun) {
|
|
27
|
+
throw new CliError('NOT_CONFIGURED', 'Not logged in. Run `coolhand login` to authenticate.');
|
|
28
|
+
}
|
|
29
|
+
if (entry && !entry.private_key && !opts.dryRun) {
|
|
30
|
+
throw new CliError('NO_PRIVATE_KEY', "No private key configured. Run 'coolhand login --scope private' first.");
|
|
31
|
+
}
|
|
32
|
+
let stat;
|
|
33
|
+
try {
|
|
34
|
+
stat = await fs.stat(payload.filePath);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
throw new CliError('INVALID_ARGS', `Cannot read "${payload.filePath}": ${err.message}`);
|
|
38
|
+
}
|
|
39
|
+
if (!stat.isFile()) {
|
|
40
|
+
throw new CliError('INVALID_ARGS', `"${payload.filePath}" is not a file.`);
|
|
41
|
+
}
|
|
42
|
+
if (stat.size > MAX_UPLOAD_BYTES) {
|
|
43
|
+
const mb = (stat.size / (1024 * 1024)).toFixed(1);
|
|
44
|
+
throw new CliError('INVALID_ARGS', `"${payload.filePath}" is ${mb}MB, exceeding the ${MAX_UPLOAD_MB}MB client_files upload cap.`);
|
|
45
|
+
}
|
|
46
|
+
if (!entry || !entry.private_key) {
|
|
47
|
+
// Dry run with no resolvable client, or a resolved client that hasn't granted a private key
|
|
48
|
+
// yet — report the size but never attempt a network call (and never construct Coolhand with
|
|
49
|
+
// an undefined apiKey).
|
|
50
|
+
return { status: 'dry-run', sizeBytes: stat.size, response: null };
|
|
51
|
+
}
|
|
52
|
+
let coolhand;
|
|
53
|
+
try {
|
|
54
|
+
coolhand = new Coolhand({ apiKey: entry.private_key, baseUrl: entry.base_url, silent: true, dryRun: opts.dryRun });
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
throw new CliError('INVALID_BASE_URL', `Invalid base_url for client: ${entry.base_url} (${err.message})`);
|
|
58
|
+
}
|
|
59
|
+
const file = await fs.readFile(payload.filePath);
|
|
60
|
+
const name = payload.name ?? path.basename(payload.filePath);
|
|
61
|
+
const filename = path.basename(payload.filePath);
|
|
62
|
+
const response = await coolhand.uploadClientFile({
|
|
63
|
+
name,
|
|
64
|
+
filename,
|
|
65
|
+
file,
|
|
66
|
+
...(payload.fileType && { file_type: payload.fileType }),
|
|
67
|
+
...(payload.description && { description: payload.description }),
|
|
68
|
+
...(payload.metadata && { metadata: payload.metadata }),
|
|
69
|
+
});
|
|
70
|
+
if (opts.dryRun) {
|
|
71
|
+
// The SDK's own dryRun option short-circuits uploadClientFile to null before any network
|
|
72
|
+
// call — checked here (before the null-means-failure check below) so that expected result
|
|
73
|
+
// is never misreported as a failed upload.
|
|
74
|
+
return { status: 'dry-run', sizeBytes: stat.size, response: null };
|
|
75
|
+
}
|
|
76
|
+
if (response === null) {
|
|
77
|
+
throw new CliError('UPLOAD_ERROR', `Upload of "${payload.filePath}" failed.`);
|
|
78
|
+
}
|
|
79
|
+
return { status: 'uploaded', sizeBytes: stat.size, response };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=upload-client-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-client-file.js","sourceRoot":"","sources":["../src/upload-client-file.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Auto-generated from package.json — do not edit manually.
|
|
3
3
|
* Run `npm run sync-version` or `npm run build` to regenerate.
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "0.
|
|
5
|
+
export declare const PACKAGE_VERSION = "0.11.0";
|
|
6
6
|
export declare const PACKAGE_NAME = "coolhand-cli";
|
|
7
7
|
/**
|
|
8
8
|
* Full package identifier
|
|
9
9
|
*/
|
|
10
|
-
export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.
|
|
10
|
+
export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.11.0";
|
|
11
11
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,kBAAkB,wBAAuC,CAAC"}
|
package/dist/version.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Auto-generated from package.json — do not edit manually.
|
|
3
3
|
* Run `npm run sync-version` or `npm run build` to regenerate.
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '0.
|
|
5
|
+
export const PACKAGE_VERSION = '0.11.0';
|
|
6
6
|
export const PACKAGE_NAME = 'coolhand-cli';
|
|
7
7
|
/**
|
|
8
8
|
* Full package identifier
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,YAAY,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"win-spawn.d.ts","sourceRoot":"","sources":["../src/win-spawn.ts"],"names":[],"mappings":"AAoBA,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,kBAAmB,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,wBAAwB,CAAC,EAAE,IAAI,CAAA;CAAE,CAWvE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On Windows, .cmd shims cannot be spawned without a shell. Rather than using
|
|
3
|
+
* shell:true (which forwards args as an unquoted string to cmd.exe, enabling
|
|
4
|
+
* metacharacter injection), we invoke cmd.exe /d /s /c directly with the command
|
|
5
|
+
* and each arg double-quoted and windowsVerbatimArguments:true so Node does not
|
|
6
|
+
* re-quote them.
|
|
7
|
+
*
|
|
8
|
+
* Quoting rules applied to the command and every arg:
|
|
9
|
+
* 1. Double trailing backslashes (a trailing \ would escape the closing ")
|
|
10
|
+
* 2. Escape embedded " as ""
|
|
11
|
+
* 3. Escape % as %% to prevent cmd.exe environment-variable expansion
|
|
12
|
+
* 4. Wrap in double quotes unconditionally
|
|
13
|
+
*/
|
|
14
|
+
function escapeForCmdExe(s) {
|
|
15
|
+
return s
|
|
16
|
+
.replace(/(\\+)$/, '$1$1') // double trailing backslashes
|
|
17
|
+
.replace(/"/g, '""') // escape embedded quotes
|
|
18
|
+
.replace(/%/g, '%%'); // prevent env-var expansion
|
|
19
|
+
}
|
|
20
|
+
export function resolveWrapSpawn(cmd, args, platform = process.platform) {
|
|
21
|
+
if (platform !== 'win32') {
|
|
22
|
+
return { cmd, spawnArgs: args };
|
|
23
|
+
}
|
|
24
|
+
const escapedCmd = `"${escapeForCmdExe(cmd)}"`;
|
|
25
|
+
const escapedArgs = args.map((a) => `"${escapeForCmdExe(a)}"`);
|
|
26
|
+
return {
|
|
27
|
+
cmd: process.env['ComSpec'] ?? 'cmd.exe',
|
|
28
|
+
spawnArgs: ['/d', '/s', '/c', [escapedCmd, ...escapedArgs].join(' ')],
|
|
29
|
+
windowsVerbatimArguments: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=win-spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"win-spawn.js","sourceRoot":"","sources":["../src/win-spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC;SACL,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAE,8BAA8B;SACzD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAS,yBAAyB;SACrD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAQ,4BAA4B;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,IAAc,EACd,QAAQ,GAAG,OAAO,CAAC,QAAQ;IAE3B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS;QACxC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,wBAAwB,EAAE,IAAI;KAC/B,CAAC;AACJ,CAAC"}
|