wiki-viewer 1.14.1 → 2.0.0

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 (559) 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/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  13. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  14. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/.next/standalone/.next/server/app/api/agent/activity/route.js +6 -6
  20. package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js +8 -8
  22. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js +9 -9
  24. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js +8 -8
  26. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js +8 -8
  28. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js +8 -8
  30. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js +9 -9
  32. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js +8 -8
  34. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/agent/settings/route.js +7 -7
  36. package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js +6 -6
  38. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js +5 -5
  41. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/share/[token]/route.js +6 -5
  43. package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/share/route.js +4 -4
  45. package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/system/browse/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/system/clear-root/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/system/reveal/route.js +6 -6
  49. package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/system/root-status/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/system/set-root/route.js +6 -5
  52. package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js +5 -4
  54. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js +6 -5
  56. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js +5 -4
  58. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/system/workspaces/route.js +7 -6
  60. package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js +5 -5
  62. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/wiki/app/route.js +7 -7
  64. package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js +7 -7
  66. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/wiki/content/route.js +7 -7
  68. package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/api/wiki/download/route.js +6 -6
  70. package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/wiki/file/route.js +5 -5
  72. package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/wiki/folder/route.js +5 -5
  74. package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js +4 -4
  76. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js +6 -6
  78. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js +4 -4
  80. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js +4 -4
  82. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js +4 -4
  84. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js +8 -8
  86. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/wiki/move/route.js +6 -6
  88. package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js +5 -5
  90. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js +7 -7
  92. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/wiki/page/route.js +5 -5
  94. package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/wiki/presence/route.js +6 -6
  96. package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/wiki/route.js +5 -5
  98. package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/wiki/search/route.js +5 -5
  100. package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js +5 -5
  102. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/wiki/upload/route.js +5 -5
  104. package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/wiki/watch/route.js +5 -5
  106. package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/index.html +1 -1
  108. package/.next/standalone/.next/server/app/index.rsc +3 -3
  109. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  110. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  111. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  113. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/signin/page_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-jzw2_._.js +3 -0
  119. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.-oq-7._.js +3 -0
  120. package/.next/standalone/.next/server/chunks/[root-of-the-server]__000spch._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01oin-a._.js +3 -0
  122. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01qcera._.js +16 -0
  123. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02.uul~._.js +3 -0
  124. package/.next/standalone/.next/server/chunks/[root-of-the-server]__024967n._.js +3 -0
  125. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06booxp._.js +3 -0
  126. package/.next/standalone/.next/server/chunks/[root-of-the-server]__071_pmz._.js +3 -0
  127. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0bqpg._.js +3 -0
  128. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_1f2cw._.js +3 -0
  129. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0a6j6r4._.js +3 -0
  130. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0aoqat-._.js +3 -0
  131. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0as-u6z._.js +3 -0
  132. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bvtbax._.js +3 -0
  133. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c-ee48._.js +5 -0
  134. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e_9pc5._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0esmskc._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fshk._._.js +20 -0
  137. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fu72o7._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k9mili._.js +3 -0
  139. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l-wu5u._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lvz22t._.js +20 -0
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n-chxk._.js +16 -0
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n9zdf0._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nmx3k2._.js +12 -0
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nzlmkb._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o0v6hf._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s38pid._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s_8poz._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sfrx~.._.js +3 -0
  149. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sggstu._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u81k~2._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uibxf_._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wfv_by._.js +3 -0
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wlj-yw._.js +3 -0
  154. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w~__xz._.js +3 -0
  155. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yat~ul._.js +3 -0
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yxauu6._.js +3 -0
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zbkgnr._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zv_j05._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~rntxj._.js +3 -0
  160. package/.next/standalone/.next/server/chunks/src_lib_search_0d-_j3u._.js +4 -4
  161. package/.next/standalone/.next/server/chunks/src_lib_search_0ymmp0c._.js +3 -3
  162. package/.next/standalone/.next/server/chunks/src_lib_workspaces_ts_0qon40u._.js +4 -0
  163. package/.next/standalone/.next/server/chunks/ssr/{0~w0_katex_dist_katex_mjs_029cdbg._.js → 0~w0_katex_dist_katex_mjs_0s4yb1t._.js} +1 -1
  164. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0z41nrr._.js → [root-of-the-server]__10te1ye._.js} +2 -2
  165. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_13p348f._.js → node_modules__pnpm_0-a_zjq._.js} +1 -1
  166. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0gos._c._.js → node_modules__pnpm_02l_1_8._.js} +1 -1
  167. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ru1i2-._.js → node_modules__pnpm_03rzttw._.js} +2 -2
  168. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_08xpp3w._.js → node_modules__pnpm_04frxp9._.js} +1 -1
  169. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0b8odbc._.js → node_modules__pnpm_057-t6m._.js} +1 -1
  170. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0f_n_zp._.js → node_modules__pnpm_05_oahi._.js} +1 -1
  171. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0~i3a.i._.js → node_modules__pnpm_05ans~m._.js} +1 -1
  172. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0i2m0b.._.js → node_modules__pnpm_06-2ia.._.js} +2 -2
  173. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0aha1~u._.js → node_modules__pnpm_086.ow4._.js} +1 -1
  174. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0w.kwue._.js → node_modules__pnpm_0cahog3._.js} +1 -1
  175. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0e0r_qk._.js → node_modules__pnpm_0cxanql._.js} +2 -2
  176. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ajqqlq._.js → node_modules__pnpm_0e09gmf._.js} +1 -1
  177. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0hzzx9d._.js → node_modules__pnpm_0eqjo2f._.js} +1 -1
  178. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_02bje_g._.js → node_modules__pnpm_0f-yazg._.js} +1 -1
  179. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0xk042~._.js → node_modules__pnpm_0iu44jv._.js} +1 -1
  180. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_11ede0p._.js → node_modules__pnpm_0jh8q66._.js} +2 -2
  181. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0k-7uzm._.js → node_modules__pnpm_0m39f~t._.js} +1 -1
  182. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0xr.ztu._.js → node_modules__pnpm_0ma-8l.._.js} +1 -1
  183. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0i6_kfe._.js → node_modules__pnpm_0met6sx._.js} +2 -2
  184. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_04v1_ty._.js → node_modules__pnpm_0mtrsi0._.js} +2 -2
  185. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0607~kg._.js → node_modules__pnpm_0n_swwn._.js} +2 -2
  186. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0t4l89_._.js → node_modules__pnpm_0ndyy93._.js} +1 -1
  187. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0-_58b8._.js → node_modules__pnpm_0s-cj7c._.js} +1 -1
  188. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0y2h_cz._.js → node_modules__pnpm_0tr41-t._.js} +1 -1
  189. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_08edl1n._.js → node_modules__pnpm_0u.uija._.js} +1 -1
  190. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0026mgr._.js → node_modules__pnpm_0wiyn6d._.js} +1 -1
  191. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_09o_spj._.js → node_modules__pnpm_0ygzt82._.js} +1 -1
  192. package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_0ss2.w7._.js +2 -2
  193. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  194. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  195. package/.next/standalone/.next/server/pages/404.html +1 -1
  196. package/.next/standalone/.next/server/pages/500.html +1 -1
  197. package/.next/standalone/.next/static/chunks/0ci7khnv7i~7_.js +17 -0
  198. package/.next/standalone/.next/static/chunks/0sx~65~lg4mgl.css +5 -0
  199. package/.next/standalone/package.json +1 -1
  200. package/README.md +88 -17
  201. package/bin/postbuild.js +21 -0
  202. package/bin/wiki-viewer.js +198 -6
  203. package/package.json +1 -1
  204. package/.next/standalone/.github/workflows/publish.yml +0 -37
  205. package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
  206. package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-.y6im._.js +0 -3
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-3_t2y._.js +0 -3
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-kjkzt._.js +0 -3
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-puax4._.js +0 -4
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01h996g._.js +0 -3
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0329ktu._.js +0 -3
  213. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03_xj4r._.js +0 -3
  214. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05398dt._.js +0 -4
  215. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06lfvxh._.js +0 -3
  216. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06w0aet._.js +0 -3
  217. package/.next/standalone/.next/server/chunks/[root-of-the-server]__070_p2a._.js +0 -4
  218. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0905hi1._.js +0 -21
  219. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0aa63~j._.js +0 -5
  220. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0avcplk._.js +0 -4
  221. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8_kyo._.js +0 -16
  222. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bticq1._.js +0 -3
  223. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bwevvu._.js +0 -3
  224. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c__k3q._.js +0 -4
  225. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cp~z4x._.js +0 -3
  226. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fmdv9h._.js +0 -20
  227. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h0qbwr._.js +0 -3
  228. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jk~oyi._.js +0 -3
  229. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ndq77b._.js +0 -3
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nvgpuk._.js +0 -3
  231. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ocvng2._.js +0 -3
  232. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ps4h~.._.js +0 -3
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q7jqwp._.js +0 -12
  234. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qew~6p._.js +0 -3
  235. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s_9f-a._.js +0 -3
  236. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uv7b8u._.js +0 -3
  237. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uv8.9i._.js +0 -3
  238. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vfe2io._.js +0 -4
  239. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w11kjy._.js +0 -3
  240. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wc-.e4._.js +0 -3
  241. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ymovmp._.js +0 -3
  242. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~c6ouv._.js +0 -3
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~rhs0u._.js +0 -16
  244. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10h9tid._.js +0 -3
  245. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10yk-u1._.js +0 -3
  246. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11105ew._.js +0 -3
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11a3dhw._.js +0 -3
  248. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13420tt._.js +0 -3
  249. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h~pdf._.js +0 -3
  250. package/.next/standalone/.next/static/chunks/02kg.lbkfi1yc.css +0 -5
  251. package/.next/standalone/.next/static/chunks/0rcwd6-.iu~nd.js +0 -17
  252. package/.next/standalone/.pi/ownership.json +0 -3
  253. package/.next/standalone/AGENTS.md +0 -114
  254. package/.next/standalone/DESIGN.md +0 -521
  255. package/.next/standalone/README.md +0 -821
  256. package/.next/standalone/TODO.md +0 -20
  257. package/.next/standalone/agents/bootstrap-prompt.md +0 -14
  258. package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
  259. package/.next/standalone/bin/postbuild.js +0 -78
  260. package/.next/standalone/bin/wiki-viewer.js +0 -922
  261. package/.next/standalone/certificates/localhost-key.pem +0 -28
  262. package/.next/standalone/certificates/localhost.pem +0 -24
  263. package/.next/standalone/docs/agent-collab-plan.md +0 -1615
  264. package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
  265. package/.next/standalone/docs/agent-fs-plan.md +0 -232
  266. package/.next/standalone/docs/editorial-skin-spec.md +0 -242
  267. package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
  268. package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
  269. package/.next/standalone/docs/workspacing-plan.md +0 -364
  270. package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
  271. package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
  272. package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
  273. package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
  274. package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
  275. package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
  276. package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
  277. package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
  278. package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
  279. package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
  280. package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
  281. package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
  282. package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
  283. package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
  284. package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
  285. package/.next/standalone/pnpm-lock.yaml +0 -6697
  286. package/.next/standalone/pnpm-workspace.yaml +0 -8
  287. package/.next/standalone/postcss.config.mjs +0 -2
  288. package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
  289. package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
  290. package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
  291. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
  292. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
  293. package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
  294. package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
  295. package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
  296. package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
  297. package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
  298. package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
  299. package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
  300. package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
  301. package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
  302. package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
  303. package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
  304. package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
  305. package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
  306. package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
  307. package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
  308. package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
  309. package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
  310. package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
  311. package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
  312. package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
  313. package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
  314. package/.next/standalone/src/app/api/share/route.ts +0 -127
  315. package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
  316. package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
  317. package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
  318. package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
  319. package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
  320. package/.next/standalone/src/app/api/system/config/route.ts +0 -14
  321. package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
  322. package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
  323. package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
  324. package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
  325. package/.next/standalone/src/app/api/system/users/route.ts +0 -120
  326. package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
  327. package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
  328. package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
  329. package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
  330. package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
  331. package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
  332. package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
  333. package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
  334. package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
  335. package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
  336. package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
  337. package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
  338. package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
  339. package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
  340. package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
  341. package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
  342. package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
  343. package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
  344. package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
  345. package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
  346. package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
  347. package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
  348. package/.next/standalone/src/app/api/wiki/route.ts +0 -116
  349. package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
  350. package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
  351. package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
  352. package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
  353. package/.next/standalone/src/app/globals.css +0 -1249
  354. package/.next/standalone/src/app/icon.svg +0 -11
  355. package/.next/standalone/src/app/layout.tsx +0 -78
  356. package/.next/standalone/src/app/manifest.ts +0 -30
  357. package/.next/standalone/src/app/page.tsx +0 -3260
  358. package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
  359. package/.next/standalone/src/app/signin/page.tsx +0 -16
  360. package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
  361. package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
  362. package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
  363. package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
  364. package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
  365. package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
  366. package/.next/standalone/src/components/dir-picker.tsx +0 -606
  367. package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
  368. package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
  369. package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
  370. package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
  371. package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
  372. package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
  373. package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
  374. package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
  375. package/.next/standalone/src/components/editor/editor.tsx +0 -1327
  376. package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
  377. package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
  378. package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
  379. package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
  380. package/.next/standalone/src/components/editor/extensions.ts +0 -150
  381. package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
  382. package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
  383. package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
  384. package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
  385. package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
  386. package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
  387. package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
  388. package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
  389. package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
  390. package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
  391. package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
  392. package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
  393. package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
  394. package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
  395. package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
  396. package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
  397. package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
  398. package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
  399. package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
  400. package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
  401. package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
  402. package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
  403. package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
  404. package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
  405. package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
  406. package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
  407. package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
  408. package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
  409. package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
  410. package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
  411. package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
  412. package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
  413. package/.next/standalone/src/components/share-dialog.tsx +0 -307
  414. package/.next/standalone/src/components/theme-provider.tsx +0 -16
  415. package/.next/standalone/src/components/theme-toggle.tsx +0 -24
  416. package/.next/standalone/src/components/ui/badge.tsx +0 -35
  417. package/.next/standalone/src/components/ui/button.tsx +0 -56
  418. package/.next/standalone/src/components/ui/card.tsx +0 -63
  419. package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
  420. package/.next/standalone/src/components/ui/command.tsx +0 -151
  421. package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
  422. package/.next/standalone/src/components/ui/dialog.tsx +0 -119
  423. package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
  424. package/.next/standalone/src/components/ui/input.tsx +0 -22
  425. package/.next/standalone/src/components/ui/label.tsx +0 -25
  426. package/.next/standalone/src/components/ui/popover.tsx +0 -33
  427. package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
  428. package/.next/standalone/src/components/ui/select.tsx +0 -156
  429. package/.next/standalone/src/components/ui/separator.tsx +0 -30
  430. package/.next/standalone/src/components/ui/sheet.tsx +0 -140
  431. package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
  432. package/.next/standalone/src/components/ui/switch.tsx +0 -28
  433. package/.next/standalone/src/components/ui/tabs.tsx +0 -54
  434. package/.next/standalone/src/components/ui/textarea.tsx +0 -21
  435. package/.next/standalone/src/components/ui/tip.tsx +0 -23
  436. package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
  437. package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
  438. package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
  439. package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
  440. package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
  441. package/.next/standalone/src/lib/app-runner.ts +0 -272
  442. package/.next/standalone/src/lib/auth/admin.ts +0 -120
  443. package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
  444. package/.next/standalone/src/lib/auth/client.ts +0 -4
  445. package/.next/standalone/src/lib/auth/csrf.ts +0 -68
  446. package/.next/standalone/src/lib/auth/server.ts +0 -215
  447. package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
  448. package/.next/standalone/src/lib/config.ts +0 -114
  449. package/.next/standalone/src/lib/embeds/detect.ts +0 -142
  450. package/.next/standalone/src/lib/git-secrets.ts +0 -65
  451. package/.next/standalone/src/lib/git.ts +0 -503
  452. package/.next/standalone/src/lib/google/detect.ts +0 -107
  453. package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
  454. package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
  455. package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
  456. package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
  457. package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
  458. package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
  459. package/.next/standalone/src/lib/proof/activity.ts +0 -74
  460. package/.next/standalone/src/lib/proof/audit.ts +0 -88
  461. package/.next/standalone/src/lib/proof/auth.ts +0 -143
  462. package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
  463. package/.next/standalone/src/lib/proof/blocks.ts +0 -73
  464. package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
  465. package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
  466. package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
  467. package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
  468. package/.next/standalone/src/lib/proof/glob.ts +0 -51
  469. package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
  470. package/.next/standalone/src/lib/proof/lease.ts +0 -117
  471. package/.next/standalone/src/lib/proof/mutex.ts +0 -36
  472. package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
  473. package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
  474. package/.next/standalone/src/lib/proof/pending.ts +0 -97
  475. package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
  476. package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
  477. package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
  478. package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
  479. package/.next/standalone/src/lib/proof/registry.ts +0 -195
  480. package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
  481. package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
  482. package/.next/standalone/src/lib/proof/types.ts +0 -182
  483. package/.next/standalone/src/lib/proof-config.ts +0 -14
  484. package/.next/standalone/src/lib/root-dir.ts +0 -35
  485. package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
  486. package/.next/standalone/src/lib/search/indexer.ts +0 -634
  487. package/.next/standalone/src/lib/search/sanitize.ts +0 -35
  488. package/.next/standalone/src/lib/search/search-db.ts +0 -57
  489. package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
  490. package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
  491. package/.next/standalone/src/lib/toast.ts +0 -9
  492. package/.next/standalone/src/lib/utils.ts +0 -6
  493. package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
  494. package/.next/standalone/src/lib/workspace-client.ts +0 -82
  495. package/.next/standalone/src/lib/workspace-context.ts +0 -173
  496. package/.next/standalone/src/lib/workspaces.ts +0 -400
  497. package/.next/standalone/src/middleware.ts +0 -44
  498. package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
  499. package/.next/standalone/src/stores/editor-store.ts +0 -439
  500. package/.next/standalone/src/stores/pin-store.ts +0 -56
  501. package/.next/standalone/src/stores/proof-store.ts +0 -124
  502. package/.next/standalone/src/stores/recent-store.ts +0 -51
  503. package/.next/standalone/src/stores/search-store.ts +0 -104
  504. package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
  505. package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
  506. package/.next/standalone/src/stores/skin-store.ts +0 -42
  507. package/.next/standalone/src/stores/tree-store.ts +0 -52
  508. package/.next/standalone/src/stores/view-width-store.ts +0 -101
  509. package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
  510. package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
  511. package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
  512. package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
  513. package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
  514. package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
  515. package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
  516. package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
  517. package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
  518. package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
  519. package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
  520. package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
  521. package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
  522. package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
  523. package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
  524. package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
  525. package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
  526. package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
  527. package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
  528. package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
  529. package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
  530. package/.next/standalone/src/tests/proof/git.test.ts +0 -243
  531. package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
  532. package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
  533. package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
  534. package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
  535. package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
  536. package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
  537. package/.next/standalone/src/tests/proof/preload.ts +0 -21
  538. package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
  539. package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
  540. package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
  541. package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
  542. package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
  543. package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
  544. package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
  545. package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
  546. package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
  547. package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
  548. package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
  549. package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
  550. package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
  551. package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
  552. package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
  553. package/.next/standalone/src/types/index.ts +0 -47
  554. package/.next/standalone/tailwind.config.ts +0 -191
  555. package/.next/standalone/tsconfig.json +0 -41
  556. package/.next/standalone/tsconfig.tsbuildinfo +0 -1
  557. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_buildManifest.js +0 -0
  558. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_clientMiddlewareManifest.js +0 -0
  559. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_ssgManifest.js +0 -0
