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,474 +0,0 @@
1
- "use client";
2
-
3
- import { useCallback, useEffect, useState } from "react";
4
- import { AlertCircle, Loader2, X } from "lucide-react";
5
-
6
- import { Button } from "@/components/ui/button";
7
- import { Sheet, SheetContent, SheetClose } from "@/components/ui/sheet";
8
- import { showError } from "@/lib/toast";
9
- import { authClient } from "@/lib/auth/client";
10
- import { useSkinStore, SKIN_ORDER, SKIN_LABEL } from "@/stores/skin-store";
11
-
12
- interface AuthSettings {
13
- allowedEmails: string[];
14
- allowedDomains: string[];
15
- source: "config" | "env";
16
- envFallbackActive: boolean;
17
- rateLimit?: number;
18
- }
19
-
20
- function listToText(list: string[]): string {
21
- return list.join("\n");
22
- }
23
-
24
- function textToList(text: string): string[] {
25
- return text
26
- .split(/[\n,]/)
27
- .map((s) => s.trim())
28
- .filter(Boolean);
29
- }
30
-
31
- function SkinSelector() {
32
- const skin = useSkinStore((s) => s.skin);
33
- const setSkin = useSkinStore((s) => s.setSkin);
34
- return (
35
- <div className="flex gap-1.5">
36
- {SKIN_ORDER.map((s) => (
37
- <button
38
- key={s}
39
- type="button"
40
- onClick={() => setSkin(s)}
41
- aria-pressed={skin === s}
42
- className={`flex-1 rounded-md border px-3 py-2 text-sm transition-colors ${
43
- skin === s
44
- ? "border-ring bg-accent font-medium text-accent-foreground"
45
- : "border-border text-muted-foreground hover:bg-accent/50"
46
- }`}
47
- >
48
- {SKIN_LABEL[s]}
49
- </button>
50
- ))}
51
- </div>
52
- );
53
- }
54
-
55
- export function AuthSettingsSheet({
56
- open,
57
- onOpenChange,
58
- }: {
59
- open: boolean;
60
- onOpenChange: (open: boolean) => void;
61
- }) {
62
- const [loading, setLoading] = useState(false);
63
- const [saving, setSaving] = useState(false);
64
- const [error, setError] = useState<string | null>(null);
65
- const [source, setSource] = useState<"config" | "env">("env");
66
- const [emailsText, setEmailsText] = useState("");
67
- const [domainsText, setDomainsText] = useState("");
68
- const [rateLimit, setRateLimit] = useState<number | null>(null);
69
- const { data: session } = authClient.useSession();
70
-
71
- // Admin management
72
- const [isAdmin, setIsAdmin] = useState(false);
73
- const [admins, setAdmins] = useState<string[]>([]);
74
- const [adminUsers, setAdminUsers] = useState<Array<{ id: string; email: string; name: string }>>([]);
75
- const [adminError, setAdminError] = useState<string | null>(null);
76
- const [adminWorking, setAdminWorking] = useState<string | null>(null);
77
- // Add-user form
78
- const [newUserEmail, setNewUserEmail] = useState("");
79
- const [newUserName, setNewUserName] = useState("");
80
- const [creatingUser, setCreatingUser] = useState(false);
81
- const [createdUser, setCreatedUser] = useState<{ email: string; tempPassword: string } | null>(null);
82
-
83
- const loadAdmins = useCallback(async () => {
84
- try {
85
- const res = await fetch("/api/system/admins");
86
- if (!res.ok) return;
87
- const d: { admins?: string[]; isAdmin?: boolean; users?: Array<{ id: string; email: string; name: string }> } =
88
- await res.json();
89
- setIsAdmin(!!d.isAdmin);
90
- setAdmins(d.admins ?? []);
91
- setAdminUsers(d.users ?? []);
92
- } catch {
93
- /* ignore */
94
- }
95
- }, []);
96
-
97
- const load = useCallback(async () => {
98
- setLoading(true);
99
- setError(null);
100
- try {
101
- const res = await fetch("/api/system/auth-settings");
102
- if (!res.ok) throw new Error("Failed to load settings");
103
- const data: AuthSettings = await res.json();
104
- setEmailsText(listToText(data.allowedEmails));
105
- setDomainsText(listToText(data.allowedDomains));
106
- setSource(data.source);
107
- setRateLimit(typeof data.rateLimit === "number" ? data.rateLimit : null);
108
- } catch (e) {
109
- setError(e instanceof Error ? e.message : "Failed to load");
110
- } finally {
111
- setLoading(false);
112
- }
113
- }, []);
114
-
115
- useEffect(() => {
116
- if (open) {
117
- void load();
118
- void loadAdmins();
119
- }
120
- }, [open, load, loadAdmins]);
121
-
122
- async function handleSave() {
123
- setSaving(true);
124
- setError(null);
125
- try {
126
- const res = await fetch("/api/system/auth-settings", {
127
- method: "PUT",
128
- headers: { "Content-Type": "application/json" },
129
- body: JSON.stringify({
130
- allowedEmails: textToList(emailsText),
131
- allowedDomains: textToList(domainsText),
132
- }),
133
- });
134
- const data: { error?: string; source?: "config" | "env" } =
135
- await res.json();
136
- if (!res.ok) {
137
- setError(data.error ?? "Save failed");
138
- showError(data.error ?? "Save failed");
139
- return;
140
- }
141
- if (data.source) setSource(data.source);
142
- onOpenChange(false);
143
- } catch {
144
- setError("Save failed");
145
- } finally {
146
- setSaving(false);
147
- }
148
- }
149
-
150
- const noRestriction =
151
- textToList(emailsText).length === 0 &&
152
- textToList(domainsText).length === 0;
153
-
154
- return (
155
- <Sheet open={open} onOpenChange={onOpenChange}>
156
- <SheetContent
157
- side="right"
158
- className="w-[90vw] max-w-sm md:w-80 sm:max-w-md flex flex-col border-l border-border p-0"
159
- >
160
- {/* Header — matches AI panel chrome */}
161
- <div className="flex items-center justify-between border-b border-border px-4 py-3 shrink-0">
162
- <span className="text-sm font-semibold">Settings</span>
163
- <SheetClose className="flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring">
164
- <X className="h-3.5 w-3.5" />
165
- <span className="sr-only">Close</span>
166
- </SheetClose>
167
- </div>
168
-
169
- {loading ? (
170
- <div className="flex flex-1 items-center justify-center">
171
- <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" />
172
- </div>
173
- ) : (
174
- <div className="flex-1 space-y-5 overflow-y-auto px-4 py-4">
175
- {/* Account */}
176
- {session?.user && (
177
- <section className="space-y-2">
178
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
179
- Account
180
- </h3>
181
- <div className="flex items-center justify-between rounded-md border border-border bg-muted/40 p-3">
182
- <div className="text-sm min-w-0">
183
- <div className="font-medium truncate">{session.user.name}</div>
184
- <div className="text-xs text-muted-foreground truncate">{session.user.email}</div>
185
- </div>
186
- <button
187
- type="button"
188
- onClick={async () => {
189
- await authClient.signOut();
190
- window.location.href = "/signin";
191
- }}
192
- className="ml-2 shrink-0 text-xs px-2 py-1 rounded border border-border hover:bg-accent"
193
- >
194
- Sign out
195
- </button>
196
- </div>
197
- </section>
198
- )}
199
-
200
- {/* Appearance */}
201
- <section className="space-y-2">
202
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
203
- Appearance
204
- </h3>
205
- <p className="text-xs text-muted-foreground">
206
- Choose the visual style. Editorial uses a printed-journal
207
- aesthetic with serif type and warm paper tones.
208
- </p>
209
- <SkinSelector />
210
- </section>
211
-
212
- {/* Signup allowlist */}
213
- <section className="space-y-2">
214
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
215
- Signup allowlist
216
- </h3>
217
- <p className="text-xs leading-relaxed text-muted-foreground">
218
- Control who can create an account. Leave both lists empty to
219
- allow any email. Saving here overrides the{" "}
220
- <code className="bg-muted px-0.5 rounded">AUTH_ALLOWED_EMAILS</code>{" "}
221
- and{" "}
222
- <code className="bg-muted px-0.5 rounded">AUTH_ALLOWED_DOMAIN</code>{" "}
223
- environment variables.
224
- </p>
225
- {source === "env" && (
226
- <div className="flex items-start gap-2 rounded-md bg-muted px-3 py-2 text-xs text-muted-foreground">
227
- <AlertCircle className="h-3.5 w-3.5 shrink-0 mt-0.5" />
228
- <span>
229
- Current values come from environment variables. Saving moves
230
- the allowlist into config and takes precedence going forward.
231
- </span>
232
- </div>
233
- )}
234
-
235
- <div className="space-y-1.5">
236
- <label
237
- htmlFor="allowed-emails"
238
- className="text-sm font-medium"
239
- >
240
- Allowed emails
241
- </label>
242
- <p className="text-xs text-muted-foreground">
243
- One per line (or comma-separated). Exact match,
244
- case-insensitive.
245
- </p>
246
- <textarea
247
- id="allowed-emails"
248
- value={emailsText}
249
- onChange={(e) => setEmailsText(e.target.value)}
250
- spellCheck={false}
251
- rows={5}
252
- placeholder="alice@example.com&#10;bob@example.com"
253
- className="w-full resize-y rounded-md border border-border bg-background px-3 py-2 font-mono text-sm outline-none focus:ring-2 focus:ring-primary"
254
- />
255
- </div>
256
-
257
- <div className="space-y-1.5">
258
- <label
259
- htmlFor="allowed-domains"
260
- className="text-sm font-medium"
261
- >
262
- Allowed domains
263
- </label>
264
- <p className="text-xs text-muted-foreground">
265
- One per line (or comma-separated). Matches any email at that
266
- domain.
267
- </p>
268
- <textarea
269
- id="allowed-domains"
270
- value={domainsText}
271
- onChange={(e) => setDomainsText(e.target.value)}
272
- spellCheck={false}
273
- rows={4}
274
- placeholder="example.com&#10;trusted.org"
275
- className="w-full resize-y rounded-md border border-border bg-background px-3 py-2 font-mono text-sm outline-none focus:ring-2 focus:ring-primary"
276
- />
277
- </div>
278
-
279
- {noRestriction && (
280
- <div className="flex items-start gap-2 rounded-md bg-warning-soft px-3 py-2 text-xs text-warning-ink">
281
- <AlertCircle className="h-3.5 w-3.5 shrink-0 mt-0.5" />
282
- <span>
283
- Both lists are empty. Anyone with the signup URL can create an
284
- account.
285
- </span>
286
- </div>
287
- )}
288
-
289
- {error && (
290
- <div className="flex items-center gap-1.5 text-xs text-destructive">
291
- <AlertCircle className="h-3.5 w-3.5 shrink-0" />
292
- {error}
293
- </div>
294
- )}
295
- </section>
296
-
297
- {/* Admins — only visible to admins */}
298
- {isAdmin && (
299
- <section className="space-y-2">
300
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
301
- Admins
302
- </h3>
303
- <p className="text-xs leading-relaxed text-muted-foreground">
304
- Admins can create workspaces, add users, and manage access.
305
- </p>
306
- {adminError && (
307
- <div className="flex items-center gap-1.5 text-xs text-destructive">
308
- <AlertCircle className="h-3.5 w-3.5 shrink-0" />
309
- {adminError}
310
- </div>
311
- )}
312
-
313
- {/* Add user */}
314
- <div className="space-y-2 rounded-md border border-border p-3">
315
- <div className="text-xs font-medium">Add user</div>
316
- {createdUser ? (
317
- <div className="space-y-2">
318
- <p className="text-xs text-muted-foreground">
319
- Created <span className="font-medium text-foreground">{createdUser.email}</span>. Share this temporary password now, it will not be shown again.
320
- </p>
321
- <div className="flex items-center gap-2">
322
- <code className="flex-1 rounded bg-muted px-2 py-1.5 font-mono text-sm select-all">{createdUser.tempPassword}</code>
323
- <button
324
- type="button"
325
- className="shrink-0 text-xs px-2 py-1 rounded border border-border hover:bg-accent"
326
- onClick={() => void navigator.clipboard?.writeText(createdUser.tempPassword)}
327
- >
328
- Copy
329
- </button>
330
- </div>
331
- <button
332
- type="button"
333
- className="text-xs text-muted-foreground hover:text-foreground"
334
- onClick={() => { setCreatedUser(null); setNewUserEmail(""); setNewUserName(""); void loadAdmins(); }}
335
- >
336
- Done
337
- </button>
338
- </div>
339
- ) : (
340
- <div className="space-y-2">
341
- <input
342
- type="email"
343
- value={newUserEmail}
344
- onChange={(e) => setNewUserEmail(e.target.value)}
345
- placeholder="email@team.com"
346
- className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-primary"
347
- />
348
- <input
349
- type="text"
350
- value={newUserName}
351
- onChange={(e) => setNewUserName(e.target.value)}
352
- placeholder="Name (optional)"
353
- className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-primary"
354
- />
355
- <Button
356
- size="sm"
357
- className="w-full gap-1.5"
358
- disabled={creatingUser || !newUserEmail.trim()}
359
- onClick={async () => {
360
- setCreatingUser(true);
361
- setAdminError(null);
362
- try {
363
- const res = await fetch("/api/system/users", {
364
- method: "POST",
365
- headers: { "Content-Type": "application/json" },
366
- body: JSON.stringify({ email: newUserEmail.trim(), name: newUserName.trim() }),
367
- });
368
- const d: { ok?: boolean; email?: string; tempPassword?: string; error?: string; message?: string } = await res.json();
369
- if (!res.ok || !d.tempPassword) {
370
- setAdminError(d.message ?? d.error ?? "Failed to create user");
371
- } else {
372
- setCreatedUser({ email: d.email ?? newUserEmail.trim(), tempPassword: d.tempPassword });
373
- }
374
- } catch {
375
- setAdminError("Network error");
376
- } finally {
377
- setCreatingUser(false);
378
- }
379
- }}
380
- >
381
- {creatingUser && <Loader2 className="h-3.5 w-3.5 animate-spin" />}
382
- Create user
383
- </Button>
384
- </div>
385
- )}
386
- </div>
387
- <div className="space-y-1 rounded-md border border-border overflow-hidden">
388
- {adminUsers.map((u) => {
389
- const isAdminUser = admins.includes(u.id);
390
- return (
391
- <div key={u.id} className="flex items-center justify-between px-3 py-2 bg-muted/40 hover:bg-muted/60 transition-colors">
392
- <div className="text-sm min-w-0">
393
- <div className="font-medium truncate">{u.name}</div>
394
- <div className="text-xs text-muted-foreground truncate">{u.email}</div>
395
- </div>
396
- <button
397
- type="button"
398
- disabled={adminWorking === u.id}
399
- className="ml-2 shrink-0 text-xs px-2 py-1 rounded border border-border hover:bg-accent disabled:opacity-50"
400
- onClick={async () => {
401
- setAdminWorking(u.id);
402
- setAdminError(null);
403
- try {
404
- const res = await fetch("/api/system/admins", {
405
- method: isAdminUser ? "DELETE" : "POST",
406
- headers: { "Content-Type": "application/json" },
407
- body: JSON.stringify({ userId: u.id }),
408
- });
409
- const d: { ok?: boolean; admins?: string[]; error?: string; message?: string } = await res.json();
410
- if (!res.ok) {
411
- setAdminError(d.message ?? d.error ?? "Failed");
412
- } else if (d.admins) {
413
- setAdmins(d.admins);
414
- }
415
- } catch {
416
- setAdminError("Network error");
417
- } finally {
418
- setAdminWorking(null);
419
- }
420
- }}
421
- >
422
- {adminWorking === u.id ? (
423
- <Loader2 className="h-3 w-3 animate-spin" />
424
- ) : isAdminUser ? "Demote" : "Promote"}
425
- </button>
426
- </div>
427
- );
428
- })}
429
- {adminUsers.length === 0 && (
430
- <div className="px-3 py-2 text-xs text-muted-foreground">No users yet.</div>
431
- )}
432
- </div>
433
- {/* TODO: per-workspace access editor (PATCH /api/system/workspaces/[id] allowedUserIds) */}
434
- </section>
435
- )}
436
-
437
- {/* Agent rate limit */}
438
- <section className="space-y-2">
439
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
440
- Agent rate limit
441
- </h3>
442
- <div className="rounded-md border border-border bg-muted/40 p-3 space-y-1.5">
443
- <div className="flex items-center justify-between text-xs">
444
- <span className="text-muted-foreground">Per agent</span>
445
- <span className="font-mono">
446
- {rateLimit !== null ? `${rateLimit} ops/min` : "--"}
447
- </span>
448
- </div>
449
- <p className="text-[10px] text-muted-foreground/60">
450
- Override with <code className="bg-muted px-0.5 rounded">AGENT_RATE_LIMIT</code> env var.
451
- </p>
452
- </div>
453
- </section>
454
- </div>
455
- )}
456
-
457
- <div className="flex items-center justify-end gap-2 border-t border-border px-4 py-3 shrink-0">
458
- <Button
459
- size="sm"
460
- variant="ghost"
461
- onClick={() => onOpenChange(false)}
462
- disabled={saving}
463
- >
464
- Cancel
465
- </Button>
466
- <Button size="sm" onClick={handleSave} disabled={saving || loading} className="gap-1.5">
467
- {saving && <Loader2 className="h-3.5 w-3.5 animate-spin" />}
468
- Save
469
- </Button>
470
- </div>
471
- </SheetContent>
472
- </Sheet>
473
- );
474
- }
@@ -1,56 +0,0 @@
1
- "use client";
2
-
3
- import { Button } from "@/components/ui/button";
4
- import {
5
- Dialog,
6
- DialogContent,
7
- DialogDescription,
8
- DialogFooter,
9
- DialogHeader,
10
- DialogTitle,
11
- } from "@/components/ui/dialog";
12
-
13
- interface ConfirmDialogProps {
14
- open: boolean;
15
- onOpenChange: (open: boolean) => void;
16
- title: string;
17
- description: string;
18
- confirmLabel?: string;
19
- onConfirm: () => void;
20
- variant?: "destructive" | "default";
21
- }
22
-
23
- export function ConfirmDialog({
24
- open,
25
- onOpenChange,
26
- title,
27
- description,
28
- confirmLabel = "Delete",
29
- onConfirm,
30
- variant = "destructive",
31
- }: ConfirmDialogProps) {
32
- return (
33
- <Dialog open={open} onOpenChange={onOpenChange}>
34
- <DialogContent className="sm:max-w-sm">
35
- <DialogHeader>
36
- <DialogTitle>{title}</DialogTitle>
37
- <DialogDescription>{description}</DialogDescription>
38
- </DialogHeader>
39
- <DialogFooter className="gap-2 sm:gap-0">
40
- <Button variant="outline" onClick={() => onOpenChange(false)}>
41
- Cancel
42
- </Button>
43
- <Button
44
- variant={variant}
45
- onClick={() => {
46
- onConfirm();
47
- onOpenChange(false);
48
- }}
49
- >
50
- {confirmLabel}
51
- </Button>
52
- </DialogFooter>
53
- </DialogContent>
54
- </Dialog>
55
- );
56
- }