@inkeep/open-knowledge 0.4.0-beta.9 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/assets/skills/open-knowledge/SKILL.md +1 -1
  2. package/dist/cli.mjs +31 -31
  3. package/dist/constants-BWv15Llm.mjs +2 -0
  4. package/dist/dist-Bu-MwAbD.mjs +1 -0
  5. package/dist/{dist-ou5qina8.mjs → dist-D4M20vXU.mjs} +13 -12
  6. package/dist/{dist-DVM7wH81.mjs → dist-DfIz2LcA.mjs} +15 -15
  7. package/dist/index.mjs +1 -1
  8. package/dist/{init-Cw_1Ay1s.mjs → init-B1cOyI0L.mjs} +5 -5
  9. package/dist/init-DssmNpgE.mjs +1 -0
  10. package/dist/loader-CHkc9V89.mjs +1 -0
  11. package/dist/{loader-BTC8Ab4t.mjs → loader-CWaAs1JL.mjs} +3 -3
  12. package/dist/open-browser-BOeCxs2W.mjs +2 -0
  13. package/dist/preview-BjoTulUl.mjs +1 -0
  14. package/dist/{preview-IJyfVtTf.mjs → preview-FAMk9J0z.mjs} +2 -2
  15. package/dist/public/assets/{ActivityModeContent-1ymqlcHI.js → ActivityModeContent-BS-F_q5b.js} +2 -2
  16. package/dist/public/assets/DocumentContext-CKgn09Wu.js +37 -0
  17. package/dist/public/assets/{GraphPanel-DdVygxYk.js → GraphPanel-BYxZ6mOr.js} +2 -2
  18. package/dist/public/assets/McpConsentDialogBody-C-eBNOSk.js +1 -0
  19. package/dist/public/assets/{OutlinePanel-dumodx-h.js → OutlinePanel-B1VwD6nb.js} +1 -1
  20. package/dist/public/assets/SettingsPane-Byz_-VcF.js +11 -0
  21. package/dist/public/assets/{SourceEditor-CR_7DOAH.js → SourceEditor-CF1C1jlS.js} +2 -2
  22. package/dist/public/assets/{_baseFor-CX8dsZbW.js → _baseFor-DTImdh6y.js} +1 -1
  23. package/dist/public/assets/{agent-presence-Ds2n3U5P.js → agent-presence-CaGG2gp7.js} +1 -1
  24. package/dist/public/assets/{arc-BL_OKZmE.js → arc-VNWsD8TF.js} +1 -1
  25. package/dist/public/assets/architecture-YZFGNWBL-BiRl99NU.js +1 -0
  26. package/dist/public/assets/{architectureDiagram-Q4EWVU46-BKKtWWhU.js → architectureDiagram-Q4EWVU46-C7EDVIb_.js} +1 -1
  27. package/dist/public/assets/{blockDiagram-DXYQGD6D-fzO4vZye.js → blockDiagram-DXYQGD6D-RDoQRmSR.js} +1 -1
  28. package/dist/public/assets/button-qDXa0MxS.js +1 -0
  29. package/dist/public/assets/{c4Diagram-AHTNJAMY-BkXqEjiP.js → c4Diagram-AHTNJAMY-DWq5v6f-.js} +1 -1
  30. package/dist/public/assets/channel-C0UNiHDS.js +1 -0
  31. package/dist/public/assets/checkbox-kWXLLH40.js +1 -0
  32. package/dist/public/assets/{chunk-2KRD3SAO-DQj0pw3H.js → chunk-2KRD3SAO-BTibUhx6.js} +1 -1
  33. package/dist/public/assets/{chunk-336JU56O-CBajDulv.js → chunk-336JU56O-Bm6IwRki.js} +2 -2
  34. package/dist/public/assets/chunk-426QAEUC-BexV_O4G.js +1 -0
  35. package/dist/public/assets/{chunk-4BX2VUAB-D8pbSOlJ.js → chunk-4BX2VUAB-Dzrv7xRQ.js} +1 -1
  36. package/dist/public/assets/{chunk-4TB4RGXK-mA6CujZO.js → chunk-4TB4RGXK-n_VCZ-Dw.js} +1 -1
  37. package/dist/public/assets/chunk-55IACEB6-yo8vOoww.js +1 -0
  38. package/dist/public/assets/{chunk-5FUZZQ4R-BVDLgFg2.js → chunk-5FUZZQ4R-CwFS-NM9.js} +1 -1
  39. package/dist/public/assets/{chunk-5PVQY5BW-Cxi5d3lT.js → chunk-5PVQY5BW-Cf3pEIAB.js} +1 -1
  40. package/dist/public/assets/{chunk-67CJDMHE-CdrAY8qZ.js → chunk-67CJDMHE-B1qjR6o5.js} +1 -1
  41. package/dist/public/assets/{chunk-7N4EOEYR-CJ3HBg3c.js → chunk-7N4EOEYR-9LthribN.js} +1 -1
  42. package/dist/public/assets/{chunk-AA7GKIK3-D0ckJAXt.js → chunk-AA7GKIK3-DFgv_Jxv.js} +1 -1
  43. package/dist/public/assets/{chunk-BSJP7CBP-D4bNhKd7.js → chunk-BSJP7CBP-BMfaq0VP.js} +1 -1
  44. package/dist/public/assets/{chunk-CIAEETIT-D1Fpp2md.js → chunk-CIAEETIT-DUfZ-zCl.js} +1 -1
  45. package/dist/public/assets/{chunk-EDXVE4YY-ChhT3Iyo.js → chunk-EDXVE4YY-BKbUy63F.js} +1 -1
  46. package/dist/public/assets/{chunk-ENJZ2VHE-Bby39so4.js → chunk-ENJZ2VHE-DIZOQmDi.js} +1 -1
  47. package/dist/public/assets/{chunk-FMBD7UC4-pRkDIOZn.js → chunk-FMBD7UC4-DA5iFIgZ.js} +1 -1
  48. package/dist/public/assets/{chunk-FOC6F5B3-BsB4oTj4.js → chunk-FOC6F5B3-DlEcGgqD.js} +1 -1
  49. package/dist/public/assets/{chunk-ICPOFSXX-CrnuSfeJ.js → chunk-ICPOFSXX-BDU_0nPa.js} +2 -2
  50. package/dist/public/assets/{chunk-K5T4RW27-CtREah_n.js → chunk-K5T4RW27-CZi_8YH2.js} +1 -1
  51. package/dist/public/assets/{chunk-KGLVRYIC-DtDxSfKu.js → chunk-KGLVRYIC-q8yxX2UV.js} +1 -1
  52. package/dist/public/assets/{chunk-LIHQZDEY-D63TRk6j.js → chunk-LIHQZDEY-BqlaDvTQ.js} +1 -1
  53. package/dist/public/assets/{chunk-ORNJ4GCN-Dv2PvYVu.js → chunk-ORNJ4GCN-B6A2jdfA.js} +1 -1
  54. package/dist/public/assets/{chunk-OYMX7WX6-BhfqKepC.js → chunk-OYMX7WX6-BtgGgZZ0.js} +1 -1
  55. package/dist/public/assets/chunk-QZHKN3VN-Dm2czGiD.js +1 -0
  56. package/dist/public/assets/{chunk-U2HBQHQK-6BAKH95D.js → chunk-U2HBQHQK-LrOM0aht.js} +1 -1
  57. package/dist/public/assets/{chunk-X2U36JSP-Cqpkx90-.js → chunk-X2U36JSP-CsEhwsxu.js} +1 -1
  58. package/dist/public/assets/{chunk-XPW4576I-DSytTnq4.js → chunk-XPW4576I-D3W7wPR1.js} +1 -1
  59. package/dist/public/assets/{chunk-YZCP3GAM-Dt9awjVh.js → chunk-YZCP3GAM-C2TR8l-U.js} +1 -1
  60. package/dist/public/assets/{chunk-ZZ45TVLE-JGFITgiO.js → chunk-ZZ45TVLE-DGa_Hgat.js} +1 -1
  61. package/dist/public/assets/classDiagram-6PBFFD2Q-DqMO_sxB.js +1 -0
  62. package/dist/public/assets/classDiagram-v2-HSJHXN6E-BbC-74zc.js +1 -0
  63. package/dist/public/assets/clone-DpRB82L-.js +1 -0
  64. package/dist/public/assets/config-validation-events-BX5T6Pv4.js +7 -0
  65. package/dist/public/assets/{cose-bilkent-S5V4N54A-B9nG-SHi.js → cose-bilkent-S5V4N54A-cxoevGhk.js} +1 -1
  66. package/dist/public/assets/{dagre-BEdPLXba.js → dagre-DoC3Vx7E.js} +1 -1
  67. package/dist/public/assets/{dagre-KV5264BT-DKn5nGCC.js → dagre-KV5264BT-CjRUxU3J.js} +1 -1
  68. package/dist/public/assets/{diagram-5BDNPKRD-BQuwYEd0.js → diagram-5BDNPKRD-DlgILr6_.js} +1 -1
  69. package/dist/public/assets/{diagram-G4DWMVQ6-BmzIMyV5.js → diagram-G4DWMVQ6-CA3PL8En.js} +1 -1
  70. package/dist/public/assets/{diagram-MMDJMWI5-CI5eJfgr.js → diagram-MMDJMWI5-DVx-bZhM.js} +1 -1
  71. package/dist/public/assets/{diagram-TYMM5635-Cc8TJ7v3.js → diagram-TYMM5635-DCl_Xx4h.js} +1 -1
  72. package/dist/public/assets/dialog-CV9Q4JrD.js +45 -0
  73. package/dist/public/assets/{dist-nPpvoMNC.js → dist-BEF_m-Pp.js} +1 -1
  74. package/dist/public/assets/{dist-BH1b1nWB.js → dist-BJPjDIRr.js} +1 -1
  75. package/dist/public/assets/{dist-S8LJmtzL.js → dist-Bf3rdSRu.js} +1 -1
  76. package/dist/public/assets/{dist-D08h1pJc.js → dist-ByDNshqn.js} +1 -1
  77. package/dist/public/assets/{dist-B4kUko7n.js → dist-CSfB7p8y.js} +1 -1
  78. package/dist/public/assets/{dist-VyzSEzD4.js → dist-DVWct0HX.js} +1 -1
  79. package/dist/public/assets/{dist-BOapDt7N.js → dist-Gvva1zQ6.js} +1 -1
  80. package/dist/public/assets/{doc-hash-Q6dTjwu5.js → doc-hash-CfmBVnag.js} +90 -90
  81. package/dist/public/assets/{erDiagram-SMLLAGMA-BkrhGWMT.js → erDiagram-SMLLAGMA-ChTvmoDx.js} +1 -1
  82. package/dist/public/assets/{flatten-UmyAv3V9.js → flatten-DXpXo4tl.js} +1 -1
  83. package/dist/public/assets/{flowDiagram-DWJPFMVM-qh62fanI.js → flowDiagram-DWJPFMVM-8ceKQudh.js} +1 -1
  84. package/dist/public/assets/{ganttDiagram-T4ZO3ILL-DXuCeCk6.js → ganttDiagram-T4ZO3ILL-uadeK_KN.js} +1 -1
  85. package/dist/public/assets/gitGraph-7Q5UKJZL-CN7yaTu1.js +1 -0
  86. package/dist/public/assets/{gitGraphDiagram-UUTBAWPF-BbcuenPj.js → gitGraphDiagram-UUTBAWPF-BcANz6_Q.js} +1 -1
  87. package/dist/public/assets/{graphlib-CasrTmMJ.js → graphlib-D3l3HBM4.js} +1 -1
  88. package/dist/public/assets/index-B4T9ZPge.js +1854 -0
  89. package/dist/public/assets/index-DFiz58v4.css +1 -0
  90. package/dist/public/assets/info-OMHHGYJF-oSrA8B1G.js +1 -0
  91. package/dist/public/assets/{infoDiagram-42DDH7IO-WFAMbO2S.js → infoDiagram-42DDH7IO-qKcHjiUa.js} +1 -1
  92. package/dist/public/assets/{isEmpty-DWJlzxR1.js → isEmpty-D9j5AQZB.js} +1 -1
  93. package/dist/public/assets/isSymbol-C4J31wCa.js +1 -0
  94. package/dist/public/assets/{ishikawaDiagram-UXIWVN3A-BJBiReWg.js → ishikawaDiagram-UXIWVN3A-DyndBZjz.js} +1 -1
  95. package/dist/public/assets/{journeyDiagram-VCZTEJTY-Boq77pl6.js → journeyDiagram-VCZTEJTY-CTiuXUzg.js} +1 -1
  96. package/dist/public/assets/{kanban-definition-6JOO6SKY-DYMSr18F.js → kanban-definition-6JOO6SKY-D03tqXqX.js} +1 -1
  97. package/dist/public/assets/label-BOVWulDu.js +1 -0
  98. package/dist/public/assets/{line-_p5Px7MV.js → line-CZuyNGqX.js} +1 -1
  99. package/dist/public/assets/{linear-DwuDS4qT.js → linear-CoY1VP-w.js} +1 -1
  100. package/dist/public/assets/{mermaid-parser.core-BcBb_Ows.js → mermaid-parser.core-D4O7MeLl.js} +2 -2
  101. package/dist/public/assets/{mermaid.core-ZLTnLqVQ.js → mermaid.core-4xgx5kDJ.js} +3 -3
  102. package/dist/public/assets/{mindmap-definition-QFDTVHPH-BSxM4djR.js → mindmap-definition-QFDTVHPH-BaMNW13B.js} +1 -1
  103. package/dist/public/assets/{now-BBH4UqDm.js → now-CJgVN_7h.js} +1 -1
  104. package/dist/public/assets/{ordinal-CeOFUmRv.js → ordinal-BZbu6HlW.js} +1 -1
  105. package/dist/public/assets/packet-4T2RLAQJ-N-KqWOhj.js +1 -0
  106. package/dist/public/assets/{panel-BgMqDESF.js → panel-BaN47PCr.js} +1 -1
  107. package/dist/public/assets/pie-ZZUOXDRM-BcRf7Q2g.js +1 -0
  108. package/dist/public/assets/{pieDiagram-DEJITSTG-CHRE_Jie.js → pieDiagram-DEJITSTG-_dBzvPAb.js} +1 -1
  109. package/dist/public/assets/{propagation-api-qAYD7s-v.js → propagation-api-CuTE-jIt.js} +1 -1
  110. package/dist/public/assets/{quadrantDiagram-34T5L4WZ-CQkE5TwH.js → quadrantDiagram-34T5L4WZ-jnOwhGSn.js} +1 -1
  111. package/dist/public/assets/radar-PYXPWWZC-CqcGRFrW.js +1 -0
  112. package/dist/public/assets/{reduce-DotyoGA7.js → reduce-Cn1fAmcq.js} +1 -1
  113. package/dist/public/assets/{requirementDiagram-MS252O5E-DHK98tKS.js → requirementDiagram-MS252O5E-DpZY5MOe.js} +1 -1
  114. package/dist/public/assets/{sankeyDiagram-XADWPNL6-BIXaStZh.js → sankeyDiagram-XADWPNL6-CNLrFRka.js} +1 -1
  115. package/dist/public/assets/{sequenceDiagram-FGHM5R23-BCNH3kJo.js → sequenceDiagram-FGHM5R23-Cqjio9cN.js} +1 -1
  116. package/dist/public/assets/{src-C9jsS3p4.js → src-CVigMQ0t.js} +1 -1
  117. package/dist/public/assets/{stateDiagram-FHFEXIEX-BC5mjB6x.js → stateDiagram-FHFEXIEX-rE9sZdwc.js} +1 -1
  118. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-CrJSNsUc.js +1 -0
  119. package/dist/public/assets/{target-navigation-intent-BfGOumP6.js → target-navigation-intent-CNDuSbLi.js} +1 -1
  120. package/dist/public/assets/{telemetry-impl-CMeDUVKn.js → telemetry-impl-iq6UBtaA.js} +2 -2
  121. package/dist/public/assets/{timeline-definition-GMOUNBTQ-VNxUGgXp.js → timeline-definition-GMOUNBTQ-B_X3o8J_.js} +1 -1
  122. package/dist/public/assets/tooltip-csUfbEtd.js +1 -0
  123. package/dist/public/assets/treeView-SZITEDCU-B1rO_oUt.js +1 -0
  124. package/dist/public/assets/treemap-W4RFUUIX-DXE3h2Bn.js +1 -0
  125. package/dist/public/assets/{vennDiagram-DHZGUBPP-DV2Y2j0r.js → vennDiagram-DHZGUBPP-Cs25K1vw.js} +1 -1
  126. package/dist/public/assets/wardley-RL74JXVD-ChWi2iyS.js +1 -0
  127. package/dist/public/assets/{wardleyDiagram-NUSXRM2D-C1mMZ3kx.js → wardleyDiagram-NUSXRM2D-RgfpVD8G.js} +1 -1
  128. package/dist/public/assets/{xychartDiagram-5P7HB3ND-CxFcwN2X.js → xychartDiagram-5P7HB3ND-BrRrEDJB.js} +1 -1
  129. package/dist/public/index.html +20 -19
  130. package/dist/src-B_Vh13Py.mjs +1 -0
  131. package/dist/{start-BDIOjX_O.mjs → start-CSRc43Yr.mjs} +2 -2
  132. package/dist/start-DVUu2YvT.mjs +1 -0
  133. package/package.json +1 -1
  134. package/dist/constants-CswmjLU5.mjs +0 -2
  135. package/dist/dist-BToVkFhc.mjs +0 -1
  136. package/dist/init-C90VliDt.mjs +0 -1
  137. package/dist/loader-BOTBqos-.mjs +0 -1
  138. package/dist/open-browser-BZZK_gJj.mjs +0 -2
  139. package/dist/preview-CGUMKfC0.mjs +0 -1
  140. package/dist/public/assets/DocumentContext-bvfr7pL2.js +0 -37
  141. package/dist/public/assets/McpConsentDialogBody-CJwPf_uv.js +0 -1
  142. package/dist/public/assets/SettingsPane-CtgbQZxP.js +0 -6
  143. package/dist/public/assets/architecture-YZFGNWBL-DVxNz-zn.js +0 -1
  144. package/dist/public/assets/button-BsFpqlpT.js +0 -1
  145. package/dist/public/assets/channel-CR-xJel6.js +0 -1
  146. package/dist/public/assets/chunk-426QAEUC-BoBKbVmN.js +0 -1
  147. package/dist/public/assets/chunk-55IACEB6-CqVyNzhX.js +0 -1
  148. package/dist/public/assets/chunk-QZHKN3VN-DBRWHtgj.js +0 -1
  149. package/dist/public/assets/classDiagram-6PBFFD2Q-oopM_Z0m.js +0 -1
  150. package/dist/public/assets/classDiagram-v2-HSJHXN6E-ZAL74u9S.js +0 -1
  151. package/dist/public/assets/clone-C5y6xhRJ.js +0 -1
  152. package/dist/public/assets/config-validation-events-BvuBj41U.js +0 -1
  153. package/dist/public/assets/dialog-Cv1qneWl.js +0 -45
  154. package/dist/public/assets/gitGraph-7Q5UKJZL-CYhZlmk3.js +0 -1
  155. package/dist/public/assets/index-BBbaN3Kd.js +0 -1858
  156. package/dist/public/assets/index-DOkkqO-8.css +0 -1
  157. package/dist/public/assets/info-OMHHGYJF-BslcKZhH.js +0 -1
  158. package/dist/public/assets/isSymbol-BP7IOIqG.js +0 -1
  159. package/dist/public/assets/mcp-consent-store-BBTXqzE6.js +0 -1
  160. package/dist/public/assets/packet-4T2RLAQJ-QVnYA304.js +0 -1
  161. package/dist/public/assets/pie-ZZUOXDRM-C61c5byc.js +0 -1
  162. package/dist/public/assets/radar-PYXPWWZC-CMxjRtd8.js +0 -1
  163. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-B8L3BBt1.js +0 -1
  164. package/dist/public/assets/tooltip-CBGDOTMI.js +0 -1
  165. package/dist/public/assets/treeView-SZITEDCU-DfSa_Oiv.js +0 -1
  166. package/dist/public/assets/treemap-W4RFUUIX-Cp0s5wEq.js +0 -1
  167. package/dist/public/assets/wardley-RL74JXVD-CXcBKCuj.js +0 -1
  168. package/dist/src-DXx7F2B7.mjs +0 -1
  169. package/dist/start-DmOxN4Ez.mjs +0 -1
  170. /package/dist/public/assets/{ActivityPanelDiffView-DoHWP1ak.js → ActivityPanelDiffView-B_49ivYc.js} +0 -0
  171. /package/dist/public/assets/{__vite-browser-external-FEGw1XPd.js → __vite-browser-external-6Gb3h3lj.js} +0 -0
  172. /package/dist/public/assets/{array-X0JlPOfd.js → array-DO1uCttT.js} +0 -0
  173. /package/dist/public/assets/{colors-XIJoz9Bd.js → colors-BjbB2MOj.js} +0 -0
  174. /package/dist/public/assets/{cytoscape.esm-BkjNfcSF.js → cytoscape.esm-AyAnQ5hQ.js} +0 -0
  175. /package/dist/public/assets/{defaultLocale-ZxyFnXCb.js → defaultLocale-B6RGN4id.js} +0 -0
  176. /package/dist/public/assets/{dist-CIRuNcH5.js → dist-0bM9CqzR.js} +0 -0
  177. /package/dist/public/assets/{go-a33xvodr.js → go-BRhAdNMM.js} +0 -0
  178. /package/dist/public/assets/{init-CBj3ecIW.js → init-BmUWJJHz.js} +0 -0
  179. /package/dist/public/assets/{isObjectLike-AdQZ65l0.js → isObjectLike-CjYO71dq.js} +0 -0
  180. /package/dist/public/assets/{katex-qwlL5fSd.js → katex-DBuiuHex.js} +0 -0
  181. /package/dist/public/assets/{min-HKuGSUqa.js → min-CwjSmrJ6.js} +0 -0
  182. /package/dist/public/assets/{path-rUlDLHdA.js → path-CoPyR7c2.js} +0 -0
  183. /package/dist/public/assets/{pdf-a35ddrIO.js → pdf-DaFpV-4n.js} +0 -0
  184. /package/dist/public/assets/{pdf.worker-CM-zAFN-.js → pdf.worker-Cq62cyp3.js} +0 -0
  185. /package/dist/public/assets/{rough.esm-BFJ-MgcB.js → rough.esm-ec8xsRC7.js} +0 -0
  186. /package/dist/public/assets/{shell-40VLet8r.js → shell-DT_H80Gx.js} +0 -0
  187. /package/dist/public/assets/{src-zyMpT2LE.js → src-CWigLjcs.js} +0 -0
  188. /package/dist/public/assets/{stex-BKMR5xQj.js → stex-DQW679lh.js} +0 -0
  189. /package/dist/public/assets/{trace-api-DPMyR1_m.js → trace-api-CbLDdnQA.js} +0 -0
  190. /package/dist/public/assets/{w3c-keyname-Dfj2imOv.js → w3c-keyname-B5t0fahT.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{a as __toCommonJS,i as __require$1,n as __esmMin,o as __toESM$1,r as __exportAll,t as __commonJSMin$1}from"./chunk-FK9Q3tQk.mjs";import{$ as mediaKindForSidebarAssetExtension,$t as parse$1,A as SkillStateSchema,At as array,B as createWorkspaceSearchDocument,Bt as preprocess,C as INLINE_RENDERABLE_EXTENSIONS,Ct as withConfigSpan,D as SKILL_STATE_TARGETS,Dt as _enum,E as SKILL_STATE_REL,Et as ZodOptional$1,F as colorFromSeed,Ft as literal,G as extractFrontmatterTags,H as detectAppliedToleranceClasses,Ht as string,I as createBasenameIndex,It as looseObject,J as getWikiLinkText,K as getHeadingSlug,Kt as datetime,L as createCodeFenceTracker,Lt as number,M as applyIncrementalDiff,Mt as custom,N as classifyMarkdownHref,Nt as discriminatedUnion,O as SKILL_STATE_VERSION_RE,Ot as _null,P as classifyWikiLinkTarget,Pt as intersection,Q as isOrphanMode,Qt as $ZodType,R as createTagInTextRegex,Rt as object$1,St as validatePatchScopes,T as ORPHAN_MODES,U as emptySkillState,Ut as union,V as defaultScheduler,Vt as record,W as expandTagToHierarchy,Wt as unknown,X as iconFromClientName,Xt as meta$1,Y as humanFormat,Yt as describe$1,Z as isKnownConfigError,Zt as $ZodObject,_ as CONFIG_DOC_NAME_PROJECT_LOCAL,_t as LOCAL_DIR,a as CC1BranchSwitchedPayloadSchema,an as normalizeParams,at as resolveInternalHref,bt as locateIssue,c as CC1DiskAckPayloadSchema,cn as require_dist$2,ct as stripFrontmatter,d as CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,dt as unwrapFrontmatterFences,en as parseAsync,et as mergeThreeWay,f as CC1_CHANNEL_DISK_ACK,ft as getSchema,g as CONFIG_DOC_NAME_PROJECT,gt as ConfigSchema$1,h as CONFIG_DOC_NAMES,ht as CONFIG_SCHEMA_MAJOR_PATH,i as BridgeMergeContentLossError,in as defineLazy,it as resolveAssetProjectPath,j as applyFastDiff,jt as boolean,k as SYSTEM_DOC_NAME,l as CC1ServerInfoPayloadSchema,lt as tagsMatchingPrefix,m as CC1_CONTRACT_VERSION,mt as Fragment,n as ASSET_EXTENSIONS,nn as safeParseAsync$1,nt as prependFrontmatter,o as CC1ConfigValidationRejectedPayloadSchema,on as $constructor,ot as searchWorkspaceCorpus,p as CC1_CHANNEL_SERVER_INFO,pt as PluginKey,q as getParseHealth,qt as toJSONSchema,r as BridgeInvariantViolationError,rn as clone,rt as readFmMap,s as CC1DerivedViewPayloadSchema,st as sharedExtensions,t as AGENT_ICON_COLORS,tn as safeParse$1,tt as normalizeBridge,u as CC1_CHANNEL_BRANCH_SWITCHED,ut as toWikiLinkSlug,v as CONFIG_DOC_NAME_USER,vt as addConfigSpanEvent,w as MarkdownManager,wt as withConfigSpanSync,xt as toConfigIssue,y as DEFAULT_DEDUP_MODE,yt as applyPatchToDocument,z as createWorkspaceSearchCorpus,zt as optional}from"./dist-DVM7wH81.mjs";import{a as metrics,c as SpanStatusCode,i as propagation,l as SpanKind,n as init_esm$2,o as diag,r as trace,s as context,t as esm_exports$2}from"./esm-BbkJd7ro.mjs";import{a as acquireProcessLock,c as isValidLockPid,f as readServerLock,g as updateProcessLockPort,m as releaseServerLock,n as RUNTIME_VERSION,o as acquireServerLock,p as releaseProcessLock,s as isProcessAlive,t as ProcessLockCollisionError,u as readProcessLock}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{a as require_src$15,i as esm_default,r as withParentLock,t as createGitInstance}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{r as diffLines,t as createPatch}from"./libesm-YL3Bqolr.mjs";import{n as mimes}from"./mrmime-C2W7cgq2.mjs";import{t as b1}from"./chunk-YNYSPYQ5-DesxOVHh.mjs";import{a as c,c as h,d as m,f as p,h as x,i as b,l as i,m as v,n as C,o as d,p as u,r as a,s as f,t as $$1,u as l}from"./chunk-GFQRA5P5-DnjwTqP3.mjs";import{A as gt,B as wt,C as _i$1,D as da$1,E as bt,F as pe,H as zi$1,I as qi,L as us$1,M as ma$1,N as mt$1,O as di$1,P as pa$1,S as X$1,T as bl,V as xi$1,_ as Ti$1,a as Fi$1,b as W$1,c as M,d as P,f as Pt$1,g as T,h as Sl,i as En$1,j as he,k as ga$1,l as Nl,m as Se,n as Bi$1,o as Fs$1,p as R,r as Ci$1,s as G$1,t as Al,u as Oi$1,v as V,w as be,x as Wi$1,y as Vi$1,z as wl}from"./chunk-FEIOJCZD-C25Und0M.mjs";import{a as d$1,c as m$1,d as y,i as c$1,l as p$1,n as N,o as f$1,r as P$1,s as h$1,t as $$2,u as v$1}from"./chunk-XHM67O4N-akBjDPaR.mjs";import{n as l$1,r as o,t as h$2}from"./chunk-R6VWJ2ZL-FwG_Za20.mjs";import{r as o$1}from"./chunk-CWQS3NFK-Co4ALolT.mjs";import"./chunk-DXB73IDG-DIKSLkPq.mjs";import{n as d$2,t as _$1}from"./chunk-5QMZ5MUS-CAp625aG.mjs";import{n as u$1,t as b$1}from"./chunk-A5O5YHGN-DvJz5Cpw.mjs";import{n,r,t as c$2}from"./chunk-OJDRYQWQ-ikvLWpfV.mjs";import{r as x$1,t as a$1}from"./chunk-24IMIIXA-B6yIPkk2.mjs";import{n as n$1}from"./chunk-3THT3N7L-DztAF386.mjs";import{t as n$2}from"./chunk-44UOCSGV-CaFxJDHm.mjs";import{createRequire}from"node:module";import{execFile,spawn,spawnSync}from"node:child_process";import*as U from"node:path";import{basename,dirname,extname,isAbsolute,join,normalize,posix,relative,resolve,sep}from"node:path";import*as I from"node:fs";import{appendFileSync,closeSync,createReadStream,createWriteStream,existsSync,linkSync,lstatSync,mkdirSync,openSync,readFile,readFileSync,readSync,readdirSync,realpathSync,renameSync,rmSync,rmdirSync,statSync,unlinkSync,writeFileSync}from"node:fs";import{homedir,hostname,platform,tmpdir}from"node:os";import{URLSearchParams as URLSearchParams$1,fileURLToPath}from"node:url";import{AsyncLocalStorage}from"node:async_hooks";import{promisify}from"node:util";import{Readable}from"stream";import{Transform}from"node:stream";import crypto$1,{createHash,randomUUID,webcrypto}from"node:crypto";import crypto$2 from"crypto";import*as zlib$2 from"zlib";import{mkdir,readFile as readFile$1,readdir,realpath,rename,stat as stat$1,writeFile}from"node:fs/promises";import{performance as performance$1}from"node:perf_hooks";import{pipeline}from"node:stream/promises";import{setTimeout as setTimeout$1}from"node:timers/promises";import{Http2ServerRequest,constants}from"http2";import{lookup}from"node:dns";import{createServer}from"node:http";const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function resolveGitDirDetailed(e){let t=resolve(e,`.git`),s;try{s=statSync(t)}catch(e){let s=e.code;return s===`ENOENT`||s===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:t,cause:e}}if(s.isDirectory())return{kind:`directory`,path:t};if(s.isFile()){let s;try{s=readFileSync(t,`utf-8`).trim()}catch(e){return{kind:`malformed-pointer`,gitPath:t,target:``,cause:e}}let g=s.match(/^gitdir:\s*(.+)$/);return g?{kind:`linked`,path:resolve(e,g[1])}:{kind:`malformed-pointer`,gitPath:t,target:``}}return{kind:`absent`}}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,`ok`);case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(resolve(e,`.git`),t.path);return resolve(t.path,`ok`);case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,s){let g=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${g}. Run \`git worktree prune\` from the source repo and try again.`,s),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let s=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${s}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let s of e.split(`
1
+ import{a as __toCommonJS,i as __require$1,n as __esmMin,o as __toESM$1,r as __exportAll,t as __commonJSMin$1}from"./chunk-FK9Q3tQk.mjs";import{$ as iconFromClientName,$t as meta$1,A as SKILL_STATE_TARGETS,At as _enum,B as createCodeFenceTracker,Bt as number,Ct as locateIssue,D as MarkdownManager,Dt as withConfigSpanSync,E as INLINE_RENDERABLE_EXTENSIONS,Et as withConfigSpan,F as applyIncrementalDiff,Ft as custom,G as detectAppliedToleranceClasses,Gt as string,H as createWorkspaceSearchCorpus,Ht as optional,I as classifyMarkdownHref,It as discriminatedUnion,J as extractFrontmatterTags,K as emptySkillState,Kt as union,L as classifyWikiLinkTarget,Lt as intersection,M as SYSTEM_DOC_NAME,N as SkillStateSchema,Nt as array,O as ORPHAN_MODES,P as applyFastDiff,Pt as boolean,Q as humanFormat,Qt as describe$1,R as colorFromSeed,Rt as literal,S as DEFAULT_DEDUP_MODE,St as applyPatchToDocument,Tt as validatePatchScopes,U as createWorkspaceSearchDocument,Ut as preprocess,V as createTagInTextRegex,Vt as object$1,W as defaultScheduler,Wt as record,X as getParseHealth,Xt as toJSONSchema,Y as getHeadingSlug,Yt as datetime,Z as getWikiLinkText,_ as CONFIG_DOC_NAMES,_t as Fragment,a as CC1BranchSwitchedPayloadSchema,an as safeParseAsync$1,at as prependFrontmatter,b as CONFIG_DOC_NAME_PROJECT_LOCAL,bt as LOCAL_DIR,c as CC1DerivedViewPayloadSchema,cn as normalizeParams,ct as resolveInternalHref,d as CC1_CHANNEL_BRANCH_SWITCHED,dn as require_dist$2,dt as stripFrontmatter,en as $ZodObject,et as isKnownConfigError,f as CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,ft as tagsMatchingPrefix,g as CC1_CONTRACT_VERSION,gt as PluginKey,h as CC1_CHANNEL_SERVER_INFO,ht as getSchema,i as BridgeMergeContentLossError,in as safeParse$1,it as normalizeBridge,j as SKILL_STATE_VERSION_RE,jt as _null,k as SKILL_STATE_REL,kt as ZodOptional$1,l as CC1DiskAckPayloadSchema,ln as $constructor,lt as searchWorkspaceCorpus,m as CC1_CHANNEL_DISK_ACK,mt as unwrapFrontmatterFences,n as ASSET_EXTENSIONS,nn as parse$1,nt as mediaKindForSidebarAssetExtension,o as CC1ConfigIgnoreNestedErrorPayloadSchema,on as clone,ot as readFmMap,p as CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,pt as toWikiLinkSlug,q as expandTagToHierarchy,qt as unknown,r as BridgeInvariantViolationError,rn as parseAsync,rt as mergeThreeWay,s as CC1ConfigValidationRejectedPayloadSchema,sn as defineLazy,st as resolveAssetProjectPath,t as AGENT_ICON_COLORS,tn as $ZodType,tt as isOrphanMode,u as CC1ServerInfoPayloadSchema,ut as sharedExtensions,v as CONFIG_DOC_NAME_OKIGNORE,vt as CONFIG_SCHEMA_MAJOR_PATH,wt as toConfigIssue,x as CONFIG_DOC_NAME_USER,xt as addConfigSpanEvent,y as CONFIG_DOC_NAME_PROJECT,yt as ConfigSchema$1,z as createBasenameIndex,zt as looseObject}from"./dist-DfIz2LcA.mjs";import{a as metrics,c as SpanStatusCode,i as propagation,l as SpanKind,n as init_esm$2,o as diag,r as trace,s as context,t as esm_exports$2}from"./esm-BbkJd7ro.mjs";import{a as acquireProcessLock,c as isValidLockPid,f as readServerLock,g as updateProcessLockPort,m as releaseServerLock,n as RUNTIME_VERSION,o as acquireServerLock,p as releaseProcessLock,s as isProcessAlive,t as ProcessLockCollisionError,u as readProcessLock}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{a as require_src$15,i as esm_default,r as withParentLock,t as createGitInstance}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{r as diffLines,t as createPatch}from"./libesm-YL3Bqolr.mjs";import{n as mimes}from"./mrmime-C2W7cgq2.mjs";import{t as b1}from"./chunk-YNYSPYQ5-DesxOVHh.mjs";import{a as c,c as h,d as m,f as p,h as x,i as b,l as i,m as v,n as C,o as d,p as u,r as a,s as f,t as $$1,u as l}from"./chunk-GFQRA5P5-DnjwTqP3.mjs";import{A as gt,B as wt,C as _i$1,D as da$1,E as bt,F as pe,H as zi$1,I as qi,L as us$1,M as ma$1,N as mt$1,O as di$1,P as pa$1,S as X$1,T as bl,V as xi$1,_ as Ti$1,a as Fi$1,b as W$1,c as M,d as P,f as Pt$1,g as T,h as Sl,i as En$1,j as he,k as ga$1,l as Nl,m as Se,n as Bi$1,o as Fs$1,p as R,r as Ci$1,s as G$1,t as Al,u as Oi$1,v as V,w as be,x as Wi$1,y as Vi$1,z as wl}from"./chunk-FEIOJCZD-C25Und0M.mjs";import{a as d$1,c as m$1,d as y,i as c$1,l as p$1,n as N,o as f$1,r as P$1,s as h$1,t as $$2,u as v$1}from"./chunk-XHM67O4N-akBjDPaR.mjs";import{n as l$1,r as o,t as h$2}from"./chunk-R6VWJ2ZL-FwG_Za20.mjs";import{r as o$1}from"./chunk-CWQS3NFK-Co4ALolT.mjs";import"./chunk-DXB73IDG-DIKSLkPq.mjs";import{n as d$2,t as _$1}from"./chunk-5QMZ5MUS-CAp625aG.mjs";import{n as u$1,t as b$1}from"./chunk-A5O5YHGN-DvJz5Cpw.mjs";import{n,r,t as c$2}from"./chunk-OJDRYQWQ-ikvLWpfV.mjs";import{r as x$1,t as a$1}from"./chunk-24IMIIXA-B6yIPkk2.mjs";import{n as n$1}from"./chunk-3THT3N7L-DztAF386.mjs";import{t as n$2}from"./chunk-44UOCSGV-CaFxJDHm.mjs";import{createRequire}from"node:module";import{execFile,spawn,spawnSync}from"node:child_process";import*as U from"node:path";import{basename,dirname,extname,isAbsolute,join,normalize,posix,relative,resolve,sep}from"node:path";import*as I from"node:fs";import{appendFileSync,closeSync,createReadStream,createWriteStream,existsSync,linkSync,lstatSync,mkdirSync,openSync,readFile,readFileSync,readSync,readdirSync,realpathSync,renameSync,rmSync,rmdirSync,statSync,unlinkSync,writeFileSync}from"node:fs";import{homedir,hostname,platform,tmpdir}from"node:os";import{URLSearchParams as URLSearchParams$1,fileURLToPath}from"node:url";import{AsyncLocalStorage}from"node:async_hooks";import{promisify}from"node:util";import{Readable}from"stream";import{Transform}from"node:stream";import crypto$1,{createHash,randomUUID,webcrypto}from"node:crypto";import crypto$2 from"crypto";import*as zlib$2 from"zlib";import{mkdir,readFile as readFile$1,readdir,realpath,rename,stat as stat$1,writeFile}from"node:fs/promises";import{performance as performance$1}from"node:perf_hooks";import{pipeline}from"node:stream/promises";import{setTimeout as setTimeout$1}from"node:timers/promises";import{Http2ServerRequest,constants}from"http2";import{lookup}from"node:dns";import{createServer}from"node:http";const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function resolveGitDirDetailed(e){let t=resolve(e,`.git`),s;try{s=statSync(t)}catch(e){let s=e.code;return s===`ENOENT`||s===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:t,cause:e}}if(s.isDirectory())return{kind:`directory`,path:t};if(s.isFile()){let s;try{s=readFileSync(t,`utf-8`).trim()}catch(e){return{kind:`malformed-pointer`,gitPath:t,target:``,cause:e}}let g=s.match(/^gitdir:\s*(.+)$/);return g?{kind:`linked`,path:resolve(e,g[1])}:{kind:`malformed-pointer`,gitPath:t,target:``}}return{kind:`absent`}}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,`ok`);case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(resolve(e,`.git`),t.path);return resolve(t.path,`ok`);case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,s){let g=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${g}. Run \`git worktree prune\` from the source repo and try again.`,s),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let s=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${s}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let s of e.split(`
2
2
  `)){let e=s.trim();if(e.startsWith(OK_CONTRIBUTORS_PREFIX))try{let s=JSON.parse(e.slice(17));if(typeof s==`object`&&s&&`id`in s&&typeof s.id==`string`&&`name`in s&&typeof s.name==`string`&&`docs`in s&&Array.isArray(s.docs)&&s.docs.every(e=>typeof e==`string`)&&(!(`colorSeed`in s)||typeof s.colorSeed==`string`)){let e=s;if(`summaries`in e){let t=e.summaries;(!Array.isArray(t)||!t.every(e=>typeof e==`string`))&&delete e.summaries}t.push(s)}}catch{}}return t}const OK_CHECKPOINT_PREFIX=`ok-checkpoint-v1: `;function parseCheckpoint(e){if(!e)return null;for(let t of e.split(`
3
3
  `)){let e=t.trim();if(!e.startsWith(OK_CHECKPOINT_PREFIX))continue;let s;try{s=JSON.parse(e.slice(18))}catch{return null}if(typeof s!=`object`||!s)return null;let g=s,S=g.kind,w=g.metadata;if(typeof w!=`object`||!w)return null;let E=typeof g.docName==`string`?g.docName:null,D=typeof g.size==`number`&&Number.isFinite(g.size)?g.size:null;if(S===`bridge-merge-loss`){let e=w;return Array.isArray(e.lostSubstrings)&&e.lostSubstrings.every(e=>typeof e==`string`)?{kind:`bridge-merge-loss`,docName:E,size:D,metadata:{lostSubstrings:e.lostSubstrings}}:null}if(S===`external-change-rescue`){let e=w;return typeof e.incomingDiskSha==`string`?{kind:`external-change-rescue`,docName:E,size:D,metadata:{incomingDiskSha:e.incomingDiskSha}}:null}return null}return null}function formatCheckpointBodyLine(e){let t={kind:e.kind,metadata:e.metadata};return e.docName!==null&&(t.docName=e.docName),e.size!==null&&(t.size=e.size),`${OK_CHECKPOINT_PREFIX}${JSON.stringify(t)}`}const OK_ACTOR_PREFIX=`ok-actor: `;function formatOkActor(e){let{summaries:t,...s}=e,g=t&&t.length>0?{...s,summaries:t}:s;return`${OK_ACTOR_PREFIX}${JSON.stringify(g)}`}function parseOkActorObject(e){if(e.v!==1||!(`display_name`in e)||typeof e.display_name!=`string`||!(`docs`in e)||!Array.isArray(e.docs))return null;let t=typeof e.principal==`string`?e.principal:null,s=typeof e.agent_session==`string`?e.agent_session:null,g;if(typeof e.writer_id==`string`&&e.writer_id.length>0)g=e.writer_id;else if(s)g=`agent-${s}`;else if(t)g=t;else switch(e.display_name){case`File System`:g=`file-system`;break;case`Git (upstream)`:g=`git-upstream`;break;default:g=`openknowledge-service`}let S=`summaries`in e&&Array.isArray(e.summaries)&&e.summaries.every(e=>typeof e==`string`)?e.summaries:void 0;return{v:1,writer_id:g,principal:t,agent_session:s,agent_type:typeof e.agent_type==`string`?e.agent_type:null,client_name:typeof e.client_name==`string`?e.client_name:null,client_version:typeof e.client_version==`string`?e.client_version:null,label:typeof e.label==`string`?e.label:null,display_name:e.display_name,color_seed:typeof e.color_seed==`string`?e.color_seed:`unknown`,docs:e.docs.filter(e=>typeof e==`string`),...S&&S.length>0?{summaries:S}:{}}}function parseOkActors(e){if(!e)return[];let t=[];for(let s of e.split(`
4
4
  `)){let e=s.trim();if(!e.startsWith(OK_ACTOR_PREFIX))continue;let g;try{g=JSON.parse(e.slice(10))}catch{continue}if(typeof g!=`object`||!g)continue;let S=parseOkActorObject(g);S&&t.push(S)}return t}function okActorToShadowContributor(e){let t={v:1,id:e.writer_id,name:e.display_name,colorSeed:e.color_seed,docs:e.docs};return e.summaries&&e.summaries.length>0&&(t.summaries=e.summaries),t}function readContributors(e){let t=parseOkActors(e);return t.length>0?t.map(okActorToShadowContributor):parseContributors(e)}function formatWipSubject(e){return e.length===0?`wip: auto-save`:e.length===1?`wip: ${e[0]}`:`wip: ${e.length} docs`}function formatReconcileSubject(e){return`reconcile: ${e}`}function formatRollbackSubject(e,t){return`rollback: ${e} to ${t.slice(0,7)}`}function formatParkSubject(e,t){return`park: ${e} -> ${t}`}function formatRenameSubject(e,t){return`rename: ${e} -> ${t}`}function formatCheckpointSubject(e){return`checkpoint: ${e}`}function formatImportSubject(e,t){return e?`import: from ${e.slice(0,8)}..${t.slice(0,8)}`:`import: initial at ${t.slice(0,8)}`}const SUBJECT_LINE_BREAK_RE=RegExp(`[\\r\\n\\v\\f\\u0085\\u2028\\u2029]`,`g`);function stripLineBreaks(e){return e.replace(SUBJECT_LINE_BREAK_RE,` `)}function composeCommitSubject(e,t){let s=stripLineBreaks(e);if(t.length===0)return s;if(t.length>=2)return`${s} (${t.length} edits)`;let[g]=t;if(g===void 0)return s;let S=stripLineBreaks(g),w=`${s} — ${S}`;if(w.length<=72)return w;let E=`${s} — `,D=72-E.length-1;return D<=0?w.slice(0,72):`${E}${S.slice(0,D)}…`}function parseWriterId(e){return WRITER_ID_RE.test(e)?e.startsWith(`agent-`)?{id:e,classification:`agent`,isAgent:!0}:e.startsWith(`principal-`)?{id:e,classification:`principal`,isAgent:!1}:e===`file-system`?{id:e,classification:`classified-file-system`,isAgent:null}:e===`git-upstream`?{id:e,classification:`classified-git-upstream`,isAgent:null}:e===`openknowledge-service`?{id:e,classification:`classified-openknowledge-service`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}}var require_err_helpers=__commonJSMin$1(((e,t)=>{let s=e=>e&&typeof e.message==`string`,g=e=>{if(!e)return;let t=e.cause;if(typeof t==`function`){let t=e.cause();return s(t)?t:void 0}else return s(t)?t:void 0},S=(e,t)=>{if(!s(e))return``;let w=e.stack||``;if(t.has(e))return w+`
@@ -769,7 +769,8 @@ ${e.terminator}`}function Qa(e){return`(${Ee(e.body)})${ke(e.redirections)}`}fun
769
769
  `)),S.removeListener(`error`,te),B.setSocket(S,O,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(B),B.on(`close`,()=>{this.clients.delete(B),this._shouldEmitClose&&!this.clients.size&&process.nextTick(ee,this)})),k(B,g)}};function Y(e,t){for(let s of Object.keys(t))e.on(s,t[s]);return function(){for(let s of Object.keys(t))e.removeListener(s,t[s])}}function ee(e){e._state=2,e.emit(`close`)}function te(){this.destroy()}function ne(e,t,s,S){s||=g.STATUS_CODES[t],S={Connection:`close`,"Content-Type":`text/html`,"Content-Length":Buffer.byteLength(s),...S},e.once(`finish`,e.destroy),e.end(`HTTP/1.1 ${t} ${g.STATUS_CODES[t]}\r\n`+Object.keys(S).map(e=>`${e}: ${S[e]}`).join(`\r
770
770
  `)+`\r
771
771
  \r
772
- `+s)}function ae(e,t,s,g,S,w){if(e.listenerCount(`wsClientError`)){let g=Error(S);Error.captureStackTrace(g,ae),e.emit(`wsClientError`,g,s,t)}else ne(s,g,S,w)}}));require_stream(),require_receiver(),require_sender(),require_websocket();var import_websocket_server=__toESM(require_websocket_server(),1);init_esm$2();var import_pino=__toESM$1(require_pino(),1),import_pino_pretty=__toESM$1(require_pino_pretty(),1),import_src=require_src$14(),import_src$1=require_src$13(),import_src$2=require_src$4(),import_src$3=require_src$3(),import_src$4=require_src$2(),import_src$5=require_src$1(),import_src$6=require_src();init_esm$1();var import_lib=__toESM$1(require_lib(),1),import_yazl=__toESM$1(require_yazl(),1),import_shell_quote=__toESM$1(require_shell_quote(),1),import_ignore=__toESM$1(require_ignore(),1);const MAX_LEN=128;function sanitizeGitIdentity(e){return e.replace(/[<>\r\n]/g,``).trim().slice(0,MAX_LEN)}const AGENT_ID_RE=/^[a-zA-Z0-9_-]+$/,AGENT_ID_MAX_LEN=64;function validateAgentId(e){return typeof e!=`string`||e.length===0||e.length>64||!AGENT_ID_RE.test(e)?null:e}function toBroadcasterKey(e){return e.startsWith(`agent-`)?e:`agent-${e}`}function isPresenceEligibleAgentId(e){return!e.startsWith(`principal-`)}function resolveAgentType(e){if(!e)return`bot`;let t=e.toLowerCase();return t.includes(`claude`)?`claude`:t.includes(`cursor`)?`cursor`:t.includes(`codex`)?`codex`:t.includes(`cline`)?`cline`:t.includes(`windsurf`)?`windsurf`:`bot`}function parseAgentBodyFields(e){let t=validateAgentId(typeof e.agentId==`string`?e.agentId:null)??void 0;return{rawAgentId:t,writerId:t===void 0?void 0:toBroadcasterKey(t),displayName:typeof e.agentName==`string`?sanitizeGitIdentity(e.agentName):`Claude`,clientName:typeof e.clientName==`string`?sanitizeGitIdentity(e.clientName):void 0,clientVersion:typeof e.clientVersion==`string`?sanitizeGitIdentity(e.clientVersion):void 0,label:typeof e.label==`string`?sanitizeGitIdentity(e.label):void 0,colorSeed:typeof e.colorSeed==`string`&&e.colorSeed.length>0?e.colorSeed.slice(0,128):void 0}}function otelMixin(){let e=trace.getSpan(context.active());if(!e)return{};let t=e.spanContext();return{trace_id:t.traceId,span_id:t.spanId,trace_flags:t.traceFlags}}function shouldColorize(){return process.env.NO_COLOR&&process.env.NO_COLOR!==``?!1:process.stdout.isTTY??!1}var PinoLogger=class{name;transportConfigs=[];pinoInstance;options;constructor(e,t={}){this.name=e,this.options={name:this.name,level:process.env.LOG_LEVEL||(process.env.NODE_ENV===`test`?`silent`:`info`),serializers:{err:import_pino.default.stdSerializers.err,error:import_pino.default.stdSerializers.err},mixin:otelMixin,...t.options},t.transportConfigs&&(this.transportConfigs=t.transportConfigs),this.pinoInstance=this.buildInstance()}buildInstance(){if(this.transportConfigs.length>0)return(0,import_pino.default)(this.options,import_pino.default.transport({targets:this.transportConfigs}));try{let e=(0,import_pino_pretty.default)({colorize:shouldColorize(),translateTime:`HH:MM:ss`,ignore:`pid,hostname`});return(0,import_pino.default)(this.options,e)}catch(e){return console.warn(`[PinoLogger] pino-pretty failed, falling back to JSON:`,e),(0,import_pino.default)(this.options)}}recreateInstance(){typeof this.pinoInstance.flush==`function`&&this.pinoInstance.flush(),this.pinoInstance=this.buildInstance()}addTransport(e){this.transportConfigs.push(e),this.recreateInstance()}removeTransport(e){e>=0&&e<this.transportConfigs.length&&(this.transportConfigs.splice(e,1),this.recreateInstance())}getTransports(){return[...this.transportConfigs]}updateOptions(e){this.options={...this.options,...e},this.recreateInstance()}getPinoInstance(){return this.pinoInstance}error(e,t){this.pinoInstance.error(e,t)}warn(e,t){this.pinoInstance.warn(e,t)}info(e,t){this.pinoInstance.info(e,t)}debug(e,t){this.pinoInstance.debug(e,t)}},LoggerFactory=class{config={};loggers=new Map;configure(e){this.config=e,this.loggers.clear()}getLogger(e){let t=this.loggers.get(e);if(t)return t;let s;return s=this.config.loggerFactory?this.config.loggerFactory(e):this.config.defaultLogger?this.config.defaultLogger:new PinoLogger(e,this.config.pinoConfig),this.loggers.set(e,s),s}reset(){this.config={},this.loggers.clear()}};const loggerFactory=new LoggerFactory;function getLogger(e){return loggerFactory.getLogger(e)}function createTestLogger(e=`test`){return new PinoLogger(e,{options:{level:`silent`}})}function installTestLoggers(){loggerFactory.configure({pinoConfig:{options:{level:`silent`}}})}var AgentFocusBroadcaster=class{hocuspocus;log=getLogger(`agent-focus`);warnedMissing=!1;constructor(e){this.hocuspocus=e}setFocus(e,t){isPresenceEligibleAgentId(e)&&this.mutateAgentFocus(s=>({...s,[e]:t}))}clearFocus(e){isPresenceEligibleAgentId(e)&&this.mutateAgentFocus(t=>{if(!(e in t))return t;let{[e]:s,...g}=t;return g})}getFocusMap(){let e=this.resolveAwareness();return e?e.getLocalState()?.agentFocus??{}:{}}mutateAgentFocus(e){let t=this.resolveAwareness();if(t)try{let s=t.getLocalState()??{},g=e(s.agentFocus??{});t.setLocalState({...s,agentFocus:g})}catch(e){this.log.error({err:e},`[agent-focus] awareness mutation failed`)}}resolveAwareness(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?(this.warnedMissing&&=(this.log.info({},`[agent-focus] __system__ document now available — resuming focus updates`),!1),getAwareness$1(e)):(this.warnedMissing||=(this.log.warn({},`[agent-focus] __system__ document not found — focus updates will be dropped until it is materialized`),!0),null)}};function getAwareness$1(e){return e?.awareness??null}const counters$1={reconcileCount:0,conflictCount:0,batchCount:0,upstreamImportCount:0,rescueBufferCount:0,branchSwitchCount:0,parkCount:0,gitAutoSaveFailureCount:0,gitWriterCommitFailureCount:0,cc1BroadcastCount:0,cc1BroadcastDropCount:0,cc1SubscriberCount:0,cc1LastSeq:{},serverObserverFiresA:0,serverObserverFiresB:0,serverObserverErrorsA:0,serverObserverErrorsB:0,persistenceDiskWrites:0,bridgeMergeContentLoss:0,bridgeMergeCheckpointCreated:0,bridgeInvariantViolations:0,bridgeInvariantViolationsSuppressed:0,persistenceSkipNonQuiescent:0,persistenceForceFlushDuringBurst:0,collabSocketEpipeCount:0,collabSocketEconnresetCount:0,collabMessageTooLargeCount:0,shadowMigrationLegacyRefsDeleted:0,effectDiffCaptureFailures:0,agentPresenceMutationErrors:0,agentWriteCalls:0,summariesProvided:0,summariesTruncated:0,agentPatchFindMismatches:0,bridgeToleranceApplied:{},observerAPathBFires:0,persistenceReconciliationFailures:0,externalChangeHandlerErrors:0,persistenceSanityCheckSerializeFailures:0};function incrementReconcile(){counters$1.reconcileCount++}function incrementConflict(){counters$1.conflictCount++}function incrementBatch(){counters$1.batchCount++}function incrementUpstreamImport(){counters$1.upstreamImportCount++}function incrementRescueBuffer(){counters$1.rescueBufferCount++}function incrementBranchSwitch(){counters$1.branchSwitchCount++}function incrementPark(){counters$1.parkCount++}function incrementGitAutoSaveFailure(){counters$1.gitAutoSaveFailureCount++}function incrementGitWriterCommitFailure(){counters$1.gitWriterCommitFailureCount++}function incrementCC1Broadcast(){counters$1.cc1BroadcastCount++}function incrementCC1BroadcastDrop(){counters$1.cc1BroadcastDropCount++}function setCC1SubscriberCount(e){counters$1.cc1SubscriberCount=e}function incrementServerObserverFire(e){e===`a`?counters$1.serverObserverFiresA++:counters$1.serverObserverFiresB++}function incrementPersistenceDiskWrite(){counters$1.persistenceDiskWrites++}function incrementServerObserverError(e){e===`a`?counters$1.serverObserverErrorsA++:counters$1.serverObserverErrorsB++}function incrementBridgeMergeContentLoss(){counters$1.bridgeMergeContentLoss++}function incrementAgentWriteCalls(){counters$1.agentWriteCalls++}function incrementSummariesProvided(){counters$1.summariesProvided++}function incrementSummariesTruncated(){counters$1.summariesTruncated++}function incrementBridgeMergeCheckpointCreated(){counters$1.bridgeMergeCheckpointCreated++}function incrementBridgeInvariantViolations(){counters$1.bridgeInvariantViolations++}function incrementBridgeInvariantViolationsSuppressed(){counters$1.bridgeInvariantViolationsSuppressed++}function incrementPersistenceSkipNonQuiescent(){counters$1.persistenceSkipNonQuiescent++}function incrementPersistenceForceFlushDuringBurst(){counters$1.persistenceForceFlushDuringBurst++}function incrementAgentPatchFindMismatches(){counters$1.agentPatchFindMismatches++}function incrementBridgeToleranceApplied(e){counters$1.bridgeToleranceApplied[e]=(counters$1.bridgeToleranceApplied[e]??0)+1}function incrementObserverAPathBFires(){counters$1.observerAPathBFires++}function incrementPersistenceReconciliationFailures(){counters$1.persistenceReconciliationFailures++}function incrementExternalChangeHandlerErrors(){counters$1.externalChangeHandlerErrors++}function incrementPersistenceSanityCheckSerializeFailures(){counters$1.persistenceSanityCheckSerializeFailures++}function incrementCollabSocketFilteredError(e){e===`EPIPE`?counters$1.collabSocketEpipeCount++:counters$1.collabSocketEconnresetCount++}function incrementCollabMessageTooLarge(){counters$1.collabMessageTooLargeCount++}function incrementShadowMigrationLegacyRefsDeleted(e){counters$1.shadowMigrationLegacyRefsDeleted+=e}function incrementEffectDiffCaptureFailures(){counters$1.effectDiffCaptureFailures++}function incrementAgentPresenceMutationError(){counters$1.agentPresenceMutationErrors++}function handleCollabSocketError(e){return e.code===`EPIPE`||e.code===`ECONNRESET`?(incrementCollabSocketFilteredError(e.code),!0):!1}function setCC1LastSeq(e,t){counters$1.cc1LastSeq[e]=t}function getMetrics(){return{...counters$1,cc1LastSeq:{...counters$1.cc1LastSeq},bridgeToleranceApplied:{...counters$1.bridgeToleranceApplied}}}function resetMetrics(){counters$1.reconcileCount=0,counters$1.conflictCount=0,counters$1.batchCount=0,counters$1.upstreamImportCount=0,counters$1.rescueBufferCount=0,counters$1.branchSwitchCount=0,counters$1.parkCount=0,counters$1.gitAutoSaveFailureCount=0,counters$1.gitWriterCommitFailureCount=0,counters$1.cc1BroadcastCount=0,counters$1.cc1BroadcastDropCount=0,counters$1.cc1SubscriberCount=0,counters$1.cc1LastSeq={},counters$1.serverObserverFiresA=0,counters$1.serverObserverFiresB=0,counters$1.serverObserverErrorsA=0,counters$1.serverObserverErrorsB=0,counters$1.persistenceDiskWrites=0,counters$1.bridgeMergeContentLoss=0,counters$1.bridgeMergeCheckpointCreated=0,counters$1.bridgeInvariantViolations=0,counters$1.bridgeInvariantViolationsSuppressed=0,counters$1.persistenceSkipNonQuiescent=0,counters$1.persistenceForceFlushDuringBurst=0,counters$1.collabSocketEpipeCount=0,counters$1.collabSocketEconnresetCount=0,counters$1.collabMessageTooLargeCount=0,counters$1.shadowMigrationLegacyRefsDeleted=0,counters$1.effectDiffCaptureFailures=0,counters$1.agentPresenceMutationErrors=0,counters$1.agentWriteCalls=0,counters$1.summariesProvided=0,counters$1.summariesTruncated=0,counters$1.agentPatchFindMismatches=0,counters$1.bridgeToleranceApplied={},counters$1.observerAPathBFires=0,counters$1.persistenceReconciliationFailures=0,counters$1.externalChangeHandlerErrors=0,counters$1.persistenceSanityCheckSerializeFailures=0}const BROADCASTER_EVICTION_MS=5e3*4;var AgentPresenceBroadcaster=class{hocuspocus;log=getLogger(`agent-presence`);warnedMissing=!1;destroyed=!1;constructor(e){this.hocuspocus=e}setPresence(e,t){if(!isPresenceEligibleAgentId(e))return;let s=0;this.mutateAgentPresence(g=>{let S=Date.now(),w={};for(let[t,E]of Object.entries(g)){if(S-E.ts>=2e4&&t!==e){s++;continue}w[t]=E}return w[e]=t,w})&&(this.log.debug({agentId:e,action:`set`,currentDoc:t.currentDoc,ts:t.ts},`[agent-presence] set`),s>0&&this.log.info({evictedCount:s,thresholdMs:BROADCASTER_EVICTION_MS},`[agent-presence] evicted stale entries`))}clearPresence(e){if(!isPresenceEligibleAgentId(e))return;let t=!1;this.mutateAgentPresence(s=>{if(!s[e])return s;t=!0;let{[e]:g,...S}=s;return S})&&t&&this.log.info({agentId:e,action:`clear`,currentDoc:null,ts:Date.now()},`[agent-presence] clear`)}touchMode(e,t){if(!isPresenceEligibleAgentId(e))return;let s=[],g=!1,S=this.mutateAgentPresence(S=>{let w=S[e];if(!w)return S;g=!0;let E=Date.now();return s.push({currentDoc:w.currentDoc,ts:E}),{...S,[e]:{...w,mode:t,ts:E}}}),w=s[0];S&&w?this.log.debug({agentId:e,action:`touchMode`,currentDoc:w.currentDoc,ts:w.ts,mode:t},`[agent-presence] touchMode`):g||this.log.debug({agentId:e,action:`touchMode`,mode:t,reason:`entry-missing`},`[agent-presence] touchMode skipped — no entry for agentId`)}bumpPresenceTs(e){if(!isPresenceEligibleAgentId(e))return;let t=null;this.mutateAgentPresence(s=>{let g=s[e];if(!g)return s;let S=Date.now();return t=S,{...s,[e]:{...g,ts:S}}}),t!==null&&this.log.debug({agentId:e,action:`bumpTs`,ts:t},`[agent-presence] bumpTs`)}getPresenceMap(){let e=this.resolveAwareness();return e?e.getLocalState()?.agentPresence??{}:{}}destroy(){this.destroyed=!0}mutateAgentPresence(e){if(this.destroyed)return!1;let t=this.resolveAwareness();if(!t)return!1;try{let s=t.getLocalState()??{},g=e(s.agentPresence??{});return t.setLocalState({...s,agentPresence:g}),!0}catch(e){return incrementAgentPresenceMutationError(),this.log.error({err:e},`[agent-presence] awareness mutation failed`),!1}}resolveAwareness(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?(this.warnedMissing&&=(this.log.info({},`[agent-presence] __system__ document now available — resuming presence updates`),!1),getAwareness(e)):(this.warnedMissing||=(this.log.warn({},`[agent-presence] __system__ document not found — presence updates will be dropped until it is materialized`),!0),null)}};function getAwareness(e){return e?.awareness??null}const mdManager=new MarkdownManager({extensions:sharedExtensions}),schema=getSchema(sharedExtensions);function composeAndWriteRawBody(e,t,s){let g=e.getXmlFragment(`default`),S=e.getText(`source`),w=S.toString(),{body:E}=stripFrontmatter(t),D=s?{resolveEmbed:s.resolveEmbed,sourcePath:s.sourcePath}:void 0,O=mdManager.parseWithFallback(E,D),k=schema.nodeFromJSON(O);w!==t&&applyFastDiff(S,w,t),updateYFragment(e,g,k,{mapping:new Map,isOMark:new Map})}const DEBOUNCE_MS=100,MAX_DISK_ACK_SVS=1e3;function isSystemDoc(e){return e===SYSTEM_DOC_NAME}const CONFIG_DOC_NAME_SET=new Set(CONFIG_DOC_NAMES);function isConfigDoc(e){return CONFIG_DOC_NAME_SET.has(e)}var CC1Broadcaster=class{hocuspocus;seqs=new Map;timers=new Map;log=getLogger(`cc1`);warnedMissing=!1;latestDiskAckSVs=new Map;constructor(e){this.hocuspocus=e}signal(e){let t=this.timers.get(e);t!==void 0&&clearTimeout(t),this.timers.set(e,setTimeout(()=>{this.timers.delete(e),this.broadcast(e)},DEBOUNCE_MS))}broadcast(e){try{let t=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!t){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found — broadcasts will be dropped until it is materialized`),!0),incrementCC1BroadcastDrop();return}let s=(this.seqs.get(e)??0)+1;this.seqs.set(e,s);let g=CC1DerivedViewPayloadSchema.parse({v:1,ch:e,seq:s});t.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(e,s),setCC1SubscriberCount(t.getConnectionsCount())}catch(t){this.log.error({err:t,channel:e},`[cc1] broadcast failed`)}}emitServerInfo(e,t){try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitServerInfo — dropped`),!0),incrementCC1BroadcastDrop();return}let g=CC1ServerInfoPayloadSchema.parse({v:1,ch:CC1_CHANNEL_SERVER_INFO,seq:0,serverInstanceId:e,...t===void 0?{}:{currentBranch:t}});s.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_SERVER_INFO,0)}catch(e){this.log.error({err:e},`[cc1] emitServerInfo failed`)}}emitBranchSwitched(e){try{let t=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!t){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitBranchSwitched — dropped`),!0),incrementCC1BroadcastDrop();return}let s=(this.seqs.get(`branch-switched`)??0)+1;this.seqs.set(CC1_CHANNEL_BRANCH_SWITCHED,s);let g=CC1BranchSwitchedPayloadSchema.parse({v:1,ch:CC1_CHANNEL_BRANCH_SWITCHED,seq:s,branch:e});t.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_BRANCH_SWITCHED,s)}catch(e){this.log.error({err:e},`[cc1] emitBranchSwitched failed`)}}emitDiskAck(e,t){if(this.latestDiskAckSVs.delete(e),this.latestDiskAckSVs.set(e,t),this.latestDiskAckSVs.size>MAX_DISK_ACK_SVS){let e=this.latestDiskAckSVs.keys().next().value;e!==void 0&&this.latestDiskAckSVs.delete(e)}try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitDiskAck — dropped`),!0),incrementCC1BroadcastDrop();return}let g=(this.seqs.get(`disk-ack`)??0)+1;this.seqs.set(CC1_CHANNEL_DISK_ACK,g);let S=CC1DiskAckPayloadSchema.parse({v:1,ch:CC1_CHANNEL_DISK_ACK,seq:g,docName:e,sv:Buffer.from(t).toString(`base64`)});s.broadcastStateless(JSON.stringify(S)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_DISK_ACK,g)}catch(t){this.log.error({err:t,docName:e},`[cc1] emitDiskAck failed`)}}getLatestDiskAckSVsAsBase64(){let e={};for(let[t,s]of this.latestDiskAckSVs)e[t]=Buffer.from(s).toString(`base64`);return e}emitConfigValidationRejected(e,t){try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitConfigValidationRejected — dropped`),!0),incrementCC1BroadcastDrop();return}let g=(this.seqs.get(`config-validation-rejected`)??0)+1;this.seqs.set(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,g);let S=CC1ConfigValidationRejectedPayloadSchema.parse({v:1,ch:CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,seq:g,docName:e,error:t});s.broadcastStateless(JSON.stringify(S)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,g)}catch(t){this.log.error({err:t,docName:e},`[cc1] emitConfigValidationRejected failed`)}}get subscriberCount(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?e.getConnectionsCount():0}destroy(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};const TRACER_NAME=`open-knowledge-server`;let tracerProvider=null,meterProvider=null;function noopResult(){return{tracer:trace.getTracer(TRACER_NAME),meter:metrics.getMeter(TRACER_NAME)}}function initTelemetry(){if(process.env.OTEL_SDK_DISABLED!==`false`||tracerProvider)return noopResult();try{let e=(0,import_src$4.resourceFromAttributes)({[ATTR_SERVICE_NAME]:process.env.OTEL_SERVICE_NAME||`open-knowledge-server`,[ATTR_SERVICE_VERSION]:process.env.OTEL_SERVICE_VERSION||`0.2.0`}),t=new import_src.AsyncLocalStorageContextManager;context.setGlobalContextManager(t);let s=new import_src$6.BasicTracerProvider({resource:e,spanProcessors:[new import_src$6.BatchSpanProcessor(new import_src$3.OTLPTraceExporter)]});trace.setGlobalTracerProvider(s),propagation.setGlobalPropagator(new import_src$1.W3CTraceContextPropagator);let g=new import_src$5.MeterProvider({resource:e,readers:[new import_src$5.PeriodicExportingMetricReader({exporter:new import_src$2.OTLPMetricExporter})]});metrics.setGlobalMeterProvider(g),tracerProvider=s,meterProvider=g,getLogger(`telemetry`).info({otlp_endpoint:process.env.OTEL_EXPORTER_OTLP_ENDPOINT||`http://localhost:4318`,service_name:e.attributes[ATTR_SERVICE_NAME]},`OpenTelemetry initialized — traces + metrics exporting via OTLP/HTTP`)}catch(e){getLogger(`telemetry`).error({err:e},`failed to initialize OpenTelemetry — falling back to no-op`),tracerProvider=null,meterProvider=null}return noopResult()}const SHUTDOWN_TIMEOUT_MS=5e3;async function shutdownTelemetry(){if(!tracerProvider&&!meterProvider)return;let e=getLogger(`telemetry`),t=Promise.all([tracerProvider?.shutdown().catch(t=>{e.warn({err:t},`tracer provider shutdown failed`)}),meterProvider?.shutdown().catch(t=>{e.warn({err:t},`meter provider shutdown failed`)})]);await Promise.race([t.then(()=>!1),new Promise(e=>setTimeout(()=>e(!0),SHUTDOWN_TIMEOUT_MS))])&&e.warn({},`telemetry shutdown timed out after ${SHUTDOWN_TIMEOUT_MS}ms — data may be lost`),tracerProvider=null,meterProvider=null,trace.disable(),metrics.disable(),context.disable()}function getTracer(){return trace.getTracer(TRACER_NAME)}function getMeter(){return metrics.getMeter(TRACER_NAME)}async function withSpan(e,t,s){return getTracer().startActiveSpan(e,t??{},async e=>{try{let t=await s(e);return e.isRecording(),t}catch(t){throw e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t instanceof Error?t.message:String(t)}),t}finally{e.end()}})}function withSpanSync(e,t,s){return getTracer().startActiveSpan(e,t??{},e=>{try{return s(e)}catch(t){throw e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t instanceof Error?t.message:String(t)}),t}finally{e.end()}})}function setActiveSpanAttributes(e){let t=trace.getSpan(context.active());t&&t.setAttributes(e)}let _editSurfaceCounter=null;function editSurfaceCounter(){return _editSurfaceCounter||=getMeter().createCounter(`ok.frontmatter.edit_surface_total`,{description:`Count of frontmatter edits by surface. Bounded label: source ∈ {source-mode, mcp-write, file-watcher}.`}),_editSurfaceCounter}function recordFrontmatterEditSurface(e){editSurfaceCounter().add(1,{source:e})}const log$6=getLogger(`agent-sessions`),AGENT_WRITE_ORIGIN={source:`local`,skipStoreHooks:!1,context:{origin:`agent-write`,paired:!0}};function applyAgentMarkdownWrite(e,t,s,g){withSpanSync(`agent.applyAgentMarkdownWrite`,{attributes:{"doc.name":e.name,"agent.write_position":s,"agent.markdown.bytes":t.length}},()=>applyAgentMarkdownWriteInner(e,t,s,g))}function applyAgentMarkdownWriteInner(e,t,s,g){try{let{frontmatter:S,body:w}=stripFrontmatter(e.getText(`source`).toString()),{frontmatter:E,body:D}=stripFrontmatter(t),O,k;switch(s){case`replace`:O=E||S,k=D;break;case`prepend`:O=S,k=w.length>0?`${D}\n\n${w}`:D;break;case`append`:O=S,k=w.length>0?`${w}\n\n${D}`:D;break}O!==S&&recordFrontmatterEditSurface(`mcp-write`),composeAndWriteRawBody(e,prependFrontmatter(O,k),g)}catch(g){throw log$6.error({err:g,docName:e.name,position:s,markdownLen:t.length},`[applyAgentMarkdownWrite] failed for '${e.name}'`),g}}function applyAgentUndo(e,t,s){return withSpanSync(`agent.applyAgentUndo`,{attributes:{"doc.name":e.dc.document.name,"agent.undo_scope":t}},()=>{let g=applyAgentUndoInner(e,t,s);return setActiveSpanAttributes({"agent.undo_effective":g}),g})}function applyAgentUndoInner(e,t,s){let{dc:g,um:S,undoOrigin:w}=e,E=g.document,D=E.getXmlFragment(`default`),O=E.getText(`source`),k=!1;return E.transact(()=>{if(t===`last`){if(S.undoStack.length===0)return;S.undo(),k=!0}else for(;S.undoStack.length>0;)S.undo(),k=!0;let{body:e}=stripFrontmatter(O.toString()),g=mdManager.parseWithFallback(e,s);updateYFragment(E,D,schema.nodeFromJSON(g),{mapping:new Map,isOMark:new Map})},w),k}function createSessionOrigin(e,t,s,g,S){let w={origin:`agent-write`,paired:!0,session_id:e};t!==void 0&&(w.agent_type=t),s!==void 0&&(w.principal=s),g!==void 0&&(w.display_name=g),S!==void 0&&(w.color_seed=S),Object.freeze(w);let E={source:`local`,skipStoreHooks:!1,context:w};return Object.freeze(E),E}function createUndoOrigin(e,t){let s={origin:`agent-undo`,paired:!0,session_id:e};t!==void 0&&(s.agent_type=t),Object.freeze(s);let g={source:`local`,skipStoreHooks:!1,context:s};return Object.freeze(g),g}const MAX_AGENT_SESSIONS=256;var AgentSessionCapacityError=class extends Error{limit;constructor(e){super(`Maximum agent session count reached (${e})`),this.name=`AgentSessionCapacityError`,this.limit=e}},AgentSessionManager=class{sessions=new Map;pendingSessions=new Map;hocuspocus;maxSessions;constructor(e,t={}){this.hocuspocus=e,this.maxSessions=t.maxSessions??256}sessionKey(e,t){return`${e}\0${t}`}*sessionsForConnection(e){let t=`\0${e}`;for(let[e,s]of this.sessions)e.endsWith(t)&&(yield s)}getLiveSession(e,t){return this.sessions.get(this.sessionKey(e,t))}async getSession(e,t=`claude-1`,s){if(isSystemDoc(e)||isConfigDoc(e))throw Error(`Cannot create agent session for reserved doc: ${e}`);let g=this.sessionKey(e,t),S=this.sessions.get(g);if(S)return S;let w=this.pendingSessions.get(g);if(w)return w;if(this.sessions.size+this.pendingSessions.size>=this.maxSessions)throw new AgentSessionCapacityError(this.maxSessions);let E=this._createSession(e,t,s);this.pendingSessions.set(g,E);try{let e=await E;return this.sessions.set(g,e),e}finally{this.pendingSessions.delete(g)}}async _createSession(e,t,s){let g=s?.clientName,S=t.startsWith(`agent-`)?t.slice(6):t,w=createSessionOrigin(S,g,s?.principalId,s?.displayName,s?.colorSeed),E=createUndoOrigin(S,g),D={session_id:S,...g===void 0?{}:{agent_type:g},...s?.clientName===void 0?{}:{client_name:s.clientName},...s?.principalId===void 0?{}:{principalId:s.principalId}},O=await this.hocuspocus.openDirectConnection(e,D),k=new UndoManager([O.document.getText(`source`),O.document.getMap(`agent-flash`)],{trackedOrigins:new Set([w]),captureTimeout:500,captureTransaction:e=>e.origin!==E,ignoreRemoteMapChanges:!0}),j=({stackItem:e})=>{e.meta.set(`time`,Date.now())};return k.on(`stack-item-added`,j),k.on(`stack-item-updated`,j),log$6.info({docName:e,agentId:t},`[agent-session] Created session for: ${e} / ${t}`),{dc:O,origin:w,undoOrigin:E,um:k,agentId:t,docName:e}}hasSession(e,t=`claude-1`){return this.sessions.has(this.sessionKey(e,t))}async cleanupSession(e,t,s){try{try{t.um.destroy()}catch(e){log$6.error({err:e,...s},`[agent-session] um.destroy() failed`)}try{await t.dc.disconnect()}catch(e){log$6.error({err:e,...s},`[agent-session] dc.disconnect() failed`)}}finally{this.sessions.delete(e)}}async closeSession(e,t=`claude-1`){let s=this.sessionKey(e,t),g=this.sessions.get(s);g&&(await this.cleanupSession(s,g,{docName:e,agentId:t}),log$6.info({docName:e,agentId:t},`[agent-session] Closed session for: ${e} / ${t}`))}async closeAllForAgent(e){let t=`\0${e}`,s=[...this.pendingSessions.keys()].filter(e=>e.endsWith(t));s.length>0&&await Promise.allSettled(s.map(e=>this.pendingSessions.get(e)));let g=[...this.sessions.keys()].filter(e=>e.endsWith(t));for(let t of g){let s=this.sessions.get(t);s&&await this.cleanupSession(t,s,{agentId:e,key:t})}}async closeAllForDoc(e){let t=`${e}\0`,s=[...this.sessions.keys()].filter(e=>e.startsWith(t));for(let t of s){let s=this.sessions.get(t);s&&await this.cleanupSession(t,s,{docName:e,key:t})}}async closeAll(e){if(e){await this.closeAllForDoc(e);return}let t=[...this.sessions.keys()];for(let e of t){let t=this.sessions.get(e);t&&await this.cleanupSession(e,t,{key:e})}}};const RING_BUFFER_LIMIT=50;let _effectCounter=0;const EFFECT_CAPTURE_ORIGIN=Object.freeze({source:`local`,skipStoreHooks:!0,context:Object.freeze({origin:`effect-capture`,paired:!1})});function captureEffect(e,t,s,g){let S=e.doc;if(!S)return;let w=++_effectCounter,E=S.getMap(`agent-effects`),D=k=>{e.unobserve(D),S.off(`destroy`,O);let j=`${t}:${w}`,F={sessionId:t,timestamp:Date.now(),delta:k.delta,agent_type:g??`agent`,color_seed:s??t};try{S.transact(()=>{if(E.set(j,F),E.size>RING_BUFFER_LIMIT){let e=[...E.entries()].sort((e,t)=>e[1].timestamp-t[1].timestamp);for(let[t]of e.slice(0,E.size-RING_BUFFER_LIMIT))E.delete(t)}},EFFECT_CAPTURE_ORIGIN)}catch(e){let s=e instanceof Error?e.message:String(e);if(console.warn(JSON.stringify({event:`effect-diff-capture-failed`,sessionId:t,reason:s})),incrementEffectDiffCaptureFailures(),process.env.NODE_ENV!==`production`)throw e}},O=()=>{e.unobserve(D)};e.observe(D),S.once(`destroy`,O)}function collectItemsInDeleteSet(e,t,s){iterateDeletedStructs(e,t,e=>{e instanceof Item&&s.add(e)})}function*walkYTextItems(e){let t=e._start;for(;t!==null;)yield t,t=t.right}function synthesizeStackItemDiff(e,t){let s=[],g=[],S=t.doc,w=new Set,E=new Set;S&&S.transact(t=>{collectItemsInDeleteSet(t,e.insertions,w),collectItemsInDeleteSet(t,e.deletions,E)});let D=``,O=``,k=0,j=0;for(let e of walkYTextItems(t)){if(!(e.content instanceof ContentString))continue;let t=e.content.str,S=t.length,F=w.has(e),L=E.has(e);e.deleted?L&&(g.push({position:k,content:t,length:S}),D+=t,k+=S):(O+=t,F?s.push({position:j,content:t,length:S}):(D+=t,k+=S),j+=S)}return{insertions:s,deletions:g,before:D,after:O}}function synthesizeStackItemDiffText(e,t,s){let{before:g,after:S}=synthesizeStackItemDiff(e,t);return g===S?``:createPatch(s,g,S,void 0,void 0,{context:3})}function getBurstTs(e){let t=e.meta.get(`time`);return typeof t==`number`?t:Date.now()}function countStackItemChanges(e,t){let s=t.doc,g=new Set,S=new Set;s&&s.transact(t=>{collectItemsInDeleteSet(t,e.insertions,g),collectItemsInDeleteSet(t,e.deletions,S)});let w=0,E=0;for(let e of walkYTextItems(t)){if(!(e.content instanceof ContentString))continue;let t=e.content.str.length;!e.deleted&&g.has(e)&&(w+=t),S.has(e)&&(E+=t)}return{additions:w,deletions:E}}function listAgentActivity(e,t){let s=[],g=null,S=!1;for(let w of e.sessionsForConnection(t)){if(S=!0,!g){let e=w.origin.context,s=typeof e?.agent_type==`string`?e.agent_type:void 0,S=typeof e?.color_seed==`string`?e.color_seed:t,E=iconFromClientName(s),D=AGENT_ICON_COLORS[E]??colorFromSeed(S);g={displayName:e?.display_name||(typeof e?.agent_type==`string`?e.agent_type:void 0)||t,color:D,icon:E,connectionId:t}}let e=w.docName,E=w.um,D=w.dc.document.getText(`source`),O=[];for(let e=0;e<E.undoStack.length;e++){let t=E.undoStack[e],s=getBurstTs(t),{additions:g,deletions:S}=countStackItemChanges(t,D);O.push({stackIndex:e,ts:s,additions:g,deletions:S})}if(O.length===0)continue;O.sort((e,t)=>t.stackIndex-e.stackIndex);let k=O.reduce((e,t)=>e+t.additions,0),j=O.reduce((e,t)=>e+t.deletions,0),F=Math.max(...O.map(e=>e.ts));s.push({docName:e,additionsTotal:k,deletionsTotal:j,lastTs:F,bursts:O})}return S?(s.sort((e,t)=>t.lastTs-e.lastTs),{sessionAlive:!0,agent:g,files:s}):{sessionAlive:!1,agent:null,files:[]}}const ELLIPSIS=`…`,LINE_TERMINATOR_RE=RegExp(`[\\r\\n\\v\\f\\u0085\\u2028\\u2029]`,`g`);function normalizeSummary(e){if(e===void 0)return{kind:`absent`};if(typeof e!=`string`)return{kind:`invalid`};if(e.length===0||e.trim().length===0)return{kind:`absent`};let t=e.replace(LINE_TERMINATOR_RE,` `);return t.length<=80?{kind:`value`,value:t}:{kind:`value`,value:t.slice(0,79)+ELLIPSIS,truncatedFrom:e.length}}function isAllowedApiOrigin(e){if(e===`null`)return!0;try{let{hostname:t}=new URL(e);return t===`localhost`||t===`::1`||t===`[::1]`||/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(t)}catch{return!1}}const counters=new WeakMap;let globalCounter=0;function getCounters(e){let t=counters.get(e);return t||(t={lastUserTxGen:0,settledGen:0,lastUserTxAtMs:null},counters.set(e,t)),t}function isObserverSelfOrigin(e){if(!e||typeof e!=`object`)return!1;let t=e.context;return t!=null&&t.origin===`observer-sync`}function attachQuiescenceTracker(e){let t=t=>{if(isObserverSelfOrigin(t.origin))return;let s=getCounters(e);s.lastUserTxGen=++globalCounter,s.lastUserTxAtMs=Date.now()},s=()=>{getCounters(e).settledGen=++globalCounter};return e.on(`afterTransaction`,t),e.on(`afterAllTransactions`,s),()=>{e.off(`afterTransaction`,t),e.off(`afterAllTransactions`,s)}}const overrides=new WeakMap;function isDocQuiescent(e){let t=overrides.get(e);if(t!==void 0)return t;let s=counters.get(e);return s?s.settledGen>s.lastUserTxGen:!0}function getMsSinceLastUserTx(e,t=Date.now()){let s=counters.get(e);return!s||s.lastUserTxAtMs===null?null:Math.max(0,t-s.lastUserTxAtMs)}const DEFAULT_DEBOUNCE_S=60,lastEmitMs=new Map,MAX_VIOLATION_RATE_TUPLES=1024,lastToleranceEmitMs=new Map;function toleranceRateKey(e,t){return`${e}::${t}`}function readDebounceMs(){let e=process.env.OK_BRIDGE_VIOLATION_DEBOUNCE_S;if(e===void 0)return DEFAULT_DEBOUNCE_S*1e3;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<=0?DEFAULT_DEBOUNCE_S*1e3:t*1e3}function rateKey(e,t){return`${e}::${t??`__nodoc__`}`}function shouldEmitBridgeInvariantViolation(e,t,s=Date.now()){let g=rateKey(e,t),S=lastEmitMs.get(g),w=readDebounceMs();if(S!==void 0&&s-S<w)return!1;if(lastEmitMs.size>=MAX_VIOLATION_RATE_TUPLES)for(let[e,t]of lastEmitMs)s-t>=w&&lastEmitMs.delete(e);return lastEmitMs.set(g,s),!0}function shouldEmitBridgeToleranceApplied(e,t,s=Date.now()){let g=toleranceRateKey(e,t),S=lastToleranceEmitMs.get(g),w=readDebounceMs();return S!==void 0&&s-S<w?!1:(lastToleranceEmitMs.set(g,s),!0)}function shouldThrowOnBridgeInvariantViolation(e=process.env){return e.NODE_ENV===`test`||e.OK_BRIDGE_THROW_ON_VIOLATION===`1`}function assertBridgeInvariant(e,t,s){let g=normalizeBridge(e),S=normalizeBridge(t);if(g===S){if(e!==t){let g=detectAppliedToleranceClasses(e,t);for(let e of g)shouldEmitBridgeToleranceApplied(s.site,e,s.nowMs)&&(incrementBridgeToleranceApplied(e),console.warn(JSON.stringify({event:`bridge-tolerance-applied`,site:s.site,class:e})))}return!0}let w={site:s.site,origin:s.origin,docName:s.docName,ytextSnapshot:e,fragmentMdSnapshot:t,unifiedDiff:` ytext: ${g.slice(0,300)}\n frag: ${S.slice(0,300)}`,stack:Error().stack};if(shouldThrowOnBridgeInvariantViolation()&&!s.suppressDevThrow)throw new BridgeInvariantViolationError(w);return shouldEmitBridgeInvariantViolation(s.site,s.docName,s.nowMs)?(incrementBridgeInvariantViolations(),console.warn(JSON.stringify({event:`bridge-invariant-violation`,site:s.site,"doc.name":s.docName??null,"tolerance-class-attempted":`untracked`,"normalize-equal-modulo-tolerance":!1,ytextLen:e.length,fragmentLen:t.length,diff:w.unifiedDiff,timestamp:new Date().toISOString()})),!1):(incrementBridgeInvariantViolationsSuppressed(),!1)}const CONFIG_VALIDATION_REVERT_ORIGIN={source:`local`,skipStoreHooks:!0,context:{origin:`config-validation-revert`}},CONFIG_FILE_WATCHER_ORIGIN={source:`local`,skipStoreHooks:!0,context:{origin:`config-file-watcher`}};function normalizeFsPath(e){let t=e.split(sep).filter(Boolean);return t.length<=2?e:`...${sep}${t.slice(-2).join(sep)}`}function classifyFsPath(e){return e.includes(`${sep}.git${sep}ok${sep}`)||e.includes(`shadow-repo`)?`shadow-repo`:e.includes(`${sep}.git${sep}`)?`git`:basename(e).endsWith(`.lock`)||basename(e)===`lock`?`lock`:basename(e)===`principal.json`?`principal`:e.includes(`${sep}.ok${sep}`)&&(basename(e)===`conflicts.json`||e.includes(`${sep}conflicts${sep}`))?`conflict`:e.includes(`${sep}.ok${sep}`)?`ok-internal`:e.endsWith(`.md`)||e.endsWith(`.mdx`)?`content-md`:`other`}function buildAttrs(e,t,s){let g={"fs.operation":e,"fs.path":normalizeFsPath(t),"fs.path.role":classifyFsPath(t)};return s&&Object.assign(g,s),g}function byteLength(e){return typeof e==`string`?Buffer.byteLength(e,`utf-8`):e instanceof Uint8Array?e.byteLength:e.byteLength??0}async function tracedWriteFile(e,t,s){return withSpan(`fs.writeFile`,{attributes:buildAttrs(`writeFile`,e,{"fs.bytes":byteLength(t)})},async()=>{await writeFile(e,t,s)})}async function tracedRename(e,t){return withSpan(`fs.rename`,{attributes:buildAttrs(`rename`,t,{"fs.source_path":normalizeFsPath(e)})},async()=>{await rename(e,t)})}async function tracedMkdir(e,t){return withSpan(`fs.mkdir`,{attributes:buildAttrs(`mkdir`,e)},async()=>mkdir(e,t))}function tracedWriteFileSync(e,t,s){withSpanSync(`fs.writeFileSync`,{attributes:buildAttrs(`writeFileSync`,e,{"fs.bytes":byteLength(t)})},()=>{writeFileSync(e,t,s)})}function tracedMkdirSync(e,t){return withSpanSync(`fs.mkdirSync`,{attributes:buildAttrs(`mkdirSync`,e)},()=>mkdirSync(e,t))}function tracedRenameSync(e,t){withSpanSync(`fs.renameSync`,{attributes:buildAttrs(`renameSync`,t,{"fs.source_path":normalizeFsPath(e)})},()=>{renameSync(e,t)})}function tracedUnlinkSync(e){withSpanSync(`fs.unlinkSync`,{attributes:buildAttrs(`unlinkSync`,e)},()=>{unlinkSync(e)})}function tracedLinkSync(e,t){withSpanSync(`fs.linkSync`,{attributes:buildAttrs(`linkSync`,t,{"fs.source_path":normalizeFsPath(e)})},()=>{linkSync(e,t)})}function tracedRmSync(e,t){withSpanSync(`fs.rmSync`,{attributes:buildAttrs(`rmSync`,e)},()=>{rmSync(e,t)})}function tracedRmdirSync(e){withSpanSync(`fs.rmdirSync`,{attributes:buildAttrs(`rmdirSync`,e)},()=>{rmdirSync(e)})}function configScopeAttr(e){if(e===`__config__/project`)return`project`;if(e===`__local__/project`)return`project-local`;if(e===`__user__/config.yml`)return`user`}function emitSchemaInvalidIssueEvents(e){if(isKnownConfigError(e)&&e.code===`SCHEMA_INVALID`)for(let t of e.issues)addConfigSpanEvent(`config.validation.issue`,{"issue.path":t.path.map(e=>String(e)).join(`.`),"issue.message":t.message})}function configDocAbsPath(e,t){if(e===`__config__/project`)return resolveConfigPath(`project`,t.projectDir,t.homedirOverride);if(e===`__local__/project`)return resolveConfigPath(`project-local`,t.projectDir,t.homedirOverride);if(e===`__user__/config.yml`)return resolveConfigPath(`user`,t.projectDir,t.homedirOverride);throw Error(`configDocAbsPath: not a config doc name: ${e}`)}let cachedDefaultsYaml=null;function serializedDefaults(){return cachedDefaultsYaml===null&&(cachedDefaultsYaml=(0,import_dist$1.stringify)(ConfigSchema$1.parse({}))),cachedDefaultsYaml}function validateConfigYaml(e){let t=(0,import_dist$1.parseDocument)(e);if(t.errors.length>0)return{ok:!1,error:{code:`YAML_PARSE`,detail:t.errors.map(e=>e.message).join(`; `)}};let s=t.toJSON()??{},g=ConfigSchema$1.safeParse(s);return g.success?{ok:!0}:{ok:!1,error:{code:`SCHEMA_INVALID`,issues:g.error.issues.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message,issueCode:e.code}))}}}function loadConfigDoc(e,t,s){let g=e.getText(`source`);if(g.length>0)return;let S=configDocAbsPath(t,s),w=``;if(existsSync(S))try{w=readFileSync(S,`utf-8`)}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[config] Could not read ${S}: ${t}. Seeding with empty content.`),w=``}let E=validateConfigYaml(w);!E.ok&&w.length>0&&getLogger(`config-persistence`).warn({docName:t,path:S},`[config-persistence] loadConfigDoc seeding invalid YAML for ${t} into Y.Text — first mutation will revert to LKG`),e.transact(()=>{w.length>0&&g.insert(0,w)},CONFIG_VALIDATION_REVERT_ORIGIN),E.ok&&w.length>0?s.lkgCache.set(t,w):s.lkgCache.set(t,serializedDefaults())}async function atomicWriteConfig(e,t){await tracedMkdir(dirname(e),{recursive:!0});let s=`${e}.tmp.${crypto.randomUUID()}`;try{await tracedWriteFile(s,t,`utf-8`),await tracedRename(s,e)}catch(e){try{tracedUnlinkSync(s)}catch{}throw e}}async function storeConfigDoc(e,t,s,g){return withConfigSpan(`config.persist`,{"config.scope":configScopeAttr(t),"config.transport":`fs`},async S=>{let w=await storeConfigDocInner(e,t,s,g);return S.setAttribute(`config.outcome`,persistOutcomeAttr(w)),w})}function persistOutcomeAttr(e){return e===`reverted`?`reverted`:e===`write-failed`?`rejected`:`success`}async function storeConfigDocInner(e,t,s,g){if(s===CONFIG_VALIDATION_REVERT_ORIGIN)return`no-op`;let S=e.getText(`source`),w=S.toString();if(w.length===0)return`no-op`;let E=g.lkgCache.get(t);if(E!==void 0&&w===E)return`no-op`;let D=configScopeAttr(t),O=withConfigSpanSync(`config.validate`,{"config.scope":D,"config.validation.layer":`L3`},e=>{let t=validateConfigYaml(w);return e.setAttribute(`config.outcome`,t.ok?`success`:`rejected`),t.ok||emitSchemaInvalidIssueEvents(t.error),t});if(!O.ok)return await withConfigSpan(`config.revert`,{"config.scope":D,"config.outcome":`reverted`},async()=>{let s=E??serializedDefaults();e.transact(()=>{S.length>0&&S.delete(0,S.length),S.insert(0,s)},CONFIG_VALIDATION_REVERT_ORIGIN),E===void 0&&g.lkgCache.set(t,s),g.onConfigRejected?.(t,O.error)}),`reverted`;let k=configDocAbsPath(t,g);try{await atomicWriteConfig(k,w)}catch(e){let s=e instanceof Error?e.message:String(e);return getLogger(`config-persistence`).warn({docName:t,path:k,err:e},`[config-persistence] write-failed at ${k}: ${s}`),g.onConfigRejected?.(t,{code:`WRITE_ERROR`,detail:`Failed to persist config at ${k}: ${s}`}),`write-failed`}return g.lkgCache.set(t,w),`persisted`}function applyExternalConfigChange(e,t,s,g){if(!e)return`no-op`;let S=g.lkgCache.get(t);if(S!==void 0&&S===s)return`no-op`;let w=configScopeAttr(t),E=withConfigSpanSync(`config.validate`,{"config.scope":w,"config.validation.layer":`L3`},e=>{let t=validateConfigYaml(s);return e.setAttribute(`config.outcome`,t.ok?`success`:`rejected`),t.ok||emitSchemaInvalidIssueEvents(t.error),t});if(!E.ok)return g.onConfigRejected?.(t,E.error),`rejected`;let D=e.getText(`source`);return e.transact(()=>{D.length>0&&D.delete(0,D.length),D.insert(0,s)},CONFIG_FILE_WATCHER_ORIGIN),g.lkgCache.set(t,s),`applied`}let pendingContributors=new Map;function recordContributor(e,t,s,g,S,w,E){let D=pendingContributors.get(t);if(D||(D={writerId:t,displayName:s,colorSeed:g??s,docs:new Set,subjectOverride:S,actor:w,summaries:[]},pendingContributors.set(t,D)),D.docs.add(e),S!==void 0&&(D.subjectOverride=S),w!==void 0){let e=D.actor??{};w.principalId!==void 0&&(e.principalId=w.principalId),w.agentType!==void 0&&(e.agentType=w.agentType),w.clientName!==void 0&&(e.clientName=w.clientName),w.clientVersion!==void 0&&(e.clientVersion=w.clientVersion),w.label!==void 0&&(e.label=w.label),D.actor=e}typeof E==`string`&&E.length>0&&D.summaries.push(E)}function swapContributors(){let e=pendingContributors;return pendingContributors=new Map,e}function restoreContributors(e){for(let[t,s]of e){let e=pendingContributors.get(t);e||(e={writerId:t,displayName:s.displayName,colorSeed:s.colorSeed,docs:new Set,actor:s.actor,summaries:[]},pendingContributors.set(t,e));for(let t of s.docs)e.docs.add(t);s.summaries.length>0&&(e.summaries=[...s.summaries,...e.summaries])}}function formatContributorsFrom(e){if(e.size===0)return``;let t=[``];for(let s of e.values()){let e={v:1,id:s.writerId,name:s.displayName,colorSeed:s.colorSeed,docs:[...s.docs]};s.summaries.length>0&&(e.summaries=[...s.summaries]),t.push(`ok-contributors: ${JSON.stringify(e)}`)}return t.join(`
772
+ `+s)}function ae(e,t,s,g,S,w){if(e.listenerCount(`wsClientError`)){let g=Error(S);Error.captureStackTrace(g,ae),e.emit(`wsClientError`,g,s,t)}else ne(s,g,S,w)}}));require_stream(),require_receiver(),require_sender(),require_websocket();var import_websocket_server=__toESM(require_websocket_server(),1);init_esm$2();var import_pino=__toESM$1(require_pino(),1),import_pino_pretty=__toESM$1(require_pino_pretty(),1),import_src=require_src$14(),import_src$1=require_src$13(),import_src$2=require_src$4(),import_src$3=require_src$3(),import_src$4=require_src$2(),import_src$5=require_src$1(),import_src$6=require_src();init_esm$1();var import_lib=__toESM$1(require_lib(),1),import_yazl=__toESM$1(require_yazl(),1),import_shell_quote=__toESM$1(require_shell_quote(),1),import_ignore=__toESM$1(require_ignore(),1);const MAX_LEN=128;function sanitizeGitIdentity(e){return e.replace(/[<>\r\n]/g,``).trim().slice(0,MAX_LEN)}const AGENT_ID_RE=/^[a-zA-Z0-9_-]+$/,AGENT_ID_MAX_LEN=64;function validateAgentId(e){return typeof e!=`string`||e.length===0||e.length>64||!AGENT_ID_RE.test(e)?null:e}function toBroadcasterKey(e){return e.startsWith(`agent-`)?e:`agent-${e}`}function isPresenceEligibleAgentId(e){return!e.startsWith(`principal-`)}function resolveAgentType(e){if(!e)return`bot`;let t=e.toLowerCase();return t.includes(`claude`)?`claude`:t.includes(`cursor`)?`cursor`:t.includes(`codex`)?`codex`:t.includes(`cline`)?`cline`:t.includes(`windsurf`)?`windsurf`:`bot`}function parseAgentBodyFields(e){let t=validateAgentId(typeof e.agentId==`string`?e.agentId:null)??void 0;return{rawAgentId:t,writerId:t===void 0?void 0:toBroadcasterKey(t),displayName:typeof e.agentName==`string`?sanitizeGitIdentity(e.agentName):`Claude`,clientName:typeof e.clientName==`string`?sanitizeGitIdentity(e.clientName):void 0,clientVersion:typeof e.clientVersion==`string`?sanitizeGitIdentity(e.clientVersion):void 0,label:typeof e.label==`string`?sanitizeGitIdentity(e.label):void 0,colorSeed:typeof e.colorSeed==`string`&&e.colorSeed.length>0?e.colorSeed.slice(0,128):void 0}}function otelMixin(){let e=trace.getSpan(context.active());if(!e)return{};let t=e.spanContext();return{trace_id:t.traceId,span_id:t.spanId,trace_flags:t.traceFlags}}function shouldColorize(){return process.env.NO_COLOR&&process.env.NO_COLOR!==``?!1:process.stdout.isTTY??!1}var PinoLogger=class{name;transportConfigs=[];pinoInstance;options;constructor(e,t={}){this.name=e,this.options={name:this.name,level:process.env.LOG_LEVEL||(process.env.NODE_ENV===`test`?`silent`:`info`),serializers:{err:import_pino.default.stdSerializers.err,error:import_pino.default.stdSerializers.err},mixin:otelMixin,...t.options},t.transportConfigs&&(this.transportConfigs=t.transportConfigs),this.pinoInstance=this.buildInstance()}buildInstance(){if(this.transportConfigs.length>0)return(0,import_pino.default)(this.options,import_pino.default.transport({targets:this.transportConfigs}));try{let e=(0,import_pino_pretty.default)({colorize:shouldColorize(),translateTime:`HH:MM:ss`,ignore:`pid,hostname`});return(0,import_pino.default)(this.options,e)}catch(e){return console.warn(`[PinoLogger] pino-pretty failed, falling back to JSON:`,e),(0,import_pino.default)(this.options)}}recreateInstance(){typeof this.pinoInstance.flush==`function`&&this.pinoInstance.flush(),this.pinoInstance=this.buildInstance()}addTransport(e){this.transportConfigs.push(e),this.recreateInstance()}removeTransport(e){e>=0&&e<this.transportConfigs.length&&(this.transportConfigs.splice(e,1),this.recreateInstance())}getTransports(){return[...this.transportConfigs]}updateOptions(e){this.options={...this.options,...e},this.recreateInstance()}getPinoInstance(){return this.pinoInstance}error(e,t){this.pinoInstance.error(e,t)}warn(e,t){this.pinoInstance.warn(e,t)}info(e,t){this.pinoInstance.info(e,t)}debug(e,t){this.pinoInstance.debug(e,t)}},LoggerFactory=class{config={};loggers=new Map;configure(e){this.config=e,this.loggers.clear()}getLogger(e){let t=this.loggers.get(e);if(t)return t;let s;return s=this.config.loggerFactory?this.config.loggerFactory(e):this.config.defaultLogger?this.config.defaultLogger:new PinoLogger(e,this.config.pinoConfig),this.loggers.set(e,s),s}reset(){this.config={},this.loggers.clear()}};const loggerFactory=new LoggerFactory;function getLogger(e){return loggerFactory.getLogger(e)}function createTestLogger(e=`test`){return new PinoLogger(e,{options:{level:`silent`}})}function installTestLoggers(){loggerFactory.configure({pinoConfig:{options:{level:`silent`}}})}var AgentFocusBroadcaster=class{hocuspocus;log=getLogger(`agent-focus`);warnedMissing=!1;constructor(e){this.hocuspocus=e}setFocus(e,t){isPresenceEligibleAgentId(e)&&this.mutateAgentFocus(s=>({...s,[e]:t}))}clearFocus(e){isPresenceEligibleAgentId(e)&&this.mutateAgentFocus(t=>{if(!(e in t))return t;let{[e]:s,...g}=t;return g})}getFocusMap(){let e=this.resolveAwareness();return e?e.getLocalState()?.agentFocus??{}:{}}mutateAgentFocus(e){let t=this.resolveAwareness();if(t)try{let s=t.getLocalState()??{},g=e(s.agentFocus??{});t.setLocalState({...s,agentFocus:g})}catch(e){this.log.error({err:e},`[agent-focus] awareness mutation failed`)}}resolveAwareness(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?(this.warnedMissing&&=(this.log.info({},`[agent-focus] __system__ document now available — resuming focus updates`),!1),getAwareness$1(e)):(this.warnedMissing||=(this.log.warn({},`[agent-focus] __system__ document not found — focus updates will be dropped until it is materialized`),!0),null)}};function getAwareness$1(e){return e?.awareness??null}const counters$1={reconcileCount:0,conflictCount:0,batchCount:0,upstreamImportCount:0,rescueBufferCount:0,branchSwitchCount:0,parkCount:0,gitAutoSaveFailureCount:0,gitWriterCommitFailureCount:0,cc1BroadcastCount:0,cc1BroadcastDropCount:0,cc1SubscriberCount:0,cc1LastSeq:{},serverObserverFiresA:0,serverObserverFiresB:0,serverObserverErrorsA:0,serverObserverErrorsB:0,persistenceDiskWrites:0,bridgeMergeContentLoss:0,bridgeMergeCheckpointCreated:0,bridgeInvariantViolations:0,bridgeInvariantViolationsSuppressed:0,persistenceSkipNonQuiescent:0,persistenceForceFlushDuringBurst:0,collabSocketEpipeCount:0,collabSocketEconnresetCount:0,collabMessageTooLargeCount:0,shadowMigrationLegacyRefsDeleted:0,effectDiffCaptureFailures:0,agentPresenceMutationErrors:0,agentWriteCalls:0,summariesProvided:0,summariesTruncated:0,agentPatchFindMismatches:0,bridgeToleranceApplied:{},observerAPathBFires:0,persistenceReconciliationFailures:0,externalChangeHandlerErrors:0,persistenceSanityCheckSerializeFailures:0};function incrementReconcile(){counters$1.reconcileCount++}function incrementConflict(){counters$1.conflictCount++}function incrementBatch(){counters$1.batchCount++}function incrementUpstreamImport(){counters$1.upstreamImportCount++}function incrementRescueBuffer(){counters$1.rescueBufferCount++}function incrementBranchSwitch(){counters$1.branchSwitchCount++}function incrementPark(){counters$1.parkCount++}function incrementGitAutoSaveFailure(){counters$1.gitAutoSaveFailureCount++}function incrementGitWriterCommitFailure(){counters$1.gitWriterCommitFailureCount++}function incrementCC1Broadcast(){counters$1.cc1BroadcastCount++}function incrementCC1BroadcastDrop(){counters$1.cc1BroadcastDropCount++}function setCC1SubscriberCount(e){counters$1.cc1SubscriberCount=e}function incrementServerObserverFire(e){e===`a`?counters$1.serverObserverFiresA++:counters$1.serverObserverFiresB++}function incrementPersistenceDiskWrite(){counters$1.persistenceDiskWrites++}function incrementServerObserverError(e){e===`a`?counters$1.serverObserverErrorsA++:counters$1.serverObserverErrorsB++}function incrementBridgeMergeContentLoss(){counters$1.bridgeMergeContentLoss++}function incrementAgentWriteCalls(){counters$1.agentWriteCalls++}function incrementSummariesProvided(){counters$1.summariesProvided++}function incrementSummariesTruncated(){counters$1.summariesTruncated++}function incrementBridgeMergeCheckpointCreated(){counters$1.bridgeMergeCheckpointCreated++}function incrementBridgeInvariantViolations(){counters$1.bridgeInvariantViolations++}function incrementBridgeInvariantViolationsSuppressed(){counters$1.bridgeInvariantViolationsSuppressed++}function incrementPersistenceSkipNonQuiescent(){counters$1.persistenceSkipNonQuiescent++}function incrementPersistenceForceFlushDuringBurst(){counters$1.persistenceForceFlushDuringBurst++}function incrementAgentPatchFindMismatches(){counters$1.agentPatchFindMismatches++}function incrementBridgeToleranceApplied(e){counters$1.bridgeToleranceApplied[e]=(counters$1.bridgeToleranceApplied[e]??0)+1}function incrementObserverAPathBFires(){counters$1.observerAPathBFires++}function incrementPersistenceReconciliationFailures(){counters$1.persistenceReconciliationFailures++}function incrementExternalChangeHandlerErrors(){counters$1.externalChangeHandlerErrors++}function incrementPersistenceSanityCheckSerializeFailures(){counters$1.persistenceSanityCheckSerializeFailures++}function incrementCollabSocketFilteredError(e){e===`EPIPE`?counters$1.collabSocketEpipeCount++:counters$1.collabSocketEconnresetCount++}function incrementCollabMessageTooLarge(){counters$1.collabMessageTooLargeCount++}function incrementShadowMigrationLegacyRefsDeleted(e){counters$1.shadowMigrationLegacyRefsDeleted+=e}function incrementEffectDiffCaptureFailures(){counters$1.effectDiffCaptureFailures++}function incrementAgentPresenceMutationError(){counters$1.agentPresenceMutationErrors++}function handleCollabSocketError(e){return e.code===`EPIPE`||e.code===`ECONNRESET`?(incrementCollabSocketFilteredError(e.code),!0):!1}function setCC1LastSeq(e,t){counters$1.cc1LastSeq[e]=t}function getMetrics(){return{...counters$1,cc1LastSeq:{...counters$1.cc1LastSeq},bridgeToleranceApplied:{...counters$1.bridgeToleranceApplied}}}function resetMetrics(){counters$1.reconcileCount=0,counters$1.conflictCount=0,counters$1.batchCount=0,counters$1.upstreamImportCount=0,counters$1.rescueBufferCount=0,counters$1.branchSwitchCount=0,counters$1.parkCount=0,counters$1.gitAutoSaveFailureCount=0,counters$1.gitWriterCommitFailureCount=0,counters$1.cc1BroadcastCount=0,counters$1.cc1BroadcastDropCount=0,counters$1.cc1SubscriberCount=0,counters$1.cc1LastSeq={},counters$1.serverObserverFiresA=0,counters$1.serverObserverFiresB=0,counters$1.serverObserverErrorsA=0,counters$1.serverObserverErrorsB=0,counters$1.persistenceDiskWrites=0,counters$1.bridgeMergeContentLoss=0,counters$1.bridgeMergeCheckpointCreated=0,counters$1.bridgeInvariantViolations=0,counters$1.bridgeInvariantViolationsSuppressed=0,counters$1.persistenceSkipNonQuiescent=0,counters$1.persistenceForceFlushDuringBurst=0,counters$1.collabSocketEpipeCount=0,counters$1.collabSocketEconnresetCount=0,counters$1.collabMessageTooLargeCount=0,counters$1.shadowMigrationLegacyRefsDeleted=0,counters$1.effectDiffCaptureFailures=0,counters$1.agentPresenceMutationErrors=0,counters$1.agentWriteCalls=0,counters$1.summariesProvided=0,counters$1.summariesTruncated=0,counters$1.agentPatchFindMismatches=0,counters$1.bridgeToleranceApplied={},counters$1.observerAPathBFires=0,counters$1.persistenceReconciliationFailures=0,counters$1.externalChangeHandlerErrors=0,counters$1.persistenceSanityCheckSerializeFailures=0}const BROADCASTER_EVICTION_MS=5e3*4;var AgentPresenceBroadcaster=class{hocuspocus;log=getLogger(`agent-presence`);warnedMissing=!1;destroyed=!1;constructor(e){this.hocuspocus=e}setPresence(e,t){if(!isPresenceEligibleAgentId(e))return;let s=0;this.mutateAgentPresence(g=>{let S=Date.now(),w={};for(let[t,E]of Object.entries(g)){if(S-E.ts>=2e4&&t!==e){s++;continue}w[t]=E}return w[e]=t,w})&&(this.log.debug({agentId:e,action:`set`,currentDoc:t.currentDoc,ts:t.ts},`[agent-presence] set`),s>0&&this.log.info({evictedCount:s,thresholdMs:BROADCASTER_EVICTION_MS},`[agent-presence] evicted stale entries`))}clearPresence(e){if(!isPresenceEligibleAgentId(e))return;let t=!1;this.mutateAgentPresence(s=>{if(!s[e])return s;t=!0;let{[e]:g,...S}=s;return S})&&t&&this.log.info({agentId:e,action:`clear`,currentDoc:null,ts:Date.now()},`[agent-presence] clear`)}touchMode(e,t){if(!isPresenceEligibleAgentId(e))return;let s=[],g=!1,S=this.mutateAgentPresence(S=>{let w=S[e];if(!w)return S;g=!0;let E=Date.now();return s.push({currentDoc:w.currentDoc,ts:E}),{...S,[e]:{...w,mode:t,ts:E}}}),w=s[0];S&&w?this.log.debug({agentId:e,action:`touchMode`,currentDoc:w.currentDoc,ts:w.ts,mode:t},`[agent-presence] touchMode`):g||this.log.debug({agentId:e,action:`touchMode`,mode:t,reason:`entry-missing`},`[agent-presence] touchMode skipped — no entry for agentId`)}bumpPresenceTs(e){if(!isPresenceEligibleAgentId(e))return;let t=null;this.mutateAgentPresence(s=>{let g=s[e];if(!g)return s;let S=Date.now();return t=S,{...s,[e]:{...g,ts:S}}}),t!==null&&this.log.debug({agentId:e,action:`bumpTs`,ts:t},`[agent-presence] bumpTs`)}getPresenceMap(){let e=this.resolveAwareness();return e?e.getLocalState()?.agentPresence??{}:{}}destroy(){this.destroyed=!0}mutateAgentPresence(e){if(this.destroyed)return!1;let t=this.resolveAwareness();if(!t)return!1;try{let s=t.getLocalState()??{},g=e(s.agentPresence??{});return t.setLocalState({...s,agentPresence:g}),!0}catch(e){return incrementAgentPresenceMutationError(),this.log.error({err:e},`[agent-presence] awareness mutation failed`),!1}}resolveAwareness(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?(this.warnedMissing&&=(this.log.info({},`[agent-presence] __system__ document now available — resuming presence updates`),!1),getAwareness(e)):(this.warnedMissing||=(this.log.warn({},`[agent-presence] __system__ document not found — presence updates will be dropped until it is materialized`),!0),null)}};function getAwareness(e){return e?.awareness??null}const mdManager=new MarkdownManager({extensions:sharedExtensions}),schema=getSchema(sharedExtensions);function composeAndWriteRawBody(e,t,s){let g=e.getXmlFragment(`default`),S=e.getText(`source`),w=S.toString(),{body:E}=stripFrontmatter(t),D=s?{resolveEmbed:s.resolveEmbed,sourcePath:s.sourcePath}:void 0,O=mdManager.parseWithFallback(E,D),k=schema.nodeFromJSON(O);w!==t&&applyFastDiff(S,w,t),updateYFragment(e,g,k,{mapping:new Map,isOMark:new Map})}const DEBOUNCE_MS=100,MAX_DISK_ACK_SVS=1e3;function isSystemDoc(e){return e===SYSTEM_DOC_NAME}const CONFIG_DOC_NAME_SET=new Set(CONFIG_DOC_NAMES);function isConfigDoc(e){return CONFIG_DOC_NAME_SET.has(e)}var CC1Broadcaster=class{hocuspocus;seqs=new Map;timers=new Map;log=getLogger(`cc1`);warnedMissing=!1;latestDiskAckSVs=new Map;constructor(e){this.hocuspocus=e}signal(e){let t=this.timers.get(e);t!==void 0&&clearTimeout(t),this.timers.set(e,setTimeout(()=>{this.timers.delete(e),this.broadcast(e)},DEBOUNCE_MS))}broadcast(e){try{let t=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!t){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found — broadcasts will be dropped until it is materialized`),!0),incrementCC1BroadcastDrop();return}let s=(this.seqs.get(e)??0)+1;this.seqs.set(e,s);let g=CC1DerivedViewPayloadSchema.parse({v:1,ch:e,seq:s});t.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(e,s),setCC1SubscriberCount(t.getConnectionsCount())}catch(t){this.log.error({err:t,channel:e},`[cc1] broadcast failed`)}}emitServerInfo(e,t){try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitServerInfo — dropped`),!0),incrementCC1BroadcastDrop();return}let g=CC1ServerInfoPayloadSchema.parse({v:1,ch:CC1_CHANNEL_SERVER_INFO,seq:0,serverInstanceId:e,...t===void 0?{}:{currentBranch:t}});s.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_SERVER_INFO,0)}catch(e){this.log.error({err:e},`[cc1] emitServerInfo failed`)}}emitBranchSwitched(e){try{let t=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!t){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitBranchSwitched — dropped`),!0),incrementCC1BroadcastDrop();return}let s=(this.seqs.get(`branch-switched`)??0)+1;this.seqs.set(CC1_CHANNEL_BRANCH_SWITCHED,s);let g=CC1BranchSwitchedPayloadSchema.parse({v:1,ch:CC1_CHANNEL_BRANCH_SWITCHED,seq:s,branch:e});t.broadcastStateless(JSON.stringify(g)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_BRANCH_SWITCHED,s)}catch(e){this.log.error({err:e},`[cc1] emitBranchSwitched failed`)}}emitDiskAck(e,t){if(this.latestDiskAckSVs.delete(e),this.latestDiskAckSVs.set(e,t),this.latestDiskAckSVs.size>MAX_DISK_ACK_SVS){let e=this.latestDiskAckSVs.keys().next().value;e!==void 0&&this.latestDiskAckSVs.delete(e)}try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitDiskAck — dropped`),!0),incrementCC1BroadcastDrop();return}let g=(this.seqs.get(`disk-ack`)??0)+1;this.seqs.set(CC1_CHANNEL_DISK_ACK,g);let S=CC1DiskAckPayloadSchema.parse({v:1,ch:CC1_CHANNEL_DISK_ACK,seq:g,docName:e,sv:Buffer.from(t).toString(`base64`)});s.broadcastStateless(JSON.stringify(S)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_DISK_ACK,g)}catch(t){this.log.error({err:t,docName:e},`[cc1] emitDiskAck failed`)}}getLatestDiskAckSVsAsBase64(){let e={};for(let[t,s]of this.latestDiskAckSVs)e[t]=Buffer.from(s).toString(`base64`);return e}emitConfigValidationRejected(e,t){try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitConfigValidationRejected — dropped`),!0),incrementCC1BroadcastDrop();return}let g=(this.seqs.get(`config-validation-rejected`)??0)+1;this.seqs.set(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,g);let S=CC1ConfigValidationRejectedPayloadSchema.parse({v:1,ch:CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,seq:g,docName:e,error:t});s.broadcastStateless(JSON.stringify(S)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,g)}catch(t){this.log.error({err:t,docName:e},`[cc1] emitConfigValidationRejected failed`)}}emitConfigIgnoreNestedError(e,t){try{let s=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);if(!s){this.warnedMissing||=(this.log.warn({},`[cc1] __system__ document not found at emitConfigIgnoreNestedError — dropped`),!0),incrementCC1BroadcastDrop();return}let g=(this.seqs.get(`config-ignore-nested-error`)??0)+1;this.seqs.set(CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,g);let S=CC1ConfigIgnoreNestedErrorPayloadSchema.parse({v:1,ch:CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,seq:g,path:e,error:t});s.broadcastStateless(JSON.stringify(S)),incrementCC1Broadcast(),setCC1LastSeq(CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,g)}catch(t){this.log.error({err:t,path:e},`[cc1] emitConfigIgnoreNestedError failed`)}}get subscriberCount(){let e=this.hocuspocus.documents.get(SYSTEM_DOC_NAME);return e?e.getConnectionsCount():0}destroy(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};const TRACER_NAME=`open-knowledge-server`;let tracerProvider=null,meterProvider=null;function noopResult(){return{tracer:trace.getTracer(TRACER_NAME),meter:metrics.getMeter(TRACER_NAME)}}function initTelemetry(){if(process.env.OTEL_SDK_DISABLED!==`false`||tracerProvider)return noopResult();try{let e=(0,import_src$4.resourceFromAttributes)({[ATTR_SERVICE_NAME]:process.env.OTEL_SERVICE_NAME||`open-knowledge-server`,[ATTR_SERVICE_VERSION]:process.env.OTEL_SERVICE_VERSION||`0.2.0`}),t=new import_src.AsyncLocalStorageContextManager;context.setGlobalContextManager(t);let s=new import_src$6.BasicTracerProvider({resource:e,spanProcessors:[new import_src$6.BatchSpanProcessor(new import_src$3.OTLPTraceExporter)]});trace.setGlobalTracerProvider(s),propagation.setGlobalPropagator(new import_src$1.W3CTraceContextPropagator);let g=new import_src$5.MeterProvider({resource:e,readers:[new import_src$5.PeriodicExportingMetricReader({exporter:new import_src$2.OTLPMetricExporter})]});metrics.setGlobalMeterProvider(g),tracerProvider=s,meterProvider=g,getLogger(`telemetry`).info({otlp_endpoint:process.env.OTEL_EXPORTER_OTLP_ENDPOINT||`http://localhost:4318`,service_name:e.attributes[ATTR_SERVICE_NAME]},`OpenTelemetry initialized — traces + metrics exporting via OTLP/HTTP`)}catch(e){getLogger(`telemetry`).error({err:e},`failed to initialize OpenTelemetry — falling back to no-op`),tracerProvider=null,meterProvider=null}return noopResult()}const SHUTDOWN_TIMEOUT_MS=5e3;async function shutdownTelemetry(){if(!tracerProvider&&!meterProvider)return;let e=getLogger(`telemetry`),t=Promise.all([tracerProvider?.shutdown().catch(t=>{e.warn({err:t},`tracer provider shutdown failed`)}),meterProvider?.shutdown().catch(t=>{e.warn({err:t},`meter provider shutdown failed`)})]);await Promise.race([t.then(()=>!1),new Promise(e=>setTimeout(()=>e(!0),SHUTDOWN_TIMEOUT_MS))])&&e.warn({},`telemetry shutdown timed out after ${SHUTDOWN_TIMEOUT_MS}ms — data may be lost`),tracerProvider=null,meterProvider=null,trace.disable(),metrics.disable(),context.disable()}function getTracer(){return trace.getTracer(TRACER_NAME)}function getMeter(){return metrics.getMeter(TRACER_NAME)}async function withSpan(e,t,s){return getTracer().startActiveSpan(e,t??{},async e=>{try{let t=await s(e);return e.isRecording(),t}catch(t){throw e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t instanceof Error?t.message:String(t)}),t}finally{e.end()}})}function withSpanSync(e,t,s){return getTracer().startActiveSpan(e,t??{},e=>{try{return s(e)}catch(t){throw e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t instanceof Error?t.message:String(t)}),t}finally{e.end()}})}function setActiveSpanAttributes(e){let t=trace.getSpan(context.active());t&&t.setAttributes(e)}let _editSurfaceCounter=null;function editSurfaceCounter(){return _editSurfaceCounter||=getMeter().createCounter(`ok.frontmatter.edit_surface_total`,{description:`Count of frontmatter edits by surface. Bounded label: source ∈ {source-mode, mcp-write, file-watcher}.`}),_editSurfaceCounter}function recordFrontmatterEditSurface(e){editSurfaceCounter().add(1,{source:e})}const log$6=getLogger(`agent-sessions`),AGENT_WRITE_ORIGIN={source:`local`,skipStoreHooks:!1,context:{origin:`agent-write`,paired:!0}};function applyAgentMarkdownWrite(e,t,s,g){withSpanSync(`agent.applyAgentMarkdownWrite`,{attributes:{"doc.name":e.name,"agent.write_position":s,"agent.markdown.bytes":t.length}},()=>applyAgentMarkdownWriteInner(e,t,s,g))}function applyAgentMarkdownWriteInner(e,t,s,g){try{let{frontmatter:S,body:w}=stripFrontmatter(e.getText(`source`).toString()),{frontmatter:E,body:D}=stripFrontmatter(t),O,k;switch(s){case`replace`:O=E||S,k=D;break;case`prepend`:O=S,k=w.length>0?`${D}\n\n${w}`:D;break;case`append`:O=S,k=w.length>0?`${w}\n\n${D}`:D;break}O!==S&&recordFrontmatterEditSurface(`mcp-write`),composeAndWriteRawBody(e,prependFrontmatter(O,k),g)}catch(g){throw log$6.error({err:g,docName:e.name,position:s,markdownLen:t.length},`[applyAgentMarkdownWrite] failed for '${e.name}'`),g}}function applyAgentUndo(e,t,s){return withSpanSync(`agent.applyAgentUndo`,{attributes:{"doc.name":e.dc.document.name,"agent.undo_scope":t}},()=>{let g=applyAgentUndoInner(e,t,s);return setActiveSpanAttributes({"agent.undo_effective":g}),g})}function applyAgentUndoInner(e,t,s){let{dc:g,um:S,undoOrigin:w}=e,E=g.document,D=E.getXmlFragment(`default`),O=E.getText(`source`),k=!1;return E.transact(()=>{if(t===`last`){if(S.undoStack.length===0)return;S.undo(),k=!0}else for(;S.undoStack.length>0;)S.undo(),k=!0;let{body:e}=stripFrontmatter(O.toString()),g=mdManager.parseWithFallback(e,s);updateYFragment(E,D,schema.nodeFromJSON(g),{mapping:new Map,isOMark:new Map})},w),k}function createSessionOrigin(e,t,s,g,S){let w={origin:`agent-write`,paired:!0,session_id:e};t!==void 0&&(w.agent_type=t),s!==void 0&&(w.principal=s),g!==void 0&&(w.display_name=g),S!==void 0&&(w.color_seed=S),Object.freeze(w);let E={source:`local`,skipStoreHooks:!1,context:w};return Object.freeze(E),E}function createUndoOrigin(e,t){let s={origin:`agent-undo`,paired:!0,session_id:e};t!==void 0&&(s.agent_type=t),Object.freeze(s);let g={source:`local`,skipStoreHooks:!1,context:s};return Object.freeze(g),g}const MAX_AGENT_SESSIONS=256;var AgentSessionCapacityError=class extends Error{limit;constructor(e){super(`Maximum agent session count reached (${e})`),this.name=`AgentSessionCapacityError`,this.limit=e}},AgentSessionManager=class{sessions=new Map;pendingSessions=new Map;hocuspocus;maxSessions;constructor(e,t={}){this.hocuspocus=e,this.maxSessions=t.maxSessions??256}sessionKey(e,t){return`${e}\0${t}`}*sessionsForConnection(e){let t=`\0${e}`;for(let[e,s]of this.sessions)e.endsWith(t)&&(yield s)}getLiveSession(e,t){return this.sessions.get(this.sessionKey(e,t))}async getSession(e,t=`claude-1`,s){if(isSystemDoc(e)||isConfigDoc(e))throw Error(`Cannot create agent session for reserved doc: ${e}`);let g=this.sessionKey(e,t),S=this.sessions.get(g);if(S)return S;let w=this.pendingSessions.get(g);if(w)return w;if(this.sessions.size+this.pendingSessions.size>=this.maxSessions)throw new AgentSessionCapacityError(this.maxSessions);let E=this._createSession(e,t,s);this.pendingSessions.set(g,E);try{let e=await E;return this.sessions.set(g,e),e}finally{this.pendingSessions.delete(g)}}async _createSession(e,t,s){let g=s?.clientName,S=t.startsWith(`agent-`)?t.slice(6):t,w=createSessionOrigin(S,g,s?.principalId,s?.displayName,s?.colorSeed),E=createUndoOrigin(S,g),D={session_id:S,...g===void 0?{}:{agent_type:g},...s?.clientName===void 0?{}:{client_name:s.clientName},...s?.principalId===void 0?{}:{principalId:s.principalId}},O=await this.hocuspocus.openDirectConnection(e,D),k=new UndoManager([O.document.getText(`source`),O.document.getMap(`agent-flash`)],{trackedOrigins:new Set([w]),captureTimeout:500,captureTransaction:e=>e.origin!==E,ignoreRemoteMapChanges:!0}),j=({stackItem:e})=>{e.meta.set(`time`,Date.now())};return k.on(`stack-item-added`,j),k.on(`stack-item-updated`,j),log$6.info({docName:e,agentId:t},`[agent-session] Created session for: ${e} / ${t}`),{dc:O,origin:w,undoOrigin:E,um:k,agentId:t,docName:e}}hasSession(e,t=`claude-1`){return this.sessions.has(this.sessionKey(e,t))}async cleanupSession(e,t,s){try{try{t.um.destroy()}catch(e){log$6.error({err:e,...s},`[agent-session] um.destroy() failed`)}try{await t.dc.disconnect()}catch(e){log$6.error({err:e,...s},`[agent-session] dc.disconnect() failed`)}}finally{this.sessions.delete(e)}}async closeSession(e,t=`claude-1`){let s=this.sessionKey(e,t),g=this.sessions.get(s);g&&(await this.cleanupSession(s,g,{docName:e,agentId:t}),log$6.info({docName:e,agentId:t},`[agent-session] Closed session for: ${e} / ${t}`))}async closeAllForAgent(e){let t=`\0${e}`,s=[...this.pendingSessions.keys()].filter(e=>e.endsWith(t));s.length>0&&await Promise.allSettled(s.map(e=>this.pendingSessions.get(e)));let g=[...this.sessions.keys()].filter(e=>e.endsWith(t));for(let t of g){let s=this.sessions.get(t);s&&await this.cleanupSession(t,s,{agentId:e,key:t})}}async closeAllForDoc(e){let t=`${e}\0`,s=[...this.sessions.keys()].filter(e=>e.startsWith(t));for(let t of s){let s=this.sessions.get(t);s&&await this.cleanupSession(t,s,{docName:e,key:t})}}async closeAll(e){if(e){await this.closeAllForDoc(e);return}let t=[...this.sessions.keys()];for(let e of t){let t=this.sessions.get(e);t&&await this.cleanupSession(e,t,{key:e})}}};const RING_BUFFER_LIMIT=50;let _effectCounter=0;const EFFECT_CAPTURE_ORIGIN=Object.freeze({source:`local`,skipStoreHooks:!0,context:Object.freeze({origin:`effect-capture`,paired:!1})});function captureEffect(e,t,s,g){let S=e.doc;if(!S)return;let w=++_effectCounter,E=S.getMap(`agent-effects`),D=k=>{e.unobserve(D),S.off(`destroy`,O);let j=`${t}:${w}`,F={sessionId:t,timestamp:Date.now(),delta:k.delta,agent_type:g??`agent`,color_seed:s??t};try{S.transact(()=>{if(E.set(j,F),E.size>RING_BUFFER_LIMIT){let e=[...E.entries()].sort((e,t)=>e[1].timestamp-t[1].timestamp);for(let[t]of e.slice(0,E.size-RING_BUFFER_LIMIT))E.delete(t)}},EFFECT_CAPTURE_ORIGIN)}catch(e){let s=e instanceof Error?e.message:String(e);if(console.warn(JSON.stringify({event:`effect-diff-capture-failed`,sessionId:t,reason:s})),incrementEffectDiffCaptureFailures(),process.env.NODE_ENV!==`production`)throw e}},O=()=>{e.unobserve(D)};e.observe(D),S.once(`destroy`,O)}function collectItemsInDeleteSet(e,t,s){iterateDeletedStructs(e,t,e=>{e instanceof Item&&s.add(e)})}function*walkYTextItems(e){let t=e._start;for(;t!==null;)yield t,t=t.right}function synthesizeStackItemDiff(e,t){let s=[],g=[],S=t.doc,w=new Set,E=new Set;S&&S.transact(t=>{collectItemsInDeleteSet(t,e.insertions,w),collectItemsInDeleteSet(t,e.deletions,E)});let D=``,O=``,k=0,j=0;for(let e of walkYTextItems(t)){if(!(e.content instanceof ContentString))continue;let t=e.content.str,S=t.length,F=w.has(e),L=E.has(e);e.deleted?L&&(g.push({position:k,content:t,length:S}),D+=t,k+=S):(O+=t,F?s.push({position:j,content:t,length:S}):(D+=t,k+=S),j+=S)}return{insertions:s,deletions:g,before:D,after:O}}function synthesizeStackItemDiffText(e,t,s){let{before:g,after:S}=synthesizeStackItemDiff(e,t);return g===S?``:createPatch(s,g,S,void 0,void 0,{context:3})}function getBurstTs(e){let t=e.meta.get(`time`);return typeof t==`number`?t:Date.now()}function countStackItemChanges(e,t){let s=t.doc,g=new Set,S=new Set;s&&s.transact(t=>{collectItemsInDeleteSet(t,e.insertions,g),collectItemsInDeleteSet(t,e.deletions,S)});let w=0,E=0;for(let e of walkYTextItems(t)){if(!(e.content instanceof ContentString))continue;let t=e.content.str.length;!e.deleted&&g.has(e)&&(w+=t),S.has(e)&&(E+=t)}return{additions:w,deletions:E}}function listAgentActivity(e,t){let s=[],g=null,S=!1;for(let w of e.sessionsForConnection(t)){if(S=!0,!g){let e=w.origin.context,s=typeof e?.agent_type==`string`?e.agent_type:void 0,S=typeof e?.color_seed==`string`?e.color_seed:t,E=iconFromClientName(s),D=AGENT_ICON_COLORS[E]??colorFromSeed(S);g={displayName:e?.display_name||(typeof e?.agent_type==`string`?e.agent_type:void 0)||t,color:D,icon:E,connectionId:t}}let e=w.docName,E=w.um,D=w.dc.document.getText(`source`),O=[];for(let e=0;e<E.undoStack.length;e++){let t=E.undoStack[e],s=getBurstTs(t),{additions:g,deletions:S}=countStackItemChanges(t,D);O.push({stackIndex:e,ts:s,additions:g,deletions:S})}if(O.length===0)continue;O.sort((e,t)=>t.stackIndex-e.stackIndex);let k=O.reduce((e,t)=>e+t.additions,0),j=O.reduce((e,t)=>e+t.deletions,0),F=Math.max(...O.map(e=>e.ts));s.push({docName:e,additionsTotal:k,deletionsTotal:j,lastTs:F,bursts:O})}return S?(s.sort((e,t)=>t.lastTs-e.lastTs),{sessionAlive:!0,agent:g,files:s}):{sessionAlive:!1,agent:null,files:[]}}const ELLIPSIS=`…`,LINE_TERMINATOR_RE=RegExp(`[\\r\\n\\v\\f\\u0085\\u2028\\u2029]`,`g`);function normalizeSummary(e){if(e===void 0)return{kind:`absent`};if(typeof e!=`string`)return{kind:`invalid`};if(e.length===0||e.trim().length===0)return{kind:`absent`};let t=e.replace(LINE_TERMINATOR_RE,` `);return t.length<=80?{kind:`value`,value:t}:{kind:`value`,value:t.slice(0,79)+ELLIPSIS,truncatedFrom:e.length}}function isAllowedApiOrigin(e){if(e===`null`)return!0;try{let{hostname:t}=new URL(e);return t===`localhost`||t===`::1`||t===`[::1]`||/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(t)}catch{return!1}}const counters=new WeakMap;let globalCounter=0;function getCounters(e){let t=counters.get(e);return t||(t={lastUserTxGen:0,settledGen:0,lastUserTxAtMs:null},counters.set(e,t)),t}function isObserverSelfOrigin(e){if(!e||typeof e!=`object`)return!1;let t=e.context;return t!=null&&t.origin===`observer-sync`}function attachQuiescenceTracker(e){let t=t=>{if(isObserverSelfOrigin(t.origin))return;let s=getCounters(e);s.lastUserTxGen=++globalCounter,s.lastUserTxAtMs=Date.now()},s=()=>{getCounters(e).settledGen=++globalCounter};return e.on(`afterTransaction`,t),e.on(`afterAllTransactions`,s),()=>{e.off(`afterTransaction`,t),e.off(`afterAllTransactions`,s)}}const overrides=new WeakMap;function isDocQuiescent(e){let t=overrides.get(e);if(t!==void 0)return t;let s=counters.get(e);return s?s.settledGen>s.lastUserTxGen:!0}function getMsSinceLastUserTx(e,t=Date.now()){let s=counters.get(e);return!s||s.lastUserTxAtMs===null?null:Math.max(0,t-s.lastUserTxAtMs)}const DEFAULT_DEBOUNCE_S=60,lastEmitMs=new Map,MAX_VIOLATION_RATE_TUPLES=1024,lastToleranceEmitMs=new Map;function toleranceRateKey(e,t){return`${e}::${t}`}function readDebounceMs(){let e=process.env.OK_BRIDGE_VIOLATION_DEBOUNCE_S;if(e===void 0)return DEFAULT_DEBOUNCE_S*1e3;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<=0?DEFAULT_DEBOUNCE_S*1e3:t*1e3}function rateKey(e,t){return`${e}::${t??`__nodoc__`}`}function shouldEmitBridgeInvariantViolation(e,t,s=Date.now()){let g=rateKey(e,t),S=lastEmitMs.get(g),w=readDebounceMs();if(S!==void 0&&s-S<w)return!1;if(lastEmitMs.size>=MAX_VIOLATION_RATE_TUPLES)for(let[e,t]of lastEmitMs)s-t>=w&&lastEmitMs.delete(e);return lastEmitMs.set(g,s),!0}function shouldEmitBridgeToleranceApplied(e,t,s=Date.now()){let g=toleranceRateKey(e,t),S=lastToleranceEmitMs.get(g),w=readDebounceMs();return S!==void 0&&s-S<w?!1:(lastToleranceEmitMs.set(g,s),!0)}function shouldThrowOnBridgeInvariantViolation(e=process.env){return e.NODE_ENV===`test`||e.OK_BRIDGE_THROW_ON_VIOLATION===`1`}function assertBridgeInvariant(e,t,s){let g=normalizeBridge(e),S=normalizeBridge(t);if(g===S){if(e!==t){let g=detectAppliedToleranceClasses(e,t);for(let e of g)shouldEmitBridgeToleranceApplied(s.site,e,s.nowMs)&&(incrementBridgeToleranceApplied(e),console.warn(JSON.stringify({event:`bridge-tolerance-applied`,site:s.site,class:e})))}return!0}let w={site:s.site,origin:s.origin,docName:s.docName,ytextSnapshot:e,fragmentMdSnapshot:t,unifiedDiff:` ytext: ${g.slice(0,300)}\n frag: ${S.slice(0,300)}`,stack:Error().stack};if(shouldThrowOnBridgeInvariantViolation()&&!s.suppressDevThrow)throw new BridgeInvariantViolationError(w);return shouldEmitBridgeInvariantViolation(s.site,s.docName,s.nowMs)?(incrementBridgeInvariantViolations(),console.warn(JSON.stringify({event:`bridge-invariant-violation`,site:s.site,"doc.name":s.docName??null,"tolerance-class-attempted":`untracked`,"normalize-equal-modulo-tolerance":!1,ytextLen:e.length,fragmentLen:t.length,diff:w.unifiedDiff,timestamp:new Date().toISOString()})),!1):(incrementBridgeInvariantViolationsSuppressed(),!1)}const CONFIG_VALIDATION_REVERT_ORIGIN={source:`local`,skipStoreHooks:!0,context:{origin:`config-validation-revert`}},CONFIG_FILE_WATCHER_ORIGIN={source:`local`,skipStoreHooks:!0,context:{origin:`config-file-watcher`}};function normalizeFsPath(e){let t=e.split(sep).filter(Boolean);return t.length<=2?e:`...${sep}${t.slice(-2).join(sep)}`}function classifyFsPath(e){return e.includes(`${sep}.git${sep}ok${sep}`)||e.includes(`shadow-repo`)?`shadow-repo`:e.includes(`${sep}.git${sep}`)?`git`:basename(e).endsWith(`.lock`)||basename(e)===`lock`?`lock`:basename(e)===`principal.json`?`principal`:e.includes(`${sep}.ok${sep}`)&&(basename(e)===`conflicts.json`||e.includes(`${sep}conflicts${sep}`))?`conflict`:e.includes(`${sep}.ok${sep}`)?`ok-internal`:e.endsWith(`.md`)||e.endsWith(`.mdx`)?`content-md`:`other`}function buildAttrs(e,t,s){let g={"fs.operation":e,"fs.path":normalizeFsPath(t),"fs.path.role":classifyFsPath(t)};return s&&Object.assign(g,s),g}function byteLength(e){return typeof e==`string`?Buffer.byteLength(e,`utf-8`):e instanceof Uint8Array?e.byteLength:e.byteLength??0}async function tracedWriteFile(e,t,s){return withSpan(`fs.writeFile`,{attributes:buildAttrs(`writeFile`,e,{"fs.bytes":byteLength(t)})},async()=>{await writeFile(e,t,s)})}async function tracedRename(e,t){return withSpan(`fs.rename`,{attributes:buildAttrs(`rename`,t,{"fs.source_path":normalizeFsPath(e)})},async()=>{await rename(e,t)})}async function tracedMkdir(e,t){return withSpan(`fs.mkdir`,{attributes:buildAttrs(`mkdir`,e)},async()=>mkdir(e,t))}function tracedWriteFileSync(e,t,s){withSpanSync(`fs.writeFileSync`,{attributes:buildAttrs(`writeFileSync`,e,{"fs.bytes":byteLength(t)})},()=>{writeFileSync(e,t,s)})}function tracedMkdirSync(e,t){return withSpanSync(`fs.mkdirSync`,{attributes:buildAttrs(`mkdirSync`,e)},()=>mkdirSync(e,t))}function tracedRenameSync(e,t){withSpanSync(`fs.renameSync`,{attributes:buildAttrs(`renameSync`,t,{"fs.source_path":normalizeFsPath(e)})},()=>{renameSync(e,t)})}function tracedUnlinkSync(e){withSpanSync(`fs.unlinkSync`,{attributes:buildAttrs(`unlinkSync`,e)},()=>{unlinkSync(e)})}function tracedLinkSync(e,t){withSpanSync(`fs.linkSync`,{attributes:buildAttrs(`linkSync`,t,{"fs.source_path":normalizeFsPath(e)})},()=>{linkSync(e,t)})}function tracedRmSync(e,t){withSpanSync(`fs.rmSync`,{attributes:buildAttrs(`rmSync`,e)},()=>{rmSync(e,t)})}function tracedRmdirSync(e){withSpanSync(`fs.rmdirSync`,{attributes:buildAttrs(`rmdirSync`,e)},()=>{rmdirSync(e)})}function configScopeAttr(e){if(e===`__config__/project`)return`project`;if(e===`__local__/project`)return`project-local`;if(e===`__user__/config.yml`)return`user`;if(e===`__config__/okignore`)return`project`}let _okignoreRejectionCounter=null;function okignoreRejectionCounter(){return _okignoreRejectionCounter||=getMeter().createCounter(`ok.config.ignore.rejection_total`,{description:`Count of okignore L3 rejections by error code.`}),_okignoreRejectionCounter}function emitSchemaInvalidIssueEvents(e){if(isKnownConfigError(e)&&e.code===`SCHEMA_INVALID`)for(let t of e.issues)addConfigSpanEvent(`config.validation.issue`,{"issue.path":t.path.map(e=>String(e)).join(`.`),"issue.message":t.message})}function configDocAbsPath(e,t){if(e===`__config__/project`)return resolveConfigPath(`project`,t.projectDir,t.homedirOverride);if(e===`__local__/project`)return resolveConfigPath(`project-local`,t.projectDir,t.homedirOverride);if(e===`__user__/config.yml`)return resolveConfigPath(`user`,t.projectDir,t.homedirOverride);if(e===`__config__/okignore`)return resolve(t.contentDir??t.projectDir,`.okignore`);throw Error(`configDocAbsPath: not a config doc name: ${e}`)}let cachedDefaultsYaml=null;function serializedDefaults(){return cachedDefaultsYaml===null&&(cachedDefaultsYaml=(0,import_dist$1.stringify)(ConfigSchema$1.parse({}))),cachedDefaultsYaml}function validateOkignore(e){if(e.length===0)return{ok:!0};let t=e.split(`
773
+ `);for(let e=0;e<t.length;e++){let s=t[e]??``;if(s.length!==0&&/^\s+$/.test(s))return{ok:!1,error:{code:`OKIGNORE_INVALID`,detail:`Whitespace-only pattern is not allowed.`,lineNumber:e+1}}}return{ok:!0}}function validateConfigContent(e,t){return e===`__config__/okignore`?validateOkignore(t):validateConfigYaml(t)}function defaultLkgFor(e){return e===`__config__/okignore`?``:serializedDefaults()}function validateConfigYaml(e){let t=(0,import_dist$1.parseDocument)(e);if(t.errors.length>0)return{ok:!1,error:{code:`YAML_PARSE`,detail:t.errors.map(e=>e.message).join(`; `)}};let s=t.toJSON()??{},g=ConfigSchema$1.safeParse(s);return g.success?{ok:!0}:{ok:!1,error:{code:`SCHEMA_INVALID`,issues:g.error.issues.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message,issueCode:e.code}))}}}function loadConfigDoc(e,t,s){let g=e.getText(`source`);if(g.length>0)return;let S=configDocAbsPath(t,s),w=``;if(existsSync(S))try{w=readFileSync(S,`utf-8`)}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[config] Could not read ${S}: ${t}. Seeding with empty content.`),w=``}let E=validateConfigContent(t,w);!E.ok&&w.length>0&&getLogger(`config-persistence`).warn({docName:t,path:S},`[config-persistence] loadConfigDoc seeding invalid content for ${t} into Y.Text — first mutation will revert to LKG`),e.transact(()=>{w.length>0&&g.insert(0,w)},CONFIG_VALIDATION_REVERT_ORIGIN),E.ok&&w.length>0?s.lkgCache.set(t,w):s.lkgCache.set(t,defaultLkgFor(t))}async function atomicWriteConfig(e,t){await tracedMkdir(dirname(e),{recursive:!0});let s=`${e}.tmp.${crypto.randomUUID()}`;try{await tracedWriteFile(s,t,`utf-8`),await tracedRename(s,e)}catch(e){try{tracedUnlinkSync(s)}catch{}throw e}}async function storeConfigDoc(e,t,s,g){return withConfigSpan(`config.persist`,{"config.scope":configScopeAttr(t),"config.transport":`fs`},async S=>{let w=await storeConfigDocInner(e,t,s,g);return S.setAttribute(`config.outcome`,persistOutcomeAttr(w)),w})}function persistOutcomeAttr(e){return e===`reverted`?`reverted`:e===`write-failed`?`rejected`:`success`}async function storeConfigDocInner(e,t,s,g){if(s===CONFIG_VALIDATION_REVERT_ORIGIN)return`no-op`;let S=e.getText(`source`),w=S.toString();if(w.length===0)return`no-op`;let E=g.lkgCache.get(t);if(E!==void 0&&w===E)return`no-op`;let D=configScopeAttr(t),O=withConfigSpanSync(`config.validate`,{"config.scope":D,"config.validation.layer":`L3`},e=>{let s=validateConfigContent(t,w);return e.setAttribute(`config.outcome`,s.ok?`success`:`rejected`),s.ok||emitSchemaInvalidIssueEvents(s.error),s});if(!O.ok)return await withConfigSpan(`config.revert`,{"config.scope":D,"config.outcome":`reverted`},async()=>{let s=E??defaultLkgFor(t);e.transact(()=>{S.length>0&&S.delete(0,S.length),S.insert(0,s)},CONFIG_VALIDATION_REVERT_ORIGIN),E===void 0&&g.lkgCache.set(t,s),t===`__config__/okignore`&&isKnownConfigError(O.error)&&okignoreRejectionCounter().add(1,{"error.code":O.error.code}),g.onConfigRejected?.(t,O.error)}),`reverted`;let k=configDocAbsPath(t,g);try{await atomicWriteConfig(k,w)}catch(e){let s=e instanceof Error?e.message:String(e);return getLogger(`config-persistence`).warn({docName:t,path:k,err:e},`[config-persistence] write-failed at ${k}: ${s}`),g.onConfigRejected?.(t,{code:`WRITE_ERROR`,detail:`Failed to persist config at ${k}: ${s}`}),`write-failed`}return g.lkgCache.set(t,w),`persisted`}function applyExternalConfigChange(e,t,s,g){if(!e)return`no-op`;let S=g.lkgCache.get(t);if(S!==void 0&&S===s)return`no-op`;let w=configScopeAttr(t),E=withConfigSpanSync(`config.validate`,{"config.scope":w,"config.validation.layer":`L3`},e=>{let g=validateConfigContent(t,s);return e.setAttribute(`config.outcome`,g.ok?`success`:`rejected`),g.ok||emitSchemaInvalidIssueEvents(g.error),g});if(!E.ok)return t===`__config__/okignore`&&isKnownConfigError(E.error)&&okignoreRejectionCounter().add(1,{"error.code":E.error.code}),g.onConfigRejected?.(t,E.error),`rejected`;let D=e.getText(`source`);return e.transact(()=>{D.length>0&&D.delete(0,D.length),D.insert(0,s)},CONFIG_FILE_WATCHER_ORIGIN),g.lkgCache.set(t,s),`applied`}let pendingContributors=new Map;function recordContributor(e,t,s,g,S,w,E){let D=pendingContributors.get(t);if(D||(D={writerId:t,displayName:s,colorSeed:g??s,docs:new Set,subjectOverride:S,actor:w,summaries:[]},pendingContributors.set(t,D)),D.docs.add(e),S!==void 0&&(D.subjectOverride=S),w!==void 0){let e=D.actor??{};w.principalId!==void 0&&(e.principalId=w.principalId),w.agentType!==void 0&&(e.agentType=w.agentType),w.clientName!==void 0&&(e.clientName=w.clientName),w.clientVersion!==void 0&&(e.clientVersion=w.clientVersion),w.label!==void 0&&(e.label=w.label),D.actor=e}typeof E==`string`&&E.length>0&&D.summaries.push(E)}function swapContributors(){let e=pendingContributors;return pendingContributors=new Map,e}function restoreContributors(e){for(let[t,s]of e){let e=pendingContributors.get(t);e||(e={writerId:t,displayName:s.displayName,colorSeed:s.colorSeed,docs:new Set,actor:s.actor,summaries:[]},pendingContributors.set(t,e));for(let t of s.docs)e.docs.add(t);s.summaries.length>0&&(e.summaries=[...s.summaries,...e.summaries])}}function formatContributorsFrom(e){if(e.size===0)return``;let t=[``];for(let s of e.values()){let e={v:1,id:s.writerId,name:s.displayName,colorSeed:s.colorSeed,docs:[...s.docs]};s.summaries.length>0&&(e.summaries=[...s.summaries]),t.push(`ok-contributors: ${JSON.stringify(e)}`)}return t.join(`
773
774
  `)}function formatContributors(){return formatContributorsFrom(pendingContributors)}function restoreContributorEntry(e,t){let s=pendingContributors.get(e);s||(s={writerId:e,displayName:t.displayName,colorSeed:t.colorSeed,docs:new Set,actor:t.actor,summaries:[]},pendingContributors.set(e,s));for(let e of t.docs)s.docs.add(e);t.summaries.length>0&&(s.summaries=[...t.summaries,...s.summaries])}function clearContributors(){pendingContributors.clear()}function contributorCount(){return pendingContributors.size}function hasContributor(e){return pendingContributors.has(e)}const SUPPORTED_DOC_EXTENSIONS=[`.mdx`,`.md`],DEFAULT_EXTENSION=`.md`;function isSupportedDocFile(e){let t=extname(e).toLowerCase();return SUPPORTED_DOC_EXTENSIONS.includes(t)}function isSupportedAssetFile(e,t){let s=extname(e).slice(1).toLowerCase();return s.length>0&&t.has(s)}function stripDocExtension(e){let t=e.toLowerCase();for(let s of SUPPORTED_DOC_EXTENSIONS)if(t.endsWith(s))return e.slice(0,-s.length);return e}function canonicalize(e){let t=e.toLowerCase();return t===`.mdx`?`.mdx`:t===`.md`?`.md`:null}function rank(e){return SUPPORTED_DOC_EXTENSIONS.indexOf(e)}const docExtensionByName=new Map;function registerDocExtension(e,t){let s=canonicalize(t);if(!s)throw Error(`registerDocExtension: unsupported extension "${t}"`);let g=docExtensionByName.get(e);if(!g)return docExtensionByName.set(e,t),{effective:t,changed:!0,shadowed:null};let S=canonicalize(g);return S?S===s?{effective:g,changed:!1,shadowed:null}:rank(s)<rank(S)?(docExtensionByName.set(e,t),{effective:t,changed:!0,shadowed:g}):{effective:g,changed:!1,shadowed:t}:(docExtensionByName.set(e,t),{effective:t,changed:!0,shadowed:g})}function getDocExtension(e){return docExtensionByName.get(e)??DEFAULT_EXTENSION}function forgetDocExtension(e){docExtensionByName.delete(e)}function acquireLock(e,t){let s=resolve(e,`lock`);if(existsSync(s)){let t=null;try{t=JSON.parse(readFileSync(s,`utf-8`))}catch{console.warn(`[shadow-lock] Corrupt lock file at ${s} — replacing`)}if(t&&!isValidLockPid(t.pid)&&(console.warn(`[shadow-lock] Invalid lock pid (${String(t.pid)}) at ${s} — replacing`),t=null),t){let s=t.hostname===hostname();if(!(s&&t.pid===process.pid)){if(s&&isProcessAlive(t.pid))throw Error(`Shadow repo at ${e} is locked by another writer (pid=${t.pid}, worktree=${t.worktreeRoot}, started=${t.startedAt}). Only one active writer instance may mutate a given shadow root at a time.`);console.warn(`[shadow-lock] Stale lock detected (pid=${t.pid}, host=${t.hostname}) — replacing`)}}}let g={pid:process.pid,hostname:hostname(),startedAt:new Date().toISOString(),worktreeRoot:t};return writeFileSync(s,JSON.stringify(g,null,2),`utf-8`),s}function releaseLock(e){let t=resolve(e,`lock`);try{unlinkSync(t)}catch{}}const GIT_TIMEOUT_MS$3=(()=>{let e=process.env.OK_GIT_TIMEOUT_MS;if(!e)return 3e4;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:3e4})();function shadowGit(e){return esm_default({baseDir:e.workTree,timeout:{block:GIT_TIMEOUT_MS$3}}).env({GIT_DIR:e.gitDir,GIT_WORK_TREE:e.workTree})}async function initShadowRepo(e){let t=resolveShadowDir(e),s=resolve(e,`.git/openknowledge`),g=existsSync(s),S=existsSync(t);if(g&&!S?tracedRenameSync(s,t):g&&S&&console.warn(`[shadow-repo] unexpected legacy + new shadow both present — no rename performed`),!existsSync(resolve(t,`HEAD`))){tracedMkdirSync(t,{recursive:!0}),await esm_default({baseDir:e,timeout:{block:GIT_TIMEOUT_MS$3}}).raw(`init`,`--bare`,t);let s=esm_default({timeout:{block:GIT_TIMEOUT_MS$3}}).env({GIT_DIR:t});await s.raw(`config`,`--unset`,`core.bare`),await s.raw(`config`,`core.worktree`,e),await s.raw(`config`,`user.name`,`openknowledge`),await s.raw(`config`,`user.email`,`noreply@openknowledge.local`)}let w={gitDir:t,workTree:e};return await sweepLegacyShadowRefs(w),sweepOrphanedTmpIndexFiles(w),acquireLock(t,e),w}function destroyShadowRepo(e){releaseLock(e.gitDir)}async function sweepLegacyShadowRefs(e){let t=shadowGit(e),s;try{s=(await t.raw(`for-each-ref`,`--format=%(refname)`,`refs/wip`)).trim().split(`
774
775
  `).filter(e=>e.length>0)}catch{return 0}let g=[],S={server:0,"human-":0,upstream:0};for(let e of s){let t=e.split(`/`);if(t.length<4)continue;let s=t.slice(3).join(`/`);parseWriterId(s).classification===`unknown`&&(s===`server`?(g.push(e),S.server++):s.startsWith(`human-`)?(g.push(e),S[`human-`]++):s===`upstream`&&(g.push(e),S.upstream++))}if(g.length===0)return 0;for(let e of g)try{await t.raw(`update-ref`,`-d`,e)}catch(t){console.warn(`[shadow-migration] failed to delete legacy ref ${e}:`,t)}let w=g.length;return incrementShadowMigrationLegacyRefsDeleted(w),console.warn(`[shadow-migration] deleted ${w} legacy refs: server=${S.server} human-=${S[`human-`]} upstream=${S.upstream}`),w}async function commitWip(e,t,s,g,S=`main`){return withSpan(`shadow.commitWip`,{attributes:{"shadow.writer":t.id,"shadow.branch":S}},async()=>commitWipInner(e,t,s,g,S))}async function commitWipInner(e,t,s,g,S=`main`){let w=resolve(e.gitDir,`index-wip-${t.id}`),E=`refs/wip/${S}/${t.id}`,D=shadowGit(e),O=s||`.`;try{try{let t=(await D.raw(`rev-parse`,`${E}^{tree}`)).trim();await D.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:w}).raw(`read-tree`,t)}catch(e){let t=e instanceof Error?e.message:String(e);if(!(t.includes(`unknown revision`)||t.includes(`bad revision`)))throw console.error(`[shadow-repo] Unexpected error seeding index for ${E}:`,e),e}await D.env({GIT_DIR:e.gitDir,GIT_WORK_TREE:e.workTree,GIT_INDEX_FILE:w}).raw(`add`,O);let s=(await D.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:w}).raw(`write-tree`)).trim(),S=null;try{S=(await D.raw(`rev-parse`,E)).trim()}catch(e){let t=e instanceof Error?e.message:String(e);if(!t.includes(`unknown revision`)&&!t.includes(`bad revision`))throw console.error(`[shadow-repo] Unexpected error resolving ${E}:`,e),e}let k=[`commit-tree`,s,`-m`,g];S&&k.push(`-p`,S);let j=(await D.env({GIT_DIR:e.gitDir,GIT_AUTHOR_NAME:t.name,GIT_AUTHOR_EMAIL:t.email,GIT_COMMITTER_NAME:`openknowledge`,GIT_COMMITTER_EMAIL:`noreply@openknowledge.local`}).raw(...k)).trim();return await D.raw(`update-ref`,E,j),j}finally{try{rmSync(w)}catch{}}}function sweepOrphanedTmpIndexFiles(e){let t=0;try{for(let s of readdirSync(e.gitDir))if(s.startsWith(`index-wip-fanout-`))try{rmSync(resolve(e.gitDir,s)),t++}catch{}}catch{}return t}async function buildWipTree(e,t){let s=resolve(e.gitDir,`index-wip-fanout-${randomUUID()}`),g=shadowGit(e),S=t||`.`;try{return await g.env({GIT_DIR:e.gitDir,GIT_WORK_TREE:e.workTree,GIT_INDEX_FILE:s}).raw(`add`,S),(await g.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:s}).raw(`write-tree`)).trim()}finally{try{rmSync(s)}catch{}}}async function commitWipFromTree(e,t,s,g,S=`main`){return withSpan(`shadow.commitWipFromTree`,{attributes:{"shadow.writer":t.id,"shadow.branch":S,"shadow.tree":s.slice(0,8)}},async()=>commitWipFromTreeInner(e,t,s,g,S))}async function commitWipFromTreeInner(e,t,s,g,S=`main`){let w=`refs/wip/${S}/${t.id}`,E=shadowGit(e),D=null;try{D=(await E.raw(`rev-parse`,w)).trim()}catch(e){let t=e instanceof Error?e.message:String(e);if(!t.includes(`unknown revision`)&&!t.includes(`bad revision`))throw console.error(`[shadow-repo] Unexpected error resolving ${w}:`,e),e}let O=[`commit-tree`,s,`-m`,g];D&&O.push(`-p`,D);let k=(await E.env({GIT_DIR:e.gitDir,GIT_AUTHOR_NAME:t.name,GIT_AUTHOR_EMAIL:t.email,GIT_COMMITTER_NAME:`openknowledge`,GIT_COMMITTER_EMAIL:`noreply@openknowledge.local`}).raw(...O)).trim();return await E.raw(`update-ref`,w,k),k}const FILE_SYSTEM_WRITER={id:`file-system`,name:`File System`,email:`file-system@openknowledge.local`},GIT_UPSTREAM_WRITER={id:`git-upstream`,name:`Git (upstream)`,email:`git@openknowledge.local`},SERVICE_WRITER={id:`openknowledge-service`,name:`Open Knowledge (service)`,email:`service@openknowledge.local`},UPSTREAM_WRITER=GIT_UPSTREAM_WRITER;async function commitUpstreamImport(e,t,s,g,S=`main`){return withSpan(`shadow.commitUpstreamImport`,{attributes:{"shadow.branch":S,"shadow.new_head":g.slice(0,8)}},async()=>commitUpstreamImportInner(e,t,s,g,S))}async function commitUpstreamImportInner(e,t,s,g,S=`main`){return commitWip(e,UPSTREAM_WRITER,t,`${formatImportSubject(s,g)}\n\n${formatOkActor({v:1,writer_id:UPSTREAM_WRITER.id,principal:null,agent_session:null,agent_type:null,client_name:null,client_version:null,label:null,display_name:UPSTREAM_WRITER.name,color_seed:UPSTREAM_WRITER.id,docs:[]})}`,S)}const SAFETY_WRITER=SERVICE_WRITER;async function safetyCheckpoint(e,t,s,g=`main`){return commitWip(e,SAFETY_WRITER,t,`${formatCheckpointSubject(`pre-${s.action}`)}\n\n${formatOkActor({v:1,writer_id:SAFETY_WRITER.id,principal:null,agent_session:null,agent_type:null,client_name:null,client_version:null,label:null,display_name:SAFETY_WRITER.name,color_seed:SAFETY_WRITER.id,docs:[]})}`,g)}async function saveInMemoryCheckpoint(e,t,s){let g=s.branch??`main`,S=shadowGit(e),w=randomUUID(),E=resolve(e.gitDir,`index-checkpoint-${w}`),D=resolve(e.gitDir,`tmp-checkpoint-blob-${w}`),O=t?`${t.replace(/\/$/,``)}/${s.docName}`:s.docName,k=Buffer.byteLength(s.contents,`utf-8`),j=formatCheckpointBodyLine(s.kind===`bridge-merge-loss`?{kind:`bridge-merge-loss`,docName:s.docName,size:k,metadata:s.metadata}:{kind:`external-change-rescue`,docName:s.docName,size:k,metadata:s.metadata}),F=`checkpoint: ${s.label}\n\n${j}`;try{tracedWriteFileSync(D,s.contents,`utf-8`);let t=(await S.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:E}).raw(`hash-object`,`-w`,D)).trim();await S.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:E}).raw(`update-index`,`--add`,`--cacheinfo`,`100644,${t},${O}`);let w=(await S.env({GIT_DIR:e.gitDir,GIT_INDEX_FILE:E}).raw(`write-tree`)).trim(),k=(await S.env({GIT_DIR:e.gitDir,GIT_AUTHOR_NAME:`openknowledge`,GIT_AUTHOR_EMAIL:`noreply@openknowledge.local`,GIT_COMMITTER_NAME:`openknowledge`,GIT_COMMITTER_EMAIL:`noreply@openknowledge.local`}).raw(`commit-tree`,w,`-m`,F)).trim();return await S.raw(`update-ref`,`refs/checkpoints/${g}/${k}`,k),k}finally{try{rmSync(E)}catch{}try{rmSync(D)}catch{}}}async function listRescueCheckpoints(e,t=`main`){let s=shadowGit(e),g;try{g=await s.raw(`for-each-ref`,`--format=%(objectname)`,`refs/checkpoints/${t}/`)}catch{return[]}let S=g.trim().split(`
775
776
  `).filter(e=>e.length===40);if(S.length===0)return[];let w;try{w=await s.raw(`log`,`--no-walk`,`--author-date-order`,`--format=%H%x00%aI%x00%s%x00%B%x1e`,...S)}catch{return[]}let E=[];for(let e of w.split(``)){let t=e.trimStart();if(!t)continue;let[g=``,S=``,w=``,D=``]=t.split(`\0`),O=parseCheckpoint(D);if(O?.kind!==`external-change-rescue`)continue;let k=O.docName??``,j=O.size??0;if(!k)try{let e=(await s.raw(`ls-tree`,`-r`,`--long`,g)).trim().split(`
@@ -780,10 +781,10 @@ ${e.terminator}`}function Qa(e){return`(${Ee(e.body)})${ke(e.redirections)}`}fun
780
781
  `).trim()),S=[]):S.push(e)}if(S.length>0){let e=S.join(`
781
782
  `).trim();e&&g.push(e)}return g}function reconcile(e){if(isSystemDoc(e.docName)||isConfigDoc(e.docName))return{kind:`noop`};let{base:t,ours:s,theirs:g}=e;if(containsConflictMarkers(g))return{kind:`refused`,reason:`conflict-markers`};if(g===t)return{kind:`noop`};if(s===t)return{kind:`clean`,newContent:g};let S=splitMarkdownBlocks(t),w=splitMarkdownBlocks(s),E=splitMarkdownBlocks(g);return(S.length+1)*(w.length+1)>4e6||(S.length+1)*(E.length+1)>4e6?{kind:`refused`,reason:`too-large`}:mergeBlocks(S,w,E)}function mergeBlocks(e,t,s){let g=computeEditOps(e,t),S=computeEditOps(e,s),w=[],E=[];for(let t=0;t<e.length;t++){let s=e[t],D=g.get(t),O=S.get(t),k=D?.insertsBefore??[],j=O?.insertsBefore??[];w.push(...k,...j);let F=D?.action??`keep`,L=O?.action??`keep`;if(F===`keep`&&L===`keep`)w.push(s);else if(F===`keep`&&L!==`keep`)L===`modify`&&O?.newContent!==void 0&&w.push(O.newContent);else if(F!==`keep`&&L===`keep`)F===`modify`&&D?.newContent!==void 0&&w.push(D.newContent);else{let e=F===`modify`?D?.newContent:null,g=L===`modify`?O?.newContent:null;e===g||E.push({blockIndex:t,base:s,ours:e??``,theirs:g??``}),e!=null&&w.push(e)}}let D=g.get(e.length),O=S.get(e.length);D?.insertsBefore&&w.push(...D.insertsBefore),O?.insertsBefore&&w.push(...O.insertsBefore);let k=w.length>0?`${w.join(`
782
783
 
783
- `)}\n`:``;return E.length>0?{kind:`conflicts`,newContent:k,conflicts:E}:{kind:`merged`,newContent:k,mergedBlocks:w.length}}function computeEditOps(e,t){let s=new Map,g=longestCommonSubsequence(e,t);for(let t=0;t<=e.length;t++)s.set(t,{action:`keep`,insertsBefore:[]});let S=new Set,w=new Set;for(let[e,t]of g)S.add(e),w.add(t);let E=-1;for(let D=0;D<e.length;D++)if(S.has(D)){let e=g.find(e=>e[0]===D)?.[1]??-1,S=[];for(let s=E+1;s<e;s++)w.has(s)||S.push(t[s]);let O=s.get(D);O&&(O.insertsBefore=S),E=e}else{let e=g.find(e=>e[0]>D),S=e?e[1]:t.length,O=[];for(let e=E+1;e<S;e++)w.has(e)||O.push(e);if(O.length>0){let e=O[0];w.add(e);let g=s.get(D);g&&(g.action=`modify`,g.newContent=t[e])}else{let e=s.get(D);e&&(e.action=`delete`)}}let D=[];for(let e=E+1;e<t.length;e++)w.has(e)||D.push(t[e]);let O=s.get(e.length);return O&&(O.insertsBefore=D),s}function longestCommonSubsequence(e,t){let s=e.length,g=t.length,S=g+1,w=new Uint32Array((s+1)*S);for(let E=1;E<=s;E++){let s=E*S,D=(E-1)*S;for(let S=1;S<=g;S++)if(e[E-1]===t[S-1])w[s+S]=w[D+(S-1)]+1;else{let e=w[D+S],t=w[s+(S-1)];w[s+S]=e>t?e:t}}let E=[],D=s,O=g;for(;D>0&&O>0;)e[D-1]===t[O-1]?(E.push([D-1,O-1]),D--,O--):w[(D-1)*S+O]>=w[D*S+(O-1)]?D--:O--;return E.reverse()}function assertNeverDiskEvent(e){throw Error(`[DiskEvent] unhandled variant: ${JSON.stringify(e)}`)}const writeTracker=new Map,WRITE_TRACKER_TTL_MS=1e4;function registerWrite(e,t){let s=writeTracker.get(e)??[];s.push({hash:t,timestamp:Date.now()}),writeTracker.set(e,s)}function evictStaleTrackerEntries(){let e=Date.now();for(let[t,s]of writeTracker){let g=s.filter(t=>e-t.timestamp<=WRITE_TRACKER_TTL_MS);g.length===0?writeTracker.delete(t):g.length!==s.length&&writeTracker.set(t,g)}}function contentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function eventEscapesContentDir(e,t){let s;try{s=lstatSync(e)}catch(t){let s=t.code;return s===`ENOENT`?!1:(console.warn(`[file-watcher] lstat failed for escape check on ${e} (${s}), dropping event`),!0)}if(!s.isSymbolicLink())return!1;let g;try{g=realpathSync(e)}catch(t){let s=t.code;return s!==`ENOENT`&&s!==`ELOOP`&&console.warn(`[file-watcher] realpath failed for escape check on ${e} (${s}), dropping event`),!0}return!isWithinContentDir(g,t)}function pathToDocName(e,t){return stripDocExtension(relative(t,e))}function extractDocExtension(e){let t=extname(e);if(t===``)return null;let s=t.toLowerCase();return s===`.mdx`||s===`.md`?t:null}const lastKnownHash=new Map;function updateLastKnownHash(e,t){lastKnownHash.set(e,t)}function removeLastKnownHash(e){let t=lastKnownHash.get(e);return lastKnownHash.delete(e),t}async function classifyEvents(e,t,s,g){let S=[],w=[],E=[];for(let g of e)if(isSupportedDocFile(g.path)){if(s){let e=relative(t,g.path);if(s.isExcluded(e))continue}switch(g.type){case`delete`:S.push(g);break;case`create`:lastKnownHash.has(g.path)?E.push(g):w.push(g);break;case`update`:E.push(g);break}}let D=new Map,O=new Map;for(let e of w)try{D.set(e.path,await readFile$1(e.path,`utf-8`))}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read ${e.path}:`,t)}for(let e of E)try{O.set(e.path,await readFile$1(e.path,`utf-8`))}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read ${e.path}:`,t)}function k(e){let s=pathToDocName(e,t);if(!g)return s;let S=null;try{S=lstatSync(e)}catch(t){return t.code!==`ENOENT`&&console.warn(`[file-watcher] resolveDocName lstat failed for ${e}:`,t),g.has(s)&&g.delete(s),s}if(!S.isSymbolicLink())return g.has(s)&&g.delete(s),s;let w;try{w=realpathSync(e)}catch(t){let S=t.code;return S!==`ENOENT`&&S!==`ELOOP`&&console.warn(`[file-watcher] resolveDocName realpath failed for ${e}:`,t),g.delete(s),s}if(!isWithinContentDir(w,t))return g.delete(s),s;let E=pathToDocName(w,t);return E===s?s:(g.set(s,E),E)}let j=[],F=new Set,L=new Set;for(let e of S){let t=removeLastKnownHash(e.path);if(t)for(let s of w){if(F.has(s.path))continue;let g=D.get(s.path);if(g===void 0)continue;let S=contentHash(g);if(S===t){F.add(s.path),L.add(e.path),updateLastKnownHash(s.path,S),j.push({kind:`rename`,oldPath:e.path,newPath:s.path,oldDocName:k(e.path),newDocName:k(s.path),content:g});break}}}for(let e of S)L.has(e.path)||(removeLastKnownHash(e.path),j.push({kind:`delete`,path:e.path,docName:k(e.path)}));for(let e of w){if(F.has(e.path))continue;let t=D.get(e.path);if(t===void 0)continue;let s=contentHash(t);updateLastKnownHash(e.path,s),containsConflictMarkers(t)?j.push({kind:`conflict`,path:e.path,docName:k(e.path),content:t}):j.push({kind:`create`,path:e.path,docName:k(e.path),content:t})}for(let e of E){let t=O.get(e.path);if(t===void 0)continue;let s=contentHash(t);updateLastKnownHash(e.path,s),containsConflictMarkers(t)?j.push({kind:`conflict`,path:e.path,docName:k(e.path),content:t}):j.push({kind:`update`,path:e.path,docName:k(e.path),content:t})}return j}function isSelfWrite(e,t){let s=writeTracker.get(e);if(!s)return!1;let g=s.findIndex(e=>e.hash===t);return g<0?!1:(s.splice(g,1),s.length===0&&writeTracker.delete(e),!0)}function seedLastKnownHashes(e,t,s,g,S,w){let E=w??new Set;try{let w=readdirSync(e,{withFileTypes:!0});for(let D of w){let w=join(e,D.name),O;try{O=lstatSync(w)}catch(e){e.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to lstat ${w}, skipping:`,e);continue}if(O.isSymbolicLink()){let e;try{e=realpathSync(w)}catch(e){let t=e.code;t===`ENOENT`||t===`ELOOP`?console.warn(`[file-watcher] Broken/cyclic symlink at ${w}, skipping`):console.warn(`[file-watcher] Failed to resolve symlink ${w}:`,e);continue}if(!isWithinContentDir(e,t)){console.warn(`[file-watcher] Symlink escape: ${w} → ${e}, skipping`);continue}try{let O=statSync(e);if(E.has(O.ino)){if(O.isFile()&&isSupportedDocFile(D.name)){let s=pathToDocName(w,t),E=pathToDocName(e,t);S.set(s,E);let D=g.get(E);D&&!D.aliases.includes(s)&&D.aliases.push(s)}continue}if(E.add(O.ino),O.isDirectory()){if(s){let g=relative(t,e);if(s.isDirExcluded(g))continue}seedLastKnownHashes(e,t,s,g,S,E)}else if(O.isFile()&&isSupportedDocFile(D.name)){if(s){let g=relative(t,e);if(s.isExcluded(g))continue}let E=pathToDocName(w,t),D=pathToDocName(e,t);S.set(E,D);try{let t=contentHash(readFileSync(e,`utf-8`));lastKnownHash.set(e,t);let s=extractDocExtension(e);if(s){let e=registerDocExtension(D,s);if(e.shadowed&&(console.warn(`[file-watcher] docName "${D}" has both "${e.effective}" and "${e.shadowed}" on disk; "${e.effective}" wins (industry convention). Rename or delete one to disambiguate.`),!e.changed))continue}g.set(D,{size:O.size,modified:O.mtime.toISOString(),canonicalPath:e,inode:O.ino,aliases:[E]})}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to seed hash for ${e}:`,t)}}}catch(t){console.warn(`[file-watcher] Failed to stat symlink target ${e}:`,t)}}else if(O.isDirectory()){if(s){let e=relative(t,w);if(s.isDirExcluded(e))continue}seedLastKnownHashes(w,t,s,g,S,E)}else if(O.isFile()&&isSupportedDocFile(D.name)){if(E.has(O.ino))continue;if(E.add(O.ino),s){let e=relative(t,w);if(s.isExcluded(e))continue}try{let e=readFileSync(w,`utf-8`);lastKnownHash.set(w,contentHash(e));let s=pathToDocName(w,t),S=extractDocExtension(w);if(S){let e=registerDocExtension(s,S);if(e.shadowed&&(console.warn(`[file-watcher] docName "${s}" has both "${e.effective}" and "${e.shadowed}" on disk; "${e.effective}" wins (industry convention). Rename or delete one to disambiguate.`),!e.changed))continue}g.set(s,{size:O.size,modified:O.mtime.toISOString(),canonicalPath:w,inode:O.ino,aliases:[]})}catch(e){let t=e.code;t===`EACCES`?console.warn(`[file-watcher] Permission denied reading ${w}, file excluded from index`):t!==`ENOENT`&&console.warn(`[file-watcher] Failed to seed hash for ${w}:`,e)}}}}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read directory ${e}:`,t)}}function updateFileIndex(e,t){if(e.kind===`asset-create`||e.kind===`asset-delete`)return;let s=e.kind===`rename`?e.newDocName:e.docName;if(!(isSystemDoc(s)||isConfigDoc(s)))switch(e.kind){case`create`:case`update`:case`conflict`:{let s=e.docName,g=t.get(s),S=extractDocExtension(e.path);S&&registerDocExtension(s,S),t.set(s,{size:Buffer.byteLength(e.content,`utf-8`),modified:new Date().toISOString(),canonicalPath:g?.canonicalPath??e.path,inode:g?.inode??0,aliases:g?.aliases??[]});break}case`delete`:if(t.has(e.docName))t.delete(e.docName),forgetDocExtension(e.docName);else for(let[,s]of t){let t=s.aliases.indexOf(e.docName);if(t!==-1){s.aliases.splice(t,1);break}}break;case`rename`:{let s=t.get(e.oldDocName);t.delete(e.oldDocName),forgetDocExtension(e.oldDocName);let g=extractDocExtension(e.newPath);g&&registerDocExtension(e.newDocName,g),t.set(e.newDocName,{size:Buffer.byteLength(e.content,`utf-8`),modified:new Date().toISOString(),canonicalPath:s?.canonicalPath??e.newPath,inode:s?.inode??0,aliases:s?.aliases??[]});break}}}async function handleRawEvents(e,t,s,g,S,w){let E=e.filter(e=>eventEscapesContentDir(e.path,t)?(console.warn(`[file-watcher] Symlink escape: ${e.path}, dropping ${e.type} event`),!1):!0),D=E.filter(e=>isSupportedDocFile(e.path)),O=E.filter(e=>isSupportedAssetFile(e.path,ASSET_EXTENSIONS));if(D.length===0&&O.length===0)return;let k=D.length>0?await classifyEvents(D,t,s,w):[];for(let e of k){let t=!1;if(e.kind!==`delete`&&e.kind!==`rename`){let s=contentHash(e.content),g=e.path;try{g=realpathSync(e.path)}catch(t){let s=t.code;s!==`ENOENT`&&console.warn(`[file-watcher] realpathSync failed for self-write check on ${e.path} (${s})`)}t=isSelfWrite(g,s)}else if(e.kind===`rename`){let s=contentHash(e.content),g=e.newPath;try{g=realpathSync(e.newPath)}catch(t){let s=t.code;s!==`ENOENT`&&console.warn(`[file-watcher] realpathSync failed for self-write check on ${e.newPath} (${s})`)}t=isSelfWrite(g,s)}if(updateFileIndex(e,g),s&&!t)switch(e.kind){case`create`:s.incrementMdDir(dirname(e.docName));break;case`delete`:s.decrementMdDir(dirname(e.docName));break;case`rename`:s.decrementMdDir(dirname(e.oldDocName)),s.incrementMdDir(dirname(e.newDocName));break}if(t){getLogger(`file-watcher`).debug({kind:e.kind,path:e.kind===`rename`?e.newPath:e.path,self:!0},`[file-watcher] Skipped self-write: ${e.kind}`),_fileWatcherEventsCounter().add(1,{"disk.kind":e.kind,self:!0});continue}getLogger(`file-watcher`).debug({kind:e.kind,path:e.kind===`rename`?e.newPath:e.path},`[file-watcher] Dispatching: ${e.kind}`),_fileWatcherEventsCounter().add(1,{"disk.kind":e.kind,self:!1});let w=e.kind===`rename`?e.newPath:e.path;await withSpan(`file_watcher.process_event`,{attributes:{"disk.kind":e.kind,"disk.path":normalizeFsPath(w),"disk.path.role":classifyFsPath(w)}},async()=>S(e))}for(let e of O){if(s){let g=relative(t,e.path);if(s.isExcluded(g))continue}let g=relative(t,e.path);await S(e.type===`delete`?{kind:`asset-delete`,path:e.path,relativePath:g}:{kind:`asset-create`,path:e.path,relativePath:g})}}let _fwEventsCounterCache=null;function _fileWatcherEventsCounter(){return _fwEventsCounterCache||=getMeter().createCounter(`ok.file_watcher.events`,{description:`Number of file-watcher events classified by kind`}),_fwEventsCounterCache}async function startParcelWatcher(e,t,s,g,S){let w;try{w=await import(`@parcel/watcher`)}catch(e){return console.warn(`[file-watcher] @parcel/watcher import failed:`,e instanceof Error?e.message:e),null}try{let E=t?{ignore:t.getWatcherIgnoreGlobs()}:void 0;return await w.subscribe(e,async(w,E)=>{if(w){console.error(`[file-watcher]`,w);return}try{await handleRawEvents(E.map(e=>({type:e.type,path:e.path})),e,t,s,g,S)}catch(e){console.error(`[file-watcher] parcel batch error:`,e)}},E)}catch(e){return console.warn(`[file-watcher] @parcel/watcher subscribe failed, falling back to chokidar:`,e),null}}async function startChokidarWatcher(e,t,s,g,S){let{watch:w}=await import(`./chokidar-CxU7f6JW.mjs`);console.warn(`[file-watcher] @parcel/watcher unavailable, using chokidar fallback`);let E=w(e,{ignoreInitial:!0,followSymlinks:!1,ignored:t?(s,g)=>{let S=relative(e,s);return S===``||S===`.`?!1:g?.isDirectory()?t.isDirExcluded(S):t.isExcluded(S)}:void 0});E.on(`error`,e=>console.error(`[file-watcher] chokidar error:`,e));let D=50,O=[],k=null;function j(w,E){O.push({type:w,path:E}),k||=setTimeout(()=>{let w=O;O=[],k=null,handleRawEvents(w,e,t,s,g,S).catch(e=>console.error(`[file-watcher] chokidar batch error:`,e))},50)}return E.on(`add`,e=>j(`create`,e)),E.on(`change`,e=>j(`update`,e)),E.on(`unlink`,e=>j(`delete`,e)),{unsubscribe:()=>(k&&(clearTimeout(k),k=null,O=[]),E.close())}}async function startWatcher(e,t,s){let g;try{g=realpathSync(e)}catch{g=e}let S=new Map,w=new Map;seedLastKnownHashes(g,g,s,S,w);let E=setInterval(evictStaleTrackerEntries,WRITE_TRACKER_TTL_MS),D,O;try{let e=await startParcelWatcher(g,s,S,t,w);e?(D=e,O=`parcel`):(D=await startChokidarWatcher(g,s,S,t,w),O=`chokidar`)}catch(e){throw clearInterval(E),e}let k=D.unsubscribe.bind(D);return console.log(`[file-watcher] Watching ${g} for external .md changes (backend: ${O})`),{async unsubscribe(){return clearInterval(E),writeTracker.clear(),lastKnownHash.clear(),k()},getFileIndex(){return S},getAliasMap(){return w}}}function normalizeBody(e){let{body:t}=stripFrontmatter(e);return normalizeBridge(t).trim()}function isWhitespace(e){return e===` `||e===`
784
+ `)}\n`:``;return E.length>0?{kind:`conflicts`,newContent:k,conflicts:E}:{kind:`merged`,newContent:k,mergedBlocks:w.length}}function computeEditOps(e,t){let s=new Map,g=longestCommonSubsequence(e,t);for(let t=0;t<=e.length;t++)s.set(t,{action:`keep`,insertsBefore:[]});let S=new Set,w=new Set;for(let[e,t]of g)S.add(e),w.add(t);let E=-1;for(let D=0;D<e.length;D++)if(S.has(D)){let e=g.find(e=>e[0]===D)?.[1]??-1,S=[];for(let s=E+1;s<e;s++)w.has(s)||S.push(t[s]);let O=s.get(D);O&&(O.insertsBefore=S),E=e}else{let e=g.find(e=>e[0]>D),S=e?e[1]:t.length,O=[];for(let e=E+1;e<S;e++)w.has(e)||O.push(e);if(O.length>0){let e=O[0];w.add(e);let g=s.get(D);g&&(g.action=`modify`,g.newContent=t[e])}else{let e=s.get(D);e&&(e.action=`delete`)}}let D=[];for(let e=E+1;e<t.length;e++)w.has(e)||D.push(t[e]);let O=s.get(e.length);return O&&(O.insertsBefore=D),s}function longestCommonSubsequence(e,t){let s=e.length,g=t.length,S=g+1,w=new Uint32Array((s+1)*S);for(let E=1;E<=s;E++){let s=E*S,D=(E-1)*S;for(let S=1;S<=g;S++)if(e[E-1]===t[S-1])w[s+S]=w[D+(S-1)]+1;else{let e=w[D+S],t=w[s+(S-1)];w[s+S]=e>t?e:t}}let E=[],D=s,O=g;for(;D>0&&O>0;)e[D-1]===t[O-1]?(E.push([D-1,O-1]),D--,O--):w[(D-1)*S+O]>=w[D*S+(O-1)]?D--:O--;return E.reverse()}function assertNeverDiskEvent(e){throw Error(`[DiskEvent] unhandled variant: ${JSON.stringify(e)}`)}const writeTracker=new Map,WRITE_TRACKER_TTL_MS=1e4;function registerWrite(e,t){let s=writeTracker.get(e)??[];s.push({hash:t,timestamp:Date.now()}),writeTracker.set(e,s)}function evictStaleTrackerEntries(){let e=Date.now();for(let[t,s]of writeTracker){let g=s.filter(t=>e-t.timestamp<=WRITE_TRACKER_TTL_MS);g.length===0?writeTracker.delete(t):g.length!==s.length&&writeTracker.set(t,g)}}function contentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function eventEscapesContentDir(e,t){let s;try{s=lstatSync(e)}catch(t){let s=t.code;return s===`ENOENT`?!1:(console.warn(`[file-watcher] lstat failed for escape check on ${e} (${s}), dropping event`),!0)}if(!s.isSymbolicLink())return!1;let g;try{g=realpathSync(e)}catch(t){let s=t.code;return s!==`ENOENT`&&s!==`ELOOP`&&console.warn(`[file-watcher] realpath failed for escape check on ${e} (${s}), dropping event`),!0}return!isWithinContentDir(g,t)}function pathToDocName(e,t){return stripDocExtension(relative(t,e))}function extractDocExtension(e){let t=extname(e);if(t===``)return null;let s=t.toLowerCase();return s===`.mdx`||s===`.md`?t:null}const lastKnownHash=new Map;function updateLastKnownHash(e,t){lastKnownHash.set(e,t)}function removeLastKnownHash(e){let t=lastKnownHash.get(e);return lastKnownHash.delete(e),t}async function classifyEvents(e,t,s,g){let S=[],w=[],E=[];for(let g of e)if(isSupportedDocFile(g.path)){if(s){let e=relative(t,g.path);if(s.isExcluded(e))continue}switch(g.type){case`delete`:S.push(g);break;case`create`:lastKnownHash.has(g.path)?E.push(g):w.push(g);break;case`update`:E.push(g);break}}let D=new Map,O=new Map;for(let e of w)try{D.set(e.path,await readFile$1(e.path,`utf-8`))}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read ${e.path}:`,t)}for(let e of E)try{O.set(e.path,await readFile$1(e.path,`utf-8`))}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read ${e.path}:`,t)}function k(e){let s=pathToDocName(e,t);if(!g)return s;let S=null;try{S=lstatSync(e)}catch(t){return t.code!==`ENOENT`&&console.warn(`[file-watcher] resolveDocName lstat failed for ${e}:`,t),g.has(s)&&g.delete(s),s}if(!S.isSymbolicLink())return g.has(s)&&g.delete(s),s;let w;try{w=realpathSync(e)}catch(t){let S=t.code;return S!==`ENOENT`&&S!==`ELOOP`&&console.warn(`[file-watcher] resolveDocName realpath failed for ${e}:`,t),g.delete(s),s}if(!isWithinContentDir(w,t))return g.delete(s),s;let E=pathToDocName(w,t);return E===s?s:(g.set(s,E),E)}let j=[],F=new Set,L=new Set;for(let e of S){let t=removeLastKnownHash(e.path);if(t)for(let s of w){if(F.has(s.path))continue;let g=D.get(s.path);if(g===void 0)continue;let S=contentHash(g);if(S===t){F.add(s.path),L.add(e.path),updateLastKnownHash(s.path,S),j.push({kind:`rename`,oldPath:e.path,newPath:s.path,oldDocName:k(e.path),newDocName:k(s.path),content:g});break}}}for(let e of S)L.has(e.path)||(removeLastKnownHash(e.path),j.push({kind:`delete`,path:e.path,docName:k(e.path)}));for(let e of w){if(F.has(e.path))continue;let t=D.get(e.path);if(t===void 0)continue;let s=contentHash(t);updateLastKnownHash(e.path,s),containsConflictMarkers(t)?j.push({kind:`conflict`,path:e.path,docName:k(e.path),content:t}):j.push({kind:`create`,path:e.path,docName:k(e.path),content:t})}for(let e of E){let t=O.get(e.path);if(t===void 0)continue;let s=contentHash(t);updateLastKnownHash(e.path,s),containsConflictMarkers(t)?j.push({kind:`conflict`,path:e.path,docName:k(e.path),content:t}):j.push({kind:`update`,path:e.path,docName:k(e.path),content:t})}return j}function isSelfWrite(e,t){let s=writeTracker.get(e);if(!s)return!1;let g=s.findIndex(e=>e.hash===t);return g<0?!1:(s.splice(g,1),s.length===0&&writeTracker.delete(e),!0)}function seedLastKnownHashes(e,t,s,g,S,w){let E=w??new Set;try{let w=readdirSync(e,{withFileTypes:!0});for(let D of w){let w=join(e,D.name),O;try{O=lstatSync(w)}catch(e){e.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to lstat ${w}, skipping:`,e);continue}if(O.isSymbolicLink()){let e;try{e=realpathSync(w)}catch(e){let t=e.code;t===`ENOENT`||t===`ELOOP`?console.warn(`[file-watcher] Broken/cyclic symlink at ${w}, skipping`):console.warn(`[file-watcher] Failed to resolve symlink ${w}:`,e);continue}if(!isWithinContentDir(e,t)){console.warn(`[file-watcher] Symlink escape: ${w} → ${e}, skipping`);continue}try{let O=statSync(e);if(E.has(O.ino)){if(O.isFile()&&isSupportedDocFile(D.name)){let s=pathToDocName(w,t),E=pathToDocName(e,t);S.set(s,E);let D=g.get(E);D&&!D.aliases.includes(s)&&D.aliases.push(s)}continue}if(E.add(O.ino),O.isDirectory()){if(s){let g=relative(t,e);if(s.isDirExcluded(g))continue}seedLastKnownHashes(e,t,s,g,S,E)}else if(O.isFile()&&isSupportedDocFile(D.name)){if(s){let g=relative(t,e);if(s.isExcluded(g))continue}let E=pathToDocName(w,t),D=pathToDocName(e,t);S.set(E,D);try{let t=contentHash(readFileSync(e,`utf-8`));lastKnownHash.set(e,t);let s=extractDocExtension(e);if(s){let e=registerDocExtension(D,s);if(e.shadowed&&(console.warn(`[file-watcher] docName "${D}" has both "${e.effective}" and "${e.shadowed}" on disk; "${e.effective}" wins (industry convention). Rename or delete one to disambiguate.`),!e.changed))continue}g.set(D,{size:O.size,modified:O.mtime.toISOString(),canonicalPath:e,inode:O.ino,aliases:[E]})}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to seed hash for ${e}:`,t)}}}catch(t){console.warn(`[file-watcher] Failed to stat symlink target ${e}:`,t)}}else if(O.isDirectory()){if(s){let e=relative(t,w);if(s.isDirExcluded(e))continue}seedLastKnownHashes(w,t,s,g,S,E)}else if(O.isFile()&&isSupportedDocFile(D.name)){if(E.has(O.ino))continue;if(E.add(O.ino),s){let e=relative(t,w);if(s.isExcluded(e))continue}try{let e=readFileSync(w,`utf-8`);lastKnownHash.set(w,contentHash(e));let s=pathToDocName(w,t),S=extractDocExtension(w);if(S){let e=registerDocExtension(s,S);if(e.shadowed&&(console.warn(`[file-watcher] docName "${s}" has both "${e.effective}" and "${e.shadowed}" on disk; "${e.effective}" wins (industry convention). Rename or delete one to disambiguate.`),!e.changed))continue}g.set(s,{size:O.size,modified:O.mtime.toISOString(),canonicalPath:w,inode:O.ino,aliases:[]})}catch(e){let t=e.code;t===`EACCES`?console.warn(`[file-watcher] Permission denied reading ${w}, file excluded from index`):t!==`ENOENT`&&console.warn(`[file-watcher] Failed to seed hash for ${w}:`,e)}}}}catch(t){t.code!==`ENOENT`&&console.warn(`[file-watcher] Failed to read directory ${e}:`,t)}}function updateFileIndex(e,t){if(e.kind===`asset-create`||e.kind===`asset-delete`)return;let s=e.kind===`rename`?e.newDocName:e.docName;if(!(isSystemDoc(s)||isConfigDoc(s)))switch(e.kind){case`create`:case`update`:case`conflict`:{let s=e.docName,g=t.get(s),S=extractDocExtension(e.path);S&&registerDocExtension(s,S),t.set(s,{size:Buffer.byteLength(e.content,`utf-8`),modified:new Date().toISOString(),canonicalPath:g?.canonicalPath??e.path,inode:g?.inode??0,aliases:g?.aliases??[]});break}case`delete`:if(t.has(e.docName))t.delete(e.docName),forgetDocExtension(e.docName);else for(let[,s]of t){let t=s.aliases.indexOf(e.docName);if(t!==-1){s.aliases.splice(t,1);break}}break;case`rename`:{let s=t.get(e.oldDocName);t.delete(e.oldDocName),forgetDocExtension(e.oldDocName);let g=extractDocExtension(e.newPath);g&&registerDocExtension(e.newDocName,g),t.set(e.newDocName,{size:Buffer.byteLength(e.content,`utf-8`),modified:new Date().toISOString(),canonicalPath:s?.canonicalPath??e.newPath,inode:s?.inode??0,aliases:s?.aliases??[]});break}}}async function handleRawEvents(e,t,s,g,S,w){let E=e.filter(e=>eventEscapesContentDir(e.path,t)?(console.warn(`[file-watcher] Symlink escape: ${e.path}, dropping ${e.type} event`),!1):!0),D=E.filter(e=>isSupportedDocFile(e.path)),O=E.filter(e=>isSupportedAssetFile(e.path,ASSET_EXTENSIONS));if(D.length===0&&O.length===0)return;let k=D.length>0?await classifyEvents(D,t,s,w):[];for(let e of k){let t=!1;if(e.kind!==`delete`&&e.kind!==`rename`){let s=contentHash(e.content),g=e.path;try{g=realpathSync(e.path)}catch(t){let s=t.code;s!==`ENOENT`&&console.warn(`[file-watcher] realpathSync failed for self-write check on ${e.path} (${s})`)}t=isSelfWrite(g,s)}else if(e.kind===`rename`){let s=contentHash(e.content),g=e.newPath;try{g=realpathSync(e.newPath)}catch(t){let s=t.code;s!==`ENOENT`&&console.warn(`[file-watcher] realpathSync failed for self-write check on ${e.newPath} (${s})`)}t=isSelfWrite(g,s)}if(updateFileIndex(e,g),s&&!t)switch(e.kind){case`create`:s.incrementMdDir(dirname(e.docName));break;case`delete`:s.decrementMdDir(dirname(e.docName));break;case`rename`:s.decrementMdDir(dirname(e.oldDocName)),s.incrementMdDir(dirname(e.newDocName));break}if(t){getLogger(`file-watcher`).debug({kind:e.kind,path:e.kind===`rename`?e.newPath:e.path,self:!0},`[file-watcher] Skipped self-write: ${e.kind}`),_fileWatcherEventsCounter().add(1,{"disk.kind":e.kind,self:!0});continue}getLogger(`file-watcher`).debug({kind:e.kind,path:e.kind===`rename`?e.newPath:e.path},`[file-watcher] Dispatching: ${e.kind}`),_fileWatcherEventsCounter().add(1,{"disk.kind":e.kind,self:!1});let w=e.kind===`rename`?e.newPath:e.path;await withSpan(`file_watcher.process_event`,{attributes:{"disk.kind":e.kind,"disk.path":normalizeFsPath(w),"disk.path.role":classifyFsPath(w)}},async()=>S(e))}for(let e of O){if(s){let g=relative(t,e.path);if(s.isExcluded(g))continue}let g=relative(t,e.path);await S(e.type===`delete`?{kind:`asset-delete`,path:e.path,relativePath:g}:{kind:`asset-create`,path:e.path,relativePath:g})}}let _fwEventsCounterCache=null;function _fileWatcherEventsCounter(){return _fwEventsCounterCache||=getMeter().createCounter(`ok.file_watcher.events`,{description:`Number of file-watcher events classified by kind`}),_fwEventsCounterCache}async function startParcelWatcher(e,t,s,g,S){let w;try{w=await import(`@parcel/watcher`)}catch(e){return console.warn(`[file-watcher] @parcel/watcher import failed:`,e instanceof Error?e.message:e),null}try{let E=t?{ignore:t.getWatcherIgnoreGlobs()}:void 0;return await w.subscribe(e,async(w,E)=>{if(w){console.error(`[file-watcher]`,w);return}try{await handleRawEvents(E.map(e=>({type:e.type,path:e.path})),e,t,s,g,S)}catch(e){console.error(`[file-watcher] parcel batch error:`,e)}},E)}catch(e){return console.warn(`[file-watcher] @parcel/watcher subscribe failed, falling back to chokidar:`,e),null}}async function startChokidarWatcher(e,t,s,g,S){let{watch:w}=await import(`./chokidar-CxU7f6JW.mjs`);console.warn(`[file-watcher] @parcel/watcher unavailable, using chokidar fallback`);let E=w(e,{ignoreInitial:!0,followSymlinks:!1,ignored:t?(s,g)=>{let S=relative(e,s);return S===``||S===`.`?!1:g?.isDirectory()?t.isDirExcluded(S):t.isExcluded(S)}:void 0});E.on(`error`,e=>console.error(`[file-watcher] chokidar error:`,e));let D=50,O=[],k=null;function j(w,E){O.push({type:w,path:E}),k||=setTimeout(()=>{let w=O;O=[],k=null,handleRawEvents(w,e,t,s,g,S).catch(e=>console.error(`[file-watcher] chokidar batch error:`,e))},50)}return E.on(`add`,e=>j(`create`,e)),E.on(`change`,e=>j(`update`,e)),E.on(`unlink`,e=>j(`delete`,e)),{unsubscribe:()=>(k&&(clearTimeout(k),k=null,O=[]),E.close())}}async function startWatcher(e,t,s){let g;try{g=realpathSync(e)}catch{g=e}let S=new Map,w=new Map;seedLastKnownHashes(g,g,s,S,w);let E=setInterval(evictStaleTrackerEntries,WRITE_TRACKER_TTL_MS),D,O;try{let e=await startParcelWatcher(g,s,S,t,w);e?(D=e,O=`parcel`):(D=await startChokidarWatcher(g,s,S,t,w),O=`chokidar`)}catch(e){throw clearInterval(E),e}let k=D.unsubscribe.bind(D);return console.log(`[file-watcher] Watching ${g} for external .md changes (backend: ${O})`),{async unsubscribe(){return clearInterval(E),writeTracker.clear(),lastKnownHash.clear(),k()},getFileIndex(){return S},getAliasMap(){return w},pruneFileIndexNowExcluded(){if(!s)return 0;let e=0;for(let[t,w]of S){let E=relative(g,w.canonicalPath);s.isExcluded(E)&&(S.delete(t),e++)}return e}}}function normalizeBody(e){let{body:t}=stripFrontmatter(e);return normalizeBridge(t).trim()}function isWhitespace(e){return e===` `||e===`
784
785
  `||e===` `||e===`\r`}function classifyDuplication(e,t){let s=normalizeBody(t);if(s.length===0)return{kind:`allow`,reason:`empty-base`};let g=normalizeBody(e);if(g===s)return{kind:`allow`,reason:`identical`};if(g.length<s.length*2)return{kind:`allow`,reason:`too-short`};let S=0,w=0;for(;S<g.length;){if(g.slice(S,S+s.length)!==s)return{kind:`allow`,reason:`not-integer-multiple`};for(S+=s.length,w++;S<g.length&&isWhitespace(g[S]??``);)S++}return w>=2?{kind:`block`,reason:`structural-duplication`,copies:w}:{kind:`allow`,reason:`single-copy`}}const OBSERVER_SYNC_ORIGIN={source:`local`,skipStoreHooks:!0,context:{origin:`observer-sync`}},isPairedWriteOrigin=e=>typeof e!=`object`||!e?!1:e.context?.paired===!0;function shouldRethrowBridgeMergeLoss(e=process.env){return e.NODE_ENV===`test`||e.OK_RETHROW_BRIDGE_LOSS===`1`}function setupServerObservers(e){let{doc:t,xmlFragment:s,ytext:g,mdManager:S,schema:w}=e,E=(t,s)=>{let g=process.env.OK_TELEMETRY_VERBOSE===`1`;console.warn(JSON.stringify({...t.toLog({verbose:g}),docName:e.docName??null,timestamp:new Date().toISOString()})),incrementBridgeMergeContentLoss();let S=e.shadow?.();if(!S||!e.docName)return;let w=e.getBranch?.()??`main`,E=e.contentRoot??``;queueMicrotask(()=>{saveInMemoryCheckpoint(S,E,{kind:`bridge-merge-loss`,docName:e.docName,contents:s,label:`Before concurrent merge @ ${new Date().toISOString()}`,branch:w,metadata:{lostSubstrings:t.info.lostSubstrings}}).then(t=>{incrementBridgeMergeCheckpointCreated(),console.warn(JSON.stringify({event:`bridge-merge-checkpoint-created`,docName:e.docName,sha:t,kind:`bridge-merge-loss`,timestamp:new Date().toISOString()}))}).catch(e=>{let t=e instanceof Error?e:Error(String(e));console.warn(`[Server Observer A] Silent checkpoint write failed:`,{name:t.name,message:t.message,stack:t.stack?.split(`
785
786
  `).slice(0,4).join(`
786
- `)})})})},D=``,O=!1,k=!1,j=()=>stripFrontmatter(g.toString()).frontmatter;try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),t=S.serialize(e);D=prependFrontmatter(j(),t)}catch(e){incrementServerObserverError(`a`),console.warn(`[Server Observer A] Baseline init failed — starting from empty snapshot:`,e instanceof Error?e.message:String(e)),D=``}let F=()=>{try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),O=S.serialize(e),k=prependFrontmatter(j(),O);if(D===k)return;let F=g.toString();if(normalizeBridge(F)===normalizeBridge(k)){D=k;return}let L=D,B={mergedText:null};t.transact(()=>{if(F===D)applyIncrementalDiff(g,F,k);else try{let e=mergeThreeWay(D,k,F);applyFastDiff(g,F,e),B.mergedText=e}catch(e){if(!(e instanceof BridgeMergeContentLossError)||(E(e,L),shouldRethrowBridgeMergeLoss()))throw e;applyFastDiff(g,F,e.info.result),B.mergedText=e.info.result}},OBSERVER_SYNC_ORIGIN),B.mergedText!==null&&(incrementObserverAPathBFires(),console.warn(JSON.stringify({event:`observer-a-path-b-fired`,xmlFragmentAdvanced:!0,ytextDiverged:!0,mergeBytesChanged:Math.abs(B.mergedText.length-F.length)}))),incrementServerObserverFire(`a`),D=g.toString()}catch(e){incrementServerObserverError(`a`),console.error(`[Server Observer A] Failed to sync tree→text:`,e);try{D=g.toString()}catch(e){console.warn(`[Server Observer A] Baseline recovery also failed:`,e)}}},L=(e,t)=>{if(t.origin!==OBSERVER_SYNC_ORIGIN){if(isPairedWriteOrigin(t.origin)){try{let e=j();D=g.toString(),B=e}catch(e){incrementServerObserverError(`a`),console.warn(`[Server Observer A] Paired-write baseline refresh failed — falling through to settlement:`,e instanceof Error?e.message:String(e)),O=!0}return}O=!0}};if(s.length>0&&g.length===0)try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),E=S.serialize(e),O=prependFrontmatter(j(),E);t.transact(()=>{g.insert(0,O)},OBSERVER_SYNC_ORIGIN),D=O}catch(e){incrementServerObserverError(`a`),console.error(`[Server Observer A] Failed initial sync:`,e),D=``}let B=j(),H=()=>{try{let w=g.toString(),{frontmatter:E,body:O}=stripFrontmatter(w);if(normalizeBridge(D)===normalizeBridge(w)){B!==E&&(recordFrontmatterEditSurface(`source-mode`),B=E);return}let k=e.resolveEmbed&&e.docName?{resolveEmbed:e.resolveEmbed,sourcePath:e.docName}:void 0,j=S.parseWithFallback(O,k),F=e.schema.nodeFromJSON(j);t.transact(()=>{updateYFragment(t,s,F,{mapping:new Map,isOMark:new Map})},OBSERVER_SYNC_ORIGIN),B!==E&&(recordFrontmatterEditSurface(`source-mode`),B=E),incrementServerObserverFire(`b`);try{let t=prependFrontmatter(E,S.serialize(j));assertBridgeInvariant(g.toString(),t,{site:`observer-b`,docName:e.docName}),D=t}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;console.warn(`[Server Observer B] Post-sync re-serialization failed — using input body as baseline:`,e),D=prependFrontmatter(E,O)}}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;incrementServerObserverError(`b`),console.error(`[Server Observer B] Failed to sync text→tree:`,e);try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),t=S.serialize(e);D=prependFrontmatter(j(),t)}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;console.warn(`[Server Observer B] Baseline recovery also failed:`,e)}}},q=(e,t)=>{if(t.origin!==OBSERVER_SYNC_ORIGIN){if(isPairedWriteOrigin(t.origin)){try{let e=j();D=g.toString(),B=e}catch(e){incrementServerObserverError(`b`),console.warn(`[Server Observer B] Paired-write baseline refresh failed — falling through to settlement:`,e instanceof Error?e.message:String(e)),k=!0}return}k=!0}},J=(t,s)=>{if(!O&&!k){e.onDispatch?.(`none`);return}if(s.every(e=>e.origin===OBSERVER_SYNC_ORIGIN)){O=!1,k=!1,e.onDispatch?.(`none`);return}O&&(O=!1,e.onDispatch?.(`a`),F()),k&&(k=!1,e.onDispatch?.(`b`),H())};s.observeDeep(L),g.observe(q),t.on(`afterAllTransactions`,J);let Y=attachQuiescenceTracker(t);return()=>{Y(),t.off(`afterAllTransactions`,J),s.unobserveDeep(L),g.unobserve(q)}}const log$5=getLogger(`persistence`);function resolveWriterFromOrigin(e,t){if(!e||typeof e!=`object`)return null;let s=e;if(s.source===`local`){let e=s.context;if(!e)return null;if(typeof e.session_id==`string`){let t=e.session_id;return{id:`agent-${t}`,name:`Agent (${t.slice(0,8)})`,email:`agent-${t}@openknowledge.local`}}return e.origin===`file-watcher`?FILE_SYSTEM_WRITER:e.origin===`upstream-import`||e.origin===`git-upstream`?GIT_UPSTREAM_WRITER:SERVICE_WRITER}if(s.source===`connection`){let e=s.connection?.context;if(typeof e?.principalId==`string`){let s=e.principalId,g=t?.();return g&&g.id===s&&g.display_name&&g.display_email?{id:g.id,name:g.display_name,email:g.display_email}:{id:s,name:`Local User`,email:`${s}@openknowledge.local`}}return SERVICE_WRITER}return null}function captureDocSnapshotForPersistence(e){return{sv:encodeStateVector(e),json:yXmlFragmentToProseMirrorRootNode(e.getXmlFragment(`default`),schema).toJSON()}}function safeContentPath(e,t){if(e.includes(`\0`))throw Error(`Invalid document name: ${e}`);let s=resolve(t,`${e}${getDocExtension(e)}`);if(!s.startsWith(`${t}/`))throw Error(`Invalid document name: ${e}`);return s}function isWithinContentDir(e,t){return e===t||e.startsWith(t+sep)}const reconciledBaseByBranch=new Map;let activeBranch=`main`;function switchReconciledBaseScope(e){activeBranch=e,reconciledBaseByBranch.has(e)||reconciledBaseByBranch.set(e,new Map)}function getActiveBranch(){return activeBranch}function getReconciledBase(e){return reconciledBaseByBranch.get(activeBranch)?.get(e)}function setReconciledBase(e,t){reconciledBaseByBranch.has(activeBranch)||reconciledBaseByBranch.set(activeBranch,new Map),reconciledBaseByBranch.get(activeBranch)?.set(e,t)}function deleteReconciledBase(e){reconciledBaseByBranch.get(activeBranch)?.delete(e)}let batchInProgress=!1;function setBatchInProgress(e){batchInProgress=e}function isBatchInProgress(){return batchInProgress}function createPersistenceExtension(e){let t=e?.contentDir??process.cwd(),s;try{s=realpathSync(t)}catch{s=t}let g=e?.projectDir??process.cwd(),S=e?.shadowRef,w=e?.contentRoot??(relative(g,s)||`.`),E=e?.backlinkIndex,D=e?.getPrincipal,O=e?.onAgentCommit,k=e?.onDiskFlush,j={projectDir:g,lkgCache:new Map,homedirOverride:e?.configHomedirOverride,onConfigRejected:e?.onConfigRejected},F=new Set,L=e?.applyDiskContentToDoc??applyDiskContentToDoc,B=null,H=8,q=new Map,J=e?.gitEnabled??!0,Y=e?.commitDebounceMs??15e3,ee=e?.wipRef??`refs/wip/main`,te=e?.getCurrentBranch,ne=null,ae=0,oe=null,se=!1,ce=null,ue=new Map;async function de(){Te();let e=Date.now();return withSpan(`persistence.commitToWipRef`,void 0,async()=>await fe()).finally(()=>{we?.record((Date.now()-e)/1e3)})}async function fe(){let e=S?.current;if(e){let t=swapContributors(),s=te?.()??`main`;if(t.size===0){let t={v:1,writer_id:SERVICE_WRITER.id,principal:null,agent_session:null,agent_type:null,client_name:null,client_version:null,label:null,display_name:SERVICE_WRITER.name,color_seed:SERVICE_WRITER.id,docs:[]},g=`${formatWipSubject([])}\n\n${formatOkActor(t)}`;try{let t=await commitWip(e,SERVICE_WRITER,w,g,s);ae=0,log$5.info({sha:t.slice(0,8),writer:SERVICE_WRITER.id},`[persistence] Shadow WIP commit: ${t.slice(0,8)} on refs/wip/${SERVICE_WRITER.id}`)}catch(e){ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Shadow commit failed (attempt ${ae})`),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`)}return}let g;try{g=await buildWipTree(e,w)}catch(e){restoreContributors(t),ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Shadow WIP tree build failed (attempt ${ae})`);return}let S=!1;for(let[w,E]of t){let t={id:w,name:E.displayName,email:`${w}@openknowledge.local`},D=[...E.docs],k=E.actor,j=[...E.summaries],F={v:1,writer_id:w,principal:k?.principalId??null,agent_session:w.startsWith(`agent-`)?w.slice(6):null,agent_type:k?.agentType??null,client_name:k?.clientName??null,client_version:k?.clientVersion??null,label:k?.label??null,display_name:E.displayName,color_seed:E.colorSeed,docs:D,...j.length>0?{summaries:j}:{}},L=`${composeCommitSubject(E.subjectOverride??formatWipSubject(D),j)}\n\n${formatOkActor(F)}`;try{let E=await commitWipFromTree(e,t,g,L,s);S=!0,log$5.info({sha:E.slice(0,8),writer:w,tree:g.slice(0,8)},`[persistence] Shadow WIP commit: ${E.slice(0,8)} on refs/wip/${w}`),w.startsWith(`agent-`)&&O?.()}catch(e){restoreContributorEntry(w,E),incrementGitWriterCommitFailure(),log$5.error({err:e,writer:w},`[persistence] Per-writer shadow commit failed for ${w}`)}}S?ae=0:(ae++,incrementGitAutoSaveFailure(),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`));return}let t=shadowGit({gitDir:resolve(g,`.git`),workTree:g}),s=resolve(g,`.git/index-wip`),E={GIT_INDEX_FILE:s};try{try{let e=(await t.raw(`rev-parse`,`HEAD^{tree}`)).trim();await t.env(E).raw(`read-tree`,e)}catch(e){let t=e instanceof Error?e.message:String(e);t.includes(`unknown revision`)||t.includes(`bad revision`)?log$5.info({},`[persistence] Empty repo — starting with empty index`):log$5.error({err:e},`[persistence] Failed to read HEAD tree, falling back to empty index`)}await t.env(E).raw(`add`,w);let e=(await t.env(E).raw(`write-tree`)).trim(),s=null;try{s=(await t.raw(`rev-parse`,ee)).trim()}catch(e){let t=e instanceof Error?e.message:String(e);if(!t.includes(`unknown revision`)&&!t.includes(`bad revision`))throw e}let g=[`commit-tree`,e,`-m`,`WIP auto-save ${new Date().toISOString()}`];s&&g.push(`-p`,s);let S=(await t.raw(...g)).trim();await t.raw(`update-ref`,ee,S),ae=0,log$5.info({sha:S.slice(0,8),wipRef:ee},`[persistence] Git commit: ${S.slice(0,8)} on ${ee}`)}catch(e){ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Git commit failed (attempt ${ae})`),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`)}finally{try{tracedUnlinkSync(s)}catch{}}}function me(e){if(e<=0)return Y;let t=2**Math.min(e,5),s=Math.random()*.25*Y;return Y*t+s}function ge(){J&&(isBatchInProgress()||(ne&&clearTimeout(ne),ne=setTimeout(()=>{if(ne=null,oe){se=!0;return}oe=de().finally(()=>{oe=null,se&&(se=!1,ge())})},me(ae))))}async function _e(){ne&&(clearTimeout(ne),ne=null,oe||=de().finally(()=>{oe=null,se&&(se=!1,ge())})),oe&&await oe}function ve(t,s,g){try{let S=t.getXmlFragment(`default`),w=e?.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:g}:void 0,E=mdManager.parseWithFallback(s,w),D=schema.nodeFromJSON(E);t.transact(()=>{updateYFragment(t,S,D,{mapping:new Map,isOMark:new Map})},OBSERVER_SYNC_ORIGIN)}catch(e){incrementPersistenceReconciliationFailures(),log$5.warn({err:e,documentName:g},`[persistence] reconcileFragmentNow failed for ${g}`)}}let ye=null,Ce=null,we=null;function Te(){if(ye)return;let e=getMeter();ye=e.createHistogram(`ok.persistence.load.duration`,{description:`Duration of persistence.onLoadDocument in seconds`,unit:`s`}),Ce=e.createHistogram(`ok.persistence.store.duration`,{description:`Duration of persistence.onStoreDocument in seconds`,unit:`s`}),we=e.createHistogram(`ok.persistence.git_commit.duration`,{description:`Duration of commitToWipRef drain in seconds`,unit:`s`})}async function De({document:e,documentName:t,lastTransactionOrigin:g}){Te();let S=Date.now();return withSpan(`persistence.onStoreDocument`,{attributes:{"doc.name":t}},async()=>{let S=e.getMap(`lifecycle`).get(`status`);if(S===`deleted-upstream`||S===`renamed`){log$5.info({documentName:t,lifecycleStatus:S},`[persistence] Skipped store for ${t}: lifecycle=${S}`),q.delete(t),F.delete(t);return}if(!isDocQuiescent(e)){let s=q.get(t)??0;if(s<8){let g=getMsSinceLastUserTx(e);console.warn(JSON.stringify({event:`persistence-skip-non-quiescent`,"doc.name":t,wallClockMsSinceLastTransaction:g??null,deferCount:s})),incrementPersistenceSkipNonQuiescent(),q.set(t,s+1);return}console.warn(JSON.stringify({event:`persistence-force-flush-during-burst`,"doc.name":t,wallClockMsSinceLastTransaction:getMsSinceLastUserTx(e)??null,deferCount:s})),incrementPersistenceForceFlushDuringBurst()}let{sv:w,json:O}=captureDocSnapshotForPersistence(e),{frontmatter:j,body:B}=stripFrontmatter(e.getText(`source`).toString()),H=prependFrontmatter(j,B),J;try{J=assertBridgeInvariant(H,prependFrontmatter(j,mdManager.serialize(O)),{site:`persistence`,docName:t,suppressDevThrow:!0})}catch(e){incrementPersistenceSanityCheckSerializeFailures(),console.warn(JSON.stringify({event:`persistence-sanity-check-serialize-failed`,"doc.name":t,"error.type":e instanceof Error?e.constructor.name:typeof e,timestamp:new Date().toISOString()})),log$5.warn({err:e,documentName:t},`[persistence] Sanity-check serialize failed for ${t}; proceeding with ytext bytes`),J=!1}J||ve(e,B,t);let Y=getReconciledBase(t);if(Y!==void 0&&normalizeBridge(H)===normalizeBridge(Y)){contributorCount()>0&&ge(),q.delete(t);return}if(Y===void 0&&normalizeBridge(H)===``){log$5.warn({documentName:t},`[persistence] Skipped phantom write for ${t}: empty Y.Doc with no reconciled base`),q.delete(t);return}let ee=resolveWriterFromOrigin(g,D);if(ee&&ee.id!==SERVICE_WRITER.id&&(hasContributor(ee.id)||recordContributor(t,ee.id,ee.name,ee.id)),Y!==void 0){let g=classifyDuplication(H,Y);if(g.kind===`block`){if(F.has(t)){log$5.warn({documentName:t},`[persistence] Tripwire breaker active — skipping duplicate store for ${t}`);return}let S=e.getXmlFragment(`default`).length;console.warn(JSON.stringify({event:`ok-persistence-duplication-blocked`,"doc.name":t,candidateBytes:H.length,baseBytes:Y.length,fragmentChildren:S,copies:g.copies,reason:g.reason}));try{let g=safeContentPath(t,s),S=existsSync(g)?readFileSync(g,`utf-8`):Y;e.transact(()=>{L(e,S)},FILE_WATCHER_ORIGIN),F.delete(t)}catch(e){F.add(t),log$5.error({err:e,documentName:t},`[persistence] Tripwire reset failed for ${t}`)}q.delete(t);return}}let te=safeContentPath(t,s);await tracedMkdir(dirname(te),{recursive:!0});let ne;try{ne=await realpath(te)}catch(e){let s=e.code;if(s===`ENOENT`){let e=!1;try{e=lstatSync(te).isSymbolicLink()}catch(e){e.code!==`ENOENT`&&log$5.warn({err:e,path:te},`[persistence] lstat failed during broken-symlink check`)}e&&console.warn(`[persistence] broken-symlink fallback`,{docName:t,reason:`broken-symlink`}),ne=te}else if(s===`ELOOP`)throw console.error(`[persistence] Symlink cycle at ${te}`),Error(`Symlink cycle detected at ${te}`);else throw e}if(!isWithinContentDir(ne,s)){let e=`symlink-escape: ${te} resolves to ${ne} outside ${s}`;throw console.error(`[persistence] ${e}`,{docName:t,originalPath:te,canonical:ne,contentDir:s}),Error(e)}let ae=`${ne}.tmp.${crypto.randomUUID()}`;try{await tracedWriteFile(ae,H,`utf-8`),await tracedRename(ae,ne),registerWrite(ne,contentHash(H)),incrementPersistenceDiskWrite();try{k?.(t,w)}catch(e){log$5.warn({err:e,documentName:t},`[persistence] onDiskFlush callback failed for ${t}`)}}catch(e){try{tracedUnlinkSync(ae)}catch{}throw q.delete(t),log$5.error({err:e,documentName:t},`[persistence] Failed to save ${t}`),e}log$5.info({filePath:ne,bytes:H.length},`[persistence] Wrote ${ne} (${H.length} bytes)`),setReconciledBase(t,H),F.delete(t),q.delete(t),E&&(E.updateDocumentFromMarkdown(t,H),E.saveToDisk().catch(e=>{log$5.warn({err:e,documentName:t},`[backlinks] Failed to persist cache for ${t}`)})),setActiveSpanAttributes({"persistence.bytes":H.length}),ge()}).finally(()=>{Ce?.record((Date.now()-S)/1e3)})}function je({document:e,documentName:t,lastTransactionOrigin:s}){ue.set(t,{branch:getActiveBranch(),document:e,lastTransactionOrigin:s})}async function Me(e=`within-branch`){return ce?(B=B===`discard-stale`||e===`discard-stale`?`discard-stale`:`within-branch`,ce):(ce=(async()=>{let t=e;for(;;){let e=[...ue.entries()];if(ue.clear(),t!==`discard-stale`){for(let[t,s]of e)if(s.branch===getActiveBranch())try{await De({document:s.document,documentName:t,lastTransactionOrigin:s.lastTransactionOrigin})}catch(e){log$5.error({err:e,documentName:t},`[persistence] Deferred store failed for ${t}`)}}let s=B;if(B=null,ue.size===0&&s===null)break;t=s??`within-branch`}})().finally(()=>{ce=null}),ce)}let Pe={async onLoadDocument({document:t,documentName:g,context:S}){if(isSystemDoc(g))return;if(isConfigDoc(g)){loadConfigDoc(t,g,j);return}Te();let w=Date.now();return withSpan(`persistence.onLoadDocument`,{attributes:{"doc.name":g}},async()=>{log$5.info({documentName:g,connections:t.getConnectionsCount?.()??`?`},`[persistence] onLoadDocument called for ${g} (connections: ${t.getConnectionsCount?.()??`?`})`);let S=safeContentPath(g,s);if(!existsSync(S))return;try{let e=realpathSync(S);if(!isWithinContentDir(e,s)){console.warn(`[persistence] symlink-escape on load: ${S} → ${e}, refusing`);return}}catch(e){if(e.code===`ELOOP`){console.warn(`[persistence] Symlink cycle on load: ${S}, refusing`);return}}let w=readFileSync(S,`utf-8`),E=t.getXmlFragment(`default`);log$5.info({documentName:g,fragmentLength:E.length},`[persistence] onLoadDocument ${g}: fragment.length=${E.length} before update`),E.length===0?(t.transact(()=>{applyDiskContentToDoc(t,w,e?.resolveEmbed,g)},FILE_WATCHER_ORIGIN),log$5.info({filePath:S,children:E.length},`[persistence] Loaded ${S} into Y.Doc (${E.length} children)`),E.observeDeep(()=>{log$5.info({documentName:g,fragmentLength:E.length},`[persistence] MUTATION on ${g}: fragment.length=${E.length}`)})):log$5.info({documentName:g,children:E.length},`[persistence] Skipped load for ${g} — fragment already has ${E.length} children`),setReconciledBase(g,w)}).finally(()=>{ye?.record((Date.now()-w)/1e3)})},async onStoreDocument({document:e,documentName:t,lastTransactionOrigin:s,lastContext:g}){if(!isSystemDoc(t)){if(isConfigDoc(t)){await storeConfigDoc(e,t,s,j);return}if(isBatchInProgress()){je({document:e,documentName:t,lastTransactionOrigin:s});return}return De({document:e,documentName:t,lastTransactionOrigin:s})}}};async function Ie(){oe&&await oe}return{extension:Pe,flushDeferredStores:Me,flushPendingGitCommit:_e,waitForPendingCommits:Ie,configPersistenceCtx:j}}const MARKDOWN_LINK_OR_IMAGE_RE=/!?\[[^\]\n]*(?:\][^[\]\n]*)?\]\((?:<([^>\n]+)>|([^)\s]+))(?:\s+['"][^'"]*['"])?\)/g,WIKI_LINK_OR_EMBED_RE=/!?\[\[([^[\]|#]+?)(?:#[^\]|]+?)?(?:\|[^\]]+?)?\]\]/g,HTML_LINK_ATTR_RE=/<[\w:-]+\b[^>]*?\s+(?:href|src)\s*=\s*(?:"([^"\n]*)"|'([^'\n]*)'|“([^”\n]*)”|([^\s"'=<>`]+))/gi;function isRemoteOrOpaqueHref(e){return e.startsWith(`#`)||e.startsWith(`//`)||e.startsWith(`data:`)||/^[a-z][a-z0-9+.-]*:/i.test(e)}function stripHrefDecorations(e){let t=e.trim().replace(/^<(.+)>$/,`$1`),s=t.indexOf(`#`),g=s>=0?t.slice(0,s):t,S=g.indexOf(`?`);return S>=0?g.slice(0,S):g}function decodeHrefPath(e){let t=stripHrefDecorations(e);try{return decodeURI(t)}catch{return t}}function mediaKindForAssetPath(e){return mediaKindForSidebarAssetExtension(extname(e).slice(1).toLowerCase())}function errnoCode$1(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`?e.code:null}function collectHrefsFromLine(e,t){for(let s of e.matchAll(MARKDOWN_LINK_OR_IMAGE_RE)){let e=s[1]??s[2];e&&t.add(e)}for(let s of e.matchAll(WIKI_LINK_OR_EMBED_RE)){let e=s[1];e&&t.add(e)}for(let s of e.matchAll(HTML_LINK_ATTR_RE)){let e=s[1]??s[2]??s[3]??s[4];e&&t.add(e)}}function stripHtmlComments(e,t){let s=e,g=``;for(;s.length>0;){if(t.inComment){let e=s.indexOf(`-->`);if(e===-1)return g;s=s.slice(e+3),t.inComment=!1;continue}let e=s.indexOf(`<!--`);if(e===-1)return g+s;g+=s.slice(0,e),s=s.slice(e+4),t.inComment=!0}return g}function extractLocalAssetHrefs(e){let t=new Set,s=createCodeFenceTracker(),g={inComment:!1};for(let S of e.replaceAll(`\r
787
+ `)})})})},D=``,O=!1,k=!1,j=()=>stripFrontmatter(g.toString()).frontmatter;try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),t=S.serialize(e);D=prependFrontmatter(j(),t)}catch(e){incrementServerObserverError(`a`),console.warn(`[Server Observer A] Baseline init failed — starting from empty snapshot:`,e instanceof Error?e.message:String(e)),D=``}let F=()=>{try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),O=S.serialize(e),k=prependFrontmatter(j(),O);if(D===k)return;let F=g.toString();if(normalizeBridge(F)===normalizeBridge(k)){D=k;return}let L=D,B={mergedText:null};t.transact(()=>{if(F===D)applyIncrementalDiff(g,F,k);else try{let e=mergeThreeWay(D,k,F);applyFastDiff(g,F,e),B.mergedText=e}catch(e){if(!(e instanceof BridgeMergeContentLossError)||(E(e,L),shouldRethrowBridgeMergeLoss()))throw e;applyFastDiff(g,F,e.info.result),B.mergedText=e.info.result}},OBSERVER_SYNC_ORIGIN),B.mergedText!==null&&(incrementObserverAPathBFires(),console.warn(JSON.stringify({event:`observer-a-path-b-fired`,xmlFragmentAdvanced:!0,ytextDiverged:!0,mergeBytesChanged:Math.abs(B.mergedText.length-F.length)}))),incrementServerObserverFire(`a`),D=g.toString()}catch(e){incrementServerObserverError(`a`),console.error(`[Server Observer A] Failed to sync tree→text:`,e);try{D=g.toString()}catch(e){console.warn(`[Server Observer A] Baseline recovery also failed:`,e)}}},L=(e,t)=>{if(t.origin!==OBSERVER_SYNC_ORIGIN){if(isPairedWriteOrigin(t.origin)){try{let e=j();D=g.toString(),B=e}catch(e){incrementServerObserverError(`a`),console.warn(`[Server Observer A] Paired-write baseline refresh failed — falling through to settlement:`,e instanceof Error?e.message:String(e)),O=!0}return}O=!0}};if(s.length>0&&g.length===0)try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),E=S.serialize(e),O=prependFrontmatter(j(),E);t.transact(()=>{g.insert(0,O)},OBSERVER_SYNC_ORIGIN),D=O}catch(e){incrementServerObserverError(`a`),console.error(`[Server Observer A] Failed initial sync:`,e),D=``}let B=j(),H=()=>{try{let w=g.toString(),{frontmatter:E,body:O}=stripFrontmatter(w);if(normalizeBridge(D)===normalizeBridge(w)){B!==E&&(recordFrontmatterEditSurface(`source-mode`),B=E);return}let k=e.resolveEmbed&&e.docName?{resolveEmbed:e.resolveEmbed,sourcePath:e.docName}:void 0,j=S.parseWithFallback(O,k),F=e.schema.nodeFromJSON(j);t.transact(()=>{updateYFragment(t,s,F,{mapping:new Map,isOMark:new Map})},OBSERVER_SYNC_ORIGIN),B!==E&&(recordFrontmatterEditSurface(`source-mode`),B=E),incrementServerObserverFire(`b`);try{let t=prependFrontmatter(E,S.serialize(j));assertBridgeInvariant(g.toString(),t,{site:`observer-b`,docName:e.docName}),D=t}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;console.warn(`[Server Observer B] Post-sync re-serialization failed — using input body as baseline:`,e),D=prependFrontmatter(E,O)}}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;incrementServerObserverError(`b`),console.error(`[Server Observer B] Failed to sync text→tree:`,e);try{let e=yXmlFragmentToProseMirrorRootNode(s,w).toJSON(),t=S.serialize(e);D=prependFrontmatter(j(),t)}catch(e){if(e instanceof BridgeInvariantViolationError)throw e;console.warn(`[Server Observer B] Baseline recovery also failed:`,e)}}},q=(e,t)=>{if(t.origin!==OBSERVER_SYNC_ORIGIN){if(isPairedWriteOrigin(t.origin)){try{let e=j();D=g.toString(),B=e}catch(e){incrementServerObserverError(`b`),console.warn(`[Server Observer B] Paired-write baseline refresh failed — falling through to settlement:`,e instanceof Error?e.message:String(e)),k=!0}return}k=!0}},J=(t,s)=>{if(!O&&!k){e.onDispatch?.(`none`);return}if(s.every(e=>e.origin===OBSERVER_SYNC_ORIGIN)){O=!1,k=!1,e.onDispatch?.(`none`);return}O&&(O=!1,e.onDispatch?.(`a`),F()),k&&(k=!1,e.onDispatch?.(`b`),H())};s.observeDeep(L),g.observe(q),t.on(`afterAllTransactions`,J);let Y=attachQuiescenceTracker(t);return()=>{Y(),t.off(`afterAllTransactions`,J),s.unobserveDeep(L),g.unobserve(q)}}const log$5=getLogger(`persistence`);function resolveWriterFromOrigin(e,t){if(!e||typeof e!=`object`)return null;let s=e;if(s.source===`local`){let e=s.context;if(!e)return null;if(typeof e.session_id==`string`){let t=e.session_id;return{id:`agent-${t}`,name:`Agent (${t.slice(0,8)})`,email:`agent-${t}@openknowledge.local`}}return e.origin===`file-watcher`?FILE_SYSTEM_WRITER:e.origin===`upstream-import`||e.origin===`git-upstream`?GIT_UPSTREAM_WRITER:SERVICE_WRITER}if(s.source===`connection`){let e=s.connection?.context;if(typeof e?.principalId==`string`){let s=e.principalId,g=t?.();return g&&g.id===s&&g.display_name&&g.display_email?{id:g.id,name:g.display_name,email:g.display_email}:{id:s,name:`Local User`,email:`${s}@openknowledge.local`}}return SERVICE_WRITER}return null}function captureDocSnapshotForPersistence(e){return{sv:encodeStateVector(e),json:yXmlFragmentToProseMirrorRootNode(e.getXmlFragment(`default`),schema).toJSON()}}function safeContentPath(e,t){if(e.includes(`\0`))throw Error(`Invalid document name: ${e}`);let s=resolve(t,`${e}${getDocExtension(e)}`);if(!s.startsWith(`${t}/`))throw Error(`Invalid document name: ${e}`);return s}function isWithinContentDir(e,t){return e===t||e.startsWith(t+sep)}const reconciledBaseByBranch=new Map;let activeBranch=`main`;function switchReconciledBaseScope(e){activeBranch=e,reconciledBaseByBranch.has(e)||reconciledBaseByBranch.set(e,new Map)}function getActiveBranch(){return activeBranch}function getReconciledBase(e){return reconciledBaseByBranch.get(activeBranch)?.get(e)}function setReconciledBase(e,t){reconciledBaseByBranch.has(activeBranch)||reconciledBaseByBranch.set(activeBranch,new Map),reconciledBaseByBranch.get(activeBranch)?.set(e,t)}function deleteReconciledBase(e){reconciledBaseByBranch.get(activeBranch)?.delete(e)}let batchInProgress=!1;function setBatchInProgress(e){batchInProgress=e}function isBatchInProgress(){return batchInProgress}function createPersistenceExtension(e){let t=e?.contentDir??process.cwd(),s;try{s=realpathSync(t)}catch{s=t}let g=e?.projectDir??process.cwd(),S=e?.shadowRef,w=e?.contentRoot??(relative(g,s)||`.`),E=e?.backlinkIndex,D=e?.getPrincipal,O=e?.onAgentCommit,k=e?.onDiskFlush,j={projectDir:g,contentDir:s,lkgCache:new Map,homedirOverride:e?.configHomedirOverride,onConfigRejected:e?.onConfigRejected},F=new Set,L=e?.applyDiskContentToDoc??applyDiskContentToDoc,B=null,H=8,q=new Map,J=e?.gitEnabled??!0,Y=e?.commitDebounceMs??15e3,ee=e?.wipRef??`refs/wip/main`,te=e?.getCurrentBranch,ne=null,ae=0,oe=null,se=!1,ce=null,ue=new Map;async function de(){Te();let e=Date.now();return withSpan(`persistence.commitToWipRef`,void 0,async()=>await fe()).finally(()=>{we?.record((Date.now()-e)/1e3)})}async function fe(){let e=S?.current;if(e){let t=swapContributors(),s=te?.()??`main`;if(t.size===0){let t={v:1,writer_id:SERVICE_WRITER.id,principal:null,agent_session:null,agent_type:null,client_name:null,client_version:null,label:null,display_name:SERVICE_WRITER.name,color_seed:SERVICE_WRITER.id,docs:[]},g=`${formatWipSubject([])}\n\n${formatOkActor(t)}`;try{let t=await commitWip(e,SERVICE_WRITER,w,g,s);ae=0,log$5.info({sha:t.slice(0,8),writer:SERVICE_WRITER.id},`[persistence] Shadow WIP commit: ${t.slice(0,8)} on refs/wip/${SERVICE_WRITER.id}`)}catch(e){ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Shadow commit failed (attempt ${ae})`),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`)}return}let g;try{g=await buildWipTree(e,w)}catch(e){restoreContributors(t),ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Shadow WIP tree build failed (attempt ${ae})`);return}let S=!1;for(let[w,E]of t){let t={id:w,name:E.displayName,email:`${w}@openknowledge.local`},D=[...E.docs],k=E.actor,j=[...E.summaries],F={v:1,writer_id:w,principal:k?.principalId??null,agent_session:w.startsWith(`agent-`)?w.slice(6):null,agent_type:k?.agentType??null,client_name:k?.clientName??null,client_version:k?.clientVersion??null,label:k?.label??null,display_name:E.displayName,color_seed:E.colorSeed,docs:D,...j.length>0?{summaries:j}:{}},L=`${composeCommitSubject(E.subjectOverride??formatWipSubject(D),j)}\n\n${formatOkActor(F)}`;try{let E=await commitWipFromTree(e,t,g,L,s);S=!0,log$5.info({sha:E.slice(0,8),writer:w,tree:g.slice(0,8)},`[persistence] Shadow WIP commit: ${E.slice(0,8)} on refs/wip/${w}`),w.startsWith(`agent-`)&&O?.()}catch(e){restoreContributorEntry(w,E),incrementGitWriterCommitFailure(),log$5.error({err:e,writer:w},`[persistence] Per-writer shadow commit failed for ${w}`)}}S?ae=0:(ae++,incrementGitAutoSaveFailure(),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`));return}let t=shadowGit({gitDir:resolve(g,`.git`),workTree:g}),s=resolve(g,`.git/index-wip`),E={GIT_INDEX_FILE:s};try{try{let e=(await t.raw(`rev-parse`,`HEAD^{tree}`)).trim();await t.env(E).raw(`read-tree`,e)}catch(e){let t=e instanceof Error?e.message:String(e);t.includes(`unknown revision`)||t.includes(`bad revision`)?log$5.info({},`[persistence] Empty repo — starting with empty index`):log$5.error({err:e},`[persistence] Failed to read HEAD tree, falling back to empty index`)}await t.env(E).raw(`add`,w);let e=(await t.env(E).raw(`write-tree`)).trim(),s=null;try{s=(await t.raw(`rev-parse`,ee)).trim()}catch(e){let t=e instanceof Error?e.message:String(e);if(!t.includes(`unknown revision`)&&!t.includes(`bad revision`))throw e}let g=[`commit-tree`,e,`-m`,`WIP auto-save ${new Date().toISOString()}`];s&&g.push(`-p`,s);let S=(await t.raw(...g)).trim();await t.raw(`update-ref`,ee,S),ae=0,log$5.info({sha:S.slice(0,8),wipRef:ee},`[persistence] Git commit: ${S.slice(0,8)} on ${ee}`)}catch(e){ae++,incrementGitAutoSaveFailure(),log$5.error({err:e,attempt:ae},`[persistence] Git commit failed (attempt ${ae})`),ae>=3&&log$5.error({attempt:ae},`[persistence] CRITICAL: Git auto-save has failed 3+ times. Version history is NOT being recorded.`)}finally{try{tracedUnlinkSync(s)}catch{}}}function me(e){if(e<=0)return Y;let t=2**Math.min(e,5),s=Math.random()*.25*Y;return Y*t+s}function ge(){J&&(isBatchInProgress()||(ne&&clearTimeout(ne),ne=setTimeout(()=>{if(ne=null,oe){se=!0;return}oe=de().finally(()=>{oe=null,se&&(se=!1,ge())})},me(ae))))}async function _e(){ne&&(clearTimeout(ne),ne=null,oe||=de().finally(()=>{oe=null,se&&(se=!1,ge())})),oe&&await oe}function ve(t,s,g){try{let S=t.getXmlFragment(`default`),w=e?.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:g}:void 0,E=mdManager.parseWithFallback(s,w),D=schema.nodeFromJSON(E);t.transact(()=>{updateYFragment(t,S,D,{mapping:new Map,isOMark:new Map})},OBSERVER_SYNC_ORIGIN)}catch(e){incrementPersistenceReconciliationFailures(),log$5.warn({err:e,documentName:g},`[persistence] reconcileFragmentNow failed for ${g}`)}}let ye=null,Ce=null,we=null;function Te(){if(ye)return;let e=getMeter();ye=e.createHistogram(`ok.persistence.load.duration`,{description:`Duration of persistence.onLoadDocument in seconds`,unit:`s`}),Ce=e.createHistogram(`ok.persistence.store.duration`,{description:`Duration of persistence.onStoreDocument in seconds`,unit:`s`}),we=e.createHistogram(`ok.persistence.git_commit.duration`,{description:`Duration of commitToWipRef drain in seconds`,unit:`s`})}async function De({document:e,documentName:t,lastTransactionOrigin:g}){Te();let S=Date.now();return withSpan(`persistence.onStoreDocument`,{attributes:{"doc.name":t}},async()=>{let S=e.getMap(`lifecycle`).get(`status`);if(S===`deleted-upstream`||S===`renamed`){log$5.info({documentName:t,lifecycleStatus:S},`[persistence] Skipped store for ${t}: lifecycle=${S}`),q.delete(t),F.delete(t);return}if(!isDocQuiescent(e)){let s=q.get(t)??0;if(s<8){let g=getMsSinceLastUserTx(e);console.warn(JSON.stringify({event:`persistence-skip-non-quiescent`,"doc.name":t,wallClockMsSinceLastTransaction:g??null,deferCount:s})),incrementPersistenceSkipNonQuiescent(),q.set(t,s+1);return}console.warn(JSON.stringify({event:`persistence-force-flush-during-burst`,"doc.name":t,wallClockMsSinceLastTransaction:getMsSinceLastUserTx(e)??null,deferCount:s})),incrementPersistenceForceFlushDuringBurst()}let{sv:w,json:O}=captureDocSnapshotForPersistence(e),{frontmatter:j,body:B}=stripFrontmatter(e.getText(`source`).toString()),H=prependFrontmatter(j,B),J;try{J=assertBridgeInvariant(H,prependFrontmatter(j,mdManager.serialize(O)),{site:`persistence`,docName:t,suppressDevThrow:!0})}catch(e){incrementPersistenceSanityCheckSerializeFailures(),console.warn(JSON.stringify({event:`persistence-sanity-check-serialize-failed`,"doc.name":t,"error.type":e instanceof Error?e.constructor.name:typeof e,timestamp:new Date().toISOString()})),log$5.warn({err:e,documentName:t},`[persistence] Sanity-check serialize failed for ${t}; proceeding with ytext bytes`),J=!1}J||ve(e,B,t);let Y=getReconciledBase(t);if(Y!==void 0&&normalizeBridge(H)===normalizeBridge(Y)){contributorCount()>0&&ge(),q.delete(t);return}if(Y===void 0&&normalizeBridge(H)===``){log$5.warn({documentName:t},`[persistence] Skipped phantom write for ${t}: empty Y.Doc with no reconciled base`),q.delete(t);return}let ee=resolveWriterFromOrigin(g,D);if(ee&&ee.id!==SERVICE_WRITER.id&&(hasContributor(ee.id)||recordContributor(t,ee.id,ee.name,ee.id)),Y!==void 0){let g=classifyDuplication(H,Y);if(g.kind===`block`){if(F.has(t)){log$5.warn({documentName:t},`[persistence] Tripwire breaker active — skipping duplicate store for ${t}`);return}let S=e.getXmlFragment(`default`).length;console.warn(JSON.stringify({event:`ok-persistence-duplication-blocked`,"doc.name":t,candidateBytes:H.length,baseBytes:Y.length,fragmentChildren:S,copies:g.copies,reason:g.reason}));try{let g=safeContentPath(t,s),S;if(existsSync(g)){let e=null;try{e=realpathSync(g)}catch(e){log$5.warn({err:e,documentName:t},`[persistence] Tripwire reset realpath failed for ${t}; using currentBase`)}if(e&&isWithinContentDir(e,s))try{S=readFileSync(e,`utf-8`)}catch(s){log$5.warn({err:s,documentName:t,canonical:e},`[persistence] Tripwire reset readFileSync failed for ${t}; using currentBase`),S=Y}else e&&console.warn(`[persistence] symlink-escape on tripwire reset: ${g} → ${e}, using currentBase`,{docName:t,originalPath:g,canonical:e,contentDir:s}),S=Y}else S=Y;e.transact(()=>{L(e,S)},FILE_WATCHER_ORIGIN),F.delete(t)}catch(e){F.add(t),log$5.error({err:e,documentName:t},`[persistence] Tripwire reset failed for ${t}`)}q.delete(t);return}}let te=safeContentPath(t,s);await tracedMkdir(dirname(te),{recursive:!0});let ne;try{ne=await realpath(te)}catch(e){let s=e.code;if(s===`ENOENT`){let e=!1;try{e=lstatSync(te).isSymbolicLink()}catch(e){e.code!==`ENOENT`&&log$5.warn({err:e,path:te},`[persistence] lstat failed during broken-symlink check`)}e&&console.warn(`[persistence] broken-symlink fallback`,{docName:t,reason:`broken-symlink`}),ne=te}else if(s===`ELOOP`)throw console.error(`[persistence] Symlink cycle at ${te}`),Error(`Symlink cycle detected at ${te}`);else throw e}if(!isWithinContentDir(ne,s)){let e=`symlink-escape: ${te} resolves to ${ne} outside ${s}`;throw console.error(`[persistence] ${e}`,{docName:t,originalPath:te,canonical:ne,contentDir:s}),Error(e)}let ae=`${ne}.tmp.${crypto.randomUUID()}`;try{await tracedWriteFile(ae,H,`utf-8`),await tracedRename(ae,ne),registerWrite(ne,contentHash(H)),incrementPersistenceDiskWrite();try{k?.(t,w)}catch(e){log$5.warn({err:e,documentName:t},`[persistence] onDiskFlush callback failed for ${t}`)}}catch(e){try{tracedUnlinkSync(ae)}catch{}throw q.delete(t),log$5.error({err:e,documentName:t},`[persistence] Failed to save ${t}`),e}log$5.info({filePath:ne,bytes:H.length},`[persistence] Wrote ${ne} (${H.length} bytes)`),setReconciledBase(t,H),F.delete(t),q.delete(t),E&&(E.updateDocumentFromMarkdown(t,H),E.saveToDisk().catch(e=>{log$5.warn({err:e,documentName:t},`[backlinks] Failed to persist cache for ${t}`)})),setActiveSpanAttributes({"persistence.bytes":H.length}),ge()}).finally(()=>{Ce?.record((Date.now()-S)/1e3)})}function je({document:e,documentName:t,lastTransactionOrigin:s}){ue.set(t,{branch:getActiveBranch(),document:e,lastTransactionOrigin:s})}async function Me(e=`within-branch`){return ce?(B=B===`discard-stale`||e===`discard-stale`?`discard-stale`:`within-branch`,ce):(ce=(async()=>{let t=e;for(;;){let e=[...ue.entries()];if(ue.clear(),t!==`discard-stale`){for(let[t,s]of e)if(s.branch===getActiveBranch())try{await De({document:s.document,documentName:t,lastTransactionOrigin:s.lastTransactionOrigin})}catch(e){log$5.error({err:e,documentName:t},`[persistence] Deferred store failed for ${t}`)}}let s=B;if(B=null,ue.size===0&&s===null)break;t=s??`within-branch`}})().finally(()=>{ce=null}),ce)}let Pe={async onLoadDocument({document:t,documentName:g,context:S}){if(isSystemDoc(g))return;if(isConfigDoc(g)){loadConfigDoc(t,g,j);return}Te();let w=Date.now();return withSpan(`persistence.onLoadDocument`,{attributes:{"doc.name":g}},async()=>{log$5.info({documentName:g,connections:t.getConnectionsCount?.()??`?`},`[persistence] onLoadDocument called for ${g} (connections: ${t.getConnectionsCount?.()??`?`})`);let S=safeContentPath(g,s);if(!existsSync(S))return;try{let e=realpathSync(S);if(!isWithinContentDir(e,s)){console.warn(`[persistence] symlink-escape on load: ${S} → ${e}, refusing`);return}}catch(e){if(e.code===`ELOOP`){console.warn(`[persistence] Symlink cycle on load: ${S}, refusing`);return}}let w=readFileSync(S,`utf-8`),E=t.getXmlFragment(`default`);log$5.info({documentName:g,fragmentLength:E.length},`[persistence] onLoadDocument ${g}: fragment.length=${E.length} before update`),E.length===0?(t.transact(()=>{applyDiskContentToDoc(t,w,e?.resolveEmbed,g)},FILE_WATCHER_ORIGIN),log$5.info({filePath:S,children:E.length},`[persistence] Loaded ${S} into Y.Doc (${E.length} children)`),E.observeDeep(()=>{log$5.info({documentName:g,fragmentLength:E.length},`[persistence] MUTATION on ${g}: fragment.length=${E.length}`)})):log$5.info({documentName:g,children:E.length},`[persistence] Skipped load for ${g} — fragment already has ${E.length} children`),setReconciledBase(g,w)}).finally(()=>{ye?.record((Date.now()-w)/1e3)})},async onStoreDocument({document:e,documentName:t,lastTransactionOrigin:s,lastContext:g}){if(!isSystemDoc(t)){if(isConfigDoc(t)){await storeConfigDoc(e,t,s,j);return}if(isBatchInProgress()){je({document:e,documentName:t,lastTransactionOrigin:s});return}return De({document:e,documentName:t,lastTransactionOrigin:s})}}};async function Ie(){oe&&await oe}return{extension:Pe,flushDeferredStores:Me,flushPendingGitCommit:_e,waitForPendingCommits:Ie,configPersistenceCtx:j}}const MARKDOWN_LINK_OR_IMAGE_RE=/!?\[[^\]\n]*(?:\][^[\]\n]*)?\]\((?:<([^>\n]+)>|([^)\s]+))(?:\s+['"][^'"]*['"])?\)/g,WIKI_LINK_OR_EMBED_RE=/!?\[\[([^[\]|#]+?)(?:#[^\]|]+?)?(?:\|[^\]]+?)?\]\]/g,HTML_LINK_ATTR_RE=/<[\w:-]+\b[^>]*?\s+(?:href|src)\s*=\s*(?:"([^"\n]*)"|'([^'\n]*)'|“([^”\n]*)”|([^\s"'=<>`]+))/gi;function isRemoteOrOpaqueHref(e){return e.startsWith(`#`)||e.startsWith(`//`)||e.startsWith(`data:`)||/^[a-z][a-z0-9+.-]*:/i.test(e)}function stripHrefDecorations(e){let t=e.trim().replace(/^<(.+)>$/,`$1`),s=t.indexOf(`#`),g=s>=0?t.slice(0,s):t,S=g.indexOf(`?`);return S>=0?g.slice(0,S):g}function decodeHrefPath(e){let t=stripHrefDecorations(e);try{return decodeURI(t)}catch{return t}}function mediaKindForAssetPath(e){return mediaKindForSidebarAssetExtension(extname(e).slice(1).toLowerCase())}function errnoCode$1(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`?e.code:null}function collectHrefsFromLine(e,t){for(let s of e.matchAll(MARKDOWN_LINK_OR_IMAGE_RE)){let e=s[1]??s[2];e&&t.add(e)}for(let s of e.matchAll(WIKI_LINK_OR_EMBED_RE)){let e=s[1];e&&t.add(e)}for(let s of e.matchAll(HTML_LINK_ATTR_RE)){let e=s[1]??s[2]??s[3]??s[4];e&&t.add(e)}}function stripHtmlComments(e,t){let s=e,g=``;for(;s.length>0;){if(t.inComment){let e=s.indexOf(`-->`);if(e===-1)return g;s=s.slice(e+3),t.inComment=!1;continue}let e=s.indexOf(`<!--`);if(e===-1)return g+s;g+=s.slice(0,e),s=s.slice(e+4),t.inComment=!0}return g}function extractLocalAssetHrefs(e){let t=new Set,s=createCodeFenceTracker(),g={inComment:!1};for(let S of e.replaceAll(`\r
787
788
  `,`
788
789
  `).replaceAll(`\r`,`
789
790
  `).split(`
@@ -827,7 +828,7 @@ Karpathy's insight: "The tedious part of maintaining a knowledge base is not the
827
828
  `,`
828
829
  `).replaceAll(`\r`,`
829
830
  `).split(`
830
- `),g=[],S=null;for(let e of s)if(S)isFenceClose$1(e,S)&&(S=null);else{let s=matchFence$1(e);if(s)S=s;else{let s=extractExternalMarkdownLinksFromLine(e,t);g.push(...s.occurrences.map(({url:e,label:t,start:g,end:S})=>({url:e,label:t,snippet:snippetAround$1(s.text,g,S)})))}}return g}function serializeState(e){return{backward:Object.fromEntries([...e.backward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet}))])),forward:Object.fromEntries([...e.forward.entries()].map(([e,t])=>[e,[...t].sort()])),externalForward:Object.fromEntries([...e.externalForward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url))]))}}function buildExternalBackward(e){let t=new Map;for(let[s,g]of e)for(let[e,S]of g){let g=t.get(e);g||(g=new Map,t.set(e,g)),g.set(s,S)}return t}function deserializeState(e){let t=new Map(Object.entries(e.externalForward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.url,{label:e.label??null,snippet:e.snippet??null}]))]));return{backward:new Map(Object.entries(e.backward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.source,{anchor:e.anchor??null,snippet:e.snippet??null}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:buildExternalBackward(t)}}var BacklinkIndex=class{projectDir;contentDir;contentFilter;states=new Map;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.states.set(this.activeBranch,createEmptyState$1())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=createEmptyState$1(),this.states.set(e,t)),t}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return resolve(getLocalDir(this.projectDir),`cache`,e,`backlinks.json`)}updateDocument(e,t,s=[],g=this.activeBranch){if(isSystemDoc(e)||isConfigDoc(e))return;let S=this.getState(g),w=S.forward.get(e)??new Set,E=S.externalForward.get(e)??new Map;for(let t of w){let s=S.backward.get(t);s&&(s.delete(e),s.size===0&&S.backward.delete(t))}for(let t of E.keys()){let s=S.externalBackward.get(t);s&&(s.delete(e),s.size===0&&S.externalBackward.delete(t))}let D=new Set,O=new Map;S.forward.set(e,D),S.externalForward.set(e,O);for(let s of t){if(!s.target)continue;D.add(s.target);let t=S.backward.get(s.target);t||(t=new Map,S.backward.set(s.target,t)),t.set(e,mergeLinkMeta(t.get(e),{anchor:s.anchor,snippet:s.snippet}))}for(let t of s){if(!t.url)continue;O.set(t.url,{label:t.label,snippet:t.snippet});let s=S.externalBackward.get(t.url);s||(s=new Map,S.externalBackward.set(t.url,s)),(!s.has(e)||!s.get(e)?.snippet&&t.snippet)&&s.set(e,{label:t.label,snippet:t.snippet})}}updateDocumentFromMarkdown(e,t,s=this.activeBranch){try{let{body:g}=stripFrontmatter(t),S=extractWikiLinksFromMarkdown(g),w=extractMarkdownLinksFromMarkdown(g,e),E=extractExternalWikiLinksFromMarkdown(g),D=extractExternalMarkdownLinksFromMarkdown(g,e),O=new Set(S.map(e=>e.target)),k=[...S,...w.filter(e=>!O.has(e.target))],j=new Set(E.map(e=>e.url)),F=[...E,...D.filter(e=>!j.has(e.url))];this.updateDocument(e,k,F,s)}catch(t){console.warn(`[backlinks] Failed to scan ${e} for link extraction:`,t),this.deleteDocument(e,s)}}deleteDocument(e,t=this.activeBranch){if(isSystemDoc(e)||isConfigDoc(e))return;let s=this.getState(t),g=s.forward.get(e)??new Set,S=s.externalForward.get(e)??new Map;for(let t of g){let g=s.backward.get(t);g&&(g.delete(e),g.size===0&&s.backward.delete(t))}for(let t of S.keys()){let g=s.externalBackward.get(t);g&&(g.delete(e),g.size===0&&s.externalBackward.delete(t))}s.forward.delete(e),s.externalForward.delete(e)}renameDocument(e,t,s,g=this.activeBranch){this.deleteDocument(e,g),this.updateDocumentFromMarkdown(t,s,g)}getBacklinks(e,t=this.activeBranch){let s=this.getState(t).backward.get(e);return s?[...s.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).sort((e,t)=>e.source.localeCompare(t.source)):[]}getBacklinkCount(e,t=this.activeBranch){return this.getState(t).backward.get(e)?.size??0}getForwardLinks(e,t=this.activeBranch){return[...this.getState(t).forward.get(e)??new Set].sort((e,t)=>e.localeCompare(t))}getForwardLinkEntries(e,t=this.activeBranch){let s=this.getState(t),g=this.getForwardLinks(e,t).map(t=>({kind:`doc`,target:t,anchor:s.backward.get(t)?.get(e)?.anchor??null,snippet:s.backward.get(t)?.get(e)?.snippet??null})),S=[...(s.externalForward.get(e)??new Map).entries()].map(([e,t])=>({kind:`external`,url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url));return[...g,...S]}getOrphans(e,t=`both`,s=this.activeBranch){let g=this.getState(s);return[...e].filter(e=>{let s=(g.backward.get(e)?.size??0)>0,S=(g.forward.get(e)?.size??0)>0;return t===`incoming`?!s:(t===`outgoing`||!s)&&!S}).sort((e,t)=>e.localeCompare(t))}getHubs(e=20,t=this.activeBranch){return[...this.getState(t).backward.entries()].map(([e,t])=>({docName:e,count:t.size})).sort((e,t)=>t.count===e.count?e.docName.localeCompare(t.docName):t.count-e.count).slice(0,e)}getDeadLinks(e,t,s=this.activeBranch){let g=this.getState(s),S=new Set(e),w=t?.length?new Set(t):null;return[...g.backward.entries()].filter(([e,t])=>{if(S.has(e))return!1;if(!w)return t.size>0;for(let e of t.keys())if(w.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([e])=>!w||w.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).sort((e,t)=>e.source.localeCompare(t.source))})).filter(e=>e.sources.length>0).sort((e,t)=>t.sources.length===e.sources.length?e.target.localeCompare(t.target):t.sources.length-e.sources.length)}getLinkGraph(e=this.activeBranch){let t=this.getState(e),s=new Map,g=[];for(let[e,S]of t.forward){s.set(e,{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(t.backward.get(e))});for(let w of S)s.set(w,{kind:`doc`,id:w,docName:w,anchor:getRepresentativeAnchor(t.backward.get(w))}),g.push({source:e,target:w})}for(let[e,S]of t.externalForward){s.set(e,{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(t.backward.get(e))});for(let[t,w]of S){let S=externalNodeId(t);s.set(S,{kind:`external`,id:S,url:t,label:w.label}),g.push({source:e,target:S})}}return{nodes:[...s.values()].sort((e,t)=>e.id.localeCompare(t.id)),links:g}}getLinkGraphNeighborhood(e,t,s=this.activeBranch){let g=this.getState(s),S=new Map;for(let e of g.externalForward.values())for(let[t,s]of e)S.has(t)||S.set(t,s.label);let w=new Set([e]),E=[{nodeId:e,degree:0}],D=0;for(;D<E.length;){let e=E[D++];if(e.degree>=t)continue;let s=externalUrlFromNodeId(e.nodeId),S=new Set;if(s)for(let e of g.externalBackward.get(s)?.keys()??[])S.add(e);else{for(let t of g.forward.get(e.nodeId)??new Set)S.add(t);for(let t of g.externalForward.get(e.nodeId)?.keys()??[])S.add(externalNodeId(t));for(let t of g.backward.get(e.nodeId)?.keys()??[])S.add(t)}for(let t of S)w.has(t)||(w.add(t),E.push({nodeId:t,degree:e.degree+1}))}let O=[];for(let[e,t]of g.forward)if(w.has(e))for(let s of t)w.has(s)&&O.push({source:e,target:s});for(let[e,t]of g.externalForward)if(w.has(e))for(let s of t.keys()){let t=externalNodeId(s);w.has(t)&&O.push({source:e,target:t})}return{nodes:[...w].sort().map(e=>{let t=externalUrlFromNodeId(e);return t?{kind:`external`,id:e,url:t,label:S.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(g.backward.get(e))}}),links:O}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);mkdirSync(dirname(t),{recursive:!0});let s=this.getState(e);await writeFile(t,JSON.stringify(serializeState(s),null,2),`utf-8`)}async loadFromDisk(e=this.activeBranch){let t=this.cachePath(e);if(!existsSync(t))return!1;try{let s=await readFile$1(t,`utf-8`),g=JSON.parse(s);return this.states.set(e,deserializeState(g)),!0}catch(t){return console.warn(`[backlinks] Failed to load cache for ${e}:`,t),!1}}clear(e=this.activeBranch){this.states.set(e,createEmptyState$1())}rebuildFileList(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[backlinks] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.rebuildFileList(s,t);continue}if(!g.isFile()||!isSupportedDocFile(g.name))continue;let S=relative(this.contentDir,s);this.contentFilter?.isExcluded(S)||t.push(stripDocExtension(S))}}listDocsOnDisk(){if(!existsSync(this.contentDir))return[];let e=[];return this.rebuildFileList(this.contentDir,e),Array.from(new Set(e)).sort((e,t)=>e.localeCompare(t))}rebuildFromDisk(e=this.activeBranch){let t=createEmptyState$1();for(let e of this.listDocsOnDisk()){let s=resolve(this.contentDir,`${e}${getDocExtension(e)}`);try{let{body:g}=stripFrontmatter(readFileSync(s,`utf-8`)),S=extractWikiLinksFromMarkdown(g),w=extractMarkdownLinksFromMarkdown(g,e),E=extractExternalWikiLinksFromMarkdown(g),D=extractExternalMarkdownLinksFromMarkdown(g,e),O=new Set(S.map(e=>e.target)),k=[...S,...w.filter(e=>!O.has(e.target))],j=new Set(E.map(e=>e.url)),F=[...E,...D.filter(e=>!j.has(e.url))],L=new Set,B=new Map;t.forward.set(e,L),t.externalForward.set(e,B);for(let s of k){if(!s.target)continue;L.add(s.target);let g=t.backward.get(s.target);g||(g=new Map,t.backward.set(s.target,g)),g.set(e,mergeLinkMeta(g.get(e),{anchor:s.anchor,snippet:s.snippet}))}for(let s of F){if(!s.url)continue;B.set(s.url,{label:s.label,snippet:s.snippet});let g=t.externalBackward.get(s.url);g||(g=new Map,t.externalBackward.set(s.url,g)),g.set(e,{label:s.label,snippet:s.snippet})}}catch(t){console.warn(`[backlinks] Failed to rebuild entry for ${e}:`,t)}}this.states.set(e,t)}};function extractActorIdentity(e,t){let s=normalizeSummary(e.summary);if(s.kind===`invalid`)return{kind:`invalid-summary`};let g=parseAgentBodyFields(e),S=t?.()??null;return g.rawAgentId!==void 0&&g.writerId!==void 0?{kind:`agent`,writerId:g.writerId,displayName:g.displayName,colorSeed:g.colorSeed??g.rawAgentId,clientName:g.clientName,clientVersion:g.clientVersion,label:g.label,actor:{principalId:S?.id,agentType:resolveAgentType(g.clientName),clientName:g.clientName,clientVersion:g.clientVersion,label:g.label},summary:s}:S?{kind:`principal`,writerId:S.id,displayName:S.display_name,colorSeed:S.id,actor:{principalId:S.id},summary:s}:{kind:`anonymous`,summary:s}}const defaultGitConfigReader=(e,t,s)=>{let g=spawnSync(`git`,[`config`,s===`local`?`--local`:`--global`,t],{cwd:e,encoding:`utf-8`,timeout:5e3});return g.status!==0||!g.stdout?null:g.stdout.trim()||null};async function resolveGitIdentity(e,t,s,g=defaultGitConfigReader){let S=g(e,`user.name`,`local`),w=g(e,`user.email`,`local`);if(S&&w)return{name:S,email:w};let E=g(e,`user.name`,`global`),D=g(e,`user.email`,`global`);if(E&&D)return{name:E,email:D};if(t&&s){let e=await t.get(s);if(e){let t=e.name??e.login,s=e.email??`${e.login}@users.noreply.github.com`;if(t)return{name:t,email:s}}}return null}function writeGitIdentity(e,t,s){let g=(t,s)=>{let g=spawnSync(`git`,[`config`,`--local`,t,s],{cwd:e,encoding:`utf-8`,timeout:5e3});if(g.status!==0){let e=g.stderr?.trim()??``;throw Error(`git config --local ${t} failed: ${e}`)}};g(`user.name`,t),g(`user.email`,s)}const ALLOWED_URL_PATTERNS=[/^https?:\/\//i,/^ssh:\/\//i,/^git:\/\//i,/^git@[^:]+:/],BLOCKED_URL_PATTERNS=[/^file:\/\//i,/^javascript:/i,/^ext::/i,/^data:/i,/^vbscript:/i];function isAllowedGitUrl(e){return!e||typeof e!=`string`||BLOCKED_URL_PATTERNS.some(t=>t.test(e))?!1:ALLOWED_URL_PATTERNS.some(t=>t.test(e))}function expandTilde(e){return e===`~`?homedir():e.startsWith(`~/`)?join(homedir(),e.slice(2)):e}function tryRealpathSync(e){try{return realpathSync(e)}catch{return null}}function isPathWithinHome(e,t){if(!e||typeof e!=`string`||e.includes(`\0`))return!1;let s=tryRealpathSync(t);if(s===null)return!1;let g=resolve(expandTilde(e)),S=[],w=g;for(;;){let e=!0;try{lstatSync(w)}catch(t){if(t.code===`ENOENT`)e=!1;else return!1}if(e){let e=tryRealpathSync(w);if(e===null)return!1;let t=relative(s,S.length===0?e:join(e,...S));return t===``||!t.startsWith(`..`)&&!isAbsolute(t)}let t=dirname(w);if(t===w)return!1;S.unshift(basename(w)),w=t}}function isSafeLocalPath(e){return isPathWithinHome(e,homedir())}function isLoopbackRequest(e){let t=e.socket.remoteAddress;return t===`127.0.0.1`||t===`::1`||t===`::ffff:127.0.0.1`}function hasValidLocalOpOrigin(e){let t=e.headers.origin;if(!t)return!0;try{let{hostname:e}=new URL(t);return e===`127.0.0.1`||e===`localhost`||e===`[::1]`||e===`::1`}catch{return!1}}function checkLocalOpSecurity(e,t,s){return isLoopbackRequest(e)?hasValidLocalOpOrigin(e)?!0:(s(t,403,{ok:!1,error:`Forbidden: invalid origin for local-op endpoint`}),!1):(s(t,403,{ok:!1,error:`Forbidden: local-op endpoints require loopback connection`}),!1)}function createConcurrencyGuard(){let e=new Set;return{tryAcquire(t){return e.has(t)?!1:(e.add(t),!0)},release(t){e.delete(t)}}}function runSubprocess(e){let[t,...s]=e.cliArgs;if(!t)return{done:Promise.resolve({code:-1,stderr:`no command provided`,timedOut:!1,cancelled:!1}),cancel:()=>{}};let g=[...s,...e.trailingArgs],S=!1,w=!1,E=``,D=[],O=spawn(t,g,{cwd:e.cwd,stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),k=setTimeout(()=>{S=!0,O.kill(`SIGTERM`)},e.timeoutMs),j=t=>{if(!t.trim())return;let s=null;try{let e=JSON.parse(t);s=e&&typeof e==`object`?e:null}catch{s=null}e.onLine({raw:t,parsed:s})};return O.stdout.on(`data`,e=>{E+=e.toString(`utf-8`);let t=E.split(`
831
+ `),g=[],S=null;for(let e of s)if(S)isFenceClose$1(e,S)&&(S=null);else{let s=matchFence$1(e);if(s)S=s;else{let s=extractExternalMarkdownLinksFromLine(e,t);g.push(...s.occurrences.map(({url:e,label:t,start:g,end:S})=>({url:e,label:t,snippet:snippetAround$1(s.text,g,S)})))}}return g}function serializeState(e){return{backward:Object.fromEntries([...e.backward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet}))])),forward:Object.fromEntries([...e.forward.entries()].map(([e,t])=>[e,[...t].sort()])),externalForward:Object.fromEntries([...e.externalForward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url))]))}}function buildExternalBackward(e){let t=new Map;for(let[s,g]of e)for(let[e,S]of g){let g=t.get(e);g||(g=new Map,t.set(e,g)),g.set(s,S)}return t}function deserializeState(e){let t=new Map(Object.entries(e.externalForward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.url,{label:e.label??null,snippet:e.snippet??null}]))]));return{backward:new Map(Object.entries(e.backward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.source,{anchor:e.anchor??null,snippet:e.snippet??null}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:buildExternalBackward(t)}}var BacklinkIndex=class{projectDir;contentDir;contentFilter;states=new Map;mtimesByBranch=new Map;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.states.set(this.activeBranch,createEmptyState$1())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=createEmptyState$1(),this.states.set(e,t)),t}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return resolve(getLocalDir(this.projectDir),`cache`,e,`backlinks.json`)}updateDocument(e,t,s=[],g=this.activeBranch){if(isSystemDoc(e)||isConfigDoc(e))return;let S=this.getState(g),w=S.forward.get(e)??new Set,E=S.externalForward.get(e)??new Map;for(let t of w){let s=S.backward.get(t);s&&(s.delete(e),s.size===0&&S.backward.delete(t))}for(let t of E.keys()){let s=S.externalBackward.get(t);s&&(s.delete(e),s.size===0&&S.externalBackward.delete(t))}let D=new Set,O=new Map;S.forward.set(e,D),S.externalForward.set(e,O);for(let s of t){if(!s.target)continue;D.add(s.target);let t=S.backward.get(s.target);t||(t=new Map,S.backward.set(s.target,t)),t.set(e,mergeLinkMeta(t.get(e),{anchor:s.anchor,snippet:s.snippet}))}for(let t of s){if(!t.url)continue;O.set(t.url,{label:t.label,snippet:t.snippet});let s=S.externalBackward.get(t.url);s||(s=new Map,S.externalBackward.set(t.url,s)),(!s.has(e)||!s.get(e)?.snippet&&t.snippet)&&s.set(e,{label:t.label,snippet:t.snippet})}}updateDocumentFromMarkdown(e,t,s=this.activeBranch){try{let{body:g}=stripFrontmatter(t),S=extractWikiLinksFromMarkdown(g),w=extractMarkdownLinksFromMarkdown(g,e),E=extractExternalWikiLinksFromMarkdown(g),D=extractExternalMarkdownLinksFromMarkdown(g,e),O=new Set(S.map(e=>e.target)),k=[...S,...w.filter(e=>!O.has(e.target))],j=new Set(E.map(e=>e.url)),F=[...E,...D.filter(e=>!j.has(e.url))];this.updateDocument(e,k,F,s)}catch(t){console.warn(`[backlinks] Failed to scan ${e} for link extraction:`,t),this.deleteDocument(e,s)}}deleteDocument(e,t=this.activeBranch){if(isSystemDoc(e)||isConfigDoc(e))return;let s=this.getState(t),g=s.forward.get(e)??new Set,S=s.externalForward.get(e)??new Map;for(let t of g){let g=s.backward.get(t);g&&(g.delete(e),g.size===0&&s.backward.delete(t))}for(let t of S.keys()){let g=s.externalBackward.get(t);g&&(g.delete(e),g.size===0&&s.externalBackward.delete(t))}s.forward.delete(e),s.externalForward.delete(e)}renameDocument(e,t,s,g=this.activeBranch){this.deleteDocument(e,g),this.updateDocumentFromMarkdown(t,s,g)}getBacklinks(e,t=this.activeBranch){let s=this.getState(t).backward.get(e);return s?[...s.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).sort((e,t)=>e.source.localeCompare(t.source)):[]}getBacklinkCount(e,t=this.activeBranch){return this.getState(t).backward.get(e)?.size??0}getForwardLinks(e,t=this.activeBranch){return[...this.getState(t).forward.get(e)??new Set].sort((e,t)=>e.localeCompare(t))}getForwardLinkEntries(e,t=this.activeBranch){let s=this.getState(t),g=this.getForwardLinks(e,t).map(t=>({kind:`doc`,target:t,anchor:s.backward.get(t)?.get(e)?.anchor??null,snippet:s.backward.get(t)?.get(e)?.snippet??null})),S=[...(s.externalForward.get(e)??new Map).entries()].map(([e,t])=>({kind:`external`,url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url));return[...g,...S]}getOrphans(e,t=`both`,s=this.activeBranch){let g=this.getState(s);return[...e].filter(e=>{let s=(g.backward.get(e)?.size??0)>0,S=(g.forward.get(e)?.size??0)>0;return t===`incoming`?!s:(t===`outgoing`||!s)&&!S}).sort((e,t)=>e.localeCompare(t))}getHubs(e=20,t=this.activeBranch){return[...this.getState(t).backward.entries()].map(([e,t])=>({docName:e,count:t.size})).sort((e,t)=>t.count===e.count?e.docName.localeCompare(t.docName):t.count-e.count).slice(0,e)}getDeadLinks(e,t,s=this.activeBranch){let g=this.getState(s),S=new Set(e),w=t?.length?new Set(t):null;return[...g.backward.entries()].filter(([e,t])=>{if(S.has(e))return!1;if(!w)return t.size>0;for(let e of t.keys())if(w.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([e])=>!w||w.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).sort((e,t)=>e.source.localeCompare(t.source))})).filter(e=>e.sources.length>0).sort((e,t)=>t.sources.length===e.sources.length?e.target.localeCompare(t.target):t.sources.length-e.sources.length)}getLinkGraph(e=this.activeBranch){let t=this.getState(e),s=new Map,g=[];for(let[e,S]of t.forward){s.set(e,{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(t.backward.get(e))});for(let w of S)s.set(w,{kind:`doc`,id:w,docName:w,anchor:getRepresentativeAnchor(t.backward.get(w))}),g.push({source:e,target:w})}for(let[e,S]of t.externalForward){s.set(e,{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(t.backward.get(e))});for(let[t,w]of S){let S=externalNodeId(t);s.set(S,{kind:`external`,id:S,url:t,label:w.label}),g.push({source:e,target:S})}}return{nodes:[...s.values()].sort((e,t)=>e.id.localeCompare(t.id)),links:g}}getLinkGraphNeighborhood(e,t,s=this.activeBranch){let g=this.getState(s),S=new Map;for(let e of g.externalForward.values())for(let[t,s]of e)S.has(t)||S.set(t,s.label);let w=new Set([e]),E=[{nodeId:e,degree:0}],D=0;for(;D<E.length;){let e=E[D++];if(e.degree>=t)continue;let s=externalUrlFromNodeId(e.nodeId),S=new Set;if(s)for(let e of g.externalBackward.get(s)?.keys()??[])S.add(e);else{for(let t of g.forward.get(e.nodeId)??new Set)S.add(t);for(let t of g.externalForward.get(e.nodeId)?.keys()??[])S.add(externalNodeId(t));for(let t of g.backward.get(e.nodeId)?.keys()??[])S.add(t)}for(let t of S)w.has(t)||(w.add(t),E.push({nodeId:t,degree:e.degree+1}))}let O=[];for(let[e,t]of g.forward)if(w.has(e))for(let s of t)w.has(s)&&O.push({source:e,target:s});for(let[e,t]of g.externalForward)if(w.has(e))for(let s of t.keys()){let t=externalNodeId(s);w.has(t)&&O.push({source:e,target:t})}return{nodes:[...w].sort().map(e=>{let t=externalUrlFromNodeId(e);return t?{kind:`external`,id:e,url:t,label:S.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:getRepresentativeAnchor(g.backward.get(e))}}),links:O}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);mkdirSync(dirname(t),{recursive:!0});let s=this.getState(e),g=this.mtimesByBranch.get(e),S={...serializeState(s),...g?{mtimes:Object.fromEntries(g)}:{}};await writeFile(t,JSON.stringify(S,null,2),`utf-8`)}async loadFromDisk(e=this.activeBranch){let t=this.cachePath(e);if(!existsSync(t))return!1;try{let s=await readFile$1(t,`utf-8`),g=JSON.parse(s);return this.states.set(e,deserializeState(g)),g.mtimes?this.mtimesByBranch.set(e,new Map(Object.entries(g.mtimes))):this.mtimesByBranch.delete(e),!0}catch(t){return console.warn(`[backlinks] Failed to load cache for ${e}:`,t),!1}}clear(e=this.activeBranch){this.states.set(e,createEmptyState$1()),this.mtimesByBranch.delete(e)}rebuildFileList(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[backlinks] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.rebuildFileList(s,t);continue}if(!g.isFile()||!isSupportedDocFile(g.name))continue;let S=relative(this.contentDir,s);this.contentFilter?.isExcluded(S)||t.push(stripDocExtension(S))}}listDocsOnDisk(){if(!existsSync(this.contentDir))return[];let e=[];return this.rebuildFileList(this.contentDir,e),Array.from(new Set(e)).sort((e,t)=>e.localeCompare(t))}async rebuildFromDisk(e=this.activeBranch){let t=createEmptyState$1(),s=new Map,g=this.listDocsOnDisk(),S=50;for(let e=0;e<g.length;e+=50){let S=g.slice(e,e+50),w=await Promise.allSettled(S.map(async e=>{let t=resolve(this.contentDir,`${e}${getDocExtension(e)}`),[s,g]=await Promise.all([stat$1(t),readFile$1(t,`utf-8`)]);return{docName:e,mtimeMs:s.mtimeMs,markdown:g}}));for(let e of w){if(e.status===`rejected`){console.warn(`[backlinks] Failed to rebuild entry:`,e.reason);continue}let{docName:g,mtimeMs:S,markdown:w}=e.value;s.set(g,S);let{body:E}=stripFrontmatter(w),D=extractWikiLinksFromMarkdown(E),O=extractMarkdownLinksFromMarkdown(E,g),k=extractExternalWikiLinksFromMarkdown(E),j=extractExternalMarkdownLinksFromMarkdown(E,g),F=new Set(D.map(e=>e.target)),L=[...D,...O.filter(e=>!F.has(e.target))],B=new Set(k.map(e=>e.url)),H=[...k,...j.filter(e=>!B.has(e.url))],q=new Set,J=new Map;t.forward.set(g,q),t.externalForward.set(g,J);for(let e of L){if(!e.target)continue;q.add(e.target);let s=t.backward.get(e.target);s||(s=new Map,t.backward.set(e.target,s)),s.set(g,mergeLinkMeta(s.get(g),{anchor:e.anchor,snippet:e.snippet}))}for(let e of H){if(!e.url)continue;J.set(e.url,{label:e.label,snippet:e.snippet});let s=t.externalBackward.get(e.url);s||(s=new Map,t.externalBackward.set(e.url,s)),s.set(g,{label:e.label,snippet:e.snippet})}}}this.states.set(e,t),this.mtimesByBranch.set(e,s)}walkForPaths(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[backlinks] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.walkForPaths(s,t)}else if(g.isFile()&&isSupportedDocFile(g.name)){let e=relative(this.contentDir,s);if(this.contentFilter?.isExcluded(e))continue;t.push({docName:stripDocExtension(e),filePath:s})}}}async reconcileWithDisk(e=this.activeBranch){if(!existsSync(this.contentDir))return{added:0,updated:0,deleted:0};let t=this.mtimesByBranch.get(e)??new Map,s=[];this.walkForPaths(this.contentDir,s);let g=new Set,S=s.filter(({docName:e})=>g.has(e)?!1:(g.add(e),!0)),w=new Set(S.map(e=>e.docName)),E=new Map,D=0,O=0,k=[],j=await Promise.allSettled(S.map(async({docName:e,filePath:t})=>({docName:e,filePath:t,mtimeMs:(await stat$1(t)).mtimeMs})));for(let e of j){if(e.status===`rejected`)continue;let{docName:s,filePath:g,mtimeMs:S}=e.value,w=t.get(s);if(w!==void 0&&w===S){E.set(s,S);continue}k.push({docName:s,filePath:g,mtimeMs:S,isNew:w===void 0})}let F=50;for(let t=0;t<k.length;t+=50){let s=k.slice(t,t+50),g=await Promise.allSettled(s.map(async({docName:e,filePath:t,mtimeMs:s,isNew:g})=>({docName:e,mtimeMs:s,isNew:g,markdown:await readFile$1(t,`utf-8`)})));for(let t of g){if(t.status===`rejected`){console.warn(`[backlinks] Failed to reconcile file:`,t.reason);continue}let{docName:s,mtimeMs:g,isNew:S,markdown:w}=t.value;this.updateDocumentFromMarkdown(s,w,e),E.set(s,g),S?D++:O++}}let L=0,B=new Set([...t.keys(),...this.getState(e).forward.keys()]);for(let t of B)w.has(t)||(this.deleteDocument(t,e),L++);return this.mtimesByBranch.set(e,E),{added:D,updated:O,deleted:L}}};function extractActorIdentity(e,t){let s=normalizeSummary(e.summary);if(s.kind===`invalid`)return{kind:`invalid-summary`};let g=parseAgentBodyFields(e),S=t?.()??null;return g.rawAgentId!==void 0&&g.writerId!==void 0?{kind:`agent`,writerId:g.writerId,displayName:g.displayName,colorSeed:g.colorSeed??g.rawAgentId,clientName:g.clientName,clientVersion:g.clientVersion,label:g.label,actor:{principalId:S?.id,agentType:resolveAgentType(g.clientName),clientName:g.clientName,clientVersion:g.clientVersion,label:g.label},summary:s}:S?{kind:`principal`,writerId:S.id,displayName:S.display_name,colorSeed:S.id,actor:{principalId:S.id},summary:s}:{kind:`anonymous`,summary:s}}const defaultGitConfigReader=(e,t,s)=>{let g=spawnSync(`git`,[`config`,s===`local`?`--local`:`--global`,t],{cwd:e,encoding:`utf-8`,timeout:5e3});return g.status!==0||!g.stdout?null:g.stdout.trim()||null};async function resolveGitIdentity(e,t,s,g=defaultGitConfigReader){let S=g(e,`user.name`,`local`),w=g(e,`user.email`,`local`);if(S&&w)return{name:S,email:w};let E=g(e,`user.name`,`global`),D=g(e,`user.email`,`global`);if(E&&D)return{name:E,email:D};if(t&&s){let e=await t.get(s);if(e){let t=e.name??e.login,s=e.email??`${e.login}@users.noreply.github.com`;if(t)return{name:t,email:s}}}return null}function writeGitIdentity(e,t,s){let g=(t,s)=>{let g=spawnSync(`git`,[`config`,`--local`,t,s],{cwd:e,encoding:`utf-8`,timeout:5e3});if(g.status!==0){let e=g.stderr?.trim()??``;throw Error(`git config --local ${t} failed: ${e}`)}};g(`user.name`,t),g(`user.email`,s)}const ALLOWED_URL_PATTERNS=[/^https?:\/\//i,/^ssh:\/\//i,/^git:\/\//i,/^git@[^:]+:/],BLOCKED_URL_PATTERNS=[/^file:\/\//i,/^javascript:/i,/^ext::/i,/^data:/i,/^vbscript:/i];function isAllowedGitUrl(e){return!e||typeof e!=`string`||BLOCKED_URL_PATTERNS.some(t=>t.test(e))?!1:ALLOWED_URL_PATTERNS.some(t=>t.test(e))}function expandTilde(e){return e===`~`?homedir():e.startsWith(`~/`)?join(homedir(),e.slice(2)):e}function tryRealpathSync(e){try{return realpathSync(e)}catch{return null}}function isPathWithinHome(e,t){if(!e||typeof e!=`string`||e.includes(`\0`))return!1;let s=tryRealpathSync(t);if(s===null)return!1;let g=resolve(expandTilde(e)),S=[],w=g;for(;;){let e=!0;try{lstatSync(w)}catch(t){if(t.code===`ENOENT`)e=!1;else return!1}if(e){let e=tryRealpathSync(w);if(e===null)return!1;let t=relative(s,S.length===0?e:join(e,...S));return t===``||!t.startsWith(`..`)&&!isAbsolute(t)}let t=dirname(w);if(t===w)return!1;S.unshift(basename(w)),w=t}}function isSafeLocalPath(e){return isPathWithinHome(e,homedir())}function isLoopbackRequest(e){let t=e.socket.remoteAddress;return t===`127.0.0.1`||t===`::1`||t===`::ffff:127.0.0.1`}function hasValidLocalOpOrigin(e){let t=e.headers.origin;if(!t)return!0;try{let{hostname:e}=new URL(t);return e===`127.0.0.1`||e===`localhost`||e===`[::1]`||e===`::1`}catch{return!1}}function checkLocalOpSecurity(e,t,s){return isLoopbackRequest(e)?hasValidLocalOpOrigin(e)?!0:(s(t,403,{ok:!1,error:`Forbidden: invalid origin for local-op endpoint`}),!1):(s(t,403,{ok:!1,error:`Forbidden: local-op endpoints require loopback connection`}),!1)}function createConcurrencyGuard(){let e=new Set;return{tryAcquire(t){return e.has(t)?!1:(e.add(t),!0)},release(t){e.delete(t)}}}function runSubprocess(e){let[t,...s]=e.cliArgs;if(!t)return{done:Promise.resolve({code:-1,stderr:`no command provided`,timedOut:!1,cancelled:!1}),cancel:()=>{}};let g=[...s,...e.trailingArgs],S=!1,w=!1,E=``,D=[],O=spawn(t,g,{cwd:e.cwd,stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),k=setTimeout(()=>{S=!0,O.kill(`SIGTERM`)},e.timeoutMs),j=t=>{if(!t.trim())return;let s=null;try{let e=JSON.parse(t);s=e&&typeof e==`object`?e:null}catch{s=null}e.onLine({raw:t,parsed:s})};return O.stdout.on(`data`,e=>{E+=e.toString(`utf-8`);let t=E.split(`
831
832
  `);E=t.pop()??``;for(let e of t)j(e)}),O.stderr.on(`data`,t=>{D.push(t),e.onStderr?.(t)}),{done:new Promise(e=>{O.on(`close`,t=>{clearTimeout(k),E.trim()&&j(E),E=``,e({code:t,stderr:Buffer.concat(D).toString(`utf-8`).trim(),timedOut:S,cancelled:w})}),O.on(`error`,t=>{clearTimeout(k),D.push(Buffer.from(t.message,`utf-8`)),e({code:-1,stderr:Buffer.concat(D).toString(`utf-8`).trim(),timedOut:S,cancelled:w})})}),cancel:()=>{if(!w&&(w=!0,!O.killed))try{O.kill(`SIGTERM`)}catch{}}}}const DEFAULT_TIMEOUT_MS$2=600*1e3;function asAuthEvent(e){let t=e.type;return t===`verification`?typeof e.user_code==`string`&&typeof e.verification_uri==`string`&&typeof e.expires_in==`number`?{type:`verification`,user_code:e.user_code,verification_uri:e.verification_uri,expires_in:e.expires_in}:null:t===`complete`?{type:`complete`,host:typeof e.host==`string`?e.host:``,login:typeof e.login==`string`?e.login:``,name:typeof e.name==`string`?e.name:void 0,email:typeof e.email==`string`?e.email:void 0,avatarUrl:typeof e.avatarUrl==`string`?e.avatarUrl:void 0}:t===`error`?{type:`error`,message:typeof e.message==`string`?e.message:`Unknown error`}:null}function runDeviceFlowSubprocess(e){let t=e.host??`github.com`,s=e.timeoutMs??DEFAULT_TIMEOUT_MS$2,g=!1,S=runSubprocess({cliArgs:e.cliArgs,trailingArgs:[`auth`,`login`,`--json`,`--host`,t],timeoutMs:s,onLine:({parsed:t})=>{if(!t)return;let s=asAuthEvent(t);s&&((s.type===`complete`||s.type===`error`)&&(g=!0),e.onEvent(s))}});return{done:S.done.then(s=>{g||(s.code===0?e.onEvent({type:`complete`,host:t,login:``}):e.onEvent({type:`error`,message:s.timedOut?`Sign-in timed out`:`auth login exited with code ${s.code??-1}`}))}),cancel:S.cancel}}const DEFAULT_TIMEOUT_MS$1=3e4;async function runAuthStatusSubprocess(e){let t=e.host??`github.com`,s=[],g=await runSubprocess({cliArgs:e.cliArgs,trailingArgs:[`auth`,`status`,`--json`,`--host`,t],timeoutMs:e.timeoutMs??DEFAULT_TIMEOUT_MS$1,onLine:({parsed:e})=>{e&&s.push(e)}}).done;for(let e=s.length-1;e>=0;e--){let g=s[e];if(g.type!==`status`)continue;let S=typeof g.host==`string`?g.host:t;return g.authenticated===!0&&typeof g.login==`string`?{authenticated:!0,host:S,login:g.login,name:typeof g.name==`string`?g.name:void 0,email:typeof g.email==`string`?g.email:void 0}:{authenticated:!1,host:S,error:typeof g.error==`string`?g.error:void 0}}return{authenticated:!1,host:t,error:g.timedOut?`auth status timed out`:g.code===0?void 0:g.stderr||`auth status exited with code ${g.code??-1}`}}async function runAuthReposSubprocess(e){let t=e.host??`github.com`,s=[],g=await runSubprocess({cliArgs:e.cliArgs,trailingArgs:[`auth`,`repos`,`--json`,`--host`,t],timeoutMs:e.timeoutMs??DEFAULT_TIMEOUT_MS$1,onLine:({parsed:e})=>{e&&s.push(e)}}).done;if(g.timedOut)return{ok:!1,error:`auth repos timed out`};if(g.code!==0)return{ok:!1,error:g.stderr||`auth repos exited with code ${g.code??-1}`};for(let e=s.length-1;e>=0;e--){let g=s[e];if(g.type!==`repos`||!Array.isArray(g.repos))continue;let S=[];for(let e of g.repos){if(!e||typeof e!=`object`)continue;let t=e;typeof t.full_name!=`string`||typeof t.clone_url!=`string`||S.push({full_name:t.full_name,clone_url:t.clone_url,private:t.private===!0})}return{ok:!0,host:typeof g.host==`string`?g.host:t,repos:S}}return{ok:!1,error:`auth repos returned no data`}}const DEFAULT_TIMEOUT_MS=600*1e3;function validateCloneInputs(e,t){return isAllowedGitUrl(e)?isSafeLocalPath(t)?{ok:!0}:{ok:!1,reason:`invalid-dir`}:{ok:!1,reason:`invalid-url`}}function asRawCloneEvent(e){let t=e.type;return t===`progress`?typeof e.phase==`string`&&typeof e.pct==`number`?{type:`progress`,phase:e.phase,pct:e.pct}:null:t===`complete`?typeof e.dir==`string`?{type:`complete`,dir:e.dir}:null:t===`error`?{type:`error`,message:typeof e.message==`string`?e.message:`Unknown error`}:null}function runCloneSubprocess(e){let t=expandTilde(e.dir),s=e.timeoutMs??DEFAULT_TIMEOUT_MS,g=!1,S=runSubprocess({cliArgs:e.cliArgs,trailingArgs:[`clone`,`--json`,e.url,t],timeoutMs:s,onLine:({parsed:t})=>{if(!t)return;let s=asRawCloneEvent(t);s&&((s.type===`complete`||s.type===`error`)&&(g=!0),e.onEvent(s))}});return{done:S.done.then(s=>{if(!g){if(s.timedOut){e.onEvent({type:`error`,message:`Clone timed out after 10 minutes`});return}if(s.code!==0){let t=s.stderr?` — ${s.stderr}`:``;e.onEvent({type:`error`,message:`Clone process exited with code ${s.code??-1}${t}`});return}e.onEvent({type:`complete`,dir:t})}}),cancel:S.cancel}}function isLoopbackAddress(e){return e?!!(e===`::1`||e.startsWith(`::ffff:127.`)||e.startsWith(`127.`)):!1}function isAllowedWorkspaceHostHeader(e){if(!e)return!1;if(e.startsWith(`[`)){let t=e.indexOf(`]`);if(t<0)return!1;let s=e.slice(1,t),g=e.slice(t+1);return g!==``&&!/^:\d+$/.test(g)?!1:s===`::1`}let t=e.lastIndexOf(`:`),s=t>=0?e.slice(0,t):e,g=t>=0?e.slice(t+1):null;return g!==null&&!/^\d+$/.test(g)?!1:!!(s===`localhost`||/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(s))}const MANAGED_RENAME_JOURNAL_FILENAME=`managed-rename.json`;function journalDir(e){return getLocalDir(e)}function managedRenameJournalPath(e){return resolve(journalDir(e),MANAGED_RENAME_JOURNAL_FILENAME)}function createManagedRenameRecoveryJournal(e){return{version:2,fromPath:e.fromPath,toPath:e.toPath,affectedDocs:e.affectedDocs,createdAt:e.createdAt??new Date().toISOString(),snapshots:e.snapshots}}function isManagedRenameSnapshot(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.docName==`string`&&typeof t.content==`string`}function isManagedRenameAffectedDoc(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.from==`string`&&typeof t.to==`string`}function parseV2(e){if(typeof e.fromPath!=`string`||e.fromPath.length===0)throw Error(`Managed rename journal v2 is missing fromPath`);if(typeof e.toPath!=`string`||e.toPath.length===0)throw Error(`Managed rename journal v2 is missing toPath`);if(typeof e.createdAt!=`string`||e.createdAt.length===0)throw Error(`Managed rename journal v2 is missing createdAt`);if(!Array.isArray(e.affectedDocs)||e.affectedDocs.length===0||!e.affectedDocs.every(isManagedRenameAffectedDoc))throw Error(`Managed rename journal v2 has invalid affectedDocs`);if(!Array.isArray(e.snapshots)||e.snapshots.length===0||!e.snapshots.every(isManagedRenameSnapshot))throw Error(`Managed rename journal v2 has invalid snapshots`);for(let t of e.affectedDocs)if(!e.snapshots.some(e=>e.docName===t.from))throw Error(`Managed rename journal v2 is missing snapshot for affected doc: ${t.from}`);return{version:2,fromPath:e.fromPath,toPath:e.toPath,affectedDocs:e.affectedDocs,createdAt:e.createdAt,snapshots:e.snapshots}}function parseV1(e){if(typeof e.sourceDocName!=`string`||e.sourceDocName.length===0)throw Error(`Managed rename journal v1 is missing sourceDocName`);if(typeof e.destinationDocName!=`string`||e.destinationDocName.length===0)throw Error(`Managed rename journal v1 is missing destinationDocName`);if(typeof e.createdAt!=`string`||e.createdAt.length===0)throw Error(`Managed rename journal v1 is missing createdAt`);if(!Array.isArray(e.snapshots)||e.snapshots.length===0||!e.snapshots.every(isManagedRenameSnapshot))throw Error(`Managed rename journal v1 has invalid snapshots`);if(!e.snapshots.some(t=>t.docName===e.sourceDocName))throw Error(`Managed rename journal v1 must include the source document snapshot`);return{version:1,sourceDocName:e.sourceDocName,destinationDocName:e.destinationDocName,createdAt:e.createdAt,snapshots:e.snapshots}}function parseManagedRenameRecoveryJournal(e){if(!e||typeof e!=`object`)throw Error(`Managed rename journal must be an object`);let t=e;if(t.version===2)return parseV2(t);if(t.version===1)return parseV1(t);throw Error(`Unsupported managed rename journal version: ${String(t.version)}`)}function readManagedRenameJournal(e){let t=managedRenameJournalPath(e);if(!existsSync(t))return null;try{let e=readFileSync(t,`utf-8`);return parseManagedRenameRecoveryJournal(JSON.parse(e))}catch(e){throw Error(`Managed rename journal at ${t} is corrupt: ${e instanceof Error?e.message:String(e)}`)}}function writeManagedRenameJournal(e,t){let s=managedRenameJournalPath(e);tracedMkdirSync(dirname(s),{recursive:!0});let g=`${s}.tmp`;tracedWriteFileSync(g,JSON.stringify(t,null,2),`utf-8`),tracedRenameSync(g,s)}function clearManagedRenameJournal(e){tracedRmSync(managedRenameJournalPath(e),{force:!0})}async function withManagedRenameRecovery(e,t,s){writeManagedRenameJournal(e,t);let g=await s();return clearManagedRenameJournal(e),g}function destinationsToCleanV1(e){return[e.destinationDocName]}function destinationsToCleanV2(e){return e.affectedDocs.map(e=>e.to)}function pruneEmptyAncestors(e,t){let s=resolve(t),g=`${s}${sep}`,S=dirname(e);for(;S.startsWith(g)&&S!==s;){let e;try{e=readdirSync(S)}catch(e){console.warn(`[managed-rename] pruneEmptyAncestors: cannot read ${S}:`,e);return}if(e.length>0)return;try{tracedRmdirSync(S)}catch(e){console.warn(`[managed-rename] pruneEmptyAncestors: cannot rmdir ${S}:`,e);return}S=dirname(S)}}function recoverPendingManagedRename(e){let t=readManagedRenameJournal(e);if(!t)return{recovered:!1,journal:null,restoredDocNames:[]};let s=new Set,g=[];for(let S of t.snapshots)try{let t=safeContentPath(S.docName,e);tracedMkdirSync(dirname(t),{recursive:!0}),tracedWriteFileSync(t,S.content,`utf-8`),s.add(S.docName)}catch(e){g.push({docName:S.docName,cause:e}),console.warn(`[managed-rename] Failed to restore ${S.docName}:`,e)}if(g.length>0){let e=g.map(e=>e.docName).join(`, `);console.warn(`[managed-rename] Recovery incomplete; keeping journal for retry (${e})`);let t=g.map(e=>e.cause instanceof Error?e.cause:Error(String(e.cause)));throw AggregateError(t,`Managed rename recovery incomplete; failed to restore: ${e}`)}let S=t.version===2?destinationsToCleanV2(t):destinationsToCleanV1(t),w=[];for(let t of S){if(s.has(t))continue;let g=safeContentPath(t,e);try{tracedRmSync(g,{force:!0}),pruneEmptyAncestors(g,e)}catch(e){existsSync(g)&&console.warn(`[managed-rename] Both source and destination files exist after partial recovery for ${t}`),console.warn(`[managed-rename] Recovery incomplete; failed to clean destination ${t}:`,e),w.push({destination:t,cause:e})}}if(w.length>0){let e=w.map(e=>e.destination).join(`, `),t=w.map(e=>e.cause instanceof Error?e.cause:Error(String(e.cause)));throw AggregateError(t,`Managed rename recovery incomplete; failed to clean destinations: ${e}`)}return clearManagedRenameJournal(e),{recovered:!0,journal:t,restoredDocNames:[...s].sort((e,t)=>e.localeCompare(t))}}var SeedPrerequisiteError=class extends Error{constructor(e){super(e),this.name=`SeedPrerequisiteError`}},SeedRootDirError=class extends Error{constructor(e){super(e),this.name=`SeedRootDirError`}};function assertEntryPathInProject(e,t){if(typeof t!=`string`||t===``)throw new SeedRootDirError(`entry path must be a non-empty string, got: ${typeof t}`);if(t.includes(`\0`))throw new SeedRootDirError(`entry path must not contain null bytes`);if(isAbsolute(t))throw new SeedRootDirError(`entry path must be relative, got: ${t}`);if(t.split(/[/\\]/).some(e=>e===`..`))throw new SeedRootDirError(`entry path must not contain '..' segments, got: ${t}`);let s=resolve(e),g=resolve(s,t);if(g!==s&&!g.startsWith(s+sep))throw new SeedRootDirError(`entry path must resolve inside the project directory, got: ${t}`);return assertNoSymlinkEscape$1(g,s),g}function assertNoSymlinkEscape$1(e,t){let s;try{s=realpathSync(t)}catch{return}let g=e;for(;;){if(existsSync(g)){let t;try{t=realpathSync(g)}catch(t){throw t.code===`ELOOP`?new SeedRootDirError(`entry path traverses a symlink cycle: ${e}`):t}if(t!==s&&!t.startsWith(s+sep))throw new SeedRootDirError(`entry path resolves outside the project directory via symlink: ${e}`);return}let t=dirname(g);if(t===g)throw new SeedRootDirError(`entry path has no existing ancestor inside the project directory: ${e}`);g=t}}const STARTER_FOLDERS=[{path:`external-sources`,title:`External Sources`,description:"Raw sources SAVED verbatim — not just cited. The actual fetched text of URLs, extracted text of PDFs, and copies of any referenced files live as .md files here, each with frontmatter carrying the original URL, access date, and any publisher / author metadata. Produced by `ingest` — applies whether the user shared the URL OR the agent fetched it itself to ground a knowledge-base claim. The KB is closed-loop: downstream docs cite local paths in this folder, never bare web URLs. Immutable after capture (update only to refresh a stale fetch). No analysis in these files — that belongs in `research/`. Downstream articles cite specific docs here by path so every claim is traceable to preserved evidence rather than a dead link.",tags:[`source`,`immutable`,`layer-ingest`],starterTemplate:`clip`},{path:`research`,title:`Research`,description:"Provisional analysis synthesizing external sources. Produced by the `research` tool. Every factual claim cites a specific doc in `external-sources/` (or an inline URL if ingest was skipped) — no unsourced assertions. Each article has `status: provisional` and a `sources:` frontmatter list of cited paths. Promoted to `articles/` via `consolidate` once the team decides the findings are stable.",tags:[`research`,`provisional`,`layer-research`],starterTemplate:`research-log`},{path:`articles`,title:`Articles`,description:"Canonical knowledge committed after a team decision. Produced by `consolidate`. Carries `status: canonical` plus a `supersedes:` chain tying back to the `research/` docs it replaces, which in turn cite `external-sources/` — the full evidence chain is traceable without leaving the repo. Source-of-truth for the domain; update only when a new decision supersedes it.",tags:[`article`,`canonical`,`layer-consolidate`],starterTemplate:`article`}],LOG_MD_TEMPLATE=`---
832
833
  title: Work Log
833
834
  description: Append-only audit trail. After each turn that creates, edits, or restructures content in the knowledge base, append one dated entry here (one per turn, not per file). Silent edits break the audit trail.
@@ -939,7 +940,7 @@ tags: [article, canonical]
939
940
  `)){let s=e.indexOf(`
940
941
  ---`,3);s!==-1&&(t=e.slice(s+4))}let s=[],g=new Map,S=createCodeFenceTracker();for(let e of t.split(`
941
942
  `)){if(S(e))continue;let t=e.match(/^(#{1,6})\s+(.+)$/);if(t){let e=t[2].trim(),S=getHeadingSlug(e,g);S&&s.push({level:t[1].length,text:e,slug:S})}}return s}function isSafeDocName(e){return!(e.includes(`..`)||e.startsWith(`/`)||e.includes(`\0`)||e.includes(`\\`))}function createApiExtension(e){let{hocuspocus:t,sessionManager:s,contentDir:g,serverInstanceId:S,getFileIndex:w,getAliasMap:E,enableTestRoutes:D=!1,shadowRef:O,flushGitCommit:k,getCurrentBranch:j,getDiskAckSVs:F,contentRoot:L,backlinkIndex:B,tagIndex:H,signalChannel:q,agentFocusBroadcaster:J,agentPresenceBroadcaster:Y,onAgentWrite:ee,getSyncEngine:te,localOpCliArgs:ne=[`open-knowledge`],projectDir:ae,getPrincipal:oe,contentFilter:se,installedAgentsProbe:ce,forceUnloadDocument:ue}=e,de=createConcurrencyGuard(),fe=null;function me(e){return[...e.entries()].map(([e,t])=>`${e}\0${t.canonicalPath}\0${t.size}\0${t.modified}\0${t.aliases.join(`\0`)}`).sort().join(`
942
- `)}let ge=createInstalledAgentsProbe({probe:ce??createOsProbe(process.platform)});function _e(e){if(!isSafeDocName(e))return null;let t=resolve(g),s=resolve(t,`${e}${getDocExtension(e)}`);return!s.startsWith(`${t}/`)&&s!==t?null:s}function ve(e){let t=_e(e);if(!t||!existsSync(t))return e;try{return extractPageTitle(readFileSync(t,`utf-8`),e)}catch{return e}}function ye(e,t){return t.has(e)?ve(e):e}let Ce={cluster:void 0,category:void 0,tags:void 0};function we(e){try{let s=t.documents.get(e);if(s){let e=readFmMap(s.getText(`source`).toString());if(Object.keys(e).length>0){let t=typeof e.cluster==`string`?e.cluster:void 0,s=typeof e.category==`string`?e.category:void 0,g;return Array.isArray(e.tags)?g=e.tags.length>0?e.tags:void 0:typeof e.tags==`string`&&e.tags&&(g=[e.tags]),{cluster:t,category:s,tags:g}}}}catch{}try{let t=_e(e);if(!t||!existsSync(t))return Ce;let{frontmatter:s}=stripFrontmatter(readFileSync(t,`utf-8`));return s?parseFrontmatterMetadata(s):Ce}catch{return Ce}}function Te(e,t){return t.has(e)?we(e):Ce}function De(e){if(B)try{if(B.getBacklinks(e).length>0)return;let t=performance$1.now(),s=findHubCandidates(e,w()),g=performance$1.now()-t;return g>5&&log$2.debug({docName:e,elapsedMs:g,candidateCount:s.length},`[orphan-hint] findHubCandidates slow`),s.length===0?void 0:[{type:`orphan`,parentCandidates:s,message:`This doc has no backlinks yet. To make it discoverable, consider linking from a parent hub doc (index/overview files in the folder tree): ${s.map(e=>`[[${e}]]`).join(`, `)}.`}]}catch(e){console.warn(`[orphan-hint] computeOrphanHints failed:`,e);return}}function je(e){return E?.().get(e)??e}function Me(e){try{return t.documents.get(e)?.connections.size??0}catch{return 0}}function Pe(){try{return t.documents.get(`__system__`)?.connections.size??0}catch{return 0}}function Ie(e,s){let g=`onStoreDocument-${e}`;(t.debouncer.isDebounced(g)?t.debouncer.executeNow(g):Promise.resolve()).then(()=>k?.()).catch(e=>{log$2.warn({err:e},`[${s}] post-write flush failed`)})}function Re(){let e=new Set;for(let[t,s]of w()){e.add(t);for(let t of s.aliases)e.add(t)}return e}function ze(){let e=Promise.resolve();return async function(t){let s=e,g=()=>{};e=new Promise(e=>{g=e}),await s;try{return await t()}finally{g()}}}let Be=ze();function Ve(e){return e instanceof Error?e instanceof ManagedRenameSourceNotFoundError?{status:404,error:e.message}:e instanceof ManagedRenameDestinationExistsError?{status:409,error:e.message}:e instanceof ManagedRenameSourceTypeMismatchError?{status:400,error:e.message}:e.message.startsWith(`Cannot rename missing document:`)||e.message.startsWith(`Cannot snapshot missing document:`)?{status:404,error:e.message}:e.message.startsWith(`symlink-escape:`)?{status:400,error:e.message}:e.message===`Managed rename requires backlink index support`?{status:503,error:e.message}:{status:500,error:`Failed to rename document`}:{status:500,error:`Failed to rename document`}}async function Ue(e){let g=new Map;for(let s of e){let e=t.documents.get(s);e&&g.set(s,e.getText(`source`).toString())}for(let t of e)await s.closeAllForDoc(t).catch(e=>{console.warn(`[file-ops] Failed to close agent session for ${t}:`,e)});for(let s of e){let e=t.documents.get(s);deleteReconciledBase(s),e&&(t.closeConnections(s),await(ue??t.unloadDocument.bind(t))(e))}return g}function We(e,t){for(let{fromDocName:s,toDocName:S}of e){let e=safeContentPath(S,g),w=t.get(s);typeof w==`string`&&tracedWriteFileSync(e,w,`utf-8`);let E=typeof w==`string`?w:existsSync(e)?readFileSync(e,`utf-8`):null;typeof E==`string`&&registerWrite(e,contentHash(E))}}function Ge(e,t){return e.map(e=>{let s=t.get(e);if(typeof s==`string`)return{docName:e,content:s};let S=safeContentPath(e,g);if(!existsSync(S))throw Error(`Cannot snapshot missing document: ${e}`);return{docName:e,content:readFileSync(S,`utf-8`)}})}function Ke(e){let s=t.documents.get(e);if(s)return s.getText(`source`).toString();let S=resolveContentEntryPath(g,`file`,e);return existsSync(S)?readFileSync(S,`utf-8`):null}function Xe(e,t){let s=resolveContentEntryPath(g,`file`,e);tracedMkdirSync(dirname(s),{recursive:!0}),tracedWriteFileSync(s,t,`utf-8`),registerWrite(s,contentHash(t)),setReconciledBase(e,t);let S=w();S instanceof Map&&updateFileIndex({kind:`update`,path:s,docName:e,content:t},S)}function $e(s,g){let S=t.documents.get(s);if(!S)throw Error(`Document is not loaded: ${s}`);let w={markdown:``,rewrites:0};return S.transact(()=>{let t=S.getXmlFragment(`default`),E=S.getText(`source`),D=E.toString();if(w=applyRenameMap(D,s,g),w.rewrites===0)return;let{body:O}=stripFrontmatter(w.markdown),k=e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:s}:void 0,j=mdManager.parseWithFallback(O,k),F=schema.nodeFromJSON(j);applyFastDiff(E,D,w.markdown),updateYFragment(S,t,F,{mapping:new Map,isOMark:new Map})},MANAGED_RENAME_ORIGIN),w}async function nt(e,s,S){return Be(async()=>withSpan(`rename.executeRewrites`,{attributes:{"rename.kind":S}},async E=>{if(!B)throw Error(`Managed rename requires backlink index support`);let D=resolveContentEntryPath(g,S,e),O=resolveContentEntryPath(g,S,s);if(D===O)return{renamed:[],rewrittenDocs:[]};if(!existsSync(D))throw new ManagedRenameSourceNotFoundError(S);if(existsSync(O))throw new ManagedRenameDestinationExistsError;let k=statSync(D);if(S===`file`&&!k.isFile()||S===`folder`&&!k.isDirectory())throw new ManagedRenameSourceTypeMismatchError(S);let j=(S===`file`?[stripDocExtension(e)]:listAffectedDocNames(w(),S,e)).map(t=>({from:t,to:S===`file`?stripDocExtension(s):remapDocNameForRename(t,S,e,s)}));if(E.setAttribute(`rename.affected_docs`,j.length),j.length===0)return{renamed:[],rewrittenDocs:[]};let F=buildRenameMap(j),L=j.map(({from:e,to:t})=>({fromDocName:e,toDocName:t})),H=new Set;for(let{from:e}of j)for(let t of B.getBacklinks(e))F.has(t.source)||H.add(t.source);let J=[...H].sort((e,t)=>e.localeCompare(t)),Y=new Map,ee=[],te=[];for(let e of[...F.keys(),...J]){if(Y.has(e))continue;if(!F.has(e)&&!existsSync(resolveContentEntryPath(g,`file`,e))){te.push(e);continue}let t=Ke(e);typeof t==`string`?(Y.set(e,t),F.has(e)||ee.push(e)):F.has(e)||te.push(e)}for(let{from:e}of j)if(typeof Y.get(e)!=`string`)throw Error(`Cannot rename missing document: ${e}`);let ne=createManagedRenameRecoveryJournal({fromPath:e,toPath:s,affectedDocs:[...j],snapshots:Ge([...Y.keys()],Y)}),oe=[];return await withManagedRenameRecovery(g,ne,async()=>{for(let e of te)B.deleteDocument(e);for(let e of ee){let s=t.documents.get(e)?$e(e,F):applyRenameMap(Y.get(e)??``,e,F);s.rewrites>0&&(Xe(e,s.markdown),oe.push({docName:e,rewrites:s.rewrites})),B.updateDocumentFromMarkdown(e,s.markdown)}let E=await Ue([...F.keys()]),D=resolveContentEntryPath(g,S,e),O=resolveContentEntryPath(g,S,s);await renameTrackedPathInGit(ae,D,O)||(tracedMkdirSync(dirname(O),{recursive:!0}),tracedRenameSync(D,O));let k=S===`file`&&isSupportedDocFile(s)?extname(s):null;for(let{from:e,to:t}of j){let s=getDocExtension(e);forgetDocExtension(e),registerDocExtension(t,k??s)}let L=[...j].sort((e,t)=>e.from.localeCompare(t.from));for(let{from:e,to:t}of L){let s=resolveContentEntryPath(g,`file`,e),S=resolveContentEntryPath(g,`file`,t),D=applyRenameMap(E.get(e)??Y.get(e)??readFileSync(S,`utf-8`),e,F);We([{fromDocName:e,toDocName:t}],new Map([[e,D.markdown]])),setReconciledBase(t,D.markdown);let O=w();O instanceof Map&&updateFileIndex({kind:`rename`,oldPath:s,newPath:S,oldDocName:e,newDocName:t,content:D.markdown},O),B.renameDocument(e,t,D.markdown),D.rewrites>0&&oe.push({docName:t,rewrites:D.rewrites})}}),B.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist managed rename cache for ${e} -> ${s}:`,t)}),q?.(`files`),q?.(`backlinks`),q?.(`graph`),oe.sort((e,t)=>e.docName.localeCompare(t.docName)),E.setAttribute(`rename.rewrite_count`,oe.length),{renamed:L,rewrittenDocs:oe}}))}function rt(e){let t=parseAgentBodyFields(e),s=t.writerId??`claude-1`;return{rawAgentId:t.rawAgentId,agentId:s,agentName:t.displayName,colorSeed:t.colorSeed??t.rawAgentId??s,clientName:t.clientName,clientVersion:t.clientVersion,label:t.label}}function it(e){return{principalId:oe?.()?.id,agentType:resolveAgentType(e.clientName),clientName:e.clientName,clientVersion:e.clientVersion,label:e.label}}function at(e){return e.kind===`value`?e.truncatedFrom===void 0?{response:{value:e.value},stored:e.value}:{response:{value:e.value,truncatedFrom:e.truncatedFrom,hint:`Summary truncated from ${e.truncatedFrom} chars to 80 (max 80).`},stored:e.value}:{stored:void 0}}function st(e){return{value:e.value}}function vt(e,t=!1){e.kind===`value`&&(incrementSummariesProvided(),e.truncatedFrom!==void 0&&!t&&incrementSummariesTruncated())}async function Tt(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=S.length>0?JSON.parse(S.toString()):{}}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}let E=typeof w.docName==`string`&&w.docName.length>0?w.docName:`test-doc`;if(!isSafeDocName(E)){json(g,400,{ok:!1,error:`Invalid docName`});return}let D=je(E);if(isSystemDoc(D)||isConfigDoc(D)){json(g,400,{ok:!1,error:`'${D}' is a reserved document name`});return}let{agentId:O,agentName:k,colorSeed:j,clientName:F,clientVersion:L,label:B}=rt(w),H=normalizeSummary(w.summary);if(H.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let q=await s.getSession(D,O,{displayName:k,colorSeed:j,clientName:F}),J=new Date().toISOString(),te=typeof w.content==`string`?w.content:`Hello from the agent! ${J}`,{response:ne,stored:ae}=at(H);try{let t=iconFromClientName(F),s=AGENT_ICON_COLORS[t]??colorFromSeed(j??O);Y?.setPresence(O,{displayName:k,icon:t,color:s,currentDoc:D,mode:`writing`,ts:Date.now()}),captureEffect(q.dc.document.getText(`source`),O,j,F),q.dc.document.transact(()=>{applyAgentMarkdownWrite(q.dc.document,`${te}\n`,`append`,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:D}:void 0),q.dc.document.getMap(`agent-flash`).set(O,{agentId:O,timestamp:Date.now(),type:`insert`,description:`Added (${k}): ${te.slice(0,50)}`})},q.origin),recordContributor(D,O,k,j,void 0,it({clientName:F,clientVersion:L,label:B}),ae),incrementAgentWriteCalls(),vt(H)}finally{Y?.touchMode(O,`idle`)}Ie(D,`agent-write`),ee?.(),json(g,200,{ok:!0,timestamp:J,...ne?{summary:ne}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-write] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-write] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Et(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=JSON.parse(S.toString())}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}if(!w||typeof w!=`object`||Array.isArray(w)){json(g,400,{ok:!1,error:`Body must be a JSON object`});return}let{markdown:E,position:D}=w;if(!E||typeof E!=`string`){json(g,400,{ok:!1,error:`markdown field required`});return}let O=D===`prepend`?`prepend`:D===`replace`?`replace`:`append`,k=w.docName,j=typeof k==`string`&&k.length>0?k:`test-doc`;if(!isSafeDocName(j)){json(g,400,{ok:!1,error:`Invalid docName`});return}let F=je(j);if(isSystemDoc(F)||isConfigDoc(F)){json(g,400,{ok:!1,error:`'${F}' is a reserved document name`});return}let{agentId:L,agentName:B,colorSeed:H,clientName:q,clientVersion:te,label:ne}=rt(w),ae=normalizeSummary(w.summary);if(ae.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let{response:oe,stored:se}=at(ae),ce=await s.getSession(F,L,{displayName:B,colorSeed:H,clientName:q}),ue=new Date().toISOString();try{let t=iconFromClientName(q),s=AGENT_ICON_COLORS[t]??colorFromSeed(H??L);Y?.setPresence(L,{displayName:B,icon:t,color:s,currentDoc:F,mode:`writing`,ts:Date.now()}),captureEffect(ce.dc.document.getText(`source`),L,H,q),ce.dc.document.transact(()=>{applyAgentMarkdownWrite(ce.dc.document,E,O,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:F}:void 0),ce.dc.document.getMap(`agent-flash`).set(L,{agentId:L,timestamp:Date.now(),type:`insert`,description:`Added (${B}): ${E.trim().slice(0,50)}`})},ce.origin),recordContributor(F,L,B,H,void 0,it({clientName:q,clientVersion:te,label:ne}),se),incrementAgentWriteCalls(),vt(ae)}finally{Y?.touchMode(L,`idle`)}Ie(F,`agent-write-md`),J?.setFocus(L,{agentName:B,currentDoc:F,writeKind:`write`,ts:Date.now()}),ee?.();let de=De(F),fe=Me(F),me=Pe();me===0&&hintEmittedCounter().add(1,{"shadow.writer":`agent`,"agent.type":resolveAgentType(q)}),json(g,200,{ok:!0,timestamp:ue,subscriberCount:fe,systemSubscriberCount:me,...de?{hints:de}:{},...oe?{summary:oe}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-write-md] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-write-md] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Dt(e,s){if(e.method!==`GET`){s.writeHead(405),s.end(`Method not allowed`);return}try{let S=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`docName`)||`test-doc`;if(!isSafeDocName(S)){json(s,400,{ok:!1,error:`Invalid docName`});return}let w=je(S);if(isSystemDoc(w)||isConfigDoc(w)){json(s,400,{ok:!1,error:`'${w}' is a reserved document name`});return}let E=t.documents.get(w);if(E){json(s,200,{ok:!0,docName:w,content:E.getText(`source`).toString()});return}if(!existsSync(resolveContentEntryPath(g,`file`,w))){json(s,404,{ok:!1,error:`Document not found: ${w}`});return}let D=await t.openDirectConnection(w);try{let e=D.document;if(!e){json(s,500,{ok:!1,error:`Document not available`});return}json(s,200,{ok:!0,docName:w,content:e.getText(`source`).toString()})}finally{await D.disconnect()}}catch(e){console.error(`[document-read]`,e),json(s,500,{ok:!1,error:`Internal server error`})}}async function jt(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let s=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`dir`);if(s)try{safeSubdir(g,s)}catch{json(t,400,{ok:!1,error:`Invalid directory parameter`});return}let S=w(),E=[];for(let[e,t]of S){if(s&&!e.startsWith(`${s}/`)&&e!==s)continue;let S=getDocExtension(e);E.push({kind:`document`,docName:e,docExt:S,size:t.size,modified:t.modified,isSymlink:!1,canonicalDocName:null,targetPath:null});for(let w of t.aliases){if(s&&!w.startsWith(`${s}/`)&&w!==s)continue;let D=relative(g,t.canonicalPath);E.push({kind:`document`,docName:w,docExt:S,size:t.size,modified:t.modified,isSymlink:!0,canonicalDocName:e,targetPath:D})}}let D=[];try{let e=me(S);fe?.signature!==e&&(fe={signature:e,assets:collectReferencedAssets({contentDir:g,fileIndex:S,readMarkdown:e=>{try{return readFileSync(e,`utf-8`)}catch{return null}},isExcluded:se?e=>se.isPathIgnored(e):void 0})}),D=fe?.assets??[]}catch(e){fe=null,console.warn(`[document-list] asset collection failed; returning documents only:`,e)}for(let e of D)s&&!e.path.startsWith(`${s}/`)&&e.path!==s||E.push({kind:`asset`,docName:e.path,docExt:e.assetExt,path:e.path,assetExt:e.assetExt,mediaKind:e.mediaKind,referencedBy:e.referencedBy,size:e.size,modified:e.modified,isSymlink:!1,canonicalDocName:null,targetPath:null});E.sort((e,t)=>e.docName.localeCompare(t.docName)),json(t,200,{ok:!0,documents:E})}catch(e){console.error(`[document-list]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Mt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!s){json(t,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(s)){json(t,400,{ok:!1,error:`Invalid docName`});return}json(t,200,{ok:!0,docName:s,backlinks:B.getBacklinks(s).map(e=>({source:e.source,anchor:e.anchor,title:ve(e.source),snippet:e.snippet}))})}catch(e){console.error(`[backlinks]`,e),json(t,500,{ok:!1,error:`Failed to read backlinks`})}}async function Ft(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docNames`);if(!s){json(t,400,{ok:!1,error:`Missing docNames parameter`});return}let g={};for(let e of s.split(`,`)){let t=e.trim();!t||!isSafeDocName(t)||(g[t]=B.getBacklinkCount(t))}json(t,200,{ok:!0,counts:g})}catch(e){console.error(`[backlink-counts]`,e),json(t,500,{ok:!1,error:`Failed to read backlink counts`})}}async function It(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!s){json(t,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(s)){json(t,400,{ok:!1,error:`Invalid docName`});return}let g=Re();json(t,200,{ok:!0,docName:s,forwardLinks:B.getForwardLinkEntries(s).map(e=>e.kind===`doc`?{kind:`doc`,docName:e.target,anchor:e.anchor,title:ye(e.target,g),snippet:e.snippet}:{kind:`external`,url:e.url,title:e.label??e.url,snippet:e.snippet})})}catch(e){console.error(`[forward-links]`,e),json(t,500,{ok:!1,error:`Failed to read forward links`})}}async function Lt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`),g=s.searchParams.get(`docName`);if(g&&!isSafeDocName(g)){json(t,400,{ok:!1,error:`Invalid docName`});return}let S=s.searchParams.get(`degrees`);if(S&&!g){json(t,400,{ok:!1,error:`docName is required when degrees is provided`});return}let w,E;if(S&&g){let e=Number.parseInt(S,10);if(!Number.isFinite(e)||e<0){json(t,400,{ok:!1,error:`degrees must be a non-negative integer`});return}({nodes:w,links:E}=B.getLinkGraphNeighborhood(g,e))}else ({nodes:w,links:E}=B.getLinkGraph());let D=Re();json(t,200,{ok:!0,nodes:w.map(e=>{if(e.kind===`doc`){let t=Te(e.docName,D);return{id:e.id,kind:`doc`,docName:e.docName,anchor:e.anchor??null,label:ye(e.docName,D),cluster:t.cluster??null,category:t.category??null,tags:t.tags??null}}return{id:e.id,kind:`external`,url:e.url,label:e.label??e.url}}),links:E})}catch(e){console.error(`[link-graph]`,e),json(t,500,{ok:!1,error:`Failed to read link graph`})}}async function Rt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`mode`)??`both`;if(!isOrphanMode(s)){json(t,400,{ok:!1,error:`Invalid orphan mode. Allowed values: incoming, outgoing, both`});return}json(t,200,{ok:!0,orphans:B.getOrphans([...w().keys()],s).map(e=>({docName:e,title:ve(e)}))})}catch(e){console.error(`[orphans]`,e),json(t,500,{ok:!1,error:`Failed to read orphan pages`})}}async function zt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`limit`),g=s?Number.parseInt(s,10):20,S=Number.isFinite(g)&&g>0?g:20,w=Re();json(t,200,{ok:!0,hubs:B.getHubs(S).map(e=>({docName:e.docName,title:ye(e.docName,w),count:e.count}))})}catch(e){console.error(`[hubs]`,e),json(t,500,{ok:!1,error:`Failed to read hub pages`})}}async function Bt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.getAll(`sourceDocName`);if(s.some(e=>e.length===0||!isSafeDocName(e))){json(t,400,{ok:!1,error:`Invalid sourceDocName`});return}let g=s.length?[...new Set(s.map(e=>je(e)))]:void 0;json(t,200,{ok:!0,deadLinks:B.getDeadLinks(Re(),g).map(e=>({target:e.target,sources:e.sources.map(e=>({source:e.source,title:ve(e.source),snippet:e.snippet}))}))})}catch(e){console.error(`[dead-links]`,e),json(t,500,{ok:!1,error:`Failed to read dead links`})}}async function Vt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!H){json(t,503,{ok:!1,error:`Tag index not configured`});return}try{json(t,200,{ok:!0,tags:H.getAllTags()})}catch(e){console.error(`[tags-list]`,e),json(t,500,{ok:!1,error:`Failed to read tags`})}}async function Ht(e,t,s){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!H){json(t,503,{ok:!1,error:`Tag index not configured`});return}let g;try{g=decodeURIComponent(s)}catch{json(t,400,{ok:!1,error:`Invalid tag name encoding`});return}if(!g){json(t,400,{ok:!1,error:`Missing tag name`});return}try{let e=H.getDocsForTagWithMatches(g).map(({docName:e,matchingTags:t})=>({docName:e,title:ve(e),matchingTags:t,snippet:null}));json(t,200,{ok:!0,name:g,docs:e})}catch(e){console.error(`[tags-for-name]`,e),json(t,500,{ok:!1,error:`Failed to read tag membership`})}}async function Ut(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=JSON.parse(S.toString())}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}if(!w||typeof w!=`object`||Array.isArray(w)){json(g,400,{ok:!1,error:`Body must be a JSON object`});return}let{find:E,replace:D,docName:O,offset:k}=w;if(typeof E!=`string`||E.length===0){json(g,400,{ok:!1,error:`find field required`});return}if(typeof D!=`string`){json(g,400,{ok:!1,error:`replace field required`});return}if(findLooksLikeFrontmatter(E)){agentPatchFmTouchCounter().add(1,{result:`rejected`}),json(g,400,{ok:!1,error:`Frontmatter edits are not supported via edit_document. Frontmatter editing through MCP is currently unavailable; use write_document with position:"replace" to rewrite the document including its YAML block.`});return}let j=Object.hasOwn(w,`offset`),F;if(j){if(typeof k!=`number`||!Number.isInteger(k)||k<0){json(g,400,{ok:!1,error:`offset must be a non-negative integer`});return}F=k}let L=typeof O==`string`&&O.length>0?O:`test-doc`;if(!isSafeDocName(L)){json(g,400,{ok:!1,error:`Invalid docName`});return}let B=je(L);if(isSystemDoc(B)||isConfigDoc(B)){json(g,400,{ok:!1,error:`'${B}' is a reserved document name`});return}let{agentId:H,agentName:q,colorSeed:te,clientName:ne,clientVersion:ae,label:oe}=rt(w),se=normalizeSummary(w.summary);if(se.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let ce=await s.getSession(B,H,{displayName:q,colorSeed:te,clientName:ne}),ue=new Date().toISOString(),de=!1,fe=!1,me=!1;try{let t=iconFromClientName(ne),s=AGENT_ICON_COLORS[t]??colorFromSeed(te??H);if(Y?.setPresence(H,{displayName:q,icon:t,color:s,currentDoc:B,mode:`writing`,ts:Date.now()}),captureEffect(ce.dc.document.getText(`source`),H,te,ne),ce.dc.document.transact(()=>{let{frontmatter:t,body:s}=stripFrontmatter(ce.dc.document.getText(`source`).toString()),g=prependFrontmatter(t,s),S=F==null?g.indexOf(E):g.slice(F,F+E.length)===E?F:-1;if(S===-1){console.warn(JSON.stringify({event:`agent-patch-find-mismatch`,"doc.name":B,findLength:E.length,replaceLength:D.length,hadOffset:F!=null})),incrementAgentPatchFindMismatches(),F==null?de=!0:fe=!0;return}if(S<t.length){me=!0;return}let{body:w}=stripFrontmatter(g.slice(0,S)+D+g.slice(S+E.length));applyAgentMarkdownWrite(ce.dc.document,w,`replace`,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:B}:void 0),ce.dc.document.getMap(`agent-flash`).set(H,{agentId:H,timestamp:Date.now(),type:`insert`,description:`Patched (${q}): ${E.slice(0,50)}`})},ce.origin),!de&&!fe&&!me){let{stored:e}=at(se);recordContributor(B,H,q,te,void 0,it({clientName:ne,clientVersion:ae,label:oe}),e),incrementAgentWriteCalls(),vt(se)}}finally{Y?.touchMode(H,`idle`)}if(fe){json(g,409,{ok:!1,error:`Target text no longer matches at the requested offset`});return}if(de){json(g,404,{ok:!1,error:`Text not found in document`});return}if(me){agentPatchFmTouchCounter().add(1,{result:`rejected`}),json(g,400,{ok:!1,error:`Frontmatter edits are not supported via edit_document. Frontmatter editing through MCP is currently unavailable; use write_document with position:"replace" to rewrite the document including its YAML block.`});return}Ie(B,`agent-patch`),J?.setFocus(H,{agentName:q,currentDoc:B,writeKind:`edit`,ts:Date.now()}),ee?.();let ge=Me(B),_e=Pe();_e===0&&hintEmittedCounter().add(1,{"shadow.writer":`agent`,"agent.type":resolveAgentType(ne)});let{response:ve}=at(se);json(g,200,{ok:!0,timestamp:ue,subscriberCount:ge,systemSubscriberCount:_e,...ve?{summary:ve}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-patch] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-patch] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Wt(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=S.length>0?JSON.parse(S.toString()):{}}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}let{agentId:E,agentName:D,colorSeed:O,clientName:k,clientVersion:j,label:F}=rt(w),L=typeof w.docName==`string`&&w.docName.length>0?w.docName:`test-doc`;if(!isSafeDocName(L)){json(g,400,{ok:!1,error:`Invalid docName`});return}let B=je(L);if(isSystemDoc(B)||isConfigDoc(B)){json(g,400,{ok:!1,error:`'${B}' is a reserved document name`});return}let H=typeof w.connectionId==`string`?w.connectionId:void 0;if(!H){json(g,400,{ok:!1,error:`connectionId required`});return}let q=w.scope,ee=q===`session`||q===`file`?`session`:`last`;if(!s.hasSession(B,H)){json(g,404,{ok:!1,error:`No active session for this connectionId and docName`});return}let te=await s.getSession(B,H),ne=!1;try{let t=iconFromClientName(k),s=AGENT_ICON_COLORS[t]??colorFromSeed(O??E);Y?.setPresence(E,{displayName:D,icon:t,color:s,currentDoc:B,mode:`writing`,ts:Date.now()}),ne=applyAgentUndo(te,ee,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:B}:void 0),ne&&recordContributor(B,H,D,O,void 0,it({clientName:k,clientVersion:j,label:F}))}finally{Y?.touchMode(E,`idle`)}ne&&Ie(B,`agent-undo`),J?.setFocus(H,{agentName:H,currentDoc:B,writeKind:`undo`,ts:Date.now()}),json(g,200,{ok:!0,docName:B,scope:ee,undone:ne})}catch(e){log$2.error({err:e},`[agent-undo] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Kt(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let g=validateAgentId(new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`agentId`));if(g===null){json(t,400,{ok:!1,error:`agentId required (alphanumeric/_/- only)`});return}json(t,200,{ok:!0,...listAgentActivity(s,g)})}catch(e){log$2.error({err:e},`[agent-activity] handler failed`),json(t,500,{ok:!1,error:`Internal server error`})}}async function $t(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let g=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),S=validateAgentId(g.searchParams.get(`agentId`)),w=g.searchParams.get(`docName`),E=g.searchParams.get(`stackIndex`);if(S===null){json(t,400,{ok:!1,error:`agentId required (alphanumeric/_/- only)`});return}if(!w||w.trim()===``){json(t,400,{ok:!1,error:`docName required`});return}if(!isSafeDocName(w)){json(t,400,{ok:!1,error:`Invalid docName`});return}let D=je(w);if(isSystemDoc(D)||isConfigDoc(D)){json(t,400,{ok:!1,error:`'${D}' is a reserved document name`});return}if(!E||Number.isNaN(Number(E))){json(t,400,{ok:!1,error:`stackIndex must be a number`});return}let O=Number(E);if(!Number.isInteger(O)||O<0){json(t,400,{ok:!1,error:`stackIndex must be a non-negative integer`});return}let k=s.getLiveSession(D,S);if(!k){json(t,404,{ok:!1,error:`No active session for this agentId and docName`});return}let j=k.um;if(O>=j.undoStack.length){json(t,404,{ok:!1,error:`stackIndex ${O} out of range (stack has ${j.undoStack.length} items)`});return}let F=j.undoStack[O];json(t,200,{ok:!0,diff:synthesizeStackItemDiffText(F,k.dc.document.getText(`source`),D),generatedAt:Date.now()})}catch(e){log$2.error({err:e},`[agent-burst-diff] handler failed`),json(t,500,{ok:!1,error:`Internal server error`})}}async function en(e,S){if(e.method!==`POST`){S.writeHead(405),S.end(`Method not allowed`);return}try{let w=je(new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`docName`)??`test-doc`),E;try{E=safeContentPath(w,g)}catch(e){console.error(`[test-reset] safeContentPath rejected docName:`,w,e),json(S,400,{ok:!1,error:`Invalid docName`});return}await s.closeAll(w),t.closeConnections(w);let D=`onStoreDocument-${w}`;t.debouncer.isDebounced(D)&&await t.debouncer.executeNow(D);let O=t.documents.get(w);O&&await(ue??t.unloadDocument.bind(t))(O),writeFileSync(E,``,`utf-8`),B&&(B.deleteDocument(w),B.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist cache after test-reset for ${w}:`,e)}),q?.(`backlinks`),q?.(`graph`)),q?.(`files`),json(S,200,{ok:!0})}catch(e){console.error(`[test-reset]`,e),json(S,500,{ok:!1,error:`Internal server error`})}}async function jr(e,t){if(e.method!==`POST`){t.writeHead(405),t.end(`Method not allowed`);return}try{if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}B.rebuildFromDisk(),B.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist cache after test-rescan-backlinks:`,e)}),q?.(`backlinks`),q?.(`graph`),json(t,200,{ok:!0})}catch(e){console.error(`[test-rescan-backlinks]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Mr(e,t){if(e.method!==`POST`){t.writeHead(405),t.end(`Method not allowed`);return}let s=O?.current;if(!s){json(t,400,{ok:!1,error:`Shadow repo not configured`});return}try{let g;try{g=await readBody(e)}catch{json(t,413,{ok:!1,error:`Payload too large`});return}let S=/^[a-zA-Z0-9_-]+$/,w=[],E,D={},O,k;if(g.length>0){let e;try{e=JSON.parse(g.toString())}catch{json(t,400,{ok:!1,error:`Invalid JSON`});return}D=e,typeof e.message==`string`&&e.message.trim()&&(E=e.message.replace(/[\r\n]/g,` `).slice(0,256)),Array.isArray(e.writers)&&(w=e.writers.map(e=>{let t=e.id??`unknown`;if(!S.test(t))throw Error(`Invalid writer id: ${t}`);return{id:t,name:(e.name??`unknown`).replace(/[\r\n]/g,``),email:(e.email??`noreply@openknowledge.local`).replace(/[\r\n]/g,``)}}));let s=e.principal;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=s;typeof e.name==`string`&&e.name.trim()&&(O=sanitizeGitIdentity(e.name.trim())),typeof e.email==`string`&&e.email.trim()&&(k=sanitizeGitIdentity(e.email.trim()))}}let{rawAgentId:j,agentId:F,agentName:B,clientName:H}=rt(D);w.length===0&&(w=j===void 0?[SERVICE_WRITER]:[{id:F,name:H?`${B} (${H})`:B,email:`${F}@openknowledge.local`}]);let q=L??`.`,J=await saveVersion(s,q,w);console.log(`[history] checkpoint ${J.checkpointRef}`);let Y=swapContributors(),ee;if(ae){let e=!1;try{await esm_default({baseDir:ae,timeout:{block:5e3}}).revparse([`--git-dir`]),e=!0}catch(e){console.warn(`[save-version] parent-git unavailable: ${e instanceof Error?e.message:String(e)}`)}if(e)try{ee=await withParentLock(async()=>{let e=esm_default({baseDir:ae,timeout:{block:15e3}}),t=(await e.tags([`--list`,`ok/v*`])).all.length+1,s=`ok/v${t}`,g=`openknowledge`,S=`noreply@openknowledge.local`;if(O&&k)g=O,S=k;else try{let e=await resolveGitIdentity(ae);e&&(g=e.name,S=e.email)}catch{}let w=[];for(let e of Y.values())if(e.writerId.startsWith(`agent-`)||e.writerId.startsWith(`principal-`)){let t=`${e.writerId}@openknowledge.local`;w.push(`Co-Authored-By: ${e.displayName} <${t}>`)}let D=formatCheckpointSubject(E??`Checkpoint v${t}`),j=w.length>0?`${D}\n\n${w.join(`
943
+ `)}let ge=createInstalledAgentsProbe({probe:ce??createOsProbe(process.platform)});function _e(e){if(!isSafeDocName(e))return null;let t=resolve(g),s=resolve(t,`${e}${getDocExtension(e)}`);return!s.startsWith(`${t}/`)&&s!==t?null:s}function ve(e){let t=_e(e);if(!t||!existsSync(t))return e;try{return extractPageTitle(readFileSync(t,`utf-8`),e)}catch{return e}}function ye(e,t){return t.has(e)?ve(e):e}let Ce={cluster:void 0,category:void 0,tags:void 0};function we(e){try{let s=t.documents.get(e);if(s){let e=readFmMap(s.getText(`source`).toString());if(Object.keys(e).length>0){let t=typeof e.cluster==`string`?e.cluster:void 0,s=typeof e.category==`string`?e.category:void 0,g;return Array.isArray(e.tags)?g=e.tags.length>0?e.tags:void 0:typeof e.tags==`string`&&e.tags&&(g=[e.tags]),{cluster:t,category:s,tags:g}}}}catch{}try{let t=_e(e);if(!t||!existsSync(t))return Ce;let{frontmatter:s}=stripFrontmatter(readFileSync(t,`utf-8`));return s?parseFrontmatterMetadata(s):Ce}catch{return Ce}}function Te(e,t){return t.has(e)?we(e):Ce}function De(e){if(B)try{if(B.getBacklinks(e).length>0)return;let t=performance$1.now(),s=findHubCandidates(e,w()),g=performance$1.now()-t;return g>5&&log$2.debug({docName:e,elapsedMs:g,candidateCount:s.length},`[orphan-hint] findHubCandidates slow`),s.length===0?void 0:[{type:`orphan`,parentCandidates:s,message:`This doc has no backlinks yet. To make it discoverable, consider linking from a parent hub doc (index/overview files in the folder tree): ${s.map(e=>`[[${e}]]`).join(`, `)}.`}]}catch(e){console.warn(`[orphan-hint] computeOrphanHints failed:`,e);return}}function je(e){return E?.().get(e)??e}function Me(e){try{return t.documents.get(e)?.connections.size??0}catch{return 0}}function Pe(){try{return t.documents.get(`__system__`)?.connections.size??0}catch{return 0}}function Ie(e,s){let g=`onStoreDocument-${e}`;(t.debouncer.isDebounced(g)?t.debouncer.executeNow(g):Promise.resolve()).then(()=>k?.()).catch(e=>{log$2.warn({err:e},`[${s}] post-write flush failed`)})}function Re(){let e=new Set;for(let[t,s]of w()){e.add(t);for(let t of s.aliases)e.add(t)}return e}function ze(){let e=Promise.resolve();return async function(t){let s=e,g=()=>{};e=new Promise(e=>{g=e}),await s;try{return await t()}finally{g()}}}let Be=ze();function Ve(e){return e instanceof Error?e instanceof ManagedRenameSourceNotFoundError?{status:404,error:e.message}:e instanceof ManagedRenameDestinationExistsError?{status:409,error:e.message}:e instanceof ManagedRenameSourceTypeMismatchError?{status:400,error:e.message}:e.message.startsWith(`Cannot rename missing document:`)||e.message.startsWith(`Cannot snapshot missing document:`)?{status:404,error:e.message}:e.message.startsWith(`symlink-escape:`)?{status:400,error:e.message}:e.message===`Managed rename requires backlink index support`?{status:503,error:e.message}:{status:500,error:`Failed to rename document`}:{status:500,error:`Failed to rename document`}}async function Ue(e){let g=new Map;for(let s of e){let e=t.documents.get(s);e&&g.set(s,e.getText(`source`).toString())}for(let t of e)await s.closeAllForDoc(t).catch(e=>{console.warn(`[file-ops] Failed to close agent session for ${t}:`,e)});for(let s of e){let e=t.documents.get(s);deleteReconciledBase(s),e&&(t.closeConnections(s),await(ue??t.unloadDocument.bind(t))(e))}return g}function We(e,t){for(let{fromDocName:s,toDocName:S}of e){let e=safeContentPath(S,g),w=t.get(s);typeof w==`string`&&tracedWriteFileSync(e,w,`utf-8`);let E=typeof w==`string`?w:existsSync(e)?readFileSync(e,`utf-8`):null;typeof E==`string`&&registerWrite(e,contentHash(E))}}function Ge(e,t){return e.map(e=>{let s=t.get(e);if(typeof s==`string`)return{docName:e,content:s};let S=safeContentPath(e,g);if(!existsSync(S))throw Error(`Cannot snapshot missing document: ${e}`);return{docName:e,content:readFileSync(S,`utf-8`)}})}function Ke(e){let s=t.documents.get(e);if(s)return s.getText(`source`).toString();let S=resolveContentEntryPath(g,`file`,e);return existsSync(S)?readFileSync(S,`utf-8`):null}function Xe(e,t){let s=resolveContentEntryPath(g,`file`,e);tracedMkdirSync(dirname(s),{recursive:!0}),tracedWriteFileSync(s,t,`utf-8`),registerWrite(s,contentHash(t)),setReconciledBase(e,t);let S=w();S instanceof Map&&updateFileIndex({kind:`update`,path:s,docName:e,content:t},S)}function $e(s,g){let S=t.documents.get(s);if(!S)throw Error(`Document is not loaded: ${s}`);let w={markdown:``,rewrites:0};return S.transact(()=>{let t=S.getXmlFragment(`default`),E=S.getText(`source`),D=E.toString();if(w=applyRenameMap(D,s,g),w.rewrites===0)return;let{body:O}=stripFrontmatter(w.markdown),k=e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:s}:void 0,j=mdManager.parseWithFallback(O,k),F=schema.nodeFromJSON(j);applyFastDiff(E,D,w.markdown),updateYFragment(S,t,F,{mapping:new Map,isOMark:new Map})},MANAGED_RENAME_ORIGIN),w}async function nt(e,s,S){return Be(async()=>withSpan(`rename.executeRewrites`,{attributes:{"rename.kind":S}},async E=>{if(!B)throw Error(`Managed rename requires backlink index support`);let D=resolveContentEntryPath(g,S,e),O=resolveContentEntryPath(g,S,s);if(D===O)return{renamed:[],rewrittenDocs:[]};if(!existsSync(D))throw new ManagedRenameSourceNotFoundError(S);if(existsSync(O))throw new ManagedRenameDestinationExistsError;let k=statSync(D);if(S===`file`&&!k.isFile()||S===`folder`&&!k.isDirectory())throw new ManagedRenameSourceTypeMismatchError(S);let j=(S===`file`?[stripDocExtension(e)]:listAffectedDocNames(w(),S,e)).map(t=>({from:t,to:S===`file`?stripDocExtension(s):remapDocNameForRename(t,S,e,s)}));if(E.setAttribute(`rename.affected_docs`,j.length),j.length===0)return{renamed:[],rewrittenDocs:[]};let F=buildRenameMap(j),L=j.map(({from:e,to:t})=>({fromDocName:e,toDocName:t})),H=new Set;for(let{from:e}of j)for(let t of B.getBacklinks(e))F.has(t.source)||H.add(t.source);let J=[...H].sort((e,t)=>e.localeCompare(t)),Y=new Map,ee=[],te=[];for(let e of[...F.keys(),...J]){if(Y.has(e))continue;if(!F.has(e)&&!existsSync(resolveContentEntryPath(g,`file`,e))){te.push(e);continue}let t=Ke(e);typeof t==`string`?(Y.set(e,t),F.has(e)||ee.push(e)):F.has(e)||te.push(e)}for(let{from:e}of j)if(typeof Y.get(e)!=`string`)throw Error(`Cannot rename missing document: ${e}`);let ne=createManagedRenameRecoveryJournal({fromPath:e,toPath:s,affectedDocs:[...j],snapshots:Ge([...Y.keys()],Y)}),oe=[];return await withManagedRenameRecovery(g,ne,async()=>{for(let e of te)B.deleteDocument(e);for(let e of ee){let s=t.documents.get(e)?$e(e,F):applyRenameMap(Y.get(e)??``,e,F);s.rewrites>0&&(Xe(e,s.markdown),oe.push({docName:e,rewrites:s.rewrites})),B.updateDocumentFromMarkdown(e,s.markdown)}let E=await Ue([...F.keys()]),D=resolveContentEntryPath(g,S,e),O=resolveContentEntryPath(g,S,s);await renameTrackedPathInGit(ae,D,O)||(tracedMkdirSync(dirname(O),{recursive:!0}),tracedRenameSync(D,O));let k=S===`file`&&isSupportedDocFile(s)?extname(s):null;for(let{from:e,to:t}of j){let s=getDocExtension(e);forgetDocExtension(e),registerDocExtension(t,k??s)}let L=[...j].sort((e,t)=>e.from.localeCompare(t.from));for(let{from:e,to:t}of L){let s=resolveContentEntryPath(g,`file`,e),S=resolveContentEntryPath(g,`file`,t),D=applyRenameMap(E.get(e)??Y.get(e)??readFileSync(S,`utf-8`),e,F);We([{fromDocName:e,toDocName:t}],new Map([[e,D.markdown]])),setReconciledBase(t,D.markdown);let O=w();O instanceof Map&&updateFileIndex({kind:`rename`,oldPath:s,newPath:S,oldDocName:e,newDocName:t,content:D.markdown},O),B.renameDocument(e,t,D.markdown),D.rewrites>0&&oe.push({docName:t,rewrites:D.rewrites})}}),B.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist managed rename cache for ${e} -> ${s}:`,t)}),q?.(`files`),q?.(`backlinks`),q?.(`graph`),oe.sort((e,t)=>e.docName.localeCompare(t.docName)),E.setAttribute(`rename.rewrite_count`,oe.length),{renamed:L,rewrittenDocs:oe}}))}function rt(e){let t=parseAgentBodyFields(e),s=t.writerId??`claude-1`;return{rawAgentId:t.rawAgentId,agentId:s,agentName:t.displayName,colorSeed:t.colorSeed??t.rawAgentId??s,clientName:t.clientName,clientVersion:t.clientVersion,label:t.label}}function it(e){return{principalId:oe?.()?.id,agentType:resolveAgentType(e.clientName),clientName:e.clientName,clientVersion:e.clientVersion,label:e.label}}function at(e){return e.kind===`value`?e.truncatedFrom===void 0?{response:{value:e.value},stored:e.value}:{response:{value:e.value,truncatedFrom:e.truncatedFrom,hint:`Summary truncated from ${e.truncatedFrom} chars to 80 (max 80).`},stored:e.value}:{stored:void 0}}function st(e){return{value:e.value}}function vt(e,t=!1){e.kind===`value`&&(incrementSummariesProvided(),e.truncatedFrom!==void 0&&!t&&incrementSummariesTruncated())}async function Tt(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=S.length>0?JSON.parse(S.toString()):{}}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}let E=typeof w.docName==`string`&&w.docName.length>0?w.docName:`test-doc`;if(!isSafeDocName(E)){json(g,400,{ok:!1,error:`Invalid docName`});return}let D=je(E);if(isSystemDoc(D)||isConfigDoc(D)){json(g,400,{ok:!1,error:`'${D}' is a reserved document name`});return}let{agentId:O,agentName:k,colorSeed:j,clientName:F,clientVersion:L,label:B}=rt(w),H=normalizeSummary(w.summary);if(H.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let q=await s.getSession(D,O,{displayName:k,colorSeed:j,clientName:F}),J=new Date().toISOString(),te=typeof w.content==`string`?w.content:`Hello from the agent! ${J}`,{response:ne,stored:ae}=at(H);try{let t=iconFromClientName(F),s=AGENT_ICON_COLORS[t]??colorFromSeed(j??O);Y?.setPresence(O,{displayName:k,icon:t,color:s,currentDoc:D,mode:`writing`,ts:Date.now()}),captureEffect(q.dc.document.getText(`source`),O,j,F),q.dc.document.transact(()=>{applyAgentMarkdownWrite(q.dc.document,`${te}\n`,`append`,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:D}:void 0),q.dc.document.getMap(`agent-flash`).set(O,{agentId:O,timestamp:Date.now(),type:`insert`,description:`Added (${k}): ${te.slice(0,50)}`})},q.origin),recordContributor(D,O,k,j,void 0,it({clientName:F,clientVersion:L,label:B}),ae),incrementAgentWriteCalls(),vt(H)}finally{Y?.touchMode(O,`idle`)}Ie(D,`agent-write`),ee?.(),json(g,200,{ok:!0,timestamp:J,...ne?{summary:ne}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-write] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-write] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Et(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=JSON.parse(S.toString())}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}if(!w||typeof w!=`object`||Array.isArray(w)){json(g,400,{ok:!1,error:`Body must be a JSON object`});return}let{markdown:E,position:D}=w;if(!E||typeof E!=`string`){json(g,400,{ok:!1,error:`markdown field required`});return}let O=D===`prepend`?`prepend`:D===`replace`?`replace`:`append`,k=w.docName,j=typeof k==`string`&&k.length>0?k:`test-doc`;if(!isSafeDocName(j)){json(g,400,{ok:!1,error:`Invalid docName`});return}let F=je(j);if(isSystemDoc(F)||isConfigDoc(F)){json(g,400,{ok:!1,error:`'${F}' is a reserved document name`});return}let{agentId:L,agentName:B,colorSeed:H,clientName:q,clientVersion:te,label:ne}=rt(w),ae=normalizeSummary(w.summary);if(ae.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let{response:oe,stored:se}=at(ae),ce=await s.getSession(F,L,{displayName:B,colorSeed:H,clientName:q}),ue=new Date().toISOString();try{let t=iconFromClientName(q),s=AGENT_ICON_COLORS[t]??colorFromSeed(H??L);Y?.setPresence(L,{displayName:B,icon:t,color:s,currentDoc:F,mode:`writing`,ts:Date.now()}),captureEffect(ce.dc.document.getText(`source`),L,H,q),ce.dc.document.transact(()=>{applyAgentMarkdownWrite(ce.dc.document,E,O,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:F}:void 0),ce.dc.document.getMap(`agent-flash`).set(L,{agentId:L,timestamp:Date.now(),type:`insert`,description:`Added (${B}): ${E.trim().slice(0,50)}`})},ce.origin),recordContributor(F,L,B,H,void 0,it({clientName:q,clientVersion:te,label:ne}),se),incrementAgentWriteCalls(),vt(ae)}finally{Y?.touchMode(L,`idle`)}Ie(F,`agent-write-md`),J?.setFocus(L,{agentName:B,currentDoc:F,writeKind:`write`,ts:Date.now()}),ee?.();let de=De(F),fe=Me(F),me=Pe();me===0&&hintEmittedCounter().add(1,{"shadow.writer":`agent`,"agent.type":resolveAgentType(q)}),json(g,200,{ok:!0,timestamp:ue,subscriberCount:fe,systemSubscriberCount:me,...de?{hints:de}:{},...oe?{summary:oe}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-write-md] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-write-md] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Dt(e,s){if(e.method!==`GET`){s.writeHead(405),s.end(`Method not allowed`);return}try{let S=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`docName`)||`test-doc`;if(!isSafeDocName(S)){json(s,400,{ok:!1,error:`Invalid docName`});return}let w=je(S);if(isSystemDoc(w)||isConfigDoc(w)){json(s,400,{ok:!1,error:`'${w}' is a reserved document name`});return}let E=t.documents.get(w);if(E){json(s,200,{ok:!0,docName:w,content:E.getText(`source`).toString()});return}if(!existsSync(resolveContentEntryPath(g,`file`,w))){json(s,404,{ok:!1,error:`Document not found: ${w}`});return}let D=await t.openDirectConnection(w);try{let e=D.document;if(!e){json(s,500,{ok:!1,error:`Document not available`});return}json(s,200,{ok:!0,docName:w,content:e.getText(`source`).toString()})}finally{await D.disconnect()}}catch(e){console.error(`[document-read]`,e),json(s,500,{ok:!1,error:`Internal server error`})}}async function jt(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let s=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`dir`);if(s)try{safeSubdir(g,s)}catch{json(t,400,{ok:!1,error:`Invalid directory parameter`});return}let S=w(),E=[];for(let[e,t]of S){if(s&&!e.startsWith(`${s}/`)&&e!==s)continue;let S=getDocExtension(e);E.push({kind:`document`,docName:e,docExt:S,size:t.size,modified:t.modified,isSymlink:!1,canonicalDocName:null,targetPath:null});for(let w of t.aliases){if(s&&!w.startsWith(`${s}/`)&&w!==s)continue;let D=relative(g,t.canonicalPath);E.push({kind:`document`,docName:w,docExt:S,size:t.size,modified:t.modified,isSymlink:!0,canonicalDocName:e,targetPath:D})}}let D=[];try{let e=me(S);fe?.signature!==e&&(fe={signature:e,assets:collectReferencedAssets({contentDir:g,fileIndex:S,readMarkdown:e=>{try{return readFileSync(e,`utf-8`)}catch{return null}},isExcluded:se?e=>se.isPathIgnored(e):void 0})}),D=fe?.assets??[]}catch(e){fe=null,console.warn(`[document-list] asset collection failed; returning documents only:`,e)}for(let e of D)s&&!e.path.startsWith(`${s}/`)&&e.path!==s||E.push({kind:`asset`,docName:e.path,docExt:e.assetExt,path:e.path,assetExt:e.assetExt,mediaKind:e.mediaKind,referencedBy:e.referencedBy,size:e.size,modified:e.modified,isSymlink:!1,canonicalDocName:null,targetPath:null});E.sort((e,t)=>e.docName.localeCompare(t.docName)),json(t,200,{ok:!0,documents:E})}catch(e){console.error(`[document-list]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Mt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!s){json(t,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(s)){json(t,400,{ok:!1,error:`Invalid docName`});return}json(t,200,{ok:!0,docName:s,backlinks:B.getBacklinks(s).map(e=>({source:e.source,anchor:e.anchor,title:ve(e.source),snippet:e.snippet}))})}catch(e){console.error(`[backlinks]`,e),json(t,500,{ok:!1,error:`Failed to read backlinks`})}}async function Ft(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docNames`);if(!s){json(t,400,{ok:!1,error:`Missing docNames parameter`});return}let g={};for(let e of s.split(`,`)){let t=e.trim();!t||!isSafeDocName(t)||(g[t]=B.getBacklinkCount(t))}json(t,200,{ok:!0,counts:g})}catch(e){console.error(`[backlink-counts]`,e),json(t,500,{ok:!1,error:`Failed to read backlink counts`})}}async function It(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!s){json(t,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(s)){json(t,400,{ok:!1,error:`Invalid docName`});return}let g=Re();json(t,200,{ok:!0,docName:s,forwardLinks:B.getForwardLinkEntries(s).map(e=>e.kind===`doc`?{kind:`doc`,docName:e.target,anchor:e.anchor,title:ye(e.target,g),snippet:e.snippet}:{kind:`external`,url:e.url,title:e.label??e.url,snippet:e.snippet})})}catch(e){console.error(`[forward-links]`,e),json(t,500,{ok:!1,error:`Failed to read forward links`})}}async function Lt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`),g=s.searchParams.get(`docName`);if(g&&!isSafeDocName(g)){json(t,400,{ok:!1,error:`Invalid docName`});return}let S=s.searchParams.get(`degrees`);if(S&&!g){json(t,400,{ok:!1,error:`docName is required when degrees is provided`});return}let w,E;if(S&&g){let e=Number.parseInt(S,10);if(!Number.isFinite(e)||e<0){json(t,400,{ok:!1,error:`degrees must be a non-negative integer`});return}({nodes:w,links:E}=B.getLinkGraphNeighborhood(g,e))}else ({nodes:w,links:E}=B.getLinkGraph());let D=Re();json(t,200,{ok:!0,nodes:w.map(e=>{if(e.kind===`doc`){let t=Te(e.docName,D);return{id:e.id,kind:`doc`,docName:e.docName,anchor:e.anchor??null,label:ye(e.docName,D),cluster:t.cluster??null,category:t.category??null,tags:t.tags??null}}return{id:e.id,kind:`external`,url:e.url,label:e.label??e.url}}),links:E})}catch(e){console.error(`[link-graph]`,e),json(t,500,{ok:!1,error:`Failed to read link graph`})}}async function Rt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`mode`)??`both`;if(!isOrphanMode(s)){json(t,400,{ok:!1,error:`Invalid orphan mode. Allowed values: incoming, outgoing, both`});return}json(t,200,{ok:!0,orphans:B.getOrphans([...w().keys()],s).map(e=>({docName:e,title:ve(e)}))})}catch(e){console.error(`[orphans]`,e),json(t,500,{ok:!1,error:`Failed to read orphan pages`})}}async function zt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`limit`),g=s?Number.parseInt(s,10):20,S=Number.isFinite(g)&&g>0?g:20,w=Re();json(t,200,{ok:!0,hubs:B.getHubs(S).map(e=>({docName:e.docName,title:ye(e.docName,w),count:e.count}))})}catch(e){console.error(`[hubs]`,e),json(t,500,{ok:!1,error:`Failed to read hub pages`})}}async function Bt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.getAll(`sourceDocName`);if(s.some(e=>e.length===0||!isSafeDocName(e))){json(t,400,{ok:!1,error:`Invalid sourceDocName`});return}let g=s.length?[...new Set(s.map(e=>je(e)))]:void 0;json(t,200,{ok:!0,deadLinks:B.getDeadLinks(Re(),g).map(e=>({target:e.target,sources:e.sources.map(e=>({source:e.source,title:ve(e.source),snippet:e.snippet}))}))})}catch(e){console.error(`[dead-links]`,e),json(t,500,{ok:!1,error:`Failed to read dead links`})}}async function Vt(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!H){json(t,503,{ok:!1,error:`Tag index not configured`});return}try{json(t,200,{ok:!0,tags:H.getAllTags()})}catch(e){console.error(`[tags-list]`,e),json(t,500,{ok:!1,error:`Failed to read tags`})}}async function Ht(e,t,s){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}if(!H){json(t,503,{ok:!1,error:`Tag index not configured`});return}let g;try{g=decodeURIComponent(s)}catch{json(t,400,{ok:!1,error:`Invalid tag name encoding`});return}if(!g){json(t,400,{ok:!1,error:`Missing tag name`});return}try{let e=H.getDocsForTagWithMatches(g).map(({docName:e,matchingTags:t})=>({docName:e,title:ve(e),matchingTags:t,snippet:null}));json(t,200,{ok:!0,name:g,docs:e})}catch(e){console.error(`[tags-for-name]`,e),json(t,500,{ok:!1,error:`Failed to read tag membership`})}}async function Ut(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=JSON.parse(S.toString())}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}if(!w||typeof w!=`object`||Array.isArray(w)){json(g,400,{ok:!1,error:`Body must be a JSON object`});return}let{find:E,replace:D,docName:O,offset:k}=w;if(typeof E!=`string`||E.length===0){json(g,400,{ok:!1,error:`find field required`});return}if(typeof D!=`string`){json(g,400,{ok:!1,error:`replace field required`});return}if(findLooksLikeFrontmatter(E)){agentPatchFmTouchCounter().add(1,{result:`rejected`}),json(g,400,{ok:!1,error:`Frontmatter edits are not supported via edit_document. Frontmatter editing through MCP is currently unavailable; use write_document with position:"replace" to rewrite the document including its YAML block.`});return}let j=Object.hasOwn(w,`offset`),F;if(j){if(typeof k!=`number`||!Number.isInteger(k)||k<0){json(g,400,{ok:!1,error:`offset must be a non-negative integer`});return}F=k}let L=typeof O==`string`&&O.length>0?O:`test-doc`;if(!isSafeDocName(L)){json(g,400,{ok:!1,error:`Invalid docName`});return}let B=je(L);if(isSystemDoc(B)||isConfigDoc(B)){json(g,400,{ok:!1,error:`'${B}' is a reserved document name`});return}let{agentId:H,agentName:q,colorSeed:te,clientName:ne,clientVersion:ae,label:oe}=rt(w),se=normalizeSummary(w.summary);if(se.kind===`invalid`){json(g,400,{ok:!1,error:`summary must be a string`});return}let ce=await s.getSession(B,H,{displayName:q,colorSeed:te,clientName:ne}),ue=new Date().toISOString(),de=!1,fe=!1,me=!1;try{let t=iconFromClientName(ne),s=AGENT_ICON_COLORS[t]??colorFromSeed(te??H);if(Y?.setPresence(H,{displayName:q,icon:t,color:s,currentDoc:B,mode:`writing`,ts:Date.now()}),captureEffect(ce.dc.document.getText(`source`),H,te,ne),ce.dc.document.transact(()=>{let{frontmatter:t,body:s}=stripFrontmatter(ce.dc.document.getText(`source`).toString()),g=prependFrontmatter(t,s),S=F==null?g.indexOf(E):g.slice(F,F+E.length)===E?F:-1;if(S===-1){console.warn(JSON.stringify({event:`agent-patch-find-mismatch`,"doc.name":B,findLength:E.length,replaceLength:D.length,hadOffset:F!=null})),incrementAgentPatchFindMismatches(),F==null?de=!0:fe=!0;return}if(S<t.length){me=!0;return}let{body:w}=stripFrontmatter(g.slice(0,S)+D+g.slice(S+E.length));applyAgentMarkdownWrite(ce.dc.document,w,`replace`,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:B}:void 0),ce.dc.document.getMap(`agent-flash`).set(H,{agentId:H,timestamp:Date.now(),type:`insert`,description:`Patched (${q}): ${E.slice(0,50)}`})},ce.origin),!de&&!fe&&!me){let{stored:e}=at(se);recordContributor(B,H,q,te,void 0,it({clientName:ne,clientVersion:ae,label:oe}),e),incrementAgentWriteCalls(),vt(se)}}finally{Y?.touchMode(H,`idle`)}if(fe){json(g,409,{ok:!1,error:`Target text no longer matches at the requested offset`});return}if(de){json(g,404,{ok:!1,error:`Text not found in document`});return}if(me){agentPatchFmTouchCounter().add(1,{result:`rejected`}),json(g,400,{ok:!1,error:`Frontmatter edits are not supported via edit_document. Frontmatter editing through MCP is currently unavailable; use write_document with position:"replace" to rewrite the document including its YAML block.`});return}Ie(B,`agent-patch`),J?.setFocus(H,{agentName:q,currentDoc:B,writeKind:`edit`,ts:Date.now()}),ee?.();let ge=Me(B),_e=Pe();_e===0&&hintEmittedCounter().add(1,{"shadow.writer":`agent`,"agent.type":resolveAgentType(ne)});let{response:ve}=at(se);json(g,200,{ok:!0,timestamp:ue,subscriberCount:ge,systemSubscriberCount:_e,...ve?{summary:ve}:{}})}catch(e){if(e instanceof AgentSessionCapacityError){log$2.warn({err:e},`[agent-patch] session capacity exhausted`),json(g,503,{ok:!1,error:`too-many-agent-sessions`});return}log$2.error({err:e},`[agent-patch] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Wt(t,g){if(t.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}try{let S;try{S=await readBody(t)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let w;try{w=S.length>0?JSON.parse(S.toString()):{}}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}let{agentId:E,agentName:D,colorSeed:O,clientName:k,clientVersion:j,label:F}=rt(w),L=typeof w.docName==`string`&&w.docName.length>0?w.docName:`test-doc`;if(!isSafeDocName(L)){json(g,400,{ok:!1,error:`Invalid docName`});return}let B=je(L);if(isSystemDoc(B)||isConfigDoc(B)){json(g,400,{ok:!1,error:`'${B}' is a reserved document name`});return}let H=typeof w.connectionId==`string`?w.connectionId:void 0;if(!H){json(g,400,{ok:!1,error:`connectionId required`});return}let q=w.scope,ee=q===`session`||q===`file`?`session`:`last`;if(!s.hasSession(B,H)){json(g,404,{ok:!1,error:`No active session for this connectionId and docName`});return}let te=await s.getSession(B,H),ne=!1;try{let t=iconFromClientName(k),s=AGENT_ICON_COLORS[t]??colorFromSeed(O??E);Y?.setPresence(E,{displayName:D,icon:t,color:s,currentDoc:B,mode:`writing`,ts:Date.now()}),ne=applyAgentUndo(te,ee,e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:B}:void 0),ne&&recordContributor(B,H,D,O,void 0,it({clientName:k,clientVersion:j,label:F}))}finally{Y?.touchMode(E,`idle`)}ne&&Ie(B,`agent-undo`),J?.setFocus(H,{agentName:H,currentDoc:B,writeKind:`undo`,ts:Date.now()}),json(g,200,{ok:!0,docName:B,scope:ee,undone:ne})}catch(e){log$2.error({err:e},`[agent-undo] handler failed`),json(g,500,{ok:!1,error:`Internal server error`})}}async function Kt(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let g=validateAgentId(new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`agentId`));if(g===null){json(t,400,{ok:!1,error:`agentId required (alphanumeric/_/- only)`});return}json(t,200,{ok:!0,...listAgentActivity(s,g)})}catch(e){log$2.error({err:e},`[agent-activity] handler failed`),json(t,500,{ok:!1,error:`Internal server error`})}}async function $t(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}try{let g=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),S=validateAgentId(g.searchParams.get(`agentId`)),w=g.searchParams.get(`docName`),E=g.searchParams.get(`stackIndex`);if(S===null){json(t,400,{ok:!1,error:`agentId required (alphanumeric/_/- only)`});return}if(!w||w.trim()===``){json(t,400,{ok:!1,error:`docName required`});return}if(!isSafeDocName(w)){json(t,400,{ok:!1,error:`Invalid docName`});return}let D=je(w);if(isSystemDoc(D)||isConfigDoc(D)){json(t,400,{ok:!1,error:`'${D}' is a reserved document name`});return}if(!E||Number.isNaN(Number(E))){json(t,400,{ok:!1,error:`stackIndex must be a number`});return}let O=Number(E);if(!Number.isInteger(O)||O<0){json(t,400,{ok:!1,error:`stackIndex must be a non-negative integer`});return}let k=s.getLiveSession(D,S);if(!k){json(t,404,{ok:!1,error:`No active session for this agentId and docName`});return}let j=k.um;if(O>=j.undoStack.length){json(t,404,{ok:!1,error:`stackIndex ${O} out of range (stack has ${j.undoStack.length} items)`});return}let F=j.undoStack[O];json(t,200,{ok:!0,diff:synthesizeStackItemDiffText(F,k.dc.document.getText(`source`),D),generatedAt:Date.now()})}catch(e){log$2.error({err:e},`[agent-burst-diff] handler failed`),json(t,500,{ok:!1,error:`Internal server error`})}}async function en(e,S){if(e.method!==`POST`){S.writeHead(405),S.end(`Method not allowed`);return}try{let w=je(new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`docName`)??`test-doc`),E;try{E=safeContentPath(w,g)}catch(e){console.error(`[test-reset] safeContentPath rejected docName:`,w,e),json(S,400,{ok:!1,error:`Invalid docName`});return}await s.closeAll(w),t.closeConnections(w);let D=`onStoreDocument-${w}`;t.debouncer.isDebounced(D)&&await t.debouncer.executeNow(D);let O=t.documents.get(w);O&&await(ue??t.unloadDocument.bind(t))(O),writeFileSync(E,``,`utf-8`),B&&(B.deleteDocument(w),B.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist cache after test-reset for ${w}:`,e)}),q?.(`backlinks`),q?.(`graph`)),q?.(`files`),json(S,200,{ok:!0})}catch(e){console.error(`[test-reset]`,e),json(S,500,{ok:!1,error:`Internal server error`})}}async function jr(e,t){if(e.method!==`POST`){t.writeHead(405),t.end(`Method not allowed`);return}try{if(!B){json(t,503,{ok:!1,error:`Backlink index not configured`});return}await B.rebuildFromDisk(),B.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist cache after test-rescan-backlinks:`,e)}),q?.(`backlinks`),q?.(`graph`),json(t,200,{ok:!0})}catch(e){console.error(`[test-rescan-backlinks]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Mr(e,t){if(e.method!==`POST`){t.writeHead(405),t.end(`Method not allowed`);return}let s=O?.current;if(!s){json(t,400,{ok:!1,error:`Shadow repo not configured`});return}try{let g;try{g=await readBody(e)}catch{json(t,413,{ok:!1,error:`Payload too large`});return}let S=/^[a-zA-Z0-9_-]+$/,w=[],E,D={},O,k;if(g.length>0){let e;try{e=JSON.parse(g.toString())}catch{json(t,400,{ok:!1,error:`Invalid JSON`});return}D=e,typeof e.message==`string`&&e.message.trim()&&(E=e.message.replace(/[\r\n]/g,` `).slice(0,256)),Array.isArray(e.writers)&&(w=e.writers.map(e=>{let t=e.id??`unknown`;if(!S.test(t))throw Error(`Invalid writer id: ${t}`);return{id:t,name:(e.name??`unknown`).replace(/[\r\n]/g,``),email:(e.email??`noreply@openknowledge.local`).replace(/[\r\n]/g,``)}}));let s=e.principal;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=s;typeof e.name==`string`&&e.name.trim()&&(O=sanitizeGitIdentity(e.name.trim())),typeof e.email==`string`&&e.email.trim()&&(k=sanitizeGitIdentity(e.email.trim()))}}let{rawAgentId:j,agentId:F,agentName:B,clientName:H}=rt(D);w.length===0&&(w=j===void 0?[SERVICE_WRITER]:[{id:F,name:H?`${B} (${H})`:B,email:`${F}@openknowledge.local`}]);let q=L??`.`,J=await saveVersion(s,q,w);console.log(`[history] checkpoint ${J.checkpointRef}`);let Y=swapContributors(),ee;if(ae){let e=!1;try{await esm_default({baseDir:ae,timeout:{block:5e3}}).revparse([`--git-dir`]),e=!0}catch(e){console.warn(`[save-version] parent-git unavailable: ${e instanceof Error?e.message:String(e)}`)}if(e)try{ee=await withParentLock(async()=>{let e=esm_default({baseDir:ae,timeout:{block:15e3}}),t=(await e.tags([`--list`,`ok/v*`])).all.length+1,s=`ok/v${t}`,g=`openknowledge`,S=`noreply@openknowledge.local`;if(O&&k)g=O,S=k;else try{let e=await resolveGitIdentity(ae);e&&(g=e.name,S=e.email)}catch{}let w=[];for(let e of Y.values())if(e.writerId.startsWith(`agent-`)||e.writerId.startsWith(`principal-`)){let t=`${e.writerId}@openknowledge.local`;w.push(`Co-Authored-By: ${e.displayName} <${t}>`)}let D=formatCheckpointSubject(E??`Checkpoint v${t}`),j=w.length>0?`${D}\n\n${w.join(`
943
944
  `)}`:D,F=q||`.`;return await e.add(F),await e.env({GIT_AUTHOR_NAME:g,GIT_AUTHOR_EMAIL:S,GIT_COMMITTER_NAME:g,GIT_COMMITTER_EMAIL:S}).commit(j,[`--allow-empty`]),await e.addTag(s),console.log(`[checkpoint] parent-git commit + tag ${s}`),s})}catch(e){console.warn(`[checkpoint] parent-git commit failed (non-fatal):`,e)}}json(t,200,{ok:!0,checkpointRef:J.checkpointRef,...ee?{versionTag:ee}:{}})}catch(e){console.error(`[save-version]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Fr(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}let s=O?.current;if(!s){json(t,400,{ok:!1,error:`Shadow repo not configured`});return}let g=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),S=g.searchParams.get(`docName`)??``,w=g.searchParams.get(`branch`)??j?.()??`main`;if(!S){json(t,400,{ok:!1,error:`docName query parameter is required`});return}if(w.includes(`..`)||!/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/.test(w)){json(t,400,{ok:!1,error:`Invalid branch name`});return}let E=L??`.`,D=safeDocPath(S,E);if(`error`in D){json(t,400,{ok:!1,error:D.error});return}let k=Number(g.searchParams.get(`limit`)??`50`),F=Number(g.searchParams.get(`offset`)??`0`),B=Math.min(200,Number.isFinite(k)?k:50),H=Number.isFinite(F)?F:0,q=g.searchParams.get(`type`)??void 0,J=g.searchParams.get(`author`)??void 0,Y=g.searchParams.get(`excludeAuthor`)??void 0,ee=Date.now();try{let e=await getDocumentHistory(s,{docName:S,branch:w,limit:B,offset:H,type:q,author:J,excludeAuthor:Y},E),g=Date.now()-ee;console.log(`[timeline] query docName=${S} entries=${e.entries.length} duration=${g}ms`),json(t,200,{ok:!0,...e})}catch(e){console.error(`[shadow]`,e),json(t,500,{ok:!1,error:e instanceof Error?e.message:String(e)})}}async function Ir(e,t,s){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}let g=O?.current;if(!g){json(t,400,{ok:!1,error:`Shadow repo not configured`});return}let S=safeDocPath(new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`docName`)??``,L??`.`);if(`error`in S){json(t,400,{ok:!1,error:S.error});return}let w=S.path,E=shadowGit(g);if(!/^[0-9a-f]{40}$/i.test(s)){json(t,400,{ok:!1,error:`Invalid commit SHA`});return}try{try{await E.raw(`cat-file`,`-e`,`${s}:${w}`)}catch{json(t,404,{ok:!1,error:`Document did not exist at this version`});return}let e=await E.raw(`show`,`${s}:${w}`),[g=``,S=``]=(await E.raw(`log`,`-1`,`--format=%aI%x00%an`,s)).trim().split(`\0`);json(t,200,{ok:!0,sha:s,content:e,timestamp:g,author:S})}catch(e){console.error(`[shadow-version]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}async function Lr(e,s){if(e.method!==`GET`){s.writeHead(405),s.end(`Method not allowed`);return}let g=O?.current;if(!g){json(s,400,{ok:!1,error:`Shadow repo not configured`});return}let S=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),w=S.searchParams.get(`docName`)??``,E=S.searchParams.get(`from`)??``,D=S.searchParams.get(`to`)??``;if(!D||!/^[0-9a-f]{40}$/i.test(D)){json(s,400,{ok:!1,error:`'to' must be a valid 40-char commit SHA`});return}let k=safeDocPath(w,L??`.`);if(`error`in k){json(s,400,{ok:!1,error:k.error});return}let j=k.path,F=shadowGit(g);try{let e;try{e=await F.raw(`show`,`${D}:${j}`)}catch{json(s,404,{ok:!1,error:`Document did not exist at the target version`});return}let g;if(E&&/^[0-9a-f]{40}$/i.test(E))try{g=await F.raw(`show`,`${E}:${j}`)}catch{json(s,404,{ok:!1,error:`Document did not exist at the source version`});return}else{let e=t.documents.get(w);if(!e){json(s,409,{ok:!1,error:`Document is not currently open — open it in the editor first`});return}g=e.getText(`source`).toString()}let S=stripFrontmatter(g).body,O=stripFrontmatter(e).body,k=diffLines(S,O),L=[],B=0,H=0;for(let e of k){let t=e.value.replace(/\n$/,``).split(`
944
945
  `),s=e.added?`added`:e.removed?`removed`:`unchanged`;for(let e of t)L.push({type:s,text:e});e.added&&(B+=t.length),e.removed&&(H+=t.length)}json(s,200,{ok:!0,lines:L,additions:B,deletions:H})}catch(e){console.error(`[diff]`,e),json(s,500,{ok:!1,error:`Internal server error`})}}async function zr(s,g){if(s.method!==`POST`){g.writeHead(405),g.end(`Method not allowed`);return}let S=O?.current;if(!S){json(g,400,{ok:!1,error:`Shadow repo not configured`});return}let w;try{w=await readBody(s)}catch{json(g,413,{ok:!1,error:`Payload too large`});return}let E;try{E=w.length>0?JSON.parse(w.toString()):{}}catch{json(g,400,{ok:!1,error:`Invalid JSON`});return}if(!E||typeof E!=`object`||Array.isArray(E)){json(g,400,{ok:!1,error:`Body must be a JSON object`});return}let D=E,k=extractActorIdentity(D,oe);if(k.kind===`invalid-summary`){json(g,400,{ok:!1,error:`summary must be a string`});return}let{docName:j,commitSha:F,versionTag:B}=D,H=typeof j==`string`?j:``,q=typeof F==`string`?F:``,Y=typeof B==`string`?B:void 0;if(!H){json(g,400,{ok:!1,error:`docName required`});return}if(!q||!/^[0-9a-f]{40}$/i.test(q)){json(g,400,{ok:!1,error:`commitSha must be a valid 40-char commit SHA`});return}let ee=L??`.`,te=safeDocPath(H,ee);if(`error`in te){json(g,400,{ok:!1,error:te.error});return}let ne=te.path,se=shadowGit(S),ce=Date.now();try{try{await se.raw(`cat-file`,`-e`,`${q}:${ne}`)}catch{json(g,404,{ok:!1,error:`Document did not exist at this version`});return}let s=await se.raw(`show`,`${q}:${ne}`),w=new Date().toISOString();await safetyCheckpoint(S,ee,{action:`rollback`,context:{docName:H,targetSha:q}});let E=t.documents.get(H);if(!E){json(g,409,{ok:!1,error:`Document is not currently open — open it in the editor first`});return}let{body:D}=stripFrontmatter(s),O=e.resolveEmbed?{resolveEmbed:e.resolveEmbed,sourcePath:H}:void 0,j=mdManager.parseWithFallback(D,O),F=schema.nodeFromJSON(j),B=E.getXmlFragment(`default`);E.transact(()=>{updateYFragment(E,B,F,{mapping:new Map,isOMark:new Map});let e=E.getText(`source`),t=e.toString();t!==s&&(e.delete(0,t.length),e.insert(0,s))},ROLLBACK_ORIGIN);let te;switch(k.kind){case`agent`:{let e=q.slice(0,8),t=k.summary.kind===`value`,s=t?k.summary:normalizeSummary(`Restored to ${e}`),g=at(s);te=t||!g.response?g.response:st(g.response),recordContributor(H,k.writerId,k.displayName,k.colorSeed,formatRollbackSubject(H,q),k.actor,g.stored),incrementAgentWriteCalls(),vt(s,!t);break}case`principal`:{let e=at(k.summary);te=e.response,recordContributor(H,k.writerId,k.displayName,k.colorSeed,formatRollbackSubject(H,q),k.actor,e.stored),vt(k.summary,!1);break}case`anonymous`:log$2.debug({docName:H,commitSha:q.slice(0,8)},`[rollback] anonymous actor — no contributor recorded (no agentId in body and getPrincipal() returned null)`);break;default:throw Error(`Unhandled actor kind in handleRollback: ${String(k.kind)}`)}renameAttributionCounter().add(1,{kind:`rollback`,attribution_kind:k.kind}),Ie(H,`rollback`);let oe=Date.now()-ce;if(console.log(`[rollback] docName=${H} from=${q.slice(0,8)} duration=${oe}ms`),ae){let e=`Restored to ${Y??q.slice(0,8)}: ${H}`,t=L??`.`;withParentLock(async()=>{let s=esm_default({baseDir:ae,timeout:{block:15e3}}),g=t||`.`;await s.add(g),await s.commit(e,{"--allow-empty":null}),console.log(`[rollback] parent-git commit: ${e}`)}).catch(e=>{console.warn(`[rollback] parent-git commit failed (non-fatal):`,e)})}k.kind===`agent`&&J?.setFocus(k.writerId,{agentName:k.displayName,currentDoc:H,writeKind:`rollback-apply`,ts:Date.now()}),json(g,200,{ok:!0,restoredFrom:q,timestamp:w,...te?{summary:te}:{}})}catch(e){console.error(`[rollback]`,e),json(g,500,{ok:!1,error:e instanceof Error?e.message:`Failed to roll back document`})}}async function Br(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}json(t,200,getMetrics())}async function Vr(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}json(t,200,getParseHealth())}async function Hr(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}let s=getActiveBranch(),g=F?.();json(t,200,{ok:!0,serverInstanceId:S,currentBranch:s,...g===void 0?{}:{currentDiskAckSVs:g}},{"Cache-Control":`no-store`})}async function Ur(e,t){if(!isLoopbackAddress(e.socket.remoteAddress)){json(t,403,{ok:!1,error:`loopback-required`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){json(t,403,{ok:!1,error:`host-header-not-allowed`});return}if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}let s=oe?.()??null;if(!s){json(t,404,{error:`Principal not available`});return}json(t,200,s)}async function Wr(e,t){if(!isLoopbackAddress(e.socket.remoteAddress)){json(t,403,{ok:!1,error:`loopback-required`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){json(t,403,{ok:!1,error:`host-header-not-allowed`});return}if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}let s=Y?.getPresenceMap()??{},g=Date.now(),S={};for(let[e,t]of Object.entries(s))g-t.ts<2e4&&(S[e]=t);json(t,200,{presence:S})}async function Gr(e,t){if(!isLoopbackAddress(e.socket.remoteAddress)){json(t,403,{ok:!1,error:`loopback-required`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){json(t,403,{ok:!1,error:`host-header-not-allowed`});return}if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s=resolve(g),S=s,w=!0;try{S=realpathSync(s)}catch(e){let g=e?.code;if(g===`ENOENT`)console.warn(`[workspace] contentDir does not exist; returning unresolved path`,{path:s}),w=!1;else{console.warn(`[workspace] realpath failed for contentDir`,{path:s,err:e}),json(t,500,{ok:!1,error:`workspace-realpath-failed`,code:g??null});return}}json(t,200,{ok:!0,contentDir:S,pathSeparator:sep,symlinkResolved:w})}async function Kr(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`).searchParams.get(`path`);if(!s||s.includes(`\0`)){json(t,400,{ok:!1,error:`Missing asset path`});return}let S=assetContentTypeForPath(s),w=extname(s).slice(1).toLowerCase();if(!S||!ASSET_EXTENSIONS.has(w)){json(t,415,{ok:!1,error:`Unsupported asset type`});return}let E=realpathSync(g),D=resolve(E,s),O;try{O=realpathSync(D)}catch{json(t,404,{ok:!1,error:`Asset not found`});return}if(!isWithinContentDir(O,E)){json(t,400,{ok:!1,error:`Invalid asset path`});return}let k;try{k=statSync(O)}catch{json(t,404,{ok:!1,error:`Asset not found`});return}if(!k.isFile()){json(t,404,{ok:!1,error:`Asset not found`});return}let j=toContentRelativePath(E,O);if(j!==s.split(`\\`).join(`/`)){json(t,400,{ok:!1,error:`Invalid asset path`});return}if(se?.isPathIgnored(j)){json(t,404,{ok:!1,error:`Asset not found`});return}let F={"Content-Type":S,"Content-Length":String(k.size),"X-Content-Type-Options":`nosniff`,"Content-Disposition":INLINE_RENDERABLE_EXTENSIONS.has(w)?`inline`:`attachment`,"Cache-Control":`no-store`};w===`svg`&&(F[`Content-Security-Policy`]=`sandbox; default-src 'none'; style-src 'unsafe-inline'`),t.writeHead(200,F);try{await pipeline(createReadStream(O),t)}catch(e){console.error(`[asset]`,e),t.headersSent?t.destroyed||t.destroy(e instanceof Error?e:void 0):json(t,500,{ok:!1,error:`Failed to read asset`})}}catch(e){console.error(`[asset]`,e),json(t,500,{ok:!1,error:`Internal server error`})}}let qr=1440*60*1e3;async function Jr(e,t){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}if(!O?.current){json(t,200,[]);return}let s=Date.now(),g=[],S=resolve(O.current.gitDir,`rescue`);if(existsSync(S))try{let e=readdirSync(S).filter(e=>isSupportedDocFile(e));for(let t of e){let e=resolve(S,t),w=statSync(e);if(s-w.mtimeMs>qr){try{unlinkSync(e)}catch(e){console.debug(`[rescue] cleanup failed (non-critical):`,e)}continue}g.push({docName:stripDocExtension(t),timestamp:w.mtime.toISOString(),size:w.size,source:`flat`})}}catch(e){console.error(`[rescue] Failed to list flat-file rescue buffers:`,e)}try{let e=j?.()??`main`,t=await listRescueCheckpoints(O.current,e);for(let e of t)g.push({...e,source:`timeline`})}catch(e){console.error(`[rescue] Failed to list timeline-ref rescue checkpoints:`,e)}json(t,200,g)}async function Yr(e,t,s){if(e.method!==`GET`){t.writeHead(405),t.end(`Method not allowed`);return}if(!O?.current){t.writeHead(404),t.end(`Not found`);return}let g=resolve(O.current.gitDir,`rescue`),S=resolve(g,`${s}${getDocExtension(s)}`);if(!S.startsWith(`${g}/`)){t.writeHead(400),t.end(`Invalid document name`);return}if(existsSync(S)){let e=statSync(S);if(Date.now()-e.mtimeMs>qr)try{unlinkSync(S)}catch{}else{let e=readFileSync(S,`utf-8`);t.writeHead(200,{"Content-Type":`text/markdown`,"X-Content-Type-Options":`nosniff`}),t.end(e);return}}try{let e=j?.()??`main`,g=(await listRescueCheckpoints(O.current,e)).filter(e=>e.docName===s).sort((e,t)=>t.timestamp.localeCompare(e.timestamp))[0];if(g){let e=shadowGit(O.current),s=((await e.raw(`ls-tree`,`-r`,g.sha)).trim().split(`
945
946
  `)[0]??``).split(/\s+/)[2];if(s){let g=await e.raw(`cat-file`,`-p`,s);t.writeHead(200,{"Content-Type":`text/markdown`,"X-Content-Type-Options":`nosniff`}),t.end(g);return}}}catch(e){console.warn(`[rescue] timeline-ref fallback failed:`,e)}t.writeHead(404),t.end(`Not found`)}async function Xr(e,t){if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s;try{s=await readBody(e)}catch{json(t,413,{ok:!1,error:`Payload too large`});return}let S;try{S=JSON.parse(s.toString())}catch{json(t,400,{ok:!1,error:`Invalid JSON`});return}if(!S||typeof S!=`object`||Array.isArray(S)){json(t,400,{ok:!1,error:`Body must be a JSON object`});return}let E=extractActorIdentity(S,oe);if(E.kind===`invalid-summary`){json(t,400,{ok:!1,error:`summary must be a string`});return}let{path:D}=S;if(!D||typeof D!=`string`||D.length===0){json(t,400,{ok:!1,error:`path is required`});return}if(!isSupportedDocFile(D)){json(t,400,{ok:!1,error:`path must end with .md or .mdx`});return}if(D.includes(`..`)||D.startsWith(`/`)||D.includes(`\0`)||D.includes(`\\`)){json(t,400,{ok:!1,error:`path must not contain .. or start with /`});return}let O=resolve(g),k=resolve(O,D);if(!k.startsWith(`${O}/`)&&k!==O){json(t,400,{ok:!1,error:`path must not escape content directory`});return}let j=stripDocExtension(D);if(isSystemDoc(j)||isConfigDoc(j)){json(t,400,{ok:!1,error:`'${j}' is a reserved document name`});return}mkdirSync(dirname(k),{recursive:!0});let F=``;try{writeFileSync(k,``,{encoding:`utf-8`,flag:`wx`})}catch(e){if(e.code===`EEXIST`){json(t,409,{ok:!1,error:`File already exists`});return}throw e}let L=stripDocExtension(D);switch(se&&se.incrementMdDir(dirname(L)),registerWrite(k,contentHash(``)),E.kind){case`agent`:case`principal`:recordContributor(L,E.writerId,E.displayName,E.colorSeed,void 0,E.actor);break;case`anonymous`:break;default:throw Error(`Unhandled actor kind in handleCreatePage: ${String(E.kind)}`)}let H=typeof w==`function`?w():null;H instanceof Map&&updateFileIndex({kind:`create`,path:k,docName:L,content:``},H),B&&(B.updateDocumentFromMarkdown(L,``),B.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist create-page cache for ${L}:`,e)}),q?.(`backlinks`),q?.(`graph`)),q?.(`files`),json(t,200,{ok:!0,docName:L})}catch(e){console.error(`[create-page]`,e),json(t,500,{ok:!1,error:`Failed to create page`})}}async function Zr(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!s||typeof s!=`string`||s.length===0){json(t,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(s)){json(t,400,{ok:!1,error:`Invalid docName`});return}let g=_e(s);if(!g){json(t,400,{ok:!1,error:`Invalid docName`});return}if(!existsSync(g)){json(t,404,{ok:!1,error:`Page not found`});return}json(t,200,{ok:!0,docName:s,headings:extractHeadings(readFileSync(g,`utf-8`))})}catch(e){console.error(`[page-headings]`,e),json(t,500,{ok:!1,error:`Failed to read headings`})}}async function Qr(e,t){if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s;try{s=await readBody(e)}catch{json(t,413,{ok:!1,error:`Payload too large`});return}let S;try{S=JSON.parse(s.toString())}catch{json(t,400,{ok:!1,error:`Invalid JSON`});return}if(!S||typeof S!=`object`||Array.isArray(S)){json(t,400,{ok:!1,error:`Body must be a JSON object`});return}let w=S,E=extractActorIdentity(w,oe);if(E.kind===`invalid-summary`){json(t,400,{ok:!1,error:`summary must be a string`});return}let{kind:D,fromPath:O,toPath:k}=w;if(D!==`file`&&D!==`folder`){json(t,400,{ok:!1,error:`kind must be "file" or "folder"`});return}if(typeof O!=`string`||typeof k!=`string`){json(t,400,{ok:!1,error:`fromPath and toPath are required`});return}if(!isValidRelativeContentPath(O)||!isValidRelativeContentPath(k)){json(t,400,{ok:!1,error:`Paths must be relative content paths`});return}if(D===`file`&&(isSystemDoc(O)||isSystemDoc(k)||isConfigDoc(O)||isConfigDoc(k))){json(t,400,{ok:!1,error:`Reserved document names cannot be renamed`});return}if(O===`.ok`||O.startsWith(`.ok/`)||k===`.ok`||k.startsWith(`.ok/`)){json(t,400,{ok:!1,error:`.ok is a reserved directory`});return}if(O===k){json(t,200,{ok:!0,renamed:[],rewrittenDocs:[]});return}if(O.toLowerCase()===k.toLowerCase()){json(t,400,{ok:!1,error:`Case-only renames are not supported`});return}if(D===`file`&&probeAndRegisterSourceFileExtension(g,O),se&&(D===`file`?se.isExcluded(isSupportedDocFile(k)?k:`${k}${getDocExtension(O)}`):se.isDirExcluded(k))){json(t,400,{ok:!1,error:`Destination ${D===`file`?`document`:`folder`} is excluded by the workspace content config`});return}let j;try{j=await nt(O,k,D)}catch(e){if(e instanceof ManagedRenameCollisionError){json(t,409,{ok:!1,error:e.message,colliding:e.colliding});return}throw e}if(j.renamed.length===0){json(t,200,{ok:!0,renamed:[],rewrittenDocs:[]});return}let F;switch(E.kind){case`agent`:{let e=E.summary.kind===`value`,t=e?E.summary:normalizeSummary(`Renamed ${O} → ${k}`),s=at(t);F=e||!s.response?s.response:st(s.response);for(let{fromDocName:e,toDocName:t}of j.renamed)recordContributor(t,E.writerId,E.displayName,E.colorSeed,formatRenameSubject(e,t),E.actor,s.stored);incrementAgentWriteCalls(),vt(t,!e);for(let{toDocName:e}of j.renamed)Ie(e,`rename-path`);break}case`principal`:{let e=at(E.summary);F=e.response;for(let{fromDocName:t,toDocName:s}of j.renamed)recordContributor(s,E.writerId,E.displayName,E.colorSeed,formatRenameSubject(t,s),E.actor,e.stored);vt(E.summary,!1);for(let{toDocName:e}of j.renamed)Ie(e,`rename-path`);break}case`anonymous`:log$2.debug({kind:D,fromPath:O,toPath:k,affectedDocs:j.renamed.length},`[rename-path] anonymous actor — no contributor recorded (no agentId in body and getPrincipal() returned null)`);break;default:throw Error(`Unhandled actor kind in handleRenamePath: ${String(E.kind)}`)}renameAttributionCounter().add(1,{kind:`rename-${D}`,attribution_kind:E.kind}),json(t,200,{ok:!0,renamed:j.renamed,rewrittenDocs:j.rewrittenDocs,...F?{summary:F}:{}})}catch(e){console.error(`[rename-path]`,e);let{status:s,error:g}=Ve(e);json(t,s,{ok:!1,error:g})}}async function ji(e,t){if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s;try{s=await readBody(e)}catch{json(t,413,{ok:!1,error:`Payload too large`});return}let S;try{S=JSON.parse(s.toString())}catch{json(t,400,{ok:!1,error:`Invalid JSON`});return}if(!S||typeof S!=`object`||Array.isArray(S)){json(t,400,{ok:!1,error:`Body must be a JSON object`});return}rt(S);let{kind:E,path:D}=S;if(E!==`file`&&E!==`folder`){json(t,400,{ok:!1,error:`kind must be "file" or "folder"`});return}if(typeof D!=`string`||!isValidRelativeContentPath(D)){json(t,400,{ok:!1,error:`path must be a relative content path`});return}let O=resolveContentEntryPath(g,E,D);if(!existsSync(O)){json(t,404,{ok:!1,error:`${E} does not exist`});return}let k=statSync(O);if(E===`file`&&!k.isFile()||E===`folder`&&!k.isDirectory()){json(t,400,{ok:!1,error:`Target path is not a ${E}`});return}let j=E===`file`?[D]:listAffectedDocNames(w(),E,D);await Ue(j),E===`file`?unlinkSync(O):rmSync(O,{recursive:!0,force:!1}),json(t,200,{ok:!0,deletedDocNames:j})}catch(e){console.error(`[delete-path]`,e),json(t,500,{ok:!1,error:`Failed to delete path`})}}async function Hi(e,t){if(e.method!==`GET`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let e=w(),s=[];for(let[t,S]of e){let e=t,w=getDocExtension(t);try{e=extractPageTitle(readFileSync(resolve(g,`${t}${w}`),`utf-8`),t)}catch(e){console.warn(`[pages] Failed to read title for ${t}:`,e)}s.push({docName:t,title:e,docExt:w,size:S.size,modified:S.modified})}s.sort((e,t)=>e.docName.localeCompare(t.docName)),json(t,200,{ok:!0,pages:s})}catch(e){console.error(`[pages]`,e),json(t,500,{ok:!1,error:`Failed to list pages`})}}function Ui(e,t,s=`path`){let S=e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``);if(S.split(`/`).some(e=>e===`..`)||e.startsWith(`/`))return json(t,400,{ok:!1,error:`Invalid ${s}: must be project-root-relative`}),null;let w=resolve(g),E=S===``?w:resolve(w,S);return E!==w&&!E.startsWith(`${w}${sep}`)?(json(t,400,{ok:!1,error:`Path escapes content directory`}),null):{folderRel:S,resolvedContentDir:w}}let Gi=/^[A-Za-z0-9_-]+$/;function Ki(e,t){return!e||!Gi.test(e)?(json(t,400,{ok:!1,error:"Invalid name: must be letters / digits / `_` / `-` only (no `.md` extension)."}),!1):!0}function Yi(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;for(let[s,g]of Object.entries(e))g!==void 0&&(t[s]=g);return t}async function Xi(e,t){if(e.method===`GET`)return Zi(e,t);if(e.method===`PUT`)return ka(e,t);json(t,405,{ok:!1,error:`Method not allowed`})}async function Zi(e,t){try{let s=Ui(new URL(e.url??``,`http://localhost`).searchParams.get(`path`)??``,t);if(!s)return;let g=await enrichDirectory(s.folderRel,{projectDir:s.resolvedContentDir}),{sources:S}=resolveNestedFrontmatterWithSources(s.resolvedContentDir,s.folderRel),w=resolve(s.resolvedContentDir,s.folderRel,`.ok`,`frontmatter.yml`),E=null;if(existsSync(w))try{let e=(0,import_dist$1.parse)(await readFile$1(w,`utf-8`));E=e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[folder-config:get] malformed YAML in ${w}: ${t}`),E=null}json(t,200,{ok:!0,folder:g,frontmatter_local:E,frontmatter_sources:S})}catch(e){console.error(`[folder-config:get]`,e),json(t,500,{ok:!1,error:e instanceof Error?e.message:`internal error`})}}async function ka(e,t){try{let s=(await readBody(e)).toString(`utf-8`),g=JSON.parse(s),S=Ui(typeof g.path==`string`?g.path:``,t);if(!S)return;let w=S.folderRel===``?`**`:`${S.folderRel}/**`,E=applyNestedFolderRulesUpsert({projectDir:S.resolvedContentDir,rules:[{match:w,frontmatter:Yi(g.frontmatter)}]});if(!E.ok){json(t,E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400,{ok:!1,error:{code:E.error.code,message:E.error.message}});return}json(t,200,{ok:!0,applied:E.applied})}catch(e){console.error(`[folder-config:put]`,e),json(t,e instanceof SyntaxError?400:500,{ok:!1,error:e instanceof Error?e.message:`internal error`})}}async function _s(e,t){if(e.method===`GET`)return xs(e,t);if(e.method===`PUT`)return Cs(e,t);if(e.method===`DELETE`)return Ts(e,t);json(t,405,{ok:!1,error:`Method not allowed`})}async function xs(e,t){try{let s=new URL(e.url??``,`http://localhost`),g=s.searchParams.get(`name`)??``;if(!Ki(g,t))return;let S=Ui(s.searchParams.get(`folder`)??``,t,`folder`);if(!S)return;let{folderRel:w,resolvedContentDir:E}=S,D=w===``?[]:w.split(`/`),O=null,k=null,j=null;for(let e=D.length;e>=0;e--){let t=e===0?``:D.slice(0,e).join(`/`),s=t===``?E:resolve(E,t);if(s!==E&&!s.startsWith(`${E}${sep}`))continue;let S=resolve(s,`.ok`,`templates`,`${g}.md`);if(existsSync(S)){O=S,k=t,j=e===D.length?`local`:`inherited`;break}}if(!O||k===null||j===null){json(t,404,{ok:!1,error:`Template "${g}" not found for folder "${w||`.`}". Walked leaf → root.`});return}let F=await readFile$1(O,`utf-8`),L=F.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/),B={},H=F;if(L){try{let e=(0,import_dist$1.parse)(L[1]);e&&typeof e==`object`&&!Array.isArray(e)&&(B=e)}catch{}H=F.slice(L[0].length)}let q=relative(E,O).split(/[\\/]/).filter(Boolean).join(`/`);json(t,200,{ok:!0,template:{name:g,folder:k,scope:j,path:q,frontmatter:B,body:H}})}catch(e){console.error(`[template:get]`,e),json(t,500,{ok:!1,error:e instanceof Error?e.message:`internal error`})}}async function Cs(e,t){try{let s=(await readBody(e)).toString(`utf-8`),g=JSON.parse(s),S=typeof g.name==`string`?g.name:``;if(!Ki(S,t))return;let w=Ui(typeof g.folder==`string`?g.folder:``,t,`folder`);if(!w)return;let E=applyTemplateWrite({projectDir:w.resolvedContentDir,folder:w.folderRel,name:S,body:typeof g.body==`string`?g.body:``,frontmatter:Yi(g.frontmatter)});if(!E.ok){json(t,E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400,{ok:!1,error:{code:E.error.code,message:E.error.message}});return}json(t,200,{ok:!0,path:E.path,created:E.created,warnings:E.warnings})}catch(e){console.error(`[template:put]`,e),json(t,e instanceof SyntaxError?400:500,{ok:!1,error:e instanceof Error?e.message:`internal error`})}}async function Ts(e,t){try{let s=new URL(e.url??``,`http://localhost`),g=s.searchParams.get(`name`)??``;if(!Ki(g,t))return;let S=Ui(s.searchParams.get(`folder`)??``,t,`folder`);if(!S)return;let w=applyTemplateDelete({projectDir:S.resolvedContentDir,folder:S.folderRel,name:g});if(!w.ok){json(t,w.error.code===`WRITE_ERROR`||w.error.code===`BAD_PROJECT_DIR`?500:400,{ok:!1,error:{code:w.error.code,message:w.error.message}});return}json(t,200,{ok:!0,existed:w.existed,path:w.path})}catch(e){console.error(`[template:delete]`,e),json(t,500,{ok:!1,error:e instanceof Error?e.message:`internal error`})}}function Ds(e){let t=new Map;for(let s of e){let e=s.path.split(`/`).filter(Boolean);e.pop();for(let g=1;g<=e.length;g++){let S=e.slice(0,g).join(`/`);t.set(S,Math.max(t.get(S)??0,s.modifiedTs))}}return[...t.entries()].map(([e,t])=>createWorkspaceSearchDocument({kind:`folder`,path:e,modifiedTs:t}))}function Os(e,t){let s=t.trim().toLowerCase();if(!s||!e)return;let g=e.toLowerCase().indexOf(s);if(g<0)return;let S=Math.max(0,g-80),w=Math.min(e.length,g+s.length+120),E=S>0?`...`:``,D=w<e.length?`...`:``;return`${E}${e.slice(S,w).replace(/\s+/g,` `).trim()}${D}`}function ks(e){return e===`autocomplete`||e===`full_text`||e===`omnibar`?e:`omnibar`}function As(e){let t=typeof e==`string`?e.split(`,`):Array.isArray(e)?e:void 0;if(!t)return;let s=t.filter(e=>e===`page`||e===`folder`||e===`content`);return s.length>0?s:void 0}class Ns extends Error{constructor(e,t){super(t),this.status=e}}async function Ps(e){if(e.method===`GET`){let t=new URL(e.url??``,`http://localhost`),s=t.searchParams.get(`limit`);return{query:t.searchParams.get(`query`)??``,intent:ks(t.searchParams.get(`intent`)),scopes:As(t.searchParams.get(`scope`)??t.searchParams.get(`scopes`)),limit:s===null?void 0:Number(s)}}let t;try{t=await readBody(e)}catch{throw new Ns(413,`Payload too large`)}let s;try{let e=JSON.parse(t.toString());if(!e||typeof e!=`object`||Array.isArray(e))throw new Ns(400,`Invalid JSON body`);s=e}catch(e){throw e instanceof Ns?e:new Ns(400,`Invalid JSON body`)}return{query:typeof s.query==`string`?s.query:``,intent:ks(s.intent),scopes:As(s.scopes??s.scope),limit:typeof s.limit==`number`?s.limit:Number(s.limit)}}async function Is(){let e=[];for(let[t,s]of w()){if(isSystemDoc(t)||isConfigDoc(t))continue;let g=``,S=t;try{g=await readFile$1(s.canonicalPath,`utf-8`),S=extractPageTitle(g,t)}catch(e){console.warn(`[search] Failed to index ${t}:`,e)}e.push(createWorkspaceSearchDocument({kind:`page`,path:t,title:S,content:g,modifiedTs:Date.parse(s.modified)}))}return[...e,...Ds(e)]}function Rs(){return[...w()].filter(([e])=>!isSystemDoc(e)&&!isConfigDoc(e)).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}\u0000${t.modified}\u0000${t.size}\u0000${t.canonicalPath}\u0000${t.inode}\u0000${t.aliases.join(`,`)}`).join(``)}async function $s(){let e=`${g}\u0000${ae??``}`,t=Rs(),s=workspaceSearchCaches.get(e);if(s?.fingerprint===t&&s.corpus)return s.corpus;if(s?.fingerprint===t&&s.pending)return s.pending;let S=Is().then(e=>createWorkspaceSearchCorpus(e));workspaceSearchCaches.set(e,{fingerprint:t,pending:S});try{let s=await S;return workspaceSearchCaches.get(e)?.pending===S&&workspaceSearchCaches.set(e,{fingerprint:t,corpus:s}),s}catch(t){throw workspaceSearchCaches.get(e)?.pending===S&&workspaceSearchCaches.delete(e),t}}function ec(){if(process.env.NODE_ENV!==`test`)for(let e of[0,1e3,3e3])setTimeout(()=>{$s().catch(e=>{console.warn(`[search] Failed to prewarm workspace search cache:`,e)})},e)}ec();async function tc(e,t){if(e.method!==`GET`&&e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}try{let s=performance$1.now(),g=await Ps(e);if(g.query.length>200){json(t,400,{ok:!1,error:`Query is too long`});return}let S=searchWorkspaceCorpus(await $s(),g.query,{intent:g.intent,scopes:g.scopes,limit:g.limit});json(t,200,{ok:!0,query:g.query,intent:g.intent,results:S.map(e=>({kind:e.document.kind,path:e.document.path,title:e.document.title,score:e.score,signals:e.signals,snippet:e.document.kind===`page`?Os(e.document.content,g.query):void 0})),elapsedMs:Math.max(0,performance$1.now()-s)})}catch(e){if(e instanceof Ns){json(t,e.status,{ok:!1,error:e.message});return}console.error(`[search]`,e),json(t,500,{ok:!1,error:`Failed to search workspace`})}}async function nc(e,s){if(e.method!==`GET`){json(s,405,{ok:!1,error:`Method not allowed`});return}try{let g=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!g){json(s,400,{ok:!1,error:`Missing docName parameter`});return}if(!isSafeDocName(g)){json(s,400,{ok:!1,error:`Invalid docName`});return}if(isSystemDoc(g)||isConfigDoc(g)){json(s,400,{ok:!1,error:`'${g}' is a reserved document name`});return}json(s,200,{ok:!0,...await suggestLinks({hocuspocus:t,fileIndex:w(),docName:g})})}catch(e){if(e instanceof SuggestLinksTargetNotFoundError){json(s,404,{ok:!1,error:`Page not found`});return}console.error(`[suggest-links]`,e),json(s,500,{ok:!1,error:`Failed to suggest links`})}}async function rc(e,t){if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s;try{s=await readUploadBody(e,g)}catch(e){if(e instanceof UploadWriteError){if(e.reason===`malformed-upload`){json(t,400,{ok:!1,error:`malformed-upload`});return}if(e.reason===`storage-full`){json(t,507,{ok:!1,error:`storage-full`});return}if(e.reason===`storage-readonly`){json(t,500,{ok:!1,error:`storage-readonly`});return}json(t,500,{ok:!1,error:`storage-error`});return}json(t,400,{ok:!1,error:`Failed to parse upload: ${e instanceof Error?e.message:String(e)}`});return}let{filename:S,tempPath:w,sha:E,byteLength:D,parentDocName:O}=s,{agentId:k,agentName:j}=rt(Object.fromEntries(new URL(e.url??``,`http://localhost`).searchParams.entries())),F=()=>{if(existsSync(w))try{unlinkSync(w)}catch{}};if(D===0){F(),json(t,400,{ok:!1,error:`No file received`});return}if(!O){F(),json(t,400,{ok:!1,error:`parentDocName is required`});return}if(O.includes(`\0`)||O.includes(`..`)||O.startsWith(`/`)){F(),json(t,400,{ok:!1,error:`path-escape`});return}let L=resolve(g),B=resolveUploadDestDir(O,`./`,L);if(!isWithinContentDir(B,L)){F(),json(t,400,{ok:!1,error:`path-escape`});return}try{assertNoSymlinkEscape(B,L)}catch(e){if(F(),(e instanceof Error?e.message:String(e)).startsWith(`symlink-escape:`)){json(t,400,{ok:!1,error:`path-escape`});return}log$2.error({err:e,destDir:B},`[upload] failed to validate destination directory`),json(t,500,{ok:!1,error:`storage-error`});return}try{mkdirSync(B,{recursive:!0})}catch(e){if(e.code!==`EEXIST`){F(),log$2.error({err:e,destDir:B},`[upload] failed to create attachment directory`),json(t,500,{ok:!1,error:`storage-error`});return}}try{let e=realpathSync(B),s;try{s=realpathSync(L)}catch{s=L}if(!isWithinContentDir(e,s)){F(),json(t,400,{ok:!1,error:`path-escape`});return}}catch{F(),json(t,400,{ok:!1,error:`path-escape`});return}let H=await fileTypeFromFile(w),q=H?.mime,J=H?.ext;if(!q){let e=readTempFileHead(w,256).toString(`utf-8`).replace(/^/,``).trimStart();(e.startsWith(`<svg`)||e.startsWith(`<?xml`)&&e.includes(`<svg`))&&(q=`image/svg+xml`,J=`svg`)}{let s=await findDuplicateAsset(B,E,D);if(s){F();let S=relative(g,resolve(B,s));log$2.info({event:`upload`,endpoint:e.url??`/api/upload`,agentId:k,agentName:j,dedup:!0,mime:q??null,size:D,destPath:S,httpStatus:200},`[upload] dedup hit`),json(t,200,{ok:!0,src:s,path:S,deduped:!0});return}}let Y;if(!S||S===`upload`||GENERIC_PASTE_NAMES.test(S)){let e=new Date().toISOString().replace(/[-:T]/g,``).slice(0,14).replace(/(\d{8})(\d{6})/,`$1-$2`),t=S?extname(S).slice(1):``,s=J??t??``;Y=s===``?`pasted-${e}`:`pasted-${e}.${s}`}else Y=sanitizeFilename(S);try{let s=linkTempToFinalWithCollisionRetry(w,B,Y),S=relative(g,resolve(B,s));log$2.info({event:`upload`,endpoint:e.url??`/api/upload`,agentId:k,agentName:j,dedup:!1,mime:q??null,size:D,destPath:S,httpStatus:200},`[upload] write ok`),json(t,200,{ok:!0,src:s,path:S,deduped:!1})}catch(s){let g=s instanceof Error?s.message:String(s),S=s instanceof UploadWriteError?s.reason:`unknown`;if(log$2.error({event:`upload`,endpoint:e.url??`/api/upload`,agentId:k,agentName:j,filename:Y,size:D,reason:S,message:g,httpStatus:s instanceof UploadWriteError&&s.reason===`storage-full`?507:500},`[upload] write failed`),s instanceof UploadWriteError){if(s.reason===`storage-full`){json(t,507,{ok:!1,error:`storage-full`});return}if(s.reason===`storage-readonly`){json(t,500,{ok:!1,error:`storage-readonly`});return}if(s.reason===`collision-exhaustion`){json(t,500,{ok:!1,error:`collision-exhaustion`});return}json(t,500,{ok:!1,error:`storage-error`});return}json(t,500,{ok:!1,error:`storage-error`})}}let ic=`/api/local-op/clone`,ac=`/api/local-op/open`,oc=600*1e3,sc=45e3;async function cc(e,t){if(!checkLocalOpSecurity(e,t,json))return;if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s,g;try{let S=await readBody(e),w=JSON.parse(S.toString());if(typeof w.url!=`string`||!w.url){json(t,400,{ok:!1,error:`Missing or invalid url`});return}if(typeof w.dir!=`string`||!w.dir){json(t,400,{ok:!1,error:`Missing or invalid dir`});return}s=w.url,g=w.dir}catch{json(t,400,{ok:!1,error:`Invalid JSON body`});return}if(!isAllowedGitUrl(s)){json(t,400,{ok:!1,error:`URL protocol not allowed`});return}if(!isSafeLocalPath(g)){json(t,400,{ok:!1,error:`dir must be within the user home directory`});return}if(!de.tryAcquire(ic)){json(t,429,{ok:!1,error:`A clone operation is already in progress`});return}t.writeHead(200,{"Content-Type":`application/x-ndjson`,"Transfer-Encoding":`chunked`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-cache`});let S=null,w=runCloneSubprocess({cliArgs:ne,url:s,dir:g,timeoutMs:oc,onEvent:e=>{if(e.type===`complete`){S=e.dir;return}e.type===`error`&&e.message&&log$2.warn({stderr:e.message,url:s,dir:g},`[local-op/clone] clone failed`),t.writableEnded||t.write(`${JSON.stringify(e)}\n`)}});(async()=>{try{if(await w.done,S&&!t.writableEnded){let e=await lc(S);t.writableEnded||(`port`in e?t.write(`${JSON.stringify({type:`complete`,port:e.port,dir:S})}\n`):t.write(`${JSON.stringify({type:`error`,message:e.error})}\n`))}}finally{t.writableEnded||t.end(),de.release(ic)}})(),t.on(`close`,()=>{w.cancel()})}async function lc(e){let t=resolve(expandTilde(e)),s=getLocalDir(t),g=readUiLock(s);if(g&&g.port>0)return{port:g.port};let S=readServerLock(s),[w,...E]=ne,D=S&&S.port>0?`ui`:`start`,O=spawn(w,[...E,D],{cwd:t,detached:!0,stdio:[`ignore`,`ignore`,`pipe`],env:{...process.env,OK_LOCK_KIND:`interactive`,OK_PARENT_PID:String(process.pid)}}),k=[];O.stderr?.on(`data`,e=>{k.push(e),log$2.warn({cwd:t,cliCmd:D,msg:e.toString(`utf-8`).trim()},`[local-op/open] child stderr`)});let j=null;O.on(`exit`,e=>{j=e??-1}),O.unref();let F=Date.now()+45e3;for(;Date.now()<F;){await setTimeout$1(500);let e=readUiLock(s);if(e&&e.port>0)return{port:e.port};if(j!==null){let e=Buffer.concat(k).toString(`utf-8`).trim();return{error:`\`ok ${D}\` exited (code ${j})${e?` — ${e}`:``}`}}}let L=Buffer.concat(k).toString(`utf-8`).trim();return{error:`UI did not start within the expected time${L?` — ${L}`:``}`}}async function uc(e,t){if(!checkLocalOpSecurity(e,t,json))return;if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s;try{let g=await readBody(e),S=JSON.parse(g.toString());if(typeof S.dir!=`string`||!S.dir){json(t,400,{ok:!1,error:`Missing or invalid dir`});return}s=S.dir}catch{json(t,400,{ok:!1,error:`Invalid JSON body`});return}if(!isSafeLocalPath(s)){json(t,400,{ok:!1,error:`dir must be within the user home directory`});return}if(!de.tryAcquire(ac)){json(t,429,{ok:!1,error:`A server-open operation is already in progress`});return}try{let e=await lc(s);`port`in e?json(t,200,{port:e.port}):json(t,504,{ok:!1,error:e.error})}finally{de.release(ac)}}let dc=`/api/local-op/auth/login`,fc=`/api/local-op/auth/status`,pc=`/api/local-op/auth/repos`,mc=`/api/local-op/auth/signout`,hc=`/api/local-op/auth/pat`;async function gc(e,t){if(!checkLocalOpSecurity(e,t,json))return;if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s=`github.com`;try{let t=await readBody(e),g=JSON.parse(t.toString());typeof g.host==`string`&&g.host&&(s=g.host)}catch{json(t,400,{ok:!1,error:`Invalid JSON body`});return}if(!de.tryAcquire(dc)){json(t,429,{ok:!1,error:`An auth login operation is already in progress`});return}t.writeHead(200,{"Content-Type":`application/x-ndjson`,"Transfer-Encoding":`chunked`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-cache`});let g=runDeviceFlowSubprocess({cliArgs:ne,host:s,timeoutMs:oc,onEvent:e=>{t.writableEnded||t.write(`${JSON.stringify(e)}\n`)}}),S=()=>{g.cancel()};t.on(`close`,S),g.done.finally(()=>{t.off(`close`,S),t.writableEnded||t.end(),de.release(dc)})}async function _c(e,t){if(!checkLocalOpSecurity(e,t,json))return;if(e.method!==`POST`){json(t,405,{ok:!1,error:`Method not allowed`});return}let s=`github.com`;try{let t=(await readBody(e)).toString().trim();if(t.length>0){let e=JSON.parse(t);typeof e.host==`string`&&e.host&&(s=e.host)}}catch{json(t,400,{ok:!1,error:`Invalid JSON body`});return}if(!de.tryAcquire(fc)){json(t,429,{ok:!1,error:`An auth status operation is already in progress`});return}try{let[e,...g]=ne,S=[...g,`auth`,`status`,`--json`,`--host`,s],w=(await new Promise((t,s)=>{let g=spawn(e,S,{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),w=setTimeout(()=>{g.kill(`SIGTERM`)},3e4),E=[];g.stdout.on(`data`,e=>E.push(e)),g.on(`close`,()=>{clearTimeout(w),t(Buffer.concat(E).toString(`utf-8`))}),g.on(`error`,e=>{clearTimeout(w),s(e)})})).split(`
@@ -1136,8 +1137,8 @@ superseded_by: <path-to-new-canonical-article>.md
1136
1137
  `);function register$17(e,t){e.tool(`get_forward_links`,DESCRIPTION$17,{docName:string().describe(`Source page docName`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,url:S}=s;if(!S)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let w=normalizeDocName(e.docName);if(!w.ok)return textResult(w.error,!0);let E=await httpGet(S,`/api/forward-links?docName=${encodeURIComponent(w.docName)}`);if(!E.ok)return textResult(`Error: ${E.error}`,!0);let{ok:D,...O}=E,k=O,{resolve:j,ui:F}=await buildListResolver(t,g),L=(k.forwardLinks??[]).map(e=>{let t=e.kind===`doc`&&typeof e.docName==`string`?e.docName:null,s=t?j(t):null;return{...e,previewUrl:s?.url??null,...s?{previewUrlSource:s.source}:{}}}),B={...k,forwardLinks:L,ui:F,cwd:g};return textPlusStructured(JSON.stringify(B,null,2),B)})}const DESCRIPTION$16=[`[Requires: Hocuspocus server] List version history for a document.`,`Returns timeline entries from the shadow repo, sorted by timestamp descending.`,"Each entry includes a commit SHA that can be passed to `rollback_to_version`.",``,`**Parameters:**`,"- `docName` — Document name to query history for, typically without extension. A trailing `.md` or `.mdx` is stripped automatically.","- `branch` (optional) — Branch name (default: current branch)","- `limit` (optional) — Maximum entries to return (default 50, max 200)","- `offset` (optional) — Number of entries to skip for pagination (default 0)",'- `type` (optional) — Filter by entry type: "checkpoint", "upstream", or "wip"',"- `author` (optional) — Filter to entries by this author name or email","- `excludeAuthor` (optional) — Exclude entries by this author name or email"].join(`
1137
1138
  `);function register$16(e,t){e.tool(`get_history`,DESCRIPTION$16,{docName:string().describe(`Document name to query history for`),branch:string().optional().describe(`Branch name (default: current branch)`),limit:number().int().min(1).max(200).optional().describe(`Maximum entries to return (default 50, max 200)`),offset:number().int().min(0).optional().describe(`Number of entries to skip for pagination (default 0)`),type:_enum([`checkpoint`,`upstream`,`wip`]).optional().describe(`Filter by entry type`),author:string().optional().describe(`Filter to entries by this author name or email`),excludeAuthor:string().optional().describe(`Exclude entries by this author name or email`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,url:S}=s;if(!S)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let w=normalizeDocName(e.docName);if(!w.ok)return textResult(w.error,!0);let E=new URLSearchParams;E.set(`docName`,w.docName),e.branch&&E.set(`branch`,e.branch),e.limit!=null&&E.set(`limit`,String(e.limit)),e.offset!=null&&E.set(`offset`,String(e.offset)),e.type&&E.set(`type`,e.type),e.author&&E.set(`author`,e.author),e.excludeAuthor&&E.set(`excludeAuthor`,e.excludeAuthor);let D=await httpGet(S,`/api/history?${E.toString()}`);if(!D.ok)return textResult(`Error: ${D.error}`,!0);let{ok:O,...k}=D,j=await resolvePreviewUrlForTool(w.docName,{config:t.config,resolveCwd:t.resolveCwd},g);return textPlusStructured(JSON.stringify(k,null,2),{...k,previewUrl:j?.url??null,...j?{previewUrlSource:j.source}:{}})})}const DESCRIPTION$15=[`[Requires: Hocuspocus server] Find the most-linked pages in the knowledge graph.`,`Returns hub pages ordered by inbound link count as JSON.`,``,`**Parameters:**`,"- `limit` (optional) — Maximum number of hubs to return (default 20)"].join(`
1138
1139
  `);function register$15(e,t){e.tool(`get_hubs`,DESCRIPTION$15,{limit:number().int().positive().optional().describe(`Maximum number of hubs to return`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,url:S}=s;if(!S)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let w=await httpGet(S,`/api/hubs${e.limit?`?limit=${encodeURIComponent(String(e.limit))}`:``}`);if(!w.ok)return textResult(`Error: ${w.error}`,!0);let{ok:E,...D}=w,O=D,{resolve:k,ui:j}=await buildListResolver(t,g),F=(O.hubs??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,s=t?k(t):null;return{...e,previewUrl:s?.url??null,...s?{previewUrlSource:s.source}:{}}}),L={...O,hubs:F,ui:j,cwd:g};return textPlusStructured(JSON.stringify(L,null,2),L)})}const DESCRIPTION$14=[`[Requires: Hocuspocus server] Find disconnected pages in the knowledge graph.`,`Returns orphaned pages as JSON.`,``,`**Parameters:**`,"- `mode` (optional) — Orphan lens: `incoming`, `outgoing`, or `both` (default `both`)"].join(`
1139
- `);function register$14(e,t){e.tool(`get_orphans`,DESCRIPTION$14,{mode:_enum(ORPHAN_MODES).optional().describe(`Filter which type of graph disconnection to surface`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,url:S}=s;if(!S)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let w=await httpGet(S,`/api/orphans${e.mode?`?mode=${encodeURIComponent(e.mode)}`:``}`);if(!w.ok)return textResult(`Error: ${w.error}`,!0);let{ok:E,...D}=w,O=D,{resolve:k,ui:j}=await buildListResolver(t,g),F=(O.orphans??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,s=t?k(t):null;return{...e,previewUrl:s?.url??null,...s?{previewUrlSource:s.source}:{}}}),L={...O,orphans:F,ui:j,cwd:g};return textPlusStructured(JSON.stringify(L,null,2),L)})}const BUILTIN_SKIP_DIRS=new Set([`node_modules`,`.venv`,`venv`,`env`,`__pycache__`,`vendor`,`dist`,`build`,`out`,`output`,`.next`,`.nuxt`,`.svelte-kit`,`.astro`,`.turbo`,`.cache`,`.parcel-cache`,`coverage`,`.git`,`.ok`]),IGNORE_FILE_NAMES=[`.gitignore`,`.okignore`];function createContentFilter(e){let{projectDir:t,contentDir:s}=e,g=(0,import_ignore.default)();g.add(`.git`);let S=[];for(let e of IGNORE_FILE_NAMES){let s=join(t,e);if(existsSync(s))try{let e=parseIgnorePatterns(readFileSync(s,`utf-8`));S.push(...e),g.add(e)}catch(t){console.warn(`[content-filter] Failed to read ${e} at ${s}:`,t)}}let w=relative(t,s),E=w.startsWith(`..`);if(w&&!E)for(let e of IGNORE_FILE_NAMES){let t=join(s,e);if(existsSync(t))try{let e=parseIgnorePatterns(readFileSync(t,`utf-8`)).map(e=>prefixPattern(e,w));g.add(e)}catch(s){console.warn(`[content-filter] Failed to read ${e} at ${t}:`,s)}}loadNestedIgnoreFiles(s,t,g);let D=S.filter(e=>e.length>0&&!e.startsWith(`!`)&&!e.startsWith(`#`)),O=new Map;function k(e){if(E)return!1;let t=w?`${w}/${e}`:e;return g.ignores(t)}populateDirCount(s,``,k,O);function j(e){let t=stripDocExtension(e);if(isSystemDoc(t)||isConfigDoc(t))return!0;for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;return E?!1:k(e)}return{isExcluded(e){if(j(e))return!0;if(isSupportedDocFile(e))return!1;let t=extname(e).slice(1).toLowerCase();if(ASSET_EXTENSIONS.has(t)){let t=dirname(e),s=t===`.`?``:t;if((O.get(s)??0)>0)return!1}return!0},isDirExcluded(e){for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;if(E)return!1;let t=w?`${w}/${e}`:e;return g.ignores(t)||g.ignores(`${t}/`)},isPathIgnored(e){return j(e)},getWatcherIgnoreGlobs(){return D},incrementMdDir(e){let t=e===`.`?``:e;O.set(t,(O.get(t)??0)+1)},decrementMdDir(e){let t=e===`.`?``:e,s=O.get(t)??0;s<=1?O.delete(t):O.set(t,s-1)},rebuildDirCount(){O.clear(),populateDirCount(s,``,k,O)}}}function populateDirCount(e,t,s,g){let S;try{S=readdirSync(e,{withFileTypes:!0})}catch{return}for(let w of S){let S=t?`${t}/${w.name}`:w.name;if(w.isDirectory()){if(BUILTIN_SKIP_DIRS.has(w.name)||s(S)||s(`${S}/`))continue;populateDirCount(join(e,w.name),S,s,g)}else w.isFile()&&isSupportedDocFile(w.name)&&!s(S)&&g.set(t,(g.get(t)??0)+1)}}function parseIgnorePatterns(e){return e.split(`
1140
- `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`#`))}function prefixPattern(e,t){return e.startsWith(`!`)?`!${t}/${e.slice(1)}`:`${t}/${e}`}function loadNestedIgnoreFiles(e,t,s){let g;try{g=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[content-filter] Failed to read directory ${e}:`,t);return}for(let S of g){if(!S.isDirectory()||BUILTIN_SKIP_DIRS.has(S.name))continue;let g=join(e,S.name),w=relative(t,g);if(!w.startsWith(`..`)&&!(s.ignores(w)||s.ignores(`${w}/`))){for(let e of IGNORE_FILE_NAMES){let t=join(g,e);if(existsSync(t))try{let e=parseIgnorePatterns(readFileSync(t,`utf-8`)).map(e=>prefixPattern(e,w));s.add(e)}catch(s){console.warn(`[content-filter] Failed to read nested ${e} at ${t}:`,s)}}loadNestedIgnoreFiles(g,t,s)}}}const DESCRIPTION$13=["Find every line that literally contains a string, grouped by file with frontmatter metadata. For ranked retrieval that mirrors cmd-K, use `search`.",``,`Matches are grouped by file; each file is annotated with its title, description, and tags so you can judge relevance without opening it first.`,``,`**Use when:**`,`- Finding every occurrence of a literal phrase across the wiki`,`- Auditing a term, identifier, or quote — coverage matters more than ranking`,``,"**When the project has `.ok/`**, strongly prefer this over your native `Grep` for wiki search — results include article metadata so you can skip irrelevant matches without extra reads. In projects without `.ok/`, use native `Grep` as usual.",``,`**Parameters:**`,"- `query` — Literal text to search for (fixed-string match, no regex)","- `case_sensitive` (optional, default false) — case-sensitive match","- `cwd` (optional) — Project root the grep runs against. Defaults only when the MCP client advertises exactly one root."].join(`
1140
+ `);function register$14(e,t){e.tool(`get_orphans`,DESCRIPTION$14,{mode:_enum(ORPHAN_MODES).optional().describe(`Filter which type of graph disconnection to surface`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,url:S}=s;if(!S)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let w=await httpGet(S,`/api/orphans${e.mode?`?mode=${encodeURIComponent(e.mode)}`:``}`);if(!w.ok)return textResult(`Error: ${w.error}`,!0);let{ok:E,...D}=w,O=D,{resolve:k,ui:j}=await buildListResolver(t,g),F=(O.orphans??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,s=t?k(t):null;return{...e,previewUrl:s?.url??null,...s?{previewUrlSource:s.source}:{}}}),L={...O,orphans:F,ui:j,cwd:g};return textPlusStructured(JSON.stringify(L,null,2),L)})}const BUILTIN_SKIP_DIRS=new Set([`node_modules`,`.venv`,`venv`,`env`,`__pycache__`,`vendor`,`dist`,`build`,`out`,`output`,`.next`,`.nuxt`,`.svelte-kit`,`.astro`,`.turbo`,`.cache`,`.parcel-cache`,`coverage`,`.git`,`.ok`,`Library`,`Applications`,`.Trash`]),IGNORE_FILE_NAMES=[`.gitignore`,`.okignore`];function createContentFilter(e){let{projectDir:t,contentDir:s,onAfterRebuild:g}=e,S=relative(t,s),w=S.startsWith(`..`),E,D,O,k=0,j=0,F=0;function L(){let e=(0,import_ignore.default)();e.add(`.git`);let g=[],L=0,B=0;for(let s of IGNORE_FILE_NAMES){let S=join(t,s);if(existsSync(S))try{let t=readFileSync(S,`utf-8`);L+=t.length;let s=parseIgnorePatterns(t);g.push(...s),e.add(s)}catch(e){console.warn(`[content-filter] Failed to read ${s} at ${S}:`,e)}}if(S&&!w)for(let t of IGNORE_FILE_NAMES){let g=join(s,t);if(existsSync(g))try{let t=readFileSync(g,`utf-8`);L+=t.length,B++;let s=parseIgnorePatterns(t).map(e=>prefixPattern(e,S));e.add(s)}catch(e){console.warn(`[content-filter] Failed to read ${t} at ${g}:`,e)}}let H={value:L};B+=loadNestedIgnoreFiles(s,t,e,H),L=H.value;let q=g.filter(e=>e.length>0&&!e.startsWith(`!`)&&!e.startsWith(`#`));return E=e,D=g,O=q,k=g.length,j=B,F=L,{patternCount:k,nestedFileCount:j,bytes:F}}L();let B=new Map;function H(e){if(w)return!1;let t=S?`${S}/${e}`:e;return E.ignores(t)}populateDirCount(s,``,H,B);function q(e){let t=stripDocExtension(e);if(isSystemDoc(t)||isConfigDoc(t))return!0;for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;return w?!1:H(e)}return{isExcluded(e){if(q(e))return!0;if(isSupportedDocFile(e))return!1;let t=extname(e).slice(1).toLowerCase();if(ASSET_EXTENSIONS.has(t)){let t=dirname(e),s=t===`.`?``:t;if((B.get(s)??0)>0)return!1}return!0},isDirExcluded(e){for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;if(w)return!1;let t=S?`${S}/${e}`:e;return E.ignores(t)||E.ignores(`${t}/`)},isPathIgnored(e){return q(e)},getWatcherIgnoreGlobs(){return O},incrementMdDir(e){let t=e===`.`?``:e;B.set(t,(B.get(t)??0)+1)},decrementMdDir(e){let t=e===`.`?``:e,s=B.get(t)??0;s<=1?B.delete(t):B.set(t,s-1)},rebuildDirCount(){let e=new Map(B);B.clear();try{populateDirCount(s,``,H,B)}catch(t){for(let[t,s]of e)B.set(t,s);getLogger(`content-filter`).warn({err:t instanceof Error?t:Error(String(t))},`content-filter rebuildDirCount walk failed — retaining previous counts`)}},async rebuildIgnorePatterns(){let e=getLogger(`content-filter`),t=E,S=D,w=O,q=k,J=j,Y=F,ee=Date.now();return withSpan(`config.ignore.rebuild`,{attributes:{}},async te=>{try{let t=L();B.clear(),populateDirCount(s,``,H,B);let S=Date.now()-ee;if(te.setAttributes({"ok.ignore.pattern_count":t.patternCount,"ok.ignore.nested_file_count":t.nestedFileCount,"ok.ignore.bytes":t.bytes}),e.info({patternCount:t.patternCount,nestedFileCount:t.nestedFileCount,bytes:t.bytes,durationMs:S},`content-filter rebuild succeeded`),g)try{g()}catch(t){e.warn({err:t instanceof Error?t:Error(String(t))},`content-filter onAfterRebuild callback threw — derived views may be stale`)}return{ok:!0,patternCount:t.patternCount,nestedFileCount:t.nestedFileCount,bytes:t.bytes,durationMs:S}}catch(g){E=t,D=S,O=w,k=q,j=J,F=Y,B.clear();try{populateDirCount(s,``,H,B)}catch(t){e.warn({err:t instanceof Error?t:Error(String(t))},`content-filter rollback dirCount re-walk failed — sibling-asset counts may be stale until next rebuild`)}let L=g instanceof Error?g.message:String(g);return e.warn({err:g instanceof Error?g:Error(L)},`content-filter rebuild failed — rolled back to previous state`),{ok:!1,error:{message:L}}}})}}}function populateDirCount(e,t,s,g){let S;try{S=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[content-filter] Failed to read directory for dir-count: ${e}`,t);return}for(let w of S){let S=t?`${t}/${w.name}`:w.name;if(w.isDirectory()){if(BUILTIN_SKIP_DIRS.has(w.name)||s(S)||s(`${S}/`))continue;populateDirCount(join(e,w.name),S,s,g)}else w.isFile()&&isSupportedDocFile(w.name)&&!s(S)&&g.set(t,(g.get(t)??0)+1)}}function parseIgnorePatterns(e){return e.split(`
1141
+ `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`#`))}function prefixPattern(e,t){return e.startsWith(`!`)?`!${t}/${e.slice(1)}`:`${t}/${e}`}function loadNestedIgnoreFiles(e,t,s,g){let S;try{S=readdirSync(e,{withFileTypes:!0})}catch(t){return console.warn(`[content-filter] Failed to read directory ${e}:`,t),0}let w=0;for(let E of S){if(!E.isDirectory()||BUILTIN_SKIP_DIRS.has(E.name))continue;let S=join(e,E.name),D=relative(t,S);if(!D.startsWith(`..`)&&!(s.ignores(D)||s.ignores(`${D}/`))){for(let e of IGNORE_FILE_NAMES){let t=join(S,e);if(existsSync(t))try{let e=readFileSync(t,`utf-8`);g.value+=e.length;let S=parseIgnorePatterns(e).map(e=>prefixPattern(e,D));s.add(S),w++}catch(s){console.warn(`[content-filter] Failed to read nested ${e} at ${t}:`,s)}}w+=loadNestedIgnoreFiles(S,t,s,g)}}return w}async function initContentDirStateAsync(e,t,s,g,S,w,E){let D;try{D=await readdir(e,{withFileTypes:!0})}catch(t){console.warn(`[content-filter] Failed to read directory ${e}:`,t);return}for(let O of D){let D=t?`${t}/${O.name}`:O.name;if(O.isDirectory()){if(BUILTIN_SKIP_DIRS.has(O.name))continue;let t=join(e,O.name);if(!w){let e=relative(s,t);if(e.startsWith(`..`)||g.ignores(e)||g.ignores(`${e}/`))continue;for(let s of IGNORE_FILE_NAMES){let S=join(t,s);if(existsSync(S))try{let t=parseIgnorePatterns(await readFile$1(S,`utf-8`));g.add(t.map(t=>prefixPattern(t,e)))}catch(e){console.warn(`[content-filter] Failed to read nested ${s} at ${S}:`,e)}}}await initContentDirStateAsync(t,D,s,g,S,w,E)}else if(O.isFile()&&isSupportedDocFile(O.name)){if(!w){let e=S?`${S}/${D}`:D;if(g.ignores(e))continue}E.set(t,(E.get(t)??0)+1)}}}async function createContentFilterAsync(e){let{projectDir:t,contentDir:s,onAfterRebuild:g}=e,S=relative(t,s),w=S.startsWith(`..`),E=(0,import_ignore.default)(),D=[],O=new Map;function k(e){if(w)return!1;let t=S?`${S}/${e}`:e;return E.ignores(t)}function j(e){let t=stripDocExtension(e);if(isSystemDoc(t)||isConfigDoc(t))return!0;for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;return w?!1:k(e)}async function F(){let e=(0,import_ignore.default)();e.add(`.git`);let g=[];for(let s of IGNORE_FILE_NAMES){let S=join(t,s);if(existsSync(S))try{let t=parseIgnorePatterns(await readFile$1(S,`utf-8`));g.push(...t),e.add(t)}catch(e){console.warn(`[content-filter] Failed to read ${s} at ${S}:`,e)}}if(S&&!w)for(let t of IGNORE_FILE_NAMES){let g=join(s,t);if(existsSync(g))try{let t=parseIgnorePatterns(await readFile$1(g,`utf-8`));e.add(t.map(e=>prefixPattern(e,S)))}catch(e){console.warn(`[content-filter] Failed to read ${t} at ${g}:`,e)}}let k=new Map;await initContentDirStateAsync(s,``,t,e,S,w,k),E=e,D=g.filter(e=>e.length>0&&!e.startsWith(`!`)&&!e.startsWith(`#`)),O.clear();for(let[e,t]of k)O.set(e,t)}return await F(),{isExcluded(e){if(j(e))return!0;if(isSupportedDocFile(e))return!1;let t=extname(e).slice(1).toLowerCase();if(ASSET_EXTENSIONS.has(t)){let t=dirname(e),s=t===`.`?``:t;if((O.get(s)??0)>0)return!1}return!0},isDirExcluded(e){for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;if(w)return!1;let t=S?`${S}/${e}`:e;return E.ignores(t)||E.ignores(`${t}/`)},isPathIgnored(e){return j(e)},getWatcherIgnoreGlobs(){return D},incrementMdDir(e){let t=e===`.`?``:e;O.set(t,(O.get(t)??0)+1)},decrementMdDir(e){let t=e===`.`?``:e,s=O.get(t)??0;s<=1?O.delete(t):O.set(t,s-1)},rebuildDirCount(){let e=new Map(O);O.clear();try{populateDirCount(s,``,k,O)}catch(t){for(let[t,s]of e)O.set(t,s);getLogger(`content-filter`).warn({err:t instanceof Error?t:Error(String(t))},`content-filter rebuildDirCount walk failed — retaining previous counts`)}},async rebuildIgnorePatterns(){let e=getLogger(`content-filter`),t=E,s=D,S=new Map(O),w=Date.now();return withSpan(`config.ignore.rebuild`,{attributes:{}},async k=>{try{await F();let t=Date.now()-w;if(k.setAttributes({"ok.ignore.pattern_count":D.length,"ok.ignore.nested_file_count":0,"ok.ignore.bytes":0}),e.info({durationMs:t},`content-filter async rebuild succeeded`),g)try{g()}catch(t){e.warn({err:t instanceof Error?t:Error(String(t))},`content-filter onAfterRebuild callback threw — derived views may be stale`)}return{ok:!0,patternCount:D.length,nestedFileCount:0,bytes:0,durationMs:t}}catch(g){E=t,D=s,O.clear();for(let[e,t]of S)O.set(e,t);let w=g instanceof Error?g.message:String(g);return e.warn({err:g instanceof Error?g:Error(w)},`content-filter async rebuild failed — rolled back`),{ok:!1,error:{message:w}}}})}}}const DESCRIPTION$13=["Find every line that literally contains a string, grouped by file with frontmatter metadata. For ranked retrieval that mirrors cmd-K, use `search`.",``,`Matches are grouped by file; each file is annotated with its title, description, and tags so you can judge relevance without opening it first.`,``,`**Use when:**`,`- Finding every occurrence of a literal phrase across the wiki`,`- Auditing a term, identifier, or quote — coverage matters more than ranking`,``,"**When the project has `.ok/`**, strongly prefer this over your native `Grep` for wiki search — results include article metadata so you can skip irrelevant matches without extra reads. In projects without `.ok/`, use native `Grep` as usual.",``,`**Parameters:**`,"- `query` — Literal text to search for (fixed-string match, no regex)","- `case_sensitive` (optional, default false) — case-sensitive match","- `cwd` (optional) — Project root the grep runs against. Defaults only when the MCP client advertises exactly one root."].join(`
1141
1142
  `);function groupByFile(e){let t=new Map;for(let s of e){let e=t.get(s.path);e?e.push(s):t.set(s.path,[s])}return[...t.entries()].map(([e,t])=>({path:e,matches:t}))}async function buildGrepResult(e,t){let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)throw Error(s.error);let{cwd:g,config:S,url:w}=s,E=50,D=await grep(e.query,g,{caseInsensitive:!(e.case_sensitive??!1),include:[`**/*.md`,`**/*.mdx`],exclude:[`node_modules`,`.git`,`.claude`,`.changeset`,`.ok`],maxResults:51}),O=resolveContentDir(S,g),k=createContentFilter({projectDir:g,contentDir:O}),j=D.filter(e=>{let t=relative(O,resolve(g,e.path));return t.startsWith(`..`)?!1:!k.isExcluded(t)}),F=D.length>50,L=j.slice(0,50),{resolve:B,ui:H}=await buildListResolver({config:S,resolveCwd:async()=>g},g);if(L.length===0)return{text:`No matches for "${e.query}".`,structured:{query:e.query,matchCount:0,fileCount:0,truncated:!1,results:[],ui:H,cwd:g}};let q=groupByFile(L),J=new Map;await Promise.all(q.map(async e=>{try{let t=await enrichPath(e.path,{projectDir:g,serverUrl:w});J.set(e.path,t)}catch{}}));let Y=[];Y.push(`## Grep results for "${e.query}" (${L.length} match${L.length===1?``:`es`} in ${q.length} file${q.length===1?``:`s`})`,``);let ee=[];for(let e of q){let t=J.get(e.path),s=t?.title??e.path;Y.push(`### ${s} (${e.path})`),t?.tags?.length&&Y.push(`Tags: ${t.tags.join(`, `)}`),t?.description&&Y.push(`${t.description}`);for(let t of e.matches)Y.push(`- Line ${t.line}: ${t.text}`);Y.push(``);let g=docNameFromPath(e.path),S=B(g);ee.push({path:e.path,docName:g,title:t?.title??null,description:t?.description??null,tags:t?.tags??[],matches:e.matches.map(e=>({line:e.line,text:e.text})),previewUrl:S?.url??null,...S?{previewUrlSource:S.source}:{}})}return F&&Y.push(`_${L.length} of ${D.length}+ matches shown (max 50). Refine your query to narrow results._`),{text:Y.join(`
1142
1143
  `),structured:{query:e.query,matchCount:L.length,fileCount:q.length,truncated:F,results:ee,ui:H,cwd:g}}}const InputSchema$3={query:string().describe(`Literal text to search for`),case_sensitive:boolean().optional().describe(`Case-sensitive search (default false)`),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},GrepResultRowSchema=object$1({path:string(),docName:string(),title:string().nullable(),description:string().nullable(),tags:array(string()),matches:array(object$1({line:number().int(),text:string()})),previewUrl:string().nullable(),previewUrlSource:_enum([`electron-protocol`,`env`,`lock`,`config`]).optional()}),OutputSchema$3={cwd:string(),query:string(),matchCount:number().int(),fileCount:number().int(),truncated:boolean(),results:array(GrepResultRowSchema),ui:object$1({baseUrl:string().nullable(),port:number().nullable()})};function register$13(e,t){e.registerTool(`grep`,{description:DESCRIPTION$13,inputSchema:InputSchema$3,outputSchema:OutputSchema$3,annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0}},async e=>{try{let{text:s,structured:g}=await buildGrepResult(e,t);return g?textPlusStructured(s,g):textResult(s)}catch(e){return textResult(`Error: ${e instanceof Error?e.message:String(e)}`,!0)}})}function buildBody$1(e,t){return`${buildWorkflowFrame(`ingest`)}Capture this external source into the project knowledge base as raw reference material. The KB is **closed-loop**: external sources are pulled INTO the knowledge base here so downstream docs cite local paths, never bare web URLs. This applies whether a user shared the source OR you fetched it yourself to ground a knowledge-base claim — agent-initiated fetches are not exempt. **Raw preservation only** — no summary, no analysis, no interpretation. Summarizing is the job of the \`research\` tool later.
1143
1144
 
@@ -1594,7 +1595,7 @@ In headless mode, write the recap into the research article's "Further reading"
1594
1595
  `);function register$1(e,t){e.tool(`write_document`,DESCRIPTION$1,{docName:string().describe(`Document name to write to`),markdown:string().optional().describe("Markdown content to write. Optional when `template` is set — the template body is used."),template:string().min(1).optional().describe(`Template name resolved against parent folder's templates_available (leaf → root walk-up; closest-wins on collision). See list_documents({ dir, depth: 1 }) to inspect the menu.`),position:_enum([`append`,`prepend`,`replace`]).describe(`Where to insert the content`),summary:summaryArgSchema,cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},async e=>{let s=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!s.ok)return textResult(`Error: ${s.error}`,!0);let{cwd:g,config:S,url:w}=s;if(!w)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let E=normalizeDocName(e.docName);if(!E.ok)return textResult(E.error,!0);let D=t.identityRef?.current;if(e.template===void 0&&e.markdown===void 0)return textResult("Error: either `markdown` or `template` must be provided. Omitting both would write empty content.",!0);if(e.template!==void 0&&e.markdown!==void 0)return textResult("Error: TEMPLATE_AND_MARKDOWN_BOTH_SET — `template` and `markdown` are mutually exclusive. Pass one. The template body becomes the new doc verbatim; fill placeholders via subsequent `edit_document` calls.",!0);let O=e.markdown??``,k=e.position;if(e.template!==void 0){let t=parentFolderOf(E.docName),s=resolveTemplatesAvailable(g,t,{depth:1}),S=s.find(t=>t.name===e.template);if(!S)return textResult(`Error: template "${e.template}" not found for folder "${t||`.`}". Available: ${s.length===0?`(none)`:s.map(e=>`${e.name} [${e.scope}]`).join(`, `)}. Templates are resolved by walk-up (D7); check list_documents({ dir, depth: 1 }) at the parent folder to see the menu.`,!0);let w;try{w=readFileSync(resolve(g,S.path),`utf-8`)}catch(e){return textResult(`Error: failed to read template at ${S.path}: ${e.message}`,!0)}O=applySubstitution(w,{date:todayIsoUtc(),user:D?.displayName??``}),k=`replace`}let j=await httpPost(w,`/api/agent-write-md`,{docName:E.docName,markdown:O,position:k,...e.summary===void 0?{}:{summary:e.summary},...D?{agentId:D.connectionId,agentName:D.displayName,clientName:D.clientInfo?.name,colorSeed:D.colorSeed}:{}});if(!j.ok)return textResult(`Error: ${j.error}`,!0);let F=resolveLockDir(resolveContentDir(S,g)),L=resolvePreviewUrl(E.docName,{config:S,lockDir:F}),B=typeof j.subscriberCount==`number`?j.subscriberCount:void 0,H=(typeof j.systemSubscriberCount==`number`?j.systemSubscriberCount:void 0)===0,q=B===0,J=Array.isArray(j.hints)?j.hints:void 0,Y=j.summary&&typeof j.summary==`object`?j.summary:void 0,ee=typeof Y?.hint==`string`?Y.hint:void 0,te=[e.template===void 0?`Written successfully (${k}).`:`Written successfully (instantiated from template "${e.template}").`];if(L&&te.push(`Preview: ${L.url}`),H&&te.push(L?`Open ${L.url} in your preview browser.`:`No preview attached. Start the UI.`),ee&&te.push(ee),J)for(let e of J)e.message&&te.push(e.message);let ne=te.join(`
1595
1596
  `);if(!L&&!H&&!q&&!J&&!Y)return textResult(ne);let ae={};return L&&(ae.previewUrl=L.url,ae.previewUrlSource=L.source),H&&(ae.warning={message:`Open the previewUrl in your preview browser.`,action:`attach-preview-once`,previewUrl:L?.url??null}),J&&(ae.hints=J),Y&&(ae.summary=Y),textPlusStructured(ne,ae)})}const DESCRIPTION=["[Operates on disk; no running OK server required] Create or update a folder-scoped template at `<folder>/.ok/templates/<name>.md`.",``,"Templates are markdown starter shapes that agents pick from when creating a new doc — `write_document({ template: <name> })` resolves the name against the folder cascade and instantiates the body + frontmatter.",``,"**`title` is required** in the frontmatter (D14) — it is the menu surface agents pick from. Missing or empty title returns `TEMPLATE_TITLE_REQUIRED`. `description` is recommended (soft warning when absent) — it disambiguates similarly-named templates.",``,"**Substitution allowlist (D5 / FR17).** The body MAY contain `{{date}}` (today, ISO-8601) and `{{user}}` (calling principal display name). Any other `{{...}}` token is rejected at write time with `TEMPLATE_UNKNOWN_VARIABLE`. Substitution happens at instantiation time (when `write_document({ template })` materializes the doc), not at template-write time — templates on disk show the raw `{{date}}` token.",``,`**Parameters:**`,'- `folder` — Project-root-relative folder where the template lives (e.g. `"meetings"`, `"meetings/prep-notes"`). Empty / `.` means the project root.',"- `name` — Template filename without `.md`. Letters, digits, `_`, `-` only.","- `body` — Markdown body. May use `{{date}}` / `{{user}}` substitution tokens. Other placeholder text in `{shape}` form (e.g. `{Meeting Title}`) is LITERAL — agents fill it in via subsequent `edit_document` calls.","- `frontmatter` — `{title (required), description?, tags?: string[]}` for the template menu."].join(`
1596
1597
  `),InputSchema={folder:string().describe("Project-root-relative folder. Empty / `.` means project root."),name:string().min(1).regex(/^[A-Za-z0-9_-]+$/,"Template name must use letters, digits, `_`, or `-` only (no slashes, dots, or spaces).").describe("Template filename without `.md` extension."),body:string().describe(`Markdown body for the template.`),frontmatter:object$1({title:string().min(1,"Template `title` is required (D14) — it is the menu surface agents pick from.").describe(`Required. The menu surface agents pick from. Empty / missing returns TEMPLATE_TITLE_REQUIRED.`),description:string().optional().describe(`Recommended. Disambiguates similarly-named templates. Soft warning when absent.`),tags:array(string()).optional().describe(`Optional. Concatenated with cascade tags at instantiation time.`)}).describe("Template menu metadata. `title` MUST be present (D14 — hard error if missing). `description` SHOULD be present (warning)."),cwd:string().optional().describe(ROUTED_CWD_DESCRIPTION)},OutputSchema={result:union([object$1({ok:literal(!0),path:string(),created:boolean(),warnings:array(string())}),object$1({ok:literal(!1),error:object$1({code:string(),message:string()})})])};function register(e,t){e.registerTool(`write_template`,{description:DESCRIPTION,inputSchema:InputSchema,outputSchema:OutputSchema,annotations:{readOnlyHint:!1,idempotentHint:!0,destructiveHint:!1}},async e=>{let s=await resolveProjectConfigContext(t.resolveCwd,t.config,e.cwd);if(!s.ok)return{isError:!0,content:[{type:`text`,text:`Error: ${s.error}`}]};let{cwd:g}=s,S=applyTemplateWrite({projectDir:g,folder:e.folder,name:e.name,body:e.body,frontmatter:e.frontmatter});if(!S.ok)return{isError:!0,structuredContent:{result:S},content:[{type:`text`,text:`${S.error.code}: ${S.error.message}`}]};let w=[`${S.created?`Created`:`Updated`} template at ${S.path}`];if(S.warnings.length>0){w.push(``,`Warnings:`);for(let e of S.warnings)w.push(` - ${e}`)}return textPlusStructured(w.join(`
1597
- `),{result:S})})}function registerAllTools(e,t){let s=t.logger,g=createLoggedServer(e,{logger:t.logger,identityRef:t.identityRef}),S=e=>async g=>{try{let S=await t.resolveCwd(g);return(getCurrentMcpLogger()??s)?.debug(`tool cwd resolved`,{tool:e,cwd:S,...g?{explicit:g}:{}}),S}catch(t){throw(getCurrentMcpLogger()??s)?.warn(`tool call failed`,{tool:e,error:t instanceof Error?t.message:String(t),...g?{explicit:g}:{}}),t}};register$21(g,{resolveCwd:S(`exec`),serverUrl:t.serverUrl,config:t.config}),register$12(g,{config:t.config,resolveCwd:S(`ingest`)}),register$7(g,{config:t.config,resolveCwd:S(`research`)}),register$25(g,{config:t.config,resolveCwd:S(`consolidate`)}),register$10(g,{resolveCwd:S(`read_document`),config:t.config,serverUrl:t.serverUrl}),register$4(g,{resolveCwd:S(`search`),config:t.config,serverUrl:t.serverUrl}),register$13(g,{resolveCwd:S(`grep`),config:t.config,serverUrl:t.serverUrl}),register$2(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`suggest_links`)}),register$1(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`write_document`),identityRef:t.identityRef}),register$22(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`edit_document`),identityRef:t.identityRef}),register$24(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`delete_document`),identityRef:t.identityRef}),register$9(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rename_document`),identityRef:t.identityRef}),register$8(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rename_folder`),identityRef:t.identityRef}),register$16(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_history`)}),register$5(g,t.config,t.serverUrl,S(`save_version`),t.identityRef),register$6(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rollback_to_version`),identityRef:t.identityRef}),register$11(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`list_documents`)}),register$20(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_backlinks`)}),register$17(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_forward_links`)}),register$14(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_orphans`)}),register$15(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_hubs`)}),register$18(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_dead_links`)}),register$19(g,{config:t.config,resolveCwd:S(`get_config`)}),register$3(g,{config:t.config,resolveCwd:S(`set_folder_rule`)}),register(g,{config:t.config,resolveCwd:S(`write_template`)}),register$23(g,{config:t.config,resolveCwd:S(`delete_template`)})}function firstHeader(e){return Array.isArray(e)?e[0]:e}function writePlain(e,t,s){e.writableEnded||(e.statusCode=t,e.setHeader(`Content-Type`,`text/plain; charset=utf-8`),e.end(s))}function sanitizeClientName(e,t){let s=Array.from(e??``).map(e=>{let t=e.charCodeAt(0);return t<=31||t===127?` `:e}).join(``).replace(/\s+/g,` `).trim();return s?s.slice(0,128):t}function createSessionServer(e,t){let s=e.config,g=new McpServer({name:MCP_SERVER_NAME,version:RUNTIME_VERSION},{instructions:buildInstructions(s.content)}),S=randomUUID(),w={current:{connectionId:S,displayName:S,colorSeed:S}};g.server.oninitialized=()=>{let e=g.server.getClientVersion(),t=sanitizeClientName(e?.name,S);w.current={connectionId:S,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}};let E=e.projectDir??e.contentDir;return registerAllTools(g,{serverUrl:async()=>e.getServerUrl(),resolveCwd:async e=>{if(e===void 0)return E;let t=resolveWithinRoot(E,e);if(!t.ok)throw Error(`cwd "${e}" is not within the configured project root: ${t.reason}`);return t.abs},config:s,identityRef:w}),{server:g,transport:t}}function createMcpHttpHandler(e){let t=new Map,s=e.sessionTtlMs??1800*1e3,g=e.maxSessions??100;async function S(s,g){let S=t.get(s);if(!S)return;t.delete(s),S.ttlTimer!==void 0&&clearTimeout(S.ttlTimer);let w=await Promise.allSettled([S.server.close(),S.transport.close()]);for(let t of w)t.status===`rejected`&&e.log?.warn?.({err:t.reason,sessionId:s,reason:g},`MCP HTTP session close failed`);e.log?.info?.({sessionId:s,reason:g},`MCP HTTP session closed`)}function w(t,g){g.ttlTimer!==void 0&&clearTimeout(g.ttlTimer),g.ttlTimer=setTimeout(()=>{S(t,`ttl-expired`).catch(s=>{e.log?.warn?.({err:s,sessionId:t},`MCP HTTP session TTL cleanup failed`)})},s),g.ttlTimer.unref?.()}return{async handle(s,E){let D=firstHeader(s.headers[`mcp-session-id`]);if(D){let e=t.get(D);if(!e){writePlain(E,404,`MCP session not found`);return}w(D,e),await e.transport.handleRequest(s,E);return}if(s.method!==`POST`){writePlain(E,400,`Missing MCP session. Initialize with POST /mcp first.`);return}if(t.size>=g){e.log?.warn?.({activeSessions:t.size,maxSessions:g},`MCP HTTP session cap reached`),writePlain(E,503,`Too many active MCP sessions`);return}let O=new StreamableHTTPServerTransport({sessionIdGenerator:()=>randomUUID(),enableJsonResponse:!0,onsessioninitialized:async s=>{try{let g=createSessionServer(e,O);await g.server.connect(O),t.set(s,g),w(s,g),e.log?.info?.({sessionId:s},`MCP HTTP session initialized`)}catch(g){throw t.delete(s),e.log?.error?.({err:g,sessionId:s},`MCP HTTP session initialization failed`),g}}});O.onerror=t=>{e.log?.warn?.({err:t},`MCP HTTP transport error`)},O.onclose=()=>{let t=O.sessionId;if(!t){e.log?.info?.({sessionId:t,reason:`transport-closed`},`MCP HTTP session closed`);return}S(t,`transport-closed`).catch(s=>{e.log?.warn?.({err:s,sessionId:t},`MCP HTTP transport-close cleanup failed`)})},await O.handleRequest(s,E)},async close(){let e=[...t.entries()];await Promise.allSettled(e.map(([e])=>S(e,`handler-close`)))}}}const DEFAULT_KEEPALIVE_GRACE_MS=1e4,MAX_COLLAB_MESSAGE_BYTES=1024*1024,MCP_CORS_HEADERS={"Access-Control-Allow-Methods":`GET, POST, DELETE, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type, Authorization, traceparent, tracestate, baggage, mcp-session-id, mcp-protocol-version`,"Access-Control-Max-Age":`86400`};function mountMcpAndApi(e){let{httpServer:t,hocuspocus:s,mcpHttpHandler:g,log:S,sessionManager:w,agentFocusBroadcaster:E,agentPresenceBroadcaster:D}=e,O=e.keepaliveGraceMs??DEFAULT_KEEPALIVE_GRACE_MS,k=new import_websocket_server$1.default({noServer:!0,maxPayload:MAX_COLLAB_MESSAGE_BYTES});k.on(`error`,e=>{S.error({err:e},`WebSocketServer error`)});let j=new Map,F=new Set,L=!1;return t.on(`request`,(e,t)=>{let w=e.url?.split(`?`)[0];if(g!==void 0&&w===`/mcp`){let s=e.headers.origin,w=Array.isArray(e.headers[`mcp-session-id`])?e.headers[`mcp-session-id`][0]:e.headers[`mcp-session-id`];if(!isLoopbackAddress(e.socket.remoteAddress)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`loopback-required`}));return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`host-header-not-allowed`}));return}if(s!==void 0&&!isAllowedApiOrigin(s)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`origin-not-allowed`}));return}s!==void 0&&(t.setHeader(`Access-Control-Allow-Origin`,s),t.setHeader(`Vary`,`Origin`));for(let[e,s]of Object.entries(MCP_CORS_HEADERS))t.setHeader(e,s);if(e.method===`OPTIONS`){t.writeHead(204),t.end();return}g.handle(e,t).catch(e=>{S.error({err:e,sessionId:w},`Unhandled MCP HTTP error`),!t.writableEnded&&!t.headersSent?(t.writeHead(500),t.end(`Internal server error`)):t.writableEnded||t.end()});return}if(w?.startsWith(`/api/`)){s.hooks(`onRequest`,{request:e,response:t}).then(()=>{t.writableEnded||t.headersSent||(t.statusCode=404,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({error:`API route not found`,path:w})))}).catch(e=>{S.error({err:e},`Unhandled onRequest error`),!t.writableEnded&&!t.headersSent?(t.writeHead(500),t.end(`Internal server error`)):t.writableEnded||t.end()});return}t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:"Not found. The React UI is served by `ok ui` (default port 3000).",path:w??`/`}))}),t.on(`upgrade`,(e,t,g)=>{if(e.url?.startsWith(`/collab/keepalive`)){if(!isLoopbackAddress(e.socket.remoteAddress)||!isAllowedWorkspaceHostHeader(e.headers.host)){t.destroy();return}t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`MCP keepalive socket error`)}),k.handleUpgrade(e,t,g,t=>{let s=parseKeepaliveConnectionId(e.url);if(s){let e=j.get(s);e!==void 0&&(clearTimeout(e),j.delete(s),S.info({connectionId:s},`[keepalive] reconnect during grace — timer cancelled`))}let g=setInterval(()=>{try{t.ping()}catch{}},3e4);g.unref?.();let k=s?setInterval(()=>{D?.bumpPresenceTs(toBroadcasterKey(s))},3e3):null;k?.unref?.(),t.on(`close`,()=>{if(clearInterval(g),k!==null&&clearInterval(k),!s)return;let e=setTimeout(()=>{if(j.delete(s),L)return;let e=(async()=>{S.info({connectionId:s},`[keepalive] grace expired — cleaning up sessions`);try{await w?.closeAllForAgent(s)}catch(e){S.error({err:e,connectionId:s},`[keepalive] closeAllForAgent failed`)}try{E?.clearFocus(s)}catch(e){S.error({err:e,connectionId:s},`[keepalive] clearFocus failed`)}try{D?.clearPresence(toBroadcasterKey(s))}catch(e){S.error({err:e,connectionId:s},`[keepalive] clearPresence failed`)}})();F.add(e),e.finally(()=>F.delete(e))},O);e.unref?.(),j.set(s,e),S.info({connectionId:s,graceMs:O},`[keepalive] disconnected — grace timer started`)}),t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`MCP keepalive WS error`),t.terminate()})});return}if(e.url?.startsWith(`/collab`)){t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`Upgrade socket error`)}),k.handleUpgrade(e,t,g,t=>{let g=s.handleConnection(t,e),w=!1;t.on(`message`,e=>{if(w)return;let s=e.byteLength;if(s>MAX_COLLAB_MESSAGE_BYTES){w=!0,incrementCollabMessageTooLarge(),S.warn({event:`collab-message-too-large`,bytes:s,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket message rejected before Yjs processing`),t.close(1009,`Message Too Big`);return}g.handleMessage(new Uint8Array(e))}),t.on(`close`,(e,t)=>{g.handleClose({code:e,reason:t.toString()})}),t.on(`error`,e=>{if(e.code===`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`){incrementCollabMessageTooLarge(),S.warn({event:`collab-message-too-large`,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket frame rejected by ws maxPayload before Yjs processing`),t.terminate();return}handleCollabSocketError(e)||S.error({err:e},`WebSocket error`),t.terminate()})});return}t.destroy()}),{wss:k,shutdown:async()=>{if(!L){L=!0;for(let e of j.values())clearTimeout(e);j.clear(),F.size>0&&await Promise.allSettled([...F])}}}}function parseKeepaliveConnectionId(e){if(!e)return null;try{return validateAgentId(new URL(e,`http://localhost`).searchParams.get(`connectionId`))}catch{return null}}const MISSING_OK_CONFIG_MESSAGE=`Open Knowledge config not found at .ok/config.yml. Run ok init to scaffold OK in this directory.`;var MissingOkConfigError=class extends Error{kind;projectDir;constructor(e,t,s){super(MISSING_OK_CONFIG_MESSAGE,s),this.name=`MissingOkConfigError`,this.kind=e,this.projectDir=t}};async function startConfigFileWatcher(e,t){let s=getLogger(`config-file-watcher`),{watch:g}=await import(`./chokidar-CxU7f6JW.mjs`),S=dirname(e);try{tracedMkdirSync(S,{recursive:!0})}catch(e){e.code!==`EEXIST`&&s.warn({err:e,watchDir:S},`failed to create watch directory; watcher may be inert`)}let w=g(S,{ignoreInitial:!0,depth:0,usePolling:!0,interval:200,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},ignored:t=>t!==S&&t!==e});await new Promise(e=>{w.once(`ready`,e)});let E=null;try{E=readFileSync(e,`utf-8`)}catch{}let D=(g,S=!0)=>{if(g!==e)return;let w;try{w=readFileSync(g,`utf-8`)}catch(e){if(e.code===`ENOENT`){S&&s.debug({path:g},`config file disappeared between event and read; dropping`);return}s.warn({err:e,path:g},`config file read failed; dropping event`);return}if(w!==E){E=w;try{t(w)}catch(e){s.warn({err:e,path:g},`config file change handler threw`)}}},O=e=>D(e);w.on(`add`,O),w.on(`change`,O),w.on(`unlink`,t=>{t===e&&s.debug({path:t},`config file unlinked; Y.Text retained at current state`)}),w.on(`error`,t=>{s.warn({err:t,watchDir:S,absPath:e},`[config-file-watcher] chokidar error while watching ${e}`)});let k=0,j=setInterval(()=>{k++,D(e,!1),k>=20&&clearInterval(j)},500);j.unref?.();let F=!1;return async()=>{F||(F=!0,clearInterval(j),await w.close())}}const QUIET_WINDOW_MS=100,BATCH_TIMEOUT_MS=3e4,WATCHED_FILES=new Set([`HEAD`,`MERGE_HEAD`,`ORIG_HEAD`,`index.lock`]);function readHeadSha(e){try{let t=readFileSync(resolve(e,`HEAD`),`utf-8`).trim();if(t.startsWith(`ref: `)){let s=resolve(e,t.slice(5));try{return readFileSync(s,`utf-8`).trim()}catch{try{let s=readFileSync(resolve(e,`packed-refs`),`utf-8`),g=t.slice(5),S=s.split(`
1598
+ `),{result:S})})}function registerAllTools(e,t){let s=t.logger,g=createLoggedServer(e,{logger:t.logger,identityRef:t.identityRef}),S=e=>async g=>{try{let S=await t.resolveCwd(g);return(getCurrentMcpLogger()??s)?.debug(`tool cwd resolved`,{tool:e,cwd:S,...g?{explicit:g}:{}}),S}catch(t){throw(getCurrentMcpLogger()??s)?.warn(`tool call failed`,{tool:e,error:t instanceof Error?t.message:String(t),...g?{explicit:g}:{}}),t}};register$21(g,{resolveCwd:S(`exec`),serverUrl:t.serverUrl,config:t.config}),register$12(g,{config:t.config,resolveCwd:S(`ingest`)}),register$7(g,{config:t.config,resolveCwd:S(`research`)}),register$25(g,{config:t.config,resolveCwd:S(`consolidate`)}),register$10(g,{resolveCwd:S(`read_document`),config:t.config,serverUrl:t.serverUrl}),register$4(g,{resolveCwd:S(`search`),config:t.config,serverUrl:t.serverUrl}),register$13(g,{resolveCwd:S(`grep`),config:t.config,serverUrl:t.serverUrl}),register$2(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`suggest_links`)}),register$1(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`write_document`),identityRef:t.identityRef}),register$22(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`edit_document`),identityRef:t.identityRef}),register$24(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`delete_document`),identityRef:t.identityRef}),register$9(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rename_document`),identityRef:t.identityRef}),register$8(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rename_folder`),identityRef:t.identityRef}),register$16(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_history`)}),register$5(g,t.config,t.serverUrl,S(`save_version`),t.identityRef),register$6(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`rollback_to_version`),identityRef:t.identityRef}),register$11(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`list_documents`)}),register$20(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_backlinks`)}),register$17(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_forward_links`)}),register$14(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_orphans`)}),register$15(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_hubs`)}),register$18(g,{serverUrl:t.serverUrl,config:t.config,resolveCwd:S(`get_dead_links`)}),register$19(g,{config:t.config,resolveCwd:S(`get_config`)}),register$3(g,{config:t.config,resolveCwd:S(`set_folder_rule`)}),register(g,{config:t.config,resolveCwd:S(`write_template`)}),register$23(g,{config:t.config,resolveCwd:S(`delete_template`)})}function firstHeader(e){return Array.isArray(e)?e[0]:e}function writePlain(e,t,s){e.writableEnded||(e.statusCode=t,e.setHeader(`Content-Type`,`text/plain; charset=utf-8`),e.end(s))}function sanitizeClientName(e,t){let s=Array.from(e??``).map(e=>{let t=e.charCodeAt(0);return t<=31||t===127?` `:e}).join(``).replace(/\s+/g,` `).trim();return s?s.slice(0,128):t}function createSessionServer(e,t){let s=e.config,g=new McpServer({name:MCP_SERVER_NAME,version:RUNTIME_VERSION},{instructions:buildInstructions(s.content)}),S=randomUUID(),w={current:{connectionId:S,displayName:S,colorSeed:S}};g.server.oninitialized=()=>{let e=g.server.getClientVersion(),t=sanitizeClientName(e?.name,S);w.current={connectionId:S,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}};let E=e.projectDir??e.contentDir;return registerAllTools(g,{serverUrl:async()=>e.getServerUrl(),resolveCwd:async e=>{if(e===void 0)return E;let t=resolveWithinRoot(E,e);if(!t.ok)throw Error(`cwd "${e}" is not within the configured project root: ${t.reason}`);return t.abs},config:s,identityRef:w}),{server:g,transport:t}}function createMcpHttpHandler(e){let t=new Map,s=e.sessionTtlMs??1800*1e3,g=e.maxSessions??100;async function S(s,g){let S=t.get(s);if(!S)return;t.delete(s),S.ttlTimer!==void 0&&clearTimeout(S.ttlTimer);let w=await Promise.allSettled([S.server.close(),S.transport.close()]);for(let t of w)t.status===`rejected`&&e.log?.warn?.({err:t.reason,sessionId:s,reason:g},`MCP HTTP session close failed`);e.log?.info?.({sessionId:s,reason:g},`MCP HTTP session closed`)}function w(t,g){g.ttlTimer!==void 0&&clearTimeout(g.ttlTimer),g.ttlTimer=setTimeout(()=>{S(t,`ttl-expired`).catch(s=>{e.log?.warn?.({err:s,sessionId:t},`MCP HTTP session TTL cleanup failed`)})},s),g.ttlTimer.unref?.()}return{async handle(s,E){let D=firstHeader(s.headers[`mcp-session-id`]);if(D){let e=t.get(D);if(!e){writePlain(E,404,`MCP session not found`);return}w(D,e),await e.transport.handleRequest(s,E);return}if(s.method!==`POST`){writePlain(E,400,`Missing MCP session. Initialize with POST /mcp first.`);return}if(t.size>=g){e.log?.warn?.({activeSessions:t.size,maxSessions:g},`MCP HTTP session cap reached`),writePlain(E,503,`Too many active MCP sessions`);return}let O=new StreamableHTTPServerTransport({sessionIdGenerator:()=>randomUUID(),enableJsonResponse:!0,onsessioninitialized:async s=>{try{let g=createSessionServer(e,O);await g.server.connect(O),t.set(s,g),w(s,g),e.log?.info?.({sessionId:s},`MCP HTTP session initialized`)}catch(g){throw t.delete(s),e.log?.error?.({err:g,sessionId:s},`MCP HTTP session initialization failed`),g}}});O.onerror=t=>{e.log?.warn?.({err:t},`MCP HTTP transport error`)},O.onclose=()=>{let t=O.sessionId;if(!t){e.log?.info?.({sessionId:t,reason:`transport-closed`},`MCP HTTP session closed`);return}S(t,`transport-closed`).catch(s=>{e.log?.warn?.({err:s,sessionId:t},`MCP HTTP transport-close cleanup failed`)})},await O.handleRequest(s,E)},async close(){let e=[...t.entries()];await Promise.allSettled(e.map(([e])=>S(e,`handler-close`)))}}}const DEFAULT_KEEPALIVE_GRACE_MS=1e4,MAX_COLLAB_MESSAGE_BYTES=1024*1024,MCP_CORS_HEADERS={"Access-Control-Allow-Methods":`GET, POST, DELETE, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type, Authorization, traceparent, tracestate, baggage, mcp-session-id, mcp-protocol-version`,"Access-Control-Max-Age":`86400`};function mountMcpAndApi(e){let{httpServer:t,hocuspocus:s,mcpHttpHandler:g,log:S,sessionManager:w,agentFocusBroadcaster:E,agentPresenceBroadcaster:D}=e,O=e.keepaliveGraceMs??DEFAULT_KEEPALIVE_GRACE_MS,k=new import_websocket_server$1.default({noServer:!0,maxPayload:MAX_COLLAB_MESSAGE_BYTES});k.on(`error`,e=>{S.error({err:e},`WebSocketServer error`)});let j=new Map,F=new Set,L=!1;return t.on(`request`,(e,t)=>{let w=e.url?.split(`?`)[0];if(g!==void 0&&w===`/mcp`){let s=e.headers.origin,w=Array.isArray(e.headers[`mcp-session-id`])?e.headers[`mcp-session-id`][0]:e.headers[`mcp-session-id`];if(!isLoopbackAddress(e.socket.remoteAddress)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`loopback-required`}));return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`host-header-not-allowed`}));return}if(s!==void 0&&!isAllowedApiOrigin(s)){t.writeHead(403,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!1,error:`origin-not-allowed`}));return}s!==void 0&&(t.setHeader(`Access-Control-Allow-Origin`,s),t.setHeader(`Vary`,`Origin`));for(let[e,s]of Object.entries(MCP_CORS_HEADERS))t.setHeader(e,s);if(e.method===`OPTIONS`){t.writeHead(204),t.end();return}g.handle(e,t).catch(e=>{S.error({err:e,sessionId:w},`Unhandled MCP HTTP error`),!t.writableEnded&&!t.headersSent?(t.writeHead(500),t.end(`Internal server error`)):t.writableEnded||t.end()});return}if(w?.startsWith(`/api/`)){s.hooks(`onRequest`,{request:e,response:t}).then(()=>{t.writableEnded||t.headersSent||(t.statusCode=404,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({error:`API route not found`,path:w})))}).catch(e=>{S.error({err:e},`Unhandled onRequest error`),!t.writableEnded&&!t.headersSent?(t.writeHead(500),t.end(`Internal server error`)):t.writableEnded||t.end()});return}t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:"Not found. The React UI is served by `ok ui` (default port 3000).",path:w??`/`}))}),t.on(`upgrade`,(e,t,g)=>{if(e.url?.startsWith(`/collab/keepalive`)){if(!isLoopbackAddress(e.socket.remoteAddress)||!isAllowedWorkspaceHostHeader(e.headers.host)){t.destroy();return}t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`MCP keepalive socket error`)}),k.handleUpgrade(e,t,g,t=>{let s=parseKeepaliveConnectionId(e.url);if(s){let e=j.get(s);e!==void 0&&(clearTimeout(e),j.delete(s),S.info({connectionId:s},`[keepalive] reconnect during grace — timer cancelled`))}let g=setInterval(()=>{try{t.ping()}catch{}},3e4);g.unref?.();let k=s?setInterval(()=>{D?.bumpPresenceTs(toBroadcasterKey(s))},3e3):null;k?.unref?.(),t.on(`close`,()=>{if(clearInterval(g),k!==null&&clearInterval(k),!s)return;let e=setTimeout(()=>{if(j.delete(s),L)return;let e=(async()=>{S.info({connectionId:s},`[keepalive] grace expired — cleaning up sessions`);try{await w?.closeAllForAgent(s)}catch(e){S.error({err:e,connectionId:s},`[keepalive] closeAllForAgent failed`)}try{E?.clearFocus(s)}catch(e){S.error({err:e,connectionId:s},`[keepalive] clearFocus failed`)}try{D?.clearPresence(toBroadcasterKey(s))}catch(e){S.error({err:e,connectionId:s},`[keepalive] clearPresence failed`)}})();F.add(e),e.finally(()=>F.delete(e))},O);e.unref?.(),j.set(s,e),S.info({connectionId:s,graceMs:O},`[keepalive] disconnected — grace timer started`)}),t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`MCP keepalive WS error`),t.terminate()})});return}if(e.url?.startsWith(`/collab`)){t.on(`error`,e=>{handleCollabSocketError(e)||S.error({err:e},`Upgrade socket error`)}),k.handleUpgrade(e,t,g,t=>{let g=s.handleConnection(t,e),w=!1;t.on(`message`,e=>{if(w)return;let s=e.byteLength;if(s>MAX_COLLAB_MESSAGE_BYTES){w=!0,incrementCollabMessageTooLarge(),S.warn({event:`collab-message-too-large`,bytes:s,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket message rejected before Yjs processing`),t.close(1009,`Message Too Big`);return}g.handleMessage(new Uint8Array(e))}),t.on(`close`,(e,t)=>{g.handleClose({code:e,reason:t.toString()})}),t.on(`error`,e=>{if(e.code===`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`){incrementCollabMessageTooLarge(),S.warn({event:`collab-message-too-large`,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket frame rejected by ws maxPayload before Yjs processing`),t.terminate();return}handleCollabSocketError(e)||S.error({err:e},`WebSocket error`),t.terminate()})});return}t.destroy()}),{wss:k,shutdown:async()=>{if(!L){L=!0;for(let e of j.values())clearTimeout(e);j.clear(),F.size>0&&await Promise.allSettled([...F])}}}}function parseKeepaliveConnectionId(e){if(!e)return null;try{return validateAgentId(new URL(e,`http://localhost`).searchParams.get(`connectionId`))}catch{return null}}const MISSING_OK_CONFIG_MESSAGE=`Open Knowledge config not found at .ok/config.yml. Run ok init to scaffold OK in this directory.`;var MissingOkConfigError=class extends Error{kind;projectDir;constructor(e,t,s){super(MISSING_OK_CONFIG_MESSAGE,s),this.name=`MissingOkConfigError`,this.kind=e,this.projectDir=t}};async function startConfigFileWatcher(e,t){let s=getLogger(`config-file-watcher`),{watch:g}=await import(`./chokidar-CxU7f6JW.mjs`),S=dirname(e);try{tracedMkdirSync(S,{recursive:!0})}catch(e){e.code!==`EEXIST`&&s.warn({err:e,watchDir:S},`failed to create watch directory; watcher may be inert`)}let w=g(S,{ignoreInitial:!0,depth:0,usePolling:!0,interval:200,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},ignored:t=>t!==S&&t!==e});await new Promise(e=>{w.once(`ready`,e)});let E=null;try{E=readFileSync(e,`utf-8`)}catch{}let D=(g,S=!0)=>{if(g!==e)return;let w;try{w=readFileSync(g,`utf-8`)}catch(e){if(e.code===`ENOENT`){S&&s.debug({path:g},`config file disappeared between event and read; dropping`);return}s.warn({err:e,path:g},`config file read failed; dropping event`);return}if(w!==E){E=w;try{t(w)}catch(e){s.warn({err:e,path:g},`config file change handler threw`)}}},O=e=>D(e);w.on(`add`,O),w.on(`change`,O),w.on(`unlink`,t=>{t===e&&s.debug({path:t},`config file unlinked; Y.Text retained at current state`)}),w.on(`error`,t=>{s.warn({err:t,watchDir:S,absPath:e},`[config-file-watcher] chokidar error while watching ${e}`)});let k=0,j=setInterval(()=>{k++,D(e,!1),k>=20&&clearInterval(j)},500);j.unref?.();let F=!1;return async()=>{F||(F=!0,clearInterval(j),await w.close())}}async function startMultiPathConfigFileWatcher(e,t){if(e.length===0)throw Error(`startMultiPathConfigFileWatcher requires at least one absolute path`);let s=getLogger(`config-file-watcher`),{watch:g}=await import(`./chokidar-CxU7f6JW.mjs`),S=new Set(e),w=Array.from(new Set(Array.from(S,e=>dirname(e))));for(let e of w)try{tracedMkdirSync(e,{recursive:!0})}catch(t){t.code!==`EEXIST`&&s.warn({err:t,dir:e},`failed to create watch directory; watcher may be inert`)}let E=g(w,{ignoreInitial:!0,depth:0,usePolling:!0,interval:200,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},ignored:e=>!S.has(e)&&!w.includes(e)});await new Promise(e=>{E.once(`ready`,e)});let D=new Map;for(let e of S)try{D.set(e,readFileSync(e,`utf-8`))}catch{D.set(e,null)}let O=(e,g=!0)=>{if(!S.has(e))return;let w;try{w=readFileSync(e,`utf-8`)}catch(t){if(t.code===`ENOENT`){g&&s.debug({path:e},`config file disappeared between event and read; dropping`);return}s.warn({err:t,path:e},`config file read failed; dropping event`);return}if(w!==D.get(e)){D.set(e,w);try{t(e,w)}catch(t){s.warn({err:t,path:e},`config file change handler threw`)}}},k=e=>O(e);E.on(`add`,k),E.on(`change`,k),E.on(`unlink`,e=>{S.has(e)&&s.debug({path:e},`config file unlinked; downstream state retained`)}),E.on(`error`,e=>{s.warn({err:e,watchDirs:w,paths:Array.from(S)},`[config-file-watcher] chokidar error in multi-path watcher`)});let j=0,F=setInterval(()=>{j++;for(let e of S)O(e,!1);j>=20&&clearInterval(F)},500);F.unref?.();let L=!1;return async()=>{L||(L=!0,clearInterval(F),await E.close())}}const QUIET_WINDOW_MS=100,BATCH_TIMEOUT_MS=3e4,WATCHED_FILES=new Set([`HEAD`,`MERGE_HEAD`,`ORIG_HEAD`,`index.lock`]);function readHeadSha(e){try{let t=readFileSync(resolve(e,`HEAD`),`utf-8`).trim();if(t.startsWith(`ref: `)){let s=resolve(e,t.slice(5));try{return readFileSync(s,`utf-8`).trim()}catch{try{let s=readFileSync(resolve(e,`packed-refs`),`utf-8`),g=t.slice(5),S=s.split(`
1598
1599
  `).find(e=>e.endsWith(` ${g}`));if(S)return S.split(` `)[0]}catch{}return null}}return t.length>=40?t.slice(0,40):null}catch{return null}}function readBranchFromHead(e){try{let t=readFileSync(resolve(e,`HEAD`),`utf-8`).trim();return t.startsWith(`ref: refs/heads/`)?t.slice(16):t.length>=40?`detached-${t.slice(0,12)}`:null}catch{return null}}async function startHeadWatcher(e,t,s){let g=resolveGitDir(e);if(!g)return{unsubscribe:async()=>{},getLastKnownBranch:()=>null};let S=g,w=!1,E=null,D=null,O=null,k=null;async function j(e){if(L&&await L,!w)return;E&&=(clearTimeout(E),null),D&&=(clearTimeout(D),null);let t=readHeadSha(S),g=O!==t,j=readBranchFromHead(S),F;F=j?.startsWith(`detached-`)?`detached-head`:k===j?`within-branch`:`cross-branch`;let B=k;try{await s({headMoved:g,oldHead:O,newHead:t,timeout:e,batchKind:F,oldBranch:B,newBranch:j})}catch(e){console.error(`[head-watcher] onBatchEnd callback failed:`,e)}finally{w=!1,O=t,k=j}}function F(){E&&clearTimeout(E),E=setTimeout(()=>{E=null,j(!1)},QUIET_WINDOW_MS)}let L=null;async function B(e){if(!w){w=!0,O=readHeadSha(S);let s=(async()=>{try{await t({trigger:e})}catch(e){console.error(`[head-watcher] onBatchBegin callback failed:`,e)}})();L=s,await s,L=null,D=setTimeout(()=>{D=null,j(!0)},BATCH_TIMEOUT_MS)}F()}let H,q;try{q=await import(`@parcel/watcher`)}catch(e){throw Error(`@parcel/watcher unavailable for HEAD watching: ${e instanceof Error?e.message:e}`)}try{let e=await q.subscribe(S,(e,t)=>{if(e){console.error(`[head-watcher]`,e);return}for(let e of t){let t=e.path.split(`/`).pop()??``;if(WATCHED_FILES.has(t)){B(t);break}}});H=()=>e.unsubscribe()}catch(e){throw Error(`@parcel/watcher subscribe failed for HEAD watching: ${e instanceof Error?e.message:e}`)}return O=readHeadSha(S),k=readBranchFromHead(S),console.log(`[head-watcher] Watching ${S} for HEAD changes`),{unsubscribe:async()=>{w&&await j(!1),E&&clearTimeout(E),D&&clearTimeout(D),await H()},getLastKnownBranch:()=>k}}const LIVE_DERIVED_INDEX_DEBOUNCE_MS=100;function isLocalOriginLike(e){return typeof e!=`object`||!e?!1:e.source===`local`}function serializeLiveDocument(e){return e.getText(`source`).toString()}function createLiveDerivedIndexExtension(e){let{backlinkIndex:t,tagIndex:s,signalChannel:g,debounceMs:S=100}=e,w=new Map;function E(e){let t=w.get(e);t&&(clearTimeout(t),w.delete(e))}function D(e,D){E(e),w.set(e,setTimeout(()=>{w.delete(e);try{let S=serializeLiveDocument(D);t.updateDocumentFromMarkdown(e,S),g?.(`backlinks`),g?.(`graph`),s&&(s.updateDocumentFromMarkdown(e,S),g?.(`tags`))}catch(t){console.error(`[live-derived-index] Failed to update derived views for ${e}:`,t)}},S))}return{async onChange({documentName:e,document:t,transactionOrigin:s}){isSystemDoc(e)||isConfigDoc(e)||isLocalOriginLike(s)&&s.context?.origin===`file-watcher`||D(e,t)},async beforeUnloadDocument({documentName:e}){E(e)},async onDestroy(){for(let e of w.values())clearTimeout(e);w.clear()}}}const PRINCIPAL_FILE=`principal.json`,GIT_TIMEOUT_MS=3e3;async function readGitConfig(e){try{let t=esm_default({baseDir:e,timeout:{block:GIT_TIMEOUT_MS}});return{name:(await t.raw(`config`,`--get`,`user.name`)).trim()||null,email:(await t.raw(`config`,`--get`,`user.email`)).trim()||null}}catch{return{name:null,email:null}}}async function loadPrincipal(e){let t=getLocalDir(e),s=resolve(t,PRINCIPAL_FILE),{name:g,email:S}=await readGitConfig(e);if(existsSync(s)){let e;try{e=JSON.parse(readFileSync(s,`utf-8`))}catch{e={}}let t=typeof e.id==`string`&&e.id.startsWith(`principal-`)?e.id:`principal-${randomUUID()}`,w=typeof e.created_at==`string`?e.created_at:new Date().toISOString(),E=t.slice(10,18),D={id:t,display_name:g?sanitizeGitIdentity(g):typeof e.display_name==`string`?e.display_name:`Local User`,display_email:S?sanitizeGitIdentity(S):typeof e.display_email==`string`?e.display_email:`principal-${E}@openknowledge.local`,source:g||S?`git-config`:`synthesized`,created_at:w};return writeFileSync(s,JSON.stringify(D,null,2),`utf-8`),D}mkdirSync(t,{recursive:!0});let w=`principal-${randomUUID()}`,E=w.slice(10,18),D={id:w,display_name:g?sanitizeGitIdentity(g):`Local User`,display_email:S?sanitizeGitIdentity(S):`principal-${E}@openknowledge.local`,source:g||S?`git-config`:`synthesized`,created_at:new Date().toISOString()};return writeFileSync(s,JSON.stringify(D,null,2),`utf-8`),D}function createServerObserverExtension(e){let t=new Map,s=new Map;return{async afterLoadDocument({documentName:g,document:S}){if(isSystemDoc(g)||isConfigDoc(g)||t.has(g))return;let w=S,E=w.getXmlFragment(`default`),D=w.getText(`source`),O=()=>{try{let s=setupServerObservers({doc:w,xmlFragment:E,ytext:D,mdManager:e.mdManager,schema:e.schema,docName:g,shadow:e.shadowRef?()=>e.shadowRef?.current:void 0,getBranch:e.getCurrentBranch?()=>e.getCurrentBranch?.()??`main`:void 0,contentRoot:e.contentRoot,resolveEmbed:e.resolveEmbed});return t.set(g,s),!0}catch(e){return console.error(`[ServerObserverExtension] Failed to attach observers for '${g}':`,e),incrementServerObserverError(`a`),incrementServerObserverError(`b`),!1}};if(!O()){let e=setTimeout(()=>{s.delete(g),!t.has(g)&&(console.warn(`[ServerObserverExtension] Retrying observer attachment for '${g}'`),O())},5e3);s.set(g,e)}},async afterUnloadDocument({documentName:e}){let g=s.get(e);g&&(clearTimeout(g),s.delete(e));let S=t.get(e);S&&(S(),t.delete(e))},async onDestroy(){for(let e of s.values())clearTimeout(e);s.clear();for(let[e,s]of t.entries())try{s()}catch(t){console.error(`[ServerObserverExtension] Cleanup failed for '${e}':`,t)}t.clear()}}}const STATE_MANIFEST_FILENAME=`state.json`;function detectProjectShape(e){return e.lockDir,existsSync(e.shadowRepoDir)?`adopt`:`fresh`}function manifestPath(e){return resolve(e,STATE_MANIFEST_FILENAME)}function isCompatibleSchema(e,t){return e===t||e===0&&t===1}var StateManifestError=class extends Error{kind;path;constructor(e){super(e.message),this.name=`StateManifestError`,this.kind=e.kind,this.path=e.path}};function isStateManifestRecord(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.stateSchemaVersion!=`number`||typeof t.createdAt!=`string`||!t.createdBy||typeof t.createdBy!=`object`)return!1;let s=t.createdBy;return!(typeof s.runtimeVersion!=`string`||s.protocolVersion!==void 0&&typeof s.protocolVersion!=`number`)}function readStateManifest(e){let t=manifestPath(e);if(!existsSync(t))return{status:`absent`};let s;try{s=readFileSync(t,`utf-8`)}catch(e){throw new StateManifestError({kind:`corrupt`,path:t,message:`Failed to read state manifest at ${t}: ${e instanceof Error?e.message:String(e)}`})}let g;try{g=JSON.parse(s)}catch(e){throw new StateManifestError({kind:`corrupt`,path:t,message:`State manifest at ${t} is not valid JSON: ${e instanceof Error?e.message:String(e)}`})}if(!isStateManifestRecord(g))throw new StateManifestError({kind:`corrupt`,path:t,message:`State manifest at ${t} has invalid shape (missing or wrong-typed required fields)`});return{status:`present`,manifest:g}}function writeStateManifest(e,t){let s=manifestPath(e);mkdirSync(dirname(s),{recursive:!0}),writeFileSync(s,JSON.stringify(t,null,2),{encoding:`utf-8`,mode:384})}function assertCompatibleStateManifest(e){let t=getLogger(`state-manifest`),s=e.currentStateSchemaVersion??1,g=e.currentRuntimeVersion??RUNTIME_VERSION,S=e.currentProtocolVersion??1,w=(e.now??(()=>new Date))().toISOString(),E=manifestPath(e.lockDir),D=readStateManifest(e.lockDir);if(D.status===`present`){let O=D.manifest;if(!isCompatibleSchema(O.stateSchemaVersion,s))throw new StateManifestError({kind:`incompatible`,path:E,message:`State manifest at ${E} declares stateSchemaVersion=${O.stateSchemaVersion} but this binary supports ${s}. Refusing to boot — on-the-fly migration is out of scope. (Manifest written by runtime ${O.createdBy.runtimeVersion}, protocol ${O.createdBy.protocolVersion}.)`});try{let t={...O,lastWriteBy:{runtimeVersion:g,protocolVersion:S,at:w}};return writeStateManifest(e.lockDir,t),t}catch(e){return t.warn({err:e},`[state-manifest] failed to update lastWriteBy — proceeding`),O}}if(detectProjectShape({lockDir:e.lockDir,shadowRepoDir:e.shadowRepoDir})===`fresh`){let D={stateSchemaVersion:s,createdAt:w,createdBy:{runtimeVersion:g,protocolVersion:S}};return writeStateManifest(e.lockDir,D),t.info({path:E,stateSchemaVersion:s},`[state-manifest] fresh project — wrote manifest`),D}let O={stateSchemaVersion:0,createdAt:w,createdBy:{runtimeVersion:g,protocolVersion:S,adoptedAt:w}};return writeStateManifest(e.lockDir,O),t.warn({path:E,runtimeVersion:g},`[state-manifest] adopting pre-versioned project — wrote schema-0 manifest. Future binaries with STATE_SCHEMA_VERSION>=2 may refuse if they cannot read schema-0 state.`),O}const log$1=getLogger(`conflict-storage`);var ConflictStore=class{storePath;projectDir;branch;conflicts=[];constructor(e,t,s=`main`){this.storePath=join(getLocalDir(e),`conflicts.json`),this.projectDir=t,this.branch=s,this.load()}load(){if(!existsSync(this.storePath)){this.conflicts=[];return}try{let e=readFileSync(this.storePath,`utf-8`),t=JSON.parse(e);if(t.version!==1){log$1.warn({path:this.storePath},`[conflicts] unknown schema version — resetting`),this.conflicts=[];return}this.branch=t.branch??this.branch,this.conflicts=t.conflicts??[]}catch(e){log$1.warn({err:e},`[conflicts] failed to load conflicts.json — starting empty`),this.conflicts=[]}}save(){try{let e=dirname(this.storePath);existsSync(e)||mkdirSync(e,{recursive:!0});let t={version:1,branch:this.branch,conflicts:this.conflicts};writeFileSync(this.storePath,JSON.stringify(t,null,2),`utf-8`)}catch(e){log$1.warn({err:e},`[conflicts] failed to save conflicts.json`)}}addConflict(e){let t=this.conflicts.findIndex(t=>t.file===e.file);t===-1?this.conflicts.push(e):this.conflicts[t]=e,this.save()}removeConflict(e){this.conflicts=this.conflicts.filter(t=>t.file!==e),this.save()}clear(){this.conflicts=[],this.save()}count(){return this.conflicts.length}list(){return[...this.conflicts]}hasConflicts(){return this.conflicts.length>0}setBranch(e){this.branch=e}async resolveConflict(e,t,s,g=[]){if(!this.conflicts.find(t=>t.file===e))throw Error(`[conflicts] no conflict tracked for file: ${e}`);if(t===`content`&&s===void 0)throw Error(`[conflicts] strategy 'content' requires content parameter`);let{createGitInstance:S}=await import(`./git-handle-DwfYp_z--DreW3fNC.mjs`).then(e=>e.n),w=S(this.projectDir,{credentialArgs:g});switch(t){case`mine`:await w.git.raw([`checkout`,`--ours`,`--`,e]),await w.git.raw([`add`,`--`,e]);break;case`theirs`:await w.git.raw([`checkout`,`--theirs`,`--`,e]),await w.git.raw([`add`,`--`,e]);break;case`content`:{if(!s)throw Error(`[conflicts] strategy 'content' requires content parameter`);let t=resolve(this.projectDir),g=resolve(t,e);if(g!==t&&!g.startsWith(`${t}/`))throw Error(`[conflicts] file path escapes project directory: ${e}`);writeFileSync(g,s,`utf-8`),await w.git.raw([`add`,`--`,e]);break}default:throw Error(`[conflicts] unknown resolve strategy: ${t}`)}if(this.removeConflict(e),!this.hasConflicts())try{await w.git.raw([`commit`,`--no-edit`]),log$1.info({file:e},`[conflicts] all conflicts resolved — merge commit created`)}catch(t){let s=new Date().toISOString(),g=!1;try{let e=(await w.git.raw([`diff`,`--name-only`,`--diff-filter=U`])).split(`
1599
1600
  `).map(e=>e.trim()).filter(Boolean);for(let t of e)this.addConflict({file:t,detectedAt:s});g=e.length>0}catch(e){log$1.warn({err:e},`[conflicts] commit failed and re-scan of unmerged files failed — falling back to single-file re-add`)}g||this.addConflict({file:e,detectedAt:s}),log$1.warn({err:t},`[conflicts] failed to commit merge after all conflicts resolved — unmerged files re-added`)}}};function extractStderr(e){return e.git?.toString()??e.message??``}function matchesAny(e,t){return t.some(t=>t.test(e))}const AUTH_PATTERNS=[/\b(401|403)\b/,/authentication failed/i,/authorization failed/i,/invalid credentials/i,/credential helper/i,/bad credentials/i,/token.*expired/i,/expired.*token/i,/permission denied.*\(publickey\)/i,/host key verification failed/i,/fatal:.*repository.*not found/i],SCOPE_MISMATCH_PATTERNS=[/insufficient scopes/i,/missing.*scope/i,/required scope/i],NON_FAST_FORWARD_PATTERNS=[/non-fast-forward/i,/rejected.*non-fast-forward/i,/would overwrite.*commits/i,/\[rejected\]/,/fetch first/i,/updates were rejected/i],PROTECTED_BRANCH_PATTERNS=[/protected branch/i,/refusing to allow/i,/at least \d+ approving review/i,/required status check/i,/branch policy/i,/GH001/i,/GH002/i,/GH003/i,/GH004/i,/push declined due to repository rule/i,/cannot push to a protected branch/i],MERGE_CONFLICT_PATTERNS=[/\bmerge conflict\b/i,/automatic merge failed/i,/CONFLICT \(/,/\bconflict\b.*\bmerge\b/i,/(?:^|\n)CONFLICTS:\s/i],LFS_PATTERNS=[/lfs.*quota/i,/exceeded.*bandwidth/i,/lfs storage/i],LARGE_FILE_PATTERNS=[/file.*too large/i,/exceeded.*file size/i,/push file size limit/i],PRE_RECEIVE_PATTERNS=[/pre-receive hook/i,/remote:.*rejected/i,/hook declined/i],SECRET_DETECTED_PATTERNS=[/secret.*detected/i,/push.*secret/i,/secret scanning/i,/leaking.*credentials/i,/token.*detected/i],INDEX_LOCK_PATTERNS=[/\.git\/index\.lock/i,/another git process/i,/unable to create.*\.lock/i],DIRTY_TREE_PATTERNS=[/dirty.*working tree/i,/working tree.*not clean/i,/untracked.*files.*would be overwritten/i,/local changes.*would be overwritten/i,/uncommitted changes/i,/changes.*not staged/i,/please.*commit.*changes/i,/please.*stash/i,/commit your changes or stash/i],DISK_FULL_PATTERNS=[/no space left on device/i,/disk quota exceeded/i,/ENOSPC/],NETWORK_PATTERNS=[/could not resolve host/i,/name.*resolution/i,/connection.*timed out/i,/operation timed out/i,/connection refused/i,/network.*unreachable/i,/ssl.*handshake/i,/unable to connect/i,/getaddrinfo/i,/econnrefused/i,/enotfound/i,/etimedout/i,/ehostunreach/i],HTTP_5XX_PATTERNS=[/\bHTTP[\s/]*5[0-9]{2}\b/i,/\bstatus:?\s*5[0-9]{2}\b/i,/\berror\s*5[0-9]{2}\b/i,/\bresponse.*?\b5[0-9]{2}\b/i],HTTP_429_PATTERNS=[/\bHTTP[\s/]*429\b/i,/\bstatus:?\s*429\b/i,/\berror\s*429\b/i,/rate.?limit/i,/too many requests/i];function classifyGitError(e){let t=e instanceof Error?e:Error(String(e)),s=extractStderr(t),g=`${t.message}\n${s}`.toLowerCase();return matchesAny(g,INDEX_LOCK_PATTERNS)?{class:`local`,subclass:`index-lock`,retryable:!0,message:`Git index locked by another process`,rawStderr:s}:matchesAny(g,DIRTY_TREE_PATTERNS)?{class:`local`,subclass:`dirty-tree`,retryable:!0,message:`Working tree has uncommitted changes`,rawStderr:s}:matchesAny(g,DISK_FULL_PATTERNS)?{class:`local`,subclass:`disk-full`,retryable:!0,message:`Disk full or quota exceeded`,rawStderr:s}:matchesAny(g,SCOPE_MISMATCH_PATTERNS)?{class:`auth`,subclass:`scope-mismatch`,retryable:!1,message:`GitHub token missing required scopes`,rawStderr:s}:matchesAny(g,AUTH_PATTERNS)?/\b401\b/.test(g)||/token.*expired/i.test(g)?{class:`auth`,subclass:`401`,retryable:!1,message:`Authentication failed — token may be expired`,rawStderr:s}:/\b403\b/.test(g)?matchesAny(g,PROTECTED_BRANCH_PATTERNS)?{class:`semantic`,subclass:`protected-branch`,retryable:!1,message:`Push rejected — branch is protected`,rawStderr:s}:{class:`auth`,subclass:`403`,retryable:!1,message:`Access denied (403)`,rawStderr:s}:{class:`auth`,subclass:`unknown-auth`,retryable:!1,message:`Authentication failed`,rawStderr:s}:matchesAny(g,PROTECTED_BRANCH_PATTERNS)?{class:`semantic`,subclass:`protected-branch`,retryable:!1,message:`Push rejected — branch is protected`,rawStderr:s}:matchesAny(g,NON_FAST_FORWARD_PATTERNS)?{class:`semantic`,subclass:`non-fast-forward`,retryable:!1,message:`Push rejected — remote has diverged (non-fast-forward)`,rawStderr:s}:matchesAny(g,MERGE_CONFLICT_PATTERNS)?{class:`semantic`,subclass:`merge-conflict`,retryable:!1,message:`Merge conflict — manual resolution required`,rawStderr:s}:matchesAny(g,LFS_PATTERNS)?{class:`structural`,subclass:`lfs-quota`,retryable:!1,message:`Git LFS quota exceeded`,rawStderr:s}:matchesAny(g,LARGE_FILE_PATTERNS)?{class:`structural`,subclass:`large-file`,retryable:!1,message:`File exceeds size limit`,rawStderr:s}:matchesAny(g,SECRET_DETECTED_PATTERNS)?{class:`structural`,subclass:`secret-detected`,retryable:!1,message:`Push blocked — secret or credential detected in content`,rawStderr:s}:matchesAny(g,PRE_RECEIVE_PATTERNS)?{class:`structural`,subclass:`pre-receive-hook`,retryable:!1,message:`Push rejected by server pre-receive hook`,rawStderr:s}:matchesAny(g,HTTP_429_PATTERNS)?{class:`network`,subclass:`429`,retryable:!0,message:`Rate limited — too many requests`,rawStderr:s}:matchesAny(g,HTTP_5XX_PATTERNS)?{class:`network`,subclass:`5xx`,retryable:!0,message:`Server error (5xx)`,rawStderr:s}:matchesAny(g,NETWORK_PATTERNS)?/timed? out/i.test(g)?{class:`network`,subclass:`timeout`,retryable:!0,message:`Connection timed out`,rawStderr:s}:/refused/i.test(g)||/econnrefused/i.test(g)?{class:`network`,subclass:`connection-refused`,retryable:!0,message:`Connection refused`,rawStderr:s}:/resolve.*host/i.test(g)||/enotfound/i.test(g)||/getaddrinfo/i.test(g)?{class:`network`,subclass:`dns`,retryable:!0,message:`DNS resolution failed`,rawStderr:s}:{class:`network`,subclass:`unknown-network`,retryable:!0,message:`Network error`,rawStderr:s}:{class:`local`,subclass:`unknown-local`,retryable:!0,message:t.message||`Unknown git error`,rawStderr:s}}function computeRemainingMs(e,t,s=Date.now()){if(!e)return 0;let g=new Date(e).getTime();if(Number.isNaN(g))return 0;let S=g+t*1e3;return Math.max(0,S-s)}const log=getLogger(`sync-engine`),SHA_HEX_40=/^[0-9a-f]{40}$/i;function jitteredMs(e){let t=e*1e3,s=t*.15*(2*Math.random()-1);return Math.round(t+s)}function isUnbornHead(e){try{let t=join(e,`.git`,`HEAD`);if(!existsSync(t))return!1;let s=readFileSync(t,`utf-8`).trim(),g=/^ref:\s+(refs\/.+)$/.exec(s);if(!g)return!1;let S=g[1];if(existsSync(join(e,`.git`,S)))return!1;let w=join(e,`.git`,`packed-refs`);if(existsSync(w)){let e=readFileSync(w,`utf-8`);if(RegExp(`^[0-9a-f]+\\s+${S}$`,`m`).test(e))return!1}return!0}catch{return!1}}function backoffMs(e){return e>=8?3600*1e3:e>=5?900*1e3:e>=3?300*1e3:0}var SyncEngine=class{state=`dormant`;projectDir;contentDir;contentFilter;contentRoot;pullIntervalSeconds;pushIntervalSeconds;syncEnabled;credentialArgs;cc1Broadcaster;onStateChange;setBatchInProgress;onAutoDisable;pullTimer=null;pushTimer=null;stateSaveTimer=null;lastSyncUtc=null;lastFetchUtc=null;lastPushedSha=null;consecutiveFailures=0;ahead=0;behind=0;conflictCount=0;error;pausedReason;currentBranch=`main`;pullInFlight=!1;pushInFlight=!1;hasRemote=!1;identityUnresolved=!1;statePath;conflictStore;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.contentRoot=e.contentRoot??``,this.pullIntervalSeconds=e.pullIntervalSeconds??30,this.pushIntervalSeconds=e.pushIntervalSeconds??60,this.syncEnabled=e.syncEnabled,this.credentialArgs=e.credentialArgs??[],this.cc1Broadcaster=e.cc1Broadcaster??null,this.onStateChange=e.onStateChange,this.setBatchInProgress=e.setBatchInProgress,this.onAutoDisable=e.onAutoDisable,this.statePath=resolve(getLocalDir(this.contentDir),`sync-state.json`),this.conflictStore=new ConflictStore(this.contentDir,this.projectDir,this.currentBranch)}async start(){if(this.state!==`dormant`)return;this.loadState();let e=!1;try{let t=createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs});e=(await t.git.raw(`remote`,`-v`)).trim().length>0,this.hasRemote=e;try{let e=(await t.git.raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();e&&e!==`HEAD`&&(this.currentBranch=e,this.conflictStore.setBranch(e))}catch{}}catch(e){log.warn({err:e},`[sync] remote detection failed`)}if(this.syncEnabled!==!0){e&&this.transitionTo(`disabled`),log.info({hasRemote:e,syncEnabled:this.syncEnabled},`[sync] sync not enabled — staying inactive`);return}if(!e){log.info({},`[sync] no remote detected — staying dormant`);return}this.transitionTo(`idle`);let t=existsSync(join(this.projectDir,`.git`,`MERGE_HEAD`));if(this.conflictCount>0&&!t)log.warn({count:this.conflictCount},`[sync] persisted conflicts but no MERGE_HEAD — clearing stale state`),this.conflictStore.clear(),this.conflictCount=0;else if(this.conflictCount>0&&t)try{let e=(await createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs}).git.raw([`diff`,`--name-only`,`--diff-filter=U`])).trim(),t=new Set(e?e.split(`
1600
1601
  `).map(e=>e.trim()).filter(Boolean):[]),s=this.conflictCount;for(let e of this.conflictStore.list())t.has(e.file)||this.conflictStore.removeConflict(e.file);this.conflictCount=this.conflictStore.count(),this.conflictCount<s&&log.info({cleared:s-this.conflictCount,remaining:this.conflictCount},`[sync] reconciled conflicts.json against git unmerged index`)}catch(e){log.warn({err:e},`[sync] failed to reconcile conflicts with git index`)}if(t&&this.conflictCount===0){log.warn({},`[sync] stale MERGE_HEAD detected with no tracked conflicts — aborting merge`);try{await createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs}).git.raw([`merge`,`--abort`])}catch(e){log.warn({err:e},`[sync] git merge --abort for stale MERGE_HEAD failed`)}}if(this.conflictCount>0){this.transitionTo(`conflict`),log.warn({count:this.conflictCount},`[sync] restarted with active conflicts — sync paused`);return}let s=computeRemainingMs(this.lastFetchUtc,this.pullIntervalSeconds),g=computeRemainingMs(this.lastSyncUtc,this.pushIntervalSeconds);this.schedulePull(s>0?s:void 0),this.schedulePush(g>0?g:void 0),log.info({branch:this.currentBranch,pullDelayMs:s,pushDelayMs:g},`[sync] started`)}stop(){this.pullTimer!==null&&(clearTimeout(this.pullTimer),this.pullTimer=null),this.pushTimer!==null&&(clearTimeout(this.pushTimer),this.pushTimer=null),this.stateSaveTimer!==null&&(clearTimeout(this.stateSaveTimer),this.stateSaveTimer=null),this.state!==`dormant`&&this.transitionTo(`dormant`)}async destroy(){this.stop(),this.saveStateNow()}async setEnabled(e){if(this.syncEnabled!==e){if(this.syncEnabled=e,!e){this.pullTimer!==null&&(clearTimeout(this.pullTimer),this.pullTimer=null),this.pushTimer!==null&&(clearTimeout(this.pushTimer),this.pushTimer=null);let e=3e4,t=Date.now();for(;this.pullInFlight||this.pushInFlight;){if(Date.now()-t>3e4){log.warn({pullInFlight:this.pullInFlight,pushInFlight:this.pushInFlight},`[sync] setEnabled(false): timed out waiting for in-flight cycle to drain`);break}await setTimeout$1(50)}this.pausedReason=void 0,this.error=void 0,this.transitionTo(this.hasRemote?`disabled`:`dormant`),this.saveStateNow();return}try{this.hasRemote=(await createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs}).git.raw(`remote`,`-v`)).trim().length>0}catch(e){log.warn({err:e},`[sync] remote detection failed during enable`)}if(this.pausedReason=void 0,this.error=void 0,this.consecutiveFailures=0,!this.hasRemote){this.transitionTo(`dormant`),this.saveStateNow();return}this.transitionTo(`idle`),this.schedulePull(0),this.schedulePush(),this.saveStateNow()}}async trigger(e=`sync`){this.consecutiveFailures=0,(this.pausedReason===`dirty-tree`||this.pausedReason===`external-changes-pending`)&&(this.pausedReason=void 0,this.error=void 0),this.state===`dormant`||this.state===`disabled`||this.state===`conflict`||this.state===`auth-error`?log.warn({op:e,state:this.state,syncEnabled:this.syncEnabled,hasRemote:this.hasRemote,pausedReason:this.pausedReason,conflictCount:this.conflictCount},`[sync] trigger(${e}) ignored — state=${this.state}`):log.info({op:e,state:this.state},`[sync] trigger(${e}) running`),e===`push`?await this.runPushCycle():(e===`pull`||await this.runPushCycle(),await this.runPullCycle())}getStatus(){return{state:this.state,lastSyncUtc:this.lastSyncUtc,lastFetchUtc:this.lastFetchUtc,lastPushedSha:this.lastPushedSha,ahead:this.ahead,behind:this.behind,consecutiveFailures:this.consecutiveFailures,conflictCount:this.conflictCount,hasRemote:this.hasRemote,syncEnabled:this.syncEnabled===!0,identityUnresolved:this.identityUnresolved,error:this.error,pausedReason:this.pausedReason}}async refreshIdentity(){let e=await resolveGitIdentity(this.projectDir)===null;this.identityUnresolved!==e&&(this.identityUnresolved=e,this.cc1Broadcaster?.signal(`sync-status`))}getConflicts(){return this.conflictStore.list()}async resolveConflict(e,t,s){await this.conflictStore.resolveConflict(e,t,s),this.conflictCount=this.conflictStore.count(),this.conflictCount===0&&this.state===`conflict`&&(this.transitionTo(`idle`),this.pausedReason=void 0,this.schedulePull(),this.schedulePush()),this.scheduleSaveState()}updateCurrentBranch(e){e===null?this.state!==`dormant`&&this.state!==`disabled`&&(this.transitionTo(`disabled`),this.pausedReason=`detached-head`,this.scheduleSaveState()):this.currentBranch!==e&&(this.currentBranch=e,this.conflictStore.setBranch(e),this.state===`disabled`&&this.pausedReason===`detached-head`&&(this.pausedReason=void 0,this.transitionTo(`idle`),this.schedulePull(),this.schedulePush()))}schedulePull(e){this.pullTimer!==null&&clearTimeout(this.pullTimer);let t=e??this.effectivePullDelayMs();this.pullTimer=setTimeout(()=>{this.pullTimer=null,this.runPullCycle().catch(e=>{log.error({err:e},`[sync] pull cycle uncaught error`)})},t)}schedulePush(e){this.pushTimer!==null&&clearTimeout(this.pushTimer);let t=e??jitteredMs(this.pushIntervalSeconds);this.pushTimer=setTimeout(()=>{this.pushTimer=null,this.runPushCycle().catch(e=>{log.error({err:e},`[sync] push cycle uncaught error`)})},t)}effectivePullDelayMs(){let e=this.consecutiveFailures,t=backoffMs(e);return t>0?t:jitteredMs(this.pullIntervalSeconds)}async runPullCycle(){if(!this.pullInFlight&&!(this.state===`dormant`||this.state===`disabled`)){if(this.state===`conflict`){this.schedulePull();return}if(isUnbornHead(this.projectDir)){this.schedulePull();return}this.pullInFlight=!0;try{await this.doPullCycle()}finally{this.pullInFlight=!1,this.schedulePull()}}}async doPullCycle(){let e=createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs}),t;try{let s=(await e.git.raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();if(!s||s===`HEAD`){this.transitionTo(`disabled`),this.pausedReason=`detached-head`,log.warn({},`[sync] detached HEAD — pausing sync`);return}t=s,this.currentBranch=t}catch(e){this.handleError(classifyGitError(e instanceof Error?e:Error(String(e))));return}this.transitionTo(`fetching`);try{await e.git.fetch(`origin`),this.lastFetchUtc=new Date().toISOString(),this.consecutiveFailures=0,this.error=void 0}catch(e){let t=classifyGitError(e instanceof Error?e:Error(String(e)));this.handleError(t);return}try{let t=await e.git.status();this.ahead=t.ahead,this.behind=t.behind}catch{}if(this.behind>0&&this.conflictCount===0){this.transitionTo(`pulling`),this.setBatchInProgress?.(!0);try{if(await this.commitDirtyContentFilesToHead(e),!await this.pauseIfNonContentDirty(e))return;await e.git.merge([`origin/${t}`]),this.lastSyncUtc=new Date().toISOString(),this.behind=0,this.transitionTo(`idle`)}catch(e){let t=classifyGitError(e instanceof Error?e:Error(String(e)));t.class===`semantic`&&t.subclass===`merge-conflict`?await this.handleMergeConflict():this.handleError(t);return}finally{this.setBatchInProgress?.(!1)}}else this.transitionTo(`idle`);this.scheduleSaveState()}async runPushCycle(){if(!this.pushInFlight&&!(this.state===`dormant`||this.state===`disabled`)&&!(this.state===`conflict`||this.state===`auth-error`)){if(isUnbornHead(this.projectDir)){this.schedulePush();return}this.pushInFlight=!0;try{await this.doPushCycle(1)}finally{this.pushInFlight=!1,this.schedulePush()}}}async doPushCycle(e=0){let t=this.gatherContentFilesSync(),s=join(tmpdir(),`ok-sync-idx-${process.pid}-${Date.now()}.idx`),g=null;this.transitionTo(`pushing`);try{await withParentLock(async()=>{let e=createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs,gitIndexFile:s});if(isUnbornHead(this.projectDir)){log.info({},`[sync] repo has no commits yet — skipping push cycle`),this.transitionTo(`idle`);return}let S;try{S=(await e.git.revparse(`HEAD`)).trim()}catch(e){let t=e instanceof Error?e.message:String(e),s=`${t}\n${e.git?.toString()??t}`;if(/unknown revision or path not in the working tree/i.test(s)||/ambiguous argument 'HEAD'/i.test(s)||/does not have any commits yet/i.test(s)){log.info({},`[sync] repo has no commits yet — skipping push cycle`),this.transitionTo(`idle`);return}this.handleError(classifyGitError(e instanceof Error?e:Error(String(e))));return}await e.git.raw([`read-tree`,S]);let w=new Set;try{let t=(await e.git.raw([`ls-tree`,`-r`,`--name-only`,S])).trim();for(let e of t?t.split(`
@@ -1604,6 +1605,6 @@ In headless mode, write the recap into the research article's "Further reading"
1604
1605
  `).map(e=>e.trim()).filter(Boolean):[]}catch(t){log.error({err:t},`[sync] failed to list conflicted files — aborting merge to avoid committing unresolved state`);try{await e.git.raw([`merge`,`--abort`])}catch(e){log.warn({err:e},`[sync] git merge --abort failed during cleanup`)}this.error=`Failed to detect conflict files — merge aborted`,this.pausedReason=void 0,this.transitionTo(`idle`);return}let s=[],g=[];for(let e of t){let t=join(this.projectDir,e),S=relative(this.contentDir,t);!S.startsWith(`..`)&&!this.contentFilter.isExcluded(S)?s.push(e):g.push(e)}for(let t of g)try{await e.git.raw([`checkout`,`--theirs`,`--`,t]),await e.git.raw([`add`,`--`,t]),log.info({file:t},`[sync] auto-resolved non-content conflict with theirs`)}catch(e){log.warn({err:e,file:t},`[sync] auto-resolve failed — escalating to content conflict`),s.push(t)}if(s.length>0){for(let e of s)this.conflictStore.addConflict({file:e,detectedAt:new Date().toISOString()});this.conflictCount=this.conflictStore.count(),this.pullTimer!==null&&(clearTimeout(this.pullTimer),this.pullTimer=null),this.pushTimer!==null&&(clearTimeout(this.pushTimer),this.pushTimer=null),this.transitionTo(`conflict`),log.warn({files:s},`[sync] content conflicts — sync paused until resolved`)}else try{await e.git.raw([`commit`,`--no-edit`]),this.lastSyncUtc=new Date().toISOString(),this.behind=0,this.transitionTo(`idle`),log.info({},`[sync] all conflicts auto-resolved — merge committed`)}catch(t){log.warn({err:t},`[sync] failed to commit after auto-resolving conflicts — aborting merge`);try{await e.git.raw([`merge`,`--abort`])}catch(e){log.warn({err:e},`[sync] git merge --abort failed during cleanup`)}this.transitionTo(`idle`)}}async abortMerge(){let e=createGitInstance(this.projectDir,{credentialArgs:this.credentialArgs});try{await e.git.raw([`merge`,`--abort`]),log.info({},`[sync] merge aborted`)}catch(e){log.warn({err:e},`[sync] git merge --abort failed — conflicts.json still cleared`)}this.conflictStore.clear(),this.conflictCount=0,this.transitionTo(`idle`),this.scheduleSaveState()}handleError(e){this.error=e.message,log.warn({class:e.class,subclass:e.subclass,retryable:e.retryable,rawStderr:e.rawStderr},`[sync-error] ${e.message}`),e.class===`auth`?(this.transitionTo(`auth-error`),this.pausedReason=`auth-error`):e.class===`semantic`&&e.subclass===`protected-branch`?(this.syncEnabled=!1,this.transitionTo(`disabled`),this.pausedReason=`protected-branch`,this.onAutoDisable?.(`protected-branch`)):e.class===`local`&&e.subclass===`dirty-tree`?(this.consecutiveFailures++,this.transitionTo(`idle`),this.pausedReason=`dirty-tree`,this.schedulePush(0)):e.retryable?(this.consecutiveFailures++,this.transitionTo(`offline`)):(this.consecutiveFailures++,this.transitionTo(`idle`))}transitionTo(e){if(this.state===e)return;let t=this.state;this.state=e,log.info({from:t,to:e},`[sync] state: ${t} → ${e}`),this.onStateChange?.(e),this.cc1Broadcaster?.signal(`sync-status`)}scheduleSaveState(){this.stateSaveTimer===null&&(this.stateSaveTimer=setTimeout(()=>{this.stateSaveTimer=null,this.saveStateNow()},5e3))}saveStateNow(){try{let e={version:1,lastSyncUtc:this.lastSyncUtc,lastFetchUtc:this.lastFetchUtc,lastPushedSha:this.lastPushedSha,consecutiveFailures:this.consecutiveFailures,pausedReason:this.pausedReason,pausedSinceUtc:this.pausedReason?new Date().toISOString():void 0,inflightConflicts:this.conflictStore.list().map(e=>e.file)};writeFileSync(this.statePath,JSON.stringify(e,null,2),`utf-8`)}catch(e){log.warn({err:e},`[sync] failed to persist sync state`)}}loadState(){if(existsSync(this.statePath))try{let e=readFileSync(this.statePath,`utf-8`),t=JSON.parse(e);if(t.version!==1)return;this.lastSyncUtc=t.lastSyncUtc??null,this.lastFetchUtc=t.lastFetchUtc??null,this.lastPushedSha=t.lastPushedSha??null,this.consecutiveFailures=t.consecutiveFailures??0,this.pausedReason=t.pausedReason;let s=t.inflightConflicts??[];if(s.length>0){for(let e of s)this.conflictStore.list().some(t=>t.file===e)||this.conflictStore.addConflict({file:e,detectedAt:new Date().toISOString()});this.conflictCount=this.conflictStore.count()}}catch(e){log.warn({err:e},`[sync] failed to load sync state`)}}};const TAG_VALUE_RE=createTagInTextRegex();function createEmptyState(){return{byTag:new Map,byDoc:new Map,byDocLiteral:new Map}}function stripInlineCodeSpans(e){return e.replace(/`[^`]*`/g,``)}function extractInlineTagsFromBody(e){let t=e.replaceAll(`\r
1605
1606
  `,`
1606
1607
  `).split(`
1607
- `),s=[],g=!1,S=``;for(let e of t){let t=/^\s{0,3}([`~]{3,})/.exec(e);if(t){g?RegExp(`^\\s{0,3}${S[0]==="`"?"`":`~`}{${S.length},}\\s*$`).test(e)&&(g=!1,S=``):(g=!0,S=t[1]);continue}if(g)continue;let w=stripInlineCodeSpans(e);for(TAG_VALUE_RE.lastIndex=0;;){let e=TAG_VALUE_RE.exec(w);if(e===null)break;let t=e[2];t&&s.push(t)}}return s}var TagIndex=class{contentDir;contentFilter;state=createEmptyState();constructor(e){this.contentDir=e.contentDir,this.contentFilter=e.contentFilter}updateDocumentFromMarkdown(e,t){if(!(isSystemDoc(e)||isConfigDoc(e)))try{let{frontmatter:s,body:g}=stripFrontmatter(t),S=extractFrontmatterTags(s?unwrapFrontmatterFences(s):``),w=extractInlineTagsFromBody(g),E=new Set([...S,...w]),D=new Set;for(let e of E)for(let t of expandTagToHierarchy(e))D.add(t);this.applyDocSnapshot(e,E,D)}catch(t){console.warn(`[tag-index] Failed to scan ${e} for tag extraction:`,t),this.deleteDocument(e)}}deleteDocument(e){if(isSystemDoc(e)||isConfigDoc(e))return;let t=this.state.byDoc.get(e);if(t){for(let s of t){let t=this.state.byTag.get(s);t&&(t.delete(e),t.size===0&&this.state.byTag.delete(s))}this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)}}renameDocument(e,t,s){this.deleteDocument(e),this.updateDocumentFromMarkdown(t,s)}getDocsForTag(e){let t=this.state.byTag.get(e);return t?[...t].sort((e,t)=>e.localeCompare(t)):[]}getDocsForTagWithMatches(e){let t=this.state.byTag.get(e);if(!t)return[];let s=[];for(let g of t){let t=this.state.byDocLiteral.get(g);if(!t)continue;let S=tagsMatchingPrefix(t,e);s.push({docName:g,matchingTags:[...S].sort((e,t)=>e.localeCompare(t))})}return s.sort((e,t)=>e.docName.localeCompare(t.docName))}getAllTags(){let e=[...this.state.byTag.entries()],t=e.map(([e])=>e),s=new Set;for(let e of t){let t=e.indexOf(`/`);t>0&&s.add(e.slice(0,t));let g=t;for(;g>0;)s.add(e.slice(0,g)),g=e.indexOf(`/`,g+1)}return e.map(([e,t])=>({name:e,count:t.size,isLeaf:!s.has(e)})).sort((e,t)=>e.name.localeCompare(t.name))}init(){if(this.state=createEmptyState(),!existsSync(this.contentDir))return;let e=this.listDocsWithPaths();for(let{docName:t,filePath:s}of e)try{let e=readFileSync(s,`utf-8`);this.updateDocumentFromMarkdown(t,e)}catch(e){console.warn(`[tag-index] Failed to read ${t} during init:`,e)}}applyDocSnapshot(e,t,s){let g=this.state.byDoc.get(e)??new Set;for(let t of g){if(s.has(t))continue;let g=this.state.byTag.get(t);g&&(g.delete(e),g.size===0&&this.state.byTag.delete(t))}for(let t of s){let s=this.state.byTag.get(t);s||(s=new Set,this.state.byTag.set(t,s)),s.add(e)}s.size===0?(this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)):(this.state.byDoc.set(e,s),this.state.byDocLiteral.set(e,t))}listDocsWithPaths(){let e=[];this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}walkContentDir(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[tag-index] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.walkContentDir(s,t);continue}if(!g.isFile()||!isSupportedDocFile(g.name))continue;let S=relative(this.contentDir,s);this.contentFilter?.isExcluded(S)||t.push({docName:stripDocExtension(S),filePath:s})}}};const PARK_SNAPSHOT_ORIGIN=(()=>{let e=Object.freeze({origin:`park-snapshot`,paired:!0});return Object.freeze({source:`local`,skipStoreHooks:!1,context:e})})();function createServer$1(e){let{contentDir:t,projectDir:s=t,quiet:g=!0,debounce:S=2e3,maxDebounce:w=1e4,gitEnabled:E=!0,commitDebounceMs:D=3e4,wipRef:O=`refs/wip/main`,configHomedirOverride:k,enableTestRoutes:j=!1,shadowRepo:F,contentRoot:L,destroyTimeoutMs:B=1e4,localOpCliArgs:H,skipStateManifestCheck:q=!1}=e,J=getLogger(`server`);function Y(){let e=readConfigSafely({absPath:resolveConfigPath(`project-local`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project-local config`)}),t=e.value.autoSync?.enabled;return t==null?(e.valid||J.warn({},`[config] project-local autoSync.enabled unavailable (config invalid) — falling back to project config`),readConfigSafely({absPath:resolveConfigPath(`project`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project config`)}).value.autoSync?.enabled===!0):t===!0}initTelemetry();let ee=randomUUID(),te=getLocalDir(t);if(acquireServerLock(te,{port:e.port??0,worktreeRoot:s,kind:e.lockKind??`interactive`,capabilities:[`http`,`ws`]}),!q)try{assertCompatibleStateManifest({lockDir:te,shadowRepoDir:resolveShadowDir(s)})}catch(e){throw releaseServerLock(te),e}let ne=createBasenameIndex(),ae=(e,t)=>ne.resolveEmbed(e,t),oe,se,ce,ue,de,fe,me,ge=null,_e=null,ve=null,ye=null,Ce=new Set,we=!1,Te;function De(e){ge?.signal(e)}try{oe=createContentFilter({projectDir:s,contentDir:t}),se=new BacklinkIndex({projectDir:s,contentDir:t,contentFilter:oe}),ce=new TagIndex({contentDir:t,contentFilter:oe});try{ce.init()}catch(e){console.warn(`[server-factory] tag-index init failed; continuing with empty index:`,e)}ue={current:F},de=createPersistenceExtension({contentDir:t,projectDir:s,gitEnabled:E,commitDebounceMs:D,wipRef:O,shadowRef:ue,contentRoot:L,backlinkIndex:se,configHomedirOverride:k,getCurrentBranch:()=>rt?.getLastKnownBranch()??null,resolveEmbed:ae,getPrincipal:()=>ye,onAgentCommit:()=>ge?.signal(`session-activity`),onDiskFlush:(e,t)=>ge?.emitDiskAck(e,t),onConfigRejected:(e,t)=>ge?.emitConfigValidationRejected(e,t)}),fe=new Hocuspocus({quiet:g,debounce:S,maxDebounce:w,extensions:[de.extension]});let B=fe.shouldUnloadDocument.bind(fe);fe.shouldUnloadDocument=e=>{if((we||Ce.has(e))&&B(e))return!0;let t=e.name;return isSystemDoc(t)||isConfigDoc(t)||getReconciledBase(t)!==void 0||e.getXmlFragment(`default`).length!==0||e.getText(`source`).length!==0?!1:B(e)},Te=async e=>{Ce.add(e);try{await fe.unloadDocument(e)}finally{Ce.delete(e)}},ge=new CC1Broadcaster(fe),_e=new AgentFocusBroadcaster(fe),ve=new AgentPresenceBroadcaster(fe),me=new AgentSessionManager(fe);let q=createLiveDerivedIndexExtension({backlinkIndex:se,tagIndex:ce,signalChannel:De});fe.configuration.extensions.push(q),fe.configuration.extensions.push({__kind:`principal-auth`,async onAuthenticate(e){let t=e.token,s=parseHocuspocusAuthToken(t),g=s?.expectedServerInstanceId;if(typeof g==`string`&&g.length>0&&g!==ee)throw new HocuspocusAuthRejection(`server-instance-mismatch`,`server instance mismatch: client claimed ${g}, this server is ${ee}`);let S=s?.expectedBranch,w=getActiveBranch();if(typeof S==`string`&&S.length>0&&S!==w)throw new HocuspocusAuthRejection(`branch-mismatch`,`branch mismatch: client claimed ${S}, server is on ${w}`);if(!s)return;let E=e.context;typeof s.principalId==`string`&&(ye&&s.principalId===ye.id?E.principalId=ye.id:ye?console.warn(JSON.stringify({event:`principal-token-mismatch`,claimed:s.principalId,loaded:ye.id})):E.principalId=s.principalId),typeof s.tabSessionId==`string`&&(E.tabSessionId=s.tabSessionId),E.kind=`human`}}),fe.configuration.extensions.push({__kind:`config-doc-admission-guard`,async onAuthenticate(e){if(!isConfigDoc(e.documentName))return;let t=e.request,s=t.socket?.remoteAddress;if(s!==void 0&&!isLoopbackAddress(s))throw Error(`config-doc admission requires loopback peer (peer=${s}, doc=${e.documentName})`);let g=e.requestHeaders,S=(g&&typeof g.get==`function`?g.get(`host`):null)??t.headers?.host??void 0;if(!isAllowedWorkspaceHostHeader(S))throw Error(`config-doc admission requires loopback Host header (host=${S??`<absent>`}, doc=${e.documentName})`)}}),fe.configuration.extensions.push({__kind:`system-doc-broadcast-guard`,async beforeHandleMessage(e){if(e.documentName!==`__system__`)return;let t=new IncomingMessage(e.update);if(t.readVarString(),t.readVarUint()===MessageType.BroadcastStateless)throw Error(`inbound BroadcastStateless on ${SYSTEM_DOC_NAME} rejected — server-only channel`)}});let J=createApiExtension({hocuspocus:fe,sessionManager:me,contentDir:t,contentFilter:oe,serverInstanceId:ee,getFileIndex:()=>nt?nt.getFileIndex():new Map,getAliasMap:()=>nt?nt.getAliasMap():new Map,enableTestRoutes:j,shadowRef:ue,flushGitCommit:()=>de.flushPendingGitCommit(),getCurrentBranch:()=>rt?.getLastKnownBranch()??null,getDiskAckSVs:()=>ge?.getLatestDiskAckSVsAsBase64()??{},contentRoot:L,backlinkIndex:se,tagIndex:ce,signalChannel:De,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,onAgentWrite:e.onAgentWrite,getSyncEngine:()=>it,localOpCliArgs:H,projectDir:s,resolveEmbed:ae,getPrincipal:()=>ye,forceUnloadDocument:Te});fe.configuration.extensions.push(J),fe.configuration.extensions.push(createServerObserverExtension({mdManager,schema,shadowRef:ue,contentRoot:L,getCurrentBranch:()=>rt?.getLastKnownBranch()??null,resolveEmbed:ae}))}catch(e){throw releaseServerLock(te),e}let je=null,Me=new Map,Pe=[];function Ie(e,t){let s=resolve(e,`rescue`),g=resolve(s,`${t}${getDocExtension(t)}`);return g.startsWith(`${s}/`)?g:null}function Re(e){let t=fe.documents.get(e);if(!t)return null;let{frontmatter:s,body:g}=stripFrontmatter(t.getText(`source`).toString());return prependFrontmatter(s,g)}let ze=(e,t)=>applyExternalChange(fe,e,t,ae),Be=e=>{if(!e)return;let t=`[[${e}]]`;for(let[s]of fe.documents){if(isSystemDoc(s)||isConfigDoc(s))continue;let g=fe.documents.get(s);if(!g)continue;let S=g.getText(`source`).toString();if(S.includes(t))try{g.transact(()=>{applyDiskContentToDoc(g,S,ae,s)},FILE_WATCHER_ORIGIN)}catch(t){J.error({err:t,docName:s,assetBasename:e},`[asset-event] failed to re-render ${s} for asset basename ${e}`)}}},Ve=null,Ue=e=>{e&&(Ve===null&&(Ve=new Set,setImmediate(()=>{let e=Ve;if(Ve=null,e)try{for(let t of e)Be(t)}catch(t){J.error({err:t,basenames:[...e]},`[asset-event] dedup rerender pass crashed`)}})),Ve.add(e))};function We(e){switch(e.kind){case`rename`:return e.newDocName;case`asset-create`:case`asset-delete`:return e.relativePath;default:return e.docName}}async function Ge(e){try{switch(e.kind){case`create`:J.info({docName:e.docName},`[reconcile] create: ${e.docName}`),se.updateDocumentFromMarkdown(e.docName,e.content),se.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist create for ${e.docName}:`,t)}),ce.updateDocumentFromMarkdown(e.docName,e.content),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break;case`update`:{let{docName:t,content:s}=e,g=fe.documents.get(t);if(!g){se.updateDocumentFromMarkdown(t,s),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist closed-doc update for ${t}:`,e)}),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);return}let S=getReconciledBase(t)??``,w=Re(t)??S,E=reconcile({docName:t,base:S,ours:w,theirs:s}),D=contentHash(S).slice(0,6),O=contentHash(w).slice(0,6),k=contentHash(s).slice(0,6);switch(J.info({docName:t,base:D,ours:O,theirs:k,result:E.kind},`[reconcile] ${t} base=${D} ours=${O} theirs=${k} result=${E.kind}`),E.kind){case`noop`:se.updateDocumentFromMarkdown(t,s),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist noop update for ${t}:`,e)}),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);break;case`clean`:try{ze(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist clean update for ${t}:`,e)}),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply clean content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`merged`:try{ze(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist merged update for ${t}:`,e)}),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply merged content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`conflicts`:try{ze(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),incrementConflict(),se.updateDocumentFromMarkdown(t,s),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist conflict update for ${t}:`,e)}),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply conflict content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`refused`:{incrementConflict();let e=g.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,E.reason);break}}break}case`delete`:{let{docName:t}=e,s=fe.documents.get(t);if(!s){se.deleteDocument(t),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist closed-doc delete for ${t}:`,e)}),ce.deleteDocument(t),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);return}let g=getReconciledBase(t)??``,S=Re(t)??``,w=S!==g;if(w&&ue.current){let e=ue.current,s=rt?.getLastKnownBranch()??`main`;queueMicrotask(()=>{saveInMemoryCheckpoint(e,L??``,{kind:`external-change-rescue`,docName:t,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:s,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:t},`[reconcile] rescue checkpoint saved (delete): ${t}`)}).catch(e=>{J.error({docName:t,err:e},`[reconcile] rescue checkpoint write failed: ${t}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),deleteReconciledBase(t),se.deleteDocument(t),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist delete for ${t}:`,e)}),ce.deleteDocument(t),J.info({docName:t,isDirty:w},`[reconcile] delete: ${t} (dirty=${w})`),fe.closeConnections(t),await Te(s),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`rename`:{let{oldDocName:t,newDocName:s,content:g}=e,S=fe.documents.get(t);if(deleteReconciledBase(t),setReconciledBase(s,g),se.renameDocument(t,s,g),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist rename for ${t} -> ${s}:`,e)}),ce.renameDocument(t,s,g),S){let e=S.getMap(`lifecycle`);e.set(`status`,`renamed`),e.set(`newPath`,s)}J.info({oldDocName:t,newDocName:s},`[reconcile] rename: ${t} → ${s}`),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`conflict`:{let{docName:t}=e,s=fe.documents.get(t);if(!s)return;let g=s.getMap(`lifecycle`);g.set(`status`,`conflict`),g.set(`reason`,`conflict-markers`),J.info({docName:t},`[reconcile] conflict markers detected: ${t}`);break}case`asset-create`:ne.add(e.relativePath),De(`files`),Ue(basename(e.relativePath));break;case`asset-delete`:ne.remove(e.relativePath),De(`files`),Ue(basename(e.relativePath));break;default:assertNeverDiskEvent(e)}}catch(t){let s=We(e);J.error({err:t,kind:e.kind,label:s},`[reconcile] failed to handle ${e.kind} for ${s}`)}}let Ke=[];async function Xe(e){if(isBatchInProgress()){Ke.push(e);return}await Ge(e)}async function $e(){let e=Ke.splice(0,Ke.length);for(let t of e)await Ge(t)}let nt=null,rt=null,it=null,at=null;async function st(e){if(fe.documents.size===0)return;let t=!1,s=new Promise(e=>{fe.configuration.extensions.push({async afterUnloadDocument({instance:s}){!t&&s.getDocumentsCount()===0&&(t=!0,e())}})}),g=Array.from(fe.documents.keys());fe.closeConnections(),fe.flushPendingStores();for(let e of fe.documents.values())e.getConnectionsCount()===0&&fe.unloadDocument(e).catch(t=>{console.warn(JSON.stringify({event:`ok-shutdown-unload-document-failed`,docName:e.name,reason:t instanceof Error?t.message:String(t)}))});let S,w=new Promise((s,w)=>{S=setTimeout(()=>{t=!0;let s=Array.from(fe.documents.keys()),S=[],E=[];if(ue.current){for(let e of s)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let t=Re(e);if(t===null){J.warn({docName:e},`[rescue] skipping ${e} — document dropped from map mid-rescue`),E.push(e);continue}let s=Ie(ue.current.gitDir,e);if(!s){J.warn({docName:e,gitDir:ue.current.gitDir},`[rescue] path-traversal guard rejected docName: ${e}`),E.push(e);continue}mkdirSync(dirname(s),{recursive:!0}),writeFileSync(s,t,`utf-8`),incrementRescueBuffer(),S.push(e),J.info({docName:e},`[rescue] rescue buffer saved on flush timeout: ${e}`)}catch(t){E.push(e),J.error({err:t,docName:e},`[rescue] failed to write rescue buffer for ${e}`)}}else J.warn({stillLoadedCount:s.length},`[rescue] shadow repo unavailable at flush timeout — ${s.length} doc(s) will be lost: [${s.join(`, `)}]`),E.push(...s);let D=S.length>0||E.length>0?` — rescued [${S.join(`, `)}]${E.length>0?`, lost [${E.join(`, `)}]`:``}`:``;w(Error(`flushAllStoresAndWait timeout after ${e}ms — ${s.length}/${g.length} docs did not unload: [${s.join(`, `)}]${D}`))},e)});try{await Promise.race([s,w])}finally{S!==void 0&&clearTimeout(S)}}async function vt(){return at||(at=(async()=>{let e=Date.now(),t=[];we=!0;let g,S=await Promise.race([Dt.then(()=>`completed`,e=>(J.debug({err:e},`[server] init incomplete during shutdown`),`failed`)),new Promise(e=>{g=setTimeout(()=>e(`timeout`),5e3)})]);g!==void 0&&clearTimeout(g),S===`timeout`&&J.warn({},`[server] init did not complete within 5s during shutdown`);let w=fe.documents.size;try{try{try{rt&&=(await rt.unsubscribe(),null),nt&&=(await nt.unsubscribe(),null);for(let{docName:e,cleanup:t}of Pe)try{await t()}catch(t){J.warn({err:t,docName:e},`[server] failed to stop config-file-watcher for ${e}`)}Pe.length=0}catch(e){t.push({phase:`watcher-unsubscribe`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1 watcher unsubscribe failed`)}try{ge?.destroy(),ve?.destroy(),je&&=(await je.disconnect(),null);for(let[e,t]of Me)try{await t.disconnect()}catch(t){J.warn({err:t,docName:e},`[server] failed to disconnect ${e} during shutdown`)}Me.clear()}catch(e){t.push({phase:`cc1-teardown`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1b CC1 teardown failed`)}try{await me.closeAll()}catch(e){t.push({phase:`agent-session-drain`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-2 agent session drain failed`)}try{await st(B)}catch(e){t.push({phase:`flush-all-stores`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-3 flush failed`)}let e;try{await Promise.race([(async()=>{await de.flushPendingGitCommit(),await de.waitForPendingCommits()})(),new Promise((t,s)=>{e=setTimeout(()=>s(Error(`L2 git flush timeout`)),B)})])}catch(e){t.push({phase:`git-commit-flush`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-4 git commit flush failed`)}finally{e!==void 0&&clearTimeout(e)}try{it&&=(await it.destroy(),null)}catch(e){t.push({phase:`sync-engine-stop`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown sync-engine-stop failed`)}}finally{if(ue.current){try{let e=(await esm_default({baseDir:s,timeout:{block:5e3}}).revparse(`HEAD`)).trim();e&&writeFileSync(resolve(ue.current.gitDir,`last-known-head`),e,`utf-8`)}catch{}try{destroyShadowRepo(ue.current)}catch(e){t.push({phase:`shadow-repo-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-5 destroyShadowRepo failed`)}}let g=Date.now()-e;t.length===0?J.info({documentCount:w,durationMs:g},`[server] shutdown flushed ${w} documents in ${g}ms`):J.warn({documentCount:w,durationMs:g,phaseErrors:t},`[server] shutdown flushed ${w} documents in ${g}ms with ${t.length} phase error(s)`)}}finally{try{releaseServerLock(te)}catch(e){t.push({phase:`server-lock-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-6 releaseServerLock failed`)}try{await shutdownTelemetry()}catch(e){t.push({phase:`telemetry-shutdown`,error:e instanceof Error?e.message:String(e)})}}})(),at)}let Tt=[];async function Et(){try{ye=await loadPrincipal(t),J.info({principalId:ye.id},`[server] principal loaded`)}catch(e){J.warn({err:e},`[server] principal load failed — browser writes will use SERVICE_WRITER`)}if(!ue.current)try{ue.current=await initShadowRepo(s),J.info({gitDir:ue.current.gitDir},`[server] history repo initialized at ${ue.current.gitDir}`)}catch(e){J.error({err:e},`[server] history repo init failed`),Tt.push(`shadow-repo`)}if(ue.current)try{await shadowGit(ue.current).raw(`rev-parse`,`--git-dir`)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`not a git repository`)||t.includes(`invalid object`)){J.warn({},`[server] history repo appears corrupted — reinitializing`);try{ue.current=await initShadowRepo(s)}catch(e){J.error({err:e},`[server] history repo reinit failed`),ue.current=void 0,Tt.includes(`shadow-repo`)||Tt.push(`shadow-repo`)}}else J.error({err:e},`[server] history repo check failed (transient?)`)}if(ue.current)try{let e=resolve(ue.current.gitDir,`last-known-head`),t=null;try{t=readFileSync(e,`utf-8`).trim()||null}catch{}let g=null;try{g=(await esm_default({baseDir:s,timeout:{block:1e4}}).revparse(`HEAD`)).trim()||null}catch{}if(g!==null){if(g!==t){let e=`main`;try{let t=(await esm_default({baseDir:s,timeout:{block:1e4}}).raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();t&&t!==`HEAD`&&(e=t)}catch{}J.info({lastKnownHead:t,currentHead:g,branch:e},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=import`);try{await commitUpstreamImport(ue.current,L??``,t,g,e),incrementUpstreamImport()}catch(e){J.warn({err:e},`[head-drift] commitUpstreamImport failed — continuing`)}}else J.info({currentHead:g},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=noop`);try{writeFileSync(e,g,`utf-8`)}catch(e){J.warn({err:e},`[head-drift] failed to write last-known-head`)}}}catch(e){J.warn({err:e},`[head-drift] check failed — continuing`)}try{let e=recoverPendingManagedRename(t);if(e.recovered&&e.journal){let t=e.journal.version===2?e.journal.fromPath:e.journal.sourceDocName,s=e.journal.version===2?e.journal.toPath:e.journal.destinationDocName;J.warn({journalVersion:e.journal.version,fromPath:t,toPath:s,restoredDocNames:e.restoredDocNames},`[managed-rename] recovered pending rename ${t} -> ${s}`)}}catch(e){J.error({err:e},`[server] managed rename recovery failed`),Tt.push(`managed-rename-recovery`)}try{let e=cleanupOrphanUploadTempfiles(t);(e.deleted>0||e.errors>0)&&J.info({scanned:e.scanned,deleted:e.deleted,errors:e.errors},`[upload-tempfile-sweep] swept ${e.deleted} orphan tempfile(s)`)}catch(e){J.error({err:e},`[server] upload-tempfile sweep failed`),Tt.push(`upload-tempfile-sweep`)}try{je=await fe.openDirectConnection(SYSTEM_DOC_NAME),ge?.emitServerInfo(ee,getActiveBranch())}catch(e){J.error({err:e},`[server] failed to open __system__ direct connection — CC1 push disabled`),Tt.push(`cc1-push`)}for(let e of CONFIG_DOC_NAMES)try{let t=await fe.openDirectConnection(e);Me.set(e,t)}catch(t){J.error({err:t,docName:e},`[server] failed to open ${e} direct connection — config bind degraded`),Tt.push(`config-doc:${e}`)}let e=new Map([[CONFIG_DOC_NAME_PROJECT,resolveConfigPath(`project`,s)],[CONFIG_DOC_NAME_PROJECT_LOCAL,resolveConfigPath(`project-local`,s)],[CONFIG_DOC_NAME_USER,resolveConfigPath(`user`,s,k)]]);for(let t of CONFIG_DOC_NAMES){let s=e.get(t);if(s)try{J.info({docName:t,path:s},`[config-file-watcher] starting`);let e=await startConfigFileWatcher(s,e=>{let s=fe.documents.get(t);J.info({docName:t,hasDocument:s!==void 0,contentLength:e.length},`[config-file-watcher] file changed`);let g=applyExternalConfigChange(s??null,t,e,de.configPersistenceCtx);if(J.info({docName:t,outcome:g},`[config-file-watcher] applyExternalConfigChange outcome`),t===`__config__/project`||t===`__local__/project`){let e=Y();it?.setEnabled(e).catch(t=>{J.warn({err:t,enabled:e},`[sync] failed to apply autoSync.enabled from config`)})}});Pe.push({docName:t,cleanup:e}),J.info({docName:t,path:s},`[config-file-watcher] started`)}catch(e){J.warn({err:e,docName:t,path:s},`[config-file-watcher] failed to start for ${t}`),Tt.push(`config-file-watcher:${t}`)}}let g=resolveGitDir(s),S=g?readBranchFromHead(g)??`main`:`main`;switchReconciledBaseScope(S),se.switchBranch(S);try{nt=await startWatcher(t,Xe,oe),se.rebuildFromDisk(getActiveBranch()),se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist startup cache for ${getActiveBranch()}:`,e)}),ce.init();let e=0;try{seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,g)=>{e++,J.warn({reason:t,code:s,path:g},`[basename-index] skipped entry during seed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e},`[basename-index] startup seed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve`),Tt.push(`basename-index-partial`))}catch(e){J.error({err:e},`[basename-index] startup seed failed`),Tt.push(`basename-index`)}}catch(e){J.error({err:e},`[server] disk bridge watcher failed to start`),Tt.push(`file-watcher`)}try{rt=await startHeadWatcher(s,async({trigger:e})=>{if(J.info({trigger:e},`[batch] begin trigger=${e}`),incrementBatch(),fe.flushPendingStores(),await de.flushPendingGitCommit(),setBatchInProgress(!0),ue.current){let e=getActiveBranch(),t=resolveGitDir(s),g=t?readBranchFromHead(t)??e:e,S=[];for(let[e,t]of fe.documents){if(isSystemDoc(e)||isConfigDoc(e))continue;let s=null;if(t.transact(()=>{s=Re(e)},PARK_SNAPSHOT_ORIGIN),s===null)continue;let g=getReconciledBase(e)??s;S.push({docName:e,markdown:s,diskSnapshot:g})}if(S.length>0)try{let t=await parkBranch(ue.current,e,SERVICE_WRITER.id,S,g);t&&(incrementPark(),J.info({count:S.length,branch:e,sha:t.slice(0,8)},`[history] parked ${S.length} docs on ${e} → ${t.slice(0,8)}`))}catch(e){J.error({err:e},`[shadow] park failed`)}}},async e=>{let s=Ke.length,g=e.newBranch??`main`;if(J.info({kind:e.batchKind,headMoved:e.headMoved,docs:s,timeout:!!e.timeout},`[batch] end kind=${e.batchKind} headMoved=${e.headMoved} docs=${s}${e.timeout?` timeout`:``}`),e.batchKind===`within-branch`)setBatchInProgress(!1),await $e(),await de.flushDeferredStores(`within-branch`);else{incrementBranchSwitch(),Ke.splice(0,Ke.length),switchReconciledBaseScope(g),se.switchBranch(g),oe.rebuildDirCount();try{let e=0;ne.clear(),seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,S)=>{e++,J.warn({reason:t,code:s,path:S,branch:g},`[basename-index] skipped entry during branch-switch reseed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e,branch:g},`[basename-index] branch-switch reseed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve on this branch`),Tt.includes(`basename-index-partial`)||Tt.push(`basename-index-partial`))}catch(e){J.error({err:e,branch:g},`[basename-index] branch-switch reseed failed`)}for(let[e,s]of fe.documents)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let S=safeContentPath(e,t);if(!existsSync(S)){let t=getReconciledBase(e)??``,S=Re(e)??``;if(S!==t&&ue.current){let t=ue.current;queueMicrotask(()=>{saveInMemoryCheckpoint(t,L??``,{kind:`external-change-rescue`,docName:e,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:g,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:e},`[reconcile] rescue checkpoint saved on branch switch: ${e}`)}).catch(t=>{J.error({docName:e,err:t},`[reconcile] rescue checkpoint write failed: ${e}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),J.info({docName:e,branch:g},`[branch-switch] tombstone: ${e} (not on ${g})`);continue}let w=readFileSync(S,`utf-8`);ze(e,w),setReconciledBase(e,w),J.info({docName:e},`[branch-switch] reset: ${e}`)}catch(t){J.error({err:t,docName:e},`[branch-switch] failed to reset ${e}`)}if(J.info({branch:g,docCount:fe.documents.size},`[branch-switch] loaded branch ${g} (${fe.documents.size} docs)`),se.rebuildFromDisk(g),se.saveToDisk(g).catch(e=>{console.warn(`[backlinks] Failed to persist branch cache for ${g}:`,e)}),ce.init(),ue.current&&e.batchKind===`cross-branch`){let e=0;for(let[t]of fe.documents)if(!(isSystemDoc(t)||isConfigDoc(t)))try{let s=await readParkedState(ue.current,g,SERVICE_WRITER.id,t);if(!s||s.markdown===s.diskSnapshot)continue;let S=getReconciledBase(t);if(!S)continue;let w=reconcile({docName:t,base:s.diskSnapshot,ours:s.markdown,theirs:S});switch(w.kind){case`merged`:case`clean`:ze(t,w.newContent),setReconciledBase(t,w.newContent),e++;break;case`conflicts`:ze(t,w.newContent),setReconciledBase(t,w.newContent),incrementConflict(),e++;break;case`noop`:case`refused`:break}}catch(e){J.error({err:e,docName:t},`[branch-switch] restore WIP failed for ${t}`)}e>0&&J.info({count:e,branch:g},`[branch-switch] restored ${e} parked docs on ${g}`)}if(e.oldBranch?.startsWith(`detached-`)&&ue.current)try{let t=shadowGit(ue.current),s=(await t.raw(`for-each-ref`,`refs/wip/${e.oldBranch}/`,`--format=%(refname)`)).trim();if(s){for(let e of s.split(`
1608
- `))e&&await t.raw(`update-ref`,`-d`,e);J.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`)}}catch(e){J.error({err:e},`[branch-switch] detached cleanup failed`)}setBatchInProgress(!1),await de.flushDeferredStores(`discard-stale`),ge?.emitBranchSwitched(g)}if(e.headMoved&&e.newHead&&ue.current&&s>0){let t=L??`.`;try{let s=await commitUpstreamImport(ue.current,t,e.oldHead,e.newHead,g);incrementUpstreamImport(),J.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:s.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${s.slice(0,8)}`)}catch(e){J.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){J.error({err:e},`[server] HEAD watcher failed to start`),Tt.push(`head-watcher`)}let w=H?.[0]??`open-knowledge`,E=[`-c`,`credential.helper=!${H&&H.length>1?H.join(` `):w} auth git-credential`];try{it=new SyncEngine({projectDir:s,contentDir:t,contentFilter:oe,contentRoot:L,syncEnabled:Y(),credentialArgs:E,cc1Broadcaster:ge,setBatchInProgress:e=>{setBatchInProgress(e),e||de.flushDeferredStores(`within-branch`).catch(e=>{J.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{J.info({state:e},`[sync] state → ${e}`)},onAutoDisable:async e=>{J.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await writeConfigPatch({cwd:s,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||J.error({result:t,reason:e,humanError:humanFormat(t.error),configPath:resolveConfigPath(`project-local`,s)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await it.start()}catch(e){J.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),it=null}}let Dt=Et();return{hocuspocus:fe,sessionManager:me,cc1Broadcaster:ge,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,contentFilter:oe,basenameIndex:ne,serverInstanceId:ee,destroy:vt,ready:Dt,degraded:Tt,lockDir:te,get syncEngine(){return it}}}const LEGACY_RUNTIME_FILENAMES=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],LEGACY_RUNTIME_DIRNAMES=[`cache`,`tmp`];function findLegacyRuntimeFiles(e){let t=resolve(e,LOCAL_DIR);if(!(()=>{if(!existsSync(t))return!0;try{return readdirSync(t).length===0}catch{return!0}})())return[];let s=[];for(let t of LEGACY_RUNTIME_FILENAMES)existsSync(resolve(e,t))&&s.push(t);for(let t of LEGACY_RUNTIME_DIRNAMES){let g=resolve(e,t);try{existsSync(g)&&statSync(g).isDirectory()&&s.push(`${t}/`)}catch{}}return s}function computeWorktreeAttributes(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const DEFAULT_IDLE_THRESHOLD_MS=1800*1e3,DESTROY_STEP_TIMEOUT_MS=5e3;async function bootServer(e){initTelemetry();let{kind:t,gitdir:s}=computeWorktreeAttributes(e.projectDir??e.contentDir),g={"ok.worktree.kind":t};return s!==null&&(g[`ok.worktree.gitdir`]=normalizeFsPath(s)),withSpan(`ok.boot`,{attributes:g},async()=>bootServerInner(e))}async function bootServerInner(e){let t=e.skipAutoInit??!1,s=e.attachUiSibling??!0,g=e.idleShutdownMs,S=e.log??getLogger(`boot`),w=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,E=e.lockKind??w??`interactive`,{createServer:D}=await import(`node:http`),{updateServerLockPort:O}=await import(`./server-lock-D7DXNVql-B5nINglj.mjs`).then(e=>e.a),k=!1;if(!t&&e.autoInitFn)try{k=!!await e.autoInitFn()}catch(e){S.warn({err:e},`autoInitFn failed`)}let j=e.projectDir??e.contentDir,F=resolve(j,`.ok`);if(!existsSync(resolve(F,`config.yml`)))throw new MissingOkConfigError(existsSync(F)?`config`:`okdir`,j);existsSync(resolve(F,`.gitignore`))||console.warn("[boot] Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let L=findLegacyRuntimeFiles(F);L.length>0&&console.warn(`[boot] Found legacy runtime files at .ok/${L.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${LOCAL_DIR}/.`);let B=createServer$1({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:E,skipStateManifestCheck:e.skipStateManifestCheck}),{hocuspocus:H,destroy:q,ready:J,degraded:Y,lockDir:ee,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae}=B,oe=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),se=e.port??0,ce=createMcpHttpHandler({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${oe}:${se}`,log:S}),ue=D(),de=mountMcpAndApi({httpServer:ue,hocuspocus:H,mcpHttpHandler:ce,log:S,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae,keepaliveGraceMs:e.keepaliveGraceMs}),fe=null;g!==null&&(fe=attachIdleShutdown({httpServer:ue,thresholdMs:g??DEFAULT_IDLE_THRESHOLD_MS,log:S,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await q()})})),await new Promise((t,s)=>{let g=e=>s(e);ue.once(`error`,g),ue.listen(e.port,e.host,()=>{ue.removeListener(`error`,g),t()})});let me=ue.address(),ge=typeof me==`object`&&me?me.port:e.port??0;if(se=ge,O(ee,ge),s&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:ee,log:S})}catch(e){S.warn({err:e},`spawnUiSiblingFn failed`)}let _e=!1,ve=async(e,t)=>{let s;try{await Promise.race([t(),new Promise((t,g)=>{s=setTimeout(()=>{g(Error(`${e} timed out after ${DESTROY_STEP_TIMEOUT_MS}ms`))},DESTROY_STEP_TIMEOUT_MS),s.unref?.()})])}finally{s!==void 0&&clearTimeout(s)}};return{httpServer:ue,destroy:async()=>{if(_e)return;_e=!0;let e=[],t=async(t,s)=>{try{await ve(t,s)}catch(s){e.push(s),S.warn({err:s,step:t},`bootServer destroy step failed`)}};try{fe?.detach()}catch(t){e.push(t),S.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(await t(`mount.shutdown`,()=>de.shutdown()),await t(`mcpHttpHandler.close`,()=>ce.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{de.wss.close(s=>s?t(s):e())})),await t(`httpServer.closeAllConnections`,async()=>{ue.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{ue.close(s=>s&&s.code!==`ERR_SERVER_NOT_RUNNING`?t(s):e())})),await t(`destroyHocuspocus`,()=>q()),await t(`shutdownTelemetry`,()=>shutdownTelemetry()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)},lockDir:ee,contentDir:e.contentDir,port:ge,ready:J,degraded:Y,didAutoInit:k,serverInstance:B}}const ConfigSchema=ConfigSchema$1;function detectClaudeDesktopPresence(e={}){let t=e.home??homedir(),s=e.platformName??process.platform,g=e.env??process.env;return s===`darwin`?existsSync(join(t,`Library`,`Application Support`,`Claude`)):s===`win32`?existsSync(join(g.APPDATA??join(t,`AppData`,`Roaming`),`Claude`)):!1}const execFileAsync=promisify(execFile);var ProjectGitInitError=class extends Error{stderr;constructor(e,t=``,s){super(e,s),this.name=`ProjectGitInitError`,this.stderr=t}};async function isInsideExistingWorkTree(e){try{let{stdout:t}=await execFileAsync(`git`,[`rev-parse`,`--is-inside-work-tree`],{cwd:e});return t.trim()===`true`}catch{return!1}}async function ensureProjectGit(e){let t=resolve(e),s=resolve(t,`.git`);if(existsSync(s)||await isInsideExistingWorkTree(t))return{didInit:!1};let g=``;try{g=(await execFileAsync(`git`,[`init`,`--initial-branch=main`,t])).stderr??``}catch(e){let s=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new ProjectGitInitError(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,s,{cause:e})}if(!existsSync(resolve(s,`HEAD`)))throw new ProjectGitInitError(`git init reported success but ${s}/HEAD is missing (partial init detected)`,g);return console.log(`[project-git] initialized .git/ at ${t} (branch: main)`),{didInit:!0}}async function resolvePackageVersion(e,t){let s;try{s=createRequire(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=dirname(s),g=0;g<32;g+=1){let s=join(t,`package.json`);if(existsSync(s))try{let t=JSON.parse(await readFile$1(s,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let g=dirname(t);if(g===t)return;t=g}}export{buildSkillZip as $,isInitializedNotification as $n,parseHocuspocusAuthToken as $t,ROLLBACK_ORIGIN as A,safeSubdir as An,getMeter as At,TagIndex as B,toBroadcasterKey as Bn,isAllowedApiOrigin as Bt,MCP_SERVER_NAME as C,rewriteWikiLinksForDocumentRename as Cn,evictStaleTrackerEntries as Ct,OBSERVER_SYNC_ORIGIN as D,runDeviceFlowSubprocess as Dn,getCurrentMcpLogger as Dt,MissingOkConfigError as E,runCloneSubprocess as En,gcCheckpointRefs as Et,STARTER_TEMPLATES as F,setActiveSpanAttributes as Fn,incrementServerObserverFire as Ft,applySeed as G,validateSkillZip as Gn,isPairedWriteOrigin as Gt,acquireUiLock as H,updateUiLockPort as Hn,isConfigDoc as Ht,STATE_MANIFEST_FILENAME as I,shadowGit as In,initShadowRepo as It,attachIdleShutdown as J,writeStateManifest as Jn,lastKnownHash as Jt,assertCompatibleStateManifest as K,withSpan as Kn,isSelfWrite as Kt,SeedPrerequisiteError as L,shutdownTelemetry as Ln,initTelemetry as Lt,SKILL_INSTALL_EVENTS_FILE_REL as M,saveInMemoryCheckpoint as Mn,getTracer as Mt,STARTER_FOLDERS as N,saveVersion as Nn,handleCollabSocketError as Nt,PinoLogger as O,runWithMcpLogger as On,getLocalDir as Ot,STARTER_FOLDER_FRONTMATTER_FILENAME as P,seedBasenameIndex as Pn,incrementCollabSocketFilteredError as Pt,buildReadResult as Q,LATEST_PROTOCOL_VERSION as Qn,mountMcpAndApi as Qt,SeedRootDirError as R,splitMarkdownBlocks as Rn,installTestLoggers as Rt,MAX_AGENT_SESSIONS as S,rewriteMarkdownLinksForDocumentRename as Sn,ensureProjectGit as St,McpLogger as T,runAuthStatusSubprocess as Tn,formatContributors as Tt,applyAgentMarkdownWrite as U,validateAgentId as Un,isHocuspocusAuthRejectionReason as Ut,UiLockCollisionError as V,updateLastKnownHash as Vn,isAllowedWorkspaceHostHeader as Vt,applyExternalChange as W,validateCloneInputs as Wn,isLoopbackAddress as Wt,buildAndOpenSkill as X,writeTracker as Xn,loadPrincipal as Xt,bootServer as Y,writeTargetVersion as Yn,listRescueCheckpoints as Yt,buildExecResult as Z,JSONRPCMessageSchema as Zn,loggerFactory as Zt,HocuspocusAuthRejection as _,resetMetrics as _n,createServer$1 as _t,AgentPresenceBroadcaster as a,readServerPackageVersion as an,GitDirAccessError as ar,commitWip as at,LOG_MD_TEMPLATE as b,resolveLockDir as bn,detectClaudeDesktopPresence as bt,BacklinkIndex as c,readTargetRecordedAt as cn,contentHash as ct,ConfigSchema as d,reconcile as dn,createAssetServeMiddleware as dt,parseKeepaliveConnectionId as en,isJSONRPCRequest as er,buildStarterFolderFrontmatterYaml as et,DEFAULT_CHECKPOINT_RETENTION as f,recordContributor as fn,createContentFilter as ft,HOCUSPOCUS_AUTH_REJECTION_REASONS as g,removeLastKnownHash as gn,createPersistenceExtension as gt,GIT_UPSTREAM_WRITER as h,releaseUiLock as hn,createMcpHttpHandler as ht,AgentFocusBroadcaster as i,readBranchFromHead as in,writeConfigPatch as ir,commitUpstreamImport as it,SERVICE_WRITER as j,safetyCheckpoint as jn,getMetrics as jt,ProjectGitInitError as k,safeContentPath as kn,getLogger as kt,CC1Broadcaster as l,readTargetVersion as ln,contributorCount as lt,FILE_WATCHER_ORIGIN as m,registerWrite as mn,createLiveDerivedIndexExtension as mt,AGENT_ID_RE as n,planSeed as nn,readConfigSafely as nr,classifyEvents as nt,AgentSessionCapacityError as o,readSkillInstallStateSnapshot as on,MalformedGitPointerError as or,commitWipFromTree as ot,FILE_SYSTEM_WRITER as p,recordSkillInstallEvent as pn,createExternalChangeHandler as pt,assertNeverDiskEvent as q,withSpanSync as qn,isSystemDoc as qt,AGENT_WRITE_ORIGIN as r,readAllTargets as rn,resolveConfigPath as rr,clearContributors as rt,AgentSessionManager as s,readStateManifest as sn,containsConflictMarkers as st,AGENT_ID_MAX_LEN as t,pathToDocName as tn,isJSONRPCResultResponse as tr,buildWipTree as tt,CONFLICT_MARKER_RE as u,readUiLock as un,createApiExtension as ut,HocuspocusAuthTokenSchema as v,resolveBundledSkillDir as vn,createServerObserverExtension as vt,MISSING_OK_CONFIG_MESSAGE as w,runAuthReposSubprocess as wn,extractWikiLinksFromMarkdown as wt,MANAGED_RENAME_ORIGIN as x,resolvePackageVersion as xn,detectProjectShape as xt,LIVE_DERIVED_INDEX_DEBOUNCE_MS as y,resolveContentDir as yn,createTestLogger as yt,StateManifestError as z,startWatcher as zn,installUserSkill as zt};
1609
- //# sourceMappingURL=dist-ou5qina8.mjs.map
1608
+ `),s=[],g=!1,S=``;for(let e of t){let t=/^\s{0,3}([`~]{3,})/.exec(e);if(t){g?RegExp(`^\\s{0,3}${S[0]==="`"?"`":`~`}{${S.length},}\\s*$`).test(e)&&(g=!1,S=``):(g=!0,S=t[1]);continue}if(g)continue;let w=stripInlineCodeSpans(e);for(TAG_VALUE_RE.lastIndex=0;;){let e=TAG_VALUE_RE.exec(w);if(e===null)break;let t=e[2];t&&s.push(t)}}return s}var TagIndex=class{contentDir;contentFilter;state=createEmptyState();constructor(e){this.contentDir=e.contentDir,this.contentFilter=e.contentFilter}updateDocumentFromMarkdown(e,t){if(!(isSystemDoc(e)||isConfigDoc(e)))try{let{frontmatter:s,body:g}=stripFrontmatter(t),S=extractFrontmatterTags(s?unwrapFrontmatterFences(s):``),w=extractInlineTagsFromBody(g),E=new Set([...S,...w]),D=new Set;for(let e of E)for(let t of expandTagToHierarchy(e))D.add(t);this.applyDocSnapshot(e,E,D)}catch(t){console.warn(`[tag-index] Failed to scan ${e} for tag extraction:`,t),this.deleteDocument(e)}}deleteDocument(e){if(isSystemDoc(e)||isConfigDoc(e))return;let t=this.state.byDoc.get(e);if(t){for(let s of t){let t=this.state.byTag.get(s);t&&(t.delete(e),t.size===0&&this.state.byTag.delete(s))}this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)}}renameDocument(e,t,s){this.deleteDocument(e),this.updateDocumentFromMarkdown(t,s)}getDocsForTag(e){let t=this.state.byTag.get(e);return t?[...t].sort((e,t)=>e.localeCompare(t)):[]}getDocsForTagWithMatches(e){let t=this.state.byTag.get(e);if(!t)return[];let s=[];for(let g of t){let t=this.state.byDocLiteral.get(g);if(!t)continue;let S=tagsMatchingPrefix(t,e);s.push({docName:g,matchingTags:[...S].sort((e,t)=>e.localeCompare(t))})}return s.sort((e,t)=>e.docName.localeCompare(t.docName))}getAllTags(){let e=[...this.state.byTag.entries()],t=e.map(([e])=>e),s=new Set;for(let e of t){let t=e.indexOf(`/`);t>0&&s.add(e.slice(0,t));let g=t;for(;g>0;)s.add(e.slice(0,g)),g=e.indexOf(`/`,g+1)}return e.map(([e,t])=>({name:e,count:t.size,isLeaf:!s.has(e)})).sort((e,t)=>e.name.localeCompare(t.name))}init(){if(this.state=createEmptyState(),!existsSync(this.contentDir))return;let e=this.listDocsWithPaths();for(let{docName:t,filePath:s}of e)try{let e=readFileSync(s,`utf-8`);this.updateDocumentFromMarkdown(t,e)}catch(e){console.warn(`[tag-index] Failed to read ${t} during init:`,e)}}applyDocSnapshot(e,t,s){let g=this.state.byDoc.get(e)??new Set;for(let t of g){if(s.has(t))continue;let g=this.state.byTag.get(t);g&&(g.delete(e),g.size===0&&this.state.byTag.delete(t))}for(let t of s){let s=this.state.byTag.get(t);s||(s=new Set,this.state.byTag.set(t,s)),s.add(e)}s.size===0?(this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)):(this.state.byDoc.set(e,s),this.state.byDocLiteral.set(e,t))}listDocsWithPaths(){let e=[];this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}walkContentDir(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[tag-index] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.walkContentDir(s,t);continue}if(!g.isFile()||!isSupportedDocFile(g.name))continue;let S=relative(this.contentDir,s);this.contentFilter?.isExcluded(S)||t.push({docName:stripDocExtension(S),filePath:s})}}};const PARK_SNAPSHOT_ORIGIN=(()=>{let e=Object.freeze({origin:`park-snapshot`,paired:!0});return Object.freeze({source:`local`,skipStoreHooks:!1,context:e})})();function createServer$1(e){let{contentDir:t,projectDir:s=t,quiet:g=!0,debounce:S=2e3,maxDebounce:w=1e4,gitEnabled:E=!0,commitDebounceMs:D=3e4,wipRef:O=`refs/wip/main`,configHomedirOverride:k,enableTestRoutes:j=!1,shadowRepo:F,contentRoot:L,destroyTimeoutMs:B=1e4,localOpCliArgs:H,skipStateManifestCheck:q=!1}=e,J=getLogger(`server`);function Y(){let e=readConfigSafely({absPath:resolveConfigPath(`project-local`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project-local config`)}),t=e.value.autoSync?.enabled;return t==null?(e.valid||J.warn({},`[config] project-local autoSync.enabled unavailable (config invalid) — falling back to project config`),readConfigSafely({absPath:resolveConfigPath(`project`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project config`)}).value.autoSync?.enabled===!0):t===!0}initTelemetry();let ee=randomUUID(),te=getLocalDir(t);if(acquireServerLock(te,{port:e.port??0,worktreeRoot:s,kind:e.lockKind??`interactive`,capabilities:[`http`,`ws`]}),!q)try{assertCompatibleStateManifest({lockDir:te,shadowRepoDir:resolveShadowDir(s)})}catch(e){throw releaseServerLock(te),e}let ne=createBasenameIndex(),ae=(e,t)=>ne.resolveEmbed(e,t),oe,se,ce,ue,de,fe,me,ge=null,_e=null,ve=null,ye=null,Ce=new Set,we=!1,Te;function De(e){ge?.signal(e)}let je=2e3,Me=null;function Pe(){Me!==null&&clearTimeout(Me),Me=setTimeout(()=>{Me=null,se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist debounced cache:`,e)})},2e3)}try{oe=createContentFilter({projectDir:s,contentDir:t,onAfterRebuild:()=>{se.rebuildFromDisk(getActiveBranch()).catch(e=>{getLogger(`server-factory`).warn({err:e},`[content-filter] backlink-index rebuild failed after onAfterRebuild`)});try{ce.init()}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] tag-index rebuild failed after onAfterRebuild`)}try{let e=at?.pruneFileIndexNowExcluded()??0;e>0&&getLogger(`server-factory`).info({pruned:e},`[content-filter] pruned now-excluded entries from fileIndex`)}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] fileIndex prune failed after onAfterRebuild`)}}}),se=new BacklinkIndex({projectDir:s,contentDir:t,contentFilter:oe}),ce=new TagIndex({contentDir:t,contentFilter:oe});try{ce.init()}catch(e){console.warn(`[server-factory] tag-index init failed; continuing with empty index:`,e)}ue={current:F},de=createPersistenceExtension({contentDir:t,projectDir:s,gitEnabled:E,commitDebounceMs:D,wipRef:O,shadowRef:ue,contentRoot:L,backlinkIndex:se,configHomedirOverride:k,getCurrentBranch:()=>st?.getLastKnownBranch()??null,resolveEmbed:ae,getPrincipal:()=>ye,onAgentCommit:()=>ge?.signal(`session-activity`),onDiskFlush:(e,t)=>ge?.emitDiskAck(e,t),onConfigRejected:(e,t)=>ge?.emitConfigValidationRejected(e,t)}),fe=new Hocuspocus({quiet:g,debounce:S,maxDebounce:w,extensions:[de.extension]});let B=fe.shouldUnloadDocument.bind(fe);fe.shouldUnloadDocument=e=>{if((we||Ce.has(e))&&B(e))return!0;let t=e.name;return isSystemDoc(t)||isConfigDoc(t)||getReconciledBase(t)!==void 0||e.getXmlFragment(`default`).length!==0||e.getText(`source`).length!==0?!1:B(e)},Te=async e=>{Ce.add(e);try{await fe.unloadDocument(e)}finally{Ce.delete(e)}},ge=new CC1Broadcaster(fe),_e=new AgentFocusBroadcaster(fe),ve=new AgentPresenceBroadcaster(fe),me=new AgentSessionManager(fe);let q=createLiveDerivedIndexExtension({backlinkIndex:se,tagIndex:ce,signalChannel:De});fe.configuration.extensions.push(q),fe.configuration.extensions.push({__kind:`principal-auth`,async onAuthenticate(e){let t=e.token,s=parseHocuspocusAuthToken(t),g=s?.expectedServerInstanceId;if(typeof g==`string`&&g.length>0&&g!==ee)throw new HocuspocusAuthRejection(`server-instance-mismatch`,`server instance mismatch: client claimed ${g}, this server is ${ee}`);let S=s?.expectedBranch,w=getActiveBranch();if(typeof S==`string`&&S.length>0&&S!==w)throw new HocuspocusAuthRejection(`branch-mismatch`,`branch mismatch: client claimed ${S}, server is on ${w}`);if(!s)return;let E=e.context;typeof s.principalId==`string`&&(ye&&s.principalId===ye.id?E.principalId=ye.id:ye?console.warn(JSON.stringify({event:`principal-token-mismatch`,claimed:s.principalId,loaded:ye.id})):E.principalId=s.principalId),typeof s.tabSessionId==`string`&&(E.tabSessionId=s.tabSessionId),E.kind=`human`}}),fe.configuration.extensions.push({__kind:`config-doc-admission-guard`,async onAuthenticate(e){if(!isConfigDoc(e.documentName))return;let t=e.request,s=t.socket?.remoteAddress;if(s!==void 0&&!isLoopbackAddress(s))throw Error(`config-doc admission requires loopback peer (peer=${s}, doc=${e.documentName})`);let g=e.requestHeaders,S=(g&&typeof g.get==`function`?g.get(`host`):null)??t.headers?.host??void 0;if(!isAllowedWorkspaceHostHeader(S))throw Error(`config-doc admission requires loopback Host header (host=${S??`<absent>`}, doc=${e.documentName})`)}}),fe.configuration.extensions.push({__kind:`system-doc-broadcast-guard`,async beforeHandleMessage(e){if(e.documentName!==`__system__`)return;let t=new IncomingMessage(e.update);if(t.readVarString(),t.readVarUint()===MessageType.BroadcastStateless)throw Error(`inbound BroadcastStateless on ${SYSTEM_DOC_NAME} rejected — server-only channel`)}});let J=createApiExtension({hocuspocus:fe,sessionManager:me,contentDir:t,contentFilter:oe,serverInstanceId:ee,getFileIndex:()=>at?at.getFileIndex():new Map,getAliasMap:()=>at?at.getAliasMap():new Map,enableTestRoutes:j,shadowRef:ue,flushGitCommit:()=>de.flushPendingGitCommit(),getCurrentBranch:()=>st?.getLastKnownBranch()??null,getDiskAckSVs:()=>ge?.getLatestDiskAckSVsAsBase64()??{},contentRoot:L,backlinkIndex:se,tagIndex:ce,signalChannel:De,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,onAgentWrite:e.onAgentWrite,getSyncEngine:()=>vt,localOpCliArgs:H,projectDir:s,resolveEmbed:ae,getPrincipal:()=>ye,forceUnloadDocument:Te});fe.configuration.extensions.push(J),fe.configuration.extensions.push(createServerObserverExtension({mdManager,schema,shadowRef:ue,contentRoot:L,getCurrentBranch:()=>st?.getLastKnownBranch()??null,resolveEmbed:ae}))}catch(e){throw releaseServerLock(te),e}let Ie=null,Re=new Map,ze=[];function Be(e,t){let s=resolve(e,`rescue`),g=resolve(s,`${t}${getDocExtension(t)}`);return g.startsWith(`${s}/`)?g:null}function Ve(e){let t=fe.documents.get(e);if(!t)return null;let{frontmatter:s,body:g}=stripFrontmatter(t.getText(`source`).toString());return prependFrontmatter(s,g)}let Ue=(e,t)=>applyExternalChange(fe,e,t,ae),We=e=>{if(!e)return;let t=`[[${e}]]`;for(let[s]of fe.documents){if(isSystemDoc(s)||isConfigDoc(s))continue;let g=fe.documents.get(s);if(!g)continue;let S=g.getText(`source`).toString();if(S.includes(t))try{g.transact(()=>{applyDiskContentToDoc(g,S,ae,s)},FILE_WATCHER_ORIGIN)}catch(t){J.error({err:t,docName:s,assetBasename:e},`[asset-event] failed to re-render ${s} for asset basename ${e}`)}}},Ge=null,Ke=e=>{e&&(Ge===null&&(Ge=new Set,setImmediate(()=>{let e=Ge;if(Ge=null,e)try{for(let t of e)We(t)}catch(t){J.error({err:t,basenames:[...e]},`[asset-event] dedup rerender pass crashed`)}})),Ge.add(e))};function Xe(e){switch(e.kind){case`rename`:return e.newDocName;case`asset-create`:case`asset-delete`:return e.relativePath;default:return e.docName}}async function $e(e){try{switch(e.kind){case`create`:J.info({docName:e.docName},`[reconcile] create: ${e.docName}`),se.updateDocumentFromMarkdown(e.docName,e.content),Pe(),ce.updateDocumentFromMarkdown(e.docName,e.content),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break;case`update`:{let{docName:t,content:s}=e,g=fe.documents.get(t);if(!g){se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);return}let S=getReconciledBase(t)??``,w=Ve(t)??S,E=reconcile({docName:t,base:S,ours:w,theirs:s}),D=contentHash(S).slice(0,6),O=contentHash(w).slice(0,6),k=contentHash(s).slice(0,6);switch(J.info({docName:t,base:D,ours:O,theirs:k,result:E.kind},`[reconcile] ${t} base=${D} ours=${O} theirs=${k} result=${E.kind}`),E.kind){case`noop`:se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);break;case`clean`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply clean content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`merged`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply merged content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`conflicts`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),incrementConflict(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply conflict content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`refused`:{incrementConflict();let e=g.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,E.reason);break}}break}case`delete`:{let{docName:t}=e,s=fe.documents.get(t);if(!s){se.deleteDocument(t),Pe(),ce.deleteDocument(t),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);return}let g=getReconciledBase(t)??``,S=Ve(t)??``,w=S!==g;if(w&&ue.current){let e=ue.current,s=st?.getLastKnownBranch()??`main`;queueMicrotask(()=>{saveInMemoryCheckpoint(e,L??``,{kind:`external-change-rescue`,docName:t,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:s,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:t},`[reconcile] rescue checkpoint saved (delete): ${t}`)}).catch(e=>{J.error({docName:t,err:e},`[reconcile] rescue checkpoint write failed: ${t}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),deleteReconciledBase(t),se.deleteDocument(t),Pe(),ce.deleteDocument(t),J.info({docName:t,isDirty:w},`[reconcile] delete: ${t} (dirty=${w})`),fe.closeConnections(t),await Te(s),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`rename`:{let{oldDocName:t,newDocName:s,content:g}=e,S=fe.documents.get(t);if(deleteReconciledBase(t),setReconciledBase(s,g),se.renameDocument(t,s,g),Pe(),ce.renameDocument(t,s,g),S){let e=S.getMap(`lifecycle`);e.set(`status`,`renamed`),e.set(`newPath`,s)}J.info({oldDocName:t,newDocName:s},`[reconcile] rename: ${t} → ${s}`),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`conflict`:{let{docName:t}=e,s=fe.documents.get(t);if(!s)return;let g=s.getMap(`lifecycle`);g.set(`status`,`conflict`),g.set(`reason`,`conflict-markers`),J.info({docName:t},`[reconcile] conflict markers detected: ${t}`);break}case`asset-create`:ne.add(e.relativePath),De(`files`),Ke(basename(e.relativePath));break;case`asset-delete`:ne.remove(e.relativePath),De(`files`),Ke(basename(e.relativePath));break;default:assertNeverDiskEvent(e)}}catch(t){let s=Xe(e);J.error({err:t,kind:e.kind,label:s},`[reconcile] failed to handle ${e.kind} for ${s}`)}}let nt=[];async function rt(e){if(isBatchInProgress()){nt.push(e);return}await $e(e)}async function it(){let e=nt.splice(0,nt.length);for(let t of e)await $e(t)}let at=null,st=null,vt=null,Tt=null;async function Et(e){if(fe.documents.size===0)return;let t=!1,s=new Promise(e=>{fe.configuration.extensions.push({async afterUnloadDocument({instance:s}){!t&&s.getDocumentsCount()===0&&(t=!0,e())}})}),g=Array.from(fe.documents.keys());fe.closeConnections(),fe.flushPendingStores();for(let e of fe.documents.values())e.getConnectionsCount()===0&&fe.unloadDocument(e).catch(t=>{console.warn(JSON.stringify({event:`ok-shutdown-unload-document-failed`,docName:e.name,reason:t instanceof Error?t.message:String(t)}))});let S,w=new Promise((s,w)=>{S=setTimeout(()=>{t=!0;let s=Array.from(fe.documents.keys()),S=[],E=[];if(ue.current){for(let e of s)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let t=Ve(e);if(t===null){J.warn({docName:e},`[rescue] skipping ${e} — document dropped from map mid-rescue`),E.push(e);continue}let s=Be(ue.current.gitDir,e);if(!s){J.warn({docName:e,gitDir:ue.current.gitDir},`[rescue] path-traversal guard rejected docName: ${e}`),E.push(e);continue}mkdirSync(dirname(s),{recursive:!0}),writeFileSync(s,t,`utf-8`),incrementRescueBuffer(),S.push(e),J.info({docName:e},`[rescue] rescue buffer saved on flush timeout: ${e}`)}catch(t){E.push(e),J.error({err:t,docName:e},`[rescue] failed to write rescue buffer for ${e}`)}}else J.warn({stillLoadedCount:s.length},`[rescue] shadow repo unavailable at flush timeout — ${s.length} doc(s) will be lost: [${s.join(`, `)}]`),E.push(...s);let D=S.length>0||E.length>0?` — rescued [${S.join(`, `)}]${E.length>0?`, lost [${E.join(`, `)}]`:``}`:``;w(Error(`flushAllStoresAndWait timeout after ${e}ms — ${s.length}/${g.length} docs did not unload: [${s.join(`, `)}]${D}`))},e)});try{await Promise.race([s,w])}finally{S!==void 0&&clearTimeout(S)}}async function Dt(){return Tt||(Tt=(async()=>{let e=Date.now(),t=[];we=!0,Me!==null&&(clearTimeout(Me),Me=null);let g,S=await Promise.race([Ft.then(()=>`completed`,e=>(J.debug({err:e},`[server] init incomplete during shutdown`),`failed`)),new Promise(e=>{g=setTimeout(()=>e(`timeout`),5e3)})]);g!==void 0&&clearTimeout(g),S===`timeout`&&J.warn({},`[server] init did not complete within 5s during shutdown`);let w=fe.documents.size;try{try{try{st&&=(await st.unsubscribe(),null),at&&=(await at.unsubscribe(),null);for(let{docName:e,cleanup:t}of ze)try{await t()}catch(t){J.warn({err:t,docName:e},`[server] failed to stop config-file-watcher for ${e}`)}ze.length=0}catch(e){t.push({phase:`watcher-unsubscribe`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1 watcher unsubscribe failed`)}try{ge?.destroy(),ve?.destroy(),Ie&&=(await Ie.disconnect(),null);for(let[e,t]of Re)try{await t.disconnect()}catch(t){J.warn({err:t,docName:e},`[server] failed to disconnect ${e} during shutdown`)}Re.clear()}catch(e){t.push({phase:`cc1-teardown`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1b CC1 teardown failed`)}try{await me.closeAll()}catch(e){t.push({phase:`agent-session-drain`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-2 agent session drain failed`)}try{await Et(B)}catch(e){t.push({phase:`flush-all-stores`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-3 flush failed`)}let e;try{await Promise.race([(async()=>{await de.flushPendingGitCommit(),await de.waitForPendingCommits()})(),new Promise((t,s)=>{e=setTimeout(()=>s(Error(`L2 git flush timeout`)),B)})])}catch(e){t.push({phase:`git-commit-flush`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-4 git commit flush failed`)}finally{e!==void 0&&clearTimeout(e)}try{vt&&=(await vt.destroy(),null)}catch(e){t.push({phase:`sync-engine-stop`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown sync-engine-stop failed`)}}finally{if(ue.current){try{let e=(await esm_default({baseDir:s,timeout:{block:5e3}}).revparse(`HEAD`)).trim();e&&writeFileSync(resolve(ue.current.gitDir,`last-known-head`),e,`utf-8`)}catch{}try{destroyShadowRepo(ue.current)}catch(e){t.push({phase:`shadow-repo-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-5 destroyShadowRepo failed`)}}let g=Date.now()-e;t.length===0?J.info({documentCount:w,durationMs:g},`[server] shutdown flushed ${w} documents in ${g}ms`):J.warn({documentCount:w,durationMs:g,phaseErrors:t},`[server] shutdown flushed ${w} documents in ${g}ms with ${t.length} phase error(s)`)}}finally{try{releaseServerLock(te)}catch(e){t.push({phase:`server-lock-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-6 releaseServerLock failed`)}try{await shutdownTelemetry()}catch(e){t.push({phase:`telemetry-shutdown`,error:e instanceof Error?e.message:String(e)})}}})(),Tt)}let jt=[];async function Mt(){try{ye=await loadPrincipal(t),J.info({principalId:ye.id},`[server] principal loaded`)}catch(e){J.warn({err:e},`[server] principal load failed — browser writes will use SERVICE_WRITER`)}if(!ue.current)try{ue.current=await initShadowRepo(s),J.info({gitDir:ue.current.gitDir},`[server] history repo initialized at ${ue.current.gitDir}`)}catch(e){J.error({err:e},`[server] history repo init failed`),jt.push(`shadow-repo`)}if(ue.current)try{await shadowGit(ue.current).raw(`rev-parse`,`--git-dir`)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`not a git repository`)||t.includes(`invalid object`)){J.warn({},`[server] history repo appears corrupted — reinitializing`);try{ue.current=await initShadowRepo(s)}catch(e){J.error({err:e},`[server] history repo reinit failed`),ue.current=void 0,jt.includes(`shadow-repo`)||jt.push(`shadow-repo`)}}else J.error({err:e},`[server] history repo check failed (transient?)`)}if(ue.current)try{let e=resolve(ue.current.gitDir,`last-known-head`),t=null;try{t=readFileSync(e,`utf-8`).trim()||null}catch{}let g=null;try{g=(await esm_default({baseDir:s,timeout:{block:1e4}}).revparse(`HEAD`)).trim()||null}catch{}if(g!==null){if(g!==t){let e=`main`;try{let t=(await esm_default({baseDir:s,timeout:{block:1e4}}).raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();t&&t!==`HEAD`&&(e=t)}catch{}J.info({lastKnownHead:t,currentHead:g,branch:e},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=import`);try{await commitUpstreamImport(ue.current,L??``,t,g,e),incrementUpstreamImport()}catch(e){J.warn({err:e},`[head-drift] commitUpstreamImport failed — continuing`)}}else J.info({currentHead:g},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=noop`);try{writeFileSync(e,g,`utf-8`)}catch(e){J.warn({err:e},`[head-drift] failed to write last-known-head`)}}}catch(e){J.warn({err:e},`[head-drift] check failed — continuing`)}try{let e=recoverPendingManagedRename(t);if(e.recovered&&e.journal){let t=e.journal.version===2?e.journal.fromPath:e.journal.sourceDocName,s=e.journal.version===2?e.journal.toPath:e.journal.destinationDocName;J.warn({journalVersion:e.journal.version,fromPath:t,toPath:s,restoredDocNames:e.restoredDocNames},`[managed-rename] recovered pending rename ${t} -> ${s}`)}}catch(e){J.error({err:e},`[server] managed rename recovery failed`),jt.push(`managed-rename-recovery`)}try{let e=cleanupOrphanUploadTempfiles(t);(e.deleted>0||e.errors>0)&&J.info({scanned:e.scanned,deleted:e.deleted,errors:e.errors},`[upload-tempfile-sweep] swept ${e.deleted} orphan tempfile(s)`)}catch(e){J.error({err:e},`[server] upload-tempfile sweep failed`),jt.push(`upload-tempfile-sweep`)}try{Ie=await fe.openDirectConnection(SYSTEM_DOC_NAME),ge?.emitServerInfo(ee,getActiveBranch())}catch(e){J.error({err:e},`[server] failed to open __system__ direct connection — CC1 push disabled`),jt.push(`cc1-push`)}for(let e of CONFIG_DOC_NAMES)try{let t=await fe.openDirectConnection(e);Re.set(e,t)}catch(t){J.error({err:t,docName:e},`[server] failed to open ${e} direct connection — config bind degraded`),jt.push(`config-doc:${e}`)}let e=new Map([[CONFIG_DOC_NAME_PROJECT,resolveConfigPath(`project`,s)],[CONFIG_DOC_NAME_PROJECT_LOCAL,resolveConfigPath(`project-local`,s)],[CONFIG_DOC_NAME_USER,resolveConfigPath(`user`,s,k)]]);for(let t of CONFIG_DOC_NAMES){let s=e.get(t);if(s)try{J.info({docName:t,path:s},`[config-file-watcher] starting`);let e=await startConfigFileWatcher(s,e=>{let s=fe.documents.get(t);J.info({docName:t,hasDocument:s!==void 0,contentLength:e.length},`[config-file-watcher] file changed`);let g=applyExternalConfigChange(s??null,t,e,de.configPersistenceCtx);if(J.info({docName:t,outcome:g},`[config-file-watcher] applyExternalConfigChange outcome`),t===`__config__/project`||t===`__local__/project`){let e=Y();vt?.setEnabled(e).catch(t=>{J.warn({err:t,enabled:e},`[sync] failed to apply autoSync.enabled from config`)})}});ze.push({docName:t,cleanup:e}),J.info({docName:t,path:s},`[config-file-watcher] started`)}catch(e){J.warn({err:e,docName:t,path:s},`[config-file-watcher] failed to start for ${t}`),jt.push(`config-file-watcher:${t}`)}}try{let e=resolve(t,`.okignore`),g=resolve(s,`.gitignore`),S=J;S.info({okignorePath:e,gitignorePath:g},`[ignore-watcher] starting multi-path watcher for .okignore + .gitignore`);let w=await startMultiPathConfigFileWatcher([e,g],(t,g)=>{(async()=>{if(t===e)try{let e=applyExternalConfigChange(fe.documents.get(`__config__/okignore`)??null,CONFIG_DOC_NAME_OKIGNORE,g,de.configPersistenceCtx);S.info({docName:CONFIG_DOC_NAME_OKIGNORE,outcome:e},`[ignore-watcher] applyExternalConfigChange outcome`)}catch(e){S.error({err:e,changedPath:relative(s,t)},`[ignore-watcher] applyExternalConfigChange failed; rebuild proceeds independently`)}let w=await oe.rebuildIgnorePatterns();if(w.ok)S.info({changedPath:relative(s,t),patternCount:w.patternCount,nestedFileCount:w.nestedFileCount,durationMs:w.durationMs},`[ignore-watcher] rebuild succeeded — broadcasting files channel`),ge?.signal(`files`);else{let e=relative(s,t)||`.`;S.warn({changedPath:e,error:w.error.message},`[ignore-watcher] rebuild failed — emitting config-ignore-nested-error`),ge?.emitConfigIgnoreNestedError(e,w.error.message)}})().catch(e=>{S.error({err:e,changedPath:relative(s,t)||`.`},`[ignore-watcher] handler threw`)})});ze.push({docName:`__ignore-files__`,cleanup:w}),S.info({okignorePath:e,gitignorePath:g},`[ignore-watcher] multi-path watcher started`)}catch(e){J.warn({err:e,projectDir:s,contentDir:t},`[ignore-watcher] failed to start multi-path watcher`),jt.push(`ignore-files-watcher`)}let g=resolveGitDir(s),S=g?readBranchFromHead(g)??`main`:`main`;switchReconciledBaseScope(S),se.switchBranch(S);try{{let e=getActiveBranch();try{if(await se.loadFromDisk(e)){let t=await se.reconcileWithDisk(e);(t.added>0||t.updated>0||t.deleted>0)&&J.info(t,`[backlinks] startup reconcile: offline changes applied`)}else await se.rebuildFromDisk(e);se.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist startup cache for ${e}:`,t)})}catch(t){J.error({err:t,branch:e},`[backlinks] startup init failed; index will populate incrementally via watcher`)}}at=await startWatcher(t,rt,oe),ce.init();let e=0;try{seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,g)=>{e++,J.warn({reason:t,code:s,path:g},`[basename-index] skipped entry during seed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e},`[basename-index] startup seed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve`),jt.push(`basename-index-partial`))}catch(e){J.error({err:e},`[basename-index] startup seed failed`),jt.push(`basename-index`)}}catch(e){J.error({err:e},`[server] disk bridge watcher failed to start`),jt.push(`file-watcher`)}try{st=await startHeadWatcher(s,async({trigger:e})=>{if(J.info({trigger:e},`[batch] begin trigger=${e}`),incrementBatch(),fe.flushPendingStores(),await de.flushPendingGitCommit(),setBatchInProgress(!0),ue.current){let e=getActiveBranch(),t=resolveGitDir(s),g=t?readBranchFromHead(t)??e:e,S=[];for(let[e,t]of fe.documents){if(isSystemDoc(e)||isConfigDoc(e))continue;let s=null;if(t.transact(()=>{s=Ve(e)},PARK_SNAPSHOT_ORIGIN),s===null)continue;let g=getReconciledBase(e)??s;S.push({docName:e,markdown:s,diskSnapshot:g})}if(S.length>0)try{let t=await parkBranch(ue.current,e,SERVICE_WRITER.id,S,g);t&&(incrementPark(),J.info({count:S.length,branch:e,sha:t.slice(0,8)},`[history] parked ${S.length} docs on ${e} → ${t.slice(0,8)}`))}catch(e){J.error({err:e},`[shadow] park failed`)}}},async e=>{let s=nt.length,g=e.newBranch??`main`;if(J.info({kind:e.batchKind,headMoved:e.headMoved,docs:s,timeout:!!e.timeout},`[batch] end kind=${e.batchKind} headMoved=${e.headMoved} docs=${s}${e.timeout?` timeout`:``}`),e.batchKind===`within-branch`)setBatchInProgress(!1),await it(),await de.flushDeferredStores(`within-branch`);else{incrementBranchSwitch(),nt.splice(0,nt.length),switchReconciledBaseScope(g),Me!==null&&(clearTimeout(Me),Me=null),se.switchBranch(g),oe.rebuildDirCount();try{let e=0;ne.clear(),seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,S)=>{e++,J.warn({reason:t,code:s,path:S,branch:g},`[basename-index] skipped entry during branch-switch reseed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e,branch:g},`[basename-index] branch-switch reseed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve on this branch`),jt.includes(`basename-index-partial`)||jt.push(`basename-index-partial`))}catch(e){J.error({err:e,branch:g},`[basename-index] branch-switch reseed failed`)}for(let[e,s]of fe.documents)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let S=safeContentPath(e,t);if(!existsSync(S)){let t=getReconciledBase(e)??``,S=Ve(e)??``;if(S!==t&&ue.current){let t=ue.current;queueMicrotask(()=>{saveInMemoryCheckpoint(t,L??``,{kind:`external-change-rescue`,docName:e,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:g,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:e},`[reconcile] rescue checkpoint saved on branch switch: ${e}`)}).catch(t=>{J.error({docName:e,err:t},`[reconcile] rescue checkpoint write failed: ${e}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),J.info({docName:e,branch:g},`[branch-switch] tombstone: ${e} (not on ${g})`);continue}let w=readFileSync(S,`utf-8`);Ue(e,w),setReconciledBase(e,w),J.info({docName:e},`[branch-switch] reset: ${e}`)}catch(t){J.error({err:t,docName:e},`[branch-switch] failed to reset ${e}`)}J.info({branch:g,docCount:fe.documents.size},`[branch-switch] loaded branch ${g} (${fe.documents.size} docs)`);try{if(await se.loadFromDisk(g)){let e=await se.reconcileWithDisk(g);(e.added>0||e.updated>0||e.deleted>0)&&J.info(e,`[backlinks] branch-switch reconcile for ${g}`)}else await se.rebuildFromDisk(g);se.saveToDisk(g).catch(e=>{console.warn(`[backlinks] Failed to persist branch cache for ${g}:`,e)})}catch(e){J.error({err:e,branch:g},`[backlinks] branch-switch rebuild failed; backlinks may be stale`)}if(ce.init(),ue.current&&e.batchKind===`cross-branch`){let e=0;for(let[t]of fe.documents)if(!(isSystemDoc(t)||isConfigDoc(t)))try{let s=await readParkedState(ue.current,g,SERVICE_WRITER.id,t);if(!s||s.markdown===s.diskSnapshot)continue;let S=getReconciledBase(t);if(!S)continue;let w=reconcile({docName:t,base:s.diskSnapshot,ours:s.markdown,theirs:S});switch(w.kind){case`merged`:case`clean`:Ue(t,w.newContent),setReconciledBase(t,w.newContent),e++;break;case`conflicts`:Ue(t,w.newContent),setReconciledBase(t,w.newContent),incrementConflict(),e++;break;case`noop`:case`refused`:break}}catch(e){J.error({err:e,docName:t},`[branch-switch] restore WIP failed for ${t}`)}e>0&&J.info({count:e,branch:g},`[branch-switch] restored ${e} parked docs on ${g}`)}if(e.oldBranch?.startsWith(`detached-`)&&ue.current)try{let t=shadowGit(ue.current),s=(await t.raw(`for-each-ref`,`refs/wip/${e.oldBranch}/`,`--format=%(refname)`)).trim();if(s){for(let e of s.split(`
1609
+ `))e&&await t.raw(`update-ref`,`-d`,e);J.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`)}}catch(e){J.error({err:e},`[branch-switch] detached cleanup failed`)}setBatchInProgress(!1),await de.flushDeferredStores(`discard-stale`),ge?.emitBranchSwitched(g)}if(e.headMoved&&e.newHead&&ue.current&&s>0){let t=L??`.`;try{let s=await commitUpstreamImport(ue.current,t,e.oldHead,e.newHead,g);incrementUpstreamImport(),J.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:s.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${s.slice(0,8)}`)}catch(e){J.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){J.error({err:e},`[server] HEAD watcher failed to start`),jt.push(`head-watcher`)}let w=H?.[0]??`open-knowledge`,E=[`-c`,`credential.helper=!${H&&H.length>1?H.join(` `):w} auth git-credential`];try{vt=new SyncEngine({projectDir:s,contentDir:t,contentFilter:oe,contentRoot:L,syncEnabled:Y(),credentialArgs:E,cc1Broadcaster:ge,setBatchInProgress:e=>{setBatchInProgress(e),e||de.flushDeferredStores(`within-branch`).catch(e=>{J.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{J.info({state:e},`[sync] state → ${e}`)},onAutoDisable:async e=>{J.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await writeConfigPatch({cwd:s,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||J.error({result:t,reason:e,humanError:humanFormat(t.error),configPath:resolveConfigPath(`project-local`,s)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await vt.start()}catch(e){J.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),vt=null}}let Ft=Mt();return{hocuspocus:fe,sessionManager:me,cc1Broadcaster:ge,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,contentFilter:oe,basenameIndex:ne,serverInstanceId:ee,destroy:Dt,ready:Ft,degraded:jt,lockDir:te,get syncEngine(){return vt}}}const LEGACY_RUNTIME_FILENAMES=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],LEGACY_RUNTIME_DIRNAMES=[`cache`,`tmp`];function findLegacyRuntimeFiles(e){let t=resolve(e,LOCAL_DIR);if(!(()=>{if(!existsSync(t))return!0;try{return readdirSync(t).length===0}catch{return!0}})())return[];let s=[];for(let t of LEGACY_RUNTIME_FILENAMES)existsSync(resolve(e,t))&&s.push(t);for(let t of LEGACY_RUNTIME_DIRNAMES){let g=resolve(e,t);try{existsSync(g)&&statSync(g).isDirectory()&&s.push(`${t}/`)}catch{}}return s}function computeWorktreeAttributes(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const DEFAULT_IDLE_THRESHOLD_MS=1800*1e3,DESTROY_STEP_TIMEOUT_MS=5e3;async function bootServer(e){initTelemetry();let{kind:t,gitdir:s}=computeWorktreeAttributes(e.projectDir??e.contentDir),g={"ok.worktree.kind":t};return s!==null&&(g[`ok.worktree.gitdir`]=normalizeFsPath(s)),withSpan(`ok.boot`,{attributes:g},async()=>bootServerInner(e))}async function bootServerInner(e){let t=e.skipAutoInit??!1,s=e.attachUiSibling??!0,g=e.idleShutdownMs,S=e.log??getLogger(`boot`),w=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,E=e.lockKind??w??`interactive`,{createServer:D}=await import(`node:http`),{updateServerLockPort:O}=await import(`./server-lock-D7DXNVql-B5nINglj.mjs`).then(e=>e.a),k=!1;if(!t&&e.autoInitFn)try{k=!!await e.autoInitFn()}catch(e){S.warn({err:e},`autoInitFn failed`)}let j=e.projectDir??e.contentDir,F=resolve(j,`.ok`);if(!existsSync(resolve(F,`config.yml`)))throw new MissingOkConfigError(existsSync(F)?`config`:`okdir`,j);existsSync(resolve(F,`.gitignore`))||console.warn("[boot] Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let L=findLegacyRuntimeFiles(F);L.length>0&&console.warn(`[boot] Found legacy runtime files at .ok/${L.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${LOCAL_DIR}/.`);let B=createServer$1({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:E,skipStateManifestCheck:e.skipStateManifestCheck}),{hocuspocus:H,destroy:q,ready:J,degraded:Y,lockDir:ee,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae}=B,oe=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),se=e.port??0,ce=createMcpHttpHandler({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${oe}:${se}`,log:S}),ue=D(),de=mountMcpAndApi({httpServer:ue,hocuspocus:H,mcpHttpHandler:ce,log:S,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae,keepaliveGraceMs:e.keepaliveGraceMs}),fe=null;g!==null&&(fe=attachIdleShutdown({httpServer:ue,thresholdMs:g??DEFAULT_IDLE_THRESHOLD_MS,log:S,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await q()})})),await new Promise((t,s)=>{let g=e=>s(e);ue.once(`error`,g),ue.listen(e.port,e.host,()=>{ue.removeListener(`error`,g),t()})});let me=ue.address(),ge=typeof me==`object`&&me?me.port:e.port??0;if(se=ge,O(ee,ge),s&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:ee,log:S})}catch(e){S.warn({err:e},`spawnUiSiblingFn failed`)}let _e=!1,ve=async(e,t)=>{let s;try{await Promise.race([t(),new Promise((t,g)=>{s=setTimeout(()=>{g(Error(`${e} timed out after ${DESTROY_STEP_TIMEOUT_MS}ms`))},DESTROY_STEP_TIMEOUT_MS),s.unref?.()})])}finally{s!==void 0&&clearTimeout(s)}};return{httpServer:ue,destroy:async()=>{if(_e)return;_e=!0;let e=[],t=async(t,s)=>{try{await ve(t,s)}catch(s){e.push(s),S.warn({err:s,step:t},`bootServer destroy step failed`)}};try{fe?.detach()}catch(t){e.push(t),S.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(await t(`mount.shutdown`,()=>de.shutdown()),await t(`mcpHttpHandler.close`,()=>ce.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{de.wss.close(s=>s?t(s):e())})),await t(`httpServer.closeAllConnections`,async()=>{ue.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{ue.close(s=>s&&s.code!==`ERR_SERVER_NOT_RUNNING`?t(s):e())})),await t(`destroyHocuspocus`,()=>q()),await t(`shutdownTelemetry`,()=>shutdownTelemetry()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)},lockDir:ee,contentDir:e.contentDir,port:ge,ready:J,degraded:Y,didAutoInit:k,serverInstance:B}}const ConfigSchema=ConfigSchema$1;function detectClaudeDesktopPresence(e={}){let t=e.home??homedir(),s=e.platformName??process.platform,g=e.env??process.env;return s===`darwin`?existsSync(join(t,`Library`,`Application Support`,`Claude`)):s===`win32`?existsSync(join(g.APPDATA??join(t,`AppData`,`Roaming`),`Claude`)):!1}const execFileAsync=promisify(execFile);var ProjectGitInitError=class extends Error{stderr;constructor(e,t=``,s){super(e,s),this.name=`ProjectGitInitError`,this.stderr=t}};async function isInsideExistingWorkTree(e){try{let{stdout:t}=await execFileAsync(`git`,[`rev-parse`,`--is-inside-work-tree`],{cwd:e});return t.trim()===`true`}catch{return!1}}async function ensureProjectGit(e){let t=resolve(e),s=resolve(t,`.git`);if(existsSync(s)||await isInsideExistingWorkTree(t))return{didInit:!1};let g=``;try{g=(await execFileAsync(`git`,[`init`,`--initial-branch=main`,t])).stderr??``}catch(e){let s=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new ProjectGitInitError(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,s,{cause:e})}if(!existsSync(resolve(s,`HEAD`)))throw new ProjectGitInitError(`git init reported success but ${s}/HEAD is missing (partial init detected)`,g);return console.log(`[project-git] initialized .git/ at ${t} (branch: main)`),{didInit:!0}}async function resolvePackageVersion(e,t){let s;try{s=createRequire(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=dirname(s),g=0;g<32;g+=1){let s=join(t,`package.json`);if(existsSync(s))try{let t=JSON.parse(await readFile$1(s,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let g=dirname(t);if(g===t)return;t=g}}export{buildSkillZip as $,LATEST_PROTOCOL_VERSION as $n,mountMcpAndApi as $t,ROLLBACK_ORIGIN as A,safeContentPath as An,getLogger as At,TagIndex as B,startWatcher as Bn,installUserSkill as Bt,MCP_SERVER_NAME as C,rewriteMarkdownLinksForDocumentRename as Cn,ensureProjectGit as Ct,OBSERVER_SYNC_ORIGIN as D,runCloneSubprocess as Dn,gcCheckpointRefs as Dt,MissingOkConfigError as E,runAuthStatusSubprocess as En,formatContributors as Et,STARTER_TEMPLATES as F,seedBasenameIndex as Fn,incrementCollabSocketFilteredError as Ft,applySeed as G,validateCloneInputs as Gn,isLoopbackAddress as Gt,acquireUiLock as H,updateLastKnownHash as Hn,isAllowedWorkspaceHostHeader as Ht,STATE_MANIFEST_FILENAME as I,setActiveSpanAttributes as In,incrementServerObserverFire as It,attachIdleShutdown as J,withSpanSync as Jn,isSystemDoc as Jt,assertCompatibleStateManifest as K,validateSkillZip as Kn,isPairedWriteOrigin as Kt,SeedPrerequisiteError as L,shadowGit as Ln,initShadowRepo as Lt,SKILL_INSTALL_EVENTS_FILE_REL as M,safetyCheckpoint as Mn,getMetrics as Mt,STARTER_FOLDERS as N,saveInMemoryCheckpoint as Nn,getTracer as Nt,PinoLogger as O,runDeviceFlowSubprocess as On,getCurrentMcpLogger as Ot,STARTER_FOLDER_FRONTMATTER_FILENAME as P,saveVersion as Pn,handleCollabSocketError as Pt,buildReadResult as Q,JSONRPCMessageSchema as Qn,loggerFactory as Qt,SeedRootDirError as R,shutdownTelemetry as Rn,initTelemetry as Rt,MAX_AGENT_SESSIONS as S,resolvePackageVersion as Sn,detectProjectShape as St,McpLogger as T,runAuthReposSubprocess as Tn,extractWikiLinksFromMarkdown as Tt,applyAgentMarkdownWrite as U,updateUiLockPort as Un,isConfigDoc as Ut,UiLockCollisionError as V,toBroadcasterKey as Vn,isAllowedApiOrigin as Vt,applyExternalChange as W,validateAgentId as Wn,isHocuspocusAuthRejectionReason as Wt,buildAndOpenSkill as X,writeTargetVersion as Xn,listRescueCheckpoints as Xt,bootServer as Y,writeStateManifest as Yn,lastKnownHash as Yt,buildExecResult as Z,writeTracker as Zn,loadPrincipal as Zt,HocuspocusAuthRejection as _,removeLastKnownHash as _n,createPersistenceExtension as _t,AgentPresenceBroadcaster as a,readBranchFromHead as an,writeConfigPatch as ar,commitWip as at,LOG_MD_TEMPLATE as b,resolveContentDir as bn,createTestLogger as bt,BacklinkIndex as c,readStateManifest as cn,contentHash as ct,ConfigSchema as d,readUiLock as dn,createAssetServeMiddleware as dt,parseHocuspocusAuthToken as en,isInitializedNotification as er,buildStarterFolderFrontmatterYaml as et,DEFAULT_CHECKPOINT_RETENTION as f,reconcile as fn,createContentFilter as ft,HOCUSPOCUS_AUTH_REJECTION_REASONS as g,releaseUiLock as gn,createMcpHttpHandler as gt,GIT_UPSTREAM_WRITER as h,registerWrite as hn,createLiveDerivedIndexExtension as ht,AgentFocusBroadcaster as i,readAllTargets as in,resolveConfigPath as ir,commitUpstreamImport as it,SERVICE_WRITER as j,safeSubdir as jn,getMeter as jt,ProjectGitInitError as k,runWithMcpLogger as kn,getLocalDir as kt,CC1Broadcaster as l,readTargetRecordedAt as ln,contributorCount as lt,FILE_WATCHER_ORIGIN as m,recordSkillInstallEvent as mn,createExternalChangeHandler as mt,AGENT_ID_RE as n,pathToDocName as nn,isJSONRPCResultResponse as nr,classifyEvents as nt,AgentSessionCapacityError as o,readServerPackageVersion as on,GitDirAccessError as or,commitWipFromTree as ot,FILE_SYSTEM_WRITER as p,recordContributor as pn,createContentFilterAsync as pt,assertNeverDiskEvent as q,withSpan as qn,isSelfWrite as qt,AGENT_WRITE_ORIGIN as r,planSeed as rn,readConfigSafely as rr,clearContributors as rt,AgentSessionManager as s,readSkillInstallStateSnapshot as sn,MalformedGitPointerError as sr,containsConflictMarkers as st,AGENT_ID_MAX_LEN as t,parseKeepaliveConnectionId as tn,isJSONRPCRequest as tr,buildWipTree as tt,CONFLICT_MARKER_RE as u,readTargetVersion as un,createApiExtension as ut,HocuspocusAuthTokenSchema as v,resetMetrics as vn,createServer$1 as vt,MISSING_OK_CONFIG_MESSAGE as w,rewriteWikiLinksForDocumentRename as wn,evictStaleTrackerEntries as wt,MANAGED_RENAME_ORIGIN as x,resolveLockDir as xn,detectClaudeDesktopPresence as xt,LIVE_DERIVED_INDEX_DEBOUNCE_MS as y,resolveBundledSkillDir as yn,createServerObserverExtension as yt,StateManifestError as z,splitMarkdownBlocks as zn,installTestLoggers as zt};
1610
+ //# sourceMappingURL=dist-D4M20vXU.mjs.map