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,82 +0,0 @@
1
- import { readdir, stat } from "node:fs/promises";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { NextResponse } from "next/server";
5
- import { requireUser } from "@/lib/auth/server";
6
-
7
- interface BrowseEntry {
8
- name: string;
9
- path: string;
10
- accessible: boolean;
11
- }
12
-
13
- export async function GET(request: Request) {
14
- const auth = await requireUser(request);
15
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
16
-
17
- const { searchParams } = new URL(request.url);
18
- const rawPath = searchParams.get("path");
19
-
20
- // Default to home dir
21
- const target = rawPath ? path.resolve(rawPath) : os.homedir();
22
-
23
- // Verify it's a directory
24
- try {
25
- const info = await stat(target);
26
- if (!info.isDirectory()) {
27
- return NextResponse.json({ error: "Not a directory" }, { status: 400 });
28
- }
29
- } catch {
30
- return NextResponse.json({ error: "Path not found" }, { status: 404 });
31
- }
32
-
33
- // List entries — only directories
34
- let entries: BrowseEntry[] = [];
35
- try {
36
- const names = await readdir(target);
37
- const infos = await Promise.allSettled(
38
- names.map(async (name) => {
39
- const full = path.join(target, name);
40
- const info = await stat(full);
41
- return { name, full, isDir: info.isDirectory() };
42
- }),
43
- );
44
- entries = infos
45
- .filter(
46
- (r): r is PromiseFulfilledResult<{ name: string; full: string; isDir: boolean }> =>
47
- r.status === "fulfilled" && r.value.isDir,
48
- )
49
- .map((r) => ({ name: r.value.name, path: r.value.full, accessible: true }))
50
- .sort((a, b) => a.name.localeCompare(b.name));
51
- } catch {
52
- // Permission denied or similar — return empty list but still allow selection
53
- }
54
-
55
- // Parent path (null at filesystem root)
56
- const parent = target === path.parse(target).root ? null : path.dirname(target);
57
-
58
- // Quick-access shortcuts
59
- const home = os.homedir();
60
- const shortcuts = [
61
- { label: "Home", path: home },
62
- { label: "Root", path: "/" },
63
- ];
64
- // Add common paths that exist
65
- for (const [label, p] of [
66
- ["Desktop", path.join(home, "Desktop")],
67
- ["Documents", path.join(home, "Documents")],
68
- ["Downloads", path.join(home, "Downloads")],
69
- ] as [string, string][]) {
70
- try {
71
- await stat(p);
72
- shortcuts.push({ label, path: p });
73
- } catch {}
74
- }
75
-
76
- return NextResponse.json({
77
- path: target,
78
- parent,
79
- entries,
80
- shortcuts,
81
- });
82
- }
@@ -1,16 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { checkOrigin } from "@/lib/auth/csrf";
3
- import { requireUser } from "@/lib/auth/server";
4
- import { writeConfig } from "@/lib/config";
5
- import { clearRootDir } from "@/lib/root-dir";
6
-
7
- export async function POST(request: Request) {
8
- const csrf = checkOrigin(request);
9
- if (csrf) return csrf;
10
- const auth = await requireUser(request);
11
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
12
-
13
- clearRootDir();
14
- await writeConfig({ lastOpenedPath: undefined });
15
- return NextResponse.json({ ok: true });
16
- }
@@ -1,14 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { requireUser } from "@/lib/auth/server";
3
- import { readConfig } from "@/lib/config";
4
-
5
- export async function GET(request: Request) {
6
- const auth = await requireUser(request);
7
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
8
-
9
- const config = await readConfig();
10
- return NextResponse.json({
11
- pinnedPaths: config.pinnedPaths ?? [],
12
- lastOpenedPath: config.lastOpenedPath ?? null,
13
- });
14
- }
@@ -1,38 +0,0 @@
1
- import { stat } from "node:fs/promises";
2
- import { NextResponse } from "next/server";
3
- import { checkOrigin } from "@/lib/auth/csrf";
4
- import { requireUser } from "@/lib/auth/server";
5
- import { readConfig, writeConfig } from "@/lib/config";
6
-
7
- export async function POST(request: Request) {
8
- const csrf = checkOrigin(request);
9
- if (csrf) return csrf;
10
- const auth = await requireUser(request);
11
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
12
-
13
- const body: { path?: string; action?: "pin" | "unpin" } = await request.json();
14
- const p = body.path?.trim();
15
- const action = body.action ?? "pin";
16
- if (!p) return NextResponse.json({ error: "Missing path" }, { status: 400 });
17
-
18
- if (action === "pin") {
19
- try {
20
- const info = await stat(p);
21
- if (!info.isDirectory())
22
- return NextResponse.json({ error: "Not a directory" }, { status: 400 });
23
- } catch {
24
- return NextResponse.json({ error: "Path not found" }, { status: 404 });
25
- }
26
- const config = await readConfig();
27
- const pins = config.pinnedPaths ?? [];
28
- if (!pins.includes(p)) {
29
- await writeConfig({ pinnedPaths: [...pins, p] });
30
- }
31
- } else {
32
- const config = await readConfig();
33
- const pins = (config.pinnedPaths ?? []).filter((x) => x !== p);
34
- await writeConfig({ pinnedPaths: pins });
35
- }
36
-
37
- return NextResponse.json({ ok: true });
38
- }
@@ -1,36 +0,0 @@
1
- import { exec } from "node:child_process";
2
- import path from "node:path";
3
- import { NextResponse } from "next/server";
4
- import { checkOrigin } from "@/lib/auth/csrf";
5
- import { resolveWorkspaceForUser } from "@/lib/workspace-context";
6
- import { safeWorkspacePath } from "@/lib/workspaces";
7
-
8
- export async function POST(request: Request) {
9
- const csrf = checkOrigin(request);
10
- if (csrf) return csrf;
11
- const ctx = await resolveWorkspaceForUser(request);
12
- if (!ctx.ok) return NextResponse.json({ error: ctx.code }, { status: ctx.status });
13
- const { rootDir } = ctx;
14
-
15
- const body: { path?: string } = await request.json();
16
- const rel = body.path;
17
- if (!rel || typeof rel !== "string")
18
- return NextResponse.json({ error: "Invalid path" }, { status: 400 });
19
-
20
- // Path traversal guard
21
- const resolved = safeWorkspacePath(rootDir, rel);
22
- if (!resolved)
23
- return NextResponse.json({ error: "Invalid path" }, { status: 400 });
24
-
25
- // Open in system file manager
26
- const platform = process.platform;
27
- const cmd =
28
- platform === "darwin"
29
- ? `open -R "${resolved}"`
30
- : platform === "win32"
31
- ? `explorer /select,"${resolved}"`
32
- : `xdg-open "${path.dirname(resolved)}"`;
33
-
34
- exec(cmd, () => {});
35
- return NextResponse.json({ ok: true });
36
- }
@@ -1,13 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { requireUser } from "@/lib/auth/server";
3
- import { getRootDir, isRootDirSet } from "@/lib/root-dir";
4
-
5
- export async function GET(request: Request) {
6
- const auth = await requireUser(request);
7
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
8
-
9
- return NextResponse.json({
10
- configured: isRootDirSet(),
11
- path: isRootDirSet() ? getRootDir() : null,
12
- });
13
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * Legacy set-root endpoint — back-compat shim for D1.
3
- *
4
- * Behaviour:
5
- * 1. Validate dir (same as before).
6
- * 2. Create (or find) a workspace for rootDir in the registry.
7
- * 3. Keep setting the process-global rootDir + writing lastOpenedPath to config
8
- * so the legacy fallback path still works for the existing client.
9
- * 4. Return { ok, path, workspaceId } — added workspaceId for D2 migration.
10
- *
11
- * NOTE: NOT admin-gated here so the current single-user flow is unaffected.
12
- * The new POST /api/system/workspaces route is admin-gated; D2 will switch the
13
- * UI to use that endpoint.
14
- */
15
- import { stat } from "node:fs/promises";
16
- import { NextResponse } from "next/server";
17
- import { checkOrigin } from "@/lib/auth/csrf";
18
- import { requireUser } from "@/lib/auth/server";
19
- import { writeConfig } from "@/lib/config";
20
- import { setRootDir } from "@/lib/root-dir";
21
- import { listWorkspaces, createWorkspace } from "@/lib/workspaces";
22
- import path from "node:path";
23
-
24
- export async function POST(request: Request) {
25
- const csrf = checkOrigin(request);
26
- if (csrf) return csrf;
27
- const auth = await requireUser(request);
28
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
29
-
30
- const body: { path?: string } = await request.json();
31
- const dir = body.path?.trim();
32
- if (!dir) return NextResponse.json({ error: "Missing path" }, { status: 400 });
33
-
34
- // Verify it exists and is a directory
35
- try {
36
- const info = await stat(dir);
37
- if (!info.isDirectory())
38
- return NextResponse.json({ error: "Not a directory" }, { status: 400 });
39
- } catch {
40
- return NextResponse.json({ error: "Directory not found" }, { status: 404 });
41
- }
42
-
43
- // Legacy: keep the global + config in sync for the fallback resolver.
44
- setRootDir(dir);
45
- await writeConfig({ lastOpenedPath: dir });
46
-
47
- // Find or create a workspace for this rootDir so the registry is populated.
48
- const resolved = path.resolve(dir);
49
- const existing = (await listWorkspaces()).find((w) => w.rootDir === resolved);
50
- const ws = existing ?? (await createWorkspace({ rootDir: dir, createdBy: auth.user.id }));
51
-
52
- return NextResponse.json({ ok: true, path: dir, workspaceId: ws.id });
53
- }
@@ -1,120 +0,0 @@
1
- /**
2
- * POST /api/system/users (admin only)
3
- *
4
- * Admin creates a new account with a generated temporary password, returned
5
- * once in the response. The new user signs in and changes it. The signup
6
- * allowlist is bypassed for admin-initiated creation (the admin is the gate).
7
- *
8
- * This calls auth.api.signUpEmail server-side; the session it would mint for
9
- * the new user is discarded (we never forward those Set-Cookie headers), so
10
- * the admin's own session is untouched.
11
- */
12
- export const runtime = "nodejs";
13
-
14
- import { NextResponse } from "next/server";
15
- import { randomBytes } from "node:crypto";
16
- import { checkOrigin } from "@/lib/auth/csrf";
17
- import { requireAdmin } from "@/lib/auth/admin";
18
- import { auth, authReady, withAdminUserCreate, passwordAuthEnabled, db } from "@/lib/auth/server";
19
-
20
- const EMAIL_RE = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
21
-
22
- /** Readable temp password: 4 groups, mixed case + digits, no ambiguous chars. */
23
- function generateTempPassword(): string {
24
- const alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789";
25
- const bytes = randomBytes(16);
26
- let out = "";
27
- for (let i = 0; i < 16; i++) {
28
- out += alphabet[bytes[i] % alphabet.length];
29
- if (i % 4 === 3 && i < 15) out += "-";
30
- }
31
- return out; // e.g. "k7Pm-9QrT-x2Vn-bL4w"
32
- }
33
-
34
- export async function POST(req: Request): Promise<NextResponse> {
35
- const csrf = checkOrigin(req);
36
- if (csrf) return csrf;
37
-
38
- const admin = await requireAdmin(req);
39
- if (!admin.ok) {
40
- return NextResponse.json({ error: admin.code }, { status: admin.status });
41
- }
42
-
43
- if (!passwordAuthEnabled) {
44
- return NextResponse.json(
45
- { error: "PASSWORD_AUTH_DISABLED", message: "Email/password sign-in is disabled; cannot create password accounts." },
46
- { status: 400 },
47
- );
48
- }
49
-
50
- let body: { email?: unknown; name?: unknown };
51
- try {
52
- body = (await req.json()) as { email?: unknown; name?: unknown };
53
- } catch {
54
- return NextResponse.json({ error: "INVALID_PAYLOAD", message: "Invalid JSON" }, { status: 400 });
55
- }
56
-
57
- const email = typeof body.email === "string" ? body.email.trim().toLowerCase() : "";
58
- const name = typeof body.name === "string" && body.name.trim() ? body.name.trim() : email.split("@")[0];
59
-
60
- if (!EMAIL_RE.test(email)) {
61
- return NextResponse.json({ error: "INVALID_EMAIL", message: "A valid email is required" }, { status: 400 });
62
- }
63
-
64
- const tempPassword = generateTempPassword();
65
-
66
- await authReady();
67
- // Reject duplicates up front (signUpEmail may otherwise create a second
68
- // credential row or silently succeed depending on Better Auth internals).
69
- try {
70
- const existing = db
71
- .prepare("SELECT 1 FROM user WHERE lower(email) = ? LIMIT 1")
72
- .get(email);
73
- if (existing) {
74
- return NextResponse.json(
75
- { error: "USER_EXISTS", message: "A user with that email already exists." },
76
- { status: 409 },
77
- );
78
- }
79
- } catch {
80
- // If the lookup fails, fall through and let signUpEmail decide.
81
- }
82
-
83
- try {
84
- // Bypass the signup allowlist for this admin-initiated creation. The
85
- // returned response (and any session cookie) is intentionally discarded.
86
- const result = await withAdminUserCreate(() =>
87
- auth.api.signUpEmail({
88
- body: { email, password: tempPassword, name },
89
- asResponse: true,
90
- }),
91
- );
92
- if (!result.ok) {
93
- const text = await result.text().catch(() => "");
94
- if (/exist|unique|already/i.test(text)) {
95
- return NextResponse.json(
96
- { error: "USER_EXISTS", message: "A user with that email already exists." },
97
- { status: 409 },
98
- );
99
- }
100
- return NextResponse.json(
101
- { error: "CREATE_FAILED", message: text || "Failed to create user" },
102
- { status: 500 },
103
- );
104
- }
105
- } catch (e) {
106
- const msg = e instanceof Error ? e.message : "";
107
- if (/exist|unique|already/i.test(msg)) {
108
- return NextResponse.json(
109
- { error: "USER_EXISTS", message: "A user with that email already exists." },
110
- { status: 409 },
111
- );
112
- }
113
- return NextResponse.json(
114
- { error: "CREATE_FAILED", message: msg || "Failed to create user" },
115
- { status: 500 },
116
- );
117
- }
118
-
119
- return NextResponse.json({ ok: true, email, name, tempPassword });
120
- }
@@ -1,34 +0,0 @@
1
- /**
2
- * POST /api/system/workspaces/[id]/open
3
- *
4
- * Client calls this when switching to a workspace. Records lastOpenedAt so
5
- * the most-recently-used workspace can be selected on next load.
6
- */
7
- import { NextResponse } from "next/server";
8
- import { checkOrigin } from "@/lib/auth/csrf";
9
- import { requireUser } from "@/lib/auth/server";
10
- import { isAdmin } from "@/lib/auth/admin";
11
- import { getWorkspace, touchWorkspace, userCanAccess } from "@/lib/workspaces";
12
-
13
- export const runtime = "nodejs";
14
-
15
- type Params = { params: Promise<{ id: string }> };
16
-
17
- export async function POST(request: Request, { params }: Params) {
18
- const csrf = checkOrigin(request);
19
- if (csrf) return csrf;
20
-
21
- const auth = await requireUser(request);
22
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
23
-
24
- const { id } = await params;
25
- const ws = await getWorkspace(id);
26
- if (!ws) return NextResponse.json({ error: "WORKSPACE_NOT_FOUND" }, { status: 404 });
27
-
28
- const admin = await isAdmin(auth.user.id, auth.user.email);
29
- if (!userCanAccess(ws, auth.user.id, admin))
30
- return NextResponse.json({ error: "WORKSPACE_FORBIDDEN" }, { status: 403 });
31
-
32
- await touchWorkspace(id);
33
- return NextResponse.json({ ok: true });
34
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * POST /api/system/workspaces/[id]/refresh
3
- *
4
- * Admin-only: pull the latest commit for a git-backed workspace (ff-only).
5
- * Returns the new HEAD sha and pull time. Never returns any token.
6
- */
7
- import { NextResponse } from "next/server";
8
- import { checkOrigin } from "@/lib/auth/csrf";
9
- import { requireAdmin } from "@/lib/auth/admin";
10
- import { refreshGitWorkspace } from "@/lib/workspaces";
11
-
12
- export const runtime = "nodejs";
13
-
14
- type Params = { params: Promise<{ id: string }> };
15
-
16
- export async function POST(request: Request, { params }: Params) {
17
- const csrf = checkOrigin(request);
18
- if (csrf) return csrf;
19
-
20
- const authResult = await requireAdmin(request);
21
- if (!authResult.ok)
22
- return NextResponse.json({ error: authResult.code }, { status: authResult.status });
23
-
24
- const { id } = await params;
25
- try {
26
- const result = await refreshGitWorkspace(id);
27
- return NextResponse.json({ ok: true, ...result });
28
- } catch (err) {
29
- const msg = err instanceof Error ? err.message : String(err);
30
- return NextResponse.json({ error: msg }, { status: 400 });
31
- }
32
- }
@@ -1,78 +0,0 @@
1
- /**
2
- * Per-workspace management API.
3
- *
4
- * PATCH /api/system/workspaces/[id] — update name, pinnedPaths (any user with
5
- * access), or allowedUserIds (admin-only).
6
- * DELETE /api/system/workspaces/[id] — admin-only: remove workspace from registry
7
- * (never touches the filesystem directory).
8
- */
9
- import { NextResponse } from "next/server";
10
- import { checkOrigin } from "@/lib/auth/csrf";
11
- import { requireUser } from "@/lib/auth/server";
12
- import { isAdmin, requireAdmin } from "@/lib/auth/admin";
13
- import {
14
- getWorkspace,
15
- renameWorkspace,
16
- removeWorkspace,
17
- setWorkspaceAccess,
18
- setWorkspacePins,
19
- userCanAccess,
20
- sanitizeWorkspace,
21
- } from "@/lib/workspaces";
22
-
23
- export const runtime = "nodejs";
24
-
25
- type Params = { params: Promise<{ id: string }> };
26
-
27
- export async function PATCH(request: Request, { params }: Params) {
28
- const csrf = checkOrigin(request);
29
- if (csrf) return csrf;
30
-
31
- const auth = await requireUser(request);
32
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
33
-
34
- const { id } = await params;
35
- const ws = await getWorkspace(id);
36
- if (!ws) return NextResponse.json({ error: "WORKSPACE_NOT_FOUND" }, { status: 404 });
37
-
38
- const admin = await isAdmin(auth.user.id, auth.user.email);
39
- if (!userCanAccess(ws, auth.user.id, admin))
40
- return NextResponse.json({ error: "WORKSPACE_FORBIDDEN" }, { status: 403 });
41
-
42
- const body: {
43
- name?: string;
44
- pinnedPaths?: string[];
45
- allowedUserIds?: string[];
46
- } = await request.json();
47
-
48
- // allowedUserIds is admin-only
49
- if (body.allowedUserIds !== undefined && !admin)
50
- return NextResponse.json({ error: "ADMIN_REQUIRED" }, { status: 403 });
51
-
52
- // Apply each field
53
- if (body.name !== undefined) await renameWorkspace(id, body.name.trim());
54
- if (body.pinnedPaths !== undefined) await setWorkspacePins(id, body.pinnedPaths);
55
- if (body.allowedUserIds !== undefined) await setWorkspaceAccess(id, body.allowedUserIds);
56
-
57
- const updated = await getWorkspace(id);
58
- return NextResponse.json({
59
- ok: true,
60
- workspace: updated ? sanitizeWorkspace(updated) : updated,
61
- });
62
- }
63
-
64
- export async function DELETE(request: Request, { params }: Params) {
65
- const csrf = checkOrigin(request);
66
- if (csrf) return csrf;
67
-
68
- const authResult = await requireAdmin(request);
69
- if (!authResult.ok)
70
- return NextResponse.json({ error: authResult.code }, { status: authResult.status });
71
-
72
- const { id } = await params;
73
- const ws = await getWorkspace(id);
74
- if (!ws) return NextResponse.json({ error: "WORKSPACE_NOT_FOUND" }, { status: 404 });
75
-
76
- await removeWorkspace(id);
77
- return NextResponse.json({ ok: true });
78
- }
@@ -1,128 +0,0 @@
1
- /**
2
- * Workspace management API — list and create.
3
- *
4
- * GET /api/system/workspaces — any signed-in user; returns workspaces the
5
- * caller can access + isAdmin flag.
6
- * POST { rootDir, name? } — admin-only: create a new workspace.
7
- *
8
- * Bootstrap: first authenticated request triggers ensureBootstrapAdmin.
9
- */
10
- import { stat } from "node:fs/promises";
11
- import { NextResponse } from "next/server";
12
- import { checkOrigin } from "@/lib/auth/csrf";
13
- import { requireUser } from "@/lib/auth/server";
14
- import { isAdmin, requireAdmin, ensureBootstrapAdmin } from "@/lib/auth/admin";
15
- import { readConfig } from "@/lib/config";
16
- import {
17
- listWorkspaces,
18
- createWorkspace,
19
- createGitWorkspace,
20
- migrateConfigToWorkspaces,
21
- userCanAccess,
22
- sanitizeWorkspace,
23
- } from "@/lib/workspaces";
24
-
25
- export const runtime = "nodejs";
26
-
27
- export async function GET(request: Request) {
28
- // --no-auth bypass: single-user local mode has no session. Treat the local
29
- // user as admin so workspace management (add/delete) is available, matching
30
- // requireAdmin and resolveWorkspaceForUser.
31
- if (process.env.WIKI_NO_AUTH === "1") {
32
- await migrateConfigToWorkspaces();
33
- const workspaces = (await listWorkspaces()).map(sanitizeWorkspace);
34
- return NextResponse.json({ workspaces, isAdmin: true });
35
- }
36
-
37
- const auth = await requireUser(request);
38
- if (!auth.ok) return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
39
-
40
- // Bootstrap: first authenticated user becomes admin if no admin set yet.
41
- await ensureBootstrapAdmin(auth.user.id);
42
- await migrateConfigToWorkspaces();
43
-
44
- const admin = await isAdmin(auth.user.id, auth.user.email);
45
- const all = await listWorkspaces();
46
- const workspaces = all
47
- .filter((ws) => userCanAccess(ws, auth.user.id, admin))
48
- .map(sanitizeWorkspace);
49
-
50
- return NextResponse.json({ workspaces, isAdmin: admin });
51
- }
52
-
53
- export async function POST(request: Request) {
54
- const csrf = checkOrigin(request);
55
- if (csrf) return csrf;
56
-
57
- const authResult = await requireAdmin(request);
58
- if (!authResult.ok)
59
- return NextResponse.json({ error: authResult.code }, { status: authResult.status });
60
-
61
- const body: {
62
- rootDir?: string;
63
- name?: string;
64
- remoteUrl?: string;
65
- branch?: string;
66
- token?: string;
67
- username?: string;
68
- subpath?: string;
69
- } = await request.json();
70
-
71
- // Git-backed workspace path
72
- if (body.remoteUrl) {
73
- // Fast subpath validation before hitting git.
74
- if (body.subpath !== undefined && typeof body.subpath !== "string") {
75
- return NextResponse.json({ error: "Invalid subpath" }, { status: 400 });
76
- }
77
- const rawSubpath = body.subpath?.trim() || undefined;
78
- if (rawSubpath) {
79
- if (
80
- rawSubpath.startsWith("/") ||
81
- rawSubpath.includes("..") ||
82
- /[;|&$`<>(){}\n\0]/.test(rawSubpath)
83
- ) {
84
- return NextResponse.json({ error: "Invalid subpath" }, { status: 400 });
85
- }
86
- }
87
- const cfg = await readConfig();
88
- try {
89
- const workspace = await createGitWorkspace({
90
- remoteUrl: body.remoteUrl,
91
- branch: body.branch?.trim() || undefined,
92
- token: body.token || undefined,
93
- username: body.username?.trim() || undefined,
94
- name: body.name?.trim() || undefined,
95
- createdBy: authResult.user.id,
96
- allowedHosts: cfg.git?.allowedHosts,
97
- allowInsecureHttp: cfg.git?.allowInsecureHttp,
98
- subpath: rawSubpath,
99
- });
100
- // Never echo token in response; sanitizeWorkspace strips tokenRef.
101
- return NextResponse.json({ ok: true, workspace: sanitizeWorkspace(workspace) });
102
- } catch (err) {
103
- const msg = err instanceof Error ? err.message : String(err);
104
- return NextResponse.json({ error: msg }, { status: 400 });
105
- }
106
- }
107
-
108
- // Plain local workspace path
109
- const rootDir = body.rootDir?.trim();
110
- if (!rootDir) return NextResponse.json({ error: "Missing rootDir" }, { status: 400 });
111
-
112
- // Validate directory
113
- try {
114
- const info = await stat(rootDir);
115
- if (!info.isDirectory())
116
- return NextResponse.json({ error: "Not a directory" }, { status: 400 });
117
- } catch {
118
- return NextResponse.json({ error: "Directory not found" }, { status: 404 });
119
- }
120
-
121
- const workspace = await createWorkspace({
122
- rootDir,
123
- name: body.name?.trim() || undefined,
124
- createdBy: authResult.user.id,
125
- });
126
-
127
- return NextResponse.json({ ok: true, workspace: sanitizeWorkspace(workspace) });
128
- }