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,133 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import type { RootContent } from "mdast";
3
- import type { Block, Sidecar } from "./types";
4
- import { blockToMarkdown, blockType } from "./blocks";
5
-
6
- function sha256hex(input: string): string {
7
- return createHash("sha256").update(input, "utf8").digest("hex");
8
- }
9
-
10
- function textHash(markdown: string): string {
11
- return sha256hex(markdown).slice(0, 12);
12
- }
13
-
14
- function mintRef(markdown: string, usedRefs: Set<string>, position: number): string {
15
- const base = "b" + sha256hex(markdown).slice(0, 6);
16
- if (!usedRefs.has(base)) return base;
17
- // Collision: try position suffix
18
- const withPos = `${base}_${position}`;
19
- if (!usedRefs.has(withPos)) return withPos;
20
- // Fallback: increment counter
21
- let i = 0;
22
- while (usedRefs.has(`${base}_${i}`)) i++;
23
- return `${base}_${i}`;
24
- }
25
-
26
- /**
27
- * Assign Block refs to a list of parsed mdast nodes.
28
- * If a sidecar is provided, reuse existing refs for matching content hashes.
29
- * Returns Block[] with stable refs and a new refMap.
30
- */
31
- export function assignRefs(
32
- nodes: RootContent[],
33
- sidecar: Sidecar | null,
34
- ): { blocks: Block[]; newRefMap: Record<string, { textHash: string; lastSeenAt: string }> } {
35
- const now = new Date().toISOString();
36
- const usedRefs = new Set<string>();
37
- const newRefMap: Record<string, { textHash: string; lastSeenAt: string }> = {};
38
-
39
- // Build a reverse map: textHash -> ref from existing sidecar
40
- const hashToRef = new Map<string, string>();
41
- if (sidecar) {
42
- for (const [ref, entry] of Object.entries(sidecar.refMap)) {
43
- // Only map each hash once (first wins, since refs may have been aliased)
44
- if (!hashToRef.has(entry.textHash)) {
45
- hashToRef.set(entry.textHash, ref);
46
- }
47
- }
48
- }
49
-
50
- const blocks: Block[] = nodes.map((node, i) => {
51
- const md = blockToMarkdown(node);
52
- const hash = textHash(md);
53
- const { type, level, lang } = blockType(node);
54
-
55
- let ref: string;
56
- const existingRef = hashToRef.get(hash);
57
- if (existingRef && !usedRefs.has(existingRef)) {
58
- ref = existingRef;
59
- } else {
60
- ref = mintRef(md, usedRefs, i);
61
- }
62
-
63
- usedRefs.add(ref);
64
- newRefMap[ref] = { textHash: hash, lastSeenAt: now };
65
-
66
- const block: Block = { ref, type, markdown: md };
67
- if (level !== undefined) block.level = level;
68
- if (lang !== undefined) block.lang = lang;
69
- return block;
70
- });
71
-
72
- return { blocks, newRefMap };
73
- }
74
-
75
- /**
76
- * Resolve a ref against current block refs, falling back to aliases.
77
- */
78
- export function resolveRef(
79
- sidecar: Sidecar,
80
- ref: string,
81
- currentRefs: Set<string>,
82
- ): string | null {
83
- if (currentRefs.has(ref)) return ref;
84
- const aliased = sidecar.refAliases[ref];
85
- if (aliased && currentRefs.has(aliased)) return aliased;
86
- return null;
87
- }
88
-
89
- /**
90
- * After applying ops: compute new refMap and collect aliases for changed blocks.
91
- * oldRefMap: refMap before ops. newBlocks: blocks after ops.
92
- * Returns { newRefMap, refAliases } — aliases map old ref -> new ref for any block
93
- * that changed identity this mutation. Aliases are ONE-generation only.
94
- */
95
- export function computeRefDelta(
96
- oldRefMap: Record<string, { textHash: string; lastSeenAt: string }>,
97
- oldHashToRef: Map<string, string>,
98
- newBlocks: Block[],
99
- ): {
100
- newRefMap: Record<string, { textHash: string; lastSeenAt: string }>;
101
- refAliases: Record<string, string>;
102
- } {
103
- const now = new Date().toISOString();
104
- const newRefMap: Record<string, { textHash: string; lastSeenAt: string }> = {};
105
- const refAliases: Record<string, string> = {};
106
-
107
- for (const block of newBlocks) {
108
- const hash = textHash(block.markdown);
109
- newRefMap[block.ref] = { textHash: hash, lastSeenAt: now };
110
-
111
- // If this block's hash previously mapped to a different ref, record alias
112
- const oldRef = oldHashToRef.get(hash);
113
- if (oldRef && oldRef !== block.ref) {
114
- refAliases[oldRef] = block.ref;
115
- }
116
- }
117
-
118
- // For any old ref that's no longer present (was replaced/deleted), try to alias
119
- // it if we can identify which new block replaced it by position or hash.
120
- for (const [oldRef, entry] of Object.entries(oldRefMap)) {
121
- if (!newRefMap[oldRef] && !refAliases[oldRef]) {
122
- // Old ref gone, no content match found. Check if new block with same hash exists
123
- const match = newBlocks.find((b) => b.ref !== oldRef && textHash(b.markdown) === entry.textHash);
124
- if (match) {
125
- refAliases[oldRef] = match.ref;
126
- }
127
- }
128
- }
129
-
130
- return { newRefMap, refAliases };
131
- }
132
-
133
- export { textHash };
@@ -1,73 +0,0 @@
1
- import { unified } from "unified";
2
- import remarkParse from "remark-parse";
3
- import remarkGfm from "remark-gfm";
4
- import remarkStringify from "remark-stringify";
5
- import type { Root, RootContent } from "mdast";
6
- import type { BlockType } from "./types";
7
-
8
- const PARSER = unified().use(remarkParse).use(remarkGfm);
9
- const STRINGIFY = unified()
10
- .use(remarkStringify, {
11
- bullet: "-",
12
- fence: "`",
13
- fences: true,
14
- listItemIndent: "one",
15
- rule: "-",
16
- emphasis: "*",
17
- strong: "*",
18
- })
19
- .use(remarkGfm);
20
-
21
- export function parseBlocks(markdown: string): RootContent[] {
22
- const tree = PARSER.parse(markdown) as Root;
23
- return tree.children;
24
- }
25
-
26
- export function blockToMarkdown(node: RootContent): string {
27
- const tree: Root = { type: "root", children: [node] };
28
- return (STRINGIFY.stringify(tree) as string).replace(/\n+$/, "");
29
- }
30
-
31
- export function blocksToMarkdown(nodes: RootContent[]): string {
32
- if (nodes.length === 0) return "";
33
- const tree: Root = { type: "root", children: nodes };
34
- return (STRINGIFY.stringify(tree) as string).replace(/\n+$/, "") + "\n";
35
- }
36
-
37
- export function blockType(node: RootContent): {
38
- type: BlockType;
39
- level?: number;
40
- lang?: string;
41
- } {
42
- switch (node.type) {
43
- case "heading":
44
- return { type: "heading", level: (node as unknown as { depth: number }).depth };
45
- case "paragraph":
46
- return { type: "paragraph" };
47
- case "list": {
48
- const n = node as unknown as { ordered: boolean; children: Array<{ checked: boolean | null | undefined }> };
49
- if (
50
- n.children?.some(
51
- (li) => li.checked !== null && li.checked !== undefined,
52
- )
53
- )
54
- return { type: "taskList" };
55
- return { type: n.ordered ? "orderedList" : "bulletList" };
56
- }
57
- case "blockquote":
58
- return { type: "blockquote" };
59
- case "code":
60
- return {
61
- type: "codeBlock",
62
- lang: (node as unknown as { lang: string | null }).lang ?? undefined,
63
- };
64
- case "table":
65
- return { type: "table" };
66
- case "thematicBreak":
67
- return { type: "hr" };
68
- case "html":
69
- return { type: "html" };
70
- default:
71
- return { type: "paragraph" }; // fallback
72
- }
73
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Browser-side auth for same-origin UI requests.
3
- *
4
- * Authentication is now handled by the owner cookie (wv_owner) set via
5
- * /api/owner/init. Same-origin fetch automatically attaches cookies, so no
6
- * explicit Authorization header is needed from the browser UI.
7
- *
8
- * All fetch calls from the browser must use credentials: "same-origin" (the
9
- * default) or credentials: "include".
10
- */
11
-
12
- /** @deprecated No longer returns a token. Owner cookie is used instead. */
13
- export function getAgentToken(): string | null {
14
- return null;
15
- }
16
-
17
- /**
18
- * Returns empty object — authentication is via owner cookie automatically.
19
- * Kept for backwards-compat with call sites.
20
- */
21
- export function authHeaders(): HeadersInit {
22
- return {};
23
- }
@@ -1,81 +0,0 @@
1
- /**
2
- * Collab-state computation for §3.5 Working mode vs Collaborating mode.
3
- *
4
- * Returns:
5
- * state — "active" | "tracked" | "untracked" | "not-markdown"
6
- * revision — X-Collab-Revision (sidecar.revision + leaseGeneration(path))
7
- * snapshotUrl — Tier-2 snapshot URL (null for non-markdown)
8
- *
9
- * Revision formula:
10
- * revision = (sidecar?.revision ?? 0) + leaseGeneration(relPath)
11
- *
12
- * sidecar.revision bumps on every collab write (block-ops, comment, suggestion).
13
- * leaseGeneration bumps on every lease open/close.
14
- * Together they form a monotonically-non-decreasing integer that changes
15
- * whenever collab state could change. A raw PUT that supplies
16
- * If-Collab-Match: <n> is only safe when n equals the revision computed
17
- * atomically inside the write mutex — otherwise 409 COLLAB_ACTIVE.
18
- *
19
- * active = has artifacts (pendingSuggestions > 0 OR unresolvedComments > 0
20
- * OR blockProvenance entries > 0) OR has a current human edit lease.
21
- */
22
-
23
- import { readSidecar } from "./sidecar";
24
- import { hasActiveLease, leaseGeneration } from "./lease";
25
-
26
- function isMarkdownPath(p: string): boolean {
27
- return p.endsWith(".md") || p.endsWith(".markdown");
28
- }
29
-
30
- export type CollabState = "active" | "tracked" | "untracked" | "not-markdown";
31
-
32
- export interface CollabStateResult {
33
- state: CollabState;
34
- /** sidecar.revision + leaseGeneration(relPath) */
35
- revision: number;
36
- /** /api/agent/files/<relPath> — null for not-markdown */
37
- snapshotUrl: string | null;
38
- }
39
-
40
- export async function computeCollabState(
41
- rootDir: string,
42
- relPath: string,
43
- ): Promise<CollabStateResult> {
44
- if (!isMarkdownPath(relPath)) {
45
- return { state: "not-markdown", revision: 0, snapshotUrl: null };
46
- }
47
-
48
- const snapshotUrl = `/api/agent/files/${relPath}`;
49
-
50
- // Compute revision components
51
- // ns = rootDir: workspace-namespaces lease keys so two workspaces sharing
52
- // the same relPath never collide in the lease store.
53
- const sidecar = await readSidecar(rootDir, relPath);
54
- const gen = leaseGeneration(rootDir, relPath);
55
- const sidecarRevision = sidecar?.revision ?? 0;
56
- const revision = sidecarRevision + gen;
57
-
58
- // Lease check — do after reading sidecar to keep gen stable within this call
59
- const leaseActive = hasActiveLease(rootDir, relPath);
60
-
61
- if (!sidecar && !leaseActive) {
62
- return { state: "untracked", revision, snapshotUrl };
63
- }
64
-
65
- if (leaseActive) {
66
- return { state: "active", revision, snapshotUrl };
67
- }
68
-
69
- // Has sidecar, no lease — inspect artifacts
70
- const pendingSuggestions = sidecar!.suggestions.filter(
71
- (s) => s.status === "pending" && !s.stale,
72
- ).length;
73
- const unresolvedComments = sidecar!.comments.filter((c) => !c.resolved).length;
74
- const proofSpanCount = Object.keys(sidecar!.blockProvenance ?? {}).length;
75
-
76
- if (pendingSuggestions > 0 || unresolvedComments > 0 || proofSpanCount > 0) {
77
- return { state: "active", revision, snapshotUrl };
78
- }
79
-
80
- return { state: "tracked", revision, snapshotUrl };
81
- }
@@ -1,47 +0,0 @@
1
- import type { ProofEvent, Sidecar } from "./types";
2
-
3
- /**
4
- * Append one or more events to a working sidecar (in-memory mutation).
5
- * Assigns monotonic IDs from sidecar.nextEventId.
6
- */
7
- export function emitEvents(
8
- sidecar: Sidecar,
9
- partials: Array<Omit<ProofEvent, "id">>,
10
- ): ProofEvent[] {
11
- const emitted: ProofEvent[] = [];
12
- for (const partial of partials) {
13
- const ev = { ...partial, id: sidecar.nextEventId++ } as ProofEvent;
14
- sidecar.events.push(ev);
15
- emitted.push(ev);
16
- }
17
- return emitted;
18
- }
19
-
20
- /**
21
- * Poll events after a given ID, up to limit.
22
- */
23
- export function pollEvents(
24
- sidecar: Sidecar,
25
- afterId: number,
26
- limit: number,
27
- ): ProofEvent[] {
28
- return sidecar.events.filter((e) => e.id > afterId).slice(0, limit);
29
- }
30
-
31
- /**
32
- * Trim sidecar events to stay under TRIM_SIZE, preserving events newer than
33
- * the oldest lastAck cursor to avoid stranding agents.
34
- */
35
- export function trimEvents(sidecar: Sidecar, trimSize: number): void {
36
- if (sidecar.events.length <= trimSize) return;
37
-
38
- const ackValues = Object.values(sidecar.lastAck);
39
- const oldestAck = ackValues.length > 0 ? Math.min(...ackValues) : Infinity;
40
-
41
- // Events to keep: either within trimSize from the end, OR above the oldest ack
42
- const keepFrom = sidecar.events.length - trimSize;
43
- const trimmedEvents = sidecar.events.filter(
44
- (e, i) => i >= keepFrom || e.id > oldestAck,
45
- );
46
- sidecar.events = trimmedEvents;
47
- }
@@ -1,43 +0,0 @@
1
- // Workspacing note (Phase B): the lockKey must be workspace-unique. Callers
2
- // should prefix lockKey with rootDir (or wsId): `${rootDir}\0${relPath}`.
3
- // The cross-process sentinel hash then differs per workspace automatically.
4
- // Phase B call sites will make this change when route threading is done.
5
-
6
- /**
7
- * Cross-process file locking via proper-lockfile.
8
- *
9
- * Uses a sentinel file in ~/.wiki-viewer/.locks/ keyed by a hash of the lock
10
- * key so the actual data file need not exist before locking.
11
- */
12
- import { createHash } from "node:crypto";
13
- import { mkdir, writeFile } from "node:fs/promises";
14
- import os from "node:os";
15
- import path from "node:path";
16
- import lockfile from "proper-lockfile";
17
-
18
- function locksDir(): string {
19
- const home = process.env.HOME ?? os.homedir();
20
- return path.join(home, ".wiki-viewer", ".locks");
21
- }
22
-
23
- function sentinelPath(lockKey: string): string {
24
- const hash = createHash("sha256").update(lockKey, "utf8").digest("hex").slice(0, 32);
25
- return path.join(locksDir(), hash);
26
- }
27
-
28
- export async function withFileLock<T>(lockKey: string, fn: () => Promise<T>): Promise<T> {
29
- const dir = locksDir();
30
- await mkdir(dir, { recursive: true });
31
- const sentinel = sentinelPath(lockKey);
32
- // Create sentinel if absent (flag "a" = append/create, never truncate)
33
- await writeFile(sentinel, "", { flag: "a" });
34
-
35
- const release = await lockfile.lock(sentinel, {
36
- retries: { retries: 10, factor: 1.5, minTimeout: 50, maxTimeout: 2_000 },
37
- });
38
- try {
39
- return await fn();
40
- } finally {
41
- await release();
42
- }
43
- }
@@ -1,51 +0,0 @@
1
- /**
2
- * Minimal glob matcher.
3
- *
4
- * Supported patterns:
5
- * ** — any sequence of characters including path separators
6
- * * — any sequence of characters except path separators (/)
7
- * ? — single character that is not /
8
- * Literal characters — matched verbatim (case-sensitive)
9
- *
10
- * Patterns are anchored to the full string (implicit ^ and $).
11
- */
12
- export function matchGlob(pattern: string, filePath: string): boolean {
13
- const regex = globToRegex(pattern);
14
- return regex.test(filePath);
15
- }
16
-
17
- function globToRegex(pattern: string): RegExp {
18
- let regStr = "^";
19
- let i = 0;
20
- while (i < pattern.length) {
21
- if (pattern[i] === "*" && pattern[i + 1] === "*") {
22
- // ** — match anything including slashes
23
- regStr += ".*";
24
- i += 2;
25
- // Skip a trailing slash after ** to avoid double-matching: **/foo matches foo too
26
- if (pattern[i] === "/") {
27
- regStr += "(?:.+/)?";
28
- i++;
29
- // roll back the .* so we match just /**/ properly
30
- // Actually: keep simple — .* already handles it
31
- }
32
- } else if (pattern[i] === "*") {
33
- // * — match non-slash characters
34
- regStr += "[^/]*";
35
- i++;
36
- } else if (pattern[i] === "?") {
37
- regStr += "[^/]";
38
- i++;
39
- } else {
40
- // Escape regex special chars
41
- regStr += escapeRegex(pattern[i]!);
42
- i++;
43
- }
44
- }
45
- regStr += "$";
46
- return new RegExp(regStr);
47
- }
48
-
49
- function escapeRegex(c: string): string {
50
- return c.replace(/[.+^${}()|[\]\\]/g, "\\$&");
51
- }
@@ -1,37 +0,0 @@
1
- // Workspacing note (Phase B): the idempotency key must be prefixed with wsId
2
- // (or rootDir) at the call site to prevent cross-workspace collisions:
3
- // e.g. key = `${rootDir}\0${idempotencyHeader}`. Phase B call sites will
4
- // make this change when route threading is done.
5
-
6
- // Tiny in-memory LRU. Lives for process lifetime. Acceptable: idempotency
7
- // guards retries within seconds, not days.
8
- const MAX = 1000;
9
- const TTL_MS = 5 * 60 * 1000;
10
-
11
- interface Entry {
12
- payloadHash: string;
13
- status: number;
14
- body: string;
15
- expiresAt: number;
16
- }
17
-
18
- const store = new Map<string, Entry>();
19
-
20
- export const idempotency = {
21
- get(key: string): Entry | null {
22
- const e = store.get(key);
23
- if (!e) return null;
24
- if (e.expiresAt < Date.now()) {
25
- store.delete(key);
26
- return null;
27
- }
28
- return e;
29
- },
30
- set(key: string, value: Omit<Entry, "expiresAt">): void {
31
- if (store.size >= MAX) {
32
- const first = store.keys().next().value;
33
- if (first !== undefined) store.delete(first);
34
- }
35
- store.set(key, { ...value, expiresAt: Date.now() + TTL_MS });
36
- },
37
- };
@@ -1,117 +0,0 @@
1
- /**
2
- * Human edit-lease store (in-memory, globalThis for hot-reload survival).
3
- *
4
- * Namespace choice (workspacing): the first argument to every public function
5
- * is `ns` — a namespace string that MUST be the workspace rootDir (or wsId in
6
- * future phases). The internal map key is `${ns}\u0000${relPath}`. Two
7
- * workspaces that share the same relative path (e.g. "notes.md") therefore
8
- * never collide. Phase B routes pass rootDir from resolveWorkspaceForUser;
9
- * Phase A callers pass getRootDir() or tmpRoot in tests.
10
- *
11
- * A lease is set when a human opens a .md doc in the editor and refreshed
12
- * via heartbeat while the doc stays open. Its presence makes collab-state
13
- * "active" even before the human has typed a single suggestion.
14
- *
15
- * TTL: LEASE_TTL_MS (default 90 s). Editor should heartbeat every ~30 s.
16
- *
17
- * Collab-generation counter:
18
- * - Starts at 0 per (ns, path).
19
- * - Increments on EVERY 0→1 transition (first setLease, or setLease after
20
- * all prior leases expired) AND on every 1→0 transition (clearLease or
21
- * expiry-on-read).
22
- * - X-Collab-Revision = sidecar.revision + leaseGeneration(ns, path).
23
- */
24
-
25
- export const LEASE_TTL_MS = 90_000;
26
-
27
- interface LeaseEntry {
28
- userId: string;
29
- expiresAt: number;
30
- }
31
-
32
- interface LeaseStore {
33
- leases: Map<string, LeaseEntry>;
34
- generations: Map<string, number>;
35
- }
36
-
37
- const g = globalThis as typeof globalThis & { __wikiLeaseStore?: LeaseStore };
38
- if (!g.__wikiLeaseStore) {
39
- g.__wikiLeaseStore = { leases: new Map(), generations: new Map() };
40
- }
41
-
42
- function store(): LeaseStore {
43
- return g.__wikiLeaseStore!;
44
- }
45
-
46
- function storeKey(ns: string, relPath: string): string {
47
- return `${ns}\u0000${relPath}`;
48
- }
49
-
50
- /** True if (ns, relPath) has a non-expired lease RIGHT NOW (lazy-sweeps on check). */
51
- function isLeaseActiveInternal(ns: string, relPath: string): boolean {
52
- const s = store();
53
- const key = storeKey(ns, relPath);
54
- const entry = s.leases.get(key);
55
- if (!entry) return false;
56
- if (Date.now() >= entry.expiresAt) {
57
- s.leases.delete(key);
58
- // 1→0 transition: bump generation
59
- s.generations.set(key, (s.generations.get(key) ?? 0) + 1);
60
- return false;
61
- }
62
- return true;
63
- }
64
-
65
- /**
66
- * Set (or refresh) a lease for (ns, relPath) by userId.
67
- * Bumps the generation counter on a 0→1 transition.
68
- * `ns` must be the workspace rootDir (or a stable workspace identifier).
69
- */
70
- export function setLease(ns: string, relPath: string, userId: string, ttlMs = LEASE_TTL_MS): void {
71
- const s = store();
72
- const key = storeKey(ns, relPath);
73
- const wasActive = isLeaseActiveInternal(ns, relPath);
74
- s.leases.set(key, { userId, expiresAt: Date.now() + ttlMs });
75
- if (!wasActive) {
76
- // 0→1 transition: bump generation
77
- s.generations.set(key, (s.generations.get(key) ?? 0) + 1);
78
- }
79
- }
80
-
81
- /** True if (ns, relPath) has a current non-expired lease. */
82
- export function hasActiveLease(ns: string, relPath: string): boolean {
83
- return isLeaseActiveInternal(ns, relPath);
84
- }
85
-
86
- /**
87
- * Clear the lease for (ns, relPath) (on doc close).
88
- * Only clears if the existing lease belongs to userId.
89
- * Bumps generation on removal.
90
- */
91
- export function clearLease(ns: string, relPath: string, userId: string): void {
92
- const s = store();
93
- const key = storeKey(ns, relPath);
94
- const entry = s.leases.get(key);
95
- if (!entry) return;
96
- if (entry.userId === userId) {
97
- s.leases.delete(key);
98
- // 1→0 transition: bump generation
99
- s.generations.set(key, (s.generations.get(key) ?? 0) + 1);
100
- }
101
- }
102
-
103
- /**
104
- * Returns the monotonic-ish collab generation for (ns, relPath).
105
- * Increments on every 0→1 and 1→0 lease transition.
106
- */
107
- export function leaseGeneration(ns: string, relPath: string): number {
108
- const key = storeKey(ns, relPath);
109
- return store().generations.get(key) ?? 0;
110
- }
111
-
112
- /** Reset store — for tests only. */
113
- export function _resetLeaseStore(): void {
114
- const s = store();
115
- s.leases.clear();
116
- s.generations.clear();
117
- }
@@ -1,36 +0,0 @@
1
- // Workspacing note (Phase B): callers must prefix the lock key with rootDir
2
- // (or wsId) to ensure two workspaces sharing the same relPath do not serialize
3
- // against each other. e.g. key = `${rootDir}\0${relPath}`. Phase B call sites
4
- // will make this change when route threading is done.
5
- import { withFileLock } from "./file-lock";
6
-
7
- const locks = new Map<string, Promise<void>>();
8
-
9
- /**
10
- * Acquire an in-process mutex (for same-process serialisation) and then a
11
- * cross-process file lock (for multi-replica safety).
12
- *
13
- * The in-process mutex is held for the outer scope so that same-process
14
- * callers never race for the file lock. The file lock is acquired inside so
15
- * that different processes can safely share the same data files.
16
- */
17
- export async function withFileMutex<T>(
18
- filePath: string,
19
- fn: () => Promise<T>,
20
- ): Promise<T> {
21
- while (locks.has(filePath)) {
22
- await locks.get(filePath);
23
- }
24
- let release!: () => void;
25
- const p = new Promise<void>((r) => {
26
- release = r;
27
- });
28
- locks.set(filePath, p);
29
- try {
30
- // Cross-process file lock wraps the inner fn.
31
- return await withFileLock(filePath, fn);
32
- } finally {
33
- locks.delete(filePath);
34
- release();
35
- }
36
- }