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,357 +0,0 @@
1
- "use client";
2
-
3
- import {
4
- AlertCircle,
5
- Eye,
6
- Lock,
7
- Loader2,
8
- FileText,
9
- Copy,
10
- Check,
11
- ChevronDown,
12
- Link,
13
- } from "lucide-react";
14
- import { useCallback, useEffect, useState } from "react";
15
- import { Button } from "@/components/ui/button";
16
- import { Input } from "@/components/ui/input";
17
- import { Card } from "@/components/ui/card";
18
- import {
19
- DropdownMenu,
20
- DropdownMenuContent,
21
- DropdownMenuItem,
22
- DropdownMenuSeparator,
23
- DropdownMenuTrigger,
24
- } from "@/components/ui/dropdown-menu";
25
- import { ThemeProvider } from "@/components/theme-provider";
26
- import { KBEditor } from "@/components/editor/editor";
27
- import { useEditorStore } from "@/stores/editor-store";
28
- import { ViewWidthToggle } from "@/components/view-width-toggle";
29
- import { ThemeToggle } from "@/components/theme-toggle";
30
-
31
- type ShareState =
32
- | { kind: "loading" }
33
- | { kind: "password"; message: string }
34
- | { kind: "error"; title: string; message: string }
35
- | { kind: "content"; content: string; filename: string; viewCount: number };
36
-
37
- export default function SharedPage({
38
- params,
39
- }: {
40
- params: Promise<{ token: string }>;
41
- }) {
42
- const [token, setToken] = useState<string | null>(null);
43
- const [state, setState] = useState<ShareState>({ kind: "loading" });
44
- const [password, setPassword] = useState("");
45
- const [verifying, setVerifying] = useState(false);
46
- const [pwdError, setPwdError] = useState(false);
47
- const [copied, setCopied] = useState<string | null>(null);
48
-
49
- const copyShareLink = () => {
50
- if (!token) return;
51
- const url = `${window.location.origin}/s/${token}`;
52
- void navigator.clipboard.writeText(url);
53
- setCopied("link");
54
- setTimeout(() => setCopied(null), 2000);
55
- };
56
-
57
- const copyRawContent = async () => {
58
- if (state.kind !== "content") return;
59
- try {
60
- await navigator.clipboard.writeText(state.content);
61
- setCopied("raw");
62
- setTimeout(() => setCopied(null), 2000);
63
- } catch {
64
- // silently fail
65
- }
66
- };
67
-
68
- const copyFormattedContent = async () => {
69
- if (state.kind !== "content") return;
70
- try {
71
- const { markdownToHtml } = await import("@/lib/markdown/to-html");
72
- const html = await markdownToHtml(state.content);
73
- if ("ClipboardItem" in window && navigator.clipboard.write) {
74
- await navigator.clipboard.write([
75
- new ClipboardItem({
76
- "text/html": new Blob([html], { type: "text/html" }),
77
- "text/plain": new Blob([state.content], { type: "text/plain" }),
78
- }),
79
- ]);
80
- } else {
81
- await navigator.clipboard.writeText(state.content);
82
- }
83
- setCopied("formatted");
84
- setTimeout(() => setCopied(null), 2000);
85
- } catch {
86
- // silently fail
87
- }
88
- };
89
-
90
- const fetchShare = useCallback(
91
- async () => {
92
- if (!token) return;
93
- setState({ kind: "loading" });
94
- try {
95
- const res = await fetch(`/api/share/${token}`);
96
- const data = await res.json();
97
-
98
- if (res.ok && data.content !== undefined) {
99
- useEditorStore.setState({
100
- currentPath: `shared/${token}/${data.filename ?? "document"}`,
101
- content: data.content,
102
- frontmatter: null,
103
- isLoading: false,
104
- loadStatus: "ok",
105
- isDirty: false,
106
- currentRevision: null,
107
- saveStatus: "saved",
108
- });
109
- setState({
110
- kind: "content",
111
- content: data.content,
112
- filename: data.filename ?? "document",
113
- viewCount: data.viewCount ?? 0,
114
- });
115
- } else if (res.status === 401 && data.protected) {
116
- setState({ kind: "password", message: data.message ?? "" });
117
- } else if (res.status === 410) {
118
- setState({
119
- kind: "error",
120
- title: "Link unavailable",
121
- message: data.message ?? "This share link is no longer available.",
122
- });
123
- } else if (res.status === 404) {
124
- setState({
125
- kind: "error",
126
- title: "Not found",
127
- message: "This share link does not exist.",
128
- });
129
- } else {
130
- setState({
131
- kind: "error",
132
- title: "Error",
133
- message: data.message ?? "Something went wrong. Try again later.",
134
- });
135
- }
136
- } catch {
137
- setState({
138
- kind: "error",
139
- title: "Connection error",
140
- message: "Could not reach the server. Check your connection.",
141
- });
142
- }
143
- },
144
- [token],
145
- );
146
-
147
- // Resolve token from params
148
- useEffect(() => {
149
- void params.then((p) => setToken(p.token));
150
- }, [params]);
151
-
152
- // Fetch on token resolve (no password)
153
- useEffect(() => {
154
- if (token) void fetchShare();
155
- }, [token, fetchShare]);
156
-
157
- const handleSubmitPassword = async (e: React.FormEvent) => {
158
- e.preventDefault();
159
- if (!password.trim() || !token) return;
160
- setVerifying(true);
161
- setPwdError(false);
162
- try {
163
- const res = await fetch(`/api/share/${token}`, {
164
- method: "POST",
165
- headers: { "Content-Type": "application/json" },
166
- body: JSON.stringify({ password: password.trim() }),
167
- });
168
- const data = await res.json();
169
-
170
- if (res.ok && data.content !== undefined) {
171
- useEditorStore.setState({
172
- currentPath: `shared/${token}/${data.filename ?? "document"}`,
173
- content: data.content,
174
- frontmatter: null,
175
- isLoading: false,
176
- loadStatus: "ok",
177
- isDirty: false,
178
- currentRevision: null,
179
- saveStatus: "saved",
180
- });
181
- setState({
182
- kind: "content",
183
- content: data.content,
184
- filename: data.filename ?? "document",
185
- viewCount: data.viewCount ?? 0,
186
- });
187
- } else if (res.status === 403) {
188
- setPwdError(true);
189
- setState({ kind: "password", message: "Incorrect password" });
190
- } else if (res.status === 429) {
191
- setState({ kind: "password", message: "Too many attempts. Try again later." });
192
- } else {
193
- setState({ kind: "error", title: "Error", message: data.message ?? "Something went wrong." });
194
- }
195
- } catch {
196
- setState({ kind: "error", title: "Connection error", message: "Could not reach the server." });
197
- }
198
- setVerifying(false);
199
- };
200
-
201
- return (
202
- <ThemeProvider>
203
- <div className="min-h-screen flex flex-col bg-background text-foreground">
204
- <header className="border-b border-border bg-muted/50">
205
- <div className="mx-auto flex max-w-4xl items-center gap-2 px-4 py-2">
206
- {state.kind === "content" ? (
207
- <>
208
- <div className="flex items-center gap-2 min-w-0 flex-1">
209
- <span className="h-2 w-2 rounded-full bg-success shrink-0" />
210
- <span className="text-sm font-mono truncate" title={state.filename}>
211
- {state.filename}
212
- </span>
213
- </div>
214
- <div className="flex items-center gap-1 shrink-0">
215
- <DropdownMenu>
216
- <DropdownMenuTrigger asChild>
217
- <Button
218
- size="sm"
219
- variant="ghost"
220
- className="h-7 gap-1.5 px-2 text-xs data-[state=open]:bg-transparent"
221
- title="Copy link, raw content, or formatted content"
222
- >
223
- {copied === "link" ? (
224
- <Check className="h-3.5 w-3.5 text-success" />
225
- ) : (
226
- <Copy className="h-3.5 w-3.5" />
227
- )}
228
- Copy
229
- <ChevronDown className="h-3 w-3 opacity-60" />
230
- </Button>
231
- </DropdownMenuTrigger>
232
- <DropdownMenuContent align="end" className="w-48">
233
- <DropdownMenuItem onClick={copyShareLink}>
234
- <Link className="mr-2 h-3.5 w-3.5" />
235
- Copy share link
236
- </DropdownMenuItem>
237
- <DropdownMenuSeparator />
238
- <DropdownMenuItem onClick={copyRawContent}>
239
- <FileText className="mr-2 h-3.5 w-3.5" />
240
- Copy raw content
241
- </DropdownMenuItem>
242
- <DropdownMenuItem onClick={copyFormattedContent}>
243
- <FileText className="mr-2 h-3.5 w-3.5" />
244
- Copy formatted content
245
- </DropdownMenuItem>
246
- </DropdownMenuContent>
247
- </DropdownMenu>
248
- <ViewWidthToggle />
249
- <ThemeToggle />
250
- <span className="text-xs text-muted-foreground ml-2">
251
- {state.viewCount} view
252
- {state.viewCount !== 1 ? "s" : ""}
253
- </span>
254
- </div>
255
- </>
256
- ) : (
257
- <>
258
- <Eye className="h-4 w-4 text-muted-foreground" />
259
- <span className="text-xs font-medium text-muted-foreground">
260
- Shared document
261
- </span>
262
- </>
263
- )}
264
- </div>
265
- </header>
266
-
267
- {state.kind === "loading" && (
268
- <div className="flex-1 flex items-center justify-center">
269
- <Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
270
- </div>
271
- )}
272
-
273
- {state.kind === "password" && (
274
- <div className="flex-1 flex items-center justify-center px-4">
275
- <Card className="max-w-sm w-full p-6">
276
- <div className="flex flex-col items-center gap-4 text-center">
277
- <div className="rounded-full bg-muted p-3">
278
- <Lock className="h-6 w-6 text-muted-foreground" />
279
- </div>
280
- <div className="space-y-1">
281
- <h1 className="text-base font-medium">
282
- Password required
283
- </h1>
284
- <p className="text-sm text-muted-foreground">
285
- {state.message ||
286
- "This document is password-protected."}
287
- </p>
288
- </div>
289
- <form
290
- onSubmit={handleSubmitPassword}
291
- className="w-full space-y-3"
292
- >
293
- <Input
294
- type="password"
295
- placeholder="Enter password"
296
- value={password}
297
- onChange={(e) => {
298
- setPassword(e.target.value);
299
- setPwdError(false);
300
- }}
301
- autoFocus
302
- />
303
- {pwdError && (
304
- <p className="text-xs text-destructive flex items-center gap-1">
305
- <AlertCircle className="h-3 w-3" />
306
- Wrong password. Try again.
307
- </p>
308
- )}
309
- <Button
310
- type="submit"
311
- className="w-full"
312
- disabled={verifying || !password.trim()}
313
- >
314
- {verifying ? (
315
- <Loader2 className="h-4 w-4 animate-spin" />
316
- ) : (
317
- "View document"
318
- )}
319
- </Button>
320
- </form>
321
- </div>
322
- </Card>
323
- </div>
324
- )}
325
-
326
- {state.kind === "error" && (
327
- <div className="flex-1 flex flex-col items-center justify-center gap-4 px-4 text-center">
328
- <div className="rounded-full bg-muted p-3">
329
- <AlertCircle className="h-6 w-6 text-muted-foreground" />
330
- </div>
331
- <div className="space-y-1">
332
- <h1 className="text-base font-medium">{state.title}</h1>
333
- <p className="text-sm text-muted-foreground">
334
- {state.message}
335
- </p>
336
- </div>
337
- </div>
338
- )}
339
-
340
- {state.kind === "content" && (
341
- <KBEditor mode="viewing" />
342
- )}
343
-
344
- {state.kind === "content" && (
345
- <footer className="border-t border-border bg-muted/30">
346
- <div className="mx-auto flex max-w-4xl items-center gap-2 px-4 py-2">
347
- <FileText className="h-3 w-3 text-muted-foreground" />
348
- <span className="text-xs text-muted-foreground">
349
- {state.filename}
350
- </span>
351
- </div>
352
- </footer>
353
- )}
354
- </div>
355
- </ThemeProvider>
356
- );
357
- }
@@ -1,16 +0,0 @@
1
- import SignInForm from "./signin-form";
2
- import { passwordAuthEnabled } from "@/lib/auth/server";
3
-
4
- // Server component: resolve the available auth methods at render time so the
5
- // initial HTML already reflects the configuration. This prevents the password
6
- // form from flashing on load when it is disabled (AUTH_DISABLE_PASSWORD=1).
7
- export const dynamic = "force-dynamic";
8
-
9
- export default function SignInPage() {
10
- const google = Boolean(
11
- process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET,
12
- );
13
- return (
14
- <SignInForm initialPasswordAuth={passwordAuthEnabled} initialGoogle={google} />
15
- );
16
- }
@@ -1,238 +0,0 @@
1
- "use client";
2
-
3
- import { useState, useEffect, type FormEvent } from "react";
4
- import { authClient } from "@/lib/auth/client";
5
-
6
- export default function SignInForm({
7
- initialPasswordAuth,
8
- initialGoogle,
9
- }: {
10
- initialPasswordAuth: boolean;
11
- initialGoogle: boolean;
12
- }) {
13
- const [mode, setMode] = useState<"signin" | "signup">("signin");
14
- const [email, setEmail] = useState("");
15
- const [password, setPassword] = useState("");
16
- const [name, setName] = useState("");
17
- const [error, setError] = useState<string | null>(null);
18
- const [loading, setLoading] = useState(false);
19
- // Seed from server-rendered values so the first paint already matches the
20
- // configured auth methods. This avoids a flash of the password form when it
21
- // is disabled. The fetch below only refreshes in case config changed.
22
- const [hasGoogle, setHasGoogle] = useState(initialGoogle);
23
- const [passwordAuth, setPasswordAuth] = useState(initialPasswordAuth);
24
- const [callbackURL, setCallbackURL] = useState("/");
25
-
26
- useEffect(() => {
27
- // Refresh which auth methods to show. Public endpoint, no session needed.
28
- fetch("/api/system/auth-config", { credentials: "include" })
29
- .then((r) => r.json())
30
- .then((data: unknown) => {
31
- if (data && typeof data === "object") {
32
- const cfg = data as { google?: boolean; passwordAuth?: boolean };
33
- setHasGoogle(Boolean(cfg.google));
34
- setPasswordAuth(cfg.passwordAuth !== false);
35
- }
36
- })
37
- .catch(() => {});
38
-
39
- // Honour ?next= redirect param
40
- const params = new URLSearchParams(window.location.search);
41
- const next = params.get("next");
42
- if (next && next.startsWith("/")) setCallbackURL(next);
43
- }, []);
44
-
45
- async function handleSubmit(e: FormEvent) {
46
- e.preventDefault();
47
- setError(null);
48
- setLoading(true);
49
- try {
50
- if (mode === "signup") {
51
- const res = await authClient.signUp.email({
52
- email,
53
- password,
54
- name,
55
- callbackURL,
56
- });
57
- if (res.error) {
58
- setError(res.error.message ?? "Sign-up failed");
59
- } else {
60
- window.location.href = callbackURL;
61
- }
62
- } else {
63
- const res = await authClient.signIn.email({
64
- email,
65
- password,
66
- callbackURL,
67
- });
68
- if (res.error) {
69
- const status = res.error.status;
70
- if (status === 429) {
71
- setError("Too many sign-in attempts. Wait a minute and try again.");
72
- } else {
73
- setError(res.error.message ?? "Sign-in failed");
74
- }
75
- } else {
76
- window.location.href = callbackURL;
77
- }
78
- }
79
- } catch (err: unknown) {
80
- setError(err instanceof Error ? err.message : "Unexpected error");
81
- } finally {
82
- setLoading(false);
83
- }
84
- }
85
-
86
- async function handleGoogle() {
87
- setError(null);
88
- setLoading(true);
89
- try {
90
- await authClient.signIn.social({ provider: "google", callbackURL });
91
- } catch (err: unknown) {
92
- setError(err instanceof Error ? err.message : "Google sign-in failed");
93
- setLoading(false);
94
- }
95
- }
96
-
97
- return (
98
- <div className="min-h-screen flex items-center justify-center bg-background">
99
- <div className="w-full max-w-sm rounded-lg border border-border bg-card p-8 shadow-sm">
100
- <h1 className="mb-6 text-xl font-semibold text-foreground">Sign in to wiki-viewer</h1>
101
-
102
- {hasGoogle && (
103
- <>
104
- <button
105
- type="button"
106
- onClick={handleGoogle}
107
- disabled={loading}
108
- className="flex w-full items-center justify-center gap-2 rounded-md border border-border px-4 py-2 text-sm font-medium hover:bg-accent disabled:opacity-50"
109
- >
110
- <svg viewBox="0 0 24 24" className="h-4 w-4" aria-hidden="true">
111
- <path
112
- fill="#4285F4"
113
- d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
114
- />
115
- <path
116
- fill="#34A853"
117
- d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
118
- />
119
- <path
120
- fill="#FBBC05"
121
- d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l3.66-2.84z"
122
- />
123
- <path
124
- fill="#EA4335"
125
- d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
126
- />
127
- </svg>
128
- Continue with Google
129
- </button>
130
- {passwordAuth && (
131
- <div className="my-4 flex items-center gap-3">
132
- <hr className="flex-1 border-border" />
133
- <span className="text-xs text-muted-foreground">or</span>
134
- <hr className="flex-1 border-border" />
135
- </div>
136
- )}
137
- </>
138
- )}
139
-
140
- {!passwordAuth && !hasGoogle && (
141
- <p className="rounded-md bg-destructive/10 px-3 py-2 text-sm text-destructive">
142
- No sign-in method is configured. Set GOOGLE_CLIENT_ID and
143
- GOOGLE_CLIENT_SECRET, or enable email/password auth.
144
- </p>
145
- )}
146
-
147
- {passwordAuth && (
148
- <form onSubmit={handleSubmit} className="space-y-4">
149
- {mode === "signup" && (
150
- <div>
151
- <label className="mb-1 block text-sm font-medium text-foreground" htmlFor="name">
152
- Name
153
- </label>
154
- <input
155
- id="name"
156
- type="text"
157
- autoComplete="name"
158
- value={name}
159
- onChange={(e) => setName(e.target.value)}
160
- required
161
- className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
162
- />
163
- </div>
164
- )}
165
- <div>
166
- <label className="mb-1 block text-sm font-medium text-foreground" htmlFor="email">
167
- Email
168
- </label>
169
- <input
170
- id="email"
171
- type="email"
172
- autoComplete="email"
173
- value={email}
174
- onChange={(e) => setEmail(e.target.value)}
175
- required
176
- className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
177
- />
178
- </div>
179
- <div>
180
- <label
181
- className="mb-1 block text-sm font-medium text-foreground"
182
- htmlFor="password"
183
- >
184
- Password
185
- </label>
186
- <input
187
- id="password"
188
- type="password"
189
- autoComplete={mode === "signup" ? "new-password" : "current-password"}
190
- value={password}
191
- onChange={(e) => setPassword(e.target.value)}
192
- required
193
- minLength={8}
194
- className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
195
- />
196
- </div>
197
-
198
- {error && (
199
- <p className="rounded-md bg-destructive/10 px-3 py-2 text-sm text-destructive">
200
- {error}
201
- </p>
202
- )}
203
-
204
- <button
205
- type="submit"
206
- disabled={loading}
207
- className="w-full rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50"
208
- >
209
- {loading
210
- ? mode === "signup"
211
- ? "Creating account..."
212
- : "Signing in..."
213
- : mode === "signup"
214
- ? "Create account"
215
- : "Sign in"}
216
- </button>
217
- </form>
218
- )}
219
-
220
- {passwordAuth && (
221
- <p className="mt-4 text-center text-sm text-muted-foreground">
222
- {mode === "signin" ? "No account?" : "Already have an account?"}{" "}
223
- <button
224
- type="button"
225
- onClick={() => {
226
- setMode(mode === "signin" ? "signup" : "signin");
227
- setError(null);
228
- }}
229
- className="font-medium text-foreground underline-offset-4 hover:underline"
230
- >
231
- {mode === "signin" ? "Sign up" : "Sign in"}
232
- </button>
233
- </p>
234
- )}
235
- </div>
236
- </div>
237
- );
238
- }