wiki-viewer 1.14.1 → 1.14.2

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 (384) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  4. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/index.html +1 -1
  61. package/.next/standalone/.next/server/app/index.rsc +1 -1
  62. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  68. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  69. package/.next/standalone/.next/server/pages/404.html +1 -1
  70. package/.next/standalone/.next/server/pages/500.html +1 -1
  71. package/.next/standalone/package.json +1 -1
  72. package/bin/postbuild.js +21 -0
  73. package/package.json +1 -1
  74. package/.next/standalone/.github/workflows/publish.yml +0 -37
  75. package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
  76. package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
  77. package/.next/standalone/.pi/ownership.json +0 -3
  78. package/.next/standalone/AGENTS.md +0 -114
  79. package/.next/standalone/DESIGN.md +0 -521
  80. package/.next/standalone/README.md +0 -821
  81. package/.next/standalone/TODO.md +0 -20
  82. package/.next/standalone/agents/bootstrap-prompt.md +0 -14
  83. package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
  84. package/.next/standalone/bin/postbuild.js +0 -78
  85. package/.next/standalone/bin/wiki-viewer.js +0 -922
  86. package/.next/standalone/certificates/localhost-key.pem +0 -28
  87. package/.next/standalone/certificates/localhost.pem +0 -24
  88. package/.next/standalone/docs/agent-collab-plan.md +0 -1615
  89. package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
  90. package/.next/standalone/docs/agent-fs-plan.md +0 -232
  91. package/.next/standalone/docs/editorial-skin-spec.md +0 -242
  92. package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
  93. package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
  94. package/.next/standalone/docs/workspacing-plan.md +0 -364
  95. package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
  96. package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
  97. package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
  98. package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
  99. package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
  100. package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
  101. package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
  102. package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
  103. package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
  104. package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
  105. package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
  106. package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
  107. package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
  108. package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
  109. package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
  110. package/.next/standalone/pnpm-lock.yaml +0 -6697
  111. package/.next/standalone/pnpm-workspace.yaml +0 -8
  112. package/.next/standalone/postcss.config.mjs +0 -2
  113. package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
  114. package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
  115. package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
  116. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
  117. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
  118. package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
  119. package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
  120. package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
  121. package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
  122. package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
  123. package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
  124. package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
  125. package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
  126. package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
  127. package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
  128. package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
  129. package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
  130. package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
  131. package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
  132. package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
  133. package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
  134. package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
  135. package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
  136. package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
  137. package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
  138. package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
  139. package/.next/standalone/src/app/api/share/route.ts +0 -127
  140. package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
  141. package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
  142. package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
  143. package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
  144. package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
  145. package/.next/standalone/src/app/api/system/config/route.ts +0 -14
  146. package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
  147. package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
  148. package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
  149. package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
  150. package/.next/standalone/src/app/api/system/users/route.ts +0 -120
  151. package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
  152. package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
  153. package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
  154. package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
  155. package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
  156. package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
  157. package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
  158. package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
  159. package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
  160. package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
  161. package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
  162. package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
  163. package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
  164. package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
  165. package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
  166. package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
  167. package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
  168. package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
  169. package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
  170. package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
  171. package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
  172. package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
  173. package/.next/standalone/src/app/api/wiki/route.ts +0 -116
  174. package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
  175. package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
  176. package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
  177. package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
  178. package/.next/standalone/src/app/globals.css +0 -1249
  179. package/.next/standalone/src/app/icon.svg +0 -11
  180. package/.next/standalone/src/app/layout.tsx +0 -78
  181. package/.next/standalone/src/app/manifest.ts +0 -30
  182. package/.next/standalone/src/app/page.tsx +0 -3260
  183. package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
  184. package/.next/standalone/src/app/signin/page.tsx +0 -16
  185. package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
  186. package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
  187. package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
  188. package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
  189. package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
  190. package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
  191. package/.next/standalone/src/components/dir-picker.tsx +0 -606
  192. package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
  193. package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
  194. package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
  195. package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
  196. package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
  197. package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
  198. package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
  199. package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
  200. package/.next/standalone/src/components/editor/editor.tsx +0 -1327
  201. package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
  202. package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
  203. package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
  204. package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
  205. package/.next/standalone/src/components/editor/extensions.ts +0 -150
  206. package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
  207. package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
  208. package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
  209. package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
  210. package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
  211. package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
  212. package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
  213. package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
  214. package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
  215. package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
  216. package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
  217. package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
  218. package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
  219. package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
  220. package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
  221. package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
  222. package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
  223. package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
  224. package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
  225. package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
  226. package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
  227. package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
  228. package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
  229. package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
  230. package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
  231. package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
  232. package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
  233. package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
  234. package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
  235. package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
  236. package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
  237. package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
  238. package/.next/standalone/src/components/share-dialog.tsx +0 -307
  239. package/.next/standalone/src/components/theme-provider.tsx +0 -16
  240. package/.next/standalone/src/components/theme-toggle.tsx +0 -24
  241. package/.next/standalone/src/components/ui/badge.tsx +0 -35
  242. package/.next/standalone/src/components/ui/button.tsx +0 -56
  243. package/.next/standalone/src/components/ui/card.tsx +0 -63
  244. package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
  245. package/.next/standalone/src/components/ui/command.tsx +0 -151
  246. package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
  247. package/.next/standalone/src/components/ui/dialog.tsx +0 -119
  248. package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
  249. package/.next/standalone/src/components/ui/input.tsx +0 -22
  250. package/.next/standalone/src/components/ui/label.tsx +0 -25
  251. package/.next/standalone/src/components/ui/popover.tsx +0 -33
  252. package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
  253. package/.next/standalone/src/components/ui/select.tsx +0 -156
  254. package/.next/standalone/src/components/ui/separator.tsx +0 -30
  255. package/.next/standalone/src/components/ui/sheet.tsx +0 -140
  256. package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
  257. package/.next/standalone/src/components/ui/switch.tsx +0 -28
  258. package/.next/standalone/src/components/ui/tabs.tsx +0 -54
  259. package/.next/standalone/src/components/ui/textarea.tsx +0 -21
  260. package/.next/standalone/src/components/ui/tip.tsx +0 -23
  261. package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
  262. package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
  263. package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
  264. package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
  265. package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
  266. package/.next/standalone/src/lib/app-runner.ts +0 -272
  267. package/.next/standalone/src/lib/auth/admin.ts +0 -120
  268. package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
  269. package/.next/standalone/src/lib/auth/client.ts +0 -4
  270. package/.next/standalone/src/lib/auth/csrf.ts +0 -68
  271. package/.next/standalone/src/lib/auth/server.ts +0 -215
  272. package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
  273. package/.next/standalone/src/lib/config.ts +0 -114
  274. package/.next/standalone/src/lib/embeds/detect.ts +0 -142
  275. package/.next/standalone/src/lib/git-secrets.ts +0 -65
  276. package/.next/standalone/src/lib/git.ts +0 -503
  277. package/.next/standalone/src/lib/google/detect.ts +0 -107
  278. package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
  279. package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
  280. package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
  281. package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
  282. package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
  283. package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
  284. package/.next/standalone/src/lib/proof/activity.ts +0 -74
  285. package/.next/standalone/src/lib/proof/audit.ts +0 -88
  286. package/.next/standalone/src/lib/proof/auth.ts +0 -143
  287. package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
  288. package/.next/standalone/src/lib/proof/blocks.ts +0 -73
  289. package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
  290. package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
  291. package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
  292. package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
  293. package/.next/standalone/src/lib/proof/glob.ts +0 -51
  294. package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
  295. package/.next/standalone/src/lib/proof/lease.ts +0 -117
  296. package/.next/standalone/src/lib/proof/mutex.ts +0 -36
  297. package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
  298. package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
  299. package/.next/standalone/src/lib/proof/pending.ts +0 -97
  300. package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
  301. package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
  302. package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
  303. package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
  304. package/.next/standalone/src/lib/proof/registry.ts +0 -195
  305. package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
  306. package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
  307. package/.next/standalone/src/lib/proof/types.ts +0 -182
  308. package/.next/standalone/src/lib/proof-config.ts +0 -14
  309. package/.next/standalone/src/lib/root-dir.ts +0 -35
  310. package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
  311. package/.next/standalone/src/lib/search/indexer.ts +0 -634
  312. package/.next/standalone/src/lib/search/sanitize.ts +0 -35
  313. package/.next/standalone/src/lib/search/search-db.ts +0 -57
  314. package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
  315. package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
  316. package/.next/standalone/src/lib/toast.ts +0 -9
  317. package/.next/standalone/src/lib/utils.ts +0 -6
  318. package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
  319. package/.next/standalone/src/lib/workspace-client.ts +0 -82
  320. package/.next/standalone/src/lib/workspace-context.ts +0 -173
  321. package/.next/standalone/src/lib/workspaces.ts +0 -400
  322. package/.next/standalone/src/middleware.ts +0 -44
  323. package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
  324. package/.next/standalone/src/stores/editor-store.ts +0 -439
  325. package/.next/standalone/src/stores/pin-store.ts +0 -56
  326. package/.next/standalone/src/stores/proof-store.ts +0 -124
  327. package/.next/standalone/src/stores/recent-store.ts +0 -51
  328. package/.next/standalone/src/stores/search-store.ts +0 -104
  329. package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
  330. package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
  331. package/.next/standalone/src/stores/skin-store.ts +0 -42
  332. package/.next/standalone/src/stores/tree-store.ts +0 -52
  333. package/.next/standalone/src/stores/view-width-store.ts +0 -101
  334. package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
  335. package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
  336. package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
  337. package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
  338. package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
  339. package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
  340. package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
  341. package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
  342. package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
  343. package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
  344. package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
  345. package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
  346. package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
  347. package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
  348. package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
  349. package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
  350. package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
  351. package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
  352. package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
  353. package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
  354. package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
  355. package/.next/standalone/src/tests/proof/git.test.ts +0 -243
  356. package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
  357. package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
  358. package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
  359. package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
  360. package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
  361. package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
  362. package/.next/standalone/src/tests/proof/preload.ts +0 -21
  363. package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
  364. package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
  365. package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
  366. package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
  367. package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
  368. package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
  369. package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
  370. package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
  371. package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
  372. package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
  373. package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
  374. package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
  375. package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
  376. package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
  377. package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
  378. package/.next/standalone/src/types/index.ts +0 -47
  379. package/.next/standalone/tailwind.config.ts +0 -191
  380. package/.next/standalone/tsconfig.json +0 -41
  381. package/.next/standalone/tsconfig.tsbuildinfo +0 -1
  382. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_buildManifest.js +0 -0
  383. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_clientMiddlewareManifest.js +0 -0
  384. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_ssgManifest.js +0 -0
@@ -1,606 +0,0 @@
1
- "use client";
2
-
3
- import {
4
- ChevronRight,
5
- Folder,
6
- FolderOpen,
7
- GitBranch,
8
- HardDrive,
9
- Home,
10
- Key,
11
- Loader2,
12
- Pin,
13
- PinOff,
14
- X,
15
- } from "lucide-react";
16
- import { useCallback, useEffect, useRef, useState } from "react";
17
- import { Button } from "@/components/ui/button";
18
- import { cn } from "@/lib/utils";
19
-
20
- interface Entry {
21
- name: string;
22
- path: string;
23
- accessible: boolean;
24
- }
25
-
26
- interface BrowseResult {
27
- path: string;
28
- parent: string | null;
29
- entries: Entry[];
30
- shortcuts: Array<{ label: string; path: string }>;
31
- }
32
-
33
- interface Props {
34
- /** Called with the new workspace id after creation */
35
- onSelect: (workspaceId: string) => void;
36
- }
37
-
38
- export function DirPicker({ onSelect }: Props) {
39
- const [mode, setMode] = useState<"local" | "git">("local");
40
-
41
- // Local folder state
42
- const [data, setData] = useState<BrowseResult | null>(null);
43
- const [loading, setLoading] = useState(true);
44
- const [error, setError] = useState<string | null>(null);
45
- const [pathInput, setPathInput] = useState("");
46
- const [selecting, setSelecting] = useState(false);
47
- const [pins, setPins] = useState<string[]>([]);
48
- const [pinLoading, setPinLoading] = useState(false);
49
- const inputRef = useRef<HTMLInputElement>(null);
50
- const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
51
-
52
- // From Git state
53
- const [gitRemoteUrl, setGitRemoteUrl] = useState("");
54
- const [gitBranch, setGitBranch] = useState("");
55
- const [gitSubpath, setGitSubpath] = useState("");
56
- const [gitUsername, setGitUsername] = useState("");
57
- const [gitToken, setGitToken] = useState("");
58
- const [gitName, setGitName] = useState("");
59
- const [gitSubmitting, setGitSubmitting] = useState(false);
60
- const [gitError, setGitError] = useState<string | null>(null);
61
-
62
- const handleGitSubmit = async () => {
63
- const remoteUrl = gitRemoteUrl.trim();
64
- if (!remoteUrl) {
65
- setGitError("Repository URL is required.");
66
- return;
67
- }
68
- setGitSubmitting(true);
69
- setGitError(null);
70
- try {
71
- const body: Record<string, string> = { remoteUrl };
72
- if (gitBranch.trim()) body.branch = gitBranch.trim();
73
- if (gitSubpath.trim()) body.subpath = gitSubpath.trim();
74
- if (gitUsername.trim()) body.username = gitUsername.trim();
75
- if (gitToken.trim()) body.token = gitToken.trim();
76
- if (gitName.trim()) body.name = gitName.trim();
77
- const res = await fetch("/api/system/workspaces", {
78
- method: "POST",
79
- headers: { "Content-Type": "application/json" },
80
- body: JSON.stringify(body),
81
- });
82
- if (!res.ok) {
83
- const e: { error?: string; message?: string } = await res.json();
84
- setGitError(e.error ?? e.message ?? "Clone failed.");
85
- return;
86
- }
87
- const { workspace }: { workspace: { id: string } } = await res.json();
88
- // Drop the token from memory as soon as the clone succeeds.
89
- setGitToken("");
90
- onSelect(workspace.id);
91
- } catch {
92
- setGitError("Network error.");
93
- } finally {
94
- setGitSubmitting(false);
95
- }
96
- };
97
-
98
- const navigate = useCallback(async (dir: string, updateInput = true) => {
99
- if (debounceRef.current) {
100
- clearTimeout(debounceRef.current);
101
- debounceRef.current = null;
102
- }
103
- setLoading(true);
104
- setError(null);
105
- try {
106
- const res = await fetch(
107
- `/api/system/browse?path=${encodeURIComponent(dir)}`,
108
- );
109
- if (!res.ok) {
110
- const e: { error?: string } = await res.json();
111
- setError(e.error ?? "Cannot open directory");
112
- return;
113
- }
114
- const result: BrowseResult = await res.json();
115
- setData(result);
116
- if (updateInput) setPathInput(result.path);
117
- } catch {
118
- setError("Network error");
119
- } finally {
120
- setLoading(false);
121
- }
122
- }, []);
123
-
124
- // On mount: load config (last opened + pins), then navigate
125
- useEffect(() => {
126
- let cancelled = false;
127
- (async () => {
128
- try {
129
- const res = await fetch("/api/system/config");
130
- if (res.ok && !cancelled) {
131
- const cfg: { pinnedPaths: string[]; lastOpenedPath: string | null } =
132
- await res.json();
133
- setPins(cfg.pinnedPaths ?? []);
134
- await navigate(cfg.lastOpenedPath ?? "");
135
- return;
136
- }
137
- } catch {
138
- /* fallthrough to default */
139
- }
140
- if (!cancelled) await navigate("");
141
- })();
142
- return () => { cancelled = true; };
143
- // eslint-disable-next-line react-hooks/exhaustive-deps
144
- }, []);
145
-
146
- const handleSelect = async (dir?: string) => {
147
- const target = dir ?? data?.path;
148
- if (!target) return;
149
- setSelecting(true);
150
- try {
151
- const res = await fetch("/api/system/workspaces", {
152
- method: "POST",
153
- headers: { "Content-Type": "application/json" },
154
- body: JSON.stringify({ rootDir: target }),
155
- });
156
- if (!res.ok) {
157
- const e: { error?: string; message?: string } = await res.json();
158
- setError(e.message ?? e.error ?? "Cannot use that directory");
159
- return;
160
- }
161
- const { workspace }: { workspace: { id: string } } = await res.json();
162
- onSelect(workspace.id);
163
- } catch {
164
- setError("Network error");
165
- } finally {
166
- setSelecting(false);
167
- }
168
- };
169
-
170
- const handlePathKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
171
- if (e.key === "Enter") {
172
- e.preventDefault();
173
- if (debounceRef.current) {
174
- clearTimeout(debounceRef.current);
175
- debounceRef.current = null;
176
- }
177
- navigate(pathInput.trim());
178
- }
179
- if (e.key === "Escape") {
180
- if (debounceRef.current) {
181
- clearTimeout(debounceRef.current);
182
- debounceRef.current = null;
183
- }
184
- setPathInput(data?.path ?? "");
185
- inputRef.current?.blur();
186
- }
187
- };
188
-
189
- const isPinned = data ? pins.includes(data.path) : false;
190
-
191
- const togglePin = async () => {
192
- if (!data) return;
193
- setPinLoading(true);
194
- try {
195
- const action = isPinned ? "unpin" : "pin";
196
- const res = await fetch("/api/system/pins", {
197
- method: "POST",
198
- headers: { "Content-Type": "application/json" },
199
- body: JSON.stringify({ path: data.path, action }),
200
- });
201
- if (res.ok) {
202
- setPins((prev) =>
203
- action === "pin"
204
- ? [...prev, data.path]
205
- : prev.filter((p) => p !== data.path),
206
- );
207
- }
208
- } catch {
209
- /* ignore */
210
- } finally {
211
- setPinLoading(false);
212
- }
213
- };
214
-
215
- const removePin = async (p: string) => {
216
- try {
217
- const res = await fetch("/api/system/pins", {
218
- method: "POST",
219
- headers: { "Content-Type": "application/json" },
220
- body: JSON.stringify({ path: p, action: "unpin" }),
221
- });
222
- if (res.ok) setPins((prev) => prev.filter((x) => x !== p));
223
- } catch {
224
- /* ignore */
225
- }
226
- };
227
-
228
- // Build breadcrumb segments from path
229
- const breadcrumbs = (data?.path ?? "")
230
- .split(/[/\\]/)
231
- .filter(Boolean)
232
- .reduce<Array<{ label: string; path: string }>>(
233
- (acc, seg) => {
234
- const prev = acc[acc.length - 1]?.path ?? "/";
235
- acc.push({ label: seg, path: `${prev === "/" ? "" : prev}/${seg}` });
236
- return acc;
237
- },
238
- [{ label: "/", path: "/" }],
239
- );
240
-
241
- return (
242
- <div className="flex flex-1 items-center justify-center bg-background p-4">
243
- <div className="flex w-full max-w-xl flex-col gap-4">
244
- {/* Header */}
245
- <div className="text-center space-y-1">
246
- <div className="flex items-center justify-center gap-2 mb-1">
247
- <img src="/logo.svg" alt="Wiki Viewer" className="h-8 w-8" />
248
- <span className="text-xl font-semibold tracking-tight">Wiki Viewer</span>
249
- </div>
250
- <h1 className="text-xl font-medium">
251
- {mode === "git" ? "Add a Git repository" : "Choose a directory"}
252
- </h1>
253
- <p className="text-sm text-muted-foreground">
254
- {mode === "git" ? (
255
- <>
256
- Clone a remote repo and serve it as a read-only workspace.
257
- <br />
258
- The server clones it, so the URL must be reachable from the server.
259
- </>
260
- ) : (
261
- <>
262
- Select the folder wiki-viewer should serve.
263
- <br />
264
- This directory lives on the server, so use the browser below.
265
- </>
266
- )}
267
- </p>
268
- </div>
269
-
270
- {/* Mode toggle */}
271
- <div className="flex items-center self-center rounded-lg border bg-muted p-0.5 gap-0.5">
272
- <Button
273
- variant={mode === "local" ? "default" : "ghost"}
274
- size="sm"
275
- className="h-7 px-3 text-xs gap-1.5"
276
- onClick={() => { setMode("local"); setGitToken(""); setGitError(null); }}
277
- >
278
- <Folder className="h-3.5 w-3.5" />
279
- Local folder
280
- </Button>
281
- <Button
282
- variant={mode === "git" ? "default" : "ghost"}
283
- size="sm"
284
- className="h-7 px-3 text-xs gap-1.5"
285
- onClick={() => setMode("git")}
286
- >
287
- <GitBranch className="h-3.5 w-3.5" />
288
- From Git
289
- </Button>
290
- </div>
291
-
292
- {/* From Git form */}
293
- {mode === "git" && (
294
- <div className="rounded-lg border bg-card shadow-sm overflow-hidden">
295
- <div className="px-4 pt-4 pb-3 flex flex-col gap-3">
296
- {/* Remote URL */}
297
- <div className="flex flex-col gap-1">
298
- <label className="text-xs font-medium">Repository URL</label>
299
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
300
- <input
301
- className="flex-1 bg-transparent text-sm outline-none font-mono min-w-0"
302
- placeholder="https://github.com/org/repo.git"
303
- value={gitRemoteUrl}
304
- onChange={(e) => { setGitRemoteUrl(e.target.value); setGitError(null); }}
305
- disabled={gitSubmitting}
306
- autoComplete="off"
307
- spellCheck={false}
308
- />
309
- </div>
310
- <p className="text-[11px] text-muted-foreground">Only https:// URLs are supported.</p>
311
- </div>
312
-
313
- {/* Branch */}
314
- <div className="flex flex-col gap-1">
315
- <label className="text-xs font-medium">Branch <span className="font-normal text-muted-foreground">(optional)</span></label>
316
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
317
- <input
318
- className="flex-1 bg-transparent text-sm outline-none min-w-0"
319
- placeholder="main (default branch if empty)"
320
- value={gitBranch}
321
- onChange={(e) => { setGitBranch(e.target.value); setGitError(null); }}
322
- disabled={gitSubmitting}
323
- />
324
- </div>
325
- </div>
326
-
327
- {/* Subpath */}
328
- <div className="flex flex-col gap-1">
329
- <label className="text-xs font-medium">Subdirectory <span className="font-normal text-muted-foreground">(optional)</span></label>
330
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
331
- <input
332
- className="flex-1 bg-transparent text-sm outline-none font-mono min-w-0"
333
- placeholder="docs (whole repo if empty)"
334
- value={gitSubpath}
335
- onChange={(e) => { setGitSubpath(e.target.value); setGitError(null); }}
336
- disabled={gitSubmitting}
337
- spellCheck={false}
338
- />
339
- </div>
340
- <p className="text-[11px] text-muted-foreground">Serve only this folder from the repo. Faster to clone for large repos with docs in a subfolder.</p>
341
- </div>
342
-
343
- {/* Username */}
344
- <div className="flex flex-col gap-1">
345
- <label className="text-xs font-medium">Username <span className="font-normal text-muted-foreground">(optional)</span></label>
346
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
347
- <input
348
- className="flex-1 bg-transparent text-sm outline-none min-w-0"
349
- placeholder="x-access-token (default)"
350
- value={gitUsername}
351
- onChange={(e) => { setGitUsername(e.target.value); setGitError(null); }}
352
- disabled={gitSubmitting}
353
- autoComplete="off"
354
- />
355
- </div>
356
- <p className="text-[11px] text-muted-foreground">GitLab uses <code className="font-mono">oauth2</code>; Bitbucket uses your account username.</p>
357
- </div>
358
-
359
- {/* Token */}
360
- <div className="flex flex-col gap-1">
361
- <label className="text-xs font-medium">Access token <span className="font-normal text-muted-foreground">(optional)</span></label>
362
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
363
- <Key className="h-3.5 w-3.5 shrink-0 text-muted-foreground" />
364
- <input
365
- type="password"
366
- className="flex-1 bg-transparent text-sm outline-none min-w-0"
367
- placeholder="Personal access token"
368
- value={gitToken}
369
- onChange={(e) => { setGitToken(e.target.value); setGitError(null); }}
370
- disabled={gitSubmitting}
371
- autoComplete="off"
372
- />
373
- </div>
374
- <p className="text-[11px] text-muted-foreground">Required only for private repos. Stored securely on the server and never shown again.</p>
375
- </div>
376
-
377
- {/* Display name */}
378
- <div className="flex flex-col gap-1">
379
- <label className="text-xs font-medium">Display name <span className="font-normal text-muted-foreground">(optional)</span></label>
380
- <div className="flex items-center gap-2 rounded-md border bg-muted px-3 py-2">
381
- <input
382
- className="flex-1 bg-transparent text-sm outline-none min-w-0"
383
- placeholder="Defaults to the repository name"
384
- value={gitName}
385
- onChange={(e) => { setGitName(e.target.value); setGitError(null); }}
386
- disabled={gitSubmitting}
387
- />
388
- </div>
389
- </div>
390
-
391
- {/* Error */}
392
- {gitError && (
393
- <p className="text-sm text-destructive">{gitError}</p>
394
- )}
395
- </div>
396
-
397
- {/* Footer */}
398
- <div className="border-t px-4 py-3 flex items-center justify-between gap-3 bg-muted">
399
- <p className="text-[11px] text-muted-foreground">
400
- Git workspaces are read-only, so editing is disabled.
401
- </p>
402
- <Button
403
- size="sm"
404
- className="shrink-0 gap-1.5"
405
- disabled={gitSubmitting}
406
- onClick={handleGitSubmit}
407
- >
408
- {gitSubmitting ? (
409
- <><Loader2 className="h-3.5 w-3.5 animate-spin" /> Cloning...</>
410
- ) : (
411
- <><GitBranch className="h-3.5 w-3.5" /> Clone and add</>
412
- )}
413
- </Button>
414
- </div>
415
- </div>
416
- )}
417
-
418
- {/* Main browser card */}
419
- {mode === "local" && <div className="rounded-lg border bg-card shadow-sm overflow-hidden">
420
- {/* Path input bar — always visible, reactive with browser */}
421
- <div className="flex items-center gap-2 border-b px-3 py-2 bg-muted">
422
- <input
423
- ref={inputRef}
424
- className="flex-1 bg-transparent text-sm outline-none font-mono min-w-0"
425
- value={pathInput}
426
- onChange={(e) => {
427
- const val = e.target.value;
428
- setPathInput(val);
429
- if (debounceRef.current) clearTimeout(debounceRef.current);
430
- debounceRef.current = setTimeout(() => {
431
- debounceRef.current = null;
432
- navigate(val.trim(), false);
433
- }, 500);
434
- }}
435
- onKeyDown={handlePathKeyDown}
436
- spellCheck={false}
437
- placeholder="Enter a path…"
438
- />
439
-
440
- </div>
441
-
442
- {/* Breadcrumb bar (click to navigate) */}
443
- <div className="flex items-center gap-1 border-b px-3 py-1.5 bg-muted/50 overflow-x-auto shrink-0 min-h-[32px]">
444
- {breadcrumbs.map((seg, i) => (
445
- <span key={seg.path} className="flex items-center gap-1 shrink-0">
446
- {i > 0 && (
447
- <ChevronRight className="h-3 w-3 text-muted-foreground/50" />
448
- )}
449
- <button
450
- type="button"
451
- className="text-xs hover:text-foreground text-muted-foreground transition-colors rounded px-0.5"
452
- onClick={() => navigate(seg.path)}
453
- >
454
- {i === 0 ? (
455
- <HardDrive className="h-3.5 w-3.5" />
456
- ) : (
457
- seg.label
458
- )}
459
- </button>
460
- </span>
461
- ))}
462
- </div>
463
-
464
- {/* Directory list */}
465
- <div className="max-h-60 overflow-y-auto">
466
- {loading ? (
467
- <div className="flex justify-center py-8">
468
- <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" />
469
- </div>
470
- ) : error ? (
471
- <div className="px-4 py-3 text-sm text-destructive">{error}</div>
472
- ) : (
473
- <>
474
- {/* Parent directory */}
475
- {data?.parent && (
476
- <button
477
- type="button"
478
- className="flex w-full items-center gap-2.5 px-3 py-2 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-colors"
479
- onClick={() => navigate(data.parent!)}
480
- >
481
- <Folder className="h-4 w-4 shrink-0" />
482
- <span className="font-mono text-xs">..</span>
483
- </button>
484
- )}
485
-
486
- {data?.entries.length === 0 && (
487
- <p className="px-4 py-3 text-sm text-muted-foreground/60">
488
- No subdirectories
489
- </p>
490
- )}
491
-
492
- {data?.entries.map((entry) => (
493
- <button
494
- type="button"
495
- key={entry.path}
496
- className="flex w-full items-center gap-2.5 px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground transition-colors"
497
- onClick={() => navigate(entry.path)}
498
- >
499
- <Folder className="h-4 w-4 shrink-0 text-warning" />
500
- <span className="truncate">{entry.name}</span>
501
- </button>
502
- ))}
503
- </>
504
- )}
505
- </div>
506
-
507
- {/* Select footer */}
508
- <div className="border-t px-3 py-2 flex items-center justify-between gap-2 bg-muted">
509
- <button
510
- type="button"
511
- className={cn(
512
- "flex items-center gap-1.5 text-xs transition-colors rounded px-1.5 py-1",
513
- isPinned
514
- ? "text-foreground hover:text-destructive"
515
- : "text-muted-foreground hover:text-foreground",
516
- )}
517
- title={isPinned ? "Unpin this path" : "Pin this path for quick access"}
518
- onClick={togglePin}
519
- disabled={pinLoading || !data}
520
- >
521
- {pinLoading ? (
522
- <Loader2 className="h-3.5 w-3.5 animate-spin" />
523
- ) : isPinned ? (
524
- <PinOff className="h-3.5 w-3.5" />
525
- ) : (
526
- <Pin className="h-3.5 w-3.5" />
527
- )}
528
- {isPinned ? "Unpin" : "Pin"}
529
- </button>
530
- <Button
531
- size="sm"
532
- className="shrink-0 gap-1.5"
533
- disabled={!data || selecting}
534
- onClick={() => handleSelect()}
535
- >
536
- {selecting ? (
537
- <Loader2 className="h-3.5 w-3.5 animate-spin" />
538
- ) : (
539
- <FolderOpen className="h-3.5 w-3.5" />
540
- )}
541
- Select
542
- </Button>
543
- </div>
544
- </div>}
545
-
546
- {/* Pinned paths */}
547
- {mode === "local" && pins.length > 0 && (
548
- <div className="rounded-lg border bg-card shadow-sm overflow-hidden">
549
- <div className="px-3 py-2 border-b bg-muted">
550
- <span className="text-xs font-medium text-muted-foreground flex items-center gap-1.5">
551
- <Pin className="h-3 w-3" /> Pinned
552
- </span>
553
- </div>
554
- <div className="max-h-40 overflow-y-auto">
555
- {pins.map((p) => (
556
- <div
557
- key={p}
558
- className="flex items-center gap-2 px-3 py-1.5 hover:bg-accent group"
559
- >
560
- <button
561
- type="button"
562
- className="flex-1 flex items-center gap-2 text-sm text-left min-w-0"
563
- onClick={() => navigate(p)}
564
- >
565
- <Folder className="h-4 w-4 shrink-0 text-warning" />
566
- <span className="truncate font-mono text-xs">{p}</span>
567
- </button>
568
- <button
569
- type="button"
570
- className="shrink-0 text-muted-foreground/50 hover:text-destructive opacity-0 group-hover:opacity-100 transition-all"
571
- onClick={() => removePin(p)}
572
- title="Remove pin"
573
- >
574
- <X className="h-3.5 w-3.5" />
575
- </button>
576
- </div>
577
- ))}
578
- </div>
579
- </div>
580
- )}
581
-
582
- {/* Shortcuts */}
583
- {mode === "local" && data?.shortcuts && data.shortcuts.length > 0 && (
584
- <div className="flex flex-wrap gap-1.5 justify-center">
585
- {data.shortcuts.map((s) => (
586
- <Button
587
- key={s.path}
588
- variant="outline"
589
- size="sm"
590
- className="h-7 gap-1.5 text-xs"
591
- onClick={() => navigate(s.path)}
592
- >
593
- {s.label === "Home" ? (
594
- <Home className="h-3 w-3" />
595
- ) : (
596
- <HardDrive className="h-3 w-3" />
597
- )}
598
- {s.label}
599
- </Button>
600
- ))}
601
- </div>
602
- )}
603
- </div>
604
- </div>
605
- );
606
- }