@@ -1,34 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { checkAuth, enforceScope } from "@/lib/proof/auth";
3
- import { resolveWorkspaceForAgent } from "@/lib/workspace-context";
4
- import { readRegistry } from "@/lib/proof/registry";
5
- import { listPendingRegistrations } from "@/lib/proof/pending";
6
-
7
- export const runtime = "nodejs";
8
-
9
- export async function GET(req: Request): Promise<NextResponse> {
10
- const auth = await checkAuth(req);
11
- if (!auth.ok) {
12
- return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
13
- }
14
-
15
- const wsx = await resolveWorkspaceForAgent(req);
16
- if (!wsx.ok) return NextResponse.json({ error: wsx.code }, { status: wsx.status });
17
- const { ws, rootDir } = wsx;
18
-
19
- const scopeCheck = enforceScope(auth.agent, { op: "read", workspaceId: ws.id });
20
- if (!scopeCheck.ok) {
21
- return NextResponse.json({ error: scopeCheck.code, message: scopeCheck.message }, { status: 403 });
22
- }
23
-
24
- const registry = await readRegistry();
25
- const registeredAgents = registry?.agents.length ?? 0;
26
- const pendingRegistrations = listPendingRegistrations().length;
27
-
28
- return NextResponse.json({
29
- rateLimit: Number(process.env.AGENT_RATE_LIMIT) || 60,
30
- root: rootDir,
31
- registeredAgents,
32
- pendingRegistrations,
33
- });
34
- }
@@ -1,20 +0,0 @@
1
- /**
2
- * Token regeneration — deprecated and removed.
3
- *
4
- * Auth is now managed via TOFU registration flow. Use the AI Panel or
5
- * /api/agent/admin/* endpoints to manage agents.
6
- */
7
- import { NextResponse } from "next/server";
8
-
9
- export const runtime = "nodejs";
10
-
11
- export async function POST(_req: Request): Promise<NextResponse> {
12
- return NextResponse.json(
13
- {
14
- error: "GONE",
15
- message:
16
- "Token regeneration is deprecated. Manage agents via /api/agent/admin/* or the AI Panel.",
17
- },
18
- { status: 410 },
19
- );
20
- }
@@ -1,53 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { checkAuth, enforceScope } from "@/lib/proof/auth";
3
- import { readSidecar, emptySidecar } from "@/lib/proof/sidecar";
4
- import { resolveWorkspaceForAgent } from "@/lib/workspace-context";
5
- import { safeWorkspacePath } from "@/lib/workspaces";
6
-
7
- export const runtime = "nodejs";
8
-
9
- function isMarkdown(p: string): boolean {
10
- return p.endsWith(".md") || p.endsWith(".markdown");
11
- }
12
-
13
- function mdPath(segments: string[]): string {
14
- return segments.join("/");
15
- }
16
-
17
- export async function GET(
18
- req: Request,
19
- { params }: { params: Promise<{ path: string[] }> },
20
- ): Promise<NextResponse> {
21
- const auth = await checkAuth(req);
22
- if (!auth.ok) {
23
- return NextResponse.json({ error: "UNAUTHORIZED" }, { status: 401 });
24
- }
25
-
26
- const { path: segments } = await params;
27
- const rel = mdPath(segments);
28
-
29
- if (rel.startsWith(".proof")) {
30
- return NextResponse.json({ error: "INVALID_PATH", message: "Path must not be under .proof" }, { status: 400 });
31
- }
32
- if (!isMarkdown(rel)) {
33
- return NextResponse.json({ error: "INVALID_PATH", message: "Path must be .md or .markdown" }, { status: 400 });
34
- }
35
-
36
- const wsx = await resolveWorkspaceForAgent(req);
37
- if (!wsx.ok) return NextResponse.json({ error: wsx.code }, { status: wsx.status });
38
- const { ws, rootDir } = wsx;
39
-
40
- const absPath = safeWorkspacePath(rootDir, rel);
41
- if (!absPath) {
42
- return NextResponse.json({ error: "INVALID_PATH", message: "Path traversal rejected" }, { status: 400 });
43
- }
44
-
45
- const scopeCheck = enforceScope(auth.agent, { filePath: rel, op: "read", workspaceId: ws.id });
46
- if (!scopeCheck.ok) {
47
- return NextResponse.json({ error: scopeCheck.code, message: scopeCheck.message }, { status: 403 });
48
- }
49
-
50
- const sidecar = (await readSidecar(rootDir, rel)) ?? emptySidecar(rel);
51
-
52
- return NextResponse.json(sidecar);
53
- }
@@ -1,143 +0,0 @@
1
- export const runtime = "nodejs";
2
-
3
- import { NextRequest, NextResponse } from "next/server";
4
- import { readFile } from "node:fs/promises";
5
- import path from "node:path";
6
-
7
- const MAX_FILE_BYTES = 50_000_000; // 50 MB
8
-
9
- async function readVersion(): Promise<string> {
10
- try {
11
- const raw = await readFile(path.resolve(process.cwd(), "package.json"), "utf-8");
12
- const p = JSON.parse(raw) as { version?: string };
13
- return p.version ?? "0.0.0";
14
- } catch {
15
- return "0.0.0";
16
- }
17
- }
18
-
19
- function deriveEndpoint(req: NextRequest): string {
20
- const proto =
21
- req.headers.get("x-forwarded-proto") ??
22
- (req.url.startsWith("https") ? "https" : "http");
23
- const host =
24
- req.headers.get("x-forwarded-host") ??
25
- req.headers.get("host") ??
26
- new URL(req.url).host;
27
- return `${proto}://${host}`;
28
- }
29
-
30
- export async function GET(req: NextRequest): Promise<NextResponse> {
31
- const [bootstrapPrompt, version] = await Promise.all([
32
- readFile(path.resolve(process.cwd(), "agents/bootstrap-prompt.md"), "utf-8").catch(() => ""),
33
- readVersion(),
34
- ]);
35
-
36
- const endpoint = deriveEndpoint(req);
37
- const hostHeader = req.headers.get("host") ?? "";
38
- const hostname = hostHeader.replace(/:[0-9]+$/, "").replace(/^\[(.*)\]$/, "$1").toLowerCase();
39
- const loopback = hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
40
- const extraHosts = (process.env.WIKI_OWNER_HOSTS ?? "")
41
- .split(",").map((h) => h.trim().toLowerCase()).filter(Boolean);
42
- const ownerHostTrusted = loopback || extraHosts.includes(hostname);
43
-
44
- return NextResponse.json({
45
- name: "wiki-viewer",
46
- version,
47
- endpoint,
48
- humanInstructions:
49
- "Open the wiki-viewer AI Panel (Bot icon in header). Register the agent, then approve it in the Pending Registrations list. The agent receives a one-shot token.",
50
- ownerBootstrap: {
51
- hostnameSeen: hostname,
52
- ownerHostTrusted,
53
- hint: ownerHostTrusted
54
- ? "This host is trusted for owner cookie issuance. Open the AI Panel in a browser and approve pending registrations."
55
- : `This host (${hostname}) is not in the owner-trust allowlist, so the AI Panel cannot bootstrap an owner cookie. Restart the server with WIKI_OWNER_HOSTS=${hostname} or access via localhost.`,
56
- },
57
- bootstrapPrompt,
58
- skillTarball: "/api/agents/skill.tar.gz",
59
- skillRaw: "/api/agents/skill",
60
- skillCli: "npx skills add anh-chu/wiki-viewer/agents/wiki-viewer-skill",
61
- routes: [
62
- // Registration
63
- { method: "POST", path: "/api/agent/register", auth: "none", purpose: "Register an agent" },
64
- { method: "GET", path: "/api/agent/register/<regId>", auth: "none", purpose: "Poll registration status" },
65
- // Tier 2 — Collab (markdown block-ops + provenance)
66
- { method: "GET", path: "/api/agent/files/<path>.md", auth: "bearer+agent-id", purpose: "Read markdown snapshot (block-ops tier)" },
67
- { method: "POST", path: "/api/agent/files/<path>.md", auth: "bearer+agent-id", purpose: "Apply block-ops" },
68
- { method: "GET", path: "/api/agent/events/<path>.md", auth: "bearer+agent-id", purpose: "Poll events" },
69
- { method: "POST", path: "/api/agent/events/<path>.md", auth: "bearer+agent-id", purpose: "Ack events" },
70
- // Tier 1 — Raw FS (all file types)
71
- { method: "GET", path: "/api/agent/fs/file/<path>", auth: "bearer+agent-id", purpose: "Read file bytes. Supports Range. Returns ETag (sha256), X-File-Size, X-File-Mtime, X-Collab-State." },
72
- { method: "PUT", path: "/api/agent/fs/file/<path>", auth: "bearer+agent-id", purpose: "Atomic whole-file write. If-Match required for overwrites; omit for creates. ?mkdirs=true creates parents. ?force=true bypasses If-Match (audited)." },
73
- { method: "DELETE", path: "/api/agent/fs/file/<path>", auth: "bearer+agent-id", purpose: "Delete file (+ sidecar for .md). Requires If-Match + delete scope op. ?recursive=true for directories." },
74
- { method: "GET", path: "/api/agent/fs/ls/<path>", auth: "bearer+agent-id", purpose: "Directory listing. ?recursive&limit&depth. Scope-filtered. Excludes .proof/." },
75
- { method: "POST", path: "/api/agent/fs/move", auth: "bearer+agent-id", purpose: "Move/rename. Body: {from, to, ifMatch?}. Moves .md sidecar too." },
76
- { method: "POST", path: "/api/agent/fs/search", auth: "bearer+agent-id", purpose: "Server-side grep or glob. Body: {kind:'grep'|'glob', query, path?, glob?, limit?}." },
77
- // Settings (resolved workspace root, rate limit)
78
- { method: "GET", path: "/api/agent/settings", auth: "bearer+agent-id", purpose: "Returns rateLimit + resolved 'root' (the active workspace's directory for the X-Workspace you send)." },
79
- // Human presence (for editor lease — drives active collab-state)
80
- { method: "POST", path: "/api/wiki/presence", auth: "session", purpose: "Human editor lease heartbeat. Body: {path, action:'open'|'heartbeat'|'close'}." },
81
- ],
82
- workspaces: {
83
- description:
84
- "This instance can serve multiple root directories ('workspaces'). Every agent path is relative to ONE workspace root.",
85
- header: "X-Workspace: <workspaceId>",
86
- queryParam: "ws=<workspaceId>",
87
- default:
88
- "If omitted, the server resolves to the most-recently-opened workspace. Correct for single-workspace instances; be explicit when several exist.",
89
- discoverId:
90
- "Ask the human for the workspace id, read it from the ?ws= param of a pasted wiki-viewer URL, or call GET /api/agent/settings (with X-Workspace) to confirm the resolved 'root'.",
91
- scoped:
92
- "A token may be pinned to one workspace (scope.workspaceId at approval). Requests resolving to a different workspace return 403 FORBIDDEN. A token with no pin is wildcard (any workspace).",
93
- isolation:
94
- "Paths in one workspace never touch another, even with identical relative paths.",
95
- },
96
- capabilities: {
97
- maxFileBytes: MAX_FILE_BYTES,
98
- supportsRange: true,
99
- ifMatchRequired: true,
100
- forceBypass: true,
101
- search: ["grep", "glob"],
102
- globDialect: "**,*,?",
103
- scopeOps: ["read", "mutate", "delete"],
104
- scopeWorkspaceId: true,
105
- workspaceHeader: "X-Workspace",
106
- collabStates: ["active", "tracked", "untracked", "not-markdown"],
107
- collabPrecondition: "If-Collab-Match",
108
- },
109
- modes: {
110
- rule: "Before editing a .md file, read it and check the X-Collab-State response header. If 'active', use block-ops (Tier 2) at the X-Collab-Snapshot URL so a human can review your changes. If 'tracked', prefer block-ops for semantic/prose edits; use raw fs only for mechanical/whole-file ops (reformat, regenerate). If 'untracked', raw fs is fine (a Tier-2 edit would create a sidecar). For non-markdown files, always use raw fs (Tier 2 does not apply). A raw PUT to an active .md is rejected 409 COLLAB_ACTIVE with the Tier-2 URL — switch to block-ops.",
111
- collabStateHeaders: [
112
- "X-Collab-State: active|tracked|untracked|not-markdown",
113
- "X-Collab-Revision: <n>",
114
- "X-Collab-Snapshot: /api/agent/files/<path>.md",
115
- ],
116
- tiers: {
117
- tier1: "Raw FS — /api/agent/fs/* — all file types, fast, light audit (ETag/sha256, file.rawWritten event, audit table). No proof-spans.",
118
- tier2: "Collab — /api/agent/files/*.md — markdown only, reviewable proof-spans, comments, suggestions. Human can accept/revert.",
119
- },
120
- },
121
- mcpAdapter: {
122
- package: "wiki-viewer-mcp",
123
- invoke: "npx wiki-viewer-mcp",
124
- env: ["WIKI_VIEWER_URL", "WIKI_VIEWER_TOKEN", "WIKI_VIEWER_AGENT_ID", "WIKI_VIEWER_WORKSPACE"],
125
- description: "Thin MCP adapter mapping standard MCP filesystem tools onto these endpoints. Set WIKI_VIEWER_WORKSPACE to target a specific workspace (sends X-Workspace on every call). Reads X-Collab-State and blocks or warns on raw writes to active .md files.",
126
- },
127
- ops: [
128
- "block.replace",
129
- "block.insertAfter",
130
- "block.insertBefore",
131
- "block.delete",
132
- "block.append",
133
- "block.prepend",
134
- "comment.add",
135
- "comment.reply",
136
- "comment.resolve",
137
- "comment.reopen",
138
- "suggestion.add",
139
- "suggestion.accept",
140
- "suggestion.reject",
141
- ],
142
- });
143
- }
@@ -1,20 +0,0 @@
1
- export const runtime = "nodejs";
2
-
3
- import { NextRequest, NextResponse } from "next/server";
4
- import { readFile } from "node:fs/promises";
5
- import path from "node:path";
6
-
7
- export async function GET(_req: NextRequest): Promise<NextResponse> {
8
- const skillPath = path.resolve(
9
- process.cwd(),
10
- "agents/wiki-viewer-skill/SKILL.md"
11
- );
12
- const content = await readFile(skillPath, "utf-8");
13
- return new NextResponse(content, {
14
- status: 200,
15
- headers: {
16
- "Content-Type": "text/markdown; charset=utf-8",
17
- "Cache-Control": "no-store",
18
- },
19
- });
20
- }
@@ -1,87 +0,0 @@
1
- export const runtime = "nodejs";
2
-
3
- import { NextRequest, NextResponse } from "next/server";
4
- import { readdir, readFile } from "node:fs/promises";
5
- import { gzipSync } from "node:zlib";
6
- import path from "node:path";
7
-
8
- function encodeOctal(n: number, length: number): string {
9
- return n.toString(8).padStart(length - 1, "0") + "\0";
10
- }
11
-
12
- function writePaddedString(buf: Buffer, offset: number, str: string, len: number): void {
13
- const bytes = Buffer.from(str, "utf-8").subarray(0, len);
14
- bytes.copy(buf, offset);
15
- }
16
-
17
- function tarHeader(name: string, size: number, mtime: number): Buffer {
18
- const header = Buffer.alloc(512, 0);
19
-
20
- writePaddedString(header, 0, name, 100); // name
21
- writePaddedString(header, 100, "0000644\0", 8); // mode
22
- writePaddedString(header, 108, "0000000\0", 8); // uid
23
- writePaddedString(header, 116, "0000000\0", 8); // gid
24
- writePaddedString(header, 124, encodeOctal(size, 12), 12); // size
25
- writePaddedString(header, 136, encodeOctal(mtime, 12), 12); // mtime
26
- header[156] = 0x30; // typeflag '0' = regular
27
- // linkname: 157-256, all zero
28
- writePaddedString(header, 257, "ustar\0", 6); // magic
29
- writePaddedString(header, 263, "00", 2); // version
30
- // uname, gname, devmajor, devminor, prefix: zeros
31
-
32
- // checksum
33
- let sum = 0;
34
- for (let i = 0; i < 512; i++) {
35
- // treat checksum field (148..155) as spaces while computing
36
- sum += i >= 148 && i < 156 ? 32 : header[i];
37
- }
38
- writePaddedString(header, 148, encodeOctal(sum, 7) + " ", 8);
39
-
40
- return header;
41
- }
42
-
43
- function buildTar(entries: Array<{ name: string; content: Buffer; mtime: number }>): Buffer {
44
- const parts: Buffer[] = [];
45
-
46
- for (const entry of entries) {
47
- const hdr = tarHeader(entry.name, entry.content.length, entry.mtime);
48
- parts.push(hdr);
49
- parts.push(entry.content);
50
- // pad content to 512-byte boundary
51
- const rem = entry.content.length % 512;
52
- if (rem !== 0) {
53
- parts.push(Buffer.alloc(512 - rem, 0));
54
- }
55
- }
56
-
57
- // two zero blocks = end-of-archive
58
- parts.push(Buffer.alloc(1024, 0));
59
-
60
- return Buffer.concat(parts);
61
- }
62
-
63
- export async function GET(_req: NextRequest): Promise<NextResponse> {
64
- const skillDir = path.resolve(process.cwd(), "agents/wiki-viewer-skill");
65
- const files = await readdir(skillDir, { withFileTypes: true });
66
- const mtime = Math.floor(Date.now() / 1000);
67
-
68
- const entries: Array<{ name: string; content: Buffer; mtime: number }> = [];
69
-
70
- for (const f of files) {
71
- if (!f.isFile()) continue;
72
- const content = await readFile(path.join(skillDir, f.name));
73
- entries.push({ name: `wiki-viewer-skill/${f.name}`, content, mtime });
74
- }
75
-
76
- const tar = buildTar(entries);
77
- const gz = gzipSync(tar);
78
-
79
- return new NextResponse(gz, {
80
- status: 200,
81
- headers: {
82
- "Content-Type": "application/gzip",
83
- "Content-Disposition": `attachment; filename="wiki-viewer-skill.tar.gz"`,
84
- "Cache-Control": "no-store",
85
- },
86
- });
87
- }
@@ -1,247 +0,0 @@
1
- /**
2
- * Reverse proxy for node-app directories — built on undici.request()
3
- *
4
- * Unlike fetch(), undici.request() does NOT auto-decompress, so compressed
5
- * assets (gzip/br) stream through with their Content-Encoding intact and the
6
- * browser handles decompression itself. No ERR_CONTENT_DECODING_FAILED.
7
- *
8
- * For HTML/CSS (which we rewrite) we force accept-encoding:identity upstream
9
- * so we always receive plain text we can safely manipulate.
10
- */
11
- import { Readable } from "node:stream";
12
- import { request as undiciRequest } from "undici";
13
- import type { Dispatcher } from "undici";
14
- import { NextResponse } from "next/server";
15
- import { resolveByPrefix } from "@/lib/app-runner";
16
-
17
- const HOP_BY_HOP = new Set([
18
- "connection", "keep-alive", "proxy-authenticate", "proxy-authorization",
19
- "te", "trailers", "transfer-encoding", "upgrade",
20
- ]);
21
-
22
- // ── service worker ────────────────────────────────────────────────────────────
23
-
24
- function makeServiceWorker(proxyBase: string): string {
25
- return `
26
- /* wiki-viewer injected service worker */
27
- const BASE = ${JSON.stringify(proxyBase)};
28
- self.addEventListener("install", () => self.skipWaiting());
29
- self.addEventListener("activate", (e) => e.waitUntil(self.clients.claim()));
30
- self.addEventListener("fetch", (event) => {
31
- const url = new URL(event.request.url);
32
- if (url.origin !== self.location.origin) return;
33
- if (url.pathname.startsWith(BASE + "/")) return;
34
- if (url.pathname === BASE + "/sw-proxy.js") return;
35
- event.respondWith(fetch(BASE + url.pathname + url.search, {
36
- method: event.request.method,
37
- headers: event.request.headers,
38
- body: ["GET","HEAD"].includes(event.request.method) ? undefined : event.request.body,
39
- credentials: event.request.credentials,
40
- }));
41
- });`.trim();
42
- }
43
-
44
- // ── rewriters ─────────────────────────────────────────────────────────────────
45
-
46
- function rewriteHtml(html: string, proxyBase: string): string {
47
- let out = html;
48
- out = out.replace(/((?:src|href|action|data-src|data-href|content)=")\/(?!\/)/g, `$1${proxyBase}/`);
49
- out = out.replace(/(srcset="[^"]*)\/(?!\/)/g, `$1${proxyBase}/`);
50
- out = out.replace(/(<head(?:\s[^>]*)?>)/i, `$1\n<base href="${proxyBase}/">`);
51
- // Inject before </head>. Works without service workers (non-localhost HTTP):
52
- //
53
- // 1. replaceState — strips the proxy prefix from the initial URL so
54
- // BrowserRouter sees "/" instead of "/api/app-proxy/apps/X"
55
- // 2. fetch/XHR overrides — rewrite absolute-path calls (/api/...) through
56
- // the proxy so they reach the upstream app, not wiki-viewer
57
- // 3. SW — best-effort (only works on localhost/HTTPS), provides navigation
58
- // interception for hard-refreshes on sub-routes
59
- const patches = `<script>
60
- (function(){
61
- var BASE = ${JSON.stringify(proxyBase)};
62
- // 1. Normalize initial URL: BrowserRouter will see "/" not "/api/app-proxy/apps/X"
63
- var _loc = location.pathname;
64
- if (_loc.startsWith(BASE)) {
65
- history.replaceState(history.state, '', _loc.slice(BASE.length) || '/');
66
- }
67
- // 2. Rewrite fetch() absolute paths through proxy (works on non-localhost HTTP)
68
- var _fetch = window.fetch;
69
- window.fetch = function(input, init) {
70
- if (typeof input === 'string' && input.startsWith('/') && !input.startsWith('/api/app-proxy/')) {
71
- input = BASE + input;
72
- }
73
- return _fetch.call(window, input, init);
74
- };
75
- // 3. Rewrite XMLHttpRequest absolute paths
76
- var _xhrOpen = XMLHttpRequest.prototype.open;
77
- XMLHttpRequest.prototype.open = function(method, url) {
78
- if (typeof url === 'string' && url.startsWith('/') && !url.startsWith('/api/app-proxy/')) {
79
- url = BASE + url;
80
- }
81
- return _xhrOpen.apply(this, [method, url].concat(Array.prototype.slice.call(arguments, 2)));
82
- };
83
- // 4. SW — best-effort for localhost/HTTPS; reloads once on first activation
84
- if ('serviceWorker' in navigator) {
85
- if (!navigator.serviceWorker.controller) {
86
- navigator.serviceWorker.addEventListener('controllerchange', function() {
87
- window.location.reload();
88
- }, { once: true });
89
- }
90
- navigator.serviceWorker.register(BASE + '/sw-proxy.js?v=2', { scope: BASE + '/' })
91
- .catch(function(){});
92
- }
93
- })();
94
- </script>`;
95
- out = out.replace(/<\/head>/i, `${patches}\n</head>`);
96
- return out;
97
- }
98
-
99
- function rewriteCss(css: string, proxyBase: string): string {
100
- return css.replace(/url\((['"]?)\/(?!\/)/g, `url($1${proxyBase}/`);
101
- }
102
-
103
- // ── header helpers ────────────────────────────────────────────────────────────
104
-
105
- function upstreamHeaders(
106
- src: Headers,
107
- port: number,
108
- reqUrl: URL,
109
- forceIdentity = false,
110
- ): Record<string, string> {
111
- const out: Record<string, string> = {};
112
- for (const [k, v] of src.entries()) {
113
- if (HOP_BY_HOP.has(k.toLowerCase())) continue;
114
- out[k] = v;
115
- }
116
- out["host"] = `localhost:${port}`;
117
- out["x-forwarded-host"] = reqUrl.host;
118
- out["x-forwarded-proto"] = reqUrl.protocol.replace(":", "");
119
- if (forceIdentity) out["accept-encoding"] = "identity";
120
- return out;
121
- }
122
-
123
- function buildResHeaders(raw: Dispatcher.ResponseData["headers"]): Headers {
124
- const out = new Headers();
125
- for (const [k, v] of Object.entries(raw)) {
126
- if (!v || HOP_BY_HOP.has(k.toLowerCase())) continue;
127
- const vals = Array.isArray(v) ? v : [v];
128
- for (const val of vals) out.append(k, val);
129
- }
130
- return out;
131
- }
132
-
133
- // ── handler ───────────────────────────────────────────────────────────────────
134
-
135
- async function handleProxy(
136
- request: Request,
137
- { params }: { params: Promise<{ path: string[] }> },
138
- ): Promise<Response> {
139
- const segments = (await params).path ?? [];
140
- const reqUrl = new URL(request.url);
141
-
142
- const resolved = resolveByPrefix(segments);
143
- if (!resolved) {
144
- return NextResponse.json(
145
- { error: "App not running — launch it first in wiki-viewer." },
146
- { status: 503 },
147
- );
148
- }
149
-
150
- const { port, relPath, rest } = resolved;
151
- const proxyBase = `/api/app-proxy/${relPath}`;
152
-
153
- if (rest === "/sw-proxy.js") {
154
- return new Response(makeServiceWorker(proxyBase), {
155
- status: 200,
156
- headers: {
157
- "content-type": "application/javascript; charset=utf-8",
158
- "service-worker-allowed": proxyBase + "/",
159
- "cache-control": "no-store",
160
- },
161
- });
162
- }
163
-
164
- const upstreamUrl = `http://localhost:${port}${rest}${reqUrl.search}`;
165
- const method = request.method as Dispatcher.HttpMethod;
166
- const isBodyless = ["GET", "HEAD"].includes(request.method);
167
-
168
- try {
169
- // First pass with normal headers to discover content-type
170
- const first = await undiciRequest(upstreamUrl, {
171
- method,
172
- headers: upstreamHeaders(request.headers, port, reqUrl),
173
- body: isBodyless ? null : (request.body as unknown as Readable),
174
- });
175
-
176
- const contentType = String(first.headers["content-type"] ?? "");
177
- const needsRewrite = contentType.includes("text/html") || contentType.includes("text/css");
178
-
179
- if (needsRewrite) {
180
- // Drain first response and re-fetch with identity encoding for plain text
181
- first.body.resume();
182
- const second = await undiciRequest(upstreamUrl, {
183
- method: isBodyless ? method : "GET",
184
- headers: upstreamHeaders(request.headers, port, reqUrl, true),
185
- body: null,
186
- });
187
- const text = await second.body.text();
188
- const resHeaders = buildResHeaders(second.headers);
189
- // Body changed size after rewriting — drop these or client truncates
190
- resHeaders.delete("content-encoding");
191
- resHeaders.delete("content-length");
192
-
193
- if (contentType.includes("text/html")) {
194
- resHeaders.set("content-type", "text/html; charset=utf-8");
195
- return new Response(rewriteHtml(text, proxyBase), { status: second.statusCode, headers: resHeaders });
196
- }
197
- resHeaders.set("content-type", contentType);
198
- return new Response(rewriteCss(text, proxyBase), { status: second.statusCode, headers: resHeaders });
199
- }
200
-
201
- // SPA fallback: if upstream returns 404 for a path with no file extension
202
- // (i.e. a client-side route), re-fetch "/" and return index.html so the
203
- // SPA's router can handle it client-side.
204
- const hasExt = /\.[a-z0-9]{1,8}$/i.test(rest.split("?")[0]);
205
- if (first.statusCode === 404 && !hasExt) {
206
- first.body.resume();
207
- const fallback = await undiciRequest(`http://localhost:${port}/`, {
208
- method: "GET",
209
- headers: upstreamHeaders(request.headers, port, reqUrl, true),
210
- body: null,
211
- });
212
- const fallbackText = await fallback.body.text();
213
- const fallbackHeaders = buildResHeaders(fallback.headers);
214
- fallbackHeaders.delete("content-encoding");
215
- fallbackHeaders.delete("content-length");
216
- fallbackHeaders.set("content-type", "text/html; charset=utf-8");
217
- return new Response(rewriteHtml(fallbackText, proxyBase), {
218
- status: 200,
219
- headers: fallbackHeaders,
220
- });
221
- }
222
-
223
- // 304/204/205: null-body statuses — Response constructor rejects a stream body
224
- if (new Set([101, 204, 205, 304]).has(first.statusCode)) {
225
- first.body.resume();
226
- return new Response(null, { status: first.statusCode, headers: buildResHeaders(first.headers) });
227
- }
228
-
229
- // Stream everything else — compressed bytes + Content-Encoding flow through intact
230
- return new Response(Readable.toWeb(first.body) as ReadableStream, {
231
- status: first.statusCode,
232
- headers: buildResHeaders(first.headers),
233
- });
234
-
235
- } catch (e) {
236
- return NextResponse.json({ error: `Upstream unreachable: ${e}` }, { status: 502 });
237
- }
238
- }
239
-
240
- export const GET = handleProxy;
241
- export const POST = handleProxy;
242
- export const PUT = handleProxy;
243
- export const DELETE = handleProxy;
244
- export const PATCH = handleProxy;
245
- export const HEAD = handleProxy;
246
- export const OPTIONS = handleProxy;
247
- export const dynamic = "force-dynamic";