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,150 +0,0 @@
1
- import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
2
- import Link from "@tiptap/extension-link";
3
- import Placeholder from "@tiptap/extension-placeholder";
4
- import Subscript from "@tiptap/extension-subscript";
5
- import Superscript from "@tiptap/extension-superscript";
6
- import { Table } from "@tiptap/extension-table";
7
- import { TableCell } from "@tiptap/extension-table-cell";
8
- import { TableHeader } from "@tiptap/extension-table-header";
9
- import { TableRow } from "@tiptap/extension-table-row";
10
- import TaskItem from "@tiptap/extension-task-item";
11
- import TaskList from "@tiptap/extension-task-list";
12
- import TextAlign from "@tiptap/extension-text-align";
13
- import StarterKit from "@tiptap/starter-kit";
14
- import bash from "highlight.js/lib/languages/bash";
15
- import css from "highlight.js/lib/languages/css";
16
- import go from "highlight.js/lib/languages/go";
17
- import javascript from "highlight.js/lib/languages/javascript";
18
- import json from "highlight.js/lib/languages/json";
19
- import markdown from "highlight.js/lib/languages/markdown";
20
- import python from "highlight.js/lib/languages/python";
21
- import rust from "highlight.js/lib/languages/rust";
22
- import shell from "highlight.js/lib/languages/shell";
23
- import sql from "highlight.js/lib/languages/sql";
24
- import typescript from "highlight.js/lib/languages/typescript";
25
- import xml from "highlight.js/lib/languages/xml";
26
- import yaml from "highlight.js/lib/languages/yaml";
27
- import { createLowlight } from "lowlight";
28
- import { CalloutExtension } from "./callout-extension";
29
- import { DragHandle } from "./extensions/drag-handle";
30
- import { HeadingAnchors } from "./extensions/heading-anchors";
31
- import { ProofSpan } from "./extensions/proof-span";
32
- import { ResizableImage } from "./extensions/resizable-image";
33
- import { WikiLink } from "./wiki-link-extension";
34
-
35
- // Curated language set: covers ~95% of real-world snippets. The full `common`
36
- // import bundles 35+ language parsers (~70 kB gzipped) that users
37
- // rarely touch — swapping it for this 13-language list cuts the editor chunk
38
- // meaningfully. Add languages as demand grows.
39
- const lowlight = createLowlight({
40
- bash,
41
- css,
42
- go,
43
- javascript,
44
- json,
45
- markdown,
46
- python,
47
- rust,
48
- shell,
49
- sql,
50
- typescript,
51
- xml,
52
- yaml,
53
- });
54
-
55
- export const editorExtensions = [
56
- StarterKit.configure({
57
- heading: { levels: [1, 2, 3, 4] },
58
- codeBlock: false, // replaced by CodeBlockLowlight
59
- // StarterKit v3 bundles Link + Underline — we register our own customized
60
- // versions below, so disable the bundled copies to avoid duplicate-extension warnings.
61
- link: false,
62
- underline: false,
63
- }),
64
- CodeBlockLowlight.configure({
65
- lowlight,
66
- HTMLAttributes: {
67
- class: "rounded-md bg-muted p-4 font-mono text-sm",
68
- },
69
- }),
70
- Placeholder.configure({
71
- placeholder: "Start writing, or press '/' for commands...",
72
- }),
73
- ResizableImage.configure({
74
- HTMLAttributes: {
75
- class: "rounded-lg max-w-full",
76
- },
77
- allowBase64: false,
78
- }),
79
- Table.configure({
80
- resizable: true,
81
- lastColumnResizable: false,
82
- HTMLAttributes: {
83
- class: "border-collapse w-full",
84
- },
85
- }),
86
- TableRow,
87
- TableCell,
88
- TableHeader,
89
- TaskList.configure({
90
- HTMLAttributes: {
91
- class: "task-list",
92
- },
93
- }),
94
- TaskItem.configure({
95
- nested: true,
96
- }),
97
- Link.configure({
98
- openOnClick: false, // we handle clicks ourselves in the editor
99
- HTMLAttributes: {
100
- class: "text-primary underline cursor-pointer",
101
- },
102
- }).extend({
103
- parseHTML() {
104
- return [
105
- {
106
- tag: 'a[href]:not([data-wiki-link="true"])',
107
- },
108
- ];
109
- },
110
- // Move the link shortcut off Mod-K — that key is owned by the global
111
- // search palette everywhere in the app, including inside the editor.
112
- addKeyboardShortcuts() {
113
- return {
114
- "Mod-e": () => {
115
- const { state } = this.editor;
116
- const { from, to } = state.selection;
117
- if (from === to) return false;
118
- const prevUrl = this.editor.getAttributes("link").href ?? "";
119
- const url =
120
- typeof window !== "undefined"
121
- ? window.prompt("Link URL", prevUrl)
122
- : null;
123
- if (url === null) return false;
124
- if (url === "") {
125
- return this.editor
126
- .chain()
127
- .focus()
128
- .extendMarkRange("link")
129
- .unsetLink()
130
- .run();
131
- }
132
- return this.editor
133
- .chain()
134
- .focus()
135
- .extendMarkRange("link")
136
- .setLink({ href: url })
137
- .run();
138
- },
139
- };
140
- },
141
- }),
142
- CalloutExtension,
143
- ProofSpan,
144
- TextAlign.configure({ types: ["heading", "paragraph"] }),
145
- Subscript,
146
- Superscript,
147
- DragHandle,
148
- HeadingAnchors,
149
- WikiLink,
150
- ];
@@ -1,75 +0,0 @@
1
- "use client";
2
-
3
- import { Download, File, FolderOpen } from "lucide-react";
4
- import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
5
- import { Button } from "@/components/ui/button";
6
- import { withWs, wsFetch } from "@/lib/workspace-client";
7
-
8
- interface FileFallbackViewerProps {
9
- path: string;
10
- title: string;
11
- }
12
-
13
- export function FileFallbackViewer({ path }: FileFallbackViewerProps) {
14
- const assetUrl = withWs(`/api/assets/${path}`);
15
- const filename = path.split("/").pop() || path;
16
- const ext = filename.includes(".")
17
- ? filename.split(".").pop()?.toUpperCase()
18
- : "";
19
-
20
- const revealInFinder = async () => {
21
- try {
22
- await wsFetch("/api/system/reveal", {
23
- method: "POST",
24
- headers: { "Content-Type": "application/json" },
25
- body: JSON.stringify({ path }),
26
- });
27
- } catch {
28
- /* ignore */
29
- }
30
- };
31
-
32
- return (
33
- <div className="flex-1 flex flex-col overflow-hidden">
34
- <ViewerToolbar path={path} badge={ext || undefined} />
35
- <div className="flex-1 flex items-center justify-center">
36
- <div className="flex flex-col items-center gap-4 text-center max-w-sm">
37
- <div className="flex size-16 items-center justify-center rounded-2xl bg-muted">
38
- <File className="size-8 text-muted-foreground/50" />
39
- </div>
40
- <div className="space-y-1">
41
- <p className="text-sm font-medium">{filename}</p>
42
- <p className="text-xs text-muted-foreground">
43
- This file type can&apos;t be previewed in Cabinet.
44
- </p>
45
- </div>
46
- <div className="flex items-center gap-2">
47
- <Button
48
- variant="outline"
49
- size="sm"
50
- className="gap-2"
51
- onClick={revealInFinder}
52
- >
53
- <FolderOpen className="h-4 w-4" />
54
- Open in Finder
55
- </Button>
56
- <Button
57
- variant="outline"
58
- size="sm"
59
- className="gap-2"
60
- onClick={() => {
61
- const a = document.createElement("a");
62
- a.href = assetUrl;
63
- a.download = filename;
64
- a.click();
65
- }}
66
- >
67
- <Download className="h-4 w-4" />
68
- Download
69
- </Button>
70
- </div>
71
- </div>
72
- </div>
73
- </div>
74
- );
75
- }
@@ -1,236 +0,0 @@
1
- "use client";
2
-
3
- import {
4
- AppWindow,
5
- FileAudio,
6
- FileCode2,
7
- FileImage,
8
- FileSpreadsheet,
9
- FileText,
10
- FileVideo,
11
- Folder,
12
- Globe,
13
- LayoutGrid,
14
- List as ListIcon,
15
- } from "lucide-react";
16
- import { useMemo, useState } from "react";
17
- import { useEditorStore } from "@/stores/editor-store";
18
- import { useTreeStore } from "@/stores/tree-store";
19
- import type { TreeNode } from "@/types";
20
- import { withWs } from "@/lib/workspace-client";
21
-
22
- type ViewMode = "list" | "gallery";
23
-
24
- const VIEW_MODE_KEY = "kb-folder-view-mode";
25
-
26
- function loadModePref(path: string): ViewMode | null {
27
- if (typeof window === "undefined") return null;
28
- try {
29
- const raw = localStorage.getItem(VIEW_MODE_KEY);
30
- if (!raw) return null;
31
- const parsed = JSON.parse(raw) as Record<string, ViewMode>;
32
- return parsed[path] ?? null;
33
- } catch {
34
- return null;
35
- }
36
- }
37
-
38
- function saveModePref(path: string, mode: ViewMode) {
39
- if (typeof window === "undefined") return;
40
- try {
41
- const raw = localStorage.getItem(VIEW_MODE_KEY);
42
- const parsed = raw ? (JSON.parse(raw) as Record<string, ViewMode>) : {};
43
- parsed[path] = mode;
44
- localStorage.setItem(VIEW_MODE_KEY, JSON.stringify(parsed));
45
- } catch {
46
- // ignore quota / parse errors
47
- }
48
- }
49
-
50
- function isImageChild(node: TreeNode): boolean {
51
- return node.type === "image";
52
- }
53
-
54
- // A folder is "image-heavy" when it has enough images to make a gallery feel
55
- // useful AND images dominate the child set. Tuned for moodboards and
56
- // screenshot dumps without surprising mixed folders.
57
- function isImageHeavy(children: TreeNode[]): boolean {
58
- if (children.length === 0) return false;
59
- const images = children.filter(isImageChild).length;
60
- return images >= 4 && images / children.length >= 0.6;
61
- }
62
-
63
- function iconFor(node: TreeNode) {
64
- switch (node.type) {
65
- case "directory":
66
- case "cabinet":
67
- return Folder;
68
- case "image":
69
- return FileImage;
70
- case "video":
71
- return FileVideo;
72
- case "audio":
73
- return FileAudio;
74
- case "code":
75
- return FileCode2;
76
- case "csv":
77
- case "xlsx":
78
- return FileSpreadsheet;
79
- case "website":
80
- return Globe;
81
- case "app":
82
- return AppWindow;
83
- default:
84
- return FileText;
85
- }
86
- }
87
-
88
- function navigateTo(path: string) {
89
- const { selectPage, expandPath } = useTreeStore.getState();
90
- const parts = path.split("/");
91
- for (let i = 1; i < parts.length; i++) {
92
- expandPath(parts.slice(0, i).join("/"));
93
- }
94
- selectPage(path);
95
- void useEditorStore.getState().loadPage(path);
96
- }
97
-
98
- interface FolderIndexProps {
99
- folderPath: string;
100
- entries: TreeNode[];
101
- }
102
-
103
- // The parent passes a `key={folderPath}` so this component remounts when the
104
- // folder changes — that's why state can safely seed from the path on mount
105
- // without a re-sync effect.
106
- export function FolderIndex({ folderPath, entries }: FolderIndexProps) {
107
- const imageHeavy = useMemo(() => isImageHeavy(entries), [entries]);
108
-
109
- const [mode, setMode] = useState<ViewMode>(() => {
110
- const saved = loadModePref(folderPath);
111
- if (saved) return saved;
112
- return imageHeavy ? "gallery" : "list";
113
- });
114
-
115
- const onSetMode = (next: ViewMode) => {
116
- setMode(next);
117
- saveModePref(folderPath, next);
118
- };
119
-
120
- // Sort: directories first, then by name. Stable so siblings stay grouped.
121
- const sorted = useMemo(() => {
122
- const copy = [...entries];
123
- copy.sort((a, b) => {
124
- const aDir = a.type === "directory" || a.type === "cabinet";
125
- const bDir = b.type === "directory" || b.type === "cabinet";
126
- if (aDir !== bDir) return aDir ? -1 : 1;
127
- return a.name.localeCompare(b.name);
128
- });
129
- return copy;
130
- }, [entries]);
131
-
132
- return (
133
- <div className="space-y-3">
134
- <div className="flex items-center justify-between">
135
- <p className="text-[11px] uppercase tracking-wider text-muted-foreground/70">
136
- {sorted.length} {sorted.length === 1 ? "item" : "items"}
137
- </p>
138
- <div className="inline-flex items-center rounded-md border border-border p-0.5 text-[11px]">
139
- <button
140
- onClick={() => onSetMode("list")}
141
- className={`flex items-center gap-1 px-2 py-1 rounded transition-colors ${
142
- mode === "list"
143
- ? "bg-accent text-foreground"
144
- : "text-muted-foreground hover:text-foreground"
145
- }`}
146
- aria-pressed={mode === "list"}
147
- title="List view"
148
- >
149
- <ListIcon className="h-3 w-3" />
150
- List
151
- </button>
152
- <button
153
- onClick={() => onSetMode("gallery")}
154
- className={`flex items-center gap-1 px-2 py-1 rounded transition-colors ${
155
- mode === "gallery"
156
- ? "bg-accent text-foreground"
157
- : "text-muted-foreground hover:text-foreground"
158
- }`}
159
- aria-pressed={mode === "gallery"}
160
- title="Gallery view"
161
- >
162
- <LayoutGrid className="h-3 w-3" />
163
- Gallery
164
- </button>
165
- </div>
166
- </div>
167
-
168
- {mode === "list" ? (
169
- <ul className="divide-y divide-border rounded-md border border-border overflow-hidden">
170
- {sorted.map((child) => {
171
- const Icon = iconFor(child);
172
- const title = child.frontmatter?.title || child.name;
173
- return (
174
- <li key={child.path}>
175
- <button
176
- onClick={() => navigateTo(child.path)}
177
- className="w-full flex items-center gap-3 px-3 py-2 text-left text-sm hover:bg-accent/50 transition-colors"
178
- >
179
- <Icon className="h-4 w-4 shrink-0 text-muted-foreground" />
180
- <span className="flex-1 truncate">{title}</span>
181
- <span className="text-[11px] text-muted-foreground/60 capitalize">
182
- {child.type}
183
- </span>
184
- </button>
185
- </li>
186
- );
187
- })}
188
- </ul>
189
- ) : (
190
- <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3">
191
- {sorted.map((child) => {
192
- const title = child.frontmatter?.title || child.name;
193
- if (isImageChild(child)) {
194
- return (
195
- <button
196
- key={child.path}
197
- onClick={() => navigateTo(child.path)}
198
- className="group flex flex-col gap-1.5 text-left"
199
- title={title}
200
- >
201
- <div className="aspect-square w-full overflow-hidden rounded-md border border-border bg-muted">
202
- <img
203
- src={withWs(`/api/assets/${child.path}`)}
204
- alt={title}
205
- loading="lazy"
206
- className="h-full w-full object-cover transition-transform group-hover:scale-[1.02]"
207
- />
208
- </div>
209
- <span className="truncate text-[12px] text-muted-foreground group-hover:text-foreground">
210
- {title}
211
- </span>
212
- </button>
213
- );
214
- }
215
- const Icon = iconFor(child);
216
- return (
217
- <button
218
- key={child.path}
219
- onClick={() => navigateTo(child.path)}
220
- className="group flex flex-col gap-1.5 text-left"
221
- title={title}
222
- >
223
- <div className="aspect-square w-full flex items-center justify-center rounded-md border border-border bg-muted/40 group-hover:bg-muted transition-colors">
224
- <Icon className="h-8 w-8 text-muted-foreground/60" />
225
- </div>
226
- <span className="truncate text-[12px] text-muted-foreground group-hover:text-foreground">
227
- {title}
228
- </span>
229
- </button>
230
- );
231
- })}
232
- </div>
233
- )}
234
- </div>
235
- );
236
- }
@@ -1,73 +0,0 @@
1
- "use client";
2
-
3
- import { Info } from "lucide-react";
4
- import { useMemo } from "react";
5
- import {
6
- detectGoogle,
7
- type GoogleKind,
8
- googleKindLabel,
9
- } from "@/lib/google/detect";
10
- import type { GoogleFrontmatter } from "@/types";
11
- import { OfficeChrome } from "./office/office-chrome";
12
-
13
- interface Props {
14
- path: string;
15
- title: string;
16
- google: GoogleFrontmatter;
17
- }
18
-
19
- export function GoogleDocViewer({ path, title, google }: Props) {
20
- const resolved = useMemo(() => detectGoogle(google.url || ""), [google.url]);
21
- const embedUrl = google.embedUrl ?? resolved?.embedUrl ?? "";
22
- const openUrl = resolved?.openUrl ?? google.url ?? "";
23
- const kind: GoogleKind =
24
- (google.kind as GoogleKind) ?? resolved?.kind ?? "docs";
25
- const label = googleKindLabel(kind).toUpperCase();
26
-
27
- if (!embedUrl) {
28
- return (
29
- <div className="flex-1 flex flex-col overflow-hidden">
30
- <OfficeChrome path={path} title={title} extLabel="GOOGLE" hideFinder />
31
- <div className="flex-1 flex items-center justify-center p-6">
32
- <div className="max-w-md text-center space-y-2">
33
- <p className="text-sm font-medium">No Google URL set</p>
34
- <p className="text-xs text-muted-foreground">
35
- Add a <code>google.url</code> field to this page&apos;s
36
- frontmatter pointing to a Google Sheets, Slides, Docs or Forms
37
- link.
38
- </p>
39
- </div>
40
- </div>
41
- </div>
42
- );
43
- }
44
-
45
- return (
46
- <div className="flex-1 flex flex-col overflow-hidden">
47
- <OfficeChrome
48
- path={path}
49
- title={title}
50
- extLabel={label}
51
- hideFinder
52
- external={
53
- openUrl ? { label: "Open in Google", href: openUrl } : undefined
54
- }
55
- />
56
- <div className="px-4 py-1.5 border-b border-border bg-muted/30 text-[11px] text-muted-foreground flex items-center gap-1.5">
57
- <Info className="h-3 w-3 shrink-0" />
58
- Embed requires the doc&apos;s sharing to be{" "}
59
- <strong className="text-foreground/80">Anyone with the link</strong> or{" "}
60
- <strong className="text-foreground/80">Published to the web</strong>.
61
- </div>
62
- <div className="flex-1 relative bg-muted/30">
63
- <iframe
64
- key={embedUrl}
65
- src={embedUrl}
66
- className="absolute inset-0 w-full h-full border-0 bg-background"
67
- allow="clipboard-write; fullscreen"
68
- title={title}
69
- />
70
- </div>
71
- </div>
72
- );
73
- }
@@ -1,57 +0,0 @@
1
- "use client";
2
-
3
- import { Download, ExternalLink } from "lucide-react";
4
- import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
5
- import { Button } from "@/components/ui/button";
6
- import { withWs } from "@/lib/workspace-client";
7
-
8
- interface ImageViewerProps {
9
- path: string;
10
- title: string;
11
- }
12
-
13
- export function ImageViewer({ path, title }: ImageViewerProps) {
14
- const src = withWs(`/api/assets/${path}`);
15
- const filename = path.split("/").pop() || path;
16
- const ext = filename.includes(".")
17
- ? filename.split(".").pop()?.toUpperCase()
18
- : "IMG";
19
-
20
- return (
21
- <div className="flex-1 flex flex-col overflow-hidden">
22
- <ViewerToolbar path={path} badge={ext}>
23
- <Button
24
- variant="ghost"
25
- size="sm"
26
- className="h-7 gap-1.5 text-xs"
27
- onClick={() => {
28
- const a = document.createElement("a");
29
- a.href = src;
30
- a.download = filename;
31
- a.click();
32
- }}
33
- >
34
- <Download className="h-3.5 w-3.5" />
35
- Download
36
- </Button>
37
- <Button
38
- variant="ghost"
39
- size="sm"
40
- className="h-7 gap-1.5 text-xs"
41
- onClick={() => window.open(src, "_blank")}
42
- >
43
- <ExternalLink className="h-3.5 w-3.5" />
44
- Open in new tab
45
- </Button>
46
- </ViewerToolbar>
47
- <div className="flex-1 overflow-auto flex items-center justify-center bg-[#1a1a1a] p-8">
48
- <img
49
- src={src}
50
- alt={title}
51
- className="max-w-full max-h-full object-contain rounded-md shadow-lg"
52
- style={{ imageRendering: "auto" }}
53
- />
54
- </div>
55
- </div>
56
- );
57
- }
@@ -1,108 +0,0 @@
1
- "use client";
2
-
3
- import { Download, ExternalLink, FileWarning, FolderOpen } from "lucide-react";
4
- import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
5
- import { Button } from "@/components/ui/button";
6
- import { withWs, wsFetch } from "@/lib/workspace-client";
7
-
8
- interface LargeFileGateProps {
9
- path: string;
10
- size: number;
11
- /** Mount the real viewer. */
12
- onOpen: () => void;
13
- }
14
-
15
- function formatSize(bytes: number): string {
16
- if (bytes >= 1024 * 1024 * 1024)
17
- return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
18
- if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
19
- if (bytes >= 1024) return `${Math.round(bytes / 1024)} KB`;
20
- return `${bytes} B`;
21
- }
22
-
23
- /**
24
- * Confirmation shown before mounting a viewer that loads and renders a whole
25
- * large file. Sits above the viewer dispatch, so it guards every unsafe viewer
26
- * in one place. The user can open it anyway, download it, or open the raw bytes.
27
- */
28
- export function LargeFileGate({ path, size, onOpen }: LargeFileGateProps) {
29
- const assetUrl = withWs(`/api/assets/${path}`);
30
- const filename = path.split("/").pop() || path;
31
- const ext = filename.includes(".")
32
- ? filename.split(".").pop()?.toUpperCase()
33
- : "";
34
-
35
- const revealInFinder = async () => {
36
- try {
37
- await wsFetch("/api/system/reveal", {
38
- method: "POST",
39
- headers: { "Content-Type": "application/json" },
40
- body: JSON.stringify({ path }),
41
- });
42
- } catch {
43
- /* ignore */
44
- }
45
- };
46
-
47
- return (
48
- <div className="flex-1 flex flex-col overflow-hidden">
49
- <ViewerToolbar path={path} badge={ext || undefined} />
50
- <div className="flex-1 flex items-center justify-center">
51
- <div className="flex flex-col items-center gap-4 text-center max-w-sm">
52
- <div className="flex size-16 items-center justify-center rounded-2xl bg-amber-500/10">
53
- <FileWarning className="size-8 text-amber-500" />
54
- </div>
55
- <div className="space-y-1">
56
- <p className="text-sm font-medium">{filename}</p>
57
- <p className="text-xs text-muted-foreground">
58
- This file is {formatSize(size)}. Opening it in the viewer may
59
- freeze the tab while it loads and renders.
60
- </p>
61
- </div>
62
- <div className="flex flex-wrap items-center justify-center gap-2">
63
- <Button
64
- variant="default"
65
- size="sm"
66
- className="gap-2"
67
- onClick={onOpen}
68
- >
69
- Open anyway
70
- </Button>
71
- <Button
72
- variant="outline"
73
- size="sm"
74
- className="gap-2"
75
- onClick={() => window.open(assetUrl, "_blank")}
76
- >
77
- <ExternalLink className="h-4 w-4" />
78
- Raw
79
- </Button>
80
- <Button
81
- variant="outline"
82
- size="sm"
83
- className="gap-2"
84
- onClick={() => {
85
- const a = document.createElement("a");
86
- a.href = assetUrl;
87
- a.download = filename;
88
- a.click();
89
- }}
90
- >
91
- <Download className="h-4 w-4" />
92
- Download
93
- </Button>
94
- <Button
95
- variant="outline"
96
- size="sm"
97
- className="gap-2"
98
- onClick={revealInFinder}
99
- >
100
- <FolderOpen className="h-4 w-4" />
101
- Open in Finder
102
- </Button>
103
- </div>
104
- </div>
105
- </div>
106
- </div>
107
- );
108
- }