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,93 +0,0 @@
1
- "use client";
2
-
3
- import { Loader2 } from "lucide-react";
4
- import { wsFetch } from "@/lib/workspace-client";
5
- import { useEffect, useRef, useState } from "react";
6
- import { OfficeChrome } from "./office-chrome";
7
-
8
- interface Props {
9
- path: string;
10
- title: string;
11
- }
12
-
13
- export function DocxViewer({ path, title }: Props) {
14
- const containerRef = useRef<HTMLDivElement | null>(null);
15
- const [loading, setLoading] = useState(true);
16
- const [error, setError] = useState<string | null>(null);
17
-
18
- useEffect(() => {
19
- let cancelled = false;
20
- const container = containerRef.current;
21
- if (!container) return;
22
-
23
- // Clear any previous render
24
- container.innerHTML = "";
25
-
26
- (async () => {
27
- setLoading(true);
28
- setError(null);
29
- try {
30
- const [{ renderAsync }, res] = await Promise.all([
31
- import("docx-preview"),
32
- wsFetch(`/api/assets/${path}`),
33
- ]);
34
- if (cancelled) return;
35
- if (!res.ok) throw new Error(`Failed to load file (${res.status})`);
36
- const blob = await res.blob();
37
- if (cancelled) return;
38
- await renderAsync(blob, container, undefined, {
39
- className: "docx-rendered",
40
- inWrapper: true,
41
- ignoreWidth: false,
42
- ignoreHeight: false,
43
- breakPages: true,
44
- renderHeaders: true,
45
- renderFooters: true,
46
- renderFootnotes: true,
47
- experimental: true,
48
- useBase64URL: true,
49
- });
50
- if (!cancelled) setLoading(false);
51
- } catch (err) {
52
- if (!cancelled) {
53
- setError(
54
- err instanceof Error ? err.message : "Failed to render document",
55
- );
56
- setLoading(false);
57
- }
58
- }
59
- })();
60
-
61
- return () => {
62
- cancelled = true;
63
- };
64
- }, [path]);
65
-
66
- return (
67
- <div className="flex-1 flex flex-col overflow-hidden">
68
- <OfficeChrome path={path} title={title} extLabel="DOCX" />
69
- <div className="flex-1 overflow-y-auto bg-muted/30">
70
- {loading && !error && (
71
- <div className="h-full flex items-center justify-center text-muted-foreground">
72
- <Loader2 className="h-5 w-5 animate-spin mr-2" />
73
- Rendering document…
74
- </div>
75
- )}
76
- {error && (
77
- <div className="h-full flex items-center justify-center">
78
- <div className="text-center space-y-2">
79
- <p className="text-sm text-destructive">{error}</p>
80
- <p className="text-xs text-muted-foreground">
81
- Try downloading the file and opening it externally.
82
- </p>
83
- </div>
84
- </div>
85
- )}
86
- <div
87
- ref={containerRef}
88
- className="docx-viewer-body mx-auto max-w-5xl py-6 px-4"
89
- />
90
- </div>
91
- </div>
92
- );
93
- }
@@ -1,83 +0,0 @@
1
- "use client";
2
-
3
- import { Download, ExternalLink, 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 OfficeChromeProps {
9
- path: string;
10
- title: string;
11
- extLabel: string;
12
- /** Optional external "open in source" action (e.g. Open in Google). */
13
- external?: { label: string; href: string };
14
- /** Hide the "Open in Finder" button (useful for Google embeds that aren't on disk). */
15
- hideFinder?: boolean;
16
- }
17
-
18
- export function OfficeChrome({
19
- path,
20
- extLabel,
21
- external,
22
- hideFinder,
23
- }: OfficeChromeProps) {
24
- const assetUrl = withWs(`/api/assets/${path}`);
25
- const filename = path.split("/").pop() || path;
26
-
27
- const revealInFinder = async () => {
28
- try {
29
- await wsFetch("/api/system/reveal", {
30
- method: "POST",
31
- headers: { "Content-Type": "application/json" },
32
- body: JSON.stringify({ path }),
33
- });
34
- } catch {
35
- /* ignore */
36
- }
37
- };
38
-
39
- return (
40
- <ViewerToolbar path={path} badge={extLabel || undefined}>
41
- {external && (
42
- <a
43
- href={external.href}
44
- target="_blank"
45
- rel="noreferrer noopener"
46
- className="inline-flex items-center gap-1.5 text-[11px] h-7 px-2.5 rounded-md border border-border hover:bg-accent transition-colors"
47
- >
48
- <ExternalLink className="h-3.5 w-3.5" />
49
- {external.label}
50
- </a>
51
- )}
52
- {!hideFinder && (
53
- <Button
54
- variant="outline"
55
- size="sm"
56
- className="gap-1.5 text-[11px] h-7"
57
- onClick={revealInFinder}
58
- title="Open in Finder"
59
- >
60
- <FolderOpen className="h-3.5 w-3.5" />
61
- Reveal
62
- </Button>
63
- )}
64
- {!hideFinder && (
65
- <Button
66
- variant="outline"
67
- size="sm"
68
- className="gap-1.5 text-[11px] h-7"
69
- onClick={() => {
70
- const a = document.createElement("a");
71
- a.href = assetUrl;
72
- a.download = filename;
73
- a.click();
74
- }}
75
- title="Download original"
76
- >
77
- <Download className="h-3.5 w-3.5" />
78
- Download
79
- </Button>
80
- )}
81
- </ViewerToolbar>
82
- );
83
- }
@@ -1,104 +0,0 @@
1
- "use client";
2
-
3
- import { Loader2 } from "lucide-react";
4
- import { wsFetch } from "@/lib/workspace-client";
5
- import { useEffect, useRef, useState } from "react";
6
- import { OfficeChrome } from "./office-chrome";
7
-
8
- interface Props {
9
- path: string;
10
- title: string;
11
- }
12
-
13
- export function PptxViewer({ path, title }: Props) {
14
- const containerRef = useRef<HTMLDivElement | null>(null);
15
- const [loading, setLoading] = useState(true);
16
- const [error, setError] = useState<string | null>(null);
17
-
18
- useEffect(() => {
19
- let cancelled = false;
20
- const container = containerRef.current;
21
- if (!container) return;
22
- container.innerHTML = "";
23
-
24
- let previewer: { destroy?: () => void } | null = null;
25
-
26
- (async () => {
27
- setLoading(true);
28
- setError(null);
29
- try {
30
- const [{ init }, res] = await Promise.all([
31
- import("pptx-preview"),
32
- wsFetch(`/api/assets/${path}`),
33
- ]);
34
- if (cancelled) return;
35
- if (!res.ok) throw new Error(`Failed to load file (${res.status})`);
36
- const buf = await res.arrayBuffer();
37
- if (cancelled) return;
38
-
39
- const width = container.clientWidth || 960;
40
- const height = Math.round((width * 9) / 16);
41
- previewer = init(container, {
42
- width,
43
- height,
44
- mode: "list",
45
- }) as unknown as {
46
- destroy?: () => void;
47
- preview: (buf: ArrayBuffer) => Promise<unknown>;
48
- };
49
- await (
50
- previewer as unknown as {
51
- preview: (b: ArrayBuffer) => Promise<unknown>;
52
- }
53
- ).preview(buf);
54
- if (!cancelled) setLoading(false);
55
- } catch (err) {
56
- if (!cancelled) {
57
- setError(
58
- err instanceof Error
59
- ? err.message
60
- : "Failed to render presentation",
61
- );
62
- setLoading(false);
63
- }
64
- }
65
- })();
66
-
67
- return () => {
68
- cancelled = true;
69
- try {
70
- previewer?.destroy?.();
71
- } catch {
72
- /* ignore */
73
- }
74
- };
75
- }, [path]);
76
-
77
- return (
78
- <div className="flex-1 flex flex-col overflow-hidden">
79
- <OfficeChrome path={path} title={title} extLabel="PPTX" />
80
- <div className="flex-1 overflow-auto bg-muted/30 py-4">
81
- {loading && !error && (
82
- <div className="h-[60vh] flex items-center justify-center text-muted-foreground">
83
- <Loader2 className="h-5 w-5 animate-spin mr-2" />
84
- Rendering slides…
85
- </div>
86
- )}
87
- {error && (
88
- <div className="h-[60vh] flex items-center justify-center">
89
- <div className="text-center space-y-2">
90
- <p className="text-sm text-destructive">{error}</p>
91
- <p className="text-xs text-muted-foreground">
92
- Try downloading the file and opening it externally.
93
- </p>
94
- </div>
95
- </div>
96
- )}
97
- <div
98
- ref={containerRef}
99
- className="pptx-viewer-body mx-auto max-w-5xl px-4"
100
- />
101
- </div>
102
- </div>
103
- );
104
- }
@@ -1,192 +0,0 @@
1
- "use client";
2
-
3
- import { Loader2 } from "lucide-react";
4
- import { wsFetch } from "@/lib/workspace-client";
5
- import { useEffect, useMemo, useRef, useState } from "react";
6
- import { cn } from "@/lib/utils";
7
- import { OfficeChrome } from "./office-chrome";
8
-
9
- interface Props {
10
- path: string;
11
- title: string;
12
- }
13
-
14
- interface Sheet {
15
- name: string;
16
- // Built lazily on first view; sheet_to_html over a huge sheet freezes the tab.
17
- html: string | null;
18
- rows: number; // total rows, for the truncation banner
19
- truncated: boolean;
20
- }
21
-
22
- // Sheets longer than this are clamped before conversion to cap DOM size.
23
- const MAX_ROWS = 2000;
24
-
25
- export function XlsxViewer({ path, title }: Props) {
26
- const [sheets, setSheets] = useState<Sheet[] | null>(null);
27
- const [active, setActive] = useState(0);
28
- const [loading, setLoading] = useState(true);
29
- const [error, setError] = useState<string | null>(null);
30
- const wbRef = useRef<{
31
- wb: import("xlsx").WorkBook;
32
- toHtml: (ws: import("xlsx").WorkSheet) => {
33
- html: string;
34
- rows: number;
35
- truncated: boolean;
36
- };
37
- } | null>(null);
38
-
39
- // Build the active sheet's HTML the first time it is viewed.
40
- useEffect(() => {
41
- if (!sheets || !wbRef.current) return;
42
- const s = sheets[active];
43
- if (!s || s.html !== null) return;
44
- const { wb, toHtml } = wbRef.current;
45
- const r = toHtml(wb.Sheets[s.name]);
46
- setSheets((prev) => {
47
- if (!prev) return prev;
48
- const next = [...prev];
49
- next[active] = {
50
- ...next[active],
51
- html: r.html,
52
- rows: r.rows,
53
- truncated: r.truncated,
54
- };
55
- return next;
56
- });
57
- }, [sheets, active]);
58
-
59
- useEffect(() => {
60
- let cancelled = false;
61
- setLoading(true);
62
- setError(null);
63
- setSheets(null);
64
- (async () => {
65
- try {
66
- const [XLSX, res] = await Promise.all([
67
- import("xlsx"),
68
- wsFetch(`/api/assets/${path}`),
69
- ]);
70
- if (cancelled) return;
71
- if (!res.ok) throw new Error(`Failed to load file (${res.status})`);
72
- const buf = await res.arrayBuffer();
73
- if (cancelled) return;
74
- const wb = XLSX.read(buf, {
75
- type: "array",
76
- cellDates: true,
77
- cellStyles: true,
78
- });
79
- // Convert one worksheet to HTML, clamping its row range to MAX_ROWS.
80
- // Returns the HTML plus whether it was truncated and the true row
81
- // count. Kept here so it closes over the dynamically-imported XLSX.
82
- // sheet_to_html has no range option; it honors the sheet's own !ref.
83
- // For oversized sheets we shrink a copied !ref so only MAX_ROWS emit.
84
- const toHtml = (ws: import("xlsx").WorkSheet) => {
85
- const ref = ws["!ref"];
86
- const range = ref ? XLSX.utils.decode_range(ref) : null;
87
- const totalRows = range ? range.e.r - range.s.r + 1 : 0;
88
- if (!range || totalRows <= MAX_ROWS) {
89
- return {
90
- html: XLSX.utils.sheet_to_html(ws, { editable: false }),
91
- rows: totalRows,
92
- truncated: false,
93
- };
94
- }
95
- const clampedWs = {
96
- ...ws,
97
- "!ref": XLSX.utils.encode_range({
98
- s: range.s,
99
- e: { r: range.s.r + MAX_ROWS - 1, c: range.e.c },
100
- }),
101
- };
102
- return {
103
- html: XLSX.utils.sheet_to_html(clampedWs, { editable: false }),
104
- rows: totalRows,
105
- truncated: true,
106
- };
107
- };
108
- if (cancelled) return;
109
- // Sheets render lazily via the active-sheet effect, so start them empty.
110
- wbRef.current = { wb, toHtml };
111
- setSheets(
112
- wb.SheetNames.map((name) => ({
113
- name,
114
- html: null,
115
- rows: 0,
116
- truncated: false,
117
- })),
118
- );
119
- setActive(0);
120
- setLoading(false);
121
- } catch (err) {
122
- if (!cancelled) {
123
- setError(
124
- err instanceof Error ? err.message : "Failed to parse spreadsheet",
125
- );
126
- setLoading(false);
127
- }
128
- }
129
- })();
130
- return () => {
131
- cancelled = true;
132
- };
133
- }, [path]);
134
-
135
- const current = useMemo(() => sheets?.[active] ?? null, [sheets, active]);
136
-
137
- return (
138
- <div className="flex-1 flex flex-col overflow-hidden">
139
- <OfficeChrome path={path} title={title} extLabel="XLSX" />
140
- {sheets && sheets.length > 1 && (
141
- <div className="flex items-center gap-0.5 border-b border-border bg-muted/40 px-2 overflow-x-auto scrollbar-none">
142
- {sheets.map((s, i) => (
143
- <button
144
- key={s.name + i}
145
- type="button"
146
- onClick={() => setActive(i)}
147
- className={cn(
148
- "px-3 py-1.5 text-[12px] rounded-t whitespace-nowrap transition-colors",
149
- i === active
150
- ? "bg-background text-foreground font-medium border-t border-x border-border -mb-px"
151
- : "text-muted-foreground hover:text-foreground",
152
- )}
153
- >
154
- {s.name}
155
- </button>
156
- ))}
157
- </div>
158
- )}
159
- <div className="flex-1 overflow-auto">
160
- {loading && !error && (
161
- <div className="h-full flex items-center justify-center text-muted-foreground">
162
- <Loader2 className="h-5 w-5 animate-spin mr-2" />
163
- Parsing spreadsheet…
164
- </div>
165
- )}
166
- {error && (
167
- <div className="h-full flex items-center justify-center">
168
- <div className="text-center space-y-2">
169
- <p className="text-sm text-destructive">{error}</p>
170
- <p className="text-xs text-muted-foreground">
171
- Try downloading the file and opening it externally.
172
- </p>
173
- </div>
174
- </div>
175
- )}
176
- {current?.truncated && (
177
- <div className="px-3 py-2 text-[11px] text-amber-600 dark:text-amber-400 border-b border-border">
178
- Large sheet ({current.rows.toLocaleString()} rows). Showing first{" "}
179
- {MAX_ROWS.toLocaleString()} for performance. Download the file to
180
- see everything.
181
- </div>
182
- )}
183
- {current?.html != null && (
184
- <div
185
- className="xlsx-sheet p-3 text-[12px]"
186
- dangerouslySetInnerHTML={{ __html: current.html }}
187
- />
188
- )}
189
- </div>
190
- </div>
191
- );
192
- }
@@ -1,32 +0,0 @@
1
- "use client";
2
-
3
- import { 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 PdfViewerProps {
9
- path: string;
10
- title: string;
11
- }
12
-
13
- export function PdfViewer({ path, title }: PdfViewerProps) {
14
- const pdfSrc = withWs(`/api/assets/${path}`);
15
-
16
- return (
17
- <div className="flex-1 flex flex-col overflow-hidden">
18
- <ViewerToolbar path={path} badge="PDF">
19
- <Button
20
- variant="ghost"
21
- size="sm"
22
- className="h-7 gap-1.5 text-xs"
23
- onClick={() => window.open(pdfSrc, "_blank")}
24
- >
25
- <ExternalLink className="h-3.5 w-3.5" />
26
- Open in new tab
27
- </Button>
28
- </ViewerToolbar>
29
- <iframe src={pdfSrc} className="flex-1 w-full border-0" title={title} />
30
- </div>
31
- );
32
- }
@@ -1,162 +0,0 @@
1
- "use client";
2
-
3
- import * as Popover from "@radix-ui/react-popover";
4
- import { useEffect, useState } from "react";
5
- import { authHeaders } from "@/lib/proof/client-auth";
6
- import { wsFetch } from "@/lib/workspace-client";
7
-
8
- interface SpanMeta {
9
- spanId: string;
10
- origin: string | null;
11
- basis: string | null;
12
- basisDetail: string | null;
13
- by: string | null;
14
- at: string | null;
15
- }
16
-
17
- function readMeta(el: HTMLElement): SpanMeta {
18
- return {
19
- spanId: el.getAttribute("id") ?? "",
20
- origin: el.getAttribute("origin"),
21
- basis: el.getAttribute("basis"),
22
- basisDetail: el.getAttribute("basis-detail"),
23
- by: el.getAttribute("by"),
24
- at: el.getAttribute("at"),
25
- };
26
- }
27
-
28
- function timeAgo(iso: string | null): string {
29
- if (!iso) return "";
30
- const diff = Date.now() - new Date(iso).getTime();
31
- const secs = Math.floor(diff / 1000);
32
- if (secs < 60) return `${secs}s ago`;
33
- const mins = Math.floor(secs / 60);
34
- if (mins < 60) return `${mins}m ago`;
35
- const hrs = Math.floor(mins / 60);
36
- if (hrs < 24) return `${hrs}h ago`;
37
- return `${Math.floor(hrs / 24)}d ago`;
38
- }
39
-
40
- interface Props {
41
- targetEl: HTMLElement | null;
42
- path: string;
43
- onClose: () => void;
44
- onComment?: () => void;
45
- }
46
-
47
- export function ProofSpanPopover({ targetEl, path, onClose, onComment }: Props) {
48
- const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null);
49
- const [meta, setMeta] = useState<SpanMeta | null>(null);
50
- const [busy, setBusy] = useState(false);
51
-
52
- useEffect(() => {
53
- if (!targetEl) {
54
- setAnchor(null);
55
- setMeta(null);
56
- return;
57
- }
58
- const rect = targetEl.getBoundingClientRect();
59
- setAnchor({ top: rect.bottom + window.scrollY + 4, left: rect.left + window.scrollX });
60
- setMeta(readMeta(targetEl));
61
- }, [targetEl]);
62
-
63
- useEffect(() => {
64
- if (!targetEl) return;
65
- const onKey = (e: KeyboardEvent) => {
66
- if (e.key === "Escape") onClose();
67
- };
68
- window.addEventListener("keydown", onKey);
69
- return () => window.removeEventListener("keydown", onKey);
70
- }, [targetEl, onClose]);
71
-
72
- if (!targetEl || !anchor || !meta) return null;
73
-
74
- async function sendAction(action: "accept" | "revert") {
75
- if (busy || !meta) return;
76
- setBusy(true);
77
- try {
78
- await wsFetch("/api/agent/internal/span", {
79
- method: "POST",
80
- headers: { "Content-Type": "application/json", ...authHeaders() },
81
- body: JSON.stringify({
82
- path,
83
- spanId: meta.spanId,
84
- action,
85
- idempotencyKey: crypto.randomUUID(),
86
- }),
87
- });
88
- } finally {
89
- setBusy(false);
90
- onClose();
91
- }
92
- }
93
-
94
- return (
95
- <Popover.Root open>
96
- <Popover.Anchor asChild>
97
- <span
98
- aria-hidden="true"
99
- style={{
100
- position: "fixed",
101
- top: anchor.top,
102
- left: anchor.left,
103
- width: 0,
104
- height: 0,
105
- pointerEvents: "none",
106
- }}
107
- />
108
- </Popover.Anchor>
109
- <Popover.Portal>
110
- <Popover.Content
111
- side="bottom"
112
- align="start"
113
- sideOffset={4}
114
- collisionPadding={8}
115
- onInteractOutside={onClose}
116
- className="z-50 w-[min(16rem,calc(100vw-1rem))] bg-popover border border-border rounded-lg shadow-xl p-3 space-y-2 text-[12px] focus:outline-none"
117
- >
118
- <div className="space-y-0.5">
119
- <p className="font-medium text-foreground truncate">
120
- {meta.by ?? "unknown"} · {meta.basis ?? "—"} · {timeAgo(meta.at)}
121
- </p>
122
- {meta.basisDetail && (
123
- <p className="text-muted-foreground italic truncate">
124
- &ldquo;{meta.basisDetail}&rdquo;
125
- </p>
126
- )}
127
- {meta.origin && (
128
- <p className="text-muted-foreground/60">origin: {meta.origin}</p>
129
- )}
130
- </div>
131
- <div className="flex items-center gap-1.5 pt-1">
132
- <button
133
- type="button"
134
- disabled={busy}
135
- onClick={() => void sendAction("accept")}
136
- className="flex-1 py-1 rounded-md bg-primary text-primary-foreground text-[11px] font-medium hover:bg-primary/90 disabled:opacity-50 transition-colors"
137
- >
138
- Accept
139
- </button>
140
- <button
141
- type="button"
142
- disabled={busy}
143
- onClick={() => void sendAction("revert")}
144
- className="flex-1 py-1 rounded-md border border-border text-[11px] font-medium hover:bg-accent disabled:opacity-50 transition-colors"
145
- >
146
- Revert
147
- </button>
148
- <button
149
- type="button"
150
- disabled={busy}
151
- onClick={() => { onComment?.(); onClose(); }}
152
- className="flex-1 py-1 rounded-md border border-border text-[11px] font-medium hover:bg-accent disabled:opacity-50 transition-colors"
153
- >
154
- Comment
155
- </button>
156
- </div>
157
- <Popover.Arrow className="fill-border" />
158
- </Popover.Content>
159
- </Popover.Portal>
160
- </Popover.Root>
161
- );
162
- }