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,284 +0,0 @@
1
- "use client";
2
-
3
- import { memo, useEffect, useMemo, useState, type CSSProperties } from "react";
4
- import { useEditorStore } from "@/stores/editor-store";
5
- import { wsFetch } from "@/lib/workspace-client";
6
- import type { ActivityEvent } from "@/lib/proof/activity-shared";
7
-
8
- type ReviewCounts = Record<string, number>;
9
-
10
- type ActivityGroup = {
11
- path: string;
12
- filename: string;
13
- latestAt: string;
14
- events: ActivityEvent[];
15
- };
16
-
17
- function hashString(input: string): number {
18
- let hash = 0;
19
- for (let i = 0; i < input.length; i += 1) {
20
- hash = (hash * 31 + input.charCodeAt(i)) | 0;
21
- }
22
- return Math.abs(hash);
23
- }
24
-
25
- function agentLabel(agentId: string): string {
26
- const raw = agentId.split(/[:/]/).pop() ?? agentId;
27
- const compact = raw.replace(/[^a-z0-9]/gi, "");
28
- return (compact.slice(0, 2) || raw.slice(0, 2) || "??").toUpperCase();
29
- }
30
-
31
- function agentName(agentId: string): string {
32
- const raw = agentId.split(/[:/]/).pop() ?? agentId;
33
- return raw.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
34
- }
35
-
36
- function agentChipStyle(agentId: string): CSSProperties {
37
- const hue = hashString(agentId) % 360;
38
- return {
39
- backgroundColor: `hsl(${hue} 72% 42%)`,
40
- color: "white",
41
- };
42
- }
43
-
44
- function timeAgo(iso: string): string {
45
- const diffSeconds = Math.max(0, Math.round((Date.now() - new Date(iso).getTime()) / 1000));
46
- if (diffSeconds < 45) return "just now";
47
-
48
- const steps: Array<[number, Intl.RelativeTimeFormatUnit]> = [
49
- [60, "second"],
50
- [60, "minute"],
51
- [24, "hour"],
52
- [7, "day"],
53
- ];
54
- let value = diffSeconds;
55
- let unit: Intl.RelativeTimeFormatUnit = "second";
56
- for (const [step, nextUnit] of steps) {
57
- if (value < step) break;
58
- value = Math.floor(value / step);
59
- unit = nextUnit;
60
- }
61
-
62
- const rtf = new Intl.RelativeTimeFormat("en", { numeric: "always", style: "short" });
63
- return rtf.format(-value, unit).replace(/\s+/g, " ").replace(/\./g, "");
64
- }
65
-
66
- function blockCount(event: ActivityEvent): number {
67
- if (Array.isArray((event as { refs?: unknown }).refs)) {
68
- return ((event as { refs?: unknown[] }).refs ?? []).length;
69
- }
70
- return typeof (event as { ref?: unknown }).ref === "string" ? 1 : 0;
71
- }
72
-
73
- function summaryFor(event: ActivityEvent): string {
74
- const actor = agentName(event.by);
75
- const kind = event.type;
76
- const count = blockCount(event);
77
-
78
- if (kind === "block.append" || (kind === "block.inserted" && (event as { position?: string }).position === "end")) {
79
- return `${actor} appended ${count || 1} block${(count || 1) === 1 ? "" : "s"}`;
80
- }
81
- if (kind === "block.prepend" || (kind === "block.inserted" && (event as { position?: string }).position === "start")) {
82
- return `${actor} prepended ${count || 1} block${(count || 1) === 1 ? "" : "s"}`;
83
- }
84
- if (kind === "block.inserted") {
85
- return `${actor} inserted ${count || 1} block${(count || 1) === 1 ? "" : "s"}`;
86
- }
87
- if (kind === "block.replaced" || kind === "file.rawWritten") {
88
- return `${actor} edited`;
89
- }
90
- if (kind === "block.deleted") {
91
- return `${actor} deleted ${count || 1} block${(count || 1) === 1 ? "" : "s"}`;
92
- }
93
- if (kind === "suggestion.added") {
94
- return `${actor} suggested a change`;
95
- }
96
- if (kind === "suggestion.accepted") {
97
- return `${actor} accepted a suggestion`;
98
- }
99
- if (kind === "suggestion.rejected") {
100
- return `${actor} rejected a suggestion`;
101
- }
102
- if (kind === "comment.added") {
103
- return `${actor} commented`;
104
- }
105
- if (kind === "comment.replied") {
106
- return `${actor} replied`;
107
- }
108
- if (kind === "comment.resolved") {
109
- return `${actor} resolved a comment`;
110
- }
111
- if (kind === "comment.reopened") {
112
- return `${actor} reopened a comment`;
113
- }
114
- if (kind === "file.externallyEdited") {
115
- return `${actor} changed file externally`;
116
- }
117
- return `${actor} ${kind.replace(/^\w+\./, "").replace(/([a-z])([A-Z])/g, "$1 $2")}`;
118
- }
119
-
120
- function groupActivity(activity: ActivityEvent[]): ActivityGroup[] {
121
- const groups = new Map<string, ActivityEvent[]>();
122
- for (const event of activity) {
123
- const list = groups.get(event.path) ?? [];
124
- list.push(event);
125
- groups.set(event.path, list);
126
- }
127
-
128
- return Array.from(groups.entries())
129
- .map(([path, events]) => ({
130
- path,
131
- filename: path.split("/").pop() ?? path,
132
- latestAt: events[0]?.at ?? "",
133
- events,
134
- }))
135
- .sort((a, b) => (a.latestAt < b.latestAt ? 1 : -1));
136
- }
137
-
138
- function isMarkdownPath(path: string): boolean {
139
- return /\.(md|markdown)$/i.test(path);
140
- }
141
-
142
- async function fetchReviewCount(path: string): Promise<number> {
143
- if (!isMarkdownPath(path)) return 0;
144
-
145
- const endpoints = [`/api/agent/sidecar/${path}`, `/api/agent/files/${path}/pending`, `/api/agent/files/${path}`];
146
- for (const endpoint of endpoints) {
147
- try {
148
- const res = await wsFetch(endpoint);
149
- if (!res.ok) continue;
150
- const data = (await res.json()) as Record<string, unknown>;
151
-
152
- if (Array.isArray(data.pending)) return data.pending.length;
153
- if (Array.isArray(data.events) && endpoint.includes("/pending")) return data.events.length;
154
- if (typeof data.pendingCount === "number") return data.pendingCount;
155
- if (typeof data.count === "number") return data.count;
156
- if (typeof data.total === "number") return data.total;
157
- if (Array.isArray(data.suggestions) || Array.isArray(data.comments) || data.blockProvenance) {
158
- const suggestions = Array.isArray(data.suggestions)
159
- ? data.suggestions.filter(
160
- (item) => item && typeof item === "object" && (item as { status?: string }).status === "pending",
161
- ).length
162
- : 0;
163
- const comments = Array.isArray(data.comments)
164
- ? data.comments.filter(
165
- (item) => item && typeof item === "object" && !(item as { resolved?: boolean }).resolved,
166
- ).length
167
- : 0;
168
- const proofSpans = data.blockProvenance && typeof data.blockProvenance === "object"
169
- ? Object.keys(data.blockProvenance as Record<string, unknown>).length
170
- : 0;
171
- return suggestions + comments + proofSpans;
172
- }
173
- } catch {
174
- // Ignore fetch errors; review badge stays hidden.
175
- }
176
- }
177
- return 0;
178
- }
179
-
180
- function ActivityItemImpl({ event }: { event: ActivityEvent }) {
181
- return (
182
- <div className="flex items-start gap-2.5 rounded-md px-2 py-2 hover:bg-background/50">
183
- <div
184
- className="flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-[10px] font-semibold shadow-sm ring-1 ring-black/5"
185
- style={agentChipStyle(event.by)}
186
- title={event.by}
187
- aria-hidden
188
- >
189
- {agentLabel(event.by)}
190
- </div>
191
- <div className="min-w-0 flex-1">
192
- <p className="truncate text-xs text-foreground/85">
193
- {summaryFor(event)}
194
- </p>
195
- <p className="truncate text-[10px] text-muted-foreground">{timeAgo(event.at)}</p>
196
- </div>
197
- </div>
198
- );
199
- }
200
-
201
- const ActivityItem = memo(ActivityItemImpl);
202
-
203
- function ActivityGroupView({ group, reviewCount }: { group: ActivityGroup; reviewCount: number }) {
204
- const loadPage = useEditorStore((s) => s.loadPage);
205
- const latest = group.events[0];
206
-
207
- return (
208
- <section className="space-y-1.5 rounded-md border border-border/70 bg-background/50 p-2">
209
- <div className="flex items-start justify-between gap-2">
210
- <button
211
- type="button"
212
- onClick={() => void loadPage(group.path)}
213
- className="min-w-0 text-left"
214
- title={group.path}
215
- >
216
- <p className="truncate text-xs font-medium text-foreground/90">{group.filename}</p>
217
- <p className="truncate text-[10px] text-muted-foreground">{group.path}</p>
218
- </button>
219
- <div className="flex shrink-0 items-center gap-1.5">
220
- {reviewCount > 0 && (
221
- <button
222
- type="button"
223
- onClick={() => void loadPage(group.path)}
224
- className="inline-flex items-center rounded-full border border-amber-500/40 bg-amber-500/10 px-2 py-0.5 text-[10px] font-medium text-amber-700 hover:bg-amber-500/15"
225
- title="Open file for review"
226
- >
227
- review {reviewCount}
228
- </button>
229
- )}
230
- <span className="text-[10px] text-muted-foreground">{timeAgo(latest.at)}</span>
231
- </div>
232
- </div>
233
- <div className="space-y-0.5">
234
- {group.events.map((event) => (
235
- <ActivityItem key={`${event.path}-${event.id}`} event={event} />
236
- ))}
237
- </div>
238
- </section>
239
- );
240
- }
241
-
242
- export function ActivityFeed({ activity }: { activity: ActivityEvent[] }) {
243
- const groups = useMemo(() => groupActivity(activity), [activity]);
244
- const [reviewCounts, setReviewCounts] = useState<ReviewCounts>({});
245
-
246
- useEffect(() => {
247
- let cancelled = false;
248
- const paths = Array.from(new Set(groups.map((group) => group.path)));
249
- if (paths.length === 0) {
250
- setReviewCounts({});
251
- return () => {
252
- cancelled = true;
253
- };
254
- }
255
-
256
- void (async () => {
257
- const pairs = await Promise.all(
258
- paths.map(async (path) => [path, await fetchReviewCount(path)] as const),
259
- );
260
- if (cancelled) return;
261
- setReviewCounts(Object.fromEntries(pairs.filter(([, count]) => count > 0)));
262
- })();
263
-
264
- return () => {
265
- cancelled = true;
266
- };
267
- }, [groups]);
268
-
269
- if (groups.length === 0) {
270
- return <p className="py-2 text-xs text-muted-foreground/60">No events recorded</p>;
271
- }
272
-
273
- return (
274
- <div className="space-y-2">
275
- {groups.map((group) => (
276
- <ActivityGroupView
277
- key={group.path}
278
- group={group}
279
- reviewCount={reviewCounts[group.path] ?? 0}
280
- />
281
- ))}
282
- </div>
283
- );
284
- }
@@ -1,311 +0,0 @@
1
- "use client";
2
-
3
- import { useEffect, useCallback, useRef, useState } from "react";
4
- import { X, Copy, Check, Bot, Wifi, ExternalLink } from "lucide-react";
5
- import { Button } from "@/components/ui/button";
6
- import { useAIPanelStore } from "@/stores/ai-panel-store";
7
- import { TokenSection } from "./token-section";
8
- import { ActivityFeed } from "./activity-row";
9
- const SKILL_CLI = "npx skills add anh-chu/wiki-viewer/agents/wiki-viewer-skill";
10
-
11
- function useCopyCurl(currentPath: string | null) {
12
- const [copied, setCopied] = useState(false);
13
- const copy = useCallback(async () => {
14
- const origin =
15
- typeof window !== "undefined" ? window.location.origin : "http://localhost:3000";
16
- const filePath = currentPath ?? "<path/to/file.md>";
17
- // Registration-flow curl trace
18
- const curl = [
19
- `# 1. Register`,
20
- `REG=$(curl -s -X POST -H 'Content-Type: application/json' \\`,
21
- ` -d '{"id":"ai:claude","displayName":"Claude"}' \\`,
22
- ` ${origin}/api/agent/register)`,
23
- `REG_ID=$(echo $REG | jq -r .registrationId)`,
24
- ``,
25
- `# 2. Approve in AI Panel, then poll:`,
26
- `curl -s ${origin}/api/agent/register/$REG_ID`,
27
- `# → {"status":"approved","token":"..."}`,
28
- `TOKEN=<paste token here>`,
29
- ``,
30
- `# 3. Read snapshot`,
31
- `curl -s -H "Authorization: Bearer $TOKEN" \\`,
32
- ` -H "X-Agent-Id: ai:claude" \\`,
33
- ` ${origin}/api/agent/files/${filePath}`,
34
- ].join("\n");
35
- await navigator.clipboard.writeText(curl);
36
- setCopied(true);
37
- setTimeout(() => setCopied(false), 1500);
38
- }, [currentPath]);
39
- return { copied, copy };
40
- }
41
-
42
- function useCopyButton(getText: () => string): { copied: boolean; copy: () => Promise<void> } {
43
- const [copied, setCopied] = useState(false);
44
- const copy = useCallback(async () => {
45
- await navigator.clipboard.writeText(getText());
46
- setCopied(true);
47
- setTimeout(() => setCopied(false), 1500);
48
- }, [getText]);
49
- return { copied, copy };
50
- }
51
-
52
- export function AIPanel({ currentPath }: { currentPath?: string | null }) {
53
- const isOpen = useAIPanelStore((s) => s.isOpen);
54
- const close = useAIPanelStore((s) => s.close);
55
- const activity = useAIPanelStore((s) => s.activity);
56
- const connections = useAIPanelStore((s) => s.connections);
57
- const loadActivity = useAIPanelStore((s) => s.loadActivity);
58
- const { copied, copy } = useCopyCurl(currentPath ?? null);
59
- const [bootstrapPrompt, setBootstrapPrompt] = useState<string>("");
60
- const panelRef = useRef<HTMLElement>(null);
61
-
62
- const origin =
63
- typeof window !== "undefined" ? window.location.origin : "http://localhost:3000";
64
- const getSkillCli = useCallback(() => SKILL_CLI, []);
65
- const getBootstrapPrompt = useCallback(
66
- () => bootstrapPrompt.replace(/\$WIKI_URL/g, origin),
67
- [bootstrapPrompt, origin]
68
- );
69
- const getMcpRegister = useCallback(
70
- () =>
71
- `npx wiki-viewer-mcp register --url ${origin} --id ai:myagent --name "My Agent"`,
72
- [origin]
73
- );
74
- const getMcpJson = useCallback(
75
- () =>
76
- JSON.stringify(
77
- {
78
- servers: {
79
- "wiki-viewer": {
80
- command: "npx",
81
- args: ["wiki-viewer-mcp"],
82
- env: {
83
- WIKI_VIEWER_URL: origin,
84
- WIKI_VIEWER_TOKEN: "<token from register>",
85
- WIKI_VIEWER_AGENT_ID: "ai:myagent",
86
- },
87
- },
88
- },
89
- },
90
- null,
91
- 2
92
- ),
93
- [origin]
94
- );
95
- const skillCli = useCopyButton(getSkillCli);
96
- const bootstrapCopy = useCopyButton(getBootstrapPrompt);
97
- const mcpRegister = useCopyButton(getMcpRegister);
98
- const mcpJson = useCopyButton(getMcpJson);
99
-
100
- // Keyboard: Esc closes
101
- useEffect(() => {
102
- if (!isOpen) return;
103
- function onKey(e: KeyboardEvent) {
104
- if (e.key === "Escape") close();
105
- }
106
- document.addEventListener("keydown", onKey);
107
- return () => document.removeEventListener("keydown", onKey);
108
- }, [isOpen, close]);
109
-
110
- // Focus trap: focus panel when open
111
- useEffect(() => {
112
- if (isOpen) panelRef.current?.focus();
113
- }, [isOpen]);
114
-
115
- // Poll while open
116
- useEffect(() => {
117
- if (!isOpen) return;
118
- void loadActivity();
119
- const id = setInterval(() => void loadActivity(), 10_000);
120
- return () => clearInterval(id);
121
- }, [isOpen, loadActivity]);
122
-
123
- // Fetch install JSON once on open for live bootstrap prompt
124
- useEffect(() => {
125
- if (!isOpen) return;
126
- void fetch("/api/agents/install")
127
- .then((r) => r.json())
128
- .then((d: { bootstrapPrompt?: string }) => {
129
- if (d.bootstrapPrompt) setBootstrapPrompt(d.bootstrapPrompt);
130
- })
131
- .catch(() => undefined);
132
- }, [isOpen]);
133
-
134
- if (!isOpen) return null;
135
-
136
- return (
137
- <>
138
- {/* Backdrop */}
139
- <div
140
- className="fixed inset-0 z-40 bg-overlay backdrop-blur-[1px]"
141
- onClick={close}
142
- aria-hidden
143
- />
144
-
145
- {/* Panel */}
146
- <aside
147
- ref={panelRef}
148
- tabIndex={-1}
149
- role="dialog"
150
- aria-modal="true"
151
- aria-label="AI Agent Panel"
152
- className="fixed right-0 top-0 bottom-0 z-50 flex w-[90vw] max-w-sm md:w-80 flex-col border-l border-border bg-background shadow-xl outline-none"
153
- >
154
- {/* Header */}
155
- <div className="flex items-center justify-between border-b border-border px-4 py-3 shrink-0">
156
- <div className="flex items-center gap-2">
157
- <Bot className="h-4 w-4 text-muted-foreground" />
158
- <span className="text-sm font-semibold">AI Agent</span>
159
- </div>
160
- <Button
161
- size="sm"
162
- variant="ghost"
163
- className="h-7 w-7 p-0"
164
- onClick={close}
165
- title="Close panel (Esc)"
166
- >
167
- <X className="h-3.5 w-3.5" />
168
- </Button>
169
- </div>
170
-
171
- {/* Scrollable body */}
172
- <div className="flex-1 overflow-y-auto space-y-5 px-4 py-4">
173
- {/* What this does — one line */}
174
- <section className="rounded-md border border-border bg-muted/30 p-3">
175
- <p className="text-sm font-medium text-foreground">
176
- Work with this wiki using AI
177
- </p>
178
- <p className="mt-1 text-xs leading-relaxed text-muted-foreground">
179
- Connect Claude, Cursor, ChatGPT, and more. Pick by what you want —
180
- each option gives a copy-paste setup. You approve every assistant
181
- in <span className="font-medium text-foreground/80">Agents</span> below before it gets access.
182
- </p>
183
- </section>
184
-
185
- {/* Choose by goal */}
186
- <section className="space-y-3">
187
- {/* Goal 1: collaborate (one-off instructions + permanent skill) */}
188
- <div className="rounded-md border border-border bg-muted/40 p-3 space-y-1.5">
189
- <p className="text-xs font-semibold text-foreground">
190
- Co-write docs with you
191
- </p>
192
- <p className="text-[10px] text-muted-foreground/70">
193
- Edits arrive as suggestions with comments you accept or revert.
194
- No MCP needed.
195
- </p>
196
- <Button size="sm" variant="outline" className="h-7 w-full text-xs gap-1.5" onClick={() => void bootstrapCopy.copy()} disabled={!bootstrapPrompt}>
197
- {bootstrapCopy.copied
198
- ? <><Check className="h-3.5 w-3.5 text-green-500" /> Copied!</>
199
- : <><Copy className="h-3.5 w-3.5" /> Paste into any chatbot</>}
200
- </Button>
201
- <p className="text-[10px] text-muted-foreground/50 pt-1">
202
- Or install once so it sticks{" "}
203
- <span className="text-muted-foreground/40">· Claude, OpenCode</span>:
204
- </p>
205
- <div className="flex items-center gap-2">
206
- <code className="flex-1 text-[10px] font-mono text-foreground/80 truncate bg-muted rounded px-1 py-0.5">
207
- {SKILL_CLI}
208
- </code>
209
- <Button size="sm" variant="ghost" className="h-6 w-6 p-0 shrink-0" title="Copy this command" onClick={() => void skillCli.copy()}>
210
- {skillCli.copied ? <Check className="h-3.5 w-3.5 text-green-500" /> : <Copy className="h-3.5 w-3.5" />}
211
- </Button>
212
- </div>
213
- </div>
214
-
215
- {/* Goal 2: raw filework */}
216
- <div className="rounded-md border border-border bg-muted/40 p-3 space-y-1.5">
217
- <p className="text-xs font-semibold text-foreground">
218
- Edit files directly{" "}
219
- <span className="font-normal text-muted-foreground/60">· Claude Code, Cursor, Codex</span>
220
- </p>
221
- <p className="text-[10px] text-muted-foreground/70">
222
- Native read / search / edit tools over MCP. Run to request access:
223
- </p>
224
- <div className="flex items-center gap-2">
225
- <code className="flex-1 text-[10px] font-mono text-foreground/80 truncate bg-muted rounded px-1 py-0.5">
226
- {getMcpRegister()}
227
- </code>
228
- <Button size="sm" variant="ghost" className="h-6 w-6 p-0 shrink-0" title="Copy this command" onClick={() => void mcpRegister.copy()}>
229
- {mcpRegister.copied ? <Check className="h-3.5 w-3.5 text-green-500" /> : <Copy className="h-3.5 w-3.5" />}
230
- </Button>
231
- </div>
232
- <p className="text-[10px] text-muted-foreground/50">Approve in <span className="font-medium text-foreground/70">Agents</span>, then add to your tool:</p>
233
- <Button size="sm" variant="outline" className="h-7 w-full text-xs gap-1.5" onClick={() => void mcpJson.copy()}>
234
- {mcpJson.copied
235
- ? <><Check className="h-3.5 w-3.5 text-green-500" /> Copied!</>
236
- : <><Copy className="h-3.5 w-3.5" /> Copy config (mcp.json)</>}
237
- </Button>
238
- </div>
239
-
240
- <div className="flex flex-wrap items-center gap-x-3 gap-y-1">
241
- <span className="text-[10px] text-muted-foreground/50">For developers:</span>
242
- <button type="button" onClick={() => void copy()} className="inline-flex items-center gap-1 text-[10px] text-primary hover:underline">
243
- {copied ? <Check className="h-3 w-3 text-green-500" /> : <Copy className="h-3 w-3" />} curl example
244
- </button>
245
- <a href="/api/agents/skill" target="_blank" rel="noreferrer" className="inline-flex items-center gap-1 text-[10px] text-primary hover:underline">
246
- <ExternalLink className="h-3 w-3" /> skill
247
- </a>
248
- <a href="/api/agents/install" target="_blank" rel="noreferrer" className="inline-flex items-center gap-1 text-[10px] text-primary hover:underline">
249
- <ExternalLink className="h-3 w-3" /> install JSON
250
- </a>
251
- </div>
252
- </section>
253
-
254
- {/* Token / Agents */}
255
- <TokenSection />
256
-
257
- {/* Active connections */}
258
- <section className="space-y-2">
259
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
260
- Active Connections{" "}
261
- <span className="normal-case font-normal text-muted-foreground/50">
262
- (last 5 min)
263
- </span>
264
- </h3>
265
- <div className="rounded-md border border-border bg-muted/40 p-3">
266
- {connections.length === 0 ? (
267
- <p className="text-xs text-muted-foreground/60 flex items-center gap-1.5">
268
- <Wifi className="h-3.5 w-3.5" />
269
- No recent activity
270
- </p>
271
- ) : (
272
- <ul className="space-y-1.5">
273
- {connections.map((c) => (
274
- <li key={c.by} className="flex items-center justify-between text-xs">
275
- <span className="font-mono text-foreground/80 truncate">{c.by}</span>
276
- <span className="text-muted-foreground shrink-0">
277
- {c.opCount} op{c.opCount !== 1 ? "s" : ""}
278
- </span>
279
- </li>
280
- ))}
281
- </ul>
282
- )}
283
- </div>
284
- </section>
285
-
286
- {/* Recent activity */}
287
- <section className="space-y-2">
288
- <h3 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
289
- Recent Activity
290
- </h3>
291
- <div className="rounded-md border border-border bg-muted/40 px-3 py-2 max-h-72 overflow-y-auto">
292
- <ActivityFeed activity={activity} />
293
- </div>
294
- </section>
295
-
296
- {/* Docs link */}
297
- <section>
298
- <a
299
- href="/docs/agent-collab-plan.md"
300
- target="_blank"
301
- rel="noreferrer"
302
- className="text-xs text-primary underline hover:no-underline"
303
- >
304
- Agent collaboration docs →
305
- </a>
306
- </section>
307
- </div>
308
- </aside>
309
- </>
310
- );
311
- }