wiki-viewer 2.9.2 → 2.9.3

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 (396) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +0 -4
  3. package/.next/standalone/.next/build-manifest.json +5 -5
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +4 -4
  6. package/.next/standalone/.next/routes-manifest.json +0 -24
  7. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/agent/activity/route.js +7 -7
  19. package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/agent/admin/agents/[agentId]/revoke/route.js +5 -5
  21. package/.next/standalone/.next/server/app/api/agent/admin/agents/[agentId]/revoke/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/agent/admin/agents/route.js +5 -5
  23. package/.next/standalone/.next/server/app/api/agent/admin/agents/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/agent/admin/registrations/[regId]/approve/route.js +5 -5
  25. package/.next/standalone/.next/server/app/api/agent/admin/registrations/[regId]/approve/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/agent/admin/registrations/[regId]/deny/route.js +5 -5
  27. package/.next/standalone/.next/server/app/api/agent/admin/registrations/[regId]/deny/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/agent/admin/registrations/route.js +5 -5
  29. package/.next/standalone/.next/server/app/api/agent/admin/registrations/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js +7 -7
  31. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js +9 -9
  33. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js +7 -7
  35. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js +8 -8
  37. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js +8 -8
  39. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js +8 -8
  41. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js +8 -8
  43. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/agent/settings/route.js +8 -8
  45. package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js +8 -8
  47. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js +10 -2
  49. package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js +5 -5
  51. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/auth/[...all]/route.js +2 -2
  53. package/.next/standalone/.next/server/app/api/pdf/save/route.js +8 -8
  54. package/.next/standalone/.next/server/app/api/pdf/save/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/share/[token]/asset/route.js +3 -2
  56. package/.next/standalone/.next/server/app/api/share/[token]/asset/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/share/[token]/route.js +8 -7
  58. package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/share/route.js +8 -8
  60. package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/system/admins/route.js +5 -5
  62. package/.next/standalone/.next/server/app/api/system/admins/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/system/api-key/route.js +2 -2
  64. package/.next/standalone/.next/server/app/api/system/api-key/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/system/auth-config/route.js +3 -3
  66. package/.next/standalone/.next/server/app/api/system/auth-config/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/system/auth-settings/route.js +5 -5
  68. package/.next/standalone/.next/server/app/api/system/auth-settings/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/api/system/browse/route.js +4 -4
  70. package/.next/standalone/.next/server/app/api/system/browse/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/system/config/route.js +3 -3
  72. package/.next/standalone/.next/server/app/api/system/config/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/system/pins/route.js +5 -5
  74. package/.next/standalone/.next/server/app/api/system/pins/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/system/reveal/route.js +4 -4
  76. package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/system/users/route.js +4 -4
  78. package/.next/standalone/.next/server/app/api/system/users/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/branch/route.js +5 -5
  80. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/branch/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js +5 -5
  82. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js +5 -5
  84. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js +5 -5
  86. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/system/workspaces/route.js +4 -4
  88. package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js +7 -7
  90. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/wiki/app/route.js +9 -9
  92. package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js +7 -7
  94. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/wiki/content/route.js +10 -10
  96. package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/wiki/download/route.js +9 -9
  98. package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/wiki/folder/route.js +7 -7
  100. package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js +7 -7
  102. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js +6 -6
  104. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js +7 -7
  106. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js +7 -7
  108. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js +7 -7
  110. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js +8 -8
  112. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
  113. package/.next/standalone/.next/server/app/api/wiki/move/route.js +8 -8
  114. package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js +8 -8
  116. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js +7 -7
  118. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/api/wiki/page/route.js +8 -8
  120. package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/wiki/presence/route.js +7 -7
  122. package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/wiki/route.js +8 -8
  124. package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/api/wiki/search/route.js +8 -8
  126. package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js +8 -8
  128. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/api/wiki/upload/route.js +8 -8
  130. package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/api/wiki/watch/route.js +4 -4
  132. package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  134. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/s/[token]/page/build-manifest.json +2 -2
  137. package/.next/standalone/.next/server/app/s/[token]/page.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/signin/page/build-manifest.json +2 -2
  140. package/.next/standalone/.next/server/app/signin/page.js +4 -4
  141. package/.next/standalone/.next/server/app/signin/page.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/signin/page_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app-paths-manifest.json +0 -4
  144. package/.next/standalone/.next/server/chunks/0p91_next_dist_esm_build_templates_app-route_0ytral2.js +1 -1
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.xk8gi._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00awqt2._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00sn-o5._.js +16 -0
  148. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0mw1brk._.js → [root-of-the-server]__01y-312._.js} +2 -2
  149. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__12jdw86._.js → [root-of-the-server]__02373p-._.js} +1 -1
  150. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03_q-~2._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03c09g7._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03prziv._.js +3 -0
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04vo55d._.js +3 -0
  154. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04~wbjj._.js +3 -0
  155. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05tbv~.._.js +16 -0
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__068r9h7._.js +3 -0
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06jm~o8._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07ox9i8._.js +12 -0
  159. package/.next/standalone/.next/server/chunks/[root-of-the-server]__088zh92._.js +3 -0
  160. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_5~w8k._.js +20 -0
  161. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_g-.kr._.js +20 -0
  162. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bdxjy5._.js +1 -1
  163. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__10c4_fo._.js → [root-of-the-server]__0e1kbl7._.js} +1 -1
  164. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__12v.eva._.js → [root-of-the-server]__0er9oof._.js} +2 -2
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e~2gkf._.js +3 -0
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0f2frhc._.js +4 -0
  167. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0hgccef._.js +3 -0
  168. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0egcl8n._.js → [root-of-the-server]__0j40f60._.js} +2 -2
  169. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__04mie79._.js → [root-of-the-server]__0k0t_.e._.js} +1 -1
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k46u9j._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kau~ca._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kuwuwk._.js +3 -0
  173. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kvxxt~._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l5io1-._.js +3 -0
  175. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0md2vr3._.js +3 -0
  176. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0muj-bp._.js +3 -0
  177. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nnxcs7._.js +3 -0
  178. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0omny3u._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ou7hai._.js +3 -0
  180. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r--676._.js +3 -0
  181. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r55bc0._.js +3 -0
  182. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rdt~cr._.js +3 -0
  183. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tizmgc._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vr.qhy._.js +3 -0
  185. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0915i_~._.js → [root-of-the-server]__0x.030x._.js} +2 -2
  186. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__11mhei8._.js → [root-of-the-server]__0xlo2r_._.js} +2 -2
  187. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yfb5md._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0a7c~hj._.js → [root-of-the-server]__0z5xk6f._.js} +1 -1
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~gd460._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~i3blt._.js +3 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10p-nga._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10zrueo._.js +12 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11ltgmp._.js +20 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11zy4x1._.js +6 -6
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12bl1v6._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12g8s_j._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h_w~h._.js +4 -0
  198. package/.next/standalone/.next/server/chunks/_079xuln._.js +1 -1
  199. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_system_workspaces_[id]_open_route_actions_1087xu7.js +1 -1
  200. package/.next/standalone/.next/server/chunks/node_modules__pnpm_0aj5g-w._.js +1 -1
  201. package/.next/standalone/.next/server/chunks/src_0ks~u~e._.js +1 -1
  202. package/.next/standalone/.next/server/chunks/src_lib_fs_mounts_ts_0ksy80l._.js +1 -1
  203. package/.next/standalone/.next/server/chunks/src_lib_workspaces_ts_0qon40u._.js +2 -2
  204. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0bt7d39._.js → 0e.4_sonner_dist_index_mjs_0u2em8w._.js} +2 -2
  205. package/.next/standalone/.next/server/chunks/ssr/{0~w0_katex_dist_katex_mjs_0p7ph25._.js → 0~w0_katex_dist_katex_mjs_018q_uc._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/ssr/12y~_mermaid_dist_chunks_mermaid_core_chunk-5ZQYHXKU_mjs_0z1.978._.js +1 -1
  207. package/.next/standalone/.next/server/chunks/ssr/12y~_mermaid_dist_chunks_mermaid_core_chunk-KSCS5N6A_mjs_0v4oeem._.js +1 -1
  208. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ybtj28._.js → [root-of-the-server]__02ov~kn._.js} +2 -2
  209. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__13k6~ax._.js → [root-of-the-server]__0n5kphk._.js} +2 -2
  210. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vglc36._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/ssr/_00pku9f._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/ssr/_0_.s7b8._.js +3 -0
  213. package/.next/standalone/.next/server/chunks/ssr/_0oq8kwv._.js +174 -0
  214. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_04qqrjr._.js → node_modules__pnpm_0.wgpvp._.js} +2 -2
  215. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_09k0q18._.js → node_modules__pnpm_02j0p3a._.js} +1 -1
  216. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0wg48.8._.js → node_modules__pnpm_02yqus6._.js} +1 -1
  217. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_11g2aee._.js → node_modules__pnpm_07bf4mp._.js} +1 -1
  218. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0a4su30._.js +1 -1
  219. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0a-f4gi._.js → node_modules__pnpm_0a~3f2a._.js} +1 -1
  220. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0819uyi._.js → node_modules__pnpm_0bnc0lk._.js} +2 -2
  221. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0b3l3b4._.js → node_modules__pnpm_0dm.meu._.js} +1 -1
  222. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0rc4s48._.js → node_modules__pnpm_0ebvpwi._.js} +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0jp7ggg._.js → node_modules__pnpm_0f.5boy._.js} +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ha2xsd._.js → node_modules__pnpm_0f9vj0~._.js} +2 -2
  225. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ypcps.._.js → node_modules__pnpm_0f9vuiw._.js} +2 -2
  226. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_06usij4._.js → node_modules__pnpm_0fa23-q._.js} +1 -1
  227. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0cuckmp._.js → node_modules__pnpm_0g21lw4._.js} +1 -1
  228. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_09ybwhl._.js → node_modules__pnpm_0kdk2ot._.js} +1 -1
  229. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0wjizot._.js → node_modules__pnpm_0kkbph0._.js} +2 -2
  230. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0xp3s_y._.js → node_modules__pnpm_0mv0.4i._.js} +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0z~bh__._.js → node_modules__pnpm_0nt22aq._.js} +2 -2
  232. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0o~d81.._.js +1 -1
  233. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0m2hb6k._.js → node_modules__pnpm_0p4w0~q._.js} +1 -1
  234. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_03ciu.l._.js → node_modules__pnpm_0pv3k.9._.js} +1 -1
  235. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_09c3lg3._.js → node_modules__pnpm_0qmqt0m._.js} +1 -1
  236. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0iuzd3o._.js → node_modules__pnpm_0q~maar._.js} +1 -1
  237. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ldft78._.js → node_modules__pnpm_0s1th-1._.js} +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0qhs4r2._.js → node_modules__pnpm_0tdnho_._.js} +1 -1
  239. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0dsnv76._.js → node_modules__pnpm_0w6oo9l._.js} +1 -1
  240. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0eiz-8_._.js → node_modules__pnpm_0x9-_1d._.js} +1 -1
  241. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0gnc95r._.js → node_modules__pnpm_0xq~zku._.js} +2 -2
  242. package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0~88b7s._.js → node_modules__pnpm_12nfd13._.js} +1 -1
  243. package/.next/standalone/.next/server/chunks/ssr/src_app_s_[token]_page_tsx_0_fzrmd._.js +1 -1
  244. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  245. package/.next/standalone/.next/server/pages/500.html +1 -1
  246. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  248. package/.next/standalone/.next/static/chunks/00_12ekhbvhhp.js +1 -0
  249. package/.next/standalone/.next/static/chunks/01u~45r8icusu.js +1 -0
  250. package/.next/standalone/.next/static/chunks/0aeii_m.9~9_t.js +1 -0
  251. package/.next/standalone/.next/static/chunks/0fm2eul-wqh2f.js +1 -0
  252. package/.next/standalone/.next/static/chunks/{08usk_~k6d0yf.js → 0k31ncl7m_j9q.js} +2 -2
  253. package/.next/standalone/.next/static/chunks/0n7px0u5.eizf.css +9 -0
  254. package/.next/standalone/.next/static/chunks/0qs6cl.~q-0tv.js +1 -0
  255. package/.next/standalone/.next/static/chunks/0wu_n6m9jg8rn.js +1 -0
  256. package/.next/standalone/.next/static/chunks/0yixq3fhhpk~9.js +172 -0
  257. package/.next/standalone/.next/static/chunks/{turbopack-0~8fsjmdvb_1i.js → turbopack-1105gjd__15ti.js} +1 -1
  258. package/.next/standalone/.test-floor +1 -1
  259. package/.next/standalone/biome.json +70 -0
  260. package/.next/standalone/node_modules/@vscode/ripgrep-linux-x64/bin/rg +0 -0
  261. package/.next/standalone/package.json +8 -9
  262. package/.next/standalone/scripts/format-check.mjs +25 -0
  263. package/.next/standalone/scripts/test-floor.mjs +86 -37
  264. package/.next/standalone/server.js +1 -1
  265. package/README.md +12 -5
  266. package/bin/cli/config.js +105 -0
  267. package/bin/cli/prompt.js +36 -0
  268. package/bin/cli/serve.js +413 -0
  269. package/bin/cli/service.js +304 -0
  270. package/bin/cli/update.js +58 -0
  271. package/bin/cli/wizard.js +134 -0
  272. package/bin/shared/ssh-target.js +154 -0
  273. package/bin/wiki-viewer.js +118 -1224
  274. package/package.json +19 -13
  275. package/.next/standalone/.next/server/app/api/system/clear-root/route/app-paths-manifest.json +0 -3
  276. package/.next/standalone/.next/server/app/api/system/clear-root/route/build-manifest.json +0 -9
  277. package/.next/standalone/.next/server/app/api/system/clear-root/route/server-reference-manifest.json +0 -4
  278. package/.next/standalone/.next/server/app/api/system/clear-root/route.js +0 -14
  279. package/.next/standalone/.next/server/app/api/system/clear-root/route.js.map +0 -5
  280. package/.next/standalone/.next/server/app/api/system/clear-root/route.js.nft.json +0 -1
  281. package/.next/standalone/.next/server/app/api/system/clear-root/route_client-reference-manifest.js +0 -3
  282. package/.next/standalone/.next/server/app/api/system/root-status/route/app-paths-manifest.json +0 -3
  283. package/.next/standalone/.next/server/app/api/system/root-status/route/build-manifest.json +0 -9
  284. package/.next/standalone/.next/server/app/api/system/root-status/route/server-reference-manifest.json +0 -4
  285. package/.next/standalone/.next/server/app/api/system/root-status/route.js +0 -14
  286. package/.next/standalone/.next/server/app/api/system/root-status/route.js.map +0 -5
  287. package/.next/standalone/.next/server/app/api/system/root-status/route.js.nft.json +0 -1
  288. package/.next/standalone/.next/server/app/api/system/root-status/route_client-reference-manifest.js +0 -3
  289. package/.next/standalone/.next/server/app/api/system/set-root/route/app-paths-manifest.json +0 -3
  290. package/.next/standalone/.next/server/app/api/system/set-root/route/build-manifest.json +0 -9
  291. package/.next/standalone/.next/server/app/api/system/set-root/route/server-reference-manifest.json +0 -4
  292. package/.next/standalone/.next/server/app/api/system/set-root/route.js +0 -15
  293. package/.next/standalone/.next/server/app/api/system/set-root/route.js.map +0 -5
  294. package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +0 -1
  295. package/.next/standalone/.next/server/app/api/system/set-root/route_client-reference-manifest.js +0 -3
  296. package/.next/standalone/.next/server/app/api/wiki/file/route/app-paths-manifest.json +0 -3
  297. package/.next/standalone/.next/server/app/api/wiki/file/route/build-manifest.json +0 -9
  298. package/.next/standalone/.next/server/app/api/wiki/file/route/server-reference-manifest.json +0 -4
  299. package/.next/standalone/.next/server/app/api/wiki/file/route.js +0 -16
  300. package/.next/standalone/.next/server/app/api/wiki/file/route.js.map +0 -5
  301. package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +0 -1
  302. package/.next/standalone/.next/server/app/api/wiki/file/route_client-reference-manifest.js +0 -3
  303. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-3eby~._.js +0 -3
  304. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-bd36s._.js +0 -3
  305. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0._o62m._.js +0 -3
  306. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.f~mr1._.js +0 -3
  307. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.xsx4e._.js +0 -3
  308. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01w5s-4._.js +0 -3
  309. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02hiw0n._.js +0 -3
  310. package/.next/standalone/.next/server/chunks/[root-of-the-server]__037g~yp._.js +0 -20
  311. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04yzrn9._.js +0 -3
  312. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05dk_5q._.js +0 -3
  313. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05nk8xg._.js +0 -3
  314. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05wicn_._.js +0 -3
  315. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07i72.r._.js +0 -3
  316. package/.next/standalone/.next/server/chunks/[root-of-the-server]__086~~78._.js +0 -3
  317. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08h0txl._.js +0 -3
  318. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09ezcba._.js +0 -3
  319. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0au~ncj._.js +0 -3
  320. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c-49tx._.js +0 -3
  321. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0di13ue._.js +0 -3
  322. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dkxp4y._.js +0 -3
  323. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jhwupj._.js +0 -3
  324. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ker6~l._.js +0 -3
  325. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mkrdf0._.js +0 -3
  326. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nzjsw9._.js +0 -3
  327. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o0lsmx._.js +0 -3
  328. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0omc1-s._.js +0 -20
  329. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0os3ej1._.js +0 -16
  330. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0px8._m._.js +0 -3
  331. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qe7kxb._.js +0 -3
  332. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qe8lje._.js +0 -3
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qox302._.js +0 -3
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s5ns33._.js +0 -3
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s6kt0y._.js +0 -3
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_s2dg._.js +0 -20
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tchvup._.js +0 -3
  338. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tw6h_5._.js +0 -3
  339. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmp13_._.js +0 -3
  340. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0z8qb~s._.js +0 -3
  341. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zy2f8y._.js +0 -12
  342. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~s~szv._.js +0 -16
  343. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1024gkd._.js +0 -3
  344. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12abg.4._.js +0 -3
  345. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_system_clear-root_route_actions_065znew.js +0 -3
  346. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_system_root-status_route_actions_0stp57y.js +0 -3
  347. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_system_set-root_route_actions_0vxn8ey.js +0 -3
  348. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wiki_file_route_actions_0ytnc0i.js +0 -3
  349. package/.next/standalone/.next/server/chunks/ssr/0~w0_katex_dist_katex_mjs_12lt4cp._.js +0 -3
  350. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0a3bjyp._.js +0 -3
  351. package/.next/standalone/.next/server/chunks/ssr/_03xt0rl._.js +0 -158
  352. package/.next/standalone/.next/server/chunks/ssr/_06rf50_._.js +0 -3
  353. package/.next/standalone/.next/server/chunks/ssr/_0i3r51-._.js +0 -158
  354. package/.next/standalone/.next/server/chunks/ssr/_0jdop6l._.js +0 -3
  355. package/.next/standalone/.next/server/chunks/ssr/_0v4uz-4._.js +0 -19
  356. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0.6uh54._.js +0 -3
  357. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_00o9din._.js +0 -3
  358. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_02jnz2o._.js +0 -17
  359. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_03jchtd._.js +0 -3
  360. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_04xh4re._.js +0 -26
  361. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_07p8tmd._.js +0 -17
  362. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_08jqh.4._.js +0 -3
  363. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0_up15t._.js +0 -17
  364. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0c.b4rt._.js +0 -3
  365. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0dr38_k._.js +0 -31
  366. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0e-nvo5._.js +0 -45
  367. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0e9l2~p._.js +0 -3
  368. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0k_8g5d._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0kli5~f._.js +0 -3
  370. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0n-ec__._.js +0 -3
  371. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0odzirk._.js +0 -3
  372. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0ov9ih8._.js +0 -17
  373. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0qb~hug._.js +0 -17
  374. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0t24-57._.js +0 -3
  375. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0umkew~._.js +0 -17
  376. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0w_fkrb._.js +0 -3
  377. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0yfe2s1._.js +0 -3
  378. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_0~ovwm1._.js +0 -3
  379. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_10-i1v8._.js +0 -3
  380. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_12dmj0l._.js +0 -3
  381. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_133w.gx._.js +0 -11
  382. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_13y5ncy._.js +0 -3
  383. package/.next/standalone/.next/static/chunks/0-lsw0io13aha.js +0 -1
  384. package/.next/standalone/.next/static/chunks/01-v2wyaj~5gn.js +0 -1
  385. package/.next/standalone/.next/static/chunks/03zmegz1kvvod.js +0 -17
  386. package/.next/standalone/.next/static/chunks/04_l8s7dy454_.js +0 -1
  387. package/.next/standalone/.next/static/chunks/0a~z4.g.dtxjm.js +0 -156
  388. package/.next/standalone/.next/static/chunks/0ky8fha87kp0_.js +0 -1
  389. package/.next/standalone/.next/static/chunks/0nzvnpn.j1~sx.js +0 -1
  390. package/.next/standalone/.next/static/chunks/0t5bc7buy7sx9.js +0 -156
  391. package/.next/standalone/.next/static/chunks/0umlolnxs~j3r.js +0 -1
  392. package/.next/standalone/.next/static/chunks/1012fl5fxholx.js +0 -1
  393. package/.next/standalone/.next/static/chunks/17isnstdq92js.css +0 -5
  394. /package/.next/standalone/.next/static/{R2lG97g-a6HpbZZtS4qep → I6ZpQF8Ua7ytNZMW5ZKWH}/_buildManifest.js +0 -0
  395. /package/.next/standalone/.next/static/{R2lG97g-a6HpbZZtS4qep → I6ZpQF8Ua7ytNZMW5ZKWH}/_clientMiddlewareManifest.js +0 -0
  396. /package/.next/standalone/.next/static/{R2lG97g-a6HpbZZtS4qep → I6ZpQF8Ua7ytNZMW5ZKWH}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/057l2ju6dh43x.js","static/chunks/08usk_~k6d0yf.js","static/chunks/0vp-ahhagxptc.js"],runtimeModuleIds:[569959]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=["NEXT_DEPLOYMENT_ID","NEXT_CLIENT_ASSET_SUFFIX"];var o,l=((o=l||{})[o.Runtime=0]="Runtime",o[o.Parent=1]="Parent",o[o.Update=2]="Update",o);let i=new WeakMap;function s(e,t){this.m=e,this.e=t}let u=s.prototype,a=Object.prototype.hasOwnProperty,c="u">typeof Symbol&&Symbol.toStringTag;function f(e,t,r){a.call(e,t)||Object.defineProperty(e,t,r)}function p(e,t){let r=e[t];return r||(r=h(t),e[t]=r),r}function h(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function d(e,t){f(e,"__esModule",{value:!0}),c&&f(e,c,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)f(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?f(e,n,{get:o,set:t[r++],enumerable:!0}):f(e,n,{get:o,enumerable:!0})}Object.seal(e)}function m(e,t){(null!=t?p(this.c,t):this.m).exports=e}u.s=function(e,t){let r,n;null!=t?n=(r=p(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,d(n,e)},u.j=function(e,t){var r,n;let o,l,s;null!=t?l=(o=p(this.c,t)).exports:(o=this.m,l=this.e);let u=(r=o,n=l,(s=i.get(r))||(i.set(r,s=[]),r.exports=r.namespaceObject=new Proxy(n,{get(e,t){if(a.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of s){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of s)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),s);"object"==typeof e&&null!==e&&u.push(e)},u.v=m,u.n=function(e,t){let r;(r=null!=t?p(this.c,t):this.m).exports=r.namespaceObject=e};let b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,y=[null,b({}),b([]),b(b)];function g(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!y.includes(t);t=b(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),d(t,n),t}function O(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=g(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function w(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}function k(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}u.i=O,u.A=function(e){return this.r(e)(O.bind(this))},u.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},u.r=function(e){return B(e,this.m).exports},u.f=function(e){function t(t){if(t=w(t),a.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=w(t),a.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let j=Symbol("turbopack queues"),U=Symbol("turbopack exports"),v=Symbol("turbopack error");function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}u.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=k(),u=Object.assign(s,{[U]:r.exports,[j]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[U]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(j in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[U]:{},[j]:e=>e(t)};return e.then(e=>{r[U]=e,C(t)},e=>{r[v]=e,C(t)}),r}}return{[U]:e,[j]:()=>{}}}),r=()=>t.map(e=>{if(e[v])throw e[v];return e[U]}),{promise:l,resolve:i}=k(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[j](u)),s.queueCount?l:r()},function(e){e?i(u[v]=e):l(u[U]),C(n)}),n&&-1===n.status&&(n.status=0)};let P=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}P.prototype=URL.prototype,u.U=P,u.z=function(e){throw Error("dynamic usage of require is not supported")},u.g=globalThis;let S=s.prototype,$=new Map;u.M=$;let _=new Map,E=new Map;async function T(e,t,r){let n;if("string"==typeof r)return M(e,t,N(r));let o=r.included||[],l=o.map(e=>!!$.has(e)||_.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>E.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)E.has(e)||r.add(e);for(let n of r){let r=M(e,t,N(n));E.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=M(e,t,N(r.path)),i))E.has(o)||E.set(o,n)}for(let e of o)_.has(e)||_.set(e,n);await n}S.l=function(e){return T(l.Parent,this.m.id,e)};let A=Promise.resolve(void 0),x=new WeakMap;function M(t,r,n){let o=e.loadChunkCached(t,n),i=x.get(o);if(void 0===i){let e=x.set.bind(x,o,A);i=o.then(e).catch(e=>{let o;switch(t){case l.Runtime:o=`as a runtime dependency of chunk ${r}`;break;case l.Parent:o=`from module ${r}`;break;case l.Update:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),x.set(o,i)}return i}function N(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}${r}`}S.L=function(e){return M(l.Parent,this.m.id,e)},S.R=function(e){let t=this.r(e);return t?.default??t},S.P=function(e){return`/ROOT/${e??""}`},S.q=function(e,t){m.call(this,`${e}${r}`,t)},S.b=function(e,t,o,l){let i="SharedWorker"===e.name,s=[o.map(e=>N(e)).reverse(),r];for(let e of n)s.push(globalThis[e]);let u=new URL(N(t),location.origin),a=JSON.stringify(s);return i?u.searchParams.set("params",a):u.hash="#params="+encodeURIComponent(a),new e(u,l?{...l,type:void 0}:void 0)};let K=/\.js(?:\?[^#]*)?(?:#.*)?$/,q=/\.css(?:\?[^#]*)?(?:#.*)?$/;function L(e){return q.test(e)}u.w=function(t,r,n){return e.loadWebAssembly(l.Parent,this.m.id,t,r,n)},u.u=function(t,r){return e.loadWebAssemblyModule(l.Parent,this.m.id,t,r)};let I={};u.c=I;let B=(e,t)=>{let r=I[e];if(r){if(r.error)throw r.error;return r}return W(e,l.Parent,t.id)};function W(e,t,r){let n=$.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=h(e),l=o.exports;I[e]=o;let i=new s(o,l);try{n(i,o,l)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&g(o.exports,o.namespaceObject),o}function F(t){let r,n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,s=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(s||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),s=!0),t.set(r,i))}r=o+1}}(t,$)),e.registerChunk(n,r)}let X=new Map;function D(e){let t=X.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},X.set(e,t)}return t}e={async registerChunk(e,r){let n=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(e.src.replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(e);if(D("string"==typeof e?N(e):e.src).resolve(),null!=r){for(let e of r.otherChunks)D(N("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(e=>T(l.Runtime,n,e))),r.runtimeModuleIds.length>0)for(let e of r.runtimeModuleIds)!function(e,t){let r=I[t];if(r){if(r.error)throw r.error;return}W(t,l.Runtime,e)}(n,e)}},loadChunkCached:(e,t)=>(function(e,t){let r=D(t);if(r.loadingStarted)return r.promise;if(e===l.Runtime)return r.loadingStarted=!0,L(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(L(t));else if(K.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(L(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(K.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(N(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(N(r));return await WebAssembly.compileStreaming(o)}};let H=globalThis.TURBOPACK;globalThis.TURBOPACK={push:F},H.forEach(F)})();
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/057l2ju6dh43x.js","static/chunks/0k31ncl7m_j9q.js","static/chunks/0vp-ahhagxptc.js"],runtimeModuleIds:[569959]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=["NEXT_DEPLOYMENT_ID","NEXT_CLIENT_ASSET_SUFFIX"];var o,l=((o=l||{})[o.Runtime=0]="Runtime",o[o.Parent=1]="Parent",o[o.Update=2]="Update",o);let i=new WeakMap;function s(e,t){this.m=e,this.e=t}let u=s.prototype,a=Object.prototype.hasOwnProperty,c="u">typeof Symbol&&Symbol.toStringTag;function f(e,t,r){a.call(e,t)||Object.defineProperty(e,t,r)}function p(e,t){let r=e[t];return r||(r=h(t),e[t]=r),r}function h(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function d(e,t){f(e,"__esModule",{value:!0}),c&&f(e,c,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)f(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?f(e,n,{get:o,set:t[r++],enumerable:!0}):f(e,n,{get:o,enumerable:!0})}Object.seal(e)}function m(e,t){(null!=t?p(this.c,t):this.m).exports=e}u.s=function(e,t){let r,n;null!=t?n=(r=p(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,d(n,e)},u.j=function(e,t){var r,n;let o,l,s;null!=t?l=(o=p(this.c,t)).exports:(o=this.m,l=this.e);let u=(r=o,n=l,(s=i.get(r))||(i.set(r,s=[]),r.exports=r.namespaceObject=new Proxy(n,{get(e,t){if(a.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of s){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of s)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),s);"object"==typeof e&&null!==e&&u.push(e)},u.v=m,u.n=function(e,t){let r;(r=null!=t?p(this.c,t):this.m).exports=r.namespaceObject=e};let b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,y=[null,b({}),b([]),b(b)];function g(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!y.includes(t);t=b(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),d(t,n),t}function O(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=g(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function w(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}function j(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}u.i=O,u.A=function(e){return this.r(e)(O.bind(this))},u.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},u.r=function(e){return B(e,this.m).exports},u.f=function(e){function t(t){if(t=w(t),a.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=w(t),a.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let k=Symbol("turbopack queues"),U=Symbol("turbopack exports"),v=Symbol("turbopack error");function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}u.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=j(),u=Object.assign(s,{[U]:r.exports,[k]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[U]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(k in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[U]:{},[k]:e=>e(t)};return e.then(e=>{r[U]=e,C(t)},e=>{r[v]=e,C(t)}),r}}return{[U]:e,[k]:()=>{}}}),r=()=>t.map(e=>{if(e[v])throw e[v];return e[U]}),{promise:l,resolve:i}=j(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[k](u)),s.queueCount?l:r()},function(e){e?i(u[v]=e):l(u[U]),C(n)}),n&&-1===n.status&&(n.status=0)};let P=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}P.prototype=URL.prototype,u.U=P,u.z=function(e){throw Error("dynamic usage of require is not supported")},u.g=globalThis;let S=s.prototype,$=new Map;u.M=$;let _=new Map,E=new Map;async function T(e,t,r){let n;if("string"==typeof r)return M(e,t,N(r));let o=r.included||[],l=o.map(e=>!!$.has(e)||_.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>E.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)E.has(e)||r.add(e);for(let n of r){let r=M(e,t,N(n));E.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=M(e,t,N(r.path)),i))E.has(o)||E.set(o,n)}for(let e of o)_.has(e)||_.set(e,n);await n}S.l=function(e){return T(l.Parent,this.m.id,e)};let A=Promise.resolve(void 0),x=new WeakMap;function M(t,r,n){let o=e.loadChunkCached(t,n),i=x.get(o);if(void 0===i){let e=x.set.bind(x,o,A);i=o.then(e).catch(e=>{let o;switch(t){case l.Runtime:o=`as a runtime dependency of chunk ${r}`;break;case l.Parent:o=`from module ${r}`;break;case l.Update:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),x.set(o,i)}return i}function N(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}${r}`}S.L=function(e){return M(l.Parent,this.m.id,e)},S.R=function(e){let t=this.r(e);return t?.default??t},S.P=function(e){return`/ROOT/${e??""}`},S.q=function(e,t){m.call(this,`${e}${r}`,t)},S.b=function(e,t,o,l){let i="SharedWorker"===e.name,s=[o.map(e=>N(e)).reverse(),r];for(let e of n)s.push(globalThis[e]);let u=new URL(N(t),location.origin),a=JSON.stringify(s);return i?u.searchParams.set("params",a):u.hash="#params="+encodeURIComponent(a),new e(u,l?{...l,type:void 0}:void 0)};let q=/\.js(?:\?[^#]*)?(?:#.*)?$/,K=/\.css(?:\?[^#]*)?(?:#.*)?$/;function L(e){return K.test(e)}u.w=function(t,r,n){return e.loadWebAssembly(l.Parent,this.m.id,t,r,n)},u.u=function(t,r){return e.loadWebAssemblyModule(l.Parent,this.m.id,t,r)};let I={};u.c=I;let B=(e,t)=>{let r=I[e];if(r){if(r.error)throw r.error;return r}return W(e,l.Parent,t.id)};function W(e,t,r){let n=$.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=h(e),l=o.exports;I[e]=o;let i=new s(o,l);try{n(i,o,l)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&g(o.exports,o.namespaceObject),o}function F(t){let r,n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,s=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(s||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),s=!0),t.set(r,i))}r=o+1}}(t,$)),e.registerChunk(n,r)}let X=new Map;function D(e){let t=X.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},X.set(e,t)}return t}e={async registerChunk(e,r){let n=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(e.src.replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(e);if(D("string"==typeof e?N(e):e.src).resolve(),null!=r){for(let e of r.otherChunks)D(N("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(e=>T(l.Runtime,n,e))),r.runtimeModuleIds.length>0)for(let e of r.runtimeModuleIds)!function(e,t){let r=I[t];if(r){if(r.error)throw r.error;return}W(t,l.Runtime,e)}(n,e)}},loadChunkCached:(e,t)=>(function(e,t){let r=D(t);if(r.loadingStarted)return r.promise;if(e===l.Runtime)return r.loadingStarted=!0,L(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(L(t));else if(q.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(L(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(q.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(N(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(N(r));return await WebAssembly.compileStreaming(o)}};let H=globalThis.TURBOPACK;globalThis.TURBOPACK={push:F},H.forEach(F)})();
@@ -1 +1 @@
1
- 583
1
+ 624
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.5.6/schema.json",
3
+ "vcs": {
4
+ "enabled": true,
5
+ "clientKind": "git",
6
+ "useIgnoreFile": true
7
+ },
8
+ "files": {
9
+ "ignoreUnknown": true,
10
+ "includes": [
11
+ "*.ts",
12
+ "*.tsx",
13
+ "*.mjs",
14
+ "*.js",
15
+ "*.json",
16
+ "src/**/*.ts",
17
+ "src/**/*.tsx",
18
+ "packages/**/*.ts",
19
+ "packages/**/*.tsx",
20
+ "packages/**/*.mjs",
21
+ "packages/**/*.js",
22
+ "packages/**/*.json",
23
+ "scripts/**/*.mjs",
24
+ "bin/**/*.js",
25
+ "!dist/",
26
+ "!p/",
27
+ "!.pi/",
28
+ "!.handoffs/",
29
+ "!.next/",
30
+ "!node_modules/"
31
+ ]
32
+ },
33
+ "formatter": {
34
+ "enabled": false
35
+ },
36
+ "linter": {
37
+ "enabled": true,
38
+ "rules": {
39
+ "preset": "recommended",
40
+ "a11y": {
41
+ "recommended": false
42
+ },
43
+ "complexity": {
44
+ "recommended": false
45
+ },
46
+ "correctness": {
47
+ "noUnusedFunctionParameters": "off",
48
+ "noUnusedImports": "off",
49
+ "noUnusedVariables": "off",
50
+ "useExhaustiveDependencies": "off"
51
+ },
52
+ "performance": {
53
+ "noImgElement": "off"
54
+ },
55
+ "security": {
56
+ "noDangerouslySetInnerHtml": "off"
57
+ },
58
+ "style": {
59
+ "recommended": false
60
+ },
61
+ "suspicious": {
62
+ "noArrayIndexKey": "off",
63
+ "recommended": false
64
+ }
65
+ }
66
+ },
67
+ "assist": {
68
+ "enabled": false
69
+ }
70
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wiki-viewer",
3
- "version": "2.9.2",
4
- "description": "Local file viewer and wiki \u2014 view markdown, HTML, PDFs, notebooks, office docs, and more from any directory",
3
+ "version": "2.9.3",
4
+ "description": "Local file viewer and wiki view markdown, HTML, PDFs, notebooks, office docs, and more from any directory",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
@@ -21,11 +21,14 @@
21
21
  "postbuild": "node bin/postbuild.js",
22
22
  "prepublishOnly": "npm run build",
23
23
  "prepack": "node -e \"require('fs').existsSync('.next/standalone/server.js')||(console.error('ERROR: .next/standalone/server.js missing, run pnpm build before publishing'),process.exit(1))\"",
24
+ "lint": "biome check .",
25
+ "format:check": "node scripts/format-check.mjs",
24
26
  "test": "node scripts/test-floor.mjs",
25
- "test:raw": "tsx --import ./src/tests/proof/preload.ts --test src/tests/proof/*.test.ts"
27
+ "test:raw": "tsx --import ./src/tests/proof/preload.ts --test src/tests/proof/*.test.ts",
28
+ "typecheck": "tsc --noEmit"
26
29
  },
27
30
  "engines": {
28
- "node": ">=22.5.0"
31
+ "node": ">=20.9.0"
29
32
  },
30
33
  "keywords": [
31
34
  "wiki",
@@ -58,6 +61,7 @@
58
61
  "undici": "^8.3.0"
59
62
  },
60
63
  "devDependencies": {
64
+ "@biomejs/biome": "^2.5.6",
61
65
  "@radix-ui/react-context-menu": "^2.2.16",
62
66
  "@radix-ui/react-dialog": "^1.1.15",
63
67
  "@radix-ui/react-dropdown-menu": "^2.1.16",
@@ -122,10 +126,5 @@
122
126
  "unified": "^11.0.5",
123
127
  "xlsx": "^0.18.5",
124
128
  "zustand": "^5.0.12"
125
- },
126
- "pnpm": {
127
- "overrides": {
128
- "kysely": "0.28.5"
129
- }
130
129
  }
131
130
  }
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `pnpm format:check` wrapper.
4
+ *
5
+ * The formatter is currently disabled in biome.json to avoid churn while the
6
+ * lint contract beds in. This script is honest about that: when the formatter
7
+ * is disabled, it prints a notice and exits 0. Once the formatter is enabled,
8
+ * the same script delegates to `biome format .`.
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { spawnSync } from "node:child_process";
12
+
13
+ const biomeConfig = new URL("../biome.json", import.meta.url);
14
+ const cfg = JSON.parse(readFileSync(biomeConfig, "utf8"));
15
+
16
+ if (cfg.formatter?.enabled === false) {
17
+ console.log("format:check: formatter is disabled in biome.json — skipping.");
18
+ process.exit(0);
19
+ }
20
+
21
+ const result = spawnSync("pnpm", ["exec", "biome", "format", "."], {
22
+ stdio: "inherit",
23
+ shell: false,
24
+ });
25
+ process.exit(result.status ?? 1);
@@ -3,10 +3,9 @@
3
3
  * Test runner with a MINIMUM TEST COUNT FLOOR.
4
4
  *
5
5
  * Why this exists: a full run reported `fail 0` and exited 0 while two whole
6
- * test files (demand-search.test.ts, watcher-pool.test.ts 88 tests) produced
7
- * no output at all. The run looked green. The only evidence anything was wrong
8
- * was the total dropping from 557 to 469, which is invisible unless you happen
9
- * to remember the previous number.
6
+ * test files produced no output at all. The run looked green. The only evidence
7
+ * anything was wrong was the total dropping, which is invisible unless you
8
+ * happen to remember the previous number.
10
9
  *
11
10
  * `node --test` exiting 0 does not mean the suite ran. This turns "silently ran
12
11
  * less" into a hard failure.
@@ -15,31 +14,68 @@
15
14
  * exact expectation, so it never breaks on additions.
16
15
  */
17
16
  import { spawn } from "node:child_process";
18
- import { readFileSync, existsSync, writeFileSync } from "node:fs";
17
+ import { readFileSync, existsSync, writeFileSync, readdirSync, statSync } from "node:fs";
19
18
  import path from "node:path";
20
19
 
21
- const FLOOR_FILE = path.join(import.meta.dirname, "..", ".test-floor");
20
+ const TEST_DIR = path.resolve(import.meta.dirname, "..", "src", "tests", "proof");
21
+ const FLOOR_FILE = path.resolve(import.meta.dirname, "..", ".test-floor");
22
22
 
23
- const args = [
24
- "--import",
25
- "./src/tests/proof/preload.ts",
26
- "--test",
27
- ...(process.argv.slice(2).length
28
- ? process.argv.slice(2)
29
- : ["src/tests/proof/*.test.ts"]),
30
- ];
23
+ const rawArgs = process.argv.slice(2);
24
+
25
+ if (rawArgs.includes("--help")) {
26
+ console.log(`Usage: node scripts/test-floor.mjs [options] [files...]
27
+
28
+ Options:
29
+ --update-floor Write the current test count to .test-floor and exit 0.
30
+ --help Show this message and exit 0.
31
+
32
+ Without files, every *.test.ts under src/tests/proof is run.
33
+ With files, those paths are passed through to node --test unchanged.
34
+
35
+ Environment:
36
+ TEST_FLOOR_ENFORCE=1 Enforce the floor even when running a targeted file list.
37
+ `);
38
+ process.exit(0);
39
+ }
40
+
41
+ const updateFloor = rawArgs.includes("--update-floor");
42
+ let userFiles = rawArgs.filter((a) => a !== "--update-floor");
43
+ // pnpm test -- <args> forwards a literal `--` before the user args; strip it
44
+ // so that flags and file paths reach node --test cleanly.
45
+ if (userFiles[0] === "--") {
46
+ userFiles.shift();
47
+ }
48
+
49
+ let testFiles;
50
+ if (userFiles.length > 0) {
51
+ testFiles = userFiles;
52
+ } else {
53
+ // Enumerate tests explicitly so we can spawn the runner without a shell.
54
+ testFiles = readdirSync(TEST_DIR)
55
+ .filter((f) => f.endsWith(".test.ts") && statSync(path.join(TEST_DIR, f)).isFile())
56
+ .sort()
57
+ .map((f) => path.join("src", "tests", "proof", f));
58
+ }
59
+
60
+ const args = ["--import", "./src/tests/proof/preload.ts", "--test", ...testFiles];
31
61
 
32
62
  // Resolve tsx explicitly rather than relying on PATH: this script is also run
33
63
  // directly (not just via pnpm, which injects node_modules/.bin).
34
- const TSX = path.join(import.meta.dirname, "..", "node_modules", ".bin", "tsx");
35
-
36
- // Shell needed for the glob; keep it explicit so the expansion is obvious.
37
- const child = spawn(
38
- `${TSX} ${args.map((a) => (a.includes("*") ? `'${a}'` : a)).join(" ")}`,
39
- { shell: true, stdio: ["inherit", "pipe", "pipe"] },
40
- );
64
+ const TSX = path.resolve(import.meta.dirname, "..", "node_modules", ".bin", "tsx");
41
65
 
42
66
  let out = "";
67
+
68
+ function flushSummary() {
69
+ // node:test's reporter prints "\u2139 tests N" on a TTY (spec reporter) and
70
+ // "# tests N" otherwise (plain TAP, e.g. in CI without a TTY). Accept both.
71
+ const m = out.match(/^(?:\u2139|#) tests (\d+)$/m);
72
+ const pass = out.match(/^(?:\u2139|#) pass (\d+)$/m);
73
+ return { total: m ? Number(m[1]) : null, passCount: pass ? Number(pass[1]) : null };
74
+ }
75
+
76
+ const repoRoot = path.resolve(import.meta.dirname, "..");
77
+ const child = spawn(TSX, args, { cwd: repoRoot, stdio: ["inherit", "pipe", "pipe"] });
78
+
43
79
  for (const stream of [child.stdout, child.stderr]) {
44
80
  stream.on("data", (b) => {
45
81
  const s = String(b);
@@ -48,34 +84,49 @@ for (const stream of [child.stdout, child.stderr]) {
48
84
  });
49
85
  }
50
86
 
51
- child.on("exit", (code) => {
87
+ child.on("error", (err) => {
88
+ console.error(`\n[test-floor] FAIL: failed to spawn test runner: ${err.message}`);
89
+ process.exit(1);
90
+ });
91
+
92
+ child.on("exit", (code, signal) => {
93
+ if (signal) {
94
+ console.error(`\n[test-floor] FAIL: test runner killed by ${signal}`);
95
+ process.exit(1);
96
+ }
97
+ if (code !== 0) process.exit(code ?? 1);
98
+
52
99
  // Only enforce the floor on a full-suite run; a targeted file run is fine.
53
100
  // TEST_FLOOR_ENFORCE=1 forces enforcement on a targeted run, which is how the
54
101
  // guard itself gets tested without paying for a full suite.
55
- const targeted =
56
- process.argv.slice(2).length > 0 && process.env.TEST_FLOOR_ENFORCE !== "1";
102
+ const targeted = userFiles.length > 0 && process.env.TEST_FLOOR_ENFORCE !== "1";
57
103
 
58
- const m = out.match(/^\u2139 tests (\d+)$/m);
59
- const pass = out.match(/^\u2139 pass (\d+)$/m);
60
- const total = m ? Number(m[1]) : null;
104
+ const { total, passCount } = flushSummary();
61
105
 
62
106
  if (!targeted && total === null) {
63
107
  console.error(
64
108
  "\n[test-floor] FAIL: no test summary found. The runner produced no " +
65
- "`\u2139 tests N` line, so the suite did not complete — regardless of exit code.",
109
+ "`ℹ tests N` line, so the suite did not complete — regardless of exit code.",
66
110
  );
67
111
  process.exit(1);
68
112
  }
69
113
 
70
- if (code !== 0) process.exit(code ?? 1);
71
114
  if (targeted) process.exit(0);
72
115
 
73
- if (!existsSync(FLOOR_FILE)) {
116
+ if (updateFloor) {
74
117
  writeFileSync(FLOOR_FILE, `${total}\n`);
75
- console.log(`[test-floor] initialised floor at ${total}`);
118
+ console.log(`[test-floor] floor updated to ${total}`);
76
119
  process.exit(0);
77
120
  }
78
121
 
122
+ if (!existsSync(FLOOR_FILE)) {
123
+ console.error(
124
+ `\n[test-floor] FAIL: ${path.basename(FLOOR_FILE)} does not exist. ` +
125
+ "Re-run with --update-floor to initialise it.",
126
+ );
127
+ process.exit(1);
128
+ }
129
+
79
130
  const floor = Number(readFileSync(FLOOR_FILE, "utf8").trim());
80
131
  if (Number.isFinite(floor) && total < floor) {
81
132
  console.error(
@@ -83,15 +134,13 @@ child.on("exit", (code) => {
83
134
  `${floor - total} test(s) did not run.\n` +
84
135
  "This is the silent-skip failure: `fail 0` and exit 0 while whole files " +
85
136
  "produced no output. Re-run on an idle machine; if the drop is intentional, " +
86
- `lower .test-floor deliberately.`,
137
+ "run `pnpm test -- --update-floor`.",
87
138
  );
88
139
  process.exit(1);
89
140
  }
90
141
 
91
- if (total > floor) {
92
- writeFileSync(FLOOR_FILE, `${total}\n`);
93
- console.log(`[test-floor] floor raised ${floor} \u2192 ${total}`);
94
- }
95
- console.log(`[test-floor] OK: ${pass ? pass[1] : total} passed, floor ${total}`);
142
+ console.log(
143
+ `[test-floor] OK: ${passCount ?? total} passed, ran ${total}${Number.isFinite(floor) ? `, floor ${floor}` : ""}`,
144
+ );
96
145
  process.exit(0);
97
146
  });
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
15
15
  const hostname = process.env.HOSTNAME || '0.0.0.0'
16
16
 
17
17
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
18
- const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"2.9.2"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/sil/wiki-viewer","allowedDevOrigins":["devvm"],"cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/sil/wiki-viewer"},"distDirRoot":".next"}
18
+ const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"2.9.3"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/wiki-viewer/wiki-viewer","allowedDevOrigins":["devvm"],"cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/wiki-viewer/wiki-viewer"},"distDirRoot":".next"}
19
19
 
20
20
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
21
21
 
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  <p>
10
10
  <a href="https://www.npmjs.com/package/wiki-viewer"><img src="https://img.shields.io/npm/v/wiki-viewer" alt="npm version" /></a>
11
- <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node.js ≥18" />
11
+ <img src="https://img.shields.io/badge/node-%3E%3D20.9.0-brightgreen" alt="Node.js ≥20.9.0" />
12
12
  <img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license" />
13
13
  </p>
14
14
  </div>
@@ -364,7 +364,9 @@ read it.
364
364
  - Open a file and use **Share** to mint a link. It serves a rendered, read-only
365
365
  view at `/share/<token>`.
366
366
  - **Password (optional).** Protect a link with a password; only the hash is
367
- stored. Visitors unlock before reading.
367
+ stored. Visitors unlock before reading. A successful password POST sets a
368
+ short-lived, scoped, `HttpOnly` cookie derived from the stored hash; the
369
+ password is never accepted in the URL, query string, or logs.
368
370
  - **Expiry (optional).** Set a number of days; the link returns `410` once
369
371
  expired.
370
372
  - **View counts.** Each open increments a counter visible in the share dialog.
@@ -390,6 +392,10 @@ the file browser it shows a **Launch** button.
390
392
 
391
393
  > Launching runs arbitrary project code on the host. Only launch apps you
392
394
  > trust. Git-backed (read-only) workspaces still run apps but reject writes.
395
+ >
396
+ > In authenticated multi-user mode, starting or stopping an app requires admin
397
+ > privilege. Set `WIKI_ALLOW_APP_RUNNER=1` to explicitly allow non-admins to
398
+ > launch apps in their workspaces.
393
399
 
394
400
  ## Auth and multi-user mode
395
401
 
@@ -705,7 +711,7 @@ Note: `AGENT_BEARER_TOKEN` (legacy single-secret mode) does nothing now. The ser
705
711
 
706
712
  ### Prerequisites
707
713
 
708
- - **Node.js** ≥ 18
714
+ - **Node.js** ≥ 20.9.0
709
715
  - **pnpm** — `npm install -g pnpm`
710
716
 
711
717
  ### Run from source
@@ -728,7 +734,7 @@ The dev server supports hot reload.
728
734
  | `pnpm build` | Production build |
729
735
  | `pnpm start` | Production server (after `build`) |
730
736
  | `pnpm wiki` | CLI entry point (after `build`) |
731
- | `pnpm test` | Run the proof + auth test suite (180+) |
737
+ | `pnpm test` | Run the proof + auth test suite (636 tests, floor 624) |
732
738
 
733
739
  ### All environment variables
734
740
 
@@ -746,6 +752,7 @@ The dev server supports hot reload.
746
752
  | `WIKI_OWNER_HOSTS` | csv: extra hostnames trusted for CSRF Origin check | `localhost,127.0.0.1` |
747
753
  | `WIKI_ALLOW_INSECURE` | Set to `1` to bypass the prod-https guard (dev / CI only) | unset |
748
754
  | `WIKI_ADMIN_EMAILS` | csv: emails treated as admins (seed/override; otherwise first signup is admin) | unset |
755
+ | `WIKI_ALLOW_APP_RUNNER`| Set to `1` to let non-admins launch node apps (host code execution; multi-user risk) | unset |
749
756
  | `AGENT_RATE_LIMIT` | Max mutation ops per minute per agent identity | `60` |
750
757
  | `WIKI_SSH_PASSWORD` | Password for a `--ssh-password` CLI mount (avoids the interactive prompt) | unset |
751
758
 
@@ -878,7 +885,7 @@ wiki-viewer/
878
885
  │ │ ├── app-runner.ts Launches and supervises node-app child processes
879
886
  │ │ └── proof/ Agent protocol core (ops-applier, registry, file-lock)
880
887
  │ ├── stores/ Zustand state
881
- │ ├── tests/proof/ Node test runner suite (180+ tests)
888
+ │ ├── tests/proof/ Node test runner suite (636 tests, floor 624)
882
889
  │ └── middleware.ts Cookie-presence gate for UI routes
883
890
  ├── public/
884
891
  ├── next.config.ts
@@ -0,0 +1,105 @@
1
+ import path from "node:path";
2
+ import os from "node:os";
3
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
4
+
5
+ export const configDir = path.join(os.homedir(), ".wiki-viewer");
6
+ export const configPath = path.join(configDir, "config.json");
7
+ export const logDir = path.join(configDir, "logs");
8
+
9
+ export function loadConfig() {
10
+ if (!existsSync(configPath)) return {};
11
+ try {
12
+ return JSON.parse(readFileSync(configPath, "utf8"));
13
+ } catch {
14
+ console.error(`Warning: could not parse ${configPath}, ignoring it`);
15
+ return {};
16
+ }
17
+ }
18
+
19
+ export function saveConfig(cfg) {
20
+ mkdirSync(configDir, { recursive: true });
21
+ writeFileSync(configPath, JSON.stringify(cfg, null, 2) + "\n");
22
+ }
23
+
24
+ // Pull repeatable `--env KEY=VALUE` (or `-e KEY=VALUE`) pairs out of an argv
25
+ // list. Returns the collected map; the caller has already parsed the rest.
26
+ export function parseEnvFlags(args) {
27
+ const env = {};
28
+ for (let i = 0; i < args.length; i++) {
29
+ if (args[i] === "--env" || args[i] === "-e") {
30
+ const pair = args[++i];
31
+ if (!pair || !pair.includes("=")) {
32
+ console.error(`Error: --env expects KEY=VALUE (got: ${pair ?? "(nothing)"})`);
33
+ process.exit(1);
34
+ }
35
+ const idx = pair.indexOf("=");
36
+ env[pair.slice(0, idx)] = pair.slice(idx + 1);
37
+ }
38
+ }
39
+ return env;
40
+ }
41
+
42
+ export function configCommand(args) {
43
+ const cfg = loadConfig();
44
+
45
+ if (args.length === 0 || args[0] === "show" || args[0] === "list") {
46
+ if (!existsSync(configPath)) {
47
+ console.log(`No config yet at ${configPath}`);
48
+ console.log(`Create one with: wiki-viewer service install [dir] [options] [--env KEY=VALUE]`);
49
+ return;
50
+ }
51
+ console.log(configPath);
52
+ console.log(JSON.stringify(cfg, null, 2));
53
+ return;
54
+ }
55
+
56
+ if (args[0] === "set") {
57
+ const pairs = args.slice(1);
58
+ if (pairs.length === 0) {
59
+ console.error("Usage: wiki-viewer config set KEY=VALUE [KEY=VALUE ...]");
60
+ process.exit(1);
61
+ }
62
+ cfg.env = cfg.env ?? {};
63
+ for (const pair of pairs) {
64
+ const idx = pair.indexOf("=");
65
+ if (idx < 0) { console.error(`Error: expected KEY=VALUE (got: ${pair})`); process.exit(1); }
66
+ cfg.env[pair.slice(0, idx)] = pair.slice(idx + 1);
67
+ }
68
+ saveConfig(cfg);
69
+ console.log(`Updated env in ${configPath}: ${pairs.map((p) => p.split("=")[0]).join(", ")}`);
70
+ if (serviceIsInstalled()) console.log("Run `wiki-viewer service restart` to apply.");
71
+ return;
72
+ }
73
+
74
+ if (args[0] === "unset") {
75
+ const keys = args.slice(1);
76
+ if (keys.length === 0) { console.error("Usage: wiki-viewer config unset KEY [KEY ...]"); process.exit(1); }
77
+ cfg.env = cfg.env ?? {};
78
+ for (const k of keys) delete cfg.env[k];
79
+ saveConfig(cfg);
80
+ console.log(`Removed from env: ${keys.join(", ")}`);
81
+ if (serviceIsInstalled()) console.log("Run `wiki-viewer service restart` to apply.");
82
+ return;
83
+ }
84
+
85
+ if (args[0] === "path") { console.log(configPath); return; }
86
+
87
+ console.error(`Unknown config command: ${args[0]}`);
88
+ console.error("Try: show | set KEY=VALUE | unset KEY | path");
89
+ process.exit(1);
90
+ }
91
+
92
+ // configCommand needs to know whether a service is installed to prompt the user
93
+ // to restart it after an env change. Importing the full service module from
94
+ // config.js would create a circular dependency, so we keep a tiny local check.
95
+ function serviceIsInstalled() {
96
+ const SERVICE_NAME = "wiki-viewer";
97
+ const LAUNCHD_LABEL = "com.wiki-viewer";
98
+ if (process.platform === "linux") {
99
+ return existsSync(path.join(os.homedir(), ".config", "systemd", "user", `${SERVICE_NAME}.service`));
100
+ }
101
+ if (process.platform === "darwin") {
102
+ return existsSync(path.join(os.homedir(), "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`));
103
+ }
104
+ return false;
105
+ }
@@ -0,0 +1,36 @@
1
+ import { createInterface } from "node:readline";
2
+ import { stdin, stdout } from "node:process";
3
+
4
+ // A prompt helper that survives piped (non-TTY) stdin. node:readline/promises
5
+ // closes the stream between awaited questions when input is piped, so we buffer
6
+ // every line via the 'line' event and hand them out one at a time instead.
7
+ export function makePrompter() {
8
+ const rl = createInterface({ input: stdin, output: stdout });
9
+ const queue = [];
10
+ const waiters = [];
11
+ let closed = false;
12
+
13
+ rl.on("line", (line) => {
14
+ if (waiters.length) waiters.shift()(line);
15
+ else queue.push(line);
16
+ });
17
+ rl.on("close", () => {
18
+ closed = true;
19
+ while (waiters.length) waiters.shift()(null);
20
+ });
21
+
22
+ const nextLine = () =>
23
+ new Promise((resolve) => {
24
+ if (queue.length) resolve(queue.shift());
25
+ else if (closed) resolve(null);
26
+ else waiters.push(resolve);
27
+ });
28
+
29
+ const prompt = async (text) => {
30
+ stdout.write(text);
31
+ const line = await nextLine();
32
+ return line == null ? "" : line;
33
+ };
34
+
35
+ return { prompt, close: () => rl.close() };
36
+ }