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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/agent/activity/route.js +6 -6
- package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js +8 -8
- package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js +9 -9
- package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js +8 -8
- package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js +8 -8
- package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/move/route.js +8 -8
- package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/search/route.js +9 -9
- package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/internal/span/route.js +8 -8
- package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/settings/route.js +7 -7
- package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js +6 -6
- package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/assets/[...path]/route.js +5 -5
- package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route.js +6 -5
- package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/route.js +4 -4
- package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/browse/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/clear-root/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/reveal/route.js +6 -6
- package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/root-status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/set-root/route.js +6 -5
- package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js +5 -4
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js +6 -5
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js +5 -4
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/route.js +7 -6
- package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/upload/[...path]/route.js +5 -5
- package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/app/route.js +7 -7
- package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js +7 -7
- package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/content/route.js +7 -7
- package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/download/route.js +6 -6
- package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/file/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/folder/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js +4 -4
- package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js +6 -6
- package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js +4 -4
- package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js +4 -4
- package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-history/route.js +4 -4
- package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js +8 -8
- package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/move/route.js +6 -6
- package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/new-file/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js +7 -7
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/page/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/presence/route.js +6 -6
- package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/search/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/slugs/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/upload/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/watch/route.js +5 -5
- package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/signin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-jzw2_._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.-oq-7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__000spch._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01oin-a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01qcera._.js +16 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02.uul~._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__024967n._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06booxp._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__071_pmz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0bqpg._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_1f2cw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0a6j6r4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0aoqat-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0as-u6z._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bvtbax._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c-ee48._.js +5 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e_9pc5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0esmskc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fshk._._.js +20 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fu72o7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k9mili._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l-wu5u._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lvz22t._.js +20 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n-chxk._.js +16 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n9zdf0._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nmx3k2._.js +12 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nzlmkb._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o0v6hf._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s38pid._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s_8poz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sfrx~.._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sggstu._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u81k~2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uibxf_._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wfv_by._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wlj-yw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w~__xz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yat~ul._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yxauu6._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zbkgnr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zv_j05._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~rntxj._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_search_0d-_j3u._.js +4 -4
- package/.next/standalone/.next/server/chunks/src_lib_search_0ymmp0c._.js +3 -3
- package/.next/standalone/.next/server/chunks/src_lib_workspaces_ts_0qon40u._.js +4 -0
- 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
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0z41nrr._.js → [root-of-the-server]__10te1ye._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_13p348f._.js → node_modules__pnpm_0-a_zjq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0gos._c._.js → node_modules__pnpm_02l_1_8._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ru1i2-._.js → node_modules__pnpm_03rzttw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_08xpp3w._.js → node_modules__pnpm_04frxp9._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0b8odbc._.js → node_modules__pnpm_057-t6m._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0f_n_zp._.js → node_modules__pnpm_05_oahi._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0~i3a.i._.js → node_modules__pnpm_05ans~m._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0i2m0b.._.js → node_modules__pnpm_06-2ia.._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0aha1~u._.js → node_modules__pnpm_086.ow4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0w.kwue._.js → node_modules__pnpm_0cahog3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0e0r_qk._.js → node_modules__pnpm_0cxanql._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ajqqlq._.js → node_modules__pnpm_0e09gmf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0hzzx9d._.js → node_modules__pnpm_0eqjo2f._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_02bje_g._.js → node_modules__pnpm_0f-yazg._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0xk042~._.js → node_modules__pnpm_0iu44jv._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_11ede0p._.js → node_modules__pnpm_0jh8q66._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0k-7uzm._.js → node_modules__pnpm_0m39f~t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0xr.ztu._.js → node_modules__pnpm_0ma-8l.._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0i6_kfe._.js → node_modules__pnpm_0met6sx._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_04v1_ty._.js → node_modules__pnpm_0mtrsi0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0607~kg._.js → node_modules__pnpm_0n_swwn._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0t4l89_._.js → node_modules__pnpm_0ndyy93._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0-_58b8._.js → node_modules__pnpm_0s-cj7c._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0y2h_cz._.js → node_modules__pnpm_0tr41-t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_08edl1n._.js → node_modules__pnpm_0u.uija._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0026mgr._.js → node_modules__pnpm_0wiyn6d._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_09o_spj._.js → node_modules__pnpm_0ygzt82._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_0ss2.w7._.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/0ci7khnv7i~7_.js +17 -0
- package/.next/standalone/.next/static/chunks/0sx~65~lg4mgl.css +5 -0
- package/.next/standalone/package.json +1 -1
- package/README.md +88 -17
- package/bin/postbuild.js +21 -0
- package/bin/wiki-viewer.js +198 -6
- package/package.json +1 -1
- package/.next/standalone/.github/workflows/publish.yml +0 -37
- package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
- package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-.y6im._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-3_t2y._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-kjkzt._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-puax4._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01h996g._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0329ktu._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03_xj4r._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05398dt._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06lfvxh._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06w0aet._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__070_p2a._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0905hi1._.js +0 -21
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0aa63~j._.js +0 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0avcplk._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8_kyo._.js +0 -16
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bticq1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bwevvu._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c__k3q._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cp~z4x._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fmdv9h._.js +0 -20
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h0qbwr._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jk~oyi._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ndq77b._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nvgpuk._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ocvng2._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ps4h~.._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q7jqwp._.js +0 -12
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qew~6p._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0s_9f-a._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uv7b8u._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uv8.9i._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vfe2io._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w11kjy._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wc-.e4._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ymovmp._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~c6ouv._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~rhs0u._.js +0 -16
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10h9tid._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10yk-u1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11105ew._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11a3dhw._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13420tt._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h~pdf._.js +0 -3
- package/.next/standalone/.next/static/chunks/02kg.lbkfi1yc.css +0 -5
- package/.next/standalone/.next/static/chunks/0rcwd6-.iu~nd.js +0 -17
- package/.next/standalone/.pi/ownership.json +0 -3
- package/.next/standalone/AGENTS.md +0 -114
- package/.next/standalone/DESIGN.md +0 -521
- package/.next/standalone/README.md +0 -821
- package/.next/standalone/TODO.md +0 -20
- package/.next/standalone/agents/bootstrap-prompt.md +0 -14
- package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
- package/.next/standalone/bin/postbuild.js +0 -78
- package/.next/standalone/bin/wiki-viewer.js +0 -922
- package/.next/standalone/certificates/localhost-key.pem +0 -28
- package/.next/standalone/certificates/localhost.pem +0 -24
- package/.next/standalone/docs/agent-collab-plan.md +0 -1615
- package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
- package/.next/standalone/docs/agent-fs-plan.md +0 -232
- package/.next/standalone/docs/editorial-skin-spec.md +0 -242
- package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
- package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
- package/.next/standalone/docs/workspacing-plan.md +0 -364
- package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
- package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
- package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
- package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
- package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
- package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
- package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
- package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
- package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
- package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
- package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
- package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
- package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
- package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
- package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
- package/.next/standalone/pnpm-lock.yaml +0 -6697
- package/.next/standalone/pnpm-workspace.yaml +0 -8
- package/.next/standalone/postcss.config.mjs +0 -2
- package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
- package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
- package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
- package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
- package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
- package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
- package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
- package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
- package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
- package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
- package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
- package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
- package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
- package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
- package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
- package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
- package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
- package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
- package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
- package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
- package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
- package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
- package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
- package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
- package/.next/standalone/src/app/api/share/route.ts +0 -127
- package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
- package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
- package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
- package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
- package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
- package/.next/standalone/src/app/api/system/config/route.ts +0 -14
- package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
- package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
- package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
- package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
- package/.next/standalone/src/app/api/system/users/route.ts +0 -120
- package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
- package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
- package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
- package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
- package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
- package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
- package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
- package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
- package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
- package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
- package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
- package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
- package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
- package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
- package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
- package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
- package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
- package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
- package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/route.ts +0 -116
- package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
- package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
- package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
- package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
- package/.next/standalone/src/app/globals.css +0 -1249
- package/.next/standalone/src/app/icon.svg +0 -11
- package/.next/standalone/src/app/layout.tsx +0 -78
- package/.next/standalone/src/app/manifest.ts +0 -30
- package/.next/standalone/src/app/page.tsx +0 -3260
- package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
- package/.next/standalone/src/app/signin/page.tsx +0 -16
- package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
- package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
- package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
- package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
- package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
- package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
- package/.next/standalone/src/components/dir-picker.tsx +0 -606
- package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
- package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
- package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
- package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
- package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
- package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
- package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
- package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
- package/.next/standalone/src/components/editor/editor.tsx +0 -1327
- package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
- package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
- package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
- package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
- package/.next/standalone/src/components/editor/extensions.ts +0 -150
- package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
- package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
- package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
- package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
- package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
- package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
- package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
- package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
- package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
- package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
- package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
- package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
- package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
- package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
- package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
- package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
- package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
- package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
- package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
- package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
- package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
- package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
- package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
- package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
- package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
- package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
- package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
- package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
- package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
- package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
- package/.next/standalone/src/components/share-dialog.tsx +0 -307
- package/.next/standalone/src/components/theme-provider.tsx +0 -16
- package/.next/standalone/src/components/theme-toggle.tsx +0 -24
- package/.next/standalone/src/components/ui/badge.tsx +0 -35
- package/.next/standalone/src/components/ui/button.tsx +0 -56
- package/.next/standalone/src/components/ui/card.tsx +0 -63
- package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
- package/.next/standalone/src/components/ui/command.tsx +0 -151
- package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
- package/.next/standalone/src/components/ui/dialog.tsx +0 -119
- package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
- package/.next/standalone/src/components/ui/input.tsx +0 -22
- package/.next/standalone/src/components/ui/label.tsx +0 -25
- package/.next/standalone/src/components/ui/popover.tsx +0 -33
- package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
- package/.next/standalone/src/components/ui/select.tsx +0 -156
- package/.next/standalone/src/components/ui/separator.tsx +0 -30
- package/.next/standalone/src/components/ui/sheet.tsx +0 -140
- package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
- package/.next/standalone/src/components/ui/switch.tsx +0 -28
- package/.next/standalone/src/components/ui/tabs.tsx +0 -54
- package/.next/standalone/src/components/ui/textarea.tsx +0 -21
- package/.next/standalone/src/components/ui/tip.tsx +0 -23
- package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
- package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
- package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
- package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
- package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
- package/.next/standalone/src/lib/app-runner.ts +0 -272
- package/.next/standalone/src/lib/auth/admin.ts +0 -120
- package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
- package/.next/standalone/src/lib/auth/client.ts +0 -4
- package/.next/standalone/src/lib/auth/csrf.ts +0 -68
- package/.next/standalone/src/lib/auth/server.ts +0 -215
- package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
- package/.next/standalone/src/lib/config.ts +0 -114
- package/.next/standalone/src/lib/embeds/detect.ts +0 -142
- package/.next/standalone/src/lib/git-secrets.ts +0 -65
- package/.next/standalone/src/lib/git.ts +0 -503
- package/.next/standalone/src/lib/google/detect.ts +0 -107
- package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
- package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
- package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
- package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
- package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
- package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
- package/.next/standalone/src/lib/proof/activity.ts +0 -74
- package/.next/standalone/src/lib/proof/audit.ts +0 -88
- package/.next/standalone/src/lib/proof/auth.ts +0 -143
- package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
- package/.next/standalone/src/lib/proof/blocks.ts +0 -73
- package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
- package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
- package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
- package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
- package/.next/standalone/src/lib/proof/glob.ts +0 -51
- package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
- package/.next/standalone/src/lib/proof/lease.ts +0 -117
- package/.next/standalone/src/lib/proof/mutex.ts +0 -36
- package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
- package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
- package/.next/standalone/src/lib/proof/pending.ts +0 -97
- package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
- package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
- package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/registry.ts +0 -195
- package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
- package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
- package/.next/standalone/src/lib/proof/types.ts +0 -182
- package/.next/standalone/src/lib/proof-config.ts +0 -14
- package/.next/standalone/src/lib/root-dir.ts +0 -35
- package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
- package/.next/standalone/src/lib/search/indexer.ts +0 -634
- package/.next/standalone/src/lib/search/sanitize.ts +0 -35
- package/.next/standalone/src/lib/search/search-db.ts +0 -57
- package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
- package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
- package/.next/standalone/src/lib/toast.ts +0 -9
- package/.next/standalone/src/lib/utils.ts +0 -6
- package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
- package/.next/standalone/src/lib/workspace-client.ts +0 -82
- package/.next/standalone/src/lib/workspace-context.ts +0 -173
- package/.next/standalone/src/lib/workspaces.ts +0 -400
- package/.next/standalone/src/middleware.ts +0 -44
- package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
- package/.next/standalone/src/stores/editor-store.ts +0 -439
- package/.next/standalone/src/stores/pin-store.ts +0 -56
- package/.next/standalone/src/stores/proof-store.ts +0 -124
- package/.next/standalone/src/stores/recent-store.ts +0 -51
- package/.next/standalone/src/stores/search-store.ts +0 -104
- package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
- package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
- package/.next/standalone/src/stores/skin-store.ts +0 -42
- package/.next/standalone/src/stores/tree-store.ts +0 -52
- package/.next/standalone/src/stores/view-width-store.ts +0 -101
- package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
- package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
- package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
- package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
- package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
- package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
- package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
- package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
- package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
- package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
- package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
- package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
- package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
- package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
- package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
- package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
- package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
- package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
- package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
- package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
- package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
- package/.next/standalone/src/tests/proof/git.test.ts +0 -243
- package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
- package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
- package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
- package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
- package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
- package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
- package/.next/standalone/src/tests/proof/preload.ts +0 -21
- package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
- package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
- package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
- package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
- package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
- package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
- package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
- package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
- package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
- package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
- package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
- package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
- package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
- package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
- package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
- package/.next/standalone/src/types/index.ts +0 -47
- package/.next/standalone/tailwind.config.ts +0 -191
- package/.next/standalone/tsconfig.json +0 -41
- package/.next/standalone/tsconfig.tsbuildinfo +0 -1
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → ecpoWt_SP3WkUTh0NsnuT}/_ssgManifest.js +0 -0
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
# wiki-viewer-mcp
|
|
2
|
-
|
|
3
|
-
MCP filesystem adapter for [wiki-viewer](https://github.com/anh-chu/wiki-viewer).
|
|
4
|
-
|
|
5
|
-
Maps standard MCP filesystem tools onto the wiki-viewer agent HTTP API so Claude Code, Cursor, and Codex get native-feeling file tools against a **remote** wiki-viewer instance.
|
|
6
|
-
|
|
7
|
-
## First-time setup (register)
|
|
8
|
-
|
|
9
|
-
Before connecting an agent, register it with your wiki-viewer instance.
|
|
10
|
-
The human operator approves the request in the wiki-viewer AI Panel.
|
|
11
|
-
|
|
12
|
-
**Using the built-in CLI (recommended):**
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
# Once published to npm:
|
|
16
|
-
npx wiki-viewer-mcp register \
|
|
17
|
-
--url https://notes.example.com \
|
|
18
|
-
--id ai:myagent \
|
|
19
|
-
--name "My Agent" \
|
|
20
|
-
--scope-paths "**/*" \
|
|
21
|
-
--ops read,mutate,delete \
|
|
22
|
-
--timeout 300
|
|
23
|
-
|
|
24
|
-
# Or from a local build (after cd packages/wiki-viewer-mcp && npm run build):
|
|
25
|
-
node ./dist/index.js register \
|
|
26
|
-
--url http://localhost:3000 \
|
|
27
|
-
--id ai:myagent \
|
|
28
|
-
--name "My Agent"
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
The CLI will:
|
|
32
|
-
|
|
33
|
-
1. POST the registration to wiki-viewer and print the registration ID.
|
|
34
|
-
2. Print `⏳ Waiting for approval. Open the wiki-viewer AI Panel and approve agent "ai:myagent".`
|
|
35
|
-
3. Poll every 3 s until the human approves (or timeout).
|
|
36
|
-
4. On approval, print your `WIKI_VIEWER_TOKEN` and `WIKI_VIEWER_AGENT_ID`, then print a ready-to-paste `mcp.json` snippet.
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
✅ Approved!
|
|
40
|
-
|
|
41
|
-
Agent ID : ai:myagent
|
|
42
|
-
Token : wv_tok_…
|
|
43
|
-
|
|
44
|
-
Paste this into your mcp.json:
|
|
45
|
-
|
|
46
|
-
{
|
|
47
|
-
"servers": {
|
|
48
|
-
"wiki-viewer": {
|
|
49
|
-
"command": "npx",
|
|
50
|
-
"args": ["wiki-viewer-mcp"],
|
|
51
|
-
"env": {
|
|
52
|
-
"WIKI_VIEWER_URL": "https://notes.example.com",
|
|
53
|
-
"WIKI_VIEWER_TOKEN": "wv_tok_…",
|
|
54
|
-
"WIKI_VIEWER_AGENT_ID": "ai:myagent"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**CLI options:**
|
|
62
|
-
|
|
63
|
-
| Flag | Required | Default | Description |
|
|
64
|
-
| --------------- | -------- | ------------- | --------------------------------------------------------- |
|
|
65
|
-
| `--url` | yes | — | Base URL of wiki-viewer, e.g. `https://notes.example.com` |
|
|
66
|
-
| `--id` | yes | — | Agent ID, must match `ai:[a-z][a-z0-9-]{0,30}` |
|
|
67
|
-
| `--name` | yes | — | Human-readable display name |
|
|
68
|
-
| `--scope-paths` | no | `**/*` | Comma-separated path globs the agent can access |
|
|
69
|
-
| `--ops` | no | `read,mutate` | Comma-separated: `read`, `mutate`, `delete` |
|
|
70
|
-
| `--timeout` | no | `300` | Seconds to wait for approval before giving up |
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Installation
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
# Once published to npm:
|
|
78
|
-
npx wiki-viewer-mcp
|
|
79
|
-
# or install globally
|
|
80
|
-
npm i -g wiki-viewer-mcp
|
|
81
|
-
|
|
82
|
-
# From a local build:
|
|
83
|
-
cd packages/wiki-viewer-mcp
|
|
84
|
-
npm run build
|
|
85
|
-
node dist/index.js # start MCP server
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Configuration
|
|
89
|
-
|
|
90
|
-
Set three environment variables before starting the MCP server
|
|
91
|
-
(the `register` command prints them for you after approval):
|
|
92
|
-
|
|
93
|
-
| Var | Description |
|
|
94
|
-
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
95
|
-
| `WIKI_VIEWER_URL` | Base URL of your wiki-viewer instance, e.g. `https://notes.example.com` |
|
|
96
|
-
| `WIKI_VIEWER_TOKEN` | Bearer token obtained via `wiki-viewer-mcp register` |
|
|
97
|
-
| `WIKI_VIEWER_AGENT_ID` | Your agent ID (e.g. `ai:myagent`), sent as `X-Agent-Id` on every request |
|
|
98
|
-
| `WIKI_VIEWER_WORKSPACE` | _Optional._ Workspace id, sent as `X-Workspace` on every request. Targets one root directory when the instance serves several. Omit for single-workspace instances (the server uses its default). |
|
|
99
|
-
|
|
100
|
-
## Usage in Claude Code / Cursor / Codex
|
|
101
|
-
|
|
102
|
-
Add to your `mcp.json` (or equivalent):
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"servers": {
|
|
107
|
-
"wiki-viewer": {
|
|
108
|
-
"command": "npx",
|
|
109
|
-
"args": ["wiki-viewer-mcp"],
|
|
110
|
-
"env": {
|
|
111
|
-
"WIKI_VIEWER_URL": "https://notes.example.com",
|
|
112
|
-
"WIKI_VIEWER_TOKEN": "<your-token>",
|
|
113
|
-
"WIKI_VIEWER_AGENT_ID": "<your-agent-id>"
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Available tools
|
|
121
|
-
|
|
122
|
-
| Tool | Maps to | Description |
|
|
123
|
-
| ---------------- | ---------------------------------- | ----------------------------------------------- |
|
|
124
|
-
| `read_file` | `GET /api/agent/fs/file/<path>` | Read file bytes; captures sha256 + collab state |
|
|
125
|
-
| `write_file` | `PUT /api/agent/fs/file/<path>` | Atomic whole-file write with If-Match |
|
|
126
|
-
| `edit_file` | read → str-replace → PUT | Client-side exact-string replacement |
|
|
127
|
-
| `list_directory` | `GET /api/agent/fs/ls/<path>` | Scope-filtered directory listing |
|
|
128
|
-
| `search` | `POST /api/agent/fs/search` | Server-side grep or glob |
|
|
129
|
-
| `move_file` | `POST /api/agent/fs/move` | Rename/move; sidecar handled by server |
|
|
130
|
-
| `delete_file` | `DELETE /api/agent/fs/file/<path>` | Delete; requires `delete` scope |
|
|
131
|
-
|
|
132
|
-
## Working mode vs Collaborating mode (important)
|
|
133
|
-
|
|
134
|
-
wiki-viewer has two tiers for `.md` files:
|
|
135
|
-
|
|
136
|
-
- **Tier 1 (raw fs)** — fast, all file types, light audit. Use for code, config, non-prose, or whole-file rewrites.
|
|
137
|
-
- **Tier 2 (collab)** — block-ops + proof-spans, review/accept/revert by humans. Use for prose that a human is co-editing.
|
|
138
|
-
|
|
139
|
-
The shim enforces this automatically in three layers:
|
|
140
|
-
|
|
141
|
-
### Layer 1 — discoverable (headers)
|
|
142
|
-
|
|
143
|
-
Every `read_file` response includes:
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
X-Collab-State: active | tracked | untracked | not-markdown
|
|
147
|
-
X-Collab-Revision: <n>
|
|
148
|
-
X-Collab-Snapshot: /api/agent/files/<path>.md
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
| State | Meaning | You should |
|
|
152
|
-
| -------------- | ------------------------------------------------------------ | -------------------------------------- |
|
|
153
|
-
| `active` | Human has the doc open OR there are pending review artifacts | **Use Tier-2 block-ops** |
|
|
154
|
-
| `tracked` | Sidecar exists, no active review | Prefer Tier-2 for prose/semantic edits |
|
|
155
|
-
| `untracked` | Plain `.md`, no collaboration history | Raw ok |
|
|
156
|
-
| `not-markdown` | Not a `.md` file | Raw only |
|
|
157
|
-
|
|
158
|
-
### Layer 2 — client-side guard
|
|
159
|
-
|
|
160
|
-
If the shim's last-known `X-Collab-State` for a `.md` is `active`, `write_file` and `edit_file` are **blocked** before any HTTP request is made. The tool returns a clear error with the Tier-2 snapshot URL.
|
|
161
|
-
|
|
162
|
-
### Layer 3 — server-side enforcement (409)
|
|
163
|
-
|
|
164
|
-
Even if the cache is stale, the server re-checks collab state **atomically inside the write mutex**. A raw `PUT` to an `active` `.md` is rejected with `409 COLLAB_ACTIVE` and the Tier-2 snapshot URL. The shim surfaces this as a clear error message.
|
|
165
|
-
|
|
166
|
-
### Rule
|
|
167
|
-
|
|
168
|
-
> Before editing a `.md`, run `read_file` and check `X-Collab-State`.
|
|
169
|
-
> If `active`, use wiki-viewer block-ops (Tier 2).
|
|
170
|
-
> For everything else, use raw fs tools.
|
|
171
|
-
|
|
172
|
-
## If-Match concurrency
|
|
173
|
-
|
|
174
|
-
The shim caches the sha256 from every `read_file` response (ETag header). `write_file`, `edit_file`, and `delete_file` automatically send this as `If-Match`. If the file changed since your read, you get a `412` error with instructions to re-read.
|
|
175
|
-
|
|
176
|
-
`edit_file` always reads fresh before writing, so it's naturally atomic per-op.
|
|
177
|
-
|
|
178
|
-
Use `force: true` to bypass `If-Match` (audited by the server).
|
|
179
|
-
|
|
180
|
-
## Scope
|
|
181
|
-
|
|
182
|
-
Your token's `scope.paths` (set during registration) governs what paths you can touch. Paths outside scope, and internal paths (`.proof/`, `.locks/`, the app db), are rejected by the server. Scope supports `**`, `*`, `?` glob patterns.
|
|
183
|
-
|
|
184
|
-
The `delete` op is a separate scope permission from `mutate` — an agent can be granted "edit but never delete."
|
|
185
|
-
|
|
186
|
-
## Development
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
cd packages/wiki-viewer-mcp
|
|
190
|
-
pnpm install
|
|
191
|
-
pnpm test # runs unit tests with tsx --test
|
|
192
|
-
pnpm build # compiles to dist/
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
Tests use a mock fetch — no real wiki-viewer instance needed.
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* End-to-end MCP benchmark — measures the FULL stack a remote agent crosses,
|
|
3
|
-
* minus the LLM: MCP stdio JSON-RPC -> shim fetch (keep-alive or not) -> HTTP
|
|
4
|
-
* -> Next standalone server -> route handler -> disk.
|
|
5
|
-
*
|
|
6
|
-
* It spawns the real Next standalone server on a loopback port with an
|
|
7
|
-
* isolated temp ROOT_DIR + temp HOME (seeded agent registry), then drives the
|
|
8
|
-
* REAL wiki-viewer-mcp shim over stdio via the MCP SDK client.
|
|
9
|
-
*
|
|
10
|
-
* Run from repo root:
|
|
11
|
-
* node packages/wiki-viewer-mcp/bench-e2e.mjs
|
|
12
|
-
* Requires: `npm run build` (root) and shim built (npm --prefix packages/wiki-viewer-mcp run build).
|
|
13
|
-
* Env: BENCH_ITERS (default 50), BENCH_WARMUP (default 10), BENCH_URL (skip spawning, hit a remote instance)
|
|
14
|
-
*/
|
|
15
|
-
import { spawn } from "node:child_process";
|
|
16
|
-
import { mkdtemp, writeFile, mkdir, rm } from "node:fs/promises";
|
|
17
|
-
import { tmpdir } from "node:os";
|
|
18
|
-
import path from "node:path";
|
|
19
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
20
|
-
import { fileURLToPath } from "node:url";
|
|
21
|
-
|
|
22
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
23
|
-
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
24
|
-
|
|
25
|
-
const ITERS = Number(process.env.BENCH_ITERS) || 50;
|
|
26
|
-
const WARMUP = Number(process.env.BENCH_WARMUP) || 10;
|
|
27
|
-
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
28
|
-
const REPO = path.resolve(HERE, "../..");
|
|
29
|
-
|
|
30
|
-
function sha256hex(buf) {
|
|
31
|
-
return createHash("sha256").update(buf).digest("hex");
|
|
32
|
-
}
|
|
33
|
-
function pct(s, p) { return s[Math.min(s.length - 1, Math.floor((p / 100) * s.length))]; }
|
|
34
|
-
function stats(label, samples) {
|
|
35
|
-
const s = [...samples].sort((a, b) => a - b);
|
|
36
|
-
const mean = s.reduce((a, b) => a + b, 0) / s.length;
|
|
37
|
-
return { label, p50: pct(s, 50), p95: pct(s, 95), p99: pct(s, 99), mean, max: s[s.length - 1] };
|
|
38
|
-
}
|
|
39
|
-
async function timeIt(fn) { const t = performance.now(); await fn(); return performance.now() - t; }
|
|
40
|
-
|
|
41
|
-
function waitForLog(child, re, timeoutMs = 30000) {
|
|
42
|
-
return new Promise((resolve, reject) => {
|
|
43
|
-
const to = setTimeout(() => reject(new Error("server start timeout")), timeoutMs);
|
|
44
|
-
const onData = (d) => {
|
|
45
|
-
const s = d.toString();
|
|
46
|
-
if (re.test(s)) { clearTimeout(to); child.stdout.off("data", onData); child.stderr.off("data", onData); resolve(); }
|
|
47
|
-
};
|
|
48
|
-
child.stdout.on("data", onData);
|
|
49
|
-
child.stderr.on("data", onData);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function main() {
|
|
54
|
-
let serverProc = null;
|
|
55
|
-
let baseUrl = process.env.BENCH_URL;
|
|
56
|
-
let tmpHome, tmpRoot;
|
|
57
|
-
const TOKEN = randomBytes(32).toString("hex");
|
|
58
|
-
const AGENT_ID = "ai:bench";
|
|
59
|
-
|
|
60
|
-
if (!baseUrl) {
|
|
61
|
-
const PORT = 3917;
|
|
62
|
-
tmpHome = await mkdtemp(path.join(tmpdir(), "bench-e2e-home-"));
|
|
63
|
-
tmpRoot = await mkdtemp(path.join(tmpdir(), "bench-e2e-root-"));
|
|
64
|
-
// Seed registry: ~/.wiki-viewer/agents.json with our agent + hashed token
|
|
65
|
-
const tokenHash = sha256hex(TOKEN);
|
|
66
|
-
await mkdir(path.join(tmpHome, ".wiki-viewer"), { recursive: true });
|
|
67
|
-
const now = new Date().toISOString();
|
|
68
|
-
await writeFile(
|
|
69
|
-
path.join(tmpHome, ".wiki-viewer", "agents.json"),
|
|
70
|
-
JSON.stringify({
|
|
71
|
-
version: 1,
|
|
72
|
-
agents: {
|
|
73
|
-
[AGENT_ID]: {
|
|
74
|
-
id: AGENT_ID, displayName: "Bench", tokenHash,
|
|
75
|
-
scope: { paths: ["**/*"], ops: ["read", "mutate", "delete"] },
|
|
76
|
-
createdAt: now, lastSeen: now,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
}, null, 2),
|
|
80
|
-
{ mode: 0o600 },
|
|
81
|
-
);
|
|
82
|
-
await writeFile(path.join(tmpRoot, "bench.md"), "# Doc\n\n" + "lorem ipsum dolor sit amet. ".repeat(40));
|
|
83
|
-
|
|
84
|
-
serverProc = spawn("node", [path.join(REPO, ".next/standalone/server.js")], {
|
|
85
|
-
env: {
|
|
86
|
-
...process.env,
|
|
87
|
-
HOME: tmpHome,
|
|
88
|
-
ROOT_DIR: tmpRoot,
|
|
89
|
-
PORT: String(PORT),
|
|
90
|
-
HOSTNAME: "127.0.0.1",
|
|
91
|
-
WIKI_ALLOW_INSECURE: "1",
|
|
92
|
-
NODE_ENV: "production",
|
|
93
|
-
},
|
|
94
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
95
|
-
});
|
|
96
|
-
await waitForLog(serverProc, /Ready|started server|Listening|localhost:|127\.0\.0\.1:/i);
|
|
97
|
-
baseUrl = `http://127.0.0.1:${PORT}`;
|
|
98
|
-
// settle
|
|
99
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Drive the REAL shim over stdio
|
|
103
|
-
const transport = new StdioClientTransport({
|
|
104
|
-
command: "node",
|
|
105
|
-
args: [path.join(HERE, "dist/index.js")],
|
|
106
|
-
env: {
|
|
107
|
-
...process.env,
|
|
108
|
-
WIKI_VIEWER_URL: baseUrl,
|
|
109
|
-
WIKI_VIEWER_TOKEN: TOKEN,
|
|
110
|
-
WIKI_VIEWER_AGENT_ID: AGENT_ID,
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
const client = new Client({ name: "bench", version: "0" }, { capabilities: {} });
|
|
114
|
-
await client.connect(transport);
|
|
115
|
-
|
|
116
|
-
const call = (name, args) => client.callTool({ name, arguments: args });
|
|
117
|
-
|
|
118
|
-
const bodyBase = "# Doc\n\n" + "lorem ipsum dolor sit amet. ".repeat(40);
|
|
119
|
-
|
|
120
|
-
// Warm + measure read_file
|
|
121
|
-
const readS = [], writeS = [], editS = [];
|
|
122
|
-
for (let i = 0; i < WARMUP + ITERS; i++) {
|
|
123
|
-
const t = await timeIt(async () => { await call("read_file", { path: "bench.md" }); });
|
|
124
|
-
if (i >= WARMUP) readS.push(t);
|
|
125
|
-
}
|
|
126
|
-
// write_file (whole file) — read once to prime sha cache in shim
|
|
127
|
-
await call("read_file", { path: "bench.md" });
|
|
128
|
-
for (let i = 0; i < WARMUP + ITERS; i++) {
|
|
129
|
-
const t = await timeIt(async () => {
|
|
130
|
-
await call("write_file", { path: "bench.md", content: bodyBase + "\n\nw " + i, force: true });
|
|
131
|
-
});
|
|
132
|
-
if (i >= WARMUP) writeS.push(t);
|
|
133
|
-
}
|
|
134
|
-
// edit_file (read+replace+write inside one tool call)
|
|
135
|
-
await call("write_file", { path: "bench.md", content: bodyBase + "\n\nseed", force: true });
|
|
136
|
-
for (let i = 0; i < WARMUP + ITERS; i++) {
|
|
137
|
-
const find = i === 0 ? "seed" : "e " + (i - 1);
|
|
138
|
-
const t = await timeIt(async () => {
|
|
139
|
-
await call("edit_file", { path: "bench.md", find, replace: "e " + i });
|
|
140
|
-
});
|
|
141
|
-
if (i >= WARMUP) editS.push(t);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const results = [stats("read_file", readS), stats("write_file (whole-file)", writeS), stats("edit_file (read+write)", editS)];
|
|
145
|
-
console.log(`\nE2E MCP benchmark — full stack minus LLM (iters=${ITERS}, warmup=${WARMUP})`);
|
|
146
|
-
console.log(`target: ${baseUrl}${serverProc ? " (local standalone)" : " (remote)"}\n`);
|
|
147
|
-
console.log(["tool".padEnd(26), "p50", "p95", "p99", "mean", "max"].join(" "));
|
|
148
|
-
for (const r of results) {
|
|
149
|
-
console.log([
|
|
150
|
-
r.label.padEnd(26),
|
|
151
|
-
`${r.p50.toFixed(1)}ms`.padStart(8),
|
|
152
|
-
`${r.p95.toFixed(1)}ms`.padStart(8),
|
|
153
|
-
`${r.p99.toFixed(1)}ms`.padStart(8),
|
|
154
|
-
`${r.mean.toFixed(1)}ms`.padStart(8),
|
|
155
|
-
`${r.max.toFixed(1)}ms`.padStart(8),
|
|
156
|
-
].join(" "));
|
|
157
|
-
}
|
|
158
|
-
console.log("");
|
|
159
|
-
|
|
160
|
-
await client.close();
|
|
161
|
-
if (serverProc) serverProc.kill("SIGTERM");
|
|
162
|
-
if (tmpHome) await rm(tmpHome, { recursive: true, force: true });
|
|
163
|
-
if (tmpRoot) await rm(tmpRoot, { recursive: true, force: true });
|
|
164
|
-
process.exit(0);
|
|
165
|
-
}
|
|
166
|
-
main().catch((e) => { console.error(e); process.exit(1); });
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Latency-model benchmark: proves how per-call TCP/TLS handshakes (no keep-alive)
|
|
3
|
-
* vs pooled keep-alive connections behave under WAN-like RTT.
|
|
4
|
-
*
|
|
5
|
-
* It does NOT need the full Next server — it runs a tiny local HTTP server that
|
|
6
|
-
* sleeps RTT/2 before responding (modeling one-way latency), then compares:
|
|
7
|
-
* A) fetch with a fresh connection each call (no keep-alive)
|
|
8
|
-
* B) fetch over a pooled keep-alive agent (undici)
|
|
9
|
-
*
|
|
10
|
-
* For each, it models a "write" (1 request) and an "edit" (2 requests: GET+PUT).
|
|
11
|
-
*
|
|
12
|
-
* Run: node packages/wiki-viewer-mcp/bench-latency.mjs [rttMs]
|
|
13
|
-
*/
|
|
14
|
-
import http from "node:http";
|
|
15
|
-
import { Agent, fetch as undiciFetch } from "undici";
|
|
16
|
-
|
|
17
|
-
const RTT = Number(process.argv[2] ?? process.env.RTT_MS ?? 80); // round-trip ms
|
|
18
|
-
const ITERS = Number(process.env.ITERS ?? 30);
|
|
19
|
-
const ONE_WAY = RTT / 2;
|
|
20
|
-
|
|
21
|
-
function sleep(ms) { return new Promise((r) => setTimeout(r, ms)); }
|
|
22
|
-
|
|
23
|
-
// Local server that injects one-way latency on both receive and send.
|
|
24
|
-
const server = http.createServer(async (req, res) => {
|
|
25
|
-
// drain body
|
|
26
|
-
for await (const _ of req) { /* consume */ }
|
|
27
|
-
await sleep(ONE_WAY); // network: client -> server
|
|
28
|
-
res.writeHead(200, { "Content-Type": "application/json", ETag: '"sha256:abc"', "X-File-Size": "1024" });
|
|
29
|
-
res.end(JSON.stringify({ sha256: "sha256:abc", size: 1024 }));
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
function pct(s, p) { return s[Math.min(s.length - 1, Math.floor((p / 100) * s.length))]; }
|
|
33
|
-
function summarize(label, samples) {
|
|
34
|
-
const s = [...samples].sort((a, b) => a - b);
|
|
35
|
-
const mean = s.reduce((a, b) => a + b, 0) / s.length;
|
|
36
|
-
return `${label.padEnd(40)} p50=${pct(s, 50).toFixed(0)}ms p95=${pct(s, 95).toFixed(0)}ms mean=${mean.toFixed(0)}ms`;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async function bench(label, doCall) {
|
|
40
|
-
const samples = [];
|
|
41
|
-
for (let i = 0; i < ITERS + 5; i++) {
|
|
42
|
-
const t = performance.now();
|
|
43
|
-
await doCall();
|
|
44
|
-
if (i >= 5) samples.push(performance.now() - t);
|
|
45
|
-
}
|
|
46
|
-
return summarize(label, samples);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function main() {
|
|
50
|
-
await new Promise((r) => server.listen(0, "127.0.0.1", r));
|
|
51
|
-
const port = server.address().port;
|
|
52
|
-
const base = `http://127.0.0.1:${port}/x`;
|
|
53
|
-
|
|
54
|
-
// A) No keep-alive: force a fresh connection per request.
|
|
55
|
-
const noKa = new Agent({ pipelining: 0, connections: 1, keepAliveTimeout: 1, keepAliveMaxTimeout: 1 });
|
|
56
|
-
// B) Pooled keep-alive.
|
|
57
|
-
const ka = new Agent({ keepAliveTimeout: 30_000, keepAliveMaxTimeout: 60_000, connections: 10 });
|
|
58
|
-
|
|
59
|
-
const req = (dispatcher, method) =>
|
|
60
|
-
undiciFetch(base, { method, dispatcher, headers: { "content-type": "application/octet-stream" }, body: method === "PUT" ? "x".repeat(1024) : undefined })
|
|
61
|
-
.then((r) => r.arrayBuffer());
|
|
62
|
-
|
|
63
|
-
// Model a COLD connection: TCP(1 RTT) + TLS(≈2 RTT) handshake before the
|
|
64
|
-
// request even goes out. Real HTTPS over WAN pays this on every call when
|
|
65
|
-
// the client doesn't reuse connections. We add it explicitly because
|
|
66
|
-
// loopback can't reproduce handshake cost.
|
|
67
|
-
const HANDSHAKE_RTTS = Number(process.env.HANDSHAKE_RTTS ?? 3); // TCP+TLS ≈ 3 RTT
|
|
68
|
-
const freshReq = async (method) => {
|
|
69
|
-
await sleep(HANDSHAKE_RTTS * RTT); // cold-connection handshake penalty
|
|
70
|
-
const d = new Agent({ keepAliveTimeout: 1, connections: 1 });
|
|
71
|
-
await req(d, method);
|
|
72
|
-
await d.close();
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
console.log(`\nlatency model — RTT=${RTT}ms, iters=${ITERS}\n`);
|
|
76
|
-
console.log(await bench("write · fresh conn per call (no keep-alive)", () => freshReq("PUT")));
|
|
77
|
-
console.log(await bench("write · pooled keep-alive", () => req(ka, "PUT")));
|
|
78
|
-
console.log(await bench("edit · fresh conn per call (GET+PUT)", async () => { await freshReq("GET"); await freshReq("PUT"); }));
|
|
79
|
-
console.log(await bench("edit · pooled keep-alive (GET+PUT)", async () => { await req(ka, "GET"); await req(ka, "PUT"); }));
|
|
80
|
-
console.log("");
|
|
81
|
-
console.log("Note: 'fresh conn' pays TCP handshake (+~1 RTT) per call; real HTTPS adds TLS (+1-2 RTT).");
|
|
82
|
-
console.log("");
|
|
83
|
-
|
|
84
|
-
await noKa.close(); await ka.close();
|
|
85
|
-
server.close();
|
|
86
|
-
}
|
|
87
|
-
main().catch((e) => { console.error(e); process.exit(1); });
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Payload-size model: how much does whole-file PUT cost vs a diff/patch,
|
|
3
|
-
* across realistic .md sizes and uplink speeds? Decides whether a server-side
|
|
4
|
-
* patch endpoint is worth building.
|
|
5
|
-
*
|
|
6
|
-
* Pure arithmetic model (no network needed): upload_time = bytes / uplink_Bps.
|
|
7
|
-
* A small edit changes ~1 line; a patch payload ≈ the changed region + framing.
|
|
8
|
-
*
|
|
9
|
-
* Run: node packages/wiki-viewer-mcp/bench-payload.mjs
|
|
10
|
-
*/
|
|
11
|
-
const DOC_SIZES = [
|
|
12
|
-
{ label: "small note (2 KB)", bytes: 2 * 1024 },
|
|
13
|
-
{ label: "typical doc (20 KB)", bytes: 20 * 1024 },
|
|
14
|
-
{ label: "long doc (100 KB)", bytes: 100 * 1024 },
|
|
15
|
-
{ label: "big doc (500 KB)", bytes: 500 * 1024 },
|
|
16
|
-
];
|
|
17
|
-
// Uplink speeds (bytes/sec). Home/office uplinks are often the bottleneck.
|
|
18
|
-
const UPLINKS = [
|
|
19
|
-
{ label: "fast (10 MB/s)", bps: 10 * 1024 * 1024 },
|
|
20
|
-
{ label: "typical home up (2 Mbps = 0.25 MB/s)", bps: 0.25 * 1024 * 1024 },
|
|
21
|
-
{ label: "slow / shared (0.5 Mbps)", bps: 0.0625 * 1024 * 1024 },
|
|
22
|
-
];
|
|
23
|
-
const PATCH_PAYLOAD = 300; // bytes: a one-line str-replace patch + JSON framing
|
|
24
|
-
|
|
25
|
-
function ms(bytes, bps) { return (bytes / bps) * 1000; }
|
|
26
|
-
|
|
27
|
-
console.log("\nupload-time model — whole-file PUT vs ~300B patch (transfer only)\n");
|
|
28
|
-
for (const up of UPLINKS) {
|
|
29
|
-
console.log(`uplink: ${up.label}`);
|
|
30
|
-
console.log(" " + ["doc".padEnd(22), "whole-file", "patch", "speedup"].join(" "));
|
|
31
|
-
for (const d of DOC_SIZES) {
|
|
32
|
-
const whole = ms(d.bytes, up.bps);
|
|
33
|
-
const patch = ms(PATCH_PAYLOAD, up.bps);
|
|
34
|
-
const speedup = whole / patch;
|
|
35
|
-
console.log(" " + [
|
|
36
|
-
d.label.padEnd(22),
|
|
37
|
-
`${whole.toFixed(0)}ms`.padStart(10),
|
|
38
|
-
`${patch.toFixed(1)}ms`.padStart(7),
|
|
39
|
-
`${speedup.toFixed(0)}x`.padStart(7),
|
|
40
|
-
].join(" "));
|
|
41
|
-
}
|
|
42
|
-
console.log("");
|
|
43
|
-
}
|
|
44
|
-
console.log("Note: this is transfer time only; add RTT + handshake (now pooled) on top.");
|
|
45
|
-
console.log("Whole-file PUT also re-sends unchanged bytes every edit; patch sends only the change.\n");
|