resurf 1.0.2 → 1.0.3
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/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -444,6 +444,19 @@ function isEmbeddableVideo(mime) {
|
|
|
444
444
|
function resolveAttachmentPath(vaultPath, relativePath) {
|
|
445
445
|
return path3.resolve(vaultPath, relativePath);
|
|
446
446
|
}
|
|
447
|
+
function captureWithAbsoluteAttachmentPaths(capture, vaultPath) {
|
|
448
|
+
const content = capture.content;
|
|
449
|
+
if (!content || content.type !== "attachment" || typeof content.path !== "string") {
|
|
450
|
+
return capture;
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
...capture,
|
|
454
|
+
content: {
|
|
455
|
+
...content,
|
|
456
|
+
path: resolveAttachmentPath(vaultPath, content.path)
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
}
|
|
447
460
|
function formatSize(bytes) {
|
|
448
461
|
if (bytes < 1024) return `${bytes} B`;
|
|
449
462
|
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
@@ -503,7 +516,10 @@ function formatCaptureList(captures, total, format) {
|
|
|
503
516
|
return lines.join("\n");
|
|
504
517
|
}
|
|
505
518
|
function formatCapture(capture, format, vaultPath) {
|
|
506
|
-
if (format === "json")
|
|
519
|
+
if (format === "json") {
|
|
520
|
+
const out = vaultPath ? captureWithAbsoluteAttachmentPaths(capture, vaultPath) : capture;
|
|
521
|
+
return JSON.stringify(out, null, 2);
|
|
522
|
+
}
|
|
507
523
|
if (format === "md") {
|
|
508
524
|
const lines2 = [];
|
|
509
525
|
const title = capture.title || "Untitled Capture";
|
|
@@ -931,7 +947,9 @@ async function cmdExport(reader, args, format) {
|
|
|
931
947
|
const captures = [];
|
|
932
948
|
for (const item of result.captures) {
|
|
933
949
|
const full = await reader.getCaptureById(item.id);
|
|
934
|
-
if (full)
|
|
950
|
+
if (full) {
|
|
951
|
+
captures.push(captureWithAbsoluteAttachmentPaths(full, reader.vaultPath));
|
|
952
|
+
}
|
|
935
953
|
}
|
|
936
954
|
if (format === "json") {
|
|
937
955
|
console.log(JSON.stringify(captures, null, 2));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reader.ts","../src/vault.ts","../src/format.ts","../src/index.ts"],"sourcesContent":["import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { type VaultStructure, getVaultStructure } from \"./vault.js\";\n\nexport type CaptureIndex = {\n id: string;\n type: string;\n filePath?: string;\n createdAt: number;\n updatedAt: number;\n contentType?: string | string[];\n title?: string;\n tags?: string[];\n spaceKeys?: string[];\n mimeTypes?: string[];\n note?: string;\n tldr?: string;\n source?: string;\n isPinned?: boolean;\n isHidden?: boolean;\n triageStatus?: string;\n processingStatus?: string;\n};\n\nexport type Space = {\n id: string;\n name: string;\n key: string;\n areaKey?: string;\n icon?: string;\n color?: string;\n createdAt: number;\n updatedAt: number;\n noteCount?: number;\n isPinned?: boolean;\n};\n\nexport type Area = {\n id: string;\n name: string;\n key: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type Canvas = {\n id: string;\n name: string;\n createdAt: number;\n updatedAt: number;\n nodes: unknown[];\n connections: unknown[];\n annotations: unknown[];\n};\n\nexport type Capture = CaptureIndex & {\n content: Record<string, unknown>;\n author?: Record<string, unknown>;\n colorPalette?: unknown[];\n embedding?: number[];\n};\n\ntype IndexMap<T> = Record<string, T>;\n\nasync function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const data = await fs.readFile(filePath, \"utf-8\");\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n}\n\nexport class VaultReader {\n private structure: VaultStructure;\n\n constructor(vaultPath: string) {\n this.structure = getVaultStructure(vaultPath);\n }\n\n get vaultPath(): string {\n return this.structure.root;\n }\n\n async getCaptureIndex(): Promise<CaptureIndex[]> {\n const indexPath = path.join(this.structure.index, \"index.captures.json\");\n const data = await readJson<IndexMap<CaptureIndex>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getSpaces(): Promise<Space[]> {\n const indexPath = path.join(this.structure.index, \"index.spaces.json\");\n const data = await readJson<IndexMap<Space>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getAreas(): Promise<Area[]> {\n const indexPath = path.join(this.structure.index, \"index.areas.json\");\n const data = await readJson<IndexMap<Area>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getCanvases(): Promise<Canvas[]> {\n const indexPath = path.join(this.structure.index, \"index.canvases.json\");\n const data = await readJson<IndexMap<Canvas>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getTags(): Promise<string[]> {\n const indexPath = path.join(this.structure.index, \"index.tags.json\");\n const data = await readJson<string[]>(indexPath);\n return data ?? [];\n }\n\n async getCaptureById(id: string): Promise<Capture | null> {\n const capturePath = path.join(this.structure.captures, `${id}.json`);\n return readJson<Capture>(capturePath);\n }\n\n async listCaptures(\n options: {\n limit?: number;\n offset?: number;\n spaceKey?: string;\n tag?: string;\n contentType?: string;\n search?: string;\n pinned?: boolean;\n sortBy?: \"created\" | \"updated\";\n sortOrder?: \"asc\" | \"desc\";\n } = {}\n ): Promise<{ captures: CaptureIndex[]; total: number }> {\n let captures = await this.getCaptureIndex();\n\n captures = captures.filter((c) => !c.isHidden);\n\n if (options.spaceKey) {\n captures = captures.filter((c) => c.spaceKeys?.includes(options.spaceKey!));\n }\n\n if (options.tag) {\n captures = captures.filter((c) => c.tags?.includes(options.tag!));\n }\n\n if (options.contentType) {\n captures = captures.filter((c) => {\n const ct = c.contentType;\n if (Array.isArray(ct)) return ct.includes(options.contentType!);\n return ct === options.contentType;\n });\n }\n\n if (options.pinned !== undefined) {\n captures = captures.filter((c) => c.isPinned === options.pinned);\n }\n\n if (options.search) {\n const q = options.search.toLowerCase();\n captures = captures.filter((c) => {\n const fields = [c.title, c.note, c.tldr, c.source, ...(c.tags ?? [])].filter(Boolean);\n return fields.some((f) => f!.toLowerCase().includes(q));\n });\n }\n\n const sortField = options.sortBy === \"updated\" ? \"updatedAt\" : \"createdAt\";\n const sortDir = options.sortOrder === \"asc\" ? 1 : -1;\n captures.sort((a, b) => (b[sortField] - a[sortField]) * sortDir);\n\n const total = captures.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 20;\n\n return {\n captures: captures.slice(offset, offset + limit),\n total,\n };\n }\n\n async getStats(): Promise<{\n totalCaptures: number;\n totalSpaces: number;\n totalAreas: number;\n totalCanvases: number;\n totalTags: number;\n byContentType: Record<string, number>;\n byTriageStatus: Record<string, number>;\n }> {\n const [captures, spaces, areas, canvases, tags] = await Promise.all([\n this.getCaptureIndex(),\n this.getSpaces(),\n this.getAreas(),\n this.getCanvases(),\n this.getTags(),\n ]);\n\n const byContentType: Record<string, number> = {};\n const byTriageStatus: Record<string, number> = {};\n\n for (const c of captures) {\n const types = Array.isArray(c.contentType)\n ? c.contentType\n : c.contentType\n ? [c.contentType]\n : [\"unknown\"];\n for (const t of types) {\n byContentType[t] = (byContentType[t] ?? 0) + 1;\n }\n const status = c.triageStatus ?? \"none\";\n byTriageStatus[status] = (byTriageStatus[status] ?? 0) + 1;\n }\n\n return {\n totalCaptures: captures.length,\n totalSpaces: spaces.length,\n totalAreas: areas.length,\n totalCanvases: canvases.length,\n totalTags: tags.length,\n byContentType,\n byTriageStatus,\n };\n }\n\n async getVaultSize(): Promise<{ files: number; bytes: number }> {\n let files = 0;\n let bytes = 0;\n\n const walk = async (dir: string): Promise<void> => {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(full);\n } else {\n files++;\n try {\n const stat = await fs.stat(full);\n bytes += stat.size;\n } catch {}\n }\n }\n } catch {}\n };\n\n await walk(this.structure.root);\n return { files, bytes };\n }\n}\n","import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\n\nconst VAULT_NAMES = [\"Resurf Vault\", \"Resurf Vault Dev\"];\nconst APP_NAMES = [\n \"so.resurf.app\",\n \"so.resurf.app.dev\",\n \"Resurf\",\n \"Resurf Dev\",\n \"desktop\",\n];\nconst CONFIG_FILES = [\"app.json\", \"app.dev.json\"];\n\nexport type VaultStructure = {\n root: string;\n captures: string;\n attachments: string;\n index: string;\n config: string;\n trash: string;\n};\n\nexport function getVaultStructure(vaultPath: string): VaultStructure {\n const root = path.resolve(vaultPath);\n return {\n root,\n captures: path.join(root, \"captures\"),\n attachments: path.join(root, \"attachments\"),\n index: path.join(root, \".index\"),\n config: path.join(root, \".config\"),\n trash: path.join(root, \".trash\"),\n };\n}\n\nexport async function hasVaultConfig(dir: string): Promise<boolean> {\n try {\n const configPath = path.join(dir, \".config\", \"vault.json\");\n await fs.access(configPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getVaultNameFromConfig(dir: string): Promise<string> {\n try {\n const configPath = path.join(dir, \".config\", \"vault.json\");\n const data = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(data) as { name?: string };\n return config.name ?? path.basename(dir);\n } catch {\n return path.basename(dir);\n }\n}\n\nasync function getCurrentVaultFromAppConfig(): Promise<{\n path: string;\n valid: boolean;\n} | null> {\n const home = os.homedir();\n const base = path.join(home, \"Library\", \"Application Support\");\n for (const appName of APP_NAMES) {\n for (const configFile of CONFIG_FILES) {\n const configPath = path.join(base, appName, configFile);\n try {\n const data = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(data) as { vaultPath?: string };\n const vaultPath = config.vaultPath?.trim();\n if (vaultPath) {\n const valid = await hasVaultConfig(vaultPath);\n return { path: vaultPath, valid };\n }\n } catch {\n // ignore\n }\n }\n }\n return null;\n}\n\nfunction getDefaultSearchDirs(): string[] {\n const home = os.homedir();\n const dirs: string[] = [];\n const documents = path.join(home, \"Documents\");\n dirs.push(documents);\n for (const name of VAULT_NAMES) {\n dirs.push(path.join(documents, name));\n }\n const iCloud = path.join(home, \"Library\", \"Mobile Documents\", \"com~apple~CloudDocs\");\n dirs.push(iCloud);\n for (const name of VAULT_NAMES) {\n dirs.push(path.join(iCloud, name));\n }\n return dirs;\n}\n\nasync function scanDirForVaults(\n dir: string,\n vaults: VaultInfo[],\n seen: Set<string>,\n currentResolved: string | null,\n verbose: boolean\n): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const ent of entries) {\n if (!ent.isDirectory() || ent.name.startsWith(\".\")) continue;\n const sub = path.join(dir, ent.name);\n try {\n if (await hasVaultConfig(sub)) {\n const resolved = path.resolve(sub);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(sub);\n vaults.push({\n path: resolved,\n name,\n current: currentResolved === resolved,\n });\n seen.add(resolved);\n }\n } else {\n const nested = await fs.readdir(sub, { withFileTypes: true }).catch(() => []);\n for (const n of nested) {\n if (!n.isDirectory() || n.name.startsWith(\".\")) continue;\n const subSub = path.join(sub, n.name);\n if (await hasVaultConfig(subSub)) {\n const resolved = path.resolve(subSub);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(subSub);\n vaults.push({\n path: resolved,\n name,\n current: currentResolved === resolved,\n });\n seen.add(resolved);\n }\n }\n }\n }\n } catch {\n if (verbose) console.error(\"Skipping (inaccessible):\", sub);\n }\n }\n } catch (err) {\n if (verbose) console.error(\"Skipping (inaccessible):\", dir, err);\n }\n}\n\nexport type VaultInfo = {\n path: string;\n name: string;\n current: boolean;\n};\n\nexport async function findVaults(options?: {\n scanDir?: string;\n verbose?: boolean;\n}): Promise<VaultInfo[]> {\n const vaults: VaultInfo[] = [];\n const seen = new Set<string>();\n\n const current = await getCurrentVaultFromAppConfig();\n if (current?.path && current.valid) {\n const name = await getVaultNameFromConfig(current.path);\n vaults.push({ path: path.resolve(current.path), name, current: true });\n seen.add(path.resolve(current.path));\n }\n\n const currentResolvedForScan = current?.path ? path.resolve(current.path) : null;\n const verbose = options?.verbose ?? false;\n const searchDirs = options?.scanDir ? [options.scanDir] : getDefaultSearchDirs();\n\n for (const dir of searchDirs) {\n try {\n await fs.access(dir);\n } catch {\n if (verbose) console.error(\"Skipping (inaccessible):\", dir);\n continue;\n }\n if (await hasVaultConfig(dir)) {\n const resolved = path.resolve(dir);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(dir);\n vaults.push({\n path: resolved,\n name,\n current: currentResolvedForScan === resolved,\n });\n seen.add(resolved);\n }\n } else if (options?.scanDir) {\n await findVaultsRecursive(dir, vaults, seen, currentResolvedForScan);\n } else {\n const base = path.basename(dir);\n if (base === \"Documents\" || base === \"com~apple~CloudDocs\") {\n await scanDirForVaults(dir, vaults, seen, currentResolvedForScan, verbose);\n }\n }\n }\n\n const currentResolved = current?.path ? path.resolve(current.path) : null;\n const normalized = vaults.map((v) => ({\n ...v,\n path: path.resolve(v.path),\n current: currentResolved === path.resolve(v.path),\n }));\n return Array.from(new Map(normalized.map((v) => [v.path, v])).values());\n}\n\nasync function findVaultsRecursive(\n dir: string,\n results: VaultInfo[],\n seen: Set<string>,\n currentResolved: string | null\n): Promise<void> {\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) return;\n if (seen.has(dir)) return;\n seen.add(dir);\n\n if (await hasVaultConfig(dir)) {\n const name = await getVaultNameFromConfig(dir);\n results.push({\n path: path.resolve(dir),\n name,\n current: currentResolved === path.resolve(dir),\n });\n return;\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const ent of entries) {\n if (ent.isDirectory() && !ent.name.startsWith(\".\")) {\n const child = path.join(dir, ent.name);\n await findVaultsRecursive(child, results, seen, currentResolved);\n }\n }\n } catch {\n // skip inaccessible dirs\n }\n}\n\nexport async function discoverVaultPath(override?: string): Promise<string> {\n if (override?.trim()) {\n const resolved = path.resolve(override);\n const valid = await hasVaultConfig(resolved);\n if (!valid) {\n throw new Error(`Not a valid Resurf vault: ${resolved}`);\n }\n return resolved;\n }\n\n const current = await getCurrentVaultFromAppConfig();\n if (current?.path && current.valid) {\n return path.resolve(current.path);\n }\n\n const home = os.homedir();\n const documents = path.join(home, \"Documents\");\n const iCloud = path.join(home, \"Library\", \"Mobile Documents\", \"com~apple~CloudDocs\");\n\n for (const name of VAULT_NAMES) {\n for (const parent of [documents, iCloud]) {\n const candidate = path.join(parent, name);\n try {\n await fs.access(candidate);\n if (await hasVaultConfig(candidate)) {\n return path.resolve(candidate);\n }\n } catch {\n // skip\n }\n }\n }\n\n const fallback = path.join(documents, VAULT_NAMES[0]);\n throw new Error(\n `No Resurf vault found. Set one with --vault <path>, or create a vault at ${fallback}`\n );\n}\n","import * as path from \"path\";\nimport type { CaptureIndex, Capture, Space, Area, Canvas } from \"./reader.js\";\nimport type { VaultInfo } from \"./vault.js\";\n\nexport type OutputFormat = \"json\" | \"md\" | \"table\" | \"pretty\";\n\nexport function formatVaults(vaults: VaultInfo[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(vaults, null, 2);\n\n if (vaults.length === 0) return \"No vaults found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Path | Name | Current |`);\n lines.push(`| --- | --- | --- |`);\n for (const v of vaults) {\n lines.push(`| \\`${v.path}\\` | ${v.name} | ${v.current ? \"yes\" : \"\"} |`);\n }\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const pathW = 60;\n const nameW = 24;\n const header = `${padRight(\"PATH\", pathW)} ${padRight(\"NAME\", nameW)} CURRENT`;\n const sep = \"─\".repeat(header.length);\n const rows = vaults.map((v) => {\n const p = truncate(v.path, pathW);\n const n = truncate(v.name, nameW);\n return `${padRight(p, pathW)} ${padRight(n, nameW)} ${v.current ? \"yes\" : \"\"}`;\n });\n return [sep, header, sep, ...rows, sep].join(\"\\n\");\n }\n\n return vaults.map((v) => `${v.path}${v.current ? \" (current)\" : \"\"}`).join(\"\\n\");\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nfunction formatDate(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n return `${Math.floor(months / 12)}y ago`;\n}\n\nfunction padRight(str: string, len: number): string {\n return str + \" \".repeat(Math.max(0, len - str.length));\n}\n\nfunction padLeft(str: string, len: number): string {\n return \" \".repeat(Math.max(0, len - str.length)) + str;\n}\n\nfunction formatContentType(ct: string | string[] | undefined): string {\n if (!ct) return \"—\";\n if (Array.isArray(ct)) return ct.join(\", \");\n return ct;\n}\n\nfunction isEmbeddableImage(mime: string): boolean {\n return /^image\\/(png|jpe?g|gif|webp|svg\\+xml|bmp|avif)$/i.test(mime);\n}\n\nfunction isEmbeddableVideo(mime: string): boolean {\n return /^video\\/(mp4|webm|mov|quicktime)$/i.test(mime);\n}\n\nfunction resolveAttachmentPath(vaultPath: string, relativePath: string): string {\n return path.resolve(vaultPath, relativePath);\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function formatCaptureList(\n captures: CaptureIndex[],\n total: number,\n format: OutputFormat\n): string {\n if (format === \"json\") return JSON.stringify({ captures, total }, null, 2);\n\n if (captures.length === 0) return \"No captures found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| ID | Type | Title | Tags | Created |`);\n lines.push(`| --- | --- | --- | --- | --- |`);\n for (const c of captures) {\n const id = `\\`${c.id.slice(0, 8)}\\``;\n const ct = formatContentType(c.contentType);\n const title = c.title ? c.title.replace(/\\|/g, \"\\\\|\") : \"_(untitled)_\";\n const tags = c.tags?.length ? c.tags.map((t) => `\\`${t}\\``).join(\", \") : \"\";\n const date = relativeTime(c.createdAt);\n lines.push(`| ${id} | ${ct} | ${title} | ${tags} | ${date} |`);\n }\n lines.push(\"\");\n lines.push(`_Showing ${captures.length} of ${total} captures_`);\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const idW = 10;\n const typeW = 12;\n const titleW = 40;\n const tagsW = 20;\n const dateW = 12;\n\n const header = `${padRight(\"ID\", idW)} ${padRight(\"TYPE\", typeW)} ${padRight(\"TITLE\", titleW)} ${padRight(\"TAGS\", tagsW)} ${padRight(\"CREATED\", dateW)}`;\n const sep = \"─\".repeat(header.length);\n\n const rows = captures.map((c) => {\n const id = truncate(c.id, idW);\n const ct = truncate(formatContentType(c.contentType), typeW);\n const title = truncate(c.title ?? \"(untitled)\", titleW);\n const tags = truncate(c.tags?.join(\", \") ?? \"\", tagsW);\n const date = relativeTime(c.createdAt);\n return `${padRight(id, idW)} ${padRight(ct, typeW)} ${padRight(title, titleW)} ${padRight(tags, tagsW)} ${padRight(date, dateW)}`;\n });\n\n return [`${sep}`, header, sep, ...rows, sep, `Showing ${captures.length} of ${total}`].join(\n \"\\n\"\n );\n }\n\n const lines: string[] = [];\n for (const c of captures) {\n const pin = c.isPinned ? \" 📌\" : \"\";\n const title = c.title ?? \"(untitled)\";\n const ct = formatContentType(c.contentType);\n lines.push(` ${c.id.slice(0, 8)} ${ct.padEnd(10)} ${title}${pin}`);\n if (c.tldr) lines.push(` ${truncate(c.tldr, 70)}`);\n if (c.tags?.length) lines.push(` tags: ${c.tags.join(\", \")}`);\n lines.push(\"\");\n }\n lines.push(`${captures.length} of ${total} captures`);\n return lines.join(\"\\n\");\n}\n\nexport function formatCapture(capture: Capture, format: OutputFormat, vaultPath?: string): string {\n if (format === \"json\") return JSON.stringify(capture, null, 2);\n\n if (format === \"md\") {\n const lines: string[] = [];\n const title = capture.title || \"Untitled Capture\";\n lines.push(`# ${title}`);\n lines.push(\"\");\n\n const content = capture.content;\n if (content?.type === \"attachment\" && content.path) {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path);\n const mime = String(content.mimeType ?? \"\");\n\n if (isEmbeddableImage(mime)) {\n lines.push(``);\n lines.push(\"\");\n } else if (isEmbeddableVideo(mime)) {\n lines.push(`[Video: ${title}](${fullPath})`);\n lines.push(\"\");\n }\n }\n\n lines.push(`- **ID:** \\`${capture.id}\\``);\n lines.push(`- **Type:** ${capture.type} (${formatContentType(capture.contentType)})`);\n if (capture.source) lines.push(`- **Source:** ${capture.source}`);\n lines.push(`- **Created:** ${formatDate(capture.createdAt)}`);\n lines.push(`- **Updated:** ${formatDate(capture.updatedAt)}`);\n if (capture.isPinned) lines.push(`- **Pinned:** yes`);\n if (capture.tags?.length)\n lines.push(`- **Tags:** ${capture.tags.map((t) => `\\`${t}\\``).join(\", \")}`);\n if (capture.spaceKeys?.length)\n lines.push(`- **Spaces:** ${capture.spaceKeys.map((k) => `\\`${k}\\``).join(\", \")}`);\n if (capture.triageStatus) lines.push(`- **Triage:** ${capture.triageStatus}`);\n\n if (capture.tldr) {\n lines.push(\"\");\n lines.push(`## TLDR`);\n lines.push(capture.tldr);\n }\n\n if (capture.note) {\n lines.push(\"\");\n lines.push(`## Note`);\n lines.push(capture.note);\n }\n\n if (content) {\n if (content.type === \"note\" && content.textContent) {\n lines.push(\"\");\n lines.push(`## Content`);\n lines.push(String(content.textContent));\n } else if (content.type === \"link\") {\n lines.push(\"\");\n lines.push(`## Content`);\n if (content.url) lines.push(`**URL:** ${content.url}`);\n if (content.ogTitle) lines.push(`**OG Title:** ${content.ogTitle}`);\n if (content.ogDescription)\n lines.push(`**OG Description:** ${truncate(String(content.ogDescription), 200)}`);\n } else if (content.type === \"attachment\") {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path ?? \"\");\n lines.push(\"\");\n lines.push(`## Attachment`);\n if (content.mimeType) lines.push(`- **MIME:** ${content.mimeType}`);\n if (content.size) lines.push(`- **Size:** ${formatSize(Number(content.size))}`);\n lines.push(`- **Path:** \\`${fullPath}\\``);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n const lines: string[] = [];\n const sep = \"─\".repeat(60);\n\n lines.push(sep);\n lines.push(` ID: ${capture.id}`);\n lines.push(` Type: ${capture.type} (${formatContentType(capture.contentType)})`);\n if (capture.title) lines.push(` Title: ${capture.title}`);\n if (capture.source) lines.push(` Source: ${capture.source}`);\n lines.push(` Created: ${formatDate(capture.createdAt)}`);\n lines.push(` Updated: ${formatDate(capture.updatedAt)}`);\n if (capture.isPinned) lines.push(` Pinned: yes`);\n if (capture.tags?.length) lines.push(` Tags: ${capture.tags.join(\", \")}`);\n if (capture.spaceKeys?.length) lines.push(` Spaces: ${capture.spaceKeys.join(\", \")}`);\n if (capture.triageStatus) lines.push(` Triage: ${capture.triageStatus}`);\n if (capture.processingStatus) lines.push(` Status: ${capture.processingStatus}`);\n\n if (capture.tldr) {\n lines.push(sep);\n lines.push(\" TLDR:\");\n lines.push(` ${capture.tldr}`);\n }\n\n if (capture.note) {\n lines.push(sep);\n lines.push(\" Note:\");\n lines.push(` ${capture.note}`);\n }\n\n const content = capture.content;\n if (content) {\n lines.push(sep);\n lines.push(\" Content:\");\n if (content.type === \"note\" && content.textContent) {\n const text = String(content.textContent);\n lines.push(` ${truncate(text, 500)}`);\n } else if (content.type === \"link\") {\n if (content.url) lines.push(` URL: ${content.url}`);\n if (content.ogTitle) lines.push(` OG Title: ${content.ogTitle}`);\n if (content.ogDescription)\n lines.push(` OG Desc: ${truncate(String(content.ogDescription), 200)}`);\n } else if (content.type === \"attachment\") {\n if (content.mimeType) lines.push(` MIME: ${content.mimeType}`);\n if (content.size) lines.push(` Size: ${formatSize(Number(content.size))}`);\n if (content.path) {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path);\n lines.push(` Path: ${fullPath}`);\n }\n }\n }\n\n lines.push(sep);\n return lines.join(\"\\n\");\n}\n\nexport function formatSpaces(spaces: Space[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(spaces, null, 2);\n\n if (spaces.length === 0) return \"No spaces found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Key | Name | Captures | Pinned |`);\n lines.push(`| --- | --- | ---: | --- |`);\n for (const s of spaces) {\n const pin = s.isPinned ? \"yes\" : \"\";\n lines.push(`| \\`${s.key}\\` | ${s.name} | ${s.noteCount ?? 0} | ${pin} |`);\n }\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const keyW = 20;\n const nameW = 30;\n const countW = 8;\n const header = `${padRight(\"KEY\", keyW)} ${padRight(\"NAME\", nameW)} ${padLeft(\"COUNT\", countW)}`;\n const sep = \"─\".repeat(header.length);\n\n const rows = spaces.map((s) => {\n return `${padRight(truncate(s.key, keyW), keyW)} ${padRight(truncate(s.name, nameW), nameW)} ${padLeft(String(s.noteCount ?? 0), countW)}`;\n });\n\n return [sep, header, sep, ...rows, sep].join(\"\\n\");\n }\n\n return spaces\n .map((s) => {\n const pin = s.isPinned ? \" 📌\" : \"\";\n return ` ${s.key.padEnd(20)} ${s.name}${pin} (${s.noteCount ?? 0} captures)`;\n })\n .join(\"\\n\");\n}\n\nexport function formatAreas(areas: Area[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(areas, null, 2);\n if (areas.length === 0) return \"No areas found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Key | Name |`);\n lines.push(`| --- | --- |`);\n for (const a of areas) {\n lines.push(`| \\`${a.key}\\` | ${a.name} |`);\n }\n return lines.join(\"\\n\");\n }\n\n return areas.map((a) => ` ${a.key.padEnd(20)} ${a.name}`).join(\"\\n\");\n}\n\nexport function formatTags(tags: string[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(tags, null, 2);\n if (tags.length === 0) return \"No tags found.\";\n\n if (format === \"md\") {\n return tags.map((t) => `- \\`${t}\\``).join(\"\\n\");\n }\n\n return tags.map((t) => ` ${t}`).join(\"\\n\");\n}\n\nexport function formatCanvases(canvases: Canvas[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(canvases, null, 2);\n if (canvases.length === 0) return \"No canvases found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| ID | Name | Nodes | Connections |`);\n lines.push(`| --- | --- | ---: | ---: |`);\n for (const c of canvases) {\n lines.push(\n `| \\`${c.id.slice(0, 8)}\\` | ${c.name} | ${c.nodes.length} | ${c.connections.length} |`\n );\n }\n return lines.join(\"\\n\");\n }\n\n return canvases\n .map(\n (c) =>\n ` ${c.id.slice(0, 8)} ${c.name} (${c.nodes.length} nodes, ${c.connections.length} connections)`\n )\n .join(\"\\n\");\n}\n\nexport function formatStats(\n stats: {\n totalCaptures: number;\n totalSpaces: number;\n totalAreas: number;\n totalCanvases: number;\n totalTags: number;\n byContentType: Record<string, number>;\n byTriageStatus: Record<string, number>;\n },\n vaultPath: string,\n format: OutputFormat\n): string {\n if (format === \"json\") return JSON.stringify({ vaultPath, ...stats }, null, 2);\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`# Vault Stats`);\n lines.push(\"\");\n lines.push(`**Path:** \\`${vaultPath}\\``);\n lines.push(\"\");\n lines.push(`| Metric | Count |`);\n lines.push(`| --- | ---: |`);\n lines.push(`| Captures | ${stats.totalCaptures} |`);\n lines.push(`| Spaces | ${stats.totalSpaces} |`);\n lines.push(`| Areas | ${stats.totalAreas} |`);\n lines.push(`| Canvases | ${stats.totalCanvases} |`);\n lines.push(`| Tags | ${stats.totalTags} |`);\n lines.push(\"\");\n lines.push(`### By Content Type`);\n lines.push(\"\");\n lines.push(`| Type | Count |`);\n lines.push(`| --- | ---: |`);\n const sortedTypes = Object.entries(stats.byContentType).sort((a, b) => b[1] - a[1]);\n for (const [type, count] of sortedTypes) {\n lines.push(`| ${type} | ${count} |`);\n }\n lines.push(\"\");\n lines.push(`### By Triage Status`);\n lines.push(\"\");\n lines.push(`| Status | Count |`);\n lines.push(`| --- | ---: |`);\n const sortedStatus = Object.entries(stats.byTriageStatus).sort((a, b) => b[1] - a[1]);\n for (const [status, count] of sortedStatus) {\n lines.push(`| ${status} | ${count} |`);\n }\n return lines.join(\"\\n\");\n }\n\n const sep = \"─\".repeat(40);\n const lines: string[] = [];\n\n lines.push(sep);\n lines.push(` Vault: ${vaultPath}`);\n lines.push(sep);\n lines.push(` Captures: ${stats.totalCaptures}`);\n lines.push(` Spaces: ${stats.totalSpaces}`);\n lines.push(` Areas: ${stats.totalAreas}`);\n lines.push(` Canvases: ${stats.totalCanvases}`);\n lines.push(` Tags: ${stats.totalTags}`);\n lines.push(sep);\n\n lines.push(\" By Content Type:\");\n const sortedTypes = Object.entries(stats.byContentType).sort((a, b) => b[1] - a[1]);\n for (const [type, count] of sortedTypes) {\n lines.push(` ${type.padEnd(14)} ${count}`);\n }\n\n lines.push(sep);\n lines.push(\" By Triage Status:\");\n const sortedStatus = Object.entries(stats.byTriageStatus).sort((a, b) => b[1] - a[1]);\n for (const [status, count] of sortedStatus) {\n lines.push(` ${status.padEnd(14)} ${count}`);\n }\n\n lines.push(sep);\n return lines.join(\"\\n\");\n}\n","import { VaultReader } from \"./reader.js\";\nimport { discoverVaultPath, findVaults } from \"./vault.js\";\nimport {\n type OutputFormat,\n formatAreas,\n formatCanvases,\n formatCapture,\n formatCaptureList,\n formatSpaces,\n formatStats,\n formatTags,\n formatVaults,\n} from \"./format.js\";\n\nconst VERSION = \"1.0.0\";\n\ntype GlobalFlags = {\n vault?: string;\n format: OutputFormat;\n verbose?: boolean;\n};\n\nfunction parseGlobalFlags(args: string[]): { flags: GlobalFlags; rest: string[] } {\n const flags: GlobalFlags = { format: \"pretty\" };\n const rest: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n if (arg === \"--vault\" && i + 1 < args.length) {\n flags.vault = args[i + 1];\n i += 2;\n } else if (arg === \"--json\") {\n flags.format = \"json\";\n i++;\n } else if (arg === \"--md\" || arg === \"--markdown\") {\n flags.format = \"md\";\n i++;\n } else if (arg === \"--table\") {\n flags.format = \"table\";\n i++;\n } else if (arg === \"--format\" && i + 1 < args.length) {\n flags.format = args[i + 1] as OutputFormat;\n i += 2;\n } else if (arg === \"--verbose\") {\n flags.verbose = true;\n i++;\n } else {\n rest.push(arg);\n i++;\n }\n }\n\n return { flags, rest };\n}\n\nfunction extractFlag(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction extractNumber(args: string[], flag: string, defaultVal: number): number {\n const val = extractFlag(args, flag);\n if (!val) return defaultVal;\n const n = parseInt(val, 10);\n return isNaN(n) ? defaultVal : n;\n}\n\nasync function cmdList(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const limit = extractNumber(args, \"--limit\", 20);\n const offset = extractNumber(args, \"--offset\", 0);\n const spaceKey = extractFlag(args, \"--space\");\n const tag = extractFlag(args, \"--tag\");\n const contentType = extractFlag(args, \"--type\");\n const search = extractFlag(args, \"--search\") ?? extractFlag(args, \"-s\");\n const pinned = hasFlag(args, \"--pinned\") ? true : undefined;\n const sortBy = (extractFlag(args, \"--sort\") as \"created\" | \"updated\") ?? \"created\";\n const sortOrder = hasFlag(args, \"--asc\") ? (\"asc\" as const) : (\"desc\" as const);\n\n const result = await reader.listCaptures({\n limit,\n offset,\n spaceKey,\n tag,\n contentType,\n search,\n pinned,\n sortBy,\n sortOrder,\n });\n\n console.log(formatCaptureList(result.captures, result.total, format));\n}\n\nasync function cmdGet(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const id = args[0];\n if (!id) {\n console.error(\"Usage: resurf get <capture-id>\");\n process.exit(1);\n }\n\n let capture = await reader.getCaptureById(id);\n\n if (!capture) {\n const index = await reader.getCaptureIndex();\n const match = index.find((c) => c.id.startsWith(id));\n if (match) {\n capture = await reader.getCaptureById(match.id);\n }\n }\n\n if (!capture) {\n console.error(`Capture not found: ${id}`);\n process.exit(1);\n }\n\n console.log(formatCapture(capture, format, reader.vaultPath));\n}\n\nasync function cmdSearch(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const positional: string[] = [];\n let i = 0;\n while (i < args.length) {\n if (args[i].startsWith(\"--\") && i + 1 < args.length) {\n i += 2;\n } else if (args[i].startsWith(\"--\")) {\n i++;\n } else {\n positional.push(args[i]);\n i++;\n }\n }\n\n const query = positional.join(\" \");\n if (!query) {\n console.error(\"Usage: resurf search <query>\");\n process.exit(1);\n }\n\n const limit = extractNumber(args, \"--limit\", 20);\n\n const result = await reader.listCaptures({ search: query, limit });\n console.log(formatCaptureList(result.captures, result.total, format));\n}\n\nasync function cmdSpaces(\n reader: VaultReader,\n _args: string[],\n format: OutputFormat\n): Promise<void> {\n const spaces = await reader.getSpaces();\n console.log(formatSpaces(spaces, format));\n}\n\nasync function cmdAreas(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const areas = await reader.getAreas();\n console.log(formatAreas(areas, format));\n}\n\nasync function cmdTags(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const tags = await reader.getTags();\n console.log(formatTags(tags, format));\n}\n\nasync function cmdCanvases(\n reader: VaultReader,\n _args: string[],\n format: OutputFormat\n): Promise<void> {\n const canvases = await reader.getCanvases();\n console.log(formatCanvases(canvases, format));\n}\n\nasync function cmdStats(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const stats = await reader.getStats();\n console.log(formatStats(stats, reader.vaultPath, format));\n}\n\nasync function cmdOpen(reader: VaultReader, args: string[]): Promise<void> {\n const id = args[0];\n if (!id) {\n console.error(\"Usage: resurf open <capture-id>\");\n process.exit(1);\n }\n\n let captureId = id;\n const capture = await reader.getCaptureById(id);\n if (!capture) {\n const index = await reader.getCaptureIndex();\n const match = index.find((c) => c.id.startsWith(id));\n if (match) captureId = match.id;\n }\n\n const { exec } = await import(\"child_process\");\n const url = `resurf://capture/${captureId}`;\n exec(`open \"${url}\"`);\n console.log(`Opening capture in Resurf: ${captureId}`);\n}\n\nasync function cmdCreate(args: string[]): Promise<void> {\n const content = extractFlag(args, \"--content\") ?? extractFlag(args, \"--text\");\n const url = extractFlag(args, \"--url\");\n const title = extractFlag(args, \"--title\");\n const tags = extractFlag(args, \"--tags\");\n const source = extractFlag(args, \"--source\");\n const space = extractFlag(args, \"--space\");\n\n if (!content && !url) {\n console.error(\n \"Usage: resurf create --content <text> [--url <url>] [--title <title>] [--tags <tags>]\"\n );\n process.exit(1);\n }\n\n const params = new URLSearchParams();\n if (content) params.set(\"content\", content);\n if (url) params.set(\"url\", url);\n if (title) params.set(\"title\", title);\n if (tags) params.set(\"tags\", tags);\n if (source) params.set(\"source\", source);\n if (space) params.set(\"space\", space);\n\n const protocolUrl = `resurf://new?${params.toString()}`;\n const { exec } = await import(\"child_process\");\n exec(`open \"${protocolUrl}\"`);\n console.log(\"Creating capture via Resurf protocol...\");\n}\n\nasync function cmdExport(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const spaceKey = extractFlag(args, \"--space\");\n const tag = extractFlag(args, \"--tag\");\n const contentType = extractFlag(args, \"--type\");\n\n const result = await reader.listCaptures({\n limit: 999999,\n spaceKey,\n tag,\n contentType,\n });\n\n const captures: Record<string, unknown>[] = [];\n for (const item of result.captures) {\n const full = await reader.getCaptureById(item.id);\n if (full) captures.push(full);\n }\n\n if (format === \"json\") {\n console.log(JSON.stringify(captures, null, 2));\n } else if (format === \"md\") {\n const lines: string[] = [];\n for (const c of captures) {\n const cap = c as Record<string, unknown>;\n const title = (cap.title as string) || \"Untitled\";\n const id = cap.id as string;\n lines.push(`## ${title}`);\n lines.push(`- **ID:** \\`${id}\\``);\n if (cap.contentType) lines.push(`- **Type:** ${cap.contentType}`);\n if (cap.tldr) lines.push(`- **TLDR:** ${cap.tldr}`);\n if (cap.note) lines.push(`- **Note:** ${cap.note}`);\n lines.push(\"\");\n }\n lines.push(`_Exported ${captures.length} captures_`);\n console.log(lines.join(\"\\n\"));\n } else {\n console.log(JSON.stringify(captures, null, 2));\n console.error(`\\nExported ${captures.length} captures (use --json or --md for piping)`);\n }\n}\n\nfunction printHelp(): void {\n const help = `\nresurf - Access Resurf vault data from the command line\n\nUSAGE\n resurf <command> [options]\n\nCOMMANDS\n list List captures (default)\n get <id> Get a capture by ID (supports partial IDs)\n search <query> Search captures by title, note, or TLDR\n spaces List all spaces\n areas List all areas\n tags List all tags\n canvases List all canvases\n stats Show vault statistics\n vaults List available Resurf vaults on this computer\n tui Interactive TUI to browse and open captures\n open <id> Open a capture in Resurf app\n create Create a capture via Resurf protocol\n export Export captures as JSON\n\nGLOBAL OPTIONS\n --vault <path> Path to Resurf vault (auto-detected if omitted)\n --json Output as JSON\n --md, --markdown Output as Markdown\n --table Output as table\n --format <fmt> Output format: json, md, table, pretty (default: pretty)\n\nLIST OPTIONS\n --limit <n> Max results (default: 20)\n --offset <n> Skip first N results\n --space <key> Filter by space key\n --tag <tag> Filter by tag\n --type <type> Filter by content type (note, link, image, video, etc.)\n --search <query> Filter by text search\n --pinned Show only pinned captures\n --sort <field> Sort by: created, updated (default: created)\n --asc Sort ascending (default: descending)\n\nSEARCH OPTIONS\n --limit <n> Max results (default: 20)\n\nCREATE OPTIONS\n --content <text> Text content for the capture\n --url <url> URL to capture\n --title <title> Title for the capture\n --tags <tags> Comma-separated tags\n --source <source> Source identifier\n --space <key> Space key to assign\n\nEXPORT OPTIONS\n --space <key> Filter by space key\n --tag <tag> Filter by tag\n --type <type> Filter by content type\n\nVAULTS OPTIONS\n [directory] Scan this directory recursively for vaults\n --verbose Log skipped inaccessible paths\n\nEXAMPLES\n resurf list --limit 10 --json\n resurf list --space work --type note\n resurf get abc123\n resurf search \"meeting notes\"\n resurf search \"react hooks\" --json | jq '.[].title'\n resurf spaces --json\n resurf tags\n resurf stats\n resurf vaults\n resurf vaults --json\n resurf vaults /path/to/folder\n resurf tui\n resurf open abc123\n resurf create --content \"Quick note\" --tags \"idea,work\"\n resurf create --url \"https://example.com\" --title \"Example\"\n resurf export --space work --json > work-captures.json\n resurf list --json | jq '.captures[].id'\n\nVERSION\n ${VERSION}\n`;\n console.log(help.trim());\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n if (rawArgs.length === 0 || rawArgs[0] === \"--help\" || rawArgs[0] === \"-h\") {\n printHelp();\n return;\n }\n\n if (rawArgs[0] === \"--version\" || rawArgs[0] === \"-v\") {\n console.log(VERSION);\n return;\n }\n\n const { flags, rest } = parseGlobalFlags(rawArgs);\n const command = rest[0] ?? \"list\";\n const commandArgs = rest.slice(1);\n\n if (command === \"create\") {\n await cmdCreate(commandArgs);\n return;\n }\n\n if (command === \"vaults\" || command === \"find-vaults\") {\n const scanDir = commandArgs.find((a) => !a.startsWith(\"-\"));\n const vaults = await findVaults({ scanDir, verbose: flags.verbose });\n console.log(formatVaults(vaults, flags.format));\n return;\n }\n\n const vaultPath = await discoverVaultPath(flags.vault);\n const reader = new VaultReader(vaultPath);\n\n const commands: Record<string, (r: VaultReader, a: string[], f: OutputFormat) => Promise<void>> =\n {\n list: cmdList,\n ls: cmdList,\n get: cmdGet,\n show: cmdGet,\n search: cmdSearch,\n find: cmdSearch,\n spaces: cmdSpaces,\n areas: cmdAreas,\n tags: cmdTags,\n canvases: cmdCanvases,\n stats: cmdStats,\n info: cmdStats,\n export: cmdExport,\n };\n\n if (command === \"open\") {\n await cmdOpen(reader, commandArgs);\n return;\n }\n\n if (command === \"tui\") {\n const { runTui } = await import(\"./tui-app.js\");\n runTui({ reader });\n return;\n }\n\n const handler = commands[command];\n if (!handler) {\n console.error(`Unknown command: ${command}`);\n console.error(`Run 'resurf --help' for usage.`);\n process.exit(1);\n }\n\n await handler(reader, commandArgs, flags.format);\n}\n\nmain().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exit(1);\n});\n"],"mappings":";;;AAAA,YAAYA,SAAQ;AACpB,YAAYC,WAAU;;;ACDtB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAEpB,IAAM,cAAc,CAAC,gBAAgB,kBAAkB;AACvD,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,eAAe,CAAC,YAAY,cAAc;AAWzC,SAAS,kBAAkB,WAAmC;AACnE,QAAM,OAAY,aAAQ,SAAS;AACnC,SAAO;AAAA,IACL;AAAA,IACA,UAAe,UAAK,MAAM,UAAU;AAAA,IACpC,aAAkB,UAAK,MAAM,aAAa;AAAA,IAC1C,OAAY,UAAK,MAAM,QAAQ;AAAA,IAC/B,QAAa,UAAK,MAAM,SAAS;AAAA,IACjC,OAAY,UAAK,MAAM,QAAQ;AAAA,EACjC;AACF;AAEA,eAAsB,eAAe,KAA+B;AAClE,MAAI;AACF,UAAM,aAAkB,UAAK,KAAK,WAAW,YAAY;AACzD,UAAS,UAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,uBAAuB,KAA8B;AAClE,MAAI;AACF,UAAM,aAAkB,UAAK,KAAK,WAAW,YAAY;AACzD,UAAM,OAAO,MAAS,YAAS,YAAY,OAAO;AAClD,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,WAAO,OAAO,QAAa,cAAS,GAAG;AAAA,EACzC,QAAQ;AACN,WAAY,cAAS,GAAG;AAAA,EAC1B;AACF;AAEA,eAAe,+BAGL;AACR,QAAM,OAAU,WAAQ;AACxB,QAAM,OAAY,UAAK,MAAM,WAAW,qBAAqB;AAC7D,aAAW,WAAW,WAAW;AAC/B,eAAW,cAAc,cAAc;AACrC,YAAM,aAAkB,UAAK,MAAM,SAAS,UAAU;AACtD,UAAI;AACF,cAAM,OAAO,MAAS,YAAS,YAAY,OAAO;AAClD,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,cAAM,YAAY,OAAO,WAAW,KAAK;AACzC,YAAI,WAAW;AACb,gBAAM,QAAQ,MAAM,eAAe,SAAS;AAC5C,iBAAO,EAAE,MAAM,WAAW,MAAM;AAAA,QAClC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAiC;AACxC,QAAM,OAAU,WAAQ;AACxB,QAAM,OAAiB,CAAC;AACxB,QAAM,YAAiB,UAAK,MAAM,WAAW;AAC7C,OAAK,KAAK,SAAS;AACnB,aAAW,QAAQ,aAAa;AAC9B,SAAK,KAAU,UAAK,WAAW,IAAI,CAAC;AAAA,EACtC;AACA,QAAM,SAAc,UAAK,MAAM,WAAW,oBAAoB,qBAAqB;AACnF,OAAK,KAAK,MAAM;AAChB,aAAW,QAAQ,aAAa;AAC9B,SAAK,KAAU,UAAK,QAAQ,IAAI,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAEA,eAAe,iBACb,KACA,QACA,MACA,iBACA,SACe;AACf,MAAI;AACF,UAAM,UAAU,MAAS,WAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,eAAW,OAAO,SAAS;AACzB,UAAI,CAAC,IAAI,YAAY,KAAK,IAAI,KAAK,WAAW,GAAG,EAAG;AACpD,YAAM,MAAW,UAAK,KAAK,IAAI,IAAI;AACnC,UAAI;AACF,YAAI,MAAM,eAAe,GAAG,GAAG;AAC7B,gBAAM,WAAgB,aAAQ,GAAG;AACjC,cAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,kBAAM,OAAO,MAAM,uBAAuB,GAAG;AAC7C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,SAAS,oBAAoB;AAAA,YAC/B,CAAC;AACD,iBAAK,IAAI,QAAQ;AAAA,UACnB;AAAA,QACF,OAAO;AACL,gBAAM,SAAS,MAAS,WAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAC5E,qBAAW,KAAK,QAAQ;AACtB,gBAAI,CAAC,EAAE,YAAY,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AAChD,kBAAM,SAAc,UAAK,KAAK,EAAE,IAAI;AACpC,gBAAI,MAAM,eAAe,MAAM,GAAG;AAChC,oBAAM,WAAgB,aAAQ,MAAM;AACpC,kBAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,sBAAM,OAAO,MAAM,uBAAuB,MAAM;AAChD,uBAAO,KAAK;AAAA,kBACV,MAAM;AAAA,kBACN;AAAA,kBACA,SAAS,oBAAoB;AAAA,gBAC/B,CAAC;AACD,qBAAK,IAAI,QAAQ;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AACN,YAAI,QAAS,SAAQ,MAAM,4BAA4B,GAAG;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,QAAS,SAAQ,MAAM,4BAA4B,KAAK,GAAG;AAAA,EACjE;AACF;AAQA,eAAsB,WAAW,SAGR;AACvB,QAAM,SAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,UAAU,MAAM,6BAA6B;AACnD,MAAI,SAAS,QAAQ,QAAQ,OAAO;AAClC,UAAM,OAAO,MAAM,uBAAuB,QAAQ,IAAI;AACtD,WAAO,KAAK,EAAE,MAAW,aAAQ,QAAQ,IAAI,GAAG,MAAM,SAAS,KAAK,CAAC;AACrE,SAAK,IAAS,aAAQ,QAAQ,IAAI,CAAC;AAAA,EACrC;AAEA,QAAM,yBAAyB,SAAS,OAAY,aAAQ,QAAQ,IAAI,IAAI;AAC5E,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,aAAa,SAAS,UAAU,CAAC,QAAQ,OAAO,IAAI,qBAAqB;AAE/E,aAAW,OAAO,YAAY;AAC5B,QAAI;AACF,YAAS,UAAO,GAAG;AAAA,IACrB,QAAQ;AACN,UAAI,QAAS,SAAQ,MAAM,4BAA4B,GAAG;AAC1D;AAAA,IACF;AACA,QAAI,MAAM,eAAe,GAAG,GAAG;AAC7B,YAAM,WAAgB,aAAQ,GAAG;AACjC,UAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,cAAM,OAAO,MAAM,uBAAuB,GAAG;AAC7C,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA,SAAS,2BAA2B;AAAA,QACtC,CAAC;AACD,aAAK,IAAI,QAAQ;AAAA,MACnB;AAAA,IACF,WAAW,SAAS,SAAS;AAC3B,YAAM,oBAAoB,KAAK,QAAQ,MAAM,sBAAsB;AAAA,IACrE,OAAO;AACL,YAAM,OAAY,cAAS,GAAG;AAC9B,UAAI,SAAS,eAAe,SAAS,uBAAuB;AAC1D,cAAM,iBAAiB,KAAK,QAAQ,MAAM,wBAAwB,OAAO;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,SAAS,OAAY,aAAQ,QAAQ,IAAI,IAAI;AACrE,QAAM,aAAa,OAAO,IAAI,CAAC,OAAO;AAAA,IACpC,GAAG;AAAA,IACH,MAAW,aAAQ,EAAE,IAAI;AAAA,IACzB,SAAS,oBAAyB,aAAQ,EAAE,IAAI;AAAA,EAClD,EAAE;AACF,SAAO,MAAM,KAAK,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;AACxE;AAEA,eAAe,oBACb,KACA,SACA,MACA,iBACe;AACf,MAAI;AACF,UAAMC,QAAO,MAAS,QAAK,GAAG;AAC9B,QAAI,CAACA,MAAK,YAAY,EAAG;AACzB,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,QAAI,MAAM,eAAe,GAAG,GAAG;AAC7B,YAAM,OAAO,MAAM,uBAAuB,GAAG;AAC7C,cAAQ,KAAK;AAAA,QACX,MAAW,aAAQ,GAAG;AAAA,QACtB;AAAA,QACA,SAAS,oBAAyB,aAAQ,GAAG;AAAA,MAC/C,CAAC;AACD;AAAA,IACF;AAEA,UAAM,UAAU,MAAS,WAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAC7E,eAAW,OAAO,SAAS;AACzB,UAAI,IAAI,YAAY,KAAK,CAAC,IAAI,KAAK,WAAW,GAAG,GAAG;AAClD,cAAM,QAAa,UAAK,KAAK,IAAI,IAAI;AACrC,cAAM,oBAAoB,OAAO,SAAS,MAAM,eAAe;AAAA,MACjE;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,kBAAkB,UAAoC;AAC1E,MAAI,UAAU,KAAK,GAAG;AACpB,UAAM,WAAgB,aAAQ,QAAQ;AACtC,UAAM,QAAQ,MAAM,eAAe,QAAQ;AAC3C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,6BAA6B;AACnD,MAAI,SAAS,QAAQ,QAAQ,OAAO;AAClC,WAAY,aAAQ,QAAQ,IAAI;AAAA,EAClC;AAEA,QAAM,OAAU,WAAQ;AACxB,QAAM,YAAiB,UAAK,MAAM,WAAW;AAC7C,QAAM,SAAc,UAAK,MAAM,WAAW,oBAAoB,qBAAqB;AAEnF,aAAW,QAAQ,aAAa;AAC9B,eAAW,UAAU,CAAC,WAAW,MAAM,GAAG;AACxC,YAAM,YAAiB,UAAK,QAAQ,IAAI;AACxC,UAAI;AACF,cAAS,UAAO,SAAS;AACzB,YAAI,MAAM,eAAe,SAAS,GAAG;AACnC,iBAAY,aAAQ,SAAS;AAAA,QAC/B;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAgB,UAAK,WAAW,YAAY,CAAC,CAAC;AACpD,QAAM,IAAI;AAAA,IACR,4EAA4E,QAAQ;AAAA,EACtF;AACF;;;ADzNA,eAAe,SAAY,UAAqC;AAC9D,MAAI;AACF,UAAM,OAAO,MAAS,aAAS,UAAU,OAAO;AAChD,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EAER,YAAY,WAAmB;AAC7B,SAAK,YAAY,kBAAkB,SAAS;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAM,kBAA2C;AAC/C,UAAM,YAAiB,WAAK,KAAK,UAAU,OAAO,qBAAqB;AACvE,UAAM,OAAO,MAAM,SAAiC,SAAS;AAC7D,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,YAA8B;AAClC,UAAM,YAAiB,WAAK,KAAK,UAAU,OAAO,mBAAmB;AACrE,UAAM,OAAO,MAAM,SAA0B,SAAS;AACtD,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,WAA4B;AAChC,UAAM,YAAiB,WAAK,KAAK,UAAU,OAAO,kBAAkB;AACpE,UAAM,OAAO,MAAM,SAAyB,SAAS;AACrD,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAiC;AACrC,UAAM,YAAiB,WAAK,KAAK,UAAU,OAAO,qBAAqB;AACvE,UAAM,OAAO,MAAM,SAA2B,SAAS;AACvD,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,UAA6B;AACjC,UAAM,YAAiB,WAAK,KAAK,UAAU,OAAO,iBAAiB;AACnE,UAAM,OAAO,MAAM,SAAmB,SAAS;AAC/C,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,IAAqC;AACxD,UAAM,cAAmB,WAAK,KAAK,UAAU,UAAU,GAAG,EAAE,OAAO;AACnE,WAAO,SAAkB,WAAW;AAAA,EACtC;AAAA,EAEA,MAAM,aACJ,UAUI,CAAC,GACiD;AACtD,QAAI,WAAW,MAAM,KAAK,gBAAgB;AAE1C,eAAW,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAE7C,QAAI,QAAQ,UAAU;AACpB,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,QAAQ,QAAS,CAAC;AAAA,IAC5E;AAEA,QAAI,QAAQ,KAAK;AACf,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,QAAQ,GAAI,CAAC;AAAA,IAClE;AAEA,QAAI,QAAQ,aAAa;AACvB,iBAAW,SAAS,OAAO,CAAC,MAAM;AAChC,cAAM,KAAK,EAAE;AACb,YAAI,MAAM,QAAQ,EAAE,EAAG,QAAO,GAAG,SAAS,QAAQ,WAAY;AAC9D,eAAO,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,MAAM;AAAA,IACjE;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAM,IAAI,QAAQ,OAAO,YAAY;AACrC,iBAAW,SAAS,OAAO,CAAC,MAAM;AAChC,cAAM,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAI,EAAE,QAAQ,CAAC,CAAE,EAAE,OAAO,OAAO;AACpF,eAAO,OAAO,KAAK,CAAC,MAAM,EAAG,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,QAAQ,WAAW,YAAY,cAAc;AAC/D,UAAM,UAAU,QAAQ,cAAc,QAAQ,IAAI;AAClD,aAAS,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,SAAS,KAAK,OAAO;AAE/D,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,QAAQ,QAAQ,SAAS;AAE/B,WAAO;AAAA,MACL,UAAU,SAAS,MAAM,QAAQ,SAAS,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAQH;AACD,UAAM,CAAC,UAAU,QAAQ,OAAO,UAAU,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClE,KAAK,gBAAgB;AAAA,MACrB,KAAK,UAAU;AAAA,MACf,KAAK,SAAS;AAAA,MACd,KAAK,YAAY;AAAA,MACjB,KAAK,QAAQ;AAAA,IACf,CAAC;AAED,UAAM,gBAAwC,CAAC;AAC/C,UAAM,iBAAyC,CAAC;AAEhD,eAAW,KAAK,UAAU;AACxB,YAAM,QAAQ,MAAM,QAAQ,EAAE,WAAW,IACrC,EAAE,cACF,EAAE,cACA,CAAC,EAAE,WAAW,IACd,CAAC,SAAS;AAChB,iBAAW,KAAK,OAAO;AACrB,sBAAc,CAAC,KAAK,cAAc,CAAC,KAAK,KAAK;AAAA,MAC/C;AACA,YAAM,SAAS,EAAE,gBAAgB;AACjC,qBAAe,MAAM,KAAK,eAAe,MAAM,KAAK,KAAK;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL,eAAe,SAAS;AAAA,MACxB,aAAa,OAAO;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,eAAe,SAAS;AAAA,MACxB,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAA0D;AAC9D,QAAI,QAAQ;AACZ,QAAI,QAAQ;AAEZ,UAAM,OAAO,OAAO,QAA+B;AACjD,UAAI;AACF,cAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,mBAAW,SAAS,SAAS;AAC3B,gBAAM,OAAY,WAAK,KAAK,MAAM,IAAI;AACtC,cAAI,MAAM,YAAY,GAAG;AACvB,kBAAM,KAAK,IAAI;AAAA,UACjB,OAAO;AACL;AACA,gBAAI;AACF,oBAAMC,QAAO,MAAS,SAAK,IAAI;AAC/B,uBAASA,MAAK;AAAA,YAChB,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,UAAM,KAAK,KAAK,UAAU,IAAI;AAC9B,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AACF;;;AE3PA,YAAYC,WAAU;AAMf,SAAS,aAAa,QAAqB,QAA8B;AAC9E,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAE5D,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,WAAW,MAAM;AACnB,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,2BAA2B;AACtC,UAAM,KAAK,qBAAqB;AAChC,eAAW,KAAK,QAAQ;AACtB,YAAM,KAAK,OAAO,EAAE,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,UAAU,QAAQ,EAAE,IAAI;AAAA,IACxE;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,WAAW,SAAS;AACtB,UAAM,QAAQ;AACd,UAAM,QAAQ;AACd,UAAM,SAAS,GAAG,SAAS,QAAQ,KAAK,CAAC,IAAI,SAAS,QAAQ,KAAK,CAAC;AACpE,UAAM,MAAM,SAAI,OAAO,OAAO,MAAM;AACpC,UAAM,OAAO,OAAO,IAAI,CAAC,MAAM;AAC7B,YAAM,IAAI,SAAS,EAAE,MAAM,KAAK;AAChC,YAAM,IAAI,SAAS,EAAE,MAAM,KAAK;AAChC,aAAO,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,QAAQ,EAAE;AAAA,IAC9E,CAAC;AACD,WAAO,CAAC,KAAK,QAAQ,KAAK,GAAG,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,EACnD;AAEA,SAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,UAAU,eAAe,EAAE,EAAE,EAAE,KAAK,IAAI;AACjF;AAEA,SAAS,SAAS,KAAa,KAAqB;AAClD,MAAI,IAAI,UAAU,IAAK,QAAO;AAC9B,SAAO,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI;AACjC;AAEA,SAAS,WAAW,IAAoB;AACtC,SAAO,IAAI,KAAK,EAAE,EAAE,eAAe;AACrC;AAEA,SAAS,aAAa,IAAoB;AACxC,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,UAAU,KAAK,MAAM,OAAO,GAAI;AACtC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,QAAM,SAAS,KAAK,MAAM,OAAO,EAAE;AACnC,MAAI,SAAS,GAAI,QAAO,GAAG,MAAM;AACjC,SAAO,GAAG,KAAK,MAAM,SAAS,EAAE,CAAC;AACnC;AAEA,SAAS,SAAS,KAAa,KAAqB;AAClD,SAAO,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC;AACvD;AAEA,SAAS,QAAQ,KAAa,KAAqB;AACjD,SAAO,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI;AACrD;AAEA,SAAS,kBAAkB,IAA2C;AACpE,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,MAAM,QAAQ,EAAE,EAAG,QAAO,GAAG,KAAK,IAAI;AAC1C,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAuB;AAChD,SAAO,mDAAmD,KAAK,IAAI;AACrE;AAEA,SAAS,kBAAkB,MAAuB;AAChD,SAAO,qCAAqC,KAAK,IAAI;AACvD;AAEA,SAAS,sBAAsB,WAAmB,cAA8B;AAC9E,SAAY,cAAQ,WAAW,YAAY;AAC7C;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,MAAI,QAAQ,OAAO,OAAO,KAAM,QAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC5E,SAAO,IAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,CAAC,CAAC;AACrD;AAEO,SAAS,kBACd,UACA,OACA,QACQ;AACR,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,UAAU,MAAM,GAAG,MAAM,CAAC;AAEzE,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAI,WAAW,MAAM;AACnB,UAAMC,SAAkB,CAAC;AACzB,IAAAA,OAAM,KAAK,wCAAwC;AACnD,IAAAA,OAAM,KAAK,iCAAiC;AAC5C,eAAW,KAAK,UAAU;AACxB,YAAM,KAAK,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC;AAChC,YAAM,KAAK,kBAAkB,EAAE,WAAW;AAC1C,YAAM,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,OAAO,KAAK,IAAI;AACxD,YAAM,OAAO,EAAE,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI;AACzE,YAAM,OAAO,aAAa,EAAE,SAAS;AACrC,MAAAA,OAAM,KAAK,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,IAAI;AAAA,IAC/D;AACA,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,YAAY,SAAS,MAAM,OAAO,KAAK,YAAY;AAC9D,WAAOA,OAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,WAAW,SAAS;AACtB,UAAM,MAAM;AACZ,UAAM,QAAQ;AACd,UAAM,SAAS;AACf,UAAM,QAAQ;AACd,UAAM,QAAQ;AAEd,UAAM,SAAS,GAAG,SAAS,MAAM,GAAG,CAAC,IAAI,SAAS,QAAQ,KAAK,CAAC,IAAI,SAAS,SAAS,MAAM,CAAC,IAAI,SAAS,QAAQ,KAAK,CAAC,IAAI,SAAS,WAAW,KAAK,CAAC;AACtJ,UAAM,MAAM,SAAI,OAAO,OAAO,MAAM;AAEpC,UAAM,OAAO,SAAS,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,SAAS,EAAE,IAAI,GAAG;AAC7B,YAAM,KAAK,SAAS,kBAAkB,EAAE,WAAW,GAAG,KAAK;AAC3D,YAAM,QAAQ,SAAS,EAAE,SAAS,cAAc,MAAM;AACtD,YAAM,OAAO,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK;AACrD,YAAM,OAAO,aAAa,EAAE,SAAS;AACrC,aAAO,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,IAAI,SAAS,OAAO,MAAM,CAAC,IAAI,SAAS,MAAM,KAAK,CAAC,IAAI,SAAS,MAAM,KAAK,CAAC;AAAA,IACjI,CAAC;AAED,WAAO,CAAC,GAAG,GAAG,IAAI,QAAQ,KAAK,GAAG,MAAM,KAAK,WAAW,SAAS,MAAM,OAAO,KAAK,EAAE,EAAE;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,UAAU;AACxB,UAAM,MAAM,EAAE,WAAW,eAAQ;AACjC,UAAM,QAAQ,EAAE,SAAS;AACzB,UAAM,KAAK,kBAAkB,EAAE,WAAW;AAC1C,UAAM,KAAK,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE;AACnE,QAAI,EAAE,KAAM,OAAM,KAAK,cAAc,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE;AAC3D,QAAI,EAAE,MAAM,OAAQ,OAAM,KAAK,oBAAoB,EAAE,KAAK,KAAK,IAAI,CAAC,EAAE;AACtE,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,KAAK,GAAG,SAAS,MAAM,OAAO,KAAK,WAAW;AACpD,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,cAAc,SAAkB,QAAsB,WAA4B;AAChG,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAE7D,MAAI,WAAW,MAAM;AACnB,UAAMA,SAAkB,CAAC;AACzB,UAAM,QAAQ,QAAQ,SAAS;AAC/B,IAAAA,OAAM,KAAK,KAAK,KAAK,EAAE;AACvB,IAAAA,OAAM,KAAK,EAAE;AAEb,UAAMC,WAAU,QAAQ;AACxB,QAAIA,UAAS,SAAS,gBAAgBA,SAAQ,MAAM;AAClD,YAAM,WAAW,YACb,sBAAsB,WAAW,OAAOA,SAAQ,IAAI,CAAC,IACrD,OAAOA,SAAQ,IAAI;AACvB,YAAM,OAAO,OAAOA,SAAQ,YAAY,EAAE;AAE1C,UAAI,kBAAkB,IAAI,GAAG;AAC3B,QAAAD,OAAM,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AACrC,QAAAA,OAAM,KAAK,EAAE;AAAA,MACf,WAAW,kBAAkB,IAAI,GAAG;AAClC,QAAAA,OAAM,KAAK,WAAW,KAAK,KAAK,QAAQ,GAAG;AAC3C,QAAAA,OAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,IAAAA,OAAM,KAAK,eAAe,QAAQ,EAAE,IAAI;AACxC,IAAAA,OAAM,KAAK,eAAe,QAAQ,IAAI,KAAK,kBAAkB,QAAQ,WAAW,CAAC,GAAG;AACpF,QAAI,QAAQ,OAAQ,CAAAA,OAAM,KAAK,iBAAiB,QAAQ,MAAM,EAAE;AAChE,IAAAA,OAAM,KAAK,kBAAkB,WAAW,QAAQ,SAAS,CAAC,EAAE;AAC5D,IAAAA,OAAM,KAAK,kBAAkB,WAAW,QAAQ,SAAS,CAAC,EAAE;AAC5D,QAAI,QAAQ,SAAU,CAAAA,OAAM,KAAK,mBAAmB;AACpD,QAAI,QAAQ,MAAM;AAChB,MAAAA,OAAM,KAAK,eAAe,QAAQ,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC5E,QAAI,QAAQ,WAAW;AACrB,MAAAA,OAAM,KAAK,iBAAiB,QAAQ,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AACnF,QAAI,QAAQ,aAAc,CAAAA,OAAM,KAAK,iBAAiB,QAAQ,YAAY,EAAE;AAE5E,QAAI,QAAQ,MAAM;AAChB,MAAAA,OAAM,KAAK,EAAE;AACb,MAAAA,OAAM,KAAK,SAAS;AACpB,MAAAA,OAAM,KAAK,QAAQ,IAAI;AAAA,IACzB;AAEA,QAAI,QAAQ,MAAM;AAChB,MAAAA,OAAM,KAAK,EAAE;AACb,MAAAA,OAAM,KAAK,SAAS;AACpB,MAAAA,OAAM,KAAK,QAAQ,IAAI;AAAA,IACzB;AAEA,QAAIC,UAAS;AACX,UAAIA,SAAQ,SAAS,UAAUA,SAAQ,aAAa;AAClD,QAAAD,OAAM,KAAK,EAAE;AACb,QAAAA,OAAM,KAAK,YAAY;AACvB,QAAAA,OAAM,KAAK,OAAOC,SAAQ,WAAW,CAAC;AAAA,MACxC,WAAWA,SAAQ,SAAS,QAAQ;AAClC,QAAAD,OAAM,KAAK,EAAE;AACb,QAAAA,OAAM,KAAK,YAAY;AACvB,YAAIC,SAAQ,IAAK,CAAAD,OAAM,KAAK,YAAYC,SAAQ,GAAG,EAAE;AACrD,YAAIA,SAAQ,QAAS,CAAAD,OAAM,KAAK,iBAAiBC,SAAQ,OAAO,EAAE;AAClE,YAAIA,SAAQ;AACV,UAAAD,OAAM,KAAK,uBAAuB,SAAS,OAAOC,SAAQ,aAAa,GAAG,GAAG,CAAC,EAAE;AAAA,MACpF,WAAWA,SAAQ,SAAS,cAAc;AACxC,cAAM,WAAW,YACb,sBAAsB,WAAW,OAAOA,SAAQ,IAAI,CAAC,IACrD,OAAOA,SAAQ,QAAQ,EAAE;AAC7B,QAAAD,OAAM,KAAK,EAAE;AACb,QAAAA,OAAM,KAAK,eAAe;AAC1B,YAAIC,SAAQ,SAAU,CAAAD,OAAM,KAAK,eAAeC,SAAQ,QAAQ,EAAE;AAClE,YAAIA,SAAQ,KAAM,CAAAD,OAAM,KAAK,eAAe,WAAW,OAAOC,SAAQ,IAAI,CAAC,CAAC,EAAE;AAC9E,QAAAD,OAAM,KAAK,iBAAiB,QAAQ,IAAI;AAAA,MAC1C;AAAA,IACF;AAEA,WAAOA,OAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,SAAI,OAAO,EAAE;AAEzB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,cAAc,QAAQ,EAAE,EAAE;AACrC,QAAM,KAAK,cAAc,QAAQ,IAAI,KAAK,kBAAkB,QAAQ,WAAW,CAAC,GAAG;AACnF,MAAI,QAAQ,MAAO,OAAM,KAAK,cAAc,QAAQ,KAAK,EAAE;AAC3D,MAAI,QAAQ,OAAQ,OAAM,KAAK,cAAc,QAAQ,MAAM,EAAE;AAC7D,QAAM,KAAK,cAAc,WAAW,QAAQ,SAAS,CAAC,EAAE;AACxD,QAAM,KAAK,cAAc,WAAW,QAAQ,SAAS,CAAC,EAAE;AACxD,MAAI,QAAQ,SAAU,OAAM,KAAK,gBAAgB;AACjD,MAAI,QAAQ,MAAM,OAAQ,OAAM,KAAK,cAAc,QAAQ,KAAK,KAAK,IAAI,CAAC,EAAE;AAC5E,MAAI,QAAQ,WAAW,OAAQ,OAAM,KAAK,cAAc,QAAQ,UAAU,KAAK,IAAI,CAAC,EAAE;AACtF,MAAI,QAAQ,aAAc,OAAM,KAAK,cAAc,QAAQ,YAAY,EAAE;AACzE,MAAI,QAAQ,iBAAkB,OAAM,KAAK,cAAc,QAAQ,gBAAgB,EAAE;AAEjF,MAAI,QAAQ,MAAM;AAChB,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,KAAK,QAAQ,IAAI,EAAE;AAAA,EAChC;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,KAAK,QAAQ,IAAI,EAAE;AAAA,EAChC;AAEA,QAAM,UAAU,QAAQ;AACxB,MAAI,SAAS;AACX,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,YAAY;AACvB,QAAI,QAAQ,SAAS,UAAU,QAAQ,aAAa;AAClD,YAAM,OAAO,OAAO,QAAQ,WAAW;AACvC,YAAM,KAAK,KAAK,SAAS,MAAM,GAAG,CAAC,EAAE;AAAA,IACvC,WAAW,QAAQ,SAAS,QAAQ;AAClC,UAAI,QAAQ,IAAK,OAAM,KAAK,UAAU,QAAQ,GAAG,EAAE;AACnD,UAAI,QAAQ,QAAS,OAAM,KAAK,eAAe,QAAQ,OAAO,EAAE;AAChE,UAAI,QAAQ;AACV,cAAM,KAAK,cAAc,SAAS,OAAO,QAAQ,aAAa,GAAG,GAAG,CAAC,EAAE;AAAA,IAC3E,WAAW,QAAQ,SAAS,cAAc;AACxC,UAAI,QAAQ,SAAU,OAAM,KAAK,WAAW,QAAQ,QAAQ,EAAE;AAC9D,UAAI,QAAQ,KAAM,OAAM,KAAK,WAAW,WAAW,OAAO,QAAQ,IAAI,CAAC,CAAC,EAAE;AAC1E,UAAI,QAAQ,MAAM;AAChB,cAAM,WAAW,YACb,sBAAsB,WAAW,OAAO,QAAQ,IAAI,CAAC,IACrD,OAAO,QAAQ,IAAI;AACvB,cAAM,KAAK,WAAW,QAAQ,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,aAAa,QAAiB,QAA8B;AAC1E,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAE5D,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,WAAW,MAAM;AACnB,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,oCAAoC;AAC/C,UAAM,KAAK,4BAA4B;AACvC,eAAW,KAAK,QAAQ;AACtB,YAAM,MAAM,EAAE,WAAW,QAAQ;AACjC,YAAM,KAAK,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI;AAAA,IAC1E;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,WAAW,SAAS;AACtB,UAAM,OAAO;AACb,UAAM,QAAQ;AACd,UAAM,SAAS;AACf,UAAM,SAAS,GAAG,SAAS,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,KAAK,CAAC,IAAI,QAAQ,SAAS,MAAM,CAAC;AAC9F,UAAM,MAAM,SAAI,OAAO,OAAO,MAAM;AAEpC,UAAM,OAAO,OAAO,IAAI,CAAC,MAAM;AAC7B,aAAO,GAAG,SAAS,SAAS,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,SAAS,SAAS,EAAE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,QAAQ,OAAO,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC;AAAA,IAC1I,CAAC;AAED,WAAO,CAAC,KAAK,QAAQ,KAAK,GAAG,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,EACnD;AAEA,SAAO,OACJ,IAAI,CAAC,MAAM;AACV,UAAM,MAAM,EAAE,WAAW,eAAQ;AACjC,WAAO,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,KAAK,EAAE,aAAa,CAAC;AAAA,EACnE,CAAC,EACA,KAAK,IAAI;AACd;AAEO,SAAS,YAAY,OAAe,QAA8B;AACvE,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAC3D,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,WAAW,MAAM;AACnB,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,eAAe;AAC1B,eAAW,KAAK,OAAO;AACrB,YAAM,KAAK,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,IAAI;AAAA,IAC3C;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,SAAO,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AACtE;AAEO,SAAS,WAAW,MAAgB,QAA8B;AACvE,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAC1D,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,MAAI,WAAW,MAAM;AACnB,WAAO,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI;AAAA,EAChD;AAEA,SAAO,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAC5C;AAEO,SAAS,eAAe,UAAoB,QAA8B;AAC/E,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAC9D,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAI,WAAW,MAAM;AACnB,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,qCAAqC;AAChD,UAAM,KAAK,6BAA6B;AACxC,eAAW,KAAK,UAAU;AACxB,YAAM;AAAA,QACJ,OAAO,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,MAAM,EAAE,YAAY,MAAM;AAAA,MACrF;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,SAAO,SACJ;AAAA,IACC,CAAC,MACC,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,WAAW,EAAE,YAAY,MAAM;AAAA,EACvF,EACC,KAAK,IAAI;AACd;AAEO,SAAS,YACd,OASA,WACA,QACQ;AACR,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7E,MAAI,WAAW,MAAM;AACnB,UAAMA,SAAkB,CAAC;AACzB,IAAAA,OAAM,KAAK,eAAe;AAC1B,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,eAAe,SAAS,IAAI;AACvC,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,oBAAoB;AAC/B,IAAAA,OAAM,KAAK,gBAAgB;AAC3B,IAAAA,OAAM,KAAK,gBAAgB,MAAM,aAAa,IAAI;AAClD,IAAAA,OAAM,KAAK,cAAc,MAAM,WAAW,IAAI;AAC9C,IAAAA,OAAM,KAAK,aAAa,MAAM,UAAU,IAAI;AAC5C,IAAAA,OAAM,KAAK,gBAAgB,MAAM,aAAa,IAAI;AAClD,IAAAA,OAAM,KAAK,YAAY,MAAM,SAAS,IAAI;AAC1C,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,qBAAqB;AAChC,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,kBAAkB;AAC7B,IAAAA,OAAM,KAAK,gBAAgB;AAC3B,UAAME,eAAc,OAAO,QAAQ,MAAM,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAClF,eAAW,CAAC,MAAM,KAAK,KAAKA,cAAa;AACvC,MAAAF,OAAM,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACrC;AACA,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,sBAAsB;AACjC,IAAAA,OAAM,KAAK,EAAE;AACb,IAAAA,OAAM,KAAK,oBAAoB;AAC/B,IAAAA,OAAM,KAAK,gBAAgB;AAC3B,UAAMG,gBAAe,OAAO,QAAQ,MAAM,cAAc,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACpF,eAAW,CAAC,QAAQ,KAAK,KAAKA,eAAc;AAC1C,MAAAH,OAAM,KAAK,KAAK,MAAM,MAAM,KAAK,IAAI;AAAA,IACvC;AACA,WAAOA,OAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,MAAM,SAAI,OAAO,EAAE;AACzB,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,YAAY,SAAS,EAAE;AAClC,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,gBAAgB,MAAM,aAAa,EAAE;AAChD,QAAM,KAAK,gBAAgB,MAAM,WAAW,EAAE;AAC9C,QAAM,KAAK,gBAAgB,MAAM,UAAU,EAAE;AAC7C,QAAM,KAAK,gBAAgB,MAAM,aAAa,EAAE;AAChD,QAAM,KAAK,gBAAgB,MAAM,SAAS,EAAE;AAC5C,QAAM,KAAK,GAAG;AAEd,QAAM,KAAK,oBAAoB;AAC/B,QAAM,cAAc,OAAO,QAAQ,MAAM,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAClF,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,UAAM,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE;AAAA,EAC9C;AAEA,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,qBAAqB;AAChC,QAAM,eAAe,OAAO,QAAQ,MAAM,cAAc,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACpF,aAAW,CAAC,QAAQ,KAAK,KAAK,cAAc;AAC1C,UAAM,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE;AAAA,EAChD;AAEA,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC3bA,IAAM,UAAU;AAQhB,SAAS,iBAAiB,MAAwD;AAChF,QAAM,QAAqB,EAAE,QAAQ,SAAS;AAC9C,QAAM,OAAiB,CAAC;AACxB,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,aAAa,IAAI,IAAI,KAAK,QAAQ;AAC5C,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,WAAK;AAAA,IACP,WAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS;AACf;AAAA,IACF,WAAW,QAAQ,UAAU,QAAQ,cAAc;AACjD,YAAM,SAAS;AACf;AAAA,IACF,WAAW,QAAQ,WAAW;AAC5B,YAAM,SAAS;AACf;AAAA,IACF,WAAW,QAAQ,cAAc,IAAI,IAAI,KAAK,QAAQ;AACpD,YAAM,SAAS,KAAK,IAAI,CAAC;AACzB,WAAK;AAAA,IACP,WAAW,QAAQ,aAAa;AAC9B,YAAM,UAAU;AAChB;AAAA,IACF,OAAO;AACL,WAAK,KAAK,GAAG;AACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,YAAY,MAAgB,MAAkC;AACrE,QAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,MAAI,QAAQ,MAAM,MAAM,KAAK,KAAK,OAAQ,QAAO;AACjD,SAAO,KAAK,MAAM,CAAC;AACrB;AAEA,SAAS,QAAQ,MAAgB,MAAuB;AACtD,SAAO,KAAK,SAAS,IAAI;AAC3B;AAEA,SAAS,cAAc,MAAgB,MAAc,YAA4B;AAC/E,QAAM,MAAM,YAAY,MAAM,IAAI;AAClC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,SAAS,KAAK,EAAE;AAC1B,SAAO,MAAM,CAAC,IAAI,aAAa;AACjC;AAEA,eAAe,QAAQ,QAAqB,MAAgB,QAAqC;AAC/F,QAAM,QAAQ,cAAc,MAAM,WAAW,EAAE;AAC/C,QAAM,SAAS,cAAc,MAAM,YAAY,CAAC;AAChD,QAAM,WAAW,YAAY,MAAM,SAAS;AAC5C,QAAM,MAAM,YAAY,MAAM,OAAO;AACrC,QAAM,cAAc,YAAY,MAAM,QAAQ;AAC9C,QAAM,SAAS,YAAY,MAAM,UAAU,KAAK,YAAY,MAAM,IAAI;AACtE,QAAM,SAAS,QAAQ,MAAM,UAAU,IAAI,OAAO;AAClD,QAAM,SAAU,YAAY,MAAM,QAAQ,KAA+B;AACzE,QAAM,YAAY,QAAQ,MAAM,OAAO,IAAK,QAAmB;AAE/D,QAAM,SAAS,MAAM,OAAO,aAAa;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,kBAAkB,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AACtE;AAEA,eAAe,OAAO,QAAqB,MAAgB,QAAqC;AAC9F,QAAM,KAAK,KAAK,CAAC;AACjB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,gCAAgC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,UAAU,MAAM,OAAO,eAAe,EAAE;AAE5C,MAAI,CAAC,SAAS;AACZ,UAAM,QAAQ,MAAM,OAAO,gBAAgB;AAC3C,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACnD,QAAI,OAAO;AACT,gBAAU,MAAM,OAAO,eAAe,MAAM,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,sBAAsB,EAAE,EAAE;AACxC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,cAAc,SAAS,QAAQ,OAAO,SAAS,CAAC;AAC9D;AAEA,eAAe,UAAU,QAAqB,MAAgB,QAAqC;AACjG,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,QAAI,KAAK,CAAC,EAAE,WAAW,IAAI,KAAK,IAAI,IAAI,KAAK,QAAQ;AACnD,WAAK;AAAA,IACP,WAAW,KAAK,CAAC,EAAE,WAAW,IAAI,GAAG;AACnC;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,KAAK,CAAC,CAAC;AACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,WAAW,KAAK,GAAG;AACjC,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,8BAA8B;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,cAAc,MAAM,WAAW,EAAE;AAE/C,QAAM,SAAS,MAAM,OAAO,aAAa,EAAE,QAAQ,OAAO,MAAM,CAAC;AACjE,UAAQ,IAAI,kBAAkB,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AACtE;AAEA,eAAe,UACb,QACA,OACA,QACe;AACf,QAAM,SAAS,MAAM,OAAO,UAAU;AACtC,UAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAC1C;AAEA,eAAe,SAAS,QAAqB,OAAiB,QAAqC;AACjG,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAQ,IAAI,YAAY,OAAO,MAAM,CAAC;AACxC;AAEA,eAAe,QAAQ,QAAqB,OAAiB,QAAqC;AAChG,QAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,UAAQ,IAAI,WAAW,MAAM,MAAM,CAAC;AACtC;AAEA,eAAe,YACb,QACA,OACA,QACe;AACf,QAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAQ,IAAI,eAAe,UAAU,MAAM,CAAC;AAC9C;AAEA,eAAe,SAAS,QAAqB,OAAiB,QAAqC;AACjG,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAQ,IAAI,YAAY,OAAO,OAAO,WAAW,MAAM,CAAC;AAC1D;AAEA,eAAe,QAAQ,QAAqB,MAA+B;AACzE,QAAM,KAAK,KAAK,CAAC;AACjB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,iCAAiC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AAChB,QAAM,UAAU,MAAM,OAAO,eAAe,EAAE;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,QAAQ,MAAM,OAAO,gBAAgB;AAC3C,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACnD,QAAI,MAAO,aAAY,MAAM;AAAA,EAC/B;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAe;AAC7C,QAAM,MAAM,oBAAoB,SAAS;AACzC,OAAK,SAAS,GAAG,GAAG;AACpB,UAAQ,IAAI,8BAA8B,SAAS,EAAE;AACvD;AAEA,eAAe,UAAU,MAA+B;AACtD,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,YAAY,MAAM,QAAQ;AAC5E,QAAM,MAAM,YAAY,MAAM,OAAO;AACrC,QAAM,QAAQ,YAAY,MAAM,SAAS;AACzC,QAAM,OAAO,YAAY,MAAM,QAAQ;AACvC,QAAM,SAAS,YAAY,MAAM,UAAU;AAC3C,QAAM,QAAQ,YAAY,MAAM,SAAS;AAEzC,MAAI,CAAC,WAAW,CAAC,KAAK;AACpB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAS,QAAO,IAAI,WAAW,OAAO;AAC1C,MAAI,IAAK,QAAO,IAAI,OAAO,GAAG;AAC9B,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AACpC,MAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,MAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AAEpC,QAAM,cAAc,gBAAgB,OAAO,SAAS,CAAC;AACrD,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAe;AAC7C,OAAK,SAAS,WAAW,GAAG;AAC5B,UAAQ,IAAI,yCAAyC;AACvD;AAEA,eAAe,UAAU,QAAqB,MAAgB,QAAqC;AACjG,QAAM,WAAW,YAAY,MAAM,SAAS;AAC5C,QAAM,MAAM,YAAY,MAAM,OAAO;AACrC,QAAM,cAAc,YAAY,MAAM,QAAQ;AAE9C,QAAM,SAAS,MAAM,OAAO,aAAa;AAAA,IACvC,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAsC,CAAC;AAC7C,aAAW,QAAQ,OAAO,UAAU;AAClC,UAAM,OAAO,MAAM,OAAO,eAAe,KAAK,EAAE;AAChD,QAAI,KAAM,UAAS,KAAK,IAAI;AAAA,EAC9B;AAEA,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,EAC/C,WAAW,WAAW,MAAM;AAC1B,UAAM,QAAkB,CAAC;AACzB,eAAW,KAAK,UAAU;AACxB,YAAM,MAAM;AACZ,YAAM,QAAS,IAAI,SAAoB;AACvC,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,MAAM,KAAK,EAAE;AACxB,YAAM,KAAK,eAAe,EAAE,IAAI;AAChC,UAAI,IAAI,YAAa,OAAM,KAAK,eAAe,IAAI,WAAW,EAAE;AAChE,UAAI,IAAI,KAAM,OAAM,KAAK,eAAe,IAAI,IAAI,EAAE;AAClD,UAAI,IAAI,KAAM,OAAM,KAAK,eAAe,IAAI,IAAI,EAAE;AAClD,YAAM,KAAK,EAAE;AAAA,IACf;AACA,UAAM,KAAK,aAAa,SAAS,MAAM,YAAY;AACnD,YAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,EAC9B,OAAO;AACL,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C,YAAQ,MAAM;AAAA,WAAc,SAAS,MAAM,2CAA2C;AAAA,EACxF;AACF;AAEA,SAAS,YAAkB;AACzB,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA+EX,OAAO;AAAA;AAET,UAAQ,IAAI,KAAK,KAAK,CAAC;AACzB;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,QAAQ,KAAK,MAAM,CAAC;AAEpC,MAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,MAAM;AAC1E,cAAU;AACV;AAAA,EACF;AAEA,MAAI,QAAQ,CAAC,MAAM,eAAe,QAAQ,CAAC,MAAM,MAAM;AACrD,YAAQ,IAAI,OAAO;AACnB;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,KAAK,IAAI,iBAAiB,OAAO;AAChD,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,QAAM,cAAc,KAAK,MAAM,CAAC;AAEhC,MAAI,YAAY,UAAU;AACxB,UAAM,UAAU,WAAW;AAC3B;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,YAAY,eAAe;AACrD,UAAM,UAAU,YAAY,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AAC1D,UAAM,SAAS,MAAM,WAAW,EAAE,SAAS,SAAS,MAAM,QAAQ,CAAC;AACnE,YAAQ,IAAI,aAAa,QAAQ,MAAM,MAAM,CAAC;AAC9C;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,kBAAkB,MAAM,KAAK;AACrD,QAAM,SAAS,IAAI,YAAY,SAAS;AAExC,QAAM,WACJ;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAEF,MAAI,YAAY,QAAQ;AACtB,UAAM,QAAQ,QAAQ,WAAW;AACjC;AAAA,EACF;AAEA,MAAI,YAAY,OAAO;AACrB,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc;AAC9C,WAAO,EAAE,OAAO,CAAC;AACjB;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,OAAO;AAChC,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,YAAQ,MAAM,gCAAgC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,QAAQ,aAAa,MAAM,MAAM;AACjD;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAQ,MAAM,UAAU,OAAO,EAAE;AACjC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["fs","path","stat","stat","path","lines","content","sortedTypes","sortedStatus"]}
|
|
1
|
+
{"version":3,"sources":["../src/reader.ts","../src/vault.ts","../src/format.ts","../src/index.ts"],"sourcesContent":["import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { type VaultStructure, getVaultStructure } from \"./vault.js\";\n\nexport type CaptureIndex = {\n id: string;\n type: string;\n filePath?: string;\n createdAt: number;\n updatedAt: number;\n contentType?: string | string[];\n title?: string;\n tags?: string[];\n spaceKeys?: string[];\n mimeTypes?: string[];\n note?: string;\n tldr?: string;\n source?: string;\n isPinned?: boolean;\n isHidden?: boolean;\n triageStatus?: string;\n processingStatus?: string;\n};\n\nexport type Space = {\n id: string;\n name: string;\n key: string;\n areaKey?: string;\n icon?: string;\n color?: string;\n createdAt: number;\n updatedAt: number;\n noteCount?: number;\n isPinned?: boolean;\n};\n\nexport type Area = {\n id: string;\n name: string;\n key: string;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type Canvas = {\n id: string;\n name: string;\n createdAt: number;\n updatedAt: number;\n nodes: unknown[];\n connections: unknown[];\n annotations: unknown[];\n};\n\nexport type Capture = CaptureIndex & {\n content: Record<string, unknown>;\n author?: Record<string, unknown>;\n colorPalette?: unknown[];\n embedding?: number[];\n};\n\ntype IndexMap<T> = Record<string, T>;\n\nasync function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const data = await fs.readFile(filePath, \"utf-8\");\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n}\n\nexport class VaultReader {\n private structure: VaultStructure;\n\n constructor(vaultPath: string) {\n this.structure = getVaultStructure(vaultPath);\n }\n\n get vaultPath(): string {\n return this.structure.root;\n }\n\n async getCaptureIndex(): Promise<CaptureIndex[]> {\n const indexPath = path.join(this.structure.index, \"index.captures.json\");\n const data = await readJson<IndexMap<CaptureIndex>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getSpaces(): Promise<Space[]> {\n const indexPath = path.join(this.structure.index, \"index.spaces.json\");\n const data = await readJson<IndexMap<Space>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getAreas(): Promise<Area[]> {\n const indexPath = path.join(this.structure.index, \"index.areas.json\");\n const data = await readJson<IndexMap<Area>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getCanvases(): Promise<Canvas[]> {\n const indexPath = path.join(this.structure.index, \"index.canvases.json\");\n const data = await readJson<IndexMap<Canvas>>(indexPath);\n if (!data) return [];\n return Object.values(data);\n }\n\n async getTags(): Promise<string[]> {\n const indexPath = path.join(this.structure.index, \"index.tags.json\");\n const data = await readJson<string[]>(indexPath);\n return data ?? [];\n }\n\n async getCaptureById(id: string): Promise<Capture | null> {\n const capturePath = path.join(this.structure.captures, `${id}.json`);\n return readJson<Capture>(capturePath);\n }\n\n async listCaptures(\n options: {\n limit?: number;\n offset?: number;\n spaceKey?: string;\n tag?: string;\n contentType?: string;\n search?: string;\n pinned?: boolean;\n sortBy?: \"created\" | \"updated\";\n sortOrder?: \"asc\" | \"desc\";\n } = {}\n ): Promise<{ captures: CaptureIndex[]; total: number }> {\n let captures = await this.getCaptureIndex();\n\n captures = captures.filter((c) => !c.isHidden);\n\n if (options.spaceKey) {\n captures = captures.filter((c) => c.spaceKeys?.includes(options.spaceKey!));\n }\n\n if (options.tag) {\n captures = captures.filter((c) => c.tags?.includes(options.tag!));\n }\n\n if (options.contentType) {\n captures = captures.filter((c) => {\n const ct = c.contentType;\n if (Array.isArray(ct)) return ct.includes(options.contentType!);\n return ct === options.contentType;\n });\n }\n\n if (options.pinned !== undefined) {\n captures = captures.filter((c) => c.isPinned === options.pinned);\n }\n\n if (options.search) {\n const q = options.search.toLowerCase();\n captures = captures.filter((c) => {\n const fields = [c.title, c.note, c.tldr, c.source, ...(c.tags ?? [])].filter(Boolean);\n return fields.some((f) => f!.toLowerCase().includes(q));\n });\n }\n\n const sortField = options.sortBy === \"updated\" ? \"updatedAt\" : \"createdAt\";\n const sortDir = options.sortOrder === \"asc\" ? 1 : -1;\n captures.sort((a, b) => (b[sortField] - a[sortField]) * sortDir);\n\n const total = captures.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 20;\n\n return {\n captures: captures.slice(offset, offset + limit),\n total,\n };\n }\n\n async getStats(): Promise<{\n totalCaptures: number;\n totalSpaces: number;\n totalAreas: number;\n totalCanvases: number;\n totalTags: number;\n byContentType: Record<string, number>;\n byTriageStatus: Record<string, number>;\n }> {\n const [captures, spaces, areas, canvases, tags] = await Promise.all([\n this.getCaptureIndex(),\n this.getSpaces(),\n this.getAreas(),\n this.getCanvases(),\n this.getTags(),\n ]);\n\n const byContentType: Record<string, number> = {};\n const byTriageStatus: Record<string, number> = {};\n\n for (const c of captures) {\n const types = Array.isArray(c.contentType)\n ? c.contentType\n : c.contentType\n ? [c.contentType]\n : [\"unknown\"];\n for (const t of types) {\n byContentType[t] = (byContentType[t] ?? 0) + 1;\n }\n const status = c.triageStatus ?? \"none\";\n byTriageStatus[status] = (byTriageStatus[status] ?? 0) + 1;\n }\n\n return {\n totalCaptures: captures.length,\n totalSpaces: spaces.length,\n totalAreas: areas.length,\n totalCanvases: canvases.length,\n totalTags: tags.length,\n byContentType,\n byTriageStatus,\n };\n }\n\n async getVaultSize(): Promise<{ files: number; bytes: number }> {\n let files = 0;\n let bytes = 0;\n\n const walk = async (dir: string): Promise<void> => {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(full);\n } else {\n files++;\n try {\n const stat = await fs.stat(full);\n bytes += stat.size;\n } catch {}\n }\n }\n } catch {}\n };\n\n await walk(this.structure.root);\n return { files, bytes };\n }\n}\n","import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\n\nconst VAULT_NAMES = [\"Resurf Vault\", \"Resurf Vault Dev\"];\nconst APP_NAMES = [\n \"so.resurf.app\",\n \"so.resurf.app.dev\",\n \"Resurf\",\n \"Resurf Dev\",\n \"desktop\",\n];\nconst CONFIG_FILES = [\"app.json\", \"app.dev.json\"];\n\nexport type VaultStructure = {\n root: string;\n captures: string;\n attachments: string;\n index: string;\n config: string;\n trash: string;\n};\n\nexport function getVaultStructure(vaultPath: string): VaultStructure {\n const root = path.resolve(vaultPath);\n return {\n root,\n captures: path.join(root, \"captures\"),\n attachments: path.join(root, \"attachments\"),\n index: path.join(root, \".index\"),\n config: path.join(root, \".config\"),\n trash: path.join(root, \".trash\"),\n };\n}\n\nexport async function hasVaultConfig(dir: string): Promise<boolean> {\n try {\n const configPath = path.join(dir, \".config\", \"vault.json\");\n await fs.access(configPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getVaultNameFromConfig(dir: string): Promise<string> {\n try {\n const configPath = path.join(dir, \".config\", \"vault.json\");\n const data = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(data) as { name?: string };\n return config.name ?? path.basename(dir);\n } catch {\n return path.basename(dir);\n }\n}\n\nasync function getCurrentVaultFromAppConfig(): Promise<{\n path: string;\n valid: boolean;\n} | null> {\n const home = os.homedir();\n const base = path.join(home, \"Library\", \"Application Support\");\n for (const appName of APP_NAMES) {\n for (const configFile of CONFIG_FILES) {\n const configPath = path.join(base, appName, configFile);\n try {\n const data = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(data) as { vaultPath?: string };\n const vaultPath = config.vaultPath?.trim();\n if (vaultPath) {\n const valid = await hasVaultConfig(vaultPath);\n return { path: vaultPath, valid };\n }\n } catch {\n // ignore\n }\n }\n }\n return null;\n}\n\nfunction getDefaultSearchDirs(): string[] {\n const home = os.homedir();\n const dirs: string[] = [];\n const documents = path.join(home, \"Documents\");\n dirs.push(documents);\n for (const name of VAULT_NAMES) {\n dirs.push(path.join(documents, name));\n }\n const iCloud = path.join(home, \"Library\", \"Mobile Documents\", \"com~apple~CloudDocs\");\n dirs.push(iCloud);\n for (const name of VAULT_NAMES) {\n dirs.push(path.join(iCloud, name));\n }\n return dirs;\n}\n\nasync function scanDirForVaults(\n dir: string,\n vaults: VaultInfo[],\n seen: Set<string>,\n currentResolved: string | null,\n verbose: boolean\n): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const ent of entries) {\n if (!ent.isDirectory() || ent.name.startsWith(\".\")) continue;\n const sub = path.join(dir, ent.name);\n try {\n if (await hasVaultConfig(sub)) {\n const resolved = path.resolve(sub);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(sub);\n vaults.push({\n path: resolved,\n name,\n current: currentResolved === resolved,\n });\n seen.add(resolved);\n }\n } else {\n const nested = await fs.readdir(sub, { withFileTypes: true }).catch(() => []);\n for (const n of nested) {\n if (!n.isDirectory() || n.name.startsWith(\".\")) continue;\n const subSub = path.join(sub, n.name);\n if (await hasVaultConfig(subSub)) {\n const resolved = path.resolve(subSub);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(subSub);\n vaults.push({\n path: resolved,\n name,\n current: currentResolved === resolved,\n });\n seen.add(resolved);\n }\n }\n }\n }\n } catch {\n if (verbose) console.error(\"Skipping (inaccessible):\", sub);\n }\n }\n } catch (err) {\n if (verbose) console.error(\"Skipping (inaccessible):\", dir, err);\n }\n}\n\nexport type VaultInfo = {\n path: string;\n name: string;\n current: boolean;\n};\n\nexport async function findVaults(options?: {\n scanDir?: string;\n verbose?: boolean;\n}): Promise<VaultInfo[]> {\n const vaults: VaultInfo[] = [];\n const seen = new Set<string>();\n\n const current = await getCurrentVaultFromAppConfig();\n if (current?.path && current.valid) {\n const name = await getVaultNameFromConfig(current.path);\n vaults.push({ path: path.resolve(current.path), name, current: true });\n seen.add(path.resolve(current.path));\n }\n\n const currentResolvedForScan = current?.path ? path.resolve(current.path) : null;\n const verbose = options?.verbose ?? false;\n const searchDirs = options?.scanDir ? [options.scanDir] : getDefaultSearchDirs();\n\n for (const dir of searchDirs) {\n try {\n await fs.access(dir);\n } catch {\n if (verbose) console.error(\"Skipping (inaccessible):\", dir);\n continue;\n }\n if (await hasVaultConfig(dir)) {\n const resolved = path.resolve(dir);\n if (!seen.has(resolved)) {\n const name = await getVaultNameFromConfig(dir);\n vaults.push({\n path: resolved,\n name,\n current: currentResolvedForScan === resolved,\n });\n seen.add(resolved);\n }\n } else if (options?.scanDir) {\n await findVaultsRecursive(dir, vaults, seen, currentResolvedForScan);\n } else {\n const base = path.basename(dir);\n if (base === \"Documents\" || base === \"com~apple~CloudDocs\") {\n await scanDirForVaults(dir, vaults, seen, currentResolvedForScan, verbose);\n }\n }\n }\n\n const currentResolved = current?.path ? path.resolve(current.path) : null;\n const normalized = vaults.map((v) => ({\n ...v,\n path: path.resolve(v.path),\n current: currentResolved === path.resolve(v.path),\n }));\n return Array.from(new Map(normalized.map((v) => [v.path, v])).values());\n}\n\nasync function findVaultsRecursive(\n dir: string,\n results: VaultInfo[],\n seen: Set<string>,\n currentResolved: string | null\n): Promise<void> {\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) return;\n if (seen.has(dir)) return;\n seen.add(dir);\n\n if (await hasVaultConfig(dir)) {\n const name = await getVaultNameFromConfig(dir);\n results.push({\n path: path.resolve(dir),\n name,\n current: currentResolved === path.resolve(dir),\n });\n return;\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const ent of entries) {\n if (ent.isDirectory() && !ent.name.startsWith(\".\")) {\n const child = path.join(dir, ent.name);\n await findVaultsRecursive(child, results, seen, currentResolved);\n }\n }\n } catch {\n // skip inaccessible dirs\n }\n}\n\nexport async function discoverVaultPath(override?: string): Promise<string> {\n if (override?.trim()) {\n const resolved = path.resolve(override);\n const valid = await hasVaultConfig(resolved);\n if (!valid) {\n throw new Error(`Not a valid Resurf vault: ${resolved}`);\n }\n return resolved;\n }\n\n const current = await getCurrentVaultFromAppConfig();\n if (current?.path && current.valid) {\n return path.resolve(current.path);\n }\n\n const home = os.homedir();\n const documents = path.join(home, \"Documents\");\n const iCloud = path.join(home, \"Library\", \"Mobile Documents\", \"com~apple~CloudDocs\");\n\n for (const name of VAULT_NAMES) {\n for (const parent of [documents, iCloud]) {\n const candidate = path.join(parent, name);\n try {\n await fs.access(candidate);\n if (await hasVaultConfig(candidate)) {\n return path.resolve(candidate);\n }\n } catch {\n // skip\n }\n }\n }\n\n const fallback = path.join(documents, VAULT_NAMES[0]);\n throw new Error(\n `No Resurf vault found. Set one with --vault <path>, or create a vault at ${fallback}`\n );\n}\n","import * as path from \"path\";\nimport type { CaptureIndex, Capture, Space, Area, Canvas } from \"./reader.js\";\nimport type { VaultInfo } from \"./vault.js\";\n\nexport type OutputFormat = \"json\" | \"md\" | \"table\" | \"pretty\";\n\nexport function formatVaults(vaults: VaultInfo[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(vaults, null, 2);\n\n if (vaults.length === 0) return \"No vaults found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Path | Name | Current |`);\n lines.push(`| --- | --- | --- |`);\n for (const v of vaults) {\n lines.push(`| \\`${v.path}\\` | ${v.name} | ${v.current ? \"yes\" : \"\"} |`);\n }\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const pathW = 60;\n const nameW = 24;\n const header = `${padRight(\"PATH\", pathW)} ${padRight(\"NAME\", nameW)} CURRENT`;\n const sep = \"─\".repeat(header.length);\n const rows = vaults.map((v) => {\n const p = truncate(v.path, pathW);\n const n = truncate(v.name, nameW);\n return `${padRight(p, pathW)} ${padRight(n, nameW)} ${v.current ? \"yes\" : \"\"}`;\n });\n return [sep, header, sep, ...rows, sep].join(\"\\n\");\n }\n\n return vaults.map((v) => `${v.path}${v.current ? \" (current)\" : \"\"}`).join(\"\\n\");\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nfunction formatDate(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n return `${Math.floor(months / 12)}y ago`;\n}\n\nfunction padRight(str: string, len: number): string {\n return str + \" \".repeat(Math.max(0, len - str.length));\n}\n\nfunction padLeft(str: string, len: number): string {\n return \" \".repeat(Math.max(0, len - str.length)) + str;\n}\n\nfunction formatContentType(ct: string | string[] | undefined): string {\n if (!ct) return \"—\";\n if (Array.isArray(ct)) return ct.join(\", \");\n return ct;\n}\n\nfunction isEmbeddableImage(mime: string): boolean {\n return /^image\\/(png|jpe?g|gif|webp|svg\\+xml|bmp|avif)$/i.test(mime);\n}\n\nfunction isEmbeddableVideo(mime: string): boolean {\n return /^video\\/(mp4|webm|mov|quicktime)$/i.test(mime);\n}\n\nfunction resolveAttachmentPath(vaultPath: string, relativePath: string): string {\n return path.resolve(vaultPath, relativePath);\n}\n\nexport function captureWithAbsoluteAttachmentPaths(capture: Capture, vaultPath: string): Capture {\n const content = capture.content;\n if (!content || content.type !== \"attachment\" || typeof content.path !== \"string\") {\n return capture;\n }\n return {\n ...capture,\n content: {\n ...content,\n path: resolveAttachmentPath(vaultPath, content.path),\n },\n };\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function formatCaptureList(\n captures: CaptureIndex[],\n total: number,\n format: OutputFormat\n): string {\n if (format === \"json\") return JSON.stringify({ captures, total }, null, 2);\n\n if (captures.length === 0) return \"No captures found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| ID | Type | Title | Tags | Created |`);\n lines.push(`| --- | --- | --- | --- | --- |`);\n for (const c of captures) {\n const id = `\\`${c.id.slice(0, 8)}\\``;\n const ct = formatContentType(c.contentType);\n const title = c.title ? c.title.replace(/\\|/g, \"\\\\|\") : \"_(untitled)_\";\n const tags = c.tags?.length ? c.tags.map((t) => `\\`${t}\\``).join(\", \") : \"\";\n const date = relativeTime(c.createdAt);\n lines.push(`| ${id} | ${ct} | ${title} | ${tags} | ${date} |`);\n }\n lines.push(\"\");\n lines.push(`_Showing ${captures.length} of ${total} captures_`);\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const idW = 10;\n const typeW = 12;\n const titleW = 40;\n const tagsW = 20;\n const dateW = 12;\n\n const header = `${padRight(\"ID\", idW)} ${padRight(\"TYPE\", typeW)} ${padRight(\"TITLE\", titleW)} ${padRight(\"TAGS\", tagsW)} ${padRight(\"CREATED\", dateW)}`;\n const sep = \"─\".repeat(header.length);\n\n const rows = captures.map((c) => {\n const id = truncate(c.id, idW);\n const ct = truncate(formatContentType(c.contentType), typeW);\n const title = truncate(c.title ?? \"(untitled)\", titleW);\n const tags = truncate(c.tags?.join(\", \") ?? \"\", tagsW);\n const date = relativeTime(c.createdAt);\n return `${padRight(id, idW)} ${padRight(ct, typeW)} ${padRight(title, titleW)} ${padRight(tags, tagsW)} ${padRight(date, dateW)}`;\n });\n\n return [`${sep}`, header, sep, ...rows, sep, `Showing ${captures.length} of ${total}`].join(\n \"\\n\"\n );\n }\n\n const lines: string[] = [];\n for (const c of captures) {\n const pin = c.isPinned ? \" 📌\" : \"\";\n const title = c.title ?? \"(untitled)\";\n const ct = formatContentType(c.contentType);\n lines.push(` ${c.id.slice(0, 8)} ${ct.padEnd(10)} ${title}${pin}`);\n if (c.tldr) lines.push(` ${truncate(c.tldr, 70)}`);\n if (c.tags?.length) lines.push(` tags: ${c.tags.join(\", \")}`);\n lines.push(\"\");\n }\n lines.push(`${captures.length} of ${total} captures`);\n return lines.join(\"\\n\");\n}\n\nexport function formatCapture(capture: Capture, format: OutputFormat, vaultPath?: string): string {\n if (format === \"json\") {\n const out = vaultPath\n ? captureWithAbsoluteAttachmentPaths(capture, vaultPath)\n : capture;\n return JSON.stringify(out, null, 2);\n }\n\n if (format === \"md\") {\n const lines: string[] = [];\n const title = capture.title || \"Untitled Capture\";\n lines.push(`# ${title}`);\n lines.push(\"\");\n\n const content = capture.content;\n if (content?.type === \"attachment\" && content.path) {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path);\n const mime = String(content.mimeType ?? \"\");\n\n if (isEmbeddableImage(mime)) {\n lines.push(``);\n lines.push(\"\");\n } else if (isEmbeddableVideo(mime)) {\n lines.push(`[Video: ${title}](${fullPath})`);\n lines.push(\"\");\n }\n }\n\n lines.push(`- **ID:** \\`${capture.id}\\``);\n lines.push(`- **Type:** ${capture.type} (${formatContentType(capture.contentType)})`);\n if (capture.source) lines.push(`- **Source:** ${capture.source}`);\n lines.push(`- **Created:** ${formatDate(capture.createdAt)}`);\n lines.push(`- **Updated:** ${formatDate(capture.updatedAt)}`);\n if (capture.isPinned) lines.push(`- **Pinned:** yes`);\n if (capture.tags?.length)\n lines.push(`- **Tags:** ${capture.tags.map((t) => `\\`${t}\\``).join(\", \")}`);\n if (capture.spaceKeys?.length)\n lines.push(`- **Spaces:** ${capture.spaceKeys.map((k) => `\\`${k}\\``).join(\", \")}`);\n if (capture.triageStatus) lines.push(`- **Triage:** ${capture.triageStatus}`);\n\n if (capture.tldr) {\n lines.push(\"\");\n lines.push(`## TLDR`);\n lines.push(capture.tldr);\n }\n\n if (capture.note) {\n lines.push(\"\");\n lines.push(`## Note`);\n lines.push(capture.note);\n }\n\n if (content) {\n if (content.type === \"note\" && content.textContent) {\n lines.push(\"\");\n lines.push(`## Content`);\n lines.push(String(content.textContent));\n } else if (content.type === \"link\") {\n lines.push(\"\");\n lines.push(`## Content`);\n if (content.url) lines.push(`**URL:** ${content.url}`);\n if (content.ogTitle) lines.push(`**OG Title:** ${content.ogTitle}`);\n if (content.ogDescription)\n lines.push(`**OG Description:** ${truncate(String(content.ogDescription), 200)}`);\n } else if (content.type === \"attachment\") {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path ?? \"\");\n lines.push(\"\");\n lines.push(`## Attachment`);\n if (content.mimeType) lines.push(`- **MIME:** ${content.mimeType}`);\n if (content.size) lines.push(`- **Size:** ${formatSize(Number(content.size))}`);\n lines.push(`- **Path:** \\`${fullPath}\\``);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n const lines: string[] = [];\n const sep = \"─\".repeat(60);\n\n lines.push(sep);\n lines.push(` ID: ${capture.id}`);\n lines.push(` Type: ${capture.type} (${formatContentType(capture.contentType)})`);\n if (capture.title) lines.push(` Title: ${capture.title}`);\n if (capture.source) lines.push(` Source: ${capture.source}`);\n lines.push(` Created: ${formatDate(capture.createdAt)}`);\n lines.push(` Updated: ${formatDate(capture.updatedAt)}`);\n if (capture.isPinned) lines.push(` Pinned: yes`);\n if (capture.tags?.length) lines.push(` Tags: ${capture.tags.join(\", \")}`);\n if (capture.spaceKeys?.length) lines.push(` Spaces: ${capture.spaceKeys.join(\", \")}`);\n if (capture.triageStatus) lines.push(` Triage: ${capture.triageStatus}`);\n if (capture.processingStatus) lines.push(` Status: ${capture.processingStatus}`);\n\n if (capture.tldr) {\n lines.push(sep);\n lines.push(\" TLDR:\");\n lines.push(` ${capture.tldr}`);\n }\n\n if (capture.note) {\n lines.push(sep);\n lines.push(\" Note:\");\n lines.push(` ${capture.note}`);\n }\n\n const content = capture.content;\n if (content) {\n lines.push(sep);\n lines.push(\" Content:\");\n if (content.type === \"note\" && content.textContent) {\n const text = String(content.textContent);\n lines.push(` ${truncate(text, 500)}`);\n } else if (content.type === \"link\") {\n if (content.url) lines.push(` URL: ${content.url}`);\n if (content.ogTitle) lines.push(` OG Title: ${content.ogTitle}`);\n if (content.ogDescription)\n lines.push(` OG Desc: ${truncate(String(content.ogDescription), 200)}`);\n } else if (content.type === \"attachment\") {\n if (content.mimeType) lines.push(` MIME: ${content.mimeType}`);\n if (content.size) lines.push(` Size: ${formatSize(Number(content.size))}`);\n if (content.path) {\n const fullPath = vaultPath\n ? resolveAttachmentPath(vaultPath, String(content.path))\n : String(content.path);\n lines.push(` Path: ${fullPath}`);\n }\n }\n }\n\n lines.push(sep);\n return lines.join(\"\\n\");\n}\n\nexport function formatSpaces(spaces: Space[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(spaces, null, 2);\n\n if (spaces.length === 0) return \"No spaces found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Key | Name | Captures | Pinned |`);\n lines.push(`| --- | --- | ---: | --- |`);\n for (const s of spaces) {\n const pin = s.isPinned ? \"yes\" : \"\";\n lines.push(`| \\`${s.key}\\` | ${s.name} | ${s.noteCount ?? 0} | ${pin} |`);\n }\n return lines.join(\"\\n\");\n }\n\n if (format === \"table\") {\n const keyW = 20;\n const nameW = 30;\n const countW = 8;\n const header = `${padRight(\"KEY\", keyW)} ${padRight(\"NAME\", nameW)} ${padLeft(\"COUNT\", countW)}`;\n const sep = \"─\".repeat(header.length);\n\n const rows = spaces.map((s) => {\n return `${padRight(truncate(s.key, keyW), keyW)} ${padRight(truncate(s.name, nameW), nameW)} ${padLeft(String(s.noteCount ?? 0), countW)}`;\n });\n\n return [sep, header, sep, ...rows, sep].join(\"\\n\");\n }\n\n return spaces\n .map((s) => {\n const pin = s.isPinned ? \" 📌\" : \"\";\n return ` ${s.key.padEnd(20)} ${s.name}${pin} (${s.noteCount ?? 0} captures)`;\n })\n .join(\"\\n\");\n}\n\nexport function formatAreas(areas: Area[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(areas, null, 2);\n if (areas.length === 0) return \"No areas found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| Key | Name |`);\n lines.push(`| --- | --- |`);\n for (const a of areas) {\n lines.push(`| \\`${a.key}\\` | ${a.name} |`);\n }\n return lines.join(\"\\n\");\n }\n\n return areas.map((a) => ` ${a.key.padEnd(20)} ${a.name}`).join(\"\\n\");\n}\n\nexport function formatTags(tags: string[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(tags, null, 2);\n if (tags.length === 0) return \"No tags found.\";\n\n if (format === \"md\") {\n return tags.map((t) => `- \\`${t}\\``).join(\"\\n\");\n }\n\n return tags.map((t) => ` ${t}`).join(\"\\n\");\n}\n\nexport function formatCanvases(canvases: Canvas[], format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(canvases, null, 2);\n if (canvases.length === 0) return \"No canvases found.\";\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`| ID | Name | Nodes | Connections |`);\n lines.push(`| --- | --- | ---: | ---: |`);\n for (const c of canvases) {\n lines.push(\n `| \\`${c.id.slice(0, 8)}\\` | ${c.name} | ${c.nodes.length} | ${c.connections.length} |`\n );\n }\n return lines.join(\"\\n\");\n }\n\n return canvases\n .map(\n (c) =>\n ` ${c.id.slice(0, 8)} ${c.name} (${c.nodes.length} nodes, ${c.connections.length} connections)`\n )\n .join(\"\\n\");\n}\n\nexport function formatStats(\n stats: {\n totalCaptures: number;\n totalSpaces: number;\n totalAreas: number;\n totalCanvases: number;\n totalTags: number;\n byContentType: Record<string, number>;\n byTriageStatus: Record<string, number>;\n },\n vaultPath: string,\n format: OutputFormat\n): string {\n if (format === \"json\") return JSON.stringify({ vaultPath, ...stats }, null, 2);\n\n if (format === \"md\") {\n const lines: string[] = [];\n lines.push(`# Vault Stats`);\n lines.push(\"\");\n lines.push(`**Path:** \\`${vaultPath}\\``);\n lines.push(\"\");\n lines.push(`| Metric | Count |`);\n lines.push(`| --- | ---: |`);\n lines.push(`| Captures | ${stats.totalCaptures} |`);\n lines.push(`| Spaces | ${stats.totalSpaces} |`);\n lines.push(`| Areas | ${stats.totalAreas} |`);\n lines.push(`| Canvases | ${stats.totalCanvases} |`);\n lines.push(`| Tags | ${stats.totalTags} |`);\n lines.push(\"\");\n lines.push(`### By Content Type`);\n lines.push(\"\");\n lines.push(`| Type | Count |`);\n lines.push(`| --- | ---: |`);\n const sortedTypes = Object.entries(stats.byContentType).sort((a, b) => b[1] - a[1]);\n for (const [type, count] of sortedTypes) {\n lines.push(`| ${type} | ${count} |`);\n }\n lines.push(\"\");\n lines.push(`### By Triage Status`);\n lines.push(\"\");\n lines.push(`| Status | Count |`);\n lines.push(`| --- | ---: |`);\n const sortedStatus = Object.entries(stats.byTriageStatus).sort((a, b) => b[1] - a[1]);\n for (const [status, count] of sortedStatus) {\n lines.push(`| ${status} | ${count} |`);\n }\n return lines.join(\"\\n\");\n }\n\n const sep = \"─\".repeat(40);\n const lines: string[] = [];\n\n lines.push(sep);\n lines.push(` Vault: ${vaultPath}`);\n lines.push(sep);\n lines.push(` Captures: ${stats.totalCaptures}`);\n lines.push(` Spaces: ${stats.totalSpaces}`);\n lines.push(` Areas: ${stats.totalAreas}`);\n lines.push(` Canvases: ${stats.totalCanvases}`);\n lines.push(` Tags: ${stats.totalTags}`);\n lines.push(sep);\n\n lines.push(\" By Content Type:\");\n const sortedTypes = Object.entries(stats.byContentType).sort((a, b) => b[1] - a[1]);\n for (const [type, count] of sortedTypes) {\n lines.push(` ${type.padEnd(14)} ${count}`);\n }\n\n lines.push(sep);\n lines.push(\" By Triage Status:\");\n const sortedStatus = Object.entries(stats.byTriageStatus).sort((a, b) => b[1] - a[1]);\n for (const [status, count] of sortedStatus) {\n lines.push(` ${status.padEnd(14)} ${count}`);\n }\n\n lines.push(sep);\n return lines.join(\"\\n\");\n}\n","import { VaultReader } from \"./reader.js\";\nimport { discoverVaultPath, findVaults } from \"./vault.js\";\nimport {\n type OutputFormat,\n captureWithAbsoluteAttachmentPaths,\n formatAreas,\n formatCanvases,\n formatCapture,\n formatCaptureList,\n formatSpaces,\n formatStats,\n formatTags,\n formatVaults,\n} from \"./format.js\";\n\nconst VERSION = \"1.0.0\";\n\ntype GlobalFlags = {\n vault?: string;\n format: OutputFormat;\n verbose?: boolean;\n};\n\nfunction parseGlobalFlags(args: string[]): { flags: GlobalFlags; rest: string[] } {\n const flags: GlobalFlags = { format: \"pretty\" };\n const rest: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n if (arg === \"--vault\" && i + 1 < args.length) {\n flags.vault = args[i + 1];\n i += 2;\n } else if (arg === \"--json\") {\n flags.format = \"json\";\n i++;\n } else if (arg === \"--md\" || arg === \"--markdown\") {\n flags.format = \"md\";\n i++;\n } else if (arg === \"--table\") {\n flags.format = \"table\";\n i++;\n } else if (arg === \"--format\" && i + 1 < args.length) {\n flags.format = args[i + 1] as OutputFormat;\n i += 2;\n } else if (arg === \"--verbose\") {\n flags.verbose = true;\n i++;\n } else {\n rest.push(arg);\n i++;\n }\n }\n\n return { flags, rest };\n}\n\nfunction extractFlag(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction extractNumber(args: string[], flag: string, defaultVal: number): number {\n const val = extractFlag(args, flag);\n if (!val) return defaultVal;\n const n = parseInt(val, 10);\n return isNaN(n) ? defaultVal : n;\n}\n\nasync function cmdList(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const limit = extractNumber(args, \"--limit\", 20);\n const offset = extractNumber(args, \"--offset\", 0);\n const spaceKey = extractFlag(args, \"--space\");\n const tag = extractFlag(args, \"--tag\");\n const contentType = extractFlag(args, \"--type\");\n const search = extractFlag(args, \"--search\") ?? extractFlag(args, \"-s\");\n const pinned = hasFlag(args, \"--pinned\") ? true : undefined;\n const sortBy = (extractFlag(args, \"--sort\") as \"created\" | \"updated\") ?? \"created\";\n const sortOrder = hasFlag(args, \"--asc\") ? (\"asc\" as const) : (\"desc\" as const);\n\n const result = await reader.listCaptures({\n limit,\n offset,\n spaceKey,\n tag,\n contentType,\n search,\n pinned,\n sortBy,\n sortOrder,\n });\n\n console.log(formatCaptureList(result.captures, result.total, format));\n}\n\nasync function cmdGet(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const id = args[0];\n if (!id) {\n console.error(\"Usage: resurf get <capture-id>\");\n process.exit(1);\n }\n\n let capture = await reader.getCaptureById(id);\n\n if (!capture) {\n const index = await reader.getCaptureIndex();\n const match = index.find((c) => c.id.startsWith(id));\n if (match) {\n capture = await reader.getCaptureById(match.id);\n }\n }\n\n if (!capture) {\n console.error(`Capture not found: ${id}`);\n process.exit(1);\n }\n\n console.log(formatCapture(capture, format, reader.vaultPath));\n}\n\nasync function cmdSearch(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const positional: string[] = [];\n let i = 0;\n while (i < args.length) {\n if (args[i].startsWith(\"--\") && i + 1 < args.length) {\n i += 2;\n } else if (args[i].startsWith(\"--\")) {\n i++;\n } else {\n positional.push(args[i]);\n i++;\n }\n }\n\n const query = positional.join(\" \");\n if (!query) {\n console.error(\"Usage: resurf search <query>\");\n process.exit(1);\n }\n\n const limit = extractNumber(args, \"--limit\", 20);\n\n const result = await reader.listCaptures({ search: query, limit });\n console.log(formatCaptureList(result.captures, result.total, format));\n}\n\nasync function cmdSpaces(\n reader: VaultReader,\n _args: string[],\n format: OutputFormat\n): Promise<void> {\n const spaces = await reader.getSpaces();\n console.log(formatSpaces(spaces, format));\n}\n\nasync function cmdAreas(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const areas = await reader.getAreas();\n console.log(formatAreas(areas, format));\n}\n\nasync function cmdTags(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const tags = await reader.getTags();\n console.log(formatTags(tags, format));\n}\n\nasync function cmdCanvases(\n reader: VaultReader,\n _args: string[],\n format: OutputFormat\n): Promise<void> {\n const canvases = await reader.getCanvases();\n console.log(formatCanvases(canvases, format));\n}\n\nasync function cmdStats(reader: VaultReader, _args: string[], format: OutputFormat): Promise<void> {\n const stats = await reader.getStats();\n console.log(formatStats(stats, reader.vaultPath, format));\n}\n\nasync function cmdOpen(reader: VaultReader, args: string[]): Promise<void> {\n const id = args[0];\n if (!id) {\n console.error(\"Usage: resurf open <capture-id>\");\n process.exit(1);\n }\n\n let captureId = id;\n const capture = await reader.getCaptureById(id);\n if (!capture) {\n const index = await reader.getCaptureIndex();\n const match = index.find((c) => c.id.startsWith(id));\n if (match) captureId = match.id;\n }\n\n const { exec } = await import(\"child_process\");\n const url = `resurf://capture/${captureId}`;\n exec(`open \"${url}\"`);\n console.log(`Opening capture in Resurf: ${captureId}`);\n}\n\nasync function cmdCreate(args: string[]): Promise<void> {\n const content = extractFlag(args, \"--content\") ?? extractFlag(args, \"--text\");\n const url = extractFlag(args, \"--url\");\n const title = extractFlag(args, \"--title\");\n const tags = extractFlag(args, \"--tags\");\n const source = extractFlag(args, \"--source\");\n const space = extractFlag(args, \"--space\");\n\n if (!content && !url) {\n console.error(\n \"Usage: resurf create --content <text> [--url <url>] [--title <title>] [--tags <tags>]\"\n );\n process.exit(1);\n }\n\n const params = new URLSearchParams();\n if (content) params.set(\"content\", content);\n if (url) params.set(\"url\", url);\n if (title) params.set(\"title\", title);\n if (tags) params.set(\"tags\", tags);\n if (source) params.set(\"source\", source);\n if (space) params.set(\"space\", space);\n\n const protocolUrl = `resurf://new?${params.toString()}`;\n const { exec } = await import(\"child_process\");\n exec(`open \"${protocolUrl}\"`);\n console.log(\"Creating capture via Resurf protocol...\");\n}\n\nasync function cmdExport(reader: VaultReader, args: string[], format: OutputFormat): Promise<void> {\n const spaceKey = extractFlag(args, \"--space\");\n const tag = extractFlag(args, \"--tag\");\n const contentType = extractFlag(args, \"--type\");\n\n const result = await reader.listCaptures({\n limit: 999999,\n spaceKey,\n tag,\n contentType,\n });\n\n const captures: Record<string, unknown>[] = [];\n for (const item of result.captures) {\n const full = await reader.getCaptureById(item.id);\n if (full) {\n captures.push(captureWithAbsoluteAttachmentPaths(full, reader.vaultPath));\n }\n }\n\n if (format === \"json\") {\n console.log(JSON.stringify(captures, null, 2));\n } else if (format === \"md\") {\n const lines: string[] = [];\n for (const c of captures) {\n const cap = c as Record<string, unknown>;\n const title = (cap.title as string) || \"Untitled\";\n const id = cap.id as string;\n lines.push(`## ${title}`);\n lines.push(`- **ID:** \\`${id}\\``);\n if (cap.contentType) lines.push(`- **Type:** ${cap.contentType}`);\n if (cap.tldr) lines.push(`- **TLDR:** ${cap.tldr}`);\n if (cap.note) lines.push(`- **Note:** ${cap.note}`);\n lines.push(\"\");\n }\n lines.push(`_Exported ${captures.length} captures_`);\n console.log(lines.join(\"\\n\"));\n } else {\n console.log(JSON.stringify(captures, null, 2));\n console.error(`\\nExported ${captures.length} captures (use --json or --md for piping)`);\n }\n}\n\nfunction printHelp(): void {\n const help = `\nresurf - Access Resurf vault data from the command line\n\nUSAGE\n resurf <command> [options]\n\nCOMMANDS\n list List captures (default)\n get <id> Get a capture by ID (supports partial IDs)\n search <query> Search captures by title, note, or TLDR\n spaces List all spaces\n areas List all areas\n tags List all tags\n canvases List all canvases\n stats Show vault statistics\n vaults List available Resurf vaults on this computer\n tui Interactive TUI to browse and open captures\n open <id> Open a capture in Resurf app\n create Create a capture via Resurf protocol\n export Export captures as JSON\n\nGLOBAL OPTIONS\n --vault <path> Path to Resurf vault (auto-detected if omitted)\n --json Output as JSON\n --md, --markdown Output as Markdown\n --table Output as table\n --format <fmt> Output format: json, md, table, pretty (default: pretty)\n\nLIST OPTIONS\n --limit <n> Max results (default: 20)\n --offset <n> Skip first N results\n --space <key> Filter by space key\n --tag <tag> Filter by tag\n --type <type> Filter by content type (note, link, image, video, etc.)\n --search <query> Filter by text search\n --pinned Show only pinned captures\n --sort <field> Sort by: created, updated (default: created)\n --asc Sort ascending (default: descending)\n\nSEARCH OPTIONS\n --limit <n> Max results (default: 20)\n\nCREATE OPTIONS\n --content <text> Text content for the capture\n --url <url> URL to capture\n --title <title> Title for the capture\n --tags <tags> Comma-separated tags\n --source <source> Source identifier\n --space <key> Space key to assign\n\nEXPORT OPTIONS\n --space <key> Filter by space key\n --tag <tag> Filter by tag\n --type <type> Filter by content type\n\nVAULTS OPTIONS\n [directory] Scan this directory recursively for vaults\n --verbose Log skipped inaccessible paths\n\nEXAMPLES\n resurf list --limit 10 --json\n resurf list --space work --type note\n resurf get abc123\n resurf search \"meeting notes\"\n resurf search \"react hooks\" --json | jq '.[].title'\n resurf spaces --json\n resurf tags\n resurf stats\n resurf vaults\n resurf vaults --json\n resurf vaults /path/to/folder\n resurf tui\n resurf open abc123\n resurf create --content \"Quick note\" --tags \"idea,work\"\n resurf create --url \"https://example.com\" --title \"Example\"\n resurf export --space work --json > work-captures.json\n resurf list --json | jq '.captures[].id'\n\nVERSION\n ${VERSION}\n`;\n console.log(help.trim());\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n if (rawArgs.length === 0 || rawArgs[0] === \"--help\" || rawArgs[0] === \"-h\") {\n printHelp();\n return;\n }\n\n if (rawArgs[0] === \"--version\" || rawArgs[0] === \"-v\") {\n console.log(VERSION);\n return;\n }\n\n const { flags, rest } = parseGlobalFlags(rawArgs);\n const command = rest[0] ?? \"list\";\n const commandArgs = rest.slice(1);\n\n if (command === \"create\") {\n await cmdCreate(commandArgs);\n return;\n }\n\n if (command === \"vaults\" || command === \"find-vaults\") {\n const scanDir = commandArgs.find((a) => !a.startsWith(\"-\"));\n const vaults = await findVaults({ scanDir, verbose: flags.verbose });\n console.log(formatVaults(vaults, flags.format));\n return;\n }\n\n const vaultPath = await discoverVaultPath(flags.vault);\n const reader = new VaultReader(vaultPath);\n\n const commands: Record<string, (r: VaultReader, a: string[], f: OutputFormat) => Promise<void>> =\n {\n list: cmdList,\n ls: cmdList,\n get: cmdGet,\n show: cmdGet,\n search: cmdSearch,\n find: cmdSearch,\n spaces: cmdSpaces,\n areas: cmdAreas,\n tags: cmdTags,\n canvases: cmdCanvases,\n stats: cmdStats,\n info: cmdStats,\n export: cmdExport,\n };\n\n if (command === \"open\") {\n await cmdOpen(reader, commandArgs);\n return;\n }\n\n if (command === \"tui\") {\n const { runTui } = await import(\"./tui-app.js\");\n runTui({ reader });\n return;\n }\n\n const handler = commands[command];\n if (!handler) {\n console.error(`Unknown command: ${command}`);\n console.error(`Run 'resurf --help' for usage.`);\n process.exit(1);\n }\n\n await handler(reader, commandArgs, flags.format);\n}\n\nmain().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","stat","stat","path","lines","content","sortedTypes","sortedStatus"]}
|