@spader/spall-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/scripts/postinstall.js +38 -0
  4. package/dist/scripts/postinstall.js.map +10 -0
  5. package/dist/shared/display.d.ts +47 -0
  6. package/dist/shared/display.d.ts.map +1 -0
  7. package/dist/shared/help.d.ts +5 -0
  8. package/dist/shared/help.d.ts.map +1 -0
  9. package/dist/shared/index.d.ts +14 -0
  10. package/dist/shared/index.d.ts.map +1 -0
  11. package/dist/shared/layout.d.ts +16 -0
  12. package/dist/shared/layout.d.ts.map +1 -0
  13. package/dist/shared/list.d.ts +25 -0
  14. package/dist/shared/list.d.ts.map +1 -0
  15. package/dist/shared/progress.d.ts +4 -0
  16. package/dist/shared/progress.d.ts.map +1 -0
  17. package/dist/shared/search.d.ts +27 -0
  18. package/dist/shared/search.d.ts.map +1 -0
  19. package/dist/shared/status.d.ts +26 -0
  20. package/dist/shared/status.d.ts.map +1 -0
  21. package/dist/shared/theme.d.ts +20 -0
  22. package/dist/shared/theme.d.ts.map +1 -0
  23. package/dist/shared/tree.d.ts +37 -0
  24. package/dist/shared/tree.d.ts.map +1 -0
  25. package/dist/shared/vsearch.d.ts +28 -0
  26. package/dist/shared/vsearch.d.ts.map +1 -0
  27. package/dist/shared/workspace.d.ts +28 -0
  28. package/dist/shared/workspace.d.ts.map +1 -0
  29. package/dist/shared/yargs.d.ts +34 -0
  30. package/dist/shared/yargs.d.ts.map +1 -0
  31. package/dist/spall/commands/add.d.ts +20 -0
  32. package/dist/spall/commands/add.d.ts.map +1 -0
  33. package/dist/spall/commands/commit.d.ts +3 -0
  34. package/dist/spall/commands/commit.d.ts.map +1 -0
  35. package/dist/spall/commands/corpus/create.d.ts +3 -0
  36. package/dist/spall/commands/corpus/create.d.ts.map +1 -0
  37. package/dist/spall/commands/corpus/delete.d.ts +3 -0
  38. package/dist/spall/commands/corpus/delete.d.ts.map +1 -0
  39. package/dist/spall/commands/corpus/index.d.ts +3 -0
  40. package/dist/spall/commands/corpus/index.d.ts.map +1 -0
  41. package/dist/spall/commands/get.d.ts +3 -0
  42. package/dist/spall/commands/get.d.ts.map +1 -0
  43. package/dist/spall/commands/hook.d.ts +3 -0
  44. package/dist/spall/commands/hook.d.ts.map +1 -0
  45. package/dist/spall/commands/index.d.ts +15 -0
  46. package/dist/spall/commands/index.d.ts.map +1 -0
  47. package/dist/spall/commands/integrate/index.d.ts +8 -0
  48. package/dist/spall/commands/integrate/index.d.ts.map +1 -0
  49. package/dist/spall/commands/integrate/opencode.d.ts +3 -0
  50. package/dist/spall/commands/integrate/opencode.d.ts.map +1 -0
  51. package/dist/spall/commands/integrate/shell.d.ts +6 -0
  52. package/dist/spall/commands/integrate/shell.d.ts.map +1 -0
  53. package/dist/spall/commands/list.d.ts +3 -0
  54. package/dist/spall/commands/list.d.ts.map +1 -0
  55. package/dist/spall/commands/review/comments.d.ts +3 -0
  56. package/dist/spall/commands/review/comments.d.ts.map +1 -0
  57. package/dist/spall/commands/review/create.d.ts +3 -0
  58. package/dist/spall/commands/review/create.d.ts.map +1 -0
  59. package/dist/spall/commands/review/index.d.ts +3 -0
  60. package/dist/spall/commands/review/index.d.ts.map +1 -0
  61. package/dist/spall/commands/review/latest.d.ts +3 -0
  62. package/dist/spall/commands/review/latest.d.ts.map +1 -0
  63. package/dist/spall/commands/review/list.d.ts +3 -0
  64. package/dist/spall/commands/review/list.d.ts.map +1 -0
  65. package/dist/spall/commands/review/patches.d.ts +3 -0
  66. package/dist/spall/commands/review/patches.d.ts.map +1 -0
  67. package/dist/spall/commands/search.d.ts +3 -0
  68. package/dist/spall/commands/search.d.ts.map +1 -0
  69. package/dist/spall/commands/serve.d.ts +3 -0
  70. package/dist/spall/commands/serve.d.ts.map +1 -0
  71. package/dist/spall/commands/status.d.ts +3 -0
  72. package/dist/spall/commands/status.d.ts.map +1 -0
  73. package/dist/spall/commands/sync.d.ts +3 -0
  74. package/dist/spall/commands/sync.d.ts.map +1 -0
  75. package/dist/spall/commands/tui.d.ts +3 -0
  76. package/dist/spall/commands/tui.d.ts.map +1 -0
  77. package/dist/spall/commands/vsearch.d.ts +3 -0
  78. package/dist/spall/commands/vsearch.d.ts.map +1 -0
  79. package/dist/spall/commands/workspace/add.d.ts +3 -0
  80. package/dist/spall/commands/workspace/add.d.ts.map +1 -0
  81. package/dist/spall/commands/workspace/edit.d.ts +3 -0
  82. package/dist/spall/commands/workspace/edit.d.ts.map +1 -0
  83. package/dist/spall/commands/workspace/index.d.ts +3 -0
  84. package/dist/spall/commands/workspace/index.d.ts.map +1 -0
  85. package/dist/spall/commands/workspace/init.d.ts +3 -0
  86. package/dist/spall/commands/workspace/init.d.ts.map +1 -0
  87. package/dist/spall/commands/workspace/remove.d.ts +3 -0
  88. package/dist/spall/commands/workspace/remove.d.ts.map +1 -0
  89. package/dist/spall/e2e.preload.d.ts +2 -0
  90. package/dist/spall/e2e.preload.d.ts.map +1 -0
  91. package/dist/spall/index.d.ts +3 -0
  92. package/dist/spall/index.d.ts.map +1 -0
  93. package/dist/spallm/commands/add.d.ts +3 -0
  94. package/dist/spallm/commands/add.d.ts.map +1 -0
  95. package/dist/spallm/commands/fetch.d.ts +3 -0
  96. package/dist/spallm/commands/fetch.d.ts.map +1 -0
  97. package/dist/spallm/commands/get.d.ts +3 -0
  98. package/dist/spallm/commands/get.d.ts.map +1 -0
  99. package/dist/spallm/commands/list.d.ts +3 -0
  100. package/dist/spallm/commands/list.d.ts.map +1 -0
  101. package/dist/spallm/commands/prime.d.ts +3 -0
  102. package/dist/spallm/commands/prime.d.ts.map +1 -0
  103. package/dist/spallm/commands/query.d.ts +3 -0
  104. package/dist/spallm/commands/query.d.ts.map +1 -0
  105. package/dist/spallm/commands/review.d.ts +3 -0
  106. package/dist/spallm/commands/review.d.ts.map +1 -0
  107. package/dist/spallm/commands/search.d.ts +3 -0
  108. package/dist/spallm/commands/search.d.ts.map +1 -0
  109. package/dist/spallm/commands/status.d.ts +3 -0
  110. package/dist/spallm/commands/status.d.ts.map +1 -0
  111. package/dist/spallm/commands/vsearch.d.ts +3 -0
  112. package/dist/spallm/commands/vsearch.d.ts.map +1 -0
  113. package/dist/spallm/index.d.ts +3 -0
  114. package/dist/spallm/index.d.ts.map +1 -0
  115. package/dist/src/index.js +1648 -0
  116. package/dist/src/index.js.map +32 -0
  117. package/dist/src/shared/index.js +1164 -0
  118. package/dist/src/shared/index.js.map +21 -0
  119. package/dist/src/spall/index.js +1648 -0
  120. package/dist/src/spall/index.js.map +32 -0
  121. package/dist/src/spallm/index.js +294 -0
  122. package/dist/src/spallm/index.js.map +17 -0
  123. package/package.json +72 -0
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/shared/theme.ts", "../src/shared/layout.ts", "../src/shared/display.ts", "../src/shared/yargs.ts", "../src/shared/help.ts", "../src/shared/progress.ts", "../src/shared/workspace.ts", "../src/shared/tree.ts", "../src/shared/vsearch.ts", "../src/shared/search.ts", "../src/shared/list.ts", "../src/shared/status.ts"],
4
+ "sourcesContent": [
5
+ "export type Theme = {\n primary: (s: string) => string;\n code: (s: string) => string;\n path: (s: string) => string;\n guide: (s: string) => string;\n header: (s: string) => string;\n command: (s: string) => string;\n arg: (s: string) => string;\n option: (s: string) => string;\n type: (s: string) => string;\n description: (s: string) => string;\n dim: (s: string) => string;\n search: (s?: { suffix?: string; prefix?: string }) => string;\n};\n\nlet colorEnabled = true;\n\nexport function setColorEnabled(enabled: boolean): void {\n colorEnabled = enabled;\n}\n\nfunction wrap(fn: (s: string) => string): (s: string) => string {\n return (s: string) => (colorEnabled ? fn(s) : s);\n}\n\nfunction rgb(r: number, g: number, b: number): (s: string) => string {\n return wrap((s: string) => `\\x1b[38;2;${r};${g};${b}m${s}\\x1b[39m`);\n}\n\nfunction dim(s: string): string {\n if (!colorEnabled) return s;\n return gray(128)(s);\n}\n\nconst gray = (n: number) => rgb(n, n, n);\n\nconst primary = rgb(114, 161, 136);\nconst option = rgb(212, 212, 161);\nconst code = rgb(212, 212, 161);\nconst path = rgb(114, 161, 136);\nconst guide = rgb(162, 125, 111);\nconst search = (s?: { suffix?: string; prefix?: string }) => {\n const prefix = s?.prefix ?? \"\";\n const suffix = s?.suffix ?? \"\";\n const base = `${prefix}search${suffix}`;\n return colorEnabled ? guide(base) : base;\n};\n\nexport const defaultTheme: Theme = {\n primary,\n code,\n path,\n guide,\n header: dim,\n command: primary,\n arg: rgb(161, 212, 212),\n option,\n type: dim,\n description: (s) => s,\n dim,\n search,\n};\n",
6
+ "import { defaultTheme as theme } from \"./theme\";\n\nexport const CLEAR = \"\\x1b[K\";\n\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport function truncateMiddle(s: string, max: number): string {\n if (max <= 0) return \"\";\n if (s.length <= max) return s;\n if (max <= 3) return s.slice(0, max);\n const half = (max - 3) >> 1;\n return s.slice(0, half + ((max - 3) & 1)) + \"...\" + s.slice(-half);\n}\n\nfunction truncateStart(s: string, max: number): string {\n if (max <= 0) return \"\";\n if (s.length <= max) return s;\n if (max <= 3) return \"...\".slice(0, max);\n return \"...\" + s.slice(-(max - 3));\n}\n\nfunction truncateEnd(s: string, max: number): string {\n if (max <= 0) return \"\";\n if (s.length <= max) return s;\n if (max <= 3) return \"...\".slice(0, max);\n return s.slice(0, max - 3) + \"...\";\n}\n\n// Clean escaped chars (tabs/newlines) by replacing with spaces\nexport function cleanEscapes(s: string): string {\n return s.replace(/[\\t\\n]/g, \" \");\n}\n\nfunction displayText(s: string): string {\n // Make width calculations match what we print.\n return cleanEscapes(stripAnsi(s));\n}\n\nexport function displayLen(s: string): number {\n return displayText(s).length;\n}\n\nexport type TableOptions = {\n maxWidth?: number;\n flex?: number[];\n noTruncate?: boolean[]; // Columns that should not be truncated\n min?: number[]; // Minimum widths for columns (only used when constrained)\n truncate?: (\"start\" | \"middle\" | \"end\")[]; // Truncation style per column\n format?: ((s: string, row: number, col: number) => string)[]; // Formatting only; must not change visual width\n maxRows?: number; // Maximum number of rows to display\n};\n\nexport function table(\n headers: string[],\n columns: string[][],\n opts?: TableOptions,\n): void {\n const numCols = headers.length;\n const gap = 2;\n\n if (numCols === 0) return;\n\n const flex = opts?.flex ?? [];\n const noTruncate = opts?.noTruncate ?? [];\n const min = opts?.min ?? [];\n const truncate = opts?.truncate ?? [];\n const format = opts?.format ?? [];\n const termWidth = opts?.maxWidth ?? process.stdout.columns;\n const maxWidth = termWidth - 3; // reserve space for UTF-8 width edge cases\n\n const numRows = columns.reduce((m, c) => Math.max(m, c.length), 0);\n const maxRows = opts?.maxRows ?? numRows;\n const visibleRows = Math.min(numRows, maxRows);\n\n // Natural (unconstrained) widths - only consider visible rows.\n const natural: number[] = [];\n for (let i = 0; i < numCols; i++) {\n const col = columns[i] ?? [];\n const headerLen = displayText(headers[i] ?? \"\").length;\n let maxCellLen = 0;\n for (let r = 0; r < visibleRows; r++) {\n const len = displayText(col[r] ?? \"\").length;\n if (len > maxCellLen) maxCellLen = len;\n }\n natural[i] = Math.max(headerLen, maxCellLen);\n }\n\n const widths = [...natural];\n\n // Constrained widths: keep fixed columns intact; fit flex columns into remaining space.\n if (\n maxWidth != null &&\n Number.isFinite(maxWidth) &&\n maxWidth > 0 &&\n (opts?.flex != null ||\n opts?.noTruncate != null ||\n opts?.min != null ||\n opts?.truncate != null ||\n opts?.maxWidth != null)\n ) {\n const totalGap = gap * (numCols - 1);\n const available = Math.max(0, maxWidth - totalGap);\n const totalNatural = natural.reduce((a, b) => a + b, 0);\n\n // Only constrain when we'd overflow the terminal.\n if (totalNatural <= available) {\n // keep natural widths\n } else {\n let fixed = 0;\n let totalWeight = 0;\n const flexCols: { i: number; weight: number }[] = [];\n\n for (let i = 0; i < numCols; i++) {\n const isFixed = noTruncate[i] === true || flex[i] === 0;\n if (isFixed) {\n widths[i] = natural[i]!;\n fixed += widths[i]!;\n } else {\n const weight = flex[i] ?? 1;\n totalWeight += weight;\n flexCols.push({ i, weight });\n }\n }\n\n const remaining = Math.max(0, available - fixed);\n if (flexCols.length > 0) {\n const mins = flexCols.map(({ i }) => Math.max(0, min[i] ?? 0));\n const minSum = mins.reduce((a, b) => a + b, 0);\n\n // If mins don't fit, scale them down proportionally.\n const baseMins =\n minSum > 0 && remaining < minSum\n ? mins.map((m) => Math.floor((m * remaining) / minSum))\n : mins;\n\n const usedByMins = baseMins.reduce((a, b) => a + b, 0);\n const extraSpace = Math.max(0, remaining - usedByMins);\n\n if (totalWeight <= 0 || extraSpace === 0) {\n for (let idx = 0; idx < flexCols.length; idx++) {\n widths[flexCols[idx]!.i] = baseMins[idx]!;\n }\n } else {\n // Initial proportional allocation\n const alloc = flexCols.map(({ i, weight }, idx) => {\n const exact = (extraSpace * weight) / totalWeight;\n const base = Math.floor(exact);\n return {\n i,\n base: baseMins[idx]! + base,\n frac: exact - base,\n weight,\n natural: natural[i]!,\n capped: false,\n };\n });\n\n // Redistribute: cap columns at natural width, give surplus to others\n let changed = true;\n while (changed) {\n changed = false;\n let surplus = 0;\n let uncappedWeight = 0;\n\n for (const a of alloc) {\n if (!a.capped && a.base > a.natural) {\n surplus += a.base - a.natural;\n a.base = a.natural;\n a.capped = true;\n changed = true;\n }\n if (!a.capped) uncappedWeight += a.weight;\n }\n\n if (surplus > 0 && uncappedWeight > 0) {\n for (const a of alloc) {\n if (!a.capped) {\n const share = Math.floor(\n (surplus * a.weight) / uncappedWeight,\n );\n a.base += share;\n }\n }\n }\n }\n\n // Distribute any remaining pixels by fractional part\n let used = alloc.reduce((s, a) => s + a.base, 0);\n let extra = Math.max(0, available - fixed - used);\n alloc.sort((a, b) => b.frac - a.frac || a.i - b.i);\n for (let k = 0; k < alloc.length && extra > 0; k++) {\n if (!alloc[k]!.capped || alloc[k]!.base < alloc[k]!.natural) {\n alloc[k]!.base += 1;\n extra--;\n }\n }\n for (const a of alloc) widths[a.i] = a.base;\n }\n }\n }\n }\n\n // Render\n const header = headers\n .map((h, i) => {\n const w = widths[i] ?? 0;\n const cell = truncateMiddle(displayText(h), w);\n return w > 0 ? cell.padEnd(w) : cell;\n })\n .join(\" \");\n console.log(theme.dim(header));\n\n for (let row = 0; row < visibleRows; row++) {\n const parts: string[] = [];\n for (let i = 0; i < numCols; i++) {\n const w = widths[i] ?? 0;\n const col = columns[i] ?? [];\n const raw = col[row] ?? \"\";\n const cell = displayText(raw);\n\n if (noTruncate[i]) {\n const padded = w > 0 ? cell.padEnd(w) : cell;\n parts.push(format[i] ? format[i]!(padded, row, i) : padded);\n continue;\n }\n\n const mode = truncate[i] ?? \"middle\";\n const truncated =\n mode === \"start\"\n ? truncateStart(cell, w)\n : mode === \"end\"\n ? truncateEnd(cell, w)\n : truncateMiddle(cell, w);\n\n const padded = w > 0 ? truncated.padEnd(w) : truncated;\n parts.push(format[i] ? format[i]!(padded, row, i) : padded);\n }\n\n const line = parts.join(\" \");\n console.log(line);\n }\n\n // Show ellipsis if rows were truncated\n if (numRows > maxRows) {\n console.log(theme.dim(\"(...truncated)\"));\n }\n}\n\nexport function cols(\n rows: string[][],\n colorFns?: ((s: string) => string)[],\n): void {\n if (rows.length === 0) return;\n const widths = rows[0]!.map((_, i) =>\n Math.max(...rows.map((r) => r[i]!.length)),\n );\n for (const row of rows) {\n const line = row.map((c, i) => {\n const padded = c.padEnd(widths[i]!);\n return colorFns?.[i] ? colorFns[i]!(padded) : padded;\n });\n console.log(line.join(\" \"));\n }\n}\n",
7
+ "import { table, cleanEscapes, displayLen, truncateMiddle } from \"./layout\";\nimport { defaultTheme as theme } from \"./theme\";\n\nexport { cleanEscapes };\n\nexport function formatPath(s: string): string {\n const bodyLen = s.trimEnd().length;\n const body = s.slice(0, bodyLen);\n const pad = s.slice(bodyLen);\n const slash = body.lastIndexOf(\"/\");\n if (slash === -1) return theme.primary(body) + pad;\n return (\n theme.dim(body.slice(0, slash + 1)) +\n theme.primary(body.slice(slash + 1)) +\n pad\n );\n}\n\nexport function highlightSnippet(s: string): string {\n const parts = s.split(/[\\x01\\x02]/);\n let result = \"\";\n let inside = false;\n for (const part of parts) {\n result += inside ? theme.code(part) : part;\n inside = !inside;\n }\n return result;\n}\n\ntype PathTreeNode<TLeaf> = {\n name: string;\n children: Map<string, PathTreeNode<TLeaf>>;\n leaf?: TLeaf;\n};\n\nfunction makePathTreeNode<TLeaf>(name: string): PathTreeNode<TLeaf> {\n return { name, children: new Map() };\n}\n\nfunction buildPathTree<TItem, TLeaf>(\n items: TItem[],\n path: (item: TItem) => string,\n initLeaf: () => TLeaf,\n addToLeaf: (leaf: TLeaf, item: TItem) => void,\n): PathTreeNode<TLeaf> {\n const root = makePathTreeNode<TLeaf>(\"\");\n\n for (const item of items) {\n const parts = path(item).split(\"/\");\n let current = root;\n for (const part of parts) {\n let child = current.children.get(part);\n if (!child) {\n child = makePathTreeNode<TLeaf>(part);\n current.children.set(part, child);\n }\n current = child;\n }\n\n current.leaf ??= initLeaf();\n addToLeaf(current.leaf, item);\n }\n\n return root;\n}\n\nfunction sortedChildren<TLeaf>(\n node: PathTreeNode<TLeaf>,\n): Array<[string, PathTreeNode<TLeaf>]> {\n const entries = Array.from(node.children.entries());\n entries.sort((a, b) => {\n const aDir = a[1].children.size > 0;\n const bDir = b[1].children.size > 0;\n if (aDir !== bDir) return aDir ? -1 : 1;\n return a[0].localeCompare(b[0]);\n });\n return entries;\n}\n\nexport type ColumnDef<T> = {\n header: string;\n value: (item: T) => string;\n flex?: number;\n noTruncate?: boolean;\n min?: number;\n truncate?: \"start\" | \"middle\" | \"end\";\n format?: (s: string, row: number, col: number) => string;\n};\n\nexport type DisplayOpts<T> = {\n output: string;\n showAll?: boolean;\n empty?: string;\n path: (item: T) => string;\n id: (item: T) => string;\n preview: (item: T) => string;\n previewFormat?: (s: string) => string;\n extraColumns?: ColumnDef<T>[];\n};\n\nexport function displayResults<T>(items: T[], opts: DisplayOpts<T>): void {\n if (items.length === 0) {\n console.log(theme.dim(opts.empty ?? \"(no results)\"));\n return;\n }\n\n if (opts.output === \"json\") {\n console.log(JSON.stringify(items, null, 2));\n return;\n }\n\n if (opts.output === \"tree\") {\n displayTree(items, opts);\n return;\n }\n\n if (opts.output === \"list\") {\n displayList(items, opts);\n return;\n }\n\n // default: table\n const columns: ColumnDef<T>[] = [\n {\n header: \"path\",\n value: opts.path,\n flex: 1,\n truncate: \"start\",\n format: formatPath,\n },\n {\n header: \"id\",\n value: opts.id,\n flex: 0,\n noTruncate: true,\n format: (s) => theme.code(s),\n },\n ...(opts.extraColumns ?? []),\n {\n header: \"preview\",\n value: opts.preview,\n flex: 2,\n min: 3,\n truncate: \"end\",\n format: opts.previewFormat,\n },\n ];\n\n const termRows = process.stdout.rows ?? 24;\n const maxRows = opts.showAll ? Infinity : Math.max(1, termRows - 4);\n\n table(\n columns.map((c) => c.header),\n columns.map((c) => items.map((item) => c.value(item))),\n {\n flex: columns.map((c) => c.flex ?? 1),\n noTruncate: columns.map((c) => c.noTruncate ?? false),\n min: columns.map((c) => c.min ?? 0),\n truncate: columns.map((c) => c.truncate ?? \"middle\"),\n format: columns.map((c) =>\n c.format\n ? (s: string, row: number, col: number) => c.format!(s, row, col)\n : undefined!,\n ),\n maxRows,\n },\n );\n}\n\nfunction displayTree<T>(items: T[], opts: DisplayOpts<T>): void {\n const termRows = process.stdout.rows ?? 24;\n const maxRows = opts.showAll ? Infinity : Math.max(1, termRows - 3);\n const truncated = items.length > maxRows;\n const visible = truncated ? items.slice(0, maxRows) : items;\n\n const root = buildPathTree(\n visible,\n (item) => opts.path(item),\n () => [] as T[],\n (leaf, item) => {\n leaf.push(item);\n },\n );\n\n const MAX_PER_LEAF = 3;\n const termWidth = process.stdout.columns ?? 80;\n const showAll = opts.showAll ?? false;\n\n function printNode(node: PathTreeNode<T[]>, indent: string): void {\n for (const [name, child] of sortedChildren(node)) {\n if (child.children.size > 0) {\n console.log(`${theme.dim(indent)}${theme.dim(name + \"/\")}`);\n printNode(child, indent + \" \");\n } else {\n const toShow = showAll\n ? (child.leaf ?? [])\n : (child.leaf ?? []).slice(0, MAX_PER_LEAF);\n\n for (let i = 0; i < toShow.length; i++) {\n const item = toShow[i]!;\n const index =\n toShow.length > 1 || (child.leaf?.length ?? 0) > 1\n ? `[${i + 1}/${child.leaf?.length ?? 0}] `\n : \"\";\n\n const left = `${indent}${index}${name}`;\n const leftStyled = theme.dim(indent + index) + theme.primary(name);\n const content = cleanEscapes(opts.preview(item));\n\n const contentBudget = termWidth - displayLen(left) - 1;\n const preview =\n contentBudget > 0 ? truncateMiddle(content, contentBudget) : \"\";\n\n console.log(preview ? `${leftStyled} ${preview}` : leftStyled);\n }\n\n if (!showAll && (child.leaf?.length ?? 0) > MAX_PER_LEAF) {\n const remaining = (child.leaf?.length ?? 0) - MAX_PER_LEAF;\n console.log(\n `${theme.dim(indent)} ${theme.dim(`( ... ${remaining} more note${remaining > 1 ? \"s\" : \"\"} )`)}`,\n );\n }\n }\n }\n }\n\n printNode(root, \"\");\n if (truncated) console.log(theme.dim(\"...\"));\n}\n\nfunction displayList<T>(items: T[], opts: DisplayOpts<T>): void {\n const termRows = process.stdout.rows ?? 24;\n const maxItems = opts.showAll ? items.length : Math.max(1, termRows - 3);\n\n for (let i = 0; i < Math.min(items.length, maxItems); i++) {\n const item = items[i]!;\n if (items.length > 1) {\n console.log(theme.command(opts.path(item)));\n }\n console.log(opts.preview(item));\n if (i < Math.min(items.length, maxItems) - 1) console.log(\"\");\n }\n\n if (items.length > maxItems && !opts.showAll) {\n const remaining = items.length - maxItems;\n console.log(\n theme.dim(`( ... ${remaining} more note${remaining > 1 ? \"s\" : \"\"} )`),\n );\n }\n}\n\n// --- LLM output modes ---\n\nexport function printQueryId(queryId: number): void {\n console.log(\"\");\n console.log(`Your query ID is ${queryId}`);\n}\n\nexport type LlmSearchOpts<T> = {\n empty?: string;\n path: (item: T) => string;\n id: (item: T) => string;\n score: (item: T) => number;\n preview: (item: T) => string;\n queryId: number;\n};\n\nfunction scoreBucket(score: number): string {\n if (score >= 0.9) return \"perfect\";\n if (score >= 0.85) return \"very high\";\n if (score >= 0.75) return \"high\";\n if (score >= 0.6) return \"medium\";\n return \"low\";\n}\n\nfunction truncatePreview(s: string, maxChars: number = 200): string {\n const collapsed = s.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxChars) return collapsed;\n return collapsed.slice(0, maxChars - 3) + \"...\";\n}\n\nexport function displayLlmSearch<T>(items: T[], opts: LlmSearchOpts<T>): void {\n if (items.length === 0) {\n console.log(opts.empty ?? \"(no results)\");\n printQueryId(opts.queryId);\n return;\n }\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const path = opts.path(item);\n const id = opts.id(item);\n const bucket = scoreBucket(opts.score(item));\n const preview = truncatePreview(opts.preview(item));\n\n console.log(`[${bucket}] (id: ${id}) ${path}`);\n console.log(preview);\n if (i < items.length - 1) console.log(\"\");\n }\n\n printQueryId(opts.queryId);\n}\n\nexport type LlmFetchOpts<T> = {\n empty?: string;\n path: (item: T) => string;\n id: (item: T) => string;\n content: (item: T) => string;\n};\n\nexport function displayLlmFetch<T>(items: T[], opts: LlmFetchOpts<T>): void {\n if (items.length === 0) {\n console.log(opts.empty ?? \"(no notes found)\");\n return;\n }\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const path = opts.path(item);\n const id = opts.id(item);\n const content = opts.content(item);\n\n console.log(`${path} (id: ${id})`);\n console.log(content);\n if (i < items.length - 1) console.log();\n }\n}\n\n// --- Path tree display ---\n\nexport type PathTreeOpts = {\n showAll?: boolean;\n empty?: string;\n};\n\nexport function displayPathTree(paths: string[], opts?: PathTreeOpts): void {\n if (paths.length === 0) {\n console.log(theme.dim(opts?.empty ?? \"(no notes)\"));\n return;\n }\n\n const root = buildPathTree(\n paths,\n (p) => p,\n () => ({ count: 0 }),\n (leaf) => {\n leaf.count++;\n },\n );\n\n const showFiles = opts?.showAll ?? false;\n\n function printNode(\n node: PathTreeNode<{ count: number }>,\n indent: string,\n ): void {\n const sorted = sortedChildren(node);\n const dirs: Array<[string, PathTreeNode<{ count: number }>]> = [];\n const files: Array<[string, PathTreeNode<{ count: number }>]> = [];\n\n for (const entry of sorted) {\n if (entry[1].children.size > 0) dirs.push(entry);\n else files.push(entry);\n }\n\n for (const [name, child] of dirs) {\n console.log(`${theme.dim(indent)}${theme.dim(name + \"/\")}`);\n printNode(child, indent + \" \");\n }\n\n if (files.length > 0) {\n if (showFiles) {\n for (const [name, child] of files) {\n const n = child.leaf?.count ?? 0;\n const suffix = n > 1 ? theme.dim(` (x${n})`) : \"\";\n console.log(`${theme.dim(indent)}${theme.primary(name)}${suffix}`);\n }\n } else {\n const count = files.reduce(\n (sum, [, child]) => sum + (child.leaf?.count ?? 0),\n 0,\n );\n console.log(\n `${theme.dim(indent)}${theme.primary(`(${count} note${count !== 1 ? \"s\" : \"\"})`)}`,\n );\n }\n }\n }\n\n printNode(root, \"\");\n}\n",
8
+ "import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport pc from \"picocolors\";\nimport { cols } from \"./layout\";\nimport { type Theme, defaultTheme } from \"./theme\";\n\nexport type OptionDef = {\n alias?: string;\n type: \"string\" | \"number\" | \"boolean\" | \"array\";\n description: string;\n required?: boolean;\n default?: unknown;\n};\n\nexport type Options = Record<string, OptionDef>;\n\nexport type PositionalDef = {\n type: \"string\" | \"number\";\n description: string;\n required?: boolean;\n default?: unknown;\n};\n\nexport type Positionals = Record<string, PositionalDef>;\n\nexport type CommandDef = {\n description: string;\n summary?: string; // Short description for command list; defaults to description\n hidden?: boolean; // Hide from help text\n positionals?: Positionals;\n options?: Options;\n commands?: Record<string, CommandDef>;\n handler?: (argv: any) => void | Promise<void>;\n};\n\nexport type CliDef = {\n name: string;\n description: string;\n options?: Options;\n commands: Record<string, CommandDef>;\n};\n\nfunction usage(def: CommandDef | CliDef, path: string[], t: Theme): string {\n const parts: string[] = [];\n const last = path.length - 1;\n for (let i = 0; i < path.length; i++) {\n const fmt = t.command;\n parts.push(i === last ? fmt(path[i]!) : path[i]!);\n }\n\n if (\"positionals\" in def && def.positionals) {\n for (const [k, v] of Object.entries(def.positionals)) {\n const name = t.arg(`$${k}`);\n parts.push(v.required ? name : `[${name}]`);\n }\n }\n\n if (def.options && Object.keys(def.options).length > 0) {\n parts.push(t.dim(\"[options]\"));\n }\n\n if (\n \"commands\" in def &&\n def.commands &&\n Object.keys(def.commands).length > 0\n ) {\n parts.push(t.arg(\"$command\"));\n }\n\n return parts.join(\" \");\n}\n\nexport function help(\n def: CommandDef | CliDef,\n name: string,\n path: string[] = [],\n t: Theme = defaultTheme,\n): void {\n let prev = false;\n\n if (def.description) {\n console.log(t.description(def.description));\n prev = true;\n }\n\n if (prev) console.log(\"\");\n console.log(t.header(\"usage:\"));\n console.log(` ${usage(def, [name, ...path], t)}`);\n prev = true;\n\n const pos = \"positionals\" in def ? def.positionals : undefined;\n if (pos && Object.keys(pos).length > 0) {\n if (prev) console.log(\"\");\n console.log(t.header(\"arguments\"));\n prev = true;\n\n const rows: string[][] = [];\n for (const [k, v] of Object.entries(pos)) {\n let desc = v.description;\n if (v.default !== undefined)\n desc += ` ${t.dim(`(default: ${v.default})`)}`;\n if (v.required) desc += ` ${t.dim(\"(required)\")}`;\n rows.push([` ${k}`, v.type, desc]);\n }\n cols(rows, [t.arg, t.type, t.description]);\n }\n\n const opts: Record<string, OptionDef> = {\n ...(def.options ?? {}),\n help: { alias: \"h\", type: \"boolean\", description: \"Show help\" },\n };\n\n if (Object.keys(opts).length > 0) {\n if (prev) console.log(\"\");\n console.log(t.header(\"options\"));\n prev = true;\n\n const rows: string[][] = [];\n for (const [k, v] of Object.entries(opts)) {\n const short = v.alias ? `-${v.alias}, ` : \" \";\n let desc = v.description;\n if (v.default !== undefined && v.type !== \"boolean\") {\n desc += ` ${t.dim(`(default: ${v.default})`)}`;\n }\n rows.push([` ${short}--${k}`, v.type, desc]);\n }\n cols(rows, [t.option, t.type, t.description]);\n }\n\n const cmds = \"commands\" in def ? def.commands : undefined;\n if (cmds && Object.keys(cmds).length > 0) {\n if (prev) console.log(\"\");\n console.log(t.header(\"commands\"));\n\n const rows: string[][] = [];\n const rowCmdFmt: ((s: string) => string)[] = [];\n for (const [k, v] of Object.entries(cmds)) {\n if (v.hidden) continue;\n const args = v.positionals ? Object.keys(v.positionals).join(\" \") : \"\";\n rows.push([` ${k}`, args, v.summary ?? v.description]);\n rowCmdFmt.push(t.command);\n }\n let ri = 0;\n cols(rows, [(s) => rowCmdFmt[ri++]!(s), t.arg, t.description]);\n }\n}\n\nfunction fail(def: CommandDef | CliDef, name: string, path: string[] = []) {\n return (msg: string | null, err?: unknown): void => {\n if (process.argv.includes(\"--help\") || process.argv.includes(\"-h\")) {\n help(def, name, path);\n process.exit(0);\n }\n if (\n msg?.includes(\"You must specify\") ||\n msg?.includes(\"Not enough non-option arguments\")\n ) {\n help(def, name, path);\n process.exit(1);\n }\n const detail =\n msg ??\n (err instanceof globalThis.Error ? err.message : undefined) ??\n (typeof err === \"string\" ? err : undefined) ??\n \"Unknown error\";\n console.error(pc.red(detail));\n process.exit(1);\n };\n}\n\nfunction check(def: CommandDef | CliDef, name: string, path: string[] = []) {\n return (argv: any): boolean => {\n if (argv.help && argv._.length === path.length) {\n help(def, name, path);\n process.exit(0);\n }\n return true;\n };\n}\n\nfunction configure(\n y: any,\n def: CommandDef | CliDef,\n root: string,\n path: string[],\n): void {\n if (\"positionals\" in def && def.positionals) {\n for (const [k, v] of Object.entries(def.positionals)) {\n y.positional(k, {\n type: v.type,\n describe: v.description,\n demandOption: v.required,\n default: v.default,\n });\n }\n }\n\n if (def.options) {\n for (const [k, v] of Object.entries(def.options)) {\n y.option(k, {\n alias: v.alias,\n type: v.type,\n describe: v.description,\n demandOption: v.required,\n default: v.default,\n });\n }\n }\n\n if (\"commands\" in def && def.commands) {\n for (const [k, v] of Object.entries(def.commands)) {\n command(y, k, v, root, path);\n }\n y.demandCommand(1, \"You must specify a command\");\n }\n\n y.help(false)\n .option(\"help\", { alias: \"h\", type: \"boolean\", describe: \"Show help\" })\n .check(check(def, root, path))\n .fail(fail(def, root, path));\n}\n\nfunction command(\n y: any,\n name: string,\n def: CommandDef,\n root: string,\n path: string[],\n): void {\n let cmd = name;\n if (def.positionals) {\n for (const [k, v] of Object.entries(def.positionals)) {\n cmd += v.required ? ` <${k}>` : ` [${k}]`;\n }\n }\n y.command(\n cmd,\n def.description,\n (yargs: any) => configure(yargs, def, root, [...path, name]),\n def.handler,\n );\n}\n\nexport function build(def: CliDef): any {\n const y = yargs(hideBin(process.argv)).scriptName(def.name);\n configure(y, def, def.name, []);\n y.strict();\n return y;\n}\n",
9
+ "import { defaultTheme, type Theme } from \"./theme\";\nimport { help, type CliDef } from \"./yargs\";\n\nlet activeCli: CliDef | null = null;\n\nexport function setActiveCli(def: CliDef): void {\n activeCli = def;\n}\n\nexport function printHelp(t: Theme = defaultTheme): void {\n if (!activeCli) {\n throw new Error(\n \"printHelp() called before setActiveCli(). Set it in your CLI entrypoint.\",\n );\n }\n help(activeCli, activeCli.name, [], t);\n}\n",
10
+ "import pc from \"picocolors\";\nimport consola from \"consola\";\nimport { CLEAR } from \"./layout\";\nimport { defaultTheme as theme } from \"./theme\";\n\nconst BAR_WIDTH = 20;\n\nexport function renderProgressBar(percent: number): string {\n const filled = Math.round((percent / 100) * BAR_WIDTH);\n const empty = BAR_WIDTH - filled;\n return theme.primary(\"\\u2588\".repeat(filled) + \"\\u2591\".repeat(empty));\n}\n\nexport function createModelProgressHandler(): (event: any) => void {\n let model = \"\";\n\n return (event: any) => {\n switch (event.tag) {\n case \"model.load\":\n consola.info(`Loading model ${theme.primary(event.info.name)}`);\n break;\n case \"model.download\":\n model = event.info.name;\n consola.info(`Downloading model ${theme.primary(event.info.name)}`);\n break;\n case \"model.progress\": {\n const percent = (event.downloaded / event.total) * 100;\n const bar = renderProgressBar(percent);\n const percentStr = percent.toFixed(0).padStart(3);\n process.stderr.write(\n `\\r${bar} ${pc.bold(percentStr + \"%\")} ${theme.primary(model)} ${CLEAR}`,\n );\n break;\n }\n case \"model.downloaded\":\n process.stderr.write(`\\r${CLEAR}`);\n consola.success(`Downloaded ${theme.primary(event.info.name)}`);\n break;\n }\n };\n}\n\nexport function formatStreamError(e: unknown, path: string): string {\n let code = \"\";\n let msg = \"\";\n\n if (e && typeof e === \"object\") {\n code = (e as any).code ?? \"\";\n msg = (e as any).message ?? String(e);\n } else {\n msg = String(e);\n }\n\n if (code === \"note.exists\") {\n return `Note already exists at ${theme.primary(path)}. Use ${theme.option(\"--update\")} if you meant to update the note.`;\n }\n\n if (code === \"note.duplicate\") {\n return `Duplicate content detected for ${theme.primary(path)}. Use ${theme.option(\"--dupe\")} to allow duplicates.`;\n }\n\n if (code) return `${code}: ${msg}`;\n return msg;\n}\n",
11
+ "import consola from \"consola\";\nimport { WorkspaceConfig, type WorkspaceConfigSchema } from \"@spader/spall-core\";\nimport { Client, type SpallClient } from \"@spader/spall-sdk/client\";\n\nimport { defaultTheme as theme } from \"./theme\";\n\nexport type ResolvedScope = {\n config: WorkspaceConfigSchema;\n located: WorkspaceConfig.Located | null;\n viewer: { id: number; name: string };\n names: string[];\n ids: number[];\n};\n\nfunction fail(message: string): never {\n consola.error(message);\n process.exit(1);\n}\n\nexport async function gitRoot(start: string): Promise<string | null> {\n try {\n const proc = Bun.spawn([\"git\", \"rev-parse\", \"--show-toplevel\"], {\n cwd: start,\n stdout: \"pipe\",\n stderr: \"ignore\",\n stdin: \"ignore\",\n });\n const exit = await proc.exited;\n if (exit !== 0) return null;\n const out = (await new Response(proc.stdout).text()).trim();\n return out || null;\n } catch {\n return null;\n }\n}\n\nexport async function resolveScope(input: {\n client: SpallClient;\n cwd?: string;\n corpus?: string;\n tracked?: boolean;\n}): Promise<ResolvedScope> {\n const cwd = input.cwd ?? process.cwd();\n const config = WorkspaceConfig.load(cwd);\n const located = WorkspaceConfig.locate(cwd);\n\n const names: string[] = input.corpus\n ? [input.corpus]\n : config.scope.read;\n\n const tracked = input.tracked ?? false;\n\n let viewer: { id: number; name: string } = { id: 1, name: \"default\" };\n if (tracked && located) {\n const ensured = await input.client.workspace\n .create({ name: config.workspace.name })\n .then(Client.unwrap);\n viewer = { id: ensured.id, name: ensured.name };\n\n if (config.workspace.id !== viewer.id) {\n WorkspaceConfig.patch(located.root, {\n workspace: { name: config.workspace.name, id: viewer.id },\n });\n }\n }\n\n const corpora = (await input.client.corpus.list().then(Client.unwrap)) as {\n id: number;\n name: string;\n }[];\n const byName = new Map(corpora.map((c) => [c.name, c.id]));\n\n const ids = names.map((name) => {\n const id = byName.get(name);\n if (id === undefined) {\n fail(`Corpus not found: ${theme.command(name)}`);\n }\n return id;\n });\n\n return { config, located, viewer, names, ids };\n}\n\nexport async function createQuery(input: {\n client: SpallClient;\n cwd?: string;\n corpus?: string;\n tracked?: boolean;\n}): Promise<ResolvedScope & { query: any }> {\n const scope = await resolveScope({\n client: input.client,\n cwd: input.cwd,\n corpus: input.corpus,\n tracked: input.tracked,\n });\n\n const tracked = Boolean(input.tracked && scope.located);\n const query = await input.client.query\n .create({\n viewer: scope.viewer.id,\n tracked,\n corpora: scope.ids,\n })\n .then(Client.unwrap);\n return { ...scope, query };\n}\n",
12
+ "export type NotePathId = { path: string; id: number };\n\nexport type NoteTreeEntry =\n | { type: \"dir\"; depth: number; name: string; noteCount?: number }\n | { type: \"file\"; depth: number; name: string; id: number };\n\n/**\n * Build a simple directory-first tree listing from flat note paths.\n * Output is unstyled; callers decide indentation and coloring.\n *\n * @param maxDepth - Maximum depth to display. `undefined` means unlimited.\n * Depth 0 = top-level dirs only (files at root are still shown).\n * Files and directories deeper than `maxDepth` are omitted; directories\n * exactly at `maxDepth` are treated as leaves and get a `noteCount`.\n */\nexport function noteTreeEntries(\n notes: NotePathId[],\n maxDepth?: number,\n): NoteTreeEntry[] {\n const unlimited = maxDepth === undefined;\n const entries: NoteTreeEntry[] = [];\n const seenDirs = new Map<string, NoteTreeEntry>();\n\n for (const note of notes) {\n const parts = note.path.split(\"/\");\n const fileDepth = parts.length - 1;\n\n let prefix = \"\";\n for (let i = 0; i < parts.length - 1; i++) {\n prefix = prefix ? `${prefix}/${parts[i]}` : parts[i]!;\n if (!unlimited && i > maxDepth!) break;\n if (!seenDirs.has(prefix)) {\n const entry: NoteTreeEntry = {\n type: \"dir\",\n depth: i,\n name: parts[i]! + \"/\",\n };\n seenDirs.set(prefix, entry);\n entries.push(entry);\n }\n }\n\n if (unlimited || fileDepth <= maxDepth!) {\n entries.push({\n type: \"file\",\n depth: fileDepth,\n name: parts[parts.length - 1]!,\n id: note.id,\n });\n } else {\n // File is beyond maxDepth — count it against its ancestor at maxDepth.\n const cutoffKey = parts.slice(0, maxDepth! + 1).join(\"/\");\n const dir = seenDirs.get(cutoffKey);\n if (dir && dir.type === \"dir\") {\n dir.noteCount = (dir.noteCount ?? 0) + 1;\n }\n }\n }\n\n return entries;\n}\n\n/**\n * Build directory-only entries. Directories are printed, and leaf directories\n * (those with no visible subdirectories) get a `noteCount`.\n *\n * @param maxDepth - Maximum depth to display. `undefined` means unlimited.\n * Directories deeper than `maxDepth` are omitted; directories at `maxDepth`\n * become leaves and show the total number of notes underneath them.\n */\nexport function noteDirEntries(\n notes: NotePathId[],\n maxDepth?: number,\n): Extract<NoteTreeEntry, { type: \"dir\" }>[] {\n const unlimited = maxDepth === undefined;\n\n type DirInfo = {\n hasSubdir: boolean;\n noteCount: number;\n depth: number;\n name: string;\n };\n\n const dirs = new Map<string, DirInfo>();\n\n const ensure = (key: string, depth: number, name: string): DirInfo => {\n const existing = dirs.get(key);\n if (existing) return existing;\n const created: DirInfo = { hasSubdir: false, noteCount: 0, depth, name };\n dirs.set(key, created);\n return created;\n };\n\n for (const note of notes) {\n const parts = note.path.split(\"/\");\n if (parts.length <= 1) continue;\n\n let prefix = \"\";\n for (let i = 0; i < parts.length - 1; i++) {\n if (!unlimited && i > maxDepth!) break;\n\n const part = parts[i]!;\n const key = prefix ? `${prefix}/${part}` : part;\n ensure(key, i, part + \"/\");\n\n if (prefix) {\n const parent = dirs.get(prefix);\n // A child at depth i only makes the parent a non-leaf if i is\n // within the visible range (or unlimited).\n if (parent && (unlimited || i <= maxDepth!)) {\n parent.hasSubdir = true;\n }\n }\n\n prefix = key;\n }\n\n // Count notes against their deepest visible ancestor.\n if (!unlimited && parts.length - 2 > maxDepth!) {\n // The note is deeper than maxDepth — attribute it to the dir at maxDepth.\n const cutoffKey = parts.slice(0, maxDepth! + 1).join(\"/\");\n const cutoff = dirs.get(cutoffKey);\n if (cutoff) cutoff.noteCount++;\n } else {\n // Note lives directly under a visible dir.\n const parentKey = parts.slice(0, -1).join(\"/\");\n const parent = dirs.get(parentKey);\n if (parent) parent.noteCount++;\n }\n }\n\n const keys = Array.from(dirs.keys());\n keys.sort((a, b) => a.localeCompare(b));\n\n return keys\n .filter((key) => {\n const info = dirs.get(key)!;\n return unlimited || info.depth <= maxDepth!;\n })\n .map((key) => {\n const info = dirs.get(key)!;\n const leaf = !info.hasSubdir;\n return {\n type: \"dir\" as const,\n depth: info.depth,\n name: info.name,\n noteCount: leaf ? info.noteCount : undefined,\n };\n });\n}\n",
13
+ "import { Client } from \"@spader/spall-sdk/client\";\nimport { createQuery } from \"./workspace\";\nimport { defaultTheme as theme } from \"./theme\";\nimport type { Positionals, Options } from \"./yargs\";\n\nexport namespace Vsearch {\n export const summary = `Semantic vector ${theme.search()}`;\n\n export function description(cliName: string): string {\n return `Semantic vector ${theme.search()} using embeddings. Returns truncated previews with note IDs.\n\nUse \\`fetch\\` with the returned Query ID and note IDs to get full content.\n\nExample:\n ${cliName} ${theme.search({ prefix: \"v\" })} \"how to configure r2 bindings\"\n`;\n }\n\n export const positionals: Positionals = {\n query: {\n type: \"string\",\n description: `Natural language ${theme.search()} query`,\n required: true,\n },\n };\n\n export const options: Options = {\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name (default: from spall.json)\",\n },\n path: {\n type: \"string\",\n description: \"Path glob filter\",\n },\n limit: {\n alias: \"n\",\n type: \"number\",\n description: \"Max results\",\n default: 10,\n },\n };\n\n export function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n }\n\n export async function run(argv: {\n query: string;\n corpus?: string;\n path?: string;\n limit?: number;\n tracked: boolean;\n }) {\n const client = await Client.connect();\n\n const { query } = await createQuery({\n client,\n corpus: argv.corpus,\n tracked: argv.tracked,\n });\n\n const res = await client.query\n .vsearch({\n id: String(query.id),\n q: argv.query,\n path: argv.path,\n limit: argv.limit,\n })\n .then(Client.unwrap);\n\n return { client, query, results: res.results };\n }\n}\n",
14
+ "import { Client } from \"@spader/spall-sdk/client\";\nimport { createQuery } from \"./workspace\";\nimport { defaultTheme as theme } from \"./theme\";\nimport type { Positionals, Options } from \"./yargs\";\n\nexport namespace Search {\n export const summary = `Keyword ${theme.search()} (FTS)`;\n\n export function description(cliName: string): string {\n return `Full-text keyword ${theme.search()}. Returns truncated previews with note IDs.\n\nUse \\`fetch\\` with the returned Query ID and note IDs to get full content.\n\nExample:\n ${cliName} ${theme.search()} \"R2Bucket\"\n`;\n }\n\n export const positionals: Positionals = {\n query: {\n type: \"string\",\n description: \"Search keywords\",\n required: true,\n },\n };\n\n export const options: Options = {\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name (default: from spall.json)\",\n },\n path: {\n type: \"string\",\n description: \"Path glob filter\",\n },\n limit: {\n alias: \"n\",\n type: \"number\",\n description: \"Max results (default: 20)\",\n },\n };\n\n export async function run(argv: {\n query: string;\n corpus?: string;\n path?: string;\n limit?: number;\n tracked: boolean;\n mode?: \"plain\" | \"fts\";\n }) {\n const client = await Client.connect();\n\n const { query } = await createQuery({\n client,\n corpus: argv.corpus,\n tracked: argv.tracked,\n });\n\n const res = await client.query\n .search({\n id: String(query.id),\n q: argv.query,\n path: argv.path,\n limit: argv.limit,\n ...(argv.mode ? { mode: argv.mode } : {}),\n })\n .then(Client.unwrap);\n\n return { client, query, results: res.results };\n }\n}\n",
15
+ "import { Client } from \"@spader/spall-sdk/client\";\nimport { createQuery } from \"./workspace\";\nimport type { Options, Positionals } from \"./yargs\";\n\nexport namespace List {\n export const positionals: Positionals = {\n path: {\n type: \"string\",\n description: \"Path or glob to filter notes\",\n default: \"*\",\n },\n };\n\n export const options: Options = {\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name\",\n },\n all: {\n type: \"boolean\",\n description: \"List all files (default: directories only)\",\n default: false,\n },\n depth: {\n alias: \"d\",\n type: \"string\",\n description:\n 'Tree depth (0 = top-level only, 1 = one level deep, \"max\" = unlimited)',\n },\n };\n\n export function normalizePath(\n rawInput: unknown,\n completion: boolean,\n ): string {\n let path = String(rawInput ?? \"*\");\n\n // normalize path: if doesn't end with glob char, treat as prefix\n if (!/[*?\\]]$/.test(path)) {\n if (completion && !path.endsWith(\"/\")) {\n // For completion, \"ai-gateway/conf\" should glob \"ai-gateway/conf*\"\n path = path + \"*\";\n } else {\n path = path.replace(/\\/?$/, \"/*\");\n }\n }\n\n return path;\n }\n\n /** Parse the --depth flag into a maxDepth number or undefined (unlimited). */\n export function parseDepth(raw: unknown): number | undefined {\n if (raw === undefined || raw === null) return 0;\n const s = String(raw).trim().toLowerCase();\n if (s === \"max\" || s === \"all\") return undefined;\n const n = parseInt(s, 10);\n if (isNaN(n) || n < 0) return 0;\n return n;\n }\n\n export async function run(argv: {\n path?: string;\n corpus?: string;\n tracked: boolean;\n completion?: boolean;\n }) {\n const client = await Client.connect();\n\n const {\n query,\n located,\n names: includeNames,\n } = await createQuery({\n client,\n corpus: argv.corpus,\n tracked: argv.tracked,\n });\n\n const path = normalizePath(argv.path, Boolean(argv.completion));\n\n type NoteInfo = { id: number; path: string };\n type Page = { notes: NoteInfo[]; nextCursor: string | null };\n const notes: NoteInfo[] = [];\n let cursor: string | undefined = undefined;\n\n while (true) {\n const page: Page = await client.query\n .notes({ id: String(query.id), path, limit: 100, after: cursor })\n .then(Client.unwrap);\n\n for (const n of page.notes) notes.push({ id: n.id, path: n.path });\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n\n notes.sort((a, b) => a.path.localeCompare(b.path));\n\n return { client, query, notes, path, located, includeNames };\n }\n}\n",
16
+ "import { Client } from \"@spader/spall-sdk/client\";\nimport { WorkspaceConfig } from \"@spader/spall-core\";\nimport { table } from \"./layout\";\nimport { defaultTheme as theme } from \"./theme\";\n\nexport namespace Status {\n export const summary = \"List available corpora and workspace status\";\n export const description = `List available corpora, and which will be included by default in searches (i.e. included in workspace)`;\n\n export type Corpus = {\n id: number | string;\n name: string;\n noteCount: number;\n createdAt: number;\n updatedAt: number;\n };\n\n export type SuccessResult = {\n url: string;\n corpora: Corpus[];\n included: Set<string>;\n };\n\n export type RunResult = SuccessResult | { error: unknown };\n\n export type PrintOptions = {\n highlightWorkspace?: boolean;\n };\n\n export const formatTime = (ts: number) =>\n new Date(ts).toISOString().slice(0, 19).replace(\"T\", \" \");\n\n export async function run(): Promise<RunResult> {\n const client = await Client.connect();\n const url = Client.url(client);\n const result = await client.corpus.list();\n\n if (result.error || !result.data) {\n return { error: result.error };\n }\n\n const corpora = result.data as Corpus[];\n const config = WorkspaceConfig.load(process.cwd());\n const included = new Set(config.scope.read);\n\n return { url, corpora, included };\n }\n\n export function print(result: SuccessResult, opts?: PrintOptions): void {\n const { url, corpora, included } = result;\n\n console.log(`${theme.dim(\"server\")} ${url}`);\n\n if (corpora.length === 0) {\n console.log(\"No corpora found.\");\n return;\n }\n\n table(\n [\"name\", \"id\", \"notes\", \"workspace\", \"created\", \"updated\"],\n [\n corpora.map((p) => p.name),\n corpora.map((p) => String(p.id)),\n corpora.map((p) => String(p.noteCount)),\n corpora.map((p) => (included.has(p.name) ? \"yes\" : \"no\")),\n corpora.map((p) => Status.formatTime(p.createdAt)),\n corpora.map((p) => Status.formatTime(p.updatedAt)),\n ],\n opts?.highlightWorkspace\n ? {\n format: [\n (s: string) => s,\n (s: string) => s,\n (s: string) => s,\n (s: string) => {\n const trimmed = s.trimEnd();\n const pad = s.slice(trimmed.length);\n return trimmed === \"yes\"\n ? theme.primary(\"yes\") + pad\n : \"no\" + pad;\n },\n (s: string) => s,\n (s: string) => s,\n ],\n }\n : undefined,\n );\n }\n}\n"
17
+ ],
18
+ "mappings": "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",
19
+ "debugId": "D1FB096FF010260C64756E2164756E21",
20
+ "names": []
21
+ }