@chatcode/cco-better-sidebar 0.18.0-alpha.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 (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +554 -0
  3. package/README_EN.md +563 -0
  4. package/assets/logo.svg +1 -0
  5. package/cordis.patch.yml +79 -0
  6. package/lib/client-editor.js +55744 -0
  7. package/lib/client-mermaid.js +208256 -0
  8. package/lib/client-registry.js +30378 -0
  9. package/lib/client-terminal.js +16894 -0
  10. package/lib/client.js +30378 -0
  11. package/lib/index.js +6897 -0
  12. package/lib/invariant.js +22 -0
  13. package/lib/types/agent-opens.d.ts +65 -0
  14. package/lib/types/agent-pty.d.ts +226 -0
  15. package/lib/types/browser-probe.d.ts +15 -0
  16. package/lib/types/bundle-route.d.ts +12 -0
  17. package/lib/types/chatcode-update.d.ts +47 -0
  18. package/lib/types/client/AccountMenu.d.ts +1 -0
  19. package/lib/types/client/AiRatioSection.d.ts +3 -0
  20. package/lib/types/client/BrowserView.d.ts +39 -0
  21. package/lib/types/client/ChatcodeGate.d.ts +6 -0
  22. package/lib/types/client/CodingPlanModelsSettings.d.ts +9 -0
  23. package/lib/types/client/DiffTab.d.ts +6 -0
  24. package/lib/types/client/DiffView.d.ts +51 -0
  25. package/lib/types/client/EditorHost.d.ts +13 -0
  26. package/lib/types/client/FenceErrorNotice.d.ts +5 -0
  27. package/lib/types/client/FileTree.d.ts +41 -0
  28. package/lib/types/client/FreeWindow.d.ts +29 -0
  29. package/lib/types/client/GitView.d.ts +12 -0
  30. package/lib/types/client/MarkdownHtml.d.ts +32 -0
  31. package/lib/types/client/OrphanedTab.d.ts +11 -0
  32. package/lib/types/client/PdfView.d.ts +6 -0
  33. package/lib/types/client/ReleaseNotesDialog.d.ts +11 -0
  34. package/lib/types/client/RenderBoundary.d.ts +32 -0
  35. package/lib/types/client/SandboxStatusBar.d.ts +10 -0
  36. package/lib/types/client/SideCardSection.d.ts +74 -0
  37. package/lib/types/client/Sidebar.d.ts +8 -0
  38. package/lib/types/client/TabBar.d.ts +54 -0
  39. package/lib/types/client/TerminalView.d.ts +24 -0
  40. package/lib/types/client/TextEditor.d.ts +10 -0
  41. package/lib/types/client/TreePanel.d.ts +27 -0
  42. package/lib/types/client/UpdateDialog.d.ts +10 -0
  43. package/lib/types/client/UpdateSettingsPanel.d.ts +1 -0
  44. package/lib/types/client/UpdateSettingsSection.d.ts +10 -0
  45. package/lib/types/client/UploadOverlay.d.ts +20 -0
  46. package/lib/types/client/UsageHeatmapSection.d.ts +4 -0
  47. package/lib/types/client/add-plugin-modal.d.ts +15 -0
  48. package/lib/types/client/api.d.ts +345 -0
  49. package/lib/types/client/binary-download.d.ts +12 -0
  50. package/lib/types/client/breakpoints.d.ts +17 -0
  51. package/lib/types/client/browser.d.ts +60 -0
  52. package/lib/types/client/builtins/index.d.ts +18 -0
  53. package/lib/types/client/builtins/tabs.d.ts +11 -0
  54. package/lib/types/client/builtins/viewers.d.ts +3 -0
  55. package/lib/types/client/chat-presentation.d.ts +13 -0
  56. package/lib/types/client/chunk-loader.d.ts +124 -0
  57. package/lib/types/client/chunks/editor.d.ts +9 -0
  58. package/lib/types/client/chunks/mermaid.d.ts +10 -0
  59. package/lib/types/client/chunks/terminal.d.ts +9 -0
  60. package/lib/types/client/cm-themes.d.ts +24 -0
  61. package/lib/types/client/conversation-draft.d.ts +14 -0
  62. package/lib/types/client/desktop-env.d.ts +35 -0
  63. package/lib/types/client/editor-load.d.ts +66 -0
  64. package/lib/types/client/frame-batcher.d.ts +24 -0
  65. package/lib/types/client/icons.d.ts +66 -0
  66. package/lib/types/client/image-types.d.ts +3 -0
  67. package/lib/types/client/ime-guard.d.ts +36 -0
  68. package/lib/types/client/index.d.ts +19 -0
  69. package/lib/types/client/intercept.d.ts +44 -0
  70. package/lib/types/client/lang.d.ts +14 -0
  71. package/lib/types/client/layout-push.d.ts +15 -0
  72. package/lib/types/client/lazy-chunk.d.ts +25 -0
  73. package/lib/types/client/link-intercept.d.ts +42 -0
  74. package/lib/types/client/locales-ar.d.ts +18 -0
  75. package/lib/types/client/locales-de.d.ts +4 -0
  76. package/lib/types/client/locales-fr.d.ts +10 -0
  77. package/lib/types/client/locales-hi.d.ts +17 -0
  78. package/lib/types/client/locales-id.d.ts +15 -0
  79. package/lib/types/client/locales-it.d.ts +8 -0
  80. package/lib/types/client/locales-ja.d.ts +17 -0
  81. package/lib/types/client/locales-ko.d.ts +9 -0
  82. package/lib/types/client/locales-nl.d.ts +16 -0
  83. package/lib/types/client/locales-pl.d.ts +19 -0
  84. package/lib/types/client/locales-pt.d.ts +1 -0
  85. package/lib/types/client/locales-ru.d.ts +13 -0
  86. package/lib/types/client/locales-sv.d.ts +1 -0
  87. package/lib/types/client/locales-th.d.ts +17 -0
  88. package/lib/types/client/locales-tr.d.ts +17 -0
  89. package/lib/types/client/locales-vi.d.ts +17 -0
  90. package/lib/types/client/locales-zh-HK.d.ts +32 -0
  91. package/lib/types/client/locales-zh-MO.d.ts +32 -0
  92. package/lib/types/client/locales-zh-TW.d.ts +32 -0
  93. package/lib/types/client/locales.d.ts +571 -0
  94. package/lib/types/client/markdown-html.d.ts +96 -0
  95. package/lib/types/client/markdown-images.d.ts +45 -0
  96. package/lib/types/client/markdown-labels.d.ts +21 -0
  97. package/lib/types/client/md-toc.d.ts +4 -0
  98. package/lib/types/client/mermaid-blocks.d.ts +47 -0
  99. package/lib/types/client/mermaid-sanitize.d.ts +2 -0
  100. package/lib/types/client/mermaid.d.ts +12 -0
  101. package/lib/types/client/open-when-sized.d.ts +20 -0
  102. package/lib/types/client/open-with-settings.d.ts +4 -0
  103. package/lib/types/client/open-with.d.ts +87 -0
  104. package/lib/types/client/openpath-intercept.d.ts +52 -0
  105. package/lib/types/client/paths.d.ts +43 -0
  106. package/lib/types/client/pdf-types.d.ts +2 -0
  107. package/lib/types/client/pinned.d.ts +86 -0
  108. package/lib/types/client/plugin-settings.d.ts +8 -0
  109. package/lib/types/client/plugins-shared.d.ts +27 -0
  110. package/lib/types/client/plugins-tabs.d.ts +3 -0
  111. package/lib/types/client/plugins-viewers.d.ts +3 -0
  112. package/lib/types/client/prefs.d.ts +41 -0
  113. package/lib/types/client/produced-files.d.ts +29 -0
  114. package/lib/types/client/selection-payload.d.ts +27 -0
  115. package/lib/types/client/service.d.ts +445 -0
  116. package/lib/types/client/session-pins.d.ts +14 -0
  117. package/lib/types/client/settings-nav-icon.d.ts +27 -0
  118. package/lib/types/client/shell-presets.d.ts +48 -0
  119. package/lib/types/client/split-pane.d.ts +38 -0
  120. package/lib/types/client/state.d.ts +480 -0
  121. package/lib/types/client/tab-content-memo.d.ts +40 -0
  122. package/lib/types/client/terminal-font.d.ts +78 -0
  123. package/lib/types/client/terminal-links.d.ts +119 -0
  124. package/lib/types/client/theme.d.ts +45 -0
  125. package/lib/types/client/titlebar-strip.d.ts +23 -0
  126. package/lib/types/client/ui-tweaks/appicons.d.ts +16 -0
  127. package/lib/types/client/ui-tweaks/archive.d.ts +42 -0
  128. package/lib/types/client/ui-tweaks/branding.d.ts +45 -0
  129. package/lib/types/client/ui-tweaks/cachehit.d.ts +41 -0
  130. package/lib/types/client/ui-tweaks/gitbar.d.ts +103 -0
  131. package/lib/types/client/ui-tweaks/index.d.ts +279 -0
  132. package/lib/types/client/ui-tweaks/mcp.d.ts +28 -0
  133. package/lib/types/client/ui-tweaks/notifier.d.ts +125 -0
  134. package/lib/types/client/ui-tweaks/whale.d.ts +55 -0
  135. package/lib/types/client/upload.d.ts +69 -0
  136. package/lib/types/client/useChatcodeAccount.d.ts +10 -0
  137. package/lib/types/client/wco.d.ts +47 -0
  138. package/lib/types/codingplan.d.ts +37 -0
  139. package/lib/types/config.d.ts +95 -0
  140. package/lib/types/context-types.d.ts +540 -0
  141. package/lib/types/fs-operations.d.ts +30 -0
  142. package/lib/types/fs-search.d.ts +24 -0
  143. package/lib/types/fs-tree.d.ts +51 -0
  144. package/lib/types/git.d.ts +124 -0
  145. package/lib/types/html-route.d.ts +59 -0
  146. package/lib/types/index.d.ts +47 -0
  147. package/lib/types/invariant.d.ts +15 -0
  148. package/lib/types/login-route.d.ts +2 -0
  149. package/lib/types/open-external.d.ts +24 -0
  150. package/lib/types/path-security.d.ts +26 -0
  151. package/lib/types/prefs-shared.d.ts +257 -0
  152. package/lib/types/pty-deps.d.ts +79 -0
  153. package/lib/types/pty-manager.d.ts +168 -0
  154. package/lib/types/tools.d.ts +34 -0
  155. package/lib/types/trust-fence.d.ts +24 -0
  156. package/lib/types/ui-tweaks/archive.d.ts +71 -0
  157. package/lib/types/ui-tweaks/config.d.ts +186 -0
  158. package/lib/types/ui-tweaks/git-web.d.ts +43 -0
  159. package/lib/types/ui-tweaks/git.d.ts +311 -0
  160. package/lib/types/ui-tweaks/index.d.ts +17 -0
  161. package/lib/types/ui-tweaks/mcp.d.ts +103 -0
  162. package/lib/types/ui-tweaks/turn-outcome.d.ts +57 -0
  163. package/lib/types/ui-tweaks/web.d.ts +55 -0
  164. package/lib/types/wire.d.ts +38 -0
  165. package/package.json +213 -0
  166. package/scripts/install.ps1 +310 -0
  167. package/scripts/install.sh +287 -0
  168. package/src/agent-opens.ts +265 -0
  169. package/src/agent-pty.ts +527 -0
  170. package/src/browser-probe.ts +26 -0
  171. package/src/bundle-route.ts +129 -0
  172. package/src/chatcode-update.ts +193 -0
  173. package/src/client/AccountMenu.tsx +177 -0
  174. package/src/client/AiRatioSection.module.css +329 -0
  175. package/src/client/AiRatioSection.tsx +292 -0
  176. package/src/client/BrowserView.tsx +289 -0
  177. package/src/client/ChatcodeGate.tsx +35 -0
  178. package/src/client/CodingPlanModelsSettings.module.css +118 -0
  179. package/src/client/CodingPlanModelsSettings.tsx +101 -0
  180. package/src/client/DiffTab.tsx +114 -0
  181. package/src/client/DiffView.tsx +305 -0
  182. package/src/client/EditorHost.tsx +563 -0
  183. package/src/client/FenceErrorNotice.tsx +40 -0
  184. package/src/client/FileTree.tsx +701 -0
  185. package/src/client/FreeWindow.tsx +337 -0
  186. package/src/client/GitView.tsx +722 -0
  187. package/src/client/MarkdownHtml.tsx +296 -0
  188. package/src/client/OrphanedTab.tsx +27 -0
  189. package/src/client/PdfView.tsx +110 -0
  190. package/src/client/ReleaseNotesDialog.tsx +91 -0
  191. package/src/client/RenderBoundary.tsx +49 -0
  192. package/src/client/SandboxStatusBar.tsx +60 -0
  193. package/src/client/SideCardSection.module.css +932 -0
  194. package/src/client/SideCardSection.tsx +1169 -0
  195. package/src/client/Sidebar.tsx +1857 -0
  196. package/src/client/TabBar.tsx +365 -0
  197. package/src/client/TerminalView.tsx +424 -0
  198. package/src/client/TextEditor.tsx +468 -0
  199. package/src/client/TreePanel.tsx +279 -0
  200. package/src/client/UpdateDialog.tsx +186 -0
  201. package/src/client/UpdateSettingsPanel.tsx +29 -0
  202. package/src/client/UpdateSettingsSection.tsx +22 -0
  203. package/src/client/UploadOverlay.tsx +62 -0
  204. package/src/client/UsageHeatmapSection.module.css +440 -0
  205. package/src/client/UsageHeatmapSection.tsx +301 -0
  206. package/src/client/add-plugin-modal.tsx +199 -0
  207. package/src/client/api.ts +433 -0
  208. package/src/client/binary-download.tsx +23 -0
  209. package/src/client/breakpoints.ts +61 -0
  210. package/src/client/browser.ts +167 -0
  211. package/src/client/builtins/index.ts +37 -0
  212. package/src/client/builtins/tabs.tsx +275 -0
  213. package/src/client/builtins/viewers.tsx +125 -0
  214. package/src/client/chat-presentation.ts +95 -0
  215. package/src/client/chunk-loader.ts +350 -0
  216. package/src/client/chunks/editor.tsx +9 -0
  217. package/src/client/chunks/mermaid.tsx +10 -0
  218. package/src/client/chunks/terminal.tsx +9 -0
  219. package/src/client/cm-themes.ts +129 -0
  220. package/src/client/conversation-draft.ts +29 -0
  221. package/src/client/css-modules.d.ts +5 -0
  222. package/src/client/desktop-env.ts +72 -0
  223. package/src/client/editor-load.ts +92 -0
  224. package/src/client/frame-batcher.ts +56 -0
  225. package/src/client/icons.tsx +170 -0
  226. package/src/client/image-types.ts +8 -0
  227. package/src/client/ime-guard.ts +47 -0
  228. package/src/client/index.tsx +501 -0
  229. package/src/client/intercept.tsx +172 -0
  230. package/src/client/lang.ts +225 -0
  231. package/src/client/layout-push.ts +37 -0
  232. package/src/client/layout.css +156 -0
  233. package/src/client/lazy-chunk.tsx +89 -0
  234. package/src/client/link-intercept.ts +73 -0
  235. package/src/client/locales-ar.ts +387 -0
  236. package/src/client/locales-de.ts +372 -0
  237. package/src/client/locales-fr.ts +379 -0
  238. package/src/client/locales-hi.ts +386 -0
  239. package/src/client/locales-id.ts +384 -0
  240. package/src/client/locales-it.ts +377 -0
  241. package/src/client/locales-ja.ts +486 -0
  242. package/src/client/locales-ko.ts +378 -0
  243. package/src/client/locales-nl.ts +384 -0
  244. package/src/client/locales-pl.ts +388 -0
  245. package/src/client/locales-pt.ts +369 -0
  246. package/src/client/locales-ru.ts +384 -0
  247. package/src/client/locales-sv.ts +369 -0
  248. package/src/client/locales-th.ts +386 -0
  249. package/src/client/locales-tr.ts +386 -0
  250. package/src/client/locales-vi.ts +386 -0
  251. package/src/client/locales-zh-HK.ts +401 -0
  252. package/src/client/locales-zh-MO.ts +401 -0
  253. package/src/client/locales-zh-TW.ts +401 -0
  254. package/src/client/locales.ts +1229 -0
  255. package/src/client/markdown-html.ts +331 -0
  256. package/src/client/markdown-images.ts +137 -0
  257. package/src/client/markdown-labels.tsx +31 -0
  258. package/src/client/md-toc.tsx +127 -0
  259. package/src/client/mermaid-blocks.ts +110 -0
  260. package/src/client/mermaid-sanitize.ts +93 -0
  261. package/src/client/mermaid.tsx +406 -0
  262. package/src/client/open-when-sized.ts +43 -0
  263. package/src/client/open-with-settings.tsx +135 -0
  264. package/src/client/open-with.ts +221 -0
  265. package/src/client/openpath-intercept.ts +79 -0
  266. package/src/client/paths.ts +63 -0
  267. package/src/client/pdf-types.ts +4 -0
  268. package/src/client/pinned.ts +184 -0
  269. package/src/client/plugin-settings.ts +43 -0
  270. package/src/client/plugins-shared.ts +29 -0
  271. package/src/client/plugins-tabs.ts +153 -0
  272. package/src/client/plugins-viewers.ts +44 -0
  273. package/src/client/prefs.ts +216 -0
  274. package/src/client/produced-files.ts +120 -0
  275. package/src/client/selection-payload.ts +86 -0
  276. package/src/client/service.ts +873 -0
  277. package/src/client/session-pins.tsx +334 -0
  278. package/src/client/settings-nav-icon.ts +55 -0
  279. package/src/client/shell-presets.ts +83 -0
  280. package/src/client/sidebar.module.css +3607 -0
  281. package/src/client/split-pane.tsx +333 -0
  282. package/src/client/state.ts +1646 -0
  283. package/src/client/tab-content-memo.ts +55 -0
  284. package/src/client/terminal-font.ts +224 -0
  285. package/src/client/terminal-links.ts +194 -0
  286. package/src/client/theme.ts +110 -0
  287. package/src/client/titlebar-strip.ts +37 -0
  288. package/src/client/ui-tweaks/appicons.ts +24 -0
  289. package/src/client/ui-tweaks/archive.tsx +281 -0
  290. package/src/client/ui-tweaks/branding.tsx +232 -0
  291. package/src/client/ui-tweaks/cachehit.tsx +122 -0
  292. package/src/client/ui-tweaks/gitbar.tsx +2559 -0
  293. package/src/client/ui-tweaks/index.tsx +1696 -0
  294. package/src/client/ui-tweaks/mcp.tsx +582 -0
  295. package/src/client/ui-tweaks/notifier.ts +514 -0
  296. package/src/client/ui-tweaks/whale.tsx +171 -0
  297. package/src/client/upload.ts +187 -0
  298. package/src/client/useChatcodeAccount.ts +103 -0
  299. package/src/client/wco.ts +120 -0
  300. package/src/codingplan.ts +146 -0
  301. package/src/config.ts +207 -0
  302. package/src/context-types.ts +559 -0
  303. package/src/fs-operations.ts +97 -0
  304. package/src/fs-search.ts +113 -0
  305. package/src/fs-tree.ts +158 -0
  306. package/src/git.ts +446 -0
  307. package/src/html-route.ts +106 -0
  308. package/src/index.ts +1524 -0
  309. package/src/invariant.ts +32 -0
  310. package/src/login-route.ts +26 -0
  311. package/src/open-external.ts +90 -0
  312. package/src/path-security.ts +81 -0
  313. package/src/prefs-shared.ts +303 -0
  314. package/src/pty-deps.ts +241 -0
  315. package/src/pty-manager.ts +376 -0
  316. package/src/tools.ts +482 -0
  317. package/src/trust-fence.ts +84 -0
  318. package/src/ui-tweaks/archive.ts +293 -0
  319. package/src/ui-tweaks/config.ts +257 -0
  320. package/src/ui-tweaks/git-web.ts +421 -0
  321. package/src/ui-tweaks/git.ts +1524 -0
  322. package/src/ui-tweaks/index.ts +61 -0
  323. package/src/ui-tweaks/mcp.ts +535 -0
  324. package/src/ui-tweaks/turn-outcome.ts +105 -0
  325. package/src/ui-tweaks/web.ts +225 -0
  326. package/src/wire.ts +110 -0
  327. package/vendor/addon-fit.js +2 -0
  328. package/vendor/xterm.css +218 -0
  329. package/vendor/xterm.js +5 -0
@@ -0,0 +1,30 @@
1
+ /** Inputs of one upload: the session scope plus the request body stream. */
2
+ export interface WorkspaceUploadInput {
3
+ /** The session workspace root; target and directory must stay inside it. */
4
+ cwd: string;
5
+ /** Absolute upload directory chosen by the client (inside `cwd`). */
6
+ dir: string;
7
+ /** Relative path below `dir` (absolute paths, '.', '..' and empty segments refused). */
8
+ relativePath: string;
9
+ /** The request body stream (raw bytes). */
10
+ chunks: AsyncIterable<string | Uint8Array>;
11
+ /** Byte cap; an oversized upload is refused without touching the target. */
12
+ limit: number;
13
+ /** Whether workspace containment is enforced (the `workspaceFence` setting; on by default). */
14
+ fence?: boolean;
15
+ }
16
+ /**
17
+ * Stream `chunks` into `dir/relativePath` atomically: a uniquely named temp
18
+ * sibling receives the bytes, then is renamed over the target. The parent
19
+ * directory is created on demand (recursive), so folder uploads work before
20
+ * any level exists. The unique temp name keeps concurrent uploads to the same
21
+ * target independent (each writes and renames its own file; the last rename
22
+ * wins) and never blocks later uploads after a crashed process.
23
+ *
24
+ * @throws SidebarError with a wire code for containment, shape, and size
25
+ * failures; the temp file is always removed on failure.
26
+ */
27
+ export declare function writeWorkspaceUpload(input: WorkspaceUploadInput): Promise<{
28
+ path: string;
29
+ size: number;
30
+ }>;
@@ -0,0 +1,24 @@
1
+ /** One search: the relative paths of the matching entries (dirs included so
2
+ * the client can hint where matches live) plus the truncation flag. */
3
+ export interface FsSearchResult {
4
+ matches: string[];
5
+ truncated: boolean;
6
+ }
7
+ /** Search budgets (both injectable for tests). */
8
+ export interface FsSearchOptions {
9
+ /** Row cap of the result list (default 200). */
10
+ maxMatches?: number;
11
+ /** Total entries visited before the walk gives up (default 100_000). */
12
+ maxVisited?: number;
13
+ }
14
+ /**
15
+ * Search `root` recursively for entries whose name contains `query`
16
+ * (case-insensitive).
17
+ * @param root - absolute search root.
18
+ * @param query - the name substring; empty matches nothing.
19
+ * @param opts - budget overrides (tests).
20
+ * @returns the matching paths RELATIVE to `root` ('/'-separated), sorted,
21
+ * plus whether a budget cut the walk short. An unreadable level is skipped
22
+ * (permission errors never fail the whole search).
23
+ */
24
+ export declare function searchFiles(root: string, query: string, opts?: FsSearchOptions): Promise<FsSearchResult>;
@@ -0,0 +1,51 @@
1
+ /** One explorer row. */
2
+ export interface SidebarFsEntry {
3
+ name: string;
4
+ path: string;
5
+ isDir: boolean;
6
+ hidden: boolean;
7
+ /** Whether the row is a symlink; `isDir` then describes the link's target. */
8
+ isSymlink: boolean;
9
+ /** For symlinks: the target is missing or unreadable (stat failed). */
10
+ broken: boolean;
11
+ }
12
+ /** One listed level. */
13
+ export interface SidebarFsListing {
14
+ path: string;
15
+ entries: SidebarFsEntry[];
16
+ truncated: boolean;
17
+ }
18
+ /** Directory-first, case-insensitive name ordering (VSCode explorer order). */
19
+ export declare function compareEntries(a: SidebarFsEntry, b: SidebarFsEntry): number;
20
+ /**
21
+ * List one directory level.
22
+ * @param path - absolute directory path.
23
+ * @param maxEntries - row bound of one level (extra rows flag `truncated`).
24
+ * @returns the sorted listing.
25
+ * @throws {SidebarError} fs-error when the level is unreadable or not a directory.
26
+ */
27
+ export declare function listDirectory(path: string, maxEntries?: number): Promise<SidebarFsListing>;
28
+ /** The root row label of a listing: the last path segment (or the full path at the filesystem root). */
29
+ export declare function rootLabel(path: string): string;
30
+ /** Parent of a path, or undefined at the filesystem root (the explorer's "up" target). */
31
+ export declare function parentOf(path: string): string | undefined;
32
+ /**
33
+ * Normalize a caller-supplied path to an absolute, resolved path or throw
34
+ * fs-error. `path.isAbsolute()` is the OS's own notion of absolute: POSIX
35
+ * roots (`/...`), Windows drive letters (`C:\...`) and — on win32 — UNC
36
+ * network shares (`\\server\share\...`); drive-relative forms (`C:foo`)
37
+ * stay rejected.
38
+ */
39
+ export declare function requireAbsolute(path: string): string;
40
+ /**
41
+ * Whether `target` lies under `base` (or equals it), tolerant of separator
42
+ * style and — on Windows, where the filesystem is case-insensitive — of
43
+ * letter case. The media route uses this instead of a raw `startsWith` so a
44
+ * case-mismatched or mixed-separator path can never be misclassified
45
+ * (e.g. `C:\Users\Me` vs `c:/users/me/file.png`).
46
+ * @param platform - filesystem semantics; injectable so both branches are
47
+ * unit-testable on any host.
48
+ */
49
+ export declare function isWithin(base: string, target: string, platform?: NodeJS.Platform): boolean;
50
+ /** Message text of an unknown thrown value. */
51
+ export declare function messageOf(error: unknown): string;
@@ -0,0 +1,124 @@
1
+ /** A parsed `git status --porcelain=v1 -z` entry. */
2
+ export interface GitStatusEntry {
3
+ path: string;
4
+ /** Two-letter index/worktree status (X Y), e.g. 'M ', ' M', 'A ', '??'. */
5
+ xy: string;
6
+ }
7
+ /** The source-control panel snapshot. */
8
+ export interface GitStatusResult {
9
+ isRepo: boolean;
10
+ branch?: string;
11
+ entries: GitStatusEntry[];
12
+ /** True when the working tree had more rows than `GIT_STATUS_LIMIT`; the
13
+ * panel shows a truncation notice instead of freezing on a huge untracked
14
+ * set (issue #369). */
15
+ truncated?: boolean;
16
+ /** Selected repository root, or the discovered roots when the cwd is a container. */
17
+ root?: string;
18
+ repositories?: string[];
19
+ }
20
+ /** One linked checkout returned by `git worktree list --porcelain`. */
21
+ export interface GitWorktree {
22
+ /** Absolute checkout root. */
23
+ path: string;
24
+ /** Branch name without `refs/heads/`, or `HEAD` when detached. */
25
+ branch: string;
26
+ /** Whether this checkout contains the session cwd. */
27
+ current: boolean;
28
+ /** Number of staged + unstaged status rows (a file changed on both sides counts once). */
29
+ changes: number;
30
+ }
31
+ /** One `git log` row. */
32
+ export interface GitLogEntry {
33
+ /** Short hash (7+ chars, display). */
34
+ hash: string;
35
+ /** Full 40-char hash (advanced operations: revert / cherry-pick). */
36
+ hashFull: string;
37
+ subject: string;
38
+ author: string;
39
+ /** ISO 8601 author date (`%ai`), e.g. `2024-01-01 10:00:00 +0800`. */
40
+ date: string;
41
+ /** Ref decorations (`%D` with --decorate=short), e.g. `HEAD -> main, origin/main`; '' when none. */
42
+ refs: string;
43
+ }
44
+ /** One git failure (stderr text as the message). */
45
+ export declare class GitCommandError extends Error {
46
+ readonly code: string;
47
+ readonly command: string;
48
+ constructor(message: string, code: string | undefined, command: string);
49
+ }
50
+ /** Parse porcelain v1 -z output into entries (rename/copy pairs collapse to one row). */
51
+ export declare function parsePorcelainZ(output: string): GitStatusEntry[];
52
+ /** One raw porcelain worktree record. Prunable checkouts are retained by
53
+ * Git's administrative metadata after their directory disappears and must not
54
+ * become selectable command targets. Locked checkouts remain usable. */
55
+ export interface GitWorktreeRecord {
56
+ path: string;
57
+ branch: string;
58
+ locked: boolean;
59
+ prunable: boolean;
60
+ }
61
+ /** Parse `git worktree list --porcelain` records. Production requests use
62
+ * `-z` so even newlines and non-ASCII bytes in checkout paths stay lossless;
63
+ * newline framing remains accepted for small fixtures and older Git output. */
64
+ export declare function parseWorktreeList(output: string): GitWorktreeRecord[];
65
+ /** Parse `git log --pretty=format:%h%x1f%s%x1f%an%x1f%ai%x1f%H%x1f%D` rows. */
66
+ export declare function parseLogLines(output: string): GitLogEntry[];
67
+ /** Whether the directory is inside a git work tree (exit-0 `git rev-parse`).
68
+ * Probe timeout is short: a cwd on a stalled mount must not hold the panel
69
+ * hostage for the full command budget (issue #369). */
70
+ export declare function isGitRepo(cwd: string): Promise<boolean>;
71
+ /** Discover the current repository or direct child repositories. Results are
72
+ * cached per cwd and concurrent callers share one in-flight scan, so opening
73
+ * the panel (three parallel git.* requests) costs a single discovery pass. */
74
+ export declare function repoRoots(cwd: string): Promise<string[]>;
75
+ /** Resolve the selected repository, defaulting to the first discovered root. */
76
+ export declare function repoRoot(cwd: string, selected?: string): Promise<string>;
77
+ /** The current branch name (`git rev-parse --abbrev-ref HEAD`; 'HEAD' when detached). */
78
+ export declare function currentBranch(cwd: string): Promise<string>;
79
+ /**
80
+ * Working-tree status (untracked included). `--untracked-files=all` lists
81
+ * the contents of new directories as individual entries, while preserving
82
+ * repository discovery and explicit repository selection for workspace roots.
83
+ */
84
+ export declare function status(cwd: string, selected?: string): Promise<GitStatusResult>;
85
+ /** All linked checkouts of the repository containing `cwd`, enriched with a
86
+ * live change count. The current checkout is first so a single-worktree repo
87
+ * preserves the old UI ordering. */
88
+ export declare function worktrees(cwd: string): Promise<GitWorktree[]>;
89
+ /** Resolve an optional client-selected linked checkout. A caller may never use
90
+ * this seam to point Git operations at an unrelated repository: the target
91
+ * must occur in the authoritative session repository's worktree list. */
92
+ export declare function resolveWorktree(cwd: string, requested?: string): Promise<string>;
93
+ /** Diff text of the worktree (unstaged) or the index (staged). */
94
+ export declare function diff(cwd: string, path: string | undefined, staged: boolean, selected?: string): Promise<string>;
95
+ /** Stage paths (all when path is undefined). */
96
+ export declare function stage(cwd: string, path: string | undefined, selected?: string): Promise<void>;
97
+ /** Unstage paths (all when path is undefined). */
98
+ export declare function unstage(cwd: string, path: string | undefined, selected?: string): Promise<void>;
99
+ /** Commit the staged changes with a message (global identity untouched). */
100
+ export declare function commit(cwd: string, message: string, selected?: string): Promise<void>;
101
+ /** Branch names (current first). */
102
+ export declare function branches(cwd: string, selected?: string): Promise<{
103
+ current: string;
104
+ names: string[];
105
+ }>;
106
+ /** Switch to an existing branch. */
107
+ export declare function checkout(cwd: string, branch: string, selected?: string): Promise<void>;
108
+ /** Recent commit history (newest first), lazily pageable via skip/count. */
109
+ export declare function log(cwd: string, count?: number, skip?: number, selected?: string): Promise<GitLogEntry[]>;
110
+ /**
111
+ * Content of a file at a revision (`git show <rev>:<path>`), or null when the
112
+ * revision has no such path (a new/untracked file has no HEAD side).
113
+ */
114
+ export declare function show(cwd: string, rev: string, path: string, selected?: string): Promise<string | null>;
115
+ /** Full patch text of one commit (`git show` with the commit header suppressed).
116
+ * Merge commits show their diff against the first parent (`-m --first-parent`
117
+ * is a no-op for regular commits), so a history click always has content. */
118
+ export declare function commitDiff(cwd: string, hash: string, selected?: string): Promise<string>;
119
+ /** Discard the worktree changes of one path (`git checkout -- <path>`; the index is untouched). */
120
+ export declare function discard(cwd: string, path: string, selected?: string): Promise<void>;
121
+ /** Revert one commit onto the current branch with an auto-generated message. */
122
+ export declare function revert(cwd: string, hash: string, selected?: string): Promise<void>;
123
+ /** Cherry-pick one commit onto the current branch. */
124
+ export declare function cherryPick(cwd: string, hash: string, selected?: string): Promise<void>;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pure URL vocabulary of the /sidebar/html route (HTML previewer).
3
+ *
4
+ * Why path-encoded parameters instead of a query string: the previewed
5
+ * page resolves its relative assets (./style.css, img/x.png) against the
6
+ * document URL, and the WHATWG URL algorithm DROPS the query of a
7
+ * path-relative reference — `/sidebar/html?a=1&path=/a/b/` + `./style.css`
8
+ * would lose the session scope and the route would reject the asset.
9
+ * Encoding everything into the URL path keeps relative resolution inside
10
+ * the same route with every request self-contained:
11
+ *
12
+ * /sidebar/html/<sessionId>/<absolute-path segments, encodeURIComponent'd>
13
+ * /sidebar/html/S/Users/me/proj/index.html
14
+ * + ./style.css → /sidebar/html/S/Users/me/proj/style.css
15
+ * Windows: C:\Users\me\a.html → /sidebar/html/S/C%3A/Users/me/a.html
16
+ * UNC (\\server\share\... or //server/share/...):
17
+ * → /sidebar/html/S//server/share/proj/a.html ('//' right after the
18
+ * sessionId marks the UNC prefix; the WHATWG URL keeps '//' intact so
19
+ * relative assets still resolve inside the same route)
20
+ *
21
+ * The decoder rebuilds the marker as a forward-slash `//server/share/...`
22
+ * path. That form is intentionally platform-neutral: `node:path` resolves it
23
+ * to `\\server\share\...` on win32 and `/server/share/...` on POSIX, so the
24
+ * host's existing requireAbsolute + isWithin fence needs no platform signal
25
+ * (a leading `//` is a legal POSIX absolute path, so no data is lost on
26
+ * either platform).
27
+ *
28
+ * This module is intentionally dependency-free (no node imports, no wire
29
+ * helpers) so the client bundle can import `encodeHtmlUrl` without tripping
30
+ * the build-time purity gate; the host converts decode failures into
31
+ * SidebarError responses at the route boundary.
32
+ */
33
+ /** One decoded route reference. */
34
+ export interface HtmlRouteRef {
35
+ sessionId: string;
36
+ /** Absolute file path (leading slash; Windows drives keep their colon). */
37
+ path: string;
38
+ }
39
+ /** Decode outcome: the reference, or a client-error description. */
40
+ export type HtmlDecodeResult = {
41
+ ok: true;
42
+ ref: HtmlRouteRef;
43
+ } | {
44
+ ok: false;
45
+ status: 400 | 404;
46
+ message: string;
47
+ };
48
+ /** The route prefix both encoders/decoders agree on. */
49
+ export declare const HTML_ROUTE_PREFIX = "/sidebar/html/";
50
+ /** Build the route URL for one absolute file path (client + tests). */
51
+ export declare function encodeHtmlUrl(sessionId: string, path: string): string;
52
+ /**
53
+ * Decode a route pathname into the session + absolute file path. Rejects
54
+ * a wrong prefix (404), an empty path, malformed percent encoding, and a
55
+ * missing sessionId or file path (400). The caller still must bound the
56
+ * decoded path with the workspace real-path guard — a decoded `..`
57
+ * segment resolves outside the cwd and is refused there.
58
+ */
59
+ export declare function decodeHtmlUrl(pathname: string): HtmlDecodeResult;
@@ -0,0 +1,47 @@
1
+ import type { Context } from './context-types.ts';
2
+ import { Config, type ResolvedSidebarConfig, type SidebarConfig } from './config.ts';
3
+ export { Config };
4
+ export type { SidebarConfig, ResolvedSidebarConfig };
5
+ export type { Context } from './context-types.ts';
6
+ export type { BetterSidebarService, TabDescriptor, TabComponentProps, FileViewerDescriptor, FileViewerProps, FileFetchStrategy, } from './client/service.ts';
7
+ /** Plugin identity for cordis.yml rows. */
8
+ export declare const name = "dsh-better-sidebar";
9
+ /** Services required before mounting: the webserver routes, the session store, the web runtime's trusted hosts, and the tool registry. */
10
+ export declare const inject: string[];
11
+ /** Content type served by /sidebar/file (binary-safe fallback for unknowns). */
12
+ export declare function mediaTypeForPath(path: string): string;
13
+ /**
14
+ * The live face of the side card settings namespace, bound to the settings
15
+ * service when it is mounted. The DSH settings RPC domain only serves
16
+ * allowlisted namespaces (api-proxy exposedNamespaces), so the client reads
17
+ * and writes THIS namespace through the plugin's own fenced /sidebar routes,
18
+ * which call the seam in-process — no configuration-client gate involved.
19
+ */
20
+ export interface SidebarSettingsFace {
21
+ /** The current resolved value + revision (undefined while the settings service is absent). */
22
+ get(): {
23
+ value?: unknown;
24
+ revision?: number;
25
+ };
26
+ /**
27
+ * Whether the dsh-web-ui family's aionui-panel has been selected as the
28
+ * right-panel provider (the `aionui-panel` settings namespace resolves
29
+ * `rightPanel: 'aionui-panel'`). While true the sidebar must not mount —
30
+ * the two right panels are mutually exclusive. False when the namespace is
31
+ * absent (no aionui installed) or the provider is anything else.
32
+ */
33
+ externalDisable(): boolean;
34
+ /** Merge a patch (revision-guarded) and return the fresh resolved view. */
35
+ update(patch: Record<string, unknown>, expectedRevision?: number): Promise<{
36
+ value?: unknown;
37
+ revision?: number;
38
+ }>;
39
+ }
40
+ /**
41
+ * Plugin body: mount the fenced routes and the pty lifecycle.
42
+ * @param ctx - host plugin context (webServer, sessions, webRuntime).
43
+ * @param config - deployment-provided limits; the Loader validates against
44
+ * {@link Config} and fills defaults, direct callers get them from
45
+ * {@link resolveSidebarConfig}.
46
+ */
47
+ export declare function apply(ctx: Context, config?: SidebarConfig): void;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Package-owned invariant companion for `dsh-better-sidebar`.
3
+ * @module dsh-better-sidebar/invariant
4
+ */
5
+ import type { Context } from './context-types.ts';
6
+ /** Cordis companion plugin name. */
7
+ export declare const name = "dsh-better-sidebar-invariant";
8
+ /** Service required before the companion can reserve package ownership. */
9
+ export declare const inject: string[];
10
+ /**
11
+ * Register this package's invariant companion.
12
+ * @param ctx - Cordis context carrying the invariant service.
13
+ * @returns the installed registration's disposer after setup succeeds.
14
+ */
15
+ export declare const apply: (ctx: Context) => Promise<() => void>;
@@ -0,0 +1,2 @@
1
+ import type { Context, SidebarHttpRequest } from './context-types.ts';
2
+ export declare function registerLoginRoute(ctx: Context, fence: (req: SidebarHttpRequest) => boolean): () => void;
@@ -0,0 +1,24 @@
1
+ /** The two external open actions the route accepts. */
2
+ export type OpenExternalAction = 'reveal' | 'url';
3
+ /** One platform opener invocation (argv array — never a shell string). */
4
+ export interface ExternalCommand {
5
+ command: string;
6
+ args: string[];
7
+ }
8
+ /** Reveal/select a path in the OS file manager. On Linux there is no common
9
+ * select protocol — the containing directory is opened instead (KISS). */
10
+ export declare function revealCommand(path: string, platform?: NodeJS.Platform): ExternalCommand;
11
+ /** Hand a custom-scheme URL to the OS protocol handler. */
12
+ export declare function urlCommand(url: string, platform?: NodeJS.Platform): ExternalCommand;
13
+ /** Validate a URL-scheme open target: a parseable custom-scheme URL (never
14
+ * http/https — those would only dump the URL into a browser tab). */
15
+ export declare function validateExternalUrl(raw: string): string;
16
+ /**
17
+ * Launch one external open action and return immediately (detached, no
18
+ * stdio). Spawn failures are reported through the child's 'error' event —
19
+ * by then the route already returned, so the event is swallowed (the OS
20
+ * dialog about a missing handler is the user-visible outcome either way).
21
+ */
22
+ export declare function launchExternal(action: OpenExternalAction, value: string): {
23
+ started: true;
24
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Resolve an existing workspace path through symlinks and (unless disarmed)
3
+ * enforce containment.
4
+ *
5
+ * @param cwd - Session workspace directory.
6
+ * @param target - Client-supplied absolute path.
7
+ * @param fence - Whether containment is enforced (the settings-page
8
+ * `workspaceFence` switch). Even when false the paths are still resolved
9
+ * through symlinks so callers always receive the canonical target.
10
+ * @returns The canonical absolute path used for the filesystem operation.
11
+ */
12
+ export declare function ensureWorkspacePath(cwd: string, target: string, fence?: boolean): Promise<string>;
13
+ /**
14
+ * Validate a write destination, including destinations that do not exist yet.
15
+ * Existing targets are resolved to catch symlinks; missing targets are checked
16
+ * against the nearest existing ancestor before the caller creates or renames.
17
+ * The returned path is rebuilt from that canonical ancestor, so an existing
18
+ * symlink is never left in the path passed to the write operation.
19
+ *
20
+ * @param cwd - Session workspace directory.
21
+ * @param target - Client-supplied absolute destination path.
22
+ * @param fence - Whether containment is enforced (the settings-page
23
+ * `workspaceFence` switch). Resolution/canonicalization is identical either way.
24
+ * @returns A canonical path for an existing target or its nearest existing ancestor.
25
+ */
26
+ export declare function ensureWorkspaceWritePath(cwd: string, target: string, fence?: boolean): Promise<string>;