@inkeep/open-knowledge 0.62.0-beta.7 → 0.62.0-beta.9

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 (507) hide show
  1. package/dist/{acp-harness-probe-CVM8eJtq.mjs → acp-harness-probe-DBIIsKVz.mjs} +2 -2
  2. package/dist/cli.mjs +6 -6
  3. package/dist/constants-BXtZdqBu.mjs +2 -0
  4. package/dist/index.mjs +1 -1
  5. package/dist/init-CDqryhay.mjs +1 -0
  6. package/dist/{init-C8B6UI9S.mjs → init-PW1PHv2x.mjs} +3 -3
  7. package/dist/{launch-json-removal-D_IHezo5.mjs → launch-json-removal-tcEB2vFa.mjs} +2 -2
  8. package/dist/loader-67m9WNnP.mjs +1 -0
  9. package/dist/{loader-C6FofPdw.mjs → loader-Cg2a3fTX.mjs} +2 -2
  10. package/dist/{open-browser-CqoTUuyv.mjs → open-browser-D60Dz1iI.mjs} +2 -2
  11. package/dist/{preview-DfCA1MM8.mjs → preview-B4X8PAmW.mjs} +2 -2
  12. package/dist/preview-Cy3j_ZSG.mjs +1 -0
  13. package/dist/public/assets/{ActivityModeContent-C4HczZ00.js → ActivityModeContent-BcZPTskd.js} +1 -1
  14. package/dist/public/assets/{AgentDiffPane-CMLnHEFJ.js → AgentDiffPane-DmBwcSrx.js} +2 -2
  15. package/dist/public/assets/{AgentThreadClientBinder-Bx3htwVK.js → AgentThreadClientBinder-r_vwrkS8.js} +1 -1
  16. package/dist/public/assets/{AppMenubar-8Yu49LrI.js → AppMenubar-69TlWIQ5.js} +1 -1
  17. package/dist/public/assets/{BugReportHistory-w-gN84g9.js → BugReportHistory-BpVVcA5z.js} +1 -1
  18. package/dist/public/assets/{BugReportHistoryDialog-CpdHnITR.js → BugReportHistoryDialog-1jJf6SqH.js} +1 -1
  19. package/dist/public/assets/{CodeMirrorPropInput-9QJciX7M.js → CodeMirrorPropInput-DbtfdWI7.js} +3 -3
  20. package/dist/public/assets/{ConfigSharingInfoTooltip-Dz5-bsuu.js → ConfigSharingInfoTooltip-DBL_oQN-.js} +1 -1
  21. package/dist/public/assets/{ConsentDialogBody-BOStsOyA.js → ConsentDialogBody-BI66aSep.js} +1 -1
  22. package/dist/public/assets/{DiffView-DI7cYNCJ.js → DiffView-DHe2qKSH.js} +1 -1
  23. package/dist/public/assets/DocumentContext-Ck50-yde.js +38 -0
  24. package/dist/public/assets/{EditorModeToggle-CUthx8ij.js → EditorModeToggle-BBqYa6JE.js} +1 -1
  25. package/dist/public/assets/{EnableSyncConfirmDialog-BxFOLMEx.js → EnableSyncConfirmDialog-D2kjMUuG.js} +1 -1
  26. package/dist/public/assets/{ExcalidrawDocEditor-BCFlRC1t.js → ExcalidrawDocEditor-CQUp82Jf.js} +6 -6
  27. package/dist/public/assets/FeedbackForm-CblDDg9E.js +1 -0
  28. package/dist/public/assets/{GraphPanel-DUq-jKkt.js → GraphPanel-fkZRWaBc.js} +1 -1
  29. package/dist/public/assets/{ImportSkillDialog-BnqZ4VbK.js → ImportSkillDialog-CIkAZSMV.js} +1 -1
  30. package/dist/public/assets/{LintConfigEditor-C2t-WQnh.js → LintConfigEditor-CF-I70Tv.js} +1 -1
  31. package/dist/public/assets/{ManagedArtifactProperties-CLxTPpQi.js → ManagedArtifactProperties-46boJs1z.js} +1 -1
  32. package/dist/public/assets/ManagedArtifactProperties-DU2HSHDi.js +1 -0
  33. package/dist/public/assets/{McpConsentDialogBody-CwRVqAIu.js → McpConsentDialogBody-Br5W9Pss.js} +1 -1
  34. package/dist/public/assets/{Mermaid-DfHFZrVf.js → Mermaid-ImTX2BxI.js} +2 -2
  35. package/dist/public/assets/{MermaidDocEditor-BbnC7MJL.js → MermaidDocEditor-BLQH-UZz.js} +1 -1
  36. package/dist/public/assets/{PropertyDisplayRow-BA6SsLPG.js → PropertyDisplayRow-BJv0H_wf.js} +2 -2
  37. package/dist/public/assets/{RegisteredAgentIcon-9IP3tgIz.js → RegisteredAgentIcon-D_jDwJpu.js} +1 -1
  38. package/dist/public/assets/{ReportBugDialogBody-BbGmD7ER.js → ReportBugDialogBody-BCldEkeI.js} +1 -1
  39. package/dist/public/assets/{SchemaConfigEditor-B79QMh5X.js → SchemaConfigEditor-D9J8kIWE.js} +1 -1
  40. package/dist/public/assets/{SessionsHost-DZ7npdqD.js → SessionsHost-R7rO_QKQ.js} +2 -2
  41. package/dist/public/assets/{SettingsDialogBody-Dz9wzT-I.js → SettingsDialogBody-D1rWqQm5.js} +1 -1
  42. package/dist/public/assets/{ShareBranchSwitchDialog-C38JXddc.js → ShareBranchSwitchDialog-D3iwikBy.js} +1 -1
  43. package/dist/public/assets/{ShareReceiveDialog-D0FZrbeU.js → ShareReceiveDialog-BPmOaV0V.js} +1 -1
  44. package/dist/public/assets/{ShareReceiveMissDialog-Cs3r4uh7.js → ShareReceiveMissDialog-DDQTZofi.js} +1 -1
  45. package/dist/public/assets/{SkillCostValue-CwTtw1o3.js → SkillCostValue-B6TVsf2o.js} +1 -1
  46. package/dist/public/assets/{SkillEditBanner-VBqy0pOg.js → SkillEditBanner-B9pszjmf.js} +1 -1
  47. package/dist/public/assets/{SkillInstallMenu-CXmlnO9-.js → SkillInstallMenu-_2qgOJI6.js} +1 -1
  48. package/dist/public/assets/{SkillOriginInline-BDb1h1gU.js → SkillOriginInline-CZey0-WI.js} +1 -1
  49. package/dist/public/assets/{SkillToolbarControls-BYCxvueA.js → SkillToolbarControls-DtoRnxUD.js} +1 -1
  50. package/dist/public/assets/{SlidesToolbarControls-BMXXIwtG.js → SlidesToolbarControls-Cee-YLUn.js} +1 -1
  51. package/dist/public/assets/{SourceEditor-BNe9wG9Z.js → SourceEditor-D5lTf5Bh.js} +1 -1
  52. package/dist/public/assets/{TerminalPanel-CwBb8vt4.js → TerminalPanel-Cf-vSSrN.js} +1 -1
  53. package/dist/public/assets/{TerminalWindowApp-BNVQsUh-.js → TerminalWindowApp-Bmrytq1a.js} +1 -1
  54. package/dist/public/assets/{TextDocEditor-CNIl9Mo0.js → TextDocEditor-BDZveBXD.js} +1 -1
  55. package/dist/public/assets/{ThemePicker-Cfu6jytm.js → ThemePicker-BEO3X5aw.js} +1 -1
  56. package/dist/public/assets/{ThreadView-GQxMX41b.js → ThreadView-CLySobaJ.js} +4 -4
  57. package/dist/public/assets/{TimelineDiffPane-EntkYmHp.js → TimelineDiffPane-C3r1D2TM.js} +2 -2
  58. package/dist/public/assets/{abnfDiagram-N423BO3Z-U4VtqGBo.js → abnfDiagram-N423BO3Z-C0-CVEEO.js} +1 -1
  59. package/dist/public/assets/{agent-diff-store-Dl3GkB7F.js → agent-diff-store-DGEPOw_2.js} +1 -1
  60. package/dist/public/assets/{alert-dialog-D3_HT0Lf.js → alert-dialog-Cx4P6Ih4.js} +1 -1
  61. package/dist/public/assets/{ar-SA-G6X2FPQ2-ZIt309WY.js → ar-SA-G6X2FPQ2-DGA5H1ue.js} +1 -1
  62. package/dist/public/assets/{arc-DR7JhWzI.js → arc-C8mfZFbr.js} +1 -1
  63. package/dist/public/assets/architecture-TIHT7OUA-u5trqXy4.js +1 -0
  64. package/dist/public/assets/{architectureDiagram-T3A2C74G-tXECBSP6.js → architectureDiagram-T3A2C74G-COp-j7kB.js} +1 -1
  65. package/dist/public/assets/arrow-up-right-CXMA4cr5.js +1 -0
  66. package/dist/public/assets/{auth-state-cache-B7oYbeed.js → auth-state-cache-heN4B8MW.js} +1 -1
  67. package/dist/public/assets/{az-AZ-76LH7QW2-D1EcwuV5.js → az-AZ-76LH7QW2-C85im219.js} +1 -1
  68. package/dist/public/assets/{bg-BG-XCXSNQG7-36y3JuKX.js → bg-BG-XCXSNQG7-CUCkzmBR.js} +1 -1
  69. package/dist/public/assets/{blockDiagram-VBNYF7ZC-Lzh-maol.js → blockDiagram-VBNYF7ZC-CUYbS6hW.js} +1 -1
  70. package/dist/public/assets/{bn-BD-2XOGV67Q-DWjMyrjR.js → bn-BD-2XOGV67Q-yEzIpC1C.js} +1 -1
  71. package/dist/public/assets/{braces-CDKuh9KW.js → braces-okUwnkYm.js} +1 -1
  72. package/dist/public/assets/{bug-report-send-manager-BSnINPEa.js → bug-report-send-manager-CWQo74xi.js} +1 -1
  73. package/dist/public/assets/{c4Diagram-5PPSVZJV-Dv2DA9Ff.js → c4Diagram-5PPSVZJV-DvDulwKs.js} +1 -1
  74. package/dist/public/assets/{ca-ES-6MX7JW3Y-CP-4rxGx.js → ca-ES-6MX7JW3Y-OWyGidst.js} +1 -1
  75. package/dist/public/assets/{calendar-BfB8lsjW.js → calendar-DVeRRT6c.js} +1 -1
  76. package/dist/public/assets/{case-sensitive-BRpV9t7A.js → case-sensitive-B9mhUnHr.js} +1 -1
  77. package/dist/public/assets/channel-COcGroIe.js +1 -0
  78. package/dist/public/assets/check-Bzwwm-o4.js +1 -0
  79. package/dist/public/assets/{checkbox-DF_QVto8.js → checkbox-Bi7zk4c5.js} +1 -1
  80. package/dist/public/assets/{chevron-down-DT2zmBir.js → chevron-down-xENV92Te.js} +1 -1
  81. package/dist/public/assets/chevron-left-B1wYSm9K.js +1 -0
  82. package/dist/public/assets/chevron-right-BVvjaUfh.js +1 -0
  83. package/dist/public/assets/{chunk-2GRJ4B5K-C9V9XFHZ.js → chunk-2GRJ4B5K-DyJI2DjI.js} +1 -1
  84. package/dist/public/assets/chunk-2Q5K7J3B-BlfPP7nb.js +1 -0
  85. package/dist/public/assets/chunk-3NCLNEKW-d_v0RAnZ.js +1 -0
  86. package/dist/public/assets/{chunk-4I5QYGJK-DRvkWpJa.js → chunk-4I5QYGJK-CMhIWjZe.js} +1 -1
  87. package/dist/public/assets/{chunk-5FCAYU7R-B6wnKC5Z.js → chunk-5FCAYU7R-BMVgFCD0.js} +1 -1
  88. package/dist/public/assets/{chunk-5HE753X5-CXdQa0Iw.js → chunk-5HE753X5-B3KYB1aU.js} +1 -1
  89. package/dist/public/assets/{chunk-5JV3BV7I-5K453XCb.js → chunk-5JV3BV7I-DxS_m63V.js} +1 -1
  90. package/dist/public/assets/{chunk-5RXB4S5H-Bepujvi7.js → chunk-5RXB4S5H-DltIB3Tq.js} +1 -1
  91. package/dist/public/assets/{chunk-5TONJI2A-B7ADGJ95.js → chunk-5TONJI2A-8rr7Hm7V.js} +1 -1
  92. package/dist/public/assets/{chunk-5VM5RSS4-DJFon18P.js → chunk-5VM5RSS4-W0Hpq7PJ.js} +1 -1
  93. package/dist/public/assets/{chunk-6Q2QTUOP-uZ1QaaTd.js → chunk-6Q2QTUOP-BNJqKIB8.js} +1 -1
  94. package/dist/public/assets/{chunk-7BUUIJ7U-DEVgK4C5.js → chunk-7BUUIJ7U-CR0nXQRn.js} +1 -1
  95. package/dist/public/assets/{chunk-7Z6QIM7H-BaiL4HQb.js → chunk-7Z6QIM7H-DeOOqZeV.js} +1 -1
  96. package/dist/public/assets/{chunk-BIQX33UG-BCRpJvIo.js → chunk-BIQX33UG-EpcKIUw5.js} +1 -1
  97. package/dist/public/assets/{chunk-BO2N2NFS-BVKS5mdX.js → chunk-BO2N2NFS-CepakHPv.js} +3 -3
  98. package/dist/public/assets/{chunk-CQNSW5MT-Fea1rIgh.js → chunk-CQNSW5MT-KFmWjuaE.js} +1 -1
  99. package/dist/public/assets/{chunk-CYSBUYHQ-nUuNGvRl.js → chunk-CYSBUYHQ-BzqnFmtj.js} +1 -1
  100. package/dist/public/assets/{chunk-EIO257PC-Dbsk3Fhl.js → chunk-EIO257PC-B02-TNW8.js} +1 -1
  101. package/dist/public/assets/{chunk-EMLP6XTP-C-G-KGn9.js → chunk-EMLP6XTP-B2WwucMc.js} +1 -1
  102. package/dist/public/assets/{chunk-GF5L2VYU-bkTHrje2.js → chunk-GF5L2VYU-CxN4epH0.js} +1 -1
  103. package/dist/public/assets/{chunk-I66GZJ75-DdvvFHYK.js → chunk-I66GZJ75-CP2GhVHJ.js} +1 -1
  104. package/dist/public/assets/{chunk-J7OUQ5F2-Dkai_3ry.js → chunk-J7OUQ5F2-DB2NP1tU.js} +2 -2
  105. package/dist/public/assets/{chunk-JG7HCLWE-DuD1Q6Hl.js → chunk-JG7HCLWE-BmaBcoQT.js} +1 -1
  106. package/dist/public/assets/{chunk-JQJVKLGR-BVFBBTqn.js → chunk-JQJVKLGR-C_UEBYFh.js} +1 -1
  107. package/dist/public/assets/{chunk-JWPE2WC7-D5w3_tHx.js → chunk-JWPE2WC7-ewHjiSjT.js} +1 -1
  108. package/dist/public/assets/{chunk-K2UTITRG-CQahYOm6.js → chunk-K2UTITRG-BJBPIYUX.js} +4 -4
  109. package/dist/public/assets/{chunk-KBJHAD2P-Cu02YobZ.js → chunk-KBJHAD2P-SvZealg3.js} +1 -1
  110. package/dist/public/assets/{chunk-MOZMSUNE-BX8qCF5o.js → chunk-MOZMSUNE-BqVoeq-Z.js} +1 -1
  111. package/dist/public/assets/{chunk-NSK5VX7P-Cm6rtpZw.js → chunk-NSK5VX7P-B24wWiov.js} +1 -1
  112. package/dist/public/assets/{chunk-OSBZ3O6U-D6jJ4FxH.js → chunk-OSBZ3O6U-B-27O6Vr.js} +1 -1
  113. package/dist/public/assets/{chunk-QBLGF6JB-CDjITZxw.js → chunk-QBLGF6JB-Bhwe7R8z.js} +1 -1
  114. package/dist/public/assets/{chunk-QR6OTTB3-CdcXCJoC.js → chunk-QR6OTTB3-CPuJu4O9.js} +1 -1
  115. package/dist/public/assets/{chunk-R7FJI6CG-DfEovF_y.js → chunk-R7FJI6CG-Da8VCdQb.js} +1 -1
  116. package/dist/public/assets/{chunk-RYQCIY6F-BzaKuixW.js → chunk-RYQCIY6F-DLFjTppR.js} +1 -1
  117. package/dist/public/assets/{chunk-U6XO7XAA-C8eEqZWd.js → chunk-U6XO7XAA-o2GYyWCb.js} +1 -1
  118. package/dist/public/assets/{chunk-UBXNYLIW-tLiyG5ZI.js → chunk-UBXNYLIW-BQDXCcT8.js} +1 -1
  119. package/dist/public/assets/{chunk-W5SLKNZC-DuVZK-DG.js → chunk-W5SLKNZC-BSnYPJds.js} +1 -1
  120. package/dist/public/assets/{chunk-WRU74C26-1154g7A6.js → chunk-WRU74C26-NA2qfhE1.js} +1 -1
  121. package/dist/public/assets/chunk-XXDRQBXY-Eeo_7DB8.js +1 -0
  122. package/dist/public/assets/{chunk-YOTPTUD7-CVcdZWF6.js → chunk-YOTPTUD7-IpXTSG-1.js} +1 -1
  123. package/dist/public/assets/{chunk-ZIRB5QZD-Ce914HoD.js → chunk-ZIRB5QZD-D0iVBpjM.js} +1 -1
  124. package/dist/public/assets/{circle-alert-CuO28qX3.js → circle-alert-CKGYtHdt.js} +1 -1
  125. package/dist/public/assets/classDiagram-JCYQIIEL-D246yOIx.js +1 -0
  126. package/dist/public/assets/classDiagram-v2-OCEON4UE-DAc1VjXC.js +1 -0
  127. package/dist/public/assets/{cm-theme-CundV4JI.js → cm-theme-oWzSXbf4.js} +1 -1
  128. package/dist/public/assets/{comment-chips-Q-QmXc-P.js → comment-chips-Bd_Ee8gr.js} +1 -1
  129. package/dist/public/assets/{config-provider-B5cGmhxA.js → config-provider-DLTxAd1q.js} +3 -3
  130. package/dist/public/assets/{cose-bilkent-JH36ORCC-QecUCjuD.js → cose-bilkent-JH36ORCC-BY5w1ifg.js} +1 -1
  131. package/dist/public/assets/{cs-CZ-2BRQDIVT-DrpA4rm5.js → cs-CZ-2BRQDIVT-CNF9y8K9.js} +1 -1
  132. package/dist/public/assets/cynefin-VYW2F7L2-B4ClFxtc.js +1 -0
  133. package/dist/public/assets/{cynefinDiagram-MW4NZA55-CE9Z5Vl5.js → cynefinDiagram-MW4NZA55-BWwd5iqY.js} +1 -1
  134. package/dist/public/assets/{da-DK-5WZEPLOC-DqcVW6r2.js → da-DK-5WZEPLOC-Blia_6Ss.js} +1 -1
  135. package/dist/public/assets/{dagre-DeJVwfs5.js → dagre-CeB4vlfW.js} +1 -1
  136. package/dist/public/assets/{dagre-VZM6K2ZE-l6JbWhTm.js → dagre-VZM6K2ZE-DGZytYl_.js} +1 -1
  137. package/dist/public/assets/{de-DE-XR44H4JA-c1g3B_1W.js → de-DE-XR44H4JA-Bd8AZ_tx.js} +1 -1
  138. package/dist/public/assets/{diagram-7IWD3JNH-R_54Evc_.js → diagram-7IWD3JNH-Wf-PIi35.js} +1 -1
  139. package/dist/public/assets/{diagram-B4RE2ZJO-jRIES5QB.js → diagram-B4RE2ZJO-Dj22fEj4.js} +1 -1
  140. package/dist/public/assets/{diagram-LBJQPF4R-BcO2HjWp.js → diagram-LBJQPF4R-CR7cvSjy.js} +1 -1
  141. package/dist/public/assets/{diagram-Q27KOJAE-Cx6r8Ane.js → diagram-Q27KOJAE-mb42FRtc.js} +1 -1
  142. package/dist/public/assets/{diagram-UB23O5K3-DqfBod7o.js → diagram-UB23O5K3-CTfmgppp.js} +1 -1
  143. package/dist/public/assets/{dialog-CeTXzamA.js → dialog-CNGLHo4Y.js} +1 -1
  144. package/dist/public/assets/{dist-BDokCQTT.js → dist-B2YZK8xP.js} +1 -1
  145. package/dist/public/assets/{dist-Dln1RION.js → dist-B4pxv-md.js} +1 -1
  146. package/dist/public/assets/{dist-Dvx6OW-b.js → dist-BCas6rK-.js} +1 -1
  147. package/dist/public/assets/{dist-DDg98E5q.js → dist-BPzBqd9z.js} +1 -1
  148. package/dist/public/assets/{dist-BkdK7CJv.js → dist-CTEsrXGw.js} +1 -1
  149. package/dist/public/assets/{dist-42PGOjVE.js → dist-CXDS0Fr6.js} +1 -1
  150. package/dist/public/assets/{dist-CbJimssg.js → dist-Cexu7O7F.js} +1 -1
  151. package/dist/public/assets/{dist-CmGSr9O-.js → dist-DAUEDzd8.js} +1 -1
  152. package/dist/public/assets/{dist-ZzZDT_qa.js → dist-DEDfvxCy.js} +1 -1
  153. package/dist/public/assets/{dist-Cxi87QtK.js → dist-Dl-SDTRn.js} +1 -1
  154. package/dist/public/assets/{dist-q2W-QRsN.js → dist-Dl0XBo_3.js} +1 -1
  155. package/dist/public/assets/{dist-DpEQ7fP3.js → dist-Duv9CObB.js} +1 -1
  156. package/dist/public/assets/{dist-DoGQZx5L.js → dist-DwyWIy9f.js} +1 -1
  157. package/dist/public/assets/{dist-DfNDNysF.js → dist-Wza7qMOs.js} +1 -1
  158. package/dist/public/assets/{download-BDEHPw74.js → download-Bdmlj4Jo.js} +1 -1
  159. package/dist/public/assets/{dropdown-menu-C8skJt-Y.js → dropdown-menu-DRIarAms.js} +1 -1
  160. package/dist/public/assets/{ebnfDiagram-BXEA7PRR-Bwwa1Mdz.js → ebnfDiagram-BXEA7PRR-DC9XdFNx.js} +1 -1
  161. package/dist/public/assets/{el-GR-BZB4AONW-Cr0PFYoQ.js → el-GR-BZB4AONW-DZuHDBq1.js} +1 -1
  162. package/dist/public/assets/{en-B4ZKOASM-CzKH7tBC.js → en-B4ZKOASM-BUOAYsfW.js} +1 -1
  163. package/dist/public/assets/{erDiagram-JOGREHBK-BXsgvN7L.js → erDiagram-JOGREHBK-iWDzvS_L.js} +1 -1
  164. package/dist/public/assets/{es-ES-U4NZUMDT-C_m9ako1.js → es-ES-U4NZUMDT-3QnbX6vr.js} +1 -1
  165. package/dist/public/assets/{eu-ES-A7QVB2H4-DpGVuA_J.js → eu-ES-A7QVB2H4-C7lSeC6u.js} +1 -1
  166. package/dist/public/assets/eventmodeling-45OFAUF4-VBndQWOJ.js +1 -0
  167. package/dist/public/assets/{eye-CXNadRZD.js → eye-DIJifYDY.js} +1 -1
  168. package/dist/public/assets/{fa-IR-HGAKTJCU-PN5-EanD.js → fa-IR-HGAKTJCU-KAW5YnG_.js} +1 -1
  169. package/dist/public/assets/{fi-FI-Z5N7JZ37-DywWtEre.js → fi-FI-Z5N7JZ37-BQrcMG_0.js} +1 -1
  170. package/dist/public/assets/{field-DiGsul30.js → field-BnGNvs-N.js} +1 -1
  171. package/dist/public/assets/{file-tree-adapter-DPMZ6S3u.js → file-tree-adapter-HHvj2nNS.js} +1 -1
  172. package/dist/public/assets/flowDiagram-UKHOOZJN-DF5TWQ08.js +1 -0
  173. package/dist/public/assets/{folder-config-api-O6ouA6Kj.js → folder-config-api-B3yv7aJY.js} +1 -1
  174. package/dist/public/assets/{folder-open-Dokmmg9C.js → folder-open-5aQb9yif.js} +1 -1
  175. package/dist/public/assets/{fr-FR-RHASNOE6-d3yxt99e.js → fr-FR-RHASNOE6-Dy6kfAte.js} +1 -1
  176. package/dist/public/assets/{ganttDiagram-PKOTCBZU-DDPJ5Vmz.js → ganttDiagram-PKOTCBZU-2e3KWQ5A.js} +1 -1
  177. package/dist/public/assets/{git-branch-C3seqxdn.js → git-branch-BEl3Boky.js} +1 -1
  178. package/dist/public/assets/gitGraph-TEB2WS4Q-DHUs6vyl.js +1 -0
  179. package/dist/public/assets/{gitGraphDiagram-DS77QQ5N-DV8nqTks.js → gitGraphDiagram-DS77QQ5N-CO3DFlWl.js} +1 -1
  180. package/dist/public/assets/{gl-ES-HMX3MZ6V-DsAptsoo.js → gl-ES-HMX3MZ6V-EiPywSaa.js} +1 -1
  181. package/dist/public/assets/globals-Bg7TE4FR.css +1 -0
  182. package/dist/public/assets/{graphlib-C2ULDrd4.js → graphlib-DSwTEXpw.js} +1 -1
  183. package/dist/public/assets/{hash-CXbTGfZC.js → hash-26j3E552.js} +1 -1
  184. package/dist/public/assets/{he-IL-6SHJWFNN-Dz2rQy78.js → he-IL-6SHJWFNN-Ct4kEvR-.js} +1 -1
  185. package/dist/public/assets/{hi-IN-IWLTKZ5I-pjrFW2z9.js → hi-IN-IWLTKZ5I-Cek-mACj.js} +1 -1
  186. package/dist/public/assets/{highlighted-body-OFNGDK62-R5erL3S3.js → highlighted-body-OFNGDK62-DBvGSv5B.js} +1 -1
  187. package/dist/public/assets/{history-CPr-xzs6.js → history-BteF85_l.js} +1 -1
  188. package/dist/public/assets/{hu-HU-A5ZG7DT2-BClp1Hmx.js → hu-HU-A5ZG7DT2-B9cZ18sJ.js} +1 -1
  189. package/dist/public/assets/i18n-DEuWk-9U.js +1 -0
  190. package/dist/public/assets/{id-ID-SAP4L64H-nxQWqtlX.js → id-ID-SAP4L64H-z_imxKUa.js} +1 -1
  191. package/dist/public/assets/image-GAAHSSAO-DFv7e37S.js +1 -0
  192. package/dist/public/assets/index-CFSlZP6h.js +2098 -0
  193. package/dist/public/assets/{info-DIn-MtiX.js → info-CqQMSCez.js} +1 -1
  194. package/dist/public/assets/info-DKCQHKI2-CD6kTazz.js +1 -0
  195. package/dist/public/assets/{infoDiagram-6WML65LV-DPWJulz5.js → infoDiagram-6WML65LV-BArq_l8s.js} +1 -1
  196. package/dist/public/assets/{input-group-ChHhVUP_.js → input-group-DVpyeMx6.js} +1 -1
  197. package/dist/public/assets/{ishikawaDiagram-WSZJBQD7-DTJJS9BZ.js → ishikawaDiagram-WSZJBQD7-Cj3h357u.js} +1 -1
  198. package/dist/public/assets/{it-IT-JPQ66NNP-CMnh69L_.js → it-IT-JPQ66NNP-Bk1vs-4u.js} +1 -1
  199. package/dist/public/assets/{ja-JP-DBVTYXUO-kUpBHMVk.js → ja-JP-DBVTYXUO-DyGs37xf.js} +1 -1
  200. package/dist/public/assets/{journeyDiagram-NVQOT4AX-DSNwyC9g.js → journeyDiagram-NVQOT4AX-C-MxZYlE.js} +1 -1
  201. package/dist/public/assets/{kaa-6HZHGXH3-C33YyIjW.js → kaa-6HZHGXH3-Bw0g2ynu.js} +1 -1
  202. package/dist/public/assets/{kab-KAB-ZGHBKWFO-D3HSCwL8.js → kab-KAB-ZGHBKWFO-CTRAa943.js} +1 -1
  203. package/dist/public/assets/{kanban-definition-27J2QSJJ-B5B5rQlv.js → kanban-definition-27J2QSJJ-Dg30CEV-.js} +1 -1
  204. package/dist/public/assets/{kk-KZ-P5N5QNE5-CWaJscgE.js → kk-KZ-P5N5QNE5--rsYa4qa.js} +1 -1
  205. package/dist/public/assets/{km-KH-HSX4SM5Z-DmRVoVt9.js → km-KH-HSX4SM5Z-DQr4MQA5.js} +1 -1
  206. package/dist/public/assets/{ko-KR-MTYHY66A-DtEdWVy6.js → ko-KR-MTYHY66A-CFGQzmhC.js} +1 -1
  207. package/dist/public/assets/{ku-TR-6OUDTVRD-CdE2By-R.js → ku-TR-6OUDTVRD-5i2bTOt6.js} +1 -1
  208. package/dist/public/assets/{line-BX_DXx_6.js → line-sQdWat1D.js} +1 -1
  209. package/dist/public/assets/{linear-yKfiRb8l.js → linear-BhU5g7D6.js} +1 -1
  210. package/dist/public/assets/{lint-plugin-meta-AbruPv8_.js → lint-plugin-meta-C15NfeTq.js} +1 -1
  211. package/dist/public/assets/{list-plus-Lm4FbPM9.js → list-plus-1_iMFVqs.js} +1 -1
  212. package/dist/public/assets/local-menu-action-bus-BuSRFm5g.js +1 -0
  213. package/dist/public/assets/{lt-LT-XHIRWOB4-Dy0Um1hj.js → lt-LT-XHIRWOB4-BKb7p1JD.js} +1 -1
  214. package/dist/public/assets/{lv-LV-5QDEKY6T-F4Gqvlf2.js → lv-LV-5QDEKY6T-B4dU8plL.js} +1 -1
  215. package/dist/public/assets/{map-BQLvsZRE.js → map-DSs4OVfF.js} +1 -1
  216. package/dist/public/assets/{markdownlint-rule-browser-Cewh1U89.js → markdownlint-rule-browser-CoxOkILA.js} +1 -1
  217. package/dist/public/assets/mermaid-GHXKKRXX-Btzcf1TZ.js +1 -0
  218. package/dist/public/assets/{mermaid-parser.core-CmtFEtdo.js → mermaid-parser.core-CWNtRrX9.js} +2 -2
  219. package/dist/public/assets/{mermaid.core-W68NSbS2.js → mermaid.core-BKfDFKSP.js} +3 -3
  220. package/dist/public/assets/mermaid.core-BsJTOuVl.js +1 -0
  221. package/dist/public/assets/messages-B3aWVD-S.js +1 -0
  222. package/dist/public/assets/messages-B83G3ljc.js +1 -0
  223. package/dist/public/assets/messages-Be7jCLyD.js +1 -0
  224. package/dist/public/assets/messages-C7toDQ-d.js +1 -0
  225. package/dist/public/assets/messages-CNajBoag.js +1 -0
  226. package/dist/public/assets/messages-COqXyjq1.js +1 -0
  227. package/dist/public/assets/messages-DDVnELoa.js +1 -0
  228. package/dist/public/assets/messages-DJHXPwV_.js +1 -0
  229. package/dist/public/assets/messages-DRZl5lAj.js +1 -0
  230. package/dist/public/assets/messages-JkhxpD-b.js +1 -0
  231. package/dist/public/assets/messages-gSHTuU7C.js +1 -0
  232. package/dist/public/assets/messages-w63SLKlk.js +1 -0
  233. package/dist/public/assets/{mindmap-definition-FAOFIHXS-CJdkasm6.js → mindmap-definition-FAOFIHXS-HRlTx1-u.js} +1 -1
  234. package/dist/public/assets/minus-HJRULrSt.js +1 -0
  235. package/dist/public/assets/{miss-dialog-store-0sg4whjI.js → miss-dialog-store-CdkrAlK3.js} +1 -1
  236. package/dist/public/assets/{mr-IN-CRQNXWMA-C-rx5nCq.js → mr-IN-CRQNXWMA-d_3UP_ok.js} +1 -1
  237. package/dist/public/assets/{my-MM-5M5IBNSE-xJAdB_W6.js → my-MM-5M5IBNSE-C-tYgHss.js} +1 -1
  238. package/dist/public/assets/{navigation-targets-7Zh8Z8C0.js → navigation-targets-CMeQ2nTj.js} +1 -1
  239. package/dist/public/assets/{nb-NO-T6EIAALU-B8m3pGOf.js → nb-NO-T6EIAALU-BOHhV2mB.js} +1 -1
  240. package/dist/public/assets/{nl-NL-IS3SIHDZ-DvYXZ05s.js → nl-NL-IS3SIHDZ-9boNdlbg.js} +1 -1
  241. package/dist/public/assets/{nn-NO-6E72VCQL-Dy0PYPzE.js → nn-NO-6E72VCQL-5kGW4A5O.js} +1 -1
  242. package/dist/public/assets/note-window-mode-J_lykVfh.js +1 -0
  243. package/dist/public/assets/{now-2hoQsmwN.js → now-eUYS5OsE.js} +1 -1
  244. package/dist/public/assets/{oc-FR-POXYY2M6-DYP9IiCC.js → oc-FR-POXYY2M6-CaH7HGV-.js} +1 -1
  245. package/dist/public/assets/{ok-7HU1xjtN.js → ok-BrWqZFiT.js} +1 -1
  246. package/dist/public/assets/{open-managed-artifact-tab-CaJA1rnO.js → open-managed-artifact-tab-dBJBwk0w.js} +1 -1
  247. package/dist/public/assets/{ordinal-B960F-5k.js → ordinal-DJL8o-kw.js} +1 -1
  248. package/dist/public/assets/{pa-IN-N4M65BXN-B1BtbAQa.js → pa-IN-N4M65BXN-BJi5WsLw.js} +1 -1
  249. package/dist/public/assets/packet-7NZHBO7P-M7v9Z7hw.js +1 -0
  250. package/dist/public/assets/{panel-right-open-6pbxqqMD.js → panel-right-open-BXE3r3dB.js} +1 -1
  251. package/dist/public/assets/{paperclip-C6Bt4Kir.js → paperclip-C-okgtwN.js} +1 -1
  252. package/dist/public/assets/{pegDiagram-VL7TDLO6-DmyKkWD-.js → pegDiagram-VL7TDLO6-CR3sxlpW.js} +1 -1
  253. package/dist/public/assets/{pending-receive-nav-store-x4DbmFsQ.js → pending-receive-nav-store-UxCZZqPo.js} +1 -1
  254. package/dist/public/assets/percentages-BXMCSKIN-BeqO-ouV.js +1 -0
  255. package/dist/public/assets/pie-RZYD4A2V-DE_3nmDK.js +1 -0
  256. package/dist/public/assets/{pieDiagram-7S7Q4E2Y-DbB4HZ75.js → pieDiagram-7S7Q4E2Y-BAVndMcp.js} +1 -1
  257. package/dist/public/assets/{pl-PL-T2D74RX3-DXltPfSJ.js → pl-PL-T2D74RX3-DvSVV2Sk.js} +1 -1
  258. package/dist/public/assets/{progress-D3L2XDbB.js → progress-CopfQaC8.js} +4 -4
  259. package/dist/public/assets/{project-paths-Be5oNlgO.js → project-paths-DQt8hUFo.js} +1 -1
  260. package/dist/public/assets/{prop-types-Cr4yQqrn.js → prop-types-Dw4i5Pzf.js} +1 -1
  261. package/dist/public/assets/{pt-BR-5N22H2LF-BBI_kUdv.js → pt-BR-5N22H2LF-WJq2YbBU.js} +1 -1
  262. package/dist/public/assets/{pt-PT-UZXXM6DQ-uqy0GUTk.js → pt-PT-UZXXM6DQ-C0Duvhw3.js} +1 -1
  263. package/dist/public/assets/{quadrantDiagram-CIZ2JOQS-BjHQcxZ0.js → quadrantDiagram-CIZ2JOQS-DQWmMrHu.js} +1 -1
  264. package/dist/public/assets/radar-I7S5WNFK-DrAAUcJY.js +1 -0
  265. package/dist/public/assets/railroad-3IZDKUUU-vTdwvGMP.js +1 -0
  266. package/dist/public/assets/railroad-abnf-AHOZXSZD-B7GLAnKx.js +1 -0
  267. package/dist/public/assets/railroad-ebnf-EBAXGLYW-D7lc0lJR.js +1 -0
  268. package/dist/public/assets/railroad-peg-LSFZ7HO6-CoUx7wsD.js +1 -0
  269. package/dist/public/assets/{railroadDiagram-AXF67PYL-CWE-Lz8D.js → railroadDiagram-AXF67PYL-C0qhLv0B.js} +1 -1
  270. package/dist/public/assets/{refresh-cw-CMZXURW4.js → refresh-cw-D41gUk_B.js} +1 -1
  271. package/dist/public/assets/{requirementDiagram-LRYGKXZP-DVzRPfG6.js → requirementDiagram-LRYGKXZP-DmWo_VQm.js} +1 -1
  272. package/dist/public/assets/{ro-RO-JPDTUUEW-CwSumY42.js → ro-RO-JPDTUUEW-DD9cyVdC.js} +1 -1
  273. package/dist/public/assets/{ru-RU-B4JR7IUQ-LzvboDA-.js → ru-RU-B4JR7IUQ-5_52Q_Wb.js} +1 -1
  274. package/dist/public/assets/{sankeyDiagram-W5VNT64P-BvGHv_UD.js → sankeyDiagram-W5VNT64P-J5Gp9uyi.js} +1 -1
  275. package/dist/public/assets/{select-CErmRiOd.js → select-fWSYgcDA.js} +1 -1
  276. package/dist/public/assets/{selection-context-h2w9at77.js → selection-context-DGXxWyI6.js} +1 -1
  277. package/dist/public/assets/{separator-DcX0NiAC.js → separator-BmK42_9U.js} +1 -1
  278. package/dist/public/assets/{sequenceDiagram-SI44F4Z6-Ckszb4Mj.js → sequenceDiagram-SI44F4Z6-i_6ZSjfE.js} +1 -1
  279. package/dist/public/assets/{si-LK-N5RQ5JYF-C5hILlvg.js → si-LK-N5RQ5JYF-BTPhhyie.js} +1 -1
  280. package/dist/public/assets/{sizeCapture-X5ZJPWSS-BDI5VFzx.js → sizeCapture-X5ZJPWSS-C9mDWIT_.js} +1 -1
  281. package/dist/public/assets/{sk-SK-C5VTKIMK-CCvKNdO-.js → sk-SK-C5VTKIMK-DD9NSv5S.js} +1 -1
  282. package/dist/public/assets/{skill-actions-4kc4-QY2.js → skill-actions-BPZhgTVv.js} +1 -1
  283. package/dist/public/assets/{skills-api-BBFYlIZX.js → skills-api-C_StP2ff.js} +1 -1
  284. package/dist/public/assets/{sl-SI-NN7IZMDC-BfnXOjuK.js → sl-SI-NN7IZMDC-DtxXdh0P.js} +1 -1
  285. package/dist/public/assets/{spinner-BfQfD3gf.js → spinner-DmibE6UV.js} +1 -1
  286. package/dist/public/assets/{square-pen-zbdpw5xR.js → square-pen-BlKNuUz7.js} +1 -1
  287. package/dist/public/assets/{src-Bomqtc9K.js → src-7pHDfMXy.js} +1 -1
  288. package/dist/public/assets/{src-D_jMrcY1.js → src-JLkedlZ8.js} +1 -1
  289. package/dist/public/assets/{stateDiagram-OKZ733FA-Bm4P0e_g.js → stateDiagram-OKZ733FA-b-4BGE9-.js} +1 -1
  290. package/dist/public/assets/stateDiagram-v2-UEYNNEHI-BkSmZC_p.js +1 -0
  291. package/dist/public/assets/subset-shared.chunk-BuBNd2H_.js +1 -0
  292. package/dist/public/assets/{subset-worker.chunk-DiIFi44a.js → subset-worker.chunk-PNot6qJM.js} +1 -1
  293. package/dist/public/assets/{sv-SE-XGPEYMSR-DU96U1G3.js → sv-SE-XGPEYMSR-BrLrPOqK.js} +1 -1
  294. package/dist/public/assets/{swimlanes-SLNWSIFB-iiVbZ3fC.js → swimlanes-SLNWSIFB-Czms9qC3.js} +2 -2
  295. package/dist/public/assets/swimlanesDiagram-ULZ7WXOC-C3GKm4s9.js +8 -0
  296. package/dist/public/assets/{ta-IN-2NMHFXQM-CQIbY_GB.js → ta-IN-2NMHFXQM-DwD_dVRw.js} +1 -1
  297. package/dist/public/assets/{tag-pill-input-DgUotlo1.js → tag-pill-input-DOK3Iwu7.js} +1 -1
  298. package/dist/public/assets/{target-navigation-intent-C2bzkG7y.js → target-navigation-intent-iE_o5AFg.js} +1 -1
  299. package/dist/public/assets/{telemetry-impl-Cj_q40Ol.js → telemetry-impl-JfG1C4Ii.js} +2 -2
  300. package/dist/public/assets/{telemetry-startup-DjnediLY.js → telemetry-startup-ukYaFMYg.js} +1 -1
  301. package/dist/public/assets/terminal-CmHqE3At.js +1 -0
  302. package/dist/public/assets/{terminal-cli-display-B0Y1q_3_.js → terminal-cli-display-BZQS2rOc.js} +1 -1
  303. package/dist/public/assets/{terminal-launch-events-D6d5Ges-.js → terminal-launch-events-DT_27wCG.js} +1 -1
  304. package/dist/public/assets/{terminal-telemetry-cuRPHPUa.js → terminal-telemetry-Zge_t1pH.js} +1 -1
  305. package/dist/public/assets/{text-viewer-languages-8mK7FOb6.js → text-viewer-languages-B-QzK84i.js} +2 -2
  306. package/dist/public/assets/{th-TH-HPSO5L25-CV6CDLuR.js → th-TH-HPSO5L25-CQ4NNj8w.js} +1 -1
  307. package/dist/public/assets/{timeline-definition-Z64GVDOM-CrQPhNwW.js → timeline-definition-Z64GVDOM-B5lIWea4.js} +1 -1
  308. package/dist/public/assets/{tr-TR-DEFEU3FU-C6Aa1Flg.js → tr-TR-DEFEU3FU-B83CxqxO.js} +1 -1
  309. package/dist/public/assets/{trash-2-DfA0xAM7.js → trash-2-BVoWHmfV.js} +1 -1
  310. package/dist/public/assets/treeView-QDETBFTQ-oKtO3_NQ.js +1 -0
  311. package/dist/public/assets/treemap-6X3UGDF4-i-sAzsOy.js +1 -0
  312. package/dist/public/assets/{triangle-alert-LClCSvEK.js → triangle-alert-CJVfCxE0.js} +1 -1
  313. package/dist/public/assets/typing-burst-detector-C7BoCgKx.js +8 -0
  314. package/dist/public/assets/{uk-UA-QMV73CPH-OWyPSQfb.js → uk-UA-QMV73CPH-Dv-8Anmo.js} +1 -1
  315. package/dist/public/assets/{undo-2-D0RXWwCv.js → undo-2-CXHp9Ngg.js} +1 -1
  316. package/dist/public/assets/{uninstall-e5mr-v84.js → uninstall-Dcb_Lsmn.js} +1 -1
  317. package/dist/public/assets/{use-activity-panel-42TSf0b4.js → use-activity-panel-BBVDhVwA.js} +1 -1
  318. package/dist/public/assets/{use-apply-config-color-theme-_e_6wswh.js → use-apply-config-color-theme-C0gjDHWs.js} +1 -1
  319. package/dist/public/assets/{use-live-xterm-theme-DttIXtHR.js → use-live-xterm-theme-DRqvSsHA.js} +1 -1
  320. package/dist/public/assets/{use-open-skill-BA0dark2.js → use-open-skill-DJbuKFkN.js} +1 -1
  321. package/dist/public/assets/{use-popular-skills-DvnTYBwL.js → use-popular-skills-B4f2Q6xQ.js} +1 -1
  322. package/dist/public/assets/{use-skill-origin-CbxA-zVs.js → use-skill-origin-DX_4jInC.js} +1 -1
  323. package/dist/public/assets/{use-terminal-enabled-DwfFJKIS.js → use-terminal-enabled-CT_mZgaI.js} +1 -1
  324. package/dist/public/assets/{use-timeline-entry-diff-ugv5__aD.js → use-timeline-entry-diff-CVCEa59v.js} +2 -2
  325. package/dist/public/assets/{vennDiagram-T6HMQDX7-DUxH4wy8.js → vennDiagram-T6HMQDX7-VmF9ZBTb.js} +1 -1
  326. package/dist/public/assets/{vi-VN-M7AON7JQ-MVSUDlZy.js → vi-VN-M7AON7JQ-B2DkADMO.js} +1 -1
  327. package/dist/public/assets/wardley-OPB4EBWU-Cw7yLxju.js +1 -0
  328. package/dist/public/assets/{wardleyDiagram-T6FBY63Y-CRduVCHa.js → wardleyDiagram-T6FBY63Y-CtNP6mmF.js} +1 -1
  329. package/dist/public/assets/{wrench-Bx808FyC.js → wrench-JX3g_hHJ.js} +1 -1
  330. package/dist/public/assets/x-wQUDJS55.js +1 -0
  331. package/dist/public/assets/{xychartDiagram-ELKLHX3M-ayUwPHsi.js → xychartDiagram-ELKLHX3M-BAHa9UcP.js} +1 -1
  332. package/dist/public/assets/{zh-CN-LNUGB5OW-D4zkPVC6.js → zh-CN-LNUGB5OW-DrO9Lxyg.js} +1 -1
  333. package/dist/public/assets/{zh-HK-E62DVLB3-Dy7q7eJs.js → zh-HK-E62DVLB3-Bmric47w.js} +1 -1
  334. package/dist/public/assets/{zh-TW-RAJ6MFWO-CPtRFViX.js → zh-TW-RAJ6MFWO-B4U0Q706.js} +1 -1
  335. package/dist/public/index.html +135 -134
  336. package/dist/public/uninstall.html +13 -13
  337. package/dist/{repair-launch-json-DF9ENtcc.mjs → repair-launch-json-MRFbgFDR.mjs} +2 -2
  338. package/dist/{repair-mcp-configs-7mR1x_gG.mjs → repair-mcp-configs-YzmkgoIk.mjs} +2 -2
  339. package/dist/{repair-skills-D26UpUq7.mjs → repair-skills-C5NbMYuU.mjs} +2 -2
  340. package/dist/repair-skills-DycFH6DB.mjs +1 -0
  341. package/dist/{resolve-project-root-C94rZ_5O.mjs → resolve-project-root-XuKmxBzQ.mjs} +2 -2
  342. package/dist/{skill-teardown-CbmpKJso.mjs → skill-teardown-Dp8qru7m.mjs} +2 -2
  343. package/dist/{src-BHDHmhMl.mjs → src-32lVY8sD.mjs} +2 -2
  344. package/dist/src-BTKQ464e.mjs +1 -0
  345. package/dist/{src-BqEF6smt.mjs → src-DQ3dkBL8.mjs} +1 -1
  346. package/dist/{src-CngO3W4j.mjs → src-H5bQHekD.mjs} +2 -2
  347. package/dist/start-B6aZOT-d.mjs +1 -0
  348. package/dist/{start-C3YGfc7d.mjs → start-d7sxUrTf.mjs} +3 -3
  349. package/package.json +4 -4
  350. package/dist/constants--qal1Ck2.mjs +0 -2
  351. package/dist/init-DKbUgSBT.mjs +0 -1
  352. package/dist/loader-DYh9HsDZ.mjs +0 -1
  353. package/dist/preview-D62yELdV.mjs +0 -1
  354. package/dist/public/assets/DocumentContext-Dno1hL8m.js +0 -38
  355. package/dist/public/assets/FeedbackForm-CYYffQty.js +0 -1
  356. package/dist/public/assets/ManagedArtifactProperties-DVu1drYh.js +0 -1
  357. package/dist/public/assets/architecture-TIHT7OUA-BkasmReP.js +0 -1
  358. package/dist/public/assets/arrow-up-right-BD5rQrDA.js +0 -1
  359. package/dist/public/assets/channel-DkPHFN0f.js +0 -1
  360. package/dist/public/assets/check-DDzb-wrU.js +0 -1
  361. package/dist/public/assets/chevron-left-7MFpt77_.js +0 -1
  362. package/dist/public/assets/chevron-right-D8IV-Ph_.js +0 -1
  363. package/dist/public/assets/chunk-2Q5K7J3B-Cfjqtkxz.js +0 -1
  364. package/dist/public/assets/chunk-3NCLNEKW-BYKJOcB6.js +0 -1
  365. package/dist/public/assets/chunk-XXDRQBXY-Bwmq4E1Q.js +0 -1
  366. package/dist/public/assets/classDiagram-JCYQIIEL-ZJNQWqPL.js +0 -1
  367. package/dist/public/assets/classDiagram-v2-OCEON4UE-BVcoIlfv.js +0 -1
  368. package/dist/public/assets/cynefin-VYW2F7L2-DvYWJxyz.js +0 -1
  369. package/dist/public/assets/eventmodeling-45OFAUF4-BIYIStQq.js +0 -1
  370. package/dist/public/assets/flowDiagram-UKHOOZJN-C7BD5YvS.js +0 -1
  371. package/dist/public/assets/gitGraph-TEB2WS4Q-Dj42vABH.js +0 -1
  372. package/dist/public/assets/globals-C8zrBTBL.css +0 -1
  373. package/dist/public/assets/i18n-_vkpWTPD.js +0 -1
  374. package/dist/public/assets/image-GAAHSSAO-DbE8jeIe.js +0 -1
  375. package/dist/public/assets/index-CkJYCHla.js +0 -2098
  376. package/dist/public/assets/info-DKCQHKI2-DoDfw9x-.js +0 -1
  377. package/dist/public/assets/local-menu-action-bus-IjTSMx8U.js +0 -1
  378. package/dist/public/assets/mermaid-GHXKKRXX-D2pBG5L4.js +0 -1
  379. package/dist/public/assets/mermaid.core-DNpF2SSh.js +0 -1
  380. package/dist/public/assets/messages-BkL6oWHg.js +0 -1
  381. package/dist/public/assets/messages-C3xDNJLe.js +0 -1
  382. package/dist/public/assets/messages-CGqWrXZK.js +0 -1
  383. package/dist/public/assets/messages-CGw43ytR.js +0 -1
  384. package/dist/public/assets/messages-CJdQEZYP.js +0 -1
  385. package/dist/public/assets/messages-COuGBUFr.js +0 -1
  386. package/dist/public/assets/messages-CSJ16uA9.js +0 -1
  387. package/dist/public/assets/messages-CZa_BmA2.js +0 -1
  388. package/dist/public/assets/messages-Cgi0xg9T.js +0 -1
  389. package/dist/public/assets/messages-CtlqcdTj.js +0 -1
  390. package/dist/public/assets/messages-YHyKhEK1.js +0 -1
  391. package/dist/public/assets/messages-fJqQmhka.js +0 -1
  392. package/dist/public/assets/minus-zMlnd3qf.js +0 -1
  393. package/dist/public/assets/packet-7NZHBO7P-COfpr2CC.js +0 -1
  394. package/dist/public/assets/percentages-BXMCSKIN-BA4UETkp.js +0 -1
  395. package/dist/public/assets/pie-RZYD4A2V-DNxV-985.js +0 -1
  396. package/dist/public/assets/radar-I7S5WNFK-StB9djRh.js +0 -1
  397. package/dist/public/assets/railroad-3IZDKUUU-COWcqbx-.js +0 -1
  398. package/dist/public/assets/railroad-abnf-AHOZXSZD-Cwi_YybN.js +0 -1
  399. package/dist/public/assets/railroad-ebnf-EBAXGLYW-BSovpXBC.js +0 -1
  400. package/dist/public/assets/railroad-peg-LSFZ7HO6-6Vmqt7TP.js +0 -1
  401. package/dist/public/assets/stateDiagram-v2-UEYNNEHI-D9_hTyIp.js +0 -1
  402. package/dist/public/assets/subset-shared.chunk-DCJmH73z.js +0 -1
  403. package/dist/public/assets/swimlanesDiagram-ULZ7WXOC-Hd_RccsN.js +0 -8
  404. package/dist/public/assets/terminal-4WK7jXvy.js +0 -1
  405. package/dist/public/assets/treeView-QDETBFTQ-BXlsBdsv.js +0 -1
  406. package/dist/public/assets/treemap-6X3UGDF4-Mb_AKp2H.js +0 -1
  407. package/dist/public/assets/typing-burst-detector-DaYSUVLs.js +0 -8
  408. package/dist/public/assets/wardley-OPB4EBWU-dqbQrHpX.js +0 -1
  409. package/dist/public/assets/x-C1LzPj_K.js +0 -1
  410. package/dist/repair-skills-BxzzWVm-.mjs +0 -1
  411. package/dist/src-FAWejQRG.mjs +0 -1
  412. package/dist/start-JWjnppxS.mjs +0 -1
  413. /package/dist/public/assets/{ActivityPanelDiffView-DLT5va9k.js → ActivityPanelDiffView-CgaFZtD7.js} +0 -0
  414. /package/dist/public/assets/{SkillModeBanner-Cfij5biF.js → SkillModeBanner-BRFTW7Zd.js} +0 -0
  415. /package/dist/public/assets/{__vite-browser-external-BpzCr_ou.js → __vite-browser-external-Ci1NQTFf.js} +0 -0
  416. /package/dist/public/assets/{agent-presence-3JajMNAq.js → agent-presence-B4IC4MV9.js} +0 -0
  417. /package/dist/public/assets/{app-menubar-gate-q1nJIutw.js → app-menubar-gate-Dyq1r1xM.js} +0 -0
  418. /package/dist/public/assets/{array-DO4pDyQ7.js → array-Ca_7zfOn.js} +0 -0
  419. /package/dist/public/assets/{asset-dispatch-BffGDRYN.js → asset-dispatch-BxzFY-y9.js} +0 -0
  420. /package/dist/public/assets/{auth-prompt-store-BXeyTyYx.js → auth-prompt-store-vAFATIFt.js} +0 -0
  421. /package/dist/public/assets/{badge-Bb7mpvxU.js → badge-D819pOsZ.js} +0 -0
  422. /package/dist/public/assets/{chunk-6U3AYISY-fX1E_nk2.js → chunk-6U3AYISY-C-nplzwN.js} +0 -0
  423. /package/dist/public/assets/{chunk-KEIR6QF5-d8CrmuEd.js → chunk-KEIR6QF5-Daj3WZbR.js} +0 -0
  424. /package/dist/public/assets/{chunk-SRAX5OIU-B7dPnL12.js → chunk-SRAX5OIU-BEvWJO3c.js} +0 -0
  425. /package/dist/public/assets/{chunk-Y2CYZVJY-aWKxesFC.js → chunk-Y2CYZVJY-B1lUkic5.js} +0 -0
  426. /package/dist/public/assets/{chunk-Z3N5DIM6-CNpC45dc.js → chunk-Z3N5DIM6-2xVL_dId.js} +0 -0
  427. /package/dist/public/assets/{chunk-ZUYEQ4TG-Z9Kr3Qsb.js → chunk-ZUYEQ4TG-CQSwzpWR.js} +0 -0
  428. /package/dist/public/assets/{client-version-DUlRRRQd.js → client-version-DD4hGHyX.js} +0 -0
  429. /package/dist/public/assets/{clike-BqTLk6V7.js → clike-Ch26Qmt5.js} +0 -0
  430. /package/dist/public/assets/{code-highlighter-impl-CqBvFNiv.js → code-highlighter-impl-Cd7bLu8y.js} +0 -0
  431. /package/dist/public/assets/{colors-B42OMeyx.js → colors-6O6-4xPx.js} +0 -0
  432. /package/dist/public/assets/{copilot-BvcrBiQu.js → copilot-DMpTxujg.js} +0 -0
  433. /package/dist/public/assets/{createLucideIcon-IawHI4re.js → createLucideIcon-CAkY8Blx.js} +0 -0
  434. /package/dist/public/assets/{cursor-Dy0g2caC.js → cursor-2VSK5BUh.js} +0 -0
  435. /package/dist/public/assets/{cytoscape.esm-Dt8Ta-P6.js → cytoscape.esm-CyF35CGq.js} +0 -0
  436. /package/dist/public/assets/{defaultLocale-DxxsZVg9.js → defaultLocale-D6pwJDcg.js} +0 -0
  437. /package/dist/public/assets/{diff-u5V_A1YB.js → diff-BTDLDmWn.js} +0 -0
  438. /package/dist/public/assets/{directory-open-01563666-D2UlJbzy.js → directory-open-01563666-D5XpOJpI.js} +0 -0
  439. /package/dist/public/assets/{directory-open-4ed118d0-z5A7ul2e.js → directory-open-4ed118d0-Cjiog95W.js} +0 -0
  440. /package/dist/public/assets/{dist-CcrUlXUT.js → dist-BwWNYdG0.js} +0 -0
  441. /package/dist/public/assets/{dist-N46tlm2r.js → dist-CB9JlP8s.js} +0 -0
  442. /package/dist/public/assets/{dist-BL2TNIf3.js → dist-C_x1-g67.js} +0 -0
  443. /package/dist/public/assets/{doc-paths-B46e6DrG.js → doc-paths-vtzfxIAt.js} +0 -0
  444. /package/dist/public/assets/{documents-fetch-DMG54QRV.js → documents-fetch-DV1xQi4Z.js} +0 -0
  445. /package/dist/public/assets/{external-link-CxH7AG7J.js → external-link-CIs3ZL0b.js} +0 -0
  446. /package/dist/public/assets/{file-open-002ab408-s_iGAIkJ.js → file-open-002ab408-BMfHnumz.js} +0 -0
  447. /package/dist/public/assets/{file-open-7c801643-DWbyXRKQ.js → file-open-7c801643-CPvJ2Lhu.js} +0 -0
  448. /package/dist/public/assets/{file-save-3189631c-DutIwO69.js → file-save-3189631c-xXr-Dk51.js} +0 -0
  449. /package/dist/public/assets/{file-save-745eba88-Cx1iaxYt.js → file-save-745eba88-DC5dodNM.js} +0 -0
  450. /package/dist/public/assets/{file-tree-rename-validation-MFhw33W7.js → file-tree-rename-validation-C44g0J2h.js} +0 -0
  451. /package/dist/public/assets/{file-tree-utils-F_HG4irq.js → file-tree-utils-D-D8igMV.js} +0 -0
  452. /package/dist/public/assets/{form-BZhYIbqM.js → form-L2L52iP2.js} +0 -0
  453. /package/dist/public/assets/{format-CWkG0foI.js → format-CyaLi0or.js} +0 -0
  454. /package/dist/public/assets/{gherkin-niswLhWK.js → gherkin-CypeqsOw.js} +0 -0
  455. /package/dist/public/assets/{globals-C5voaRc5.js → globals-Dad_9qHk.js} +0 -0
  456. /package/dist/public/assets/{go-DCCgKbjt.js → go-Bcb7Hfa3.js} +0 -0
  457. /package/dist/public/assets/{image-blob-reduce.esm-B6IJSUv2.js → image-blob-reduce.esm-DkbZiW0z.js} +0 -0
  458. /package/dist/public/assets/{init-BBWGEIrH.js → init-X_ANAGxw.js} +0 -0
  459. /package/dist/public/assets/{input-I1Mvaow8.js → input-a0WHtxX3.js} +0 -0
  460. /package/dist/public/assets/{isObject-DZ5_pJVn.js → isObject-2-KdVTyV.js} +0 -0
  461. /package/dist/public/assets/{known-skill-dirs-BXzevfAU.js → known-skill-dirs-BtyBErKU.js} +0 -0
  462. /package/dist/public/assets/{libesm-B7m5uxaw.js → libesm-mBLacfDP.js} +0 -0
  463. /package/dist/public/assets/{lint-config-client-CT8cGnaJ.js → lint-config-client-CTfcCpXV.js} +0 -0
  464. /package/dist/public/assets/{lru-string-cache-CEQLtS-9.js → lru-string-cache-Cc7rikda.js} +0 -0
  465. /package/dist/public/assets/{lua-B35xytUy.js → lua-0ClDTGlq.js} +0 -0
  466. /package/dist/public/assets/{min-Blkp6AN9.js → min-B6fjqEav.js} +0 -0
  467. /package/dist/public/assets/{panel-Do94xfkL.js → panel-DNPki55m.js} +0 -0
  468. /package/dist/public/assets/{panzoom.es-DbKxxf0L.js → panzoom.es-DNGwWbz6.js} +0 -0
  469. /package/dist/public/assets/{parse-api-error-RlJ5hnUA.js → parse-api-error-DcnXKbfT.js} +0 -0
  470. /package/dist/public/assets/{path-DB0YkgfR.js → path-xSBrNHof.js} +0 -0
  471. /package/dist/public/assets/{pdf-D1gEirhR.js → pdf-BqNVNwcr.js} +0 -0
  472. /package/dist/public/assets/{pdf.worker-DRJtDPZ7.js → pdf.worker-DW3F2B7X.js} +0 -0
  473. /package/dist/public/assets/{perl-CDTo2iyq.js → perl-CRAPUgGj.js} +0 -0
  474. /package/dist/public/assets/{pica-iMpjNb-X.js → pica-DfYs9nh_.js} +0 -0
  475. /package/dist/public/assets/{platform-labels-a3gk_AS8.js → platform-labels-ePF0gcem.js} +0 -0
  476. /package/dist/public/assets/{popover-Rvl_AsUU.js → popover-MKPgXNPk.js} +0 -0
  477. /package/dist/public/assets/{properties-DXEYJi9Y.js → properties-DsCKpj9y.js} +0 -0
  478. /package/dist/public/assets/{r-CGovMm-H.js → r-DKk4sl64.js} +0 -0
  479. /package/dist/public/assets/{receive-store-4-vLF9qh.js → receive-store-cbtGGZ9i.js} +0 -0
  480. /package/dist/public/assets/{rough.esm-Bc6MybHM.js → rough.esm-B3SH-vza.js} +0 -0
  481. /package/dist/public/assets/{roundRect-DjKj_8gM.js → roundRect-c37gVikV.js} +0 -0
  482. /package/dist/public/assets/{ruby-BzUaAyZc.js → ruby-De3HsNyr.js} +0 -0
  483. /package/dist/public/assets/{schema-fields-view-intent-D5671sPh.js → schema-fields-view-intent-DCUTojNw.js} +0 -0
  484. /package/dist/public/assets/{share-metadata-rows-CSTN28dW.js → share-metadata-rows-JAHDqWDY.js} +0 -0
  485. /package/dist/public/assets/{shell-_Pg8lfKe.js → shell-Co7K0fwY.js} +0 -0
  486. /package/dist/public/assets/{skeleton-DIxLroLR.js → skeleton-BZIHOzZH.js} +0 -0
  487. /package/dist/public/assets/{skill-scope-Br49HHiF.js → skill-scope-C0mo2HZh.js} +0 -0
  488. /package/dist/public/assets/{sortable.esm-DVUoPZjJ.js → sortable.esm-DK-jMveF.js} +0 -0
  489. /package/dist/public/assets/{sql-C0-EXPZB.js → sql-CSeQm6MO.js} +0 -0
  490. /package/dist/public/assets/{src-DG1oemu2.js → src-we-4-j9S.js} +0 -0
  491. /package/dist/public/assets/{startup-marks-CzkHuO_z.js → startup-marks-Br1wFcMD.js} +0 -0
  492. /package/dist/public/assets/{stex-D2L90EPe.js → stex-Ctq_QO83.js} +0 -0
  493. /package/dist/public/assets/{swift-C7F0BgoI.js → swift-Cw9hIozN.js} +0 -0
  494. /package/dist/public/assets/{tabs-r9BJxNSQ.js → tabs-C_h0VJ9w.js} +0 -0
  495. /package/dist/public/assets/{terminal-command-events-CaYhHIDg.js → terminal-command-events-z-N381nZ.js} +0 -0
  496. /package/dist/public/assets/{textarea-BtqZ3yY1.js → textarea-BoMa_3jF.js} +0 -0
  497. /package/dist/public/assets/{thread-client-Ox08BqB2.js → thread-client-wO3wM3Uc.js} +0 -0
  498. /package/dist/public/assets/{thread-draft-staging-D-3dp2ov.js → thread-draft-staging-BHVsJW6S.js} +0 -0
  499. /package/dist/public/assets/{timeline-diff-store-BaXPeva3.js → timeline-diff-store-ym5Oz1UF.js} +0 -0
  500. /package/dist/public/assets/{toml-CnVMEKmL.js → toml-SYtR-303.js} +0 -0
  501. /package/dist/public/assets/{tool-list-format-BjLHl4sC.js → tool-list-format-D9WYxB73.js} +0 -0
  502. /package/dist/public/assets/{use-apply-config-theme-yjXI2GwT.js → use-apply-config-theme-B1eLRQeV.js} +0 -0
  503. /package/dist/public/assets/{use-collab-url-BiI6d8qv.js → use-collab-url-BBo_k1TT.js} +0 -0
  504. /package/dist/public/assets/{use-installed-clis-vg6izNL9.js → use-installed-clis-t29XGX_x.js} +0 -0
  505. /package/dist/public/assets/{use-workspace-BaqJmM0n.js → use-workspace-BCxdx59D.js} +0 -0
  506. /package/dist/public/assets/{useLintConfigViewMode-CZc7NC96.js → useLintConfigViewMode-BvPSErDD.js} +0 -0
  507. /package/dist/public/assets/{workspace-paths-BKo6L6w1.js → workspace-paths-CD0W1etA.js} +0 -0
@@ -1,2 +1,2 @@
1
- import{zs as e}from"./src-tR2kRwXj.mjs";import{xr as t,yr as n}from"./src-BHDHmhMl.mjs";import{dirname as r,isAbsolute as i,join as a,relative as o,resolve as s,sep as c}from"node:path";import{existsSync as l,lstatSync as u,readdirSync as d,rmSync as f,rmdirSync as p}from"node:fs";const m=[{hostDir:`.adal`,pruneRoot:`.adal`},{hostDir:`.aider-desk`,pruneRoot:`.aider-desk`},{hostDir:`.astrbot/data`,pruneRoot:`.astrbot`},{hostDir:`.augment`,pruneRoot:`.augment`},{hostDir:`.autohand`,pruneRoot:`.autohand`},{hostDir:`.bob`,pruneRoot:`.bob`},{hostDir:`.codeartsdoer`,pruneRoot:`.codeartsdoer`},{hostDir:`.codebuddy`,pruneRoot:`.codebuddy`},{hostDir:`.codeium/windsurf`,pruneRoot:`.codeium`},{hostDir:`.codemaker`,pruneRoot:`.codemaker`},{hostDir:`.codestudio`,pruneRoot:`.codestudio`},{hostDir:`.commandcode`,pruneRoot:`.commandcode`},{hostDir:`.config/crush`,pruneRoot:`.config/crush`},{hostDir:`.config/devin`,pruneRoot:`.config/devin`},{hostDir:`.config/goose`,pruneRoot:`.config/goose`},{hostDir:`.config/kimchi/harness`,pruneRoot:`.config/kimchi`},{hostDir:`.continue`,pruneRoot:`.continue`},{hostDir:`.factory`,pruneRoot:`.factory`},{hostDir:`.forge`,pruneRoot:`.forge`},{hostDir:`.grok`,pruneRoot:`.grok`},{hostDir:`.iflow`,pruneRoot:`.iflow`},{hostDir:`.inferencesh`,pruneRoot:`.inferencesh`},{hostDir:`.jazz`,pruneRoot:`.jazz`},{hostDir:`.junie`,pruneRoot:`.junie`},{hostDir:`.kilocode`,pruneRoot:`.kilocode`},{hostDir:`.kiro`,pruneRoot:`.kiro`},{hostDir:`.kode`,pruneRoot:`.kode`},{hostDir:`.lingma`,pruneRoot:`.lingma`},{hostDir:`.mcpjam`,pruneRoot:`.mcpjam`},{hostDir:`.moxby`,pruneRoot:`.moxby`},{hostDir:`.mux`,pruneRoot:`.mux`},{hostDir:`.neovate`,pruneRoot:`.neovate`},{hostDir:`.ona`,pruneRoot:`.ona`},{hostDir:`.openhands`,pruneRoot:`.openhands`},{hostDir:`.pochi`,pruneRoot:`.pochi`},{hostDir:`.qoder`,pruneRoot:`.qoder`},{hostDir:`.qoder-cn`,pruneRoot:`.qoder-cn`},{hostDir:`.qwen`,pruneRoot:`.qwen`},{hostDir:`.reasonix`,pruneRoot:`.reasonix`},{hostDir:`.roo`,pruneRoot:`.roo`},{hostDir:`.rovodev`,pruneRoot:`.rovodev`},{hostDir:`.snowflake/cortex`,pruneRoot:`.snowflake`},{hostDir:`.tabnine/agent`,pruneRoot:`.tabnine`},{hostDir:`.terramind`,pruneRoot:`.terramind`},{hostDir:`.tinycloud`,pruneRoot:`.tinycloud`},{hostDir:`.trae`,pruneRoot:`.trae`},{hostDir:`.trae-cn`,pruneRoot:`.trae-cn`},{hostDir:`.vibe`,pruneRoot:`.vibe`},{hostDir:`.zcode`,pruneRoot:`.zcode`},{hostDir:`.zencoder`,pruneRoot:`.zencoder`}],h=[...t.map(e=>n[e]),`open-knowledge`];function g(e){if(!i(e))throw Error(`skill cleanup requires an absolute home directory; got ${JSON.stringify(e)}`);let t=s(e);if(t===c||r(t)===t)throw Error(`skill cleanup refuses to operate on the filesystem root (${t})`);return t}function _(e,t){let n=o(e,t);if(n.startsWith(`..`)||i(n))return!1;let r=e;for(let e of n.split(c)){r=a(r,e);try{if(!u(r).isDirectory())return!1}catch{return!1}}return!0}function v(e,t){try{return d(e).every(n=>t.has(a(e,n)))}catch{return!1}}function y(e){let t=g(e),n=[],i=[],o=new Set;for(let e of m){let s=a(t,e.hostDir,`skills`);if(!_(t,s))continue;let u=h.map(e=>a(s,e)).filter(e=>l(e));n.push(...u);for(let e of u)o.add(e);let d=a(t,e.pruneRoot),f=s;for(;v(f,o)&&(i.push(f),o.add(f),f!==d);){let e=r(f);if(e===f||e===t||!e.startsWith(t+c))break;f=e}}return{skillDirs:n,emptyDirs:i}}function b(e){try{if(!u(e).isDirectory())return!1;let t=d(e);return t.length===0||t.includes(`SKILL.md`)}catch{return!1}}function x(e){let t=new Set,n=new Set;for(let i of m){let o=a(e,i.hostDir,`skills`);for(let e of h)t.add(a(o,e));let s=a(e,i.pruneRoot),l=o;for(;n.add(l),l!==s;){let t=r(l);if(t===l||t===e||!t.startsWith(e+c))break;l=t}}return{skillDirs:t,emptyDirs:n}}function S(e,t){let n=g(e),r=x(n),i=[...t.skillDirs.filter(e=>!r.skillDirs.has(e)),...t.emptyDirs.filter(e=>!r.emptyDirs.has(e))];if(i.length>0)throw Error(`refusing skill cleanup — ${i.length} path(s) outside the known legacy set: ${i.join(`, `)}`);let a=[];for(let e of t.skillDirs)if(_(n,e)&&b(e))try{f(e,{recursive:!0,force:!0}),a.push(e)}catch{}for(let e of t.emptyDirs)if(_(n,e))try{p(e),a.push(e)}catch{}return a}function C(r){let i=g(r),o=[];for(let r of t){let t=n[r];o.push({path:a(i,`.agents`,`skills`,t),bundleId:r,scope:`central`});for(let n of e)o.push({path:a(i,n.skillsRoot,t),bundleId:r,scope:`host`,hostDir:n.hostDir})}return o}function w(e,t){let n=[];for(let r of C(e))if(r.bundleId===t)try{f(r.path,{recursive:!0,force:!0})}catch(e){n.push(e instanceof Error?e:Error(String(e)))}if(n.length>0)throw AggregateError(n,`Failed to remove ${n.length} path(s) for ${t}`)}export{C as i,y as n,w as r,S as t};
2
- //# sourceMappingURL=skill-teardown-CbmpKJso.mjs.map
1
+ import{zs as e}from"./src-tR2kRwXj.mjs";import{xr as t,yr as n}from"./src-32lVY8sD.mjs";import{dirname as r,isAbsolute as i,join as a,relative as o,resolve as s,sep as c}from"node:path";import{existsSync as l,lstatSync as u,readdirSync as d,rmSync as f,rmdirSync as p}from"node:fs";const m=[{hostDir:`.adal`,pruneRoot:`.adal`},{hostDir:`.aider-desk`,pruneRoot:`.aider-desk`},{hostDir:`.astrbot/data`,pruneRoot:`.astrbot`},{hostDir:`.augment`,pruneRoot:`.augment`},{hostDir:`.autohand`,pruneRoot:`.autohand`},{hostDir:`.bob`,pruneRoot:`.bob`},{hostDir:`.codeartsdoer`,pruneRoot:`.codeartsdoer`},{hostDir:`.codebuddy`,pruneRoot:`.codebuddy`},{hostDir:`.codeium/windsurf`,pruneRoot:`.codeium`},{hostDir:`.codemaker`,pruneRoot:`.codemaker`},{hostDir:`.codestudio`,pruneRoot:`.codestudio`},{hostDir:`.commandcode`,pruneRoot:`.commandcode`},{hostDir:`.config/crush`,pruneRoot:`.config/crush`},{hostDir:`.config/devin`,pruneRoot:`.config/devin`},{hostDir:`.config/goose`,pruneRoot:`.config/goose`},{hostDir:`.config/kimchi/harness`,pruneRoot:`.config/kimchi`},{hostDir:`.continue`,pruneRoot:`.continue`},{hostDir:`.factory`,pruneRoot:`.factory`},{hostDir:`.forge`,pruneRoot:`.forge`},{hostDir:`.grok`,pruneRoot:`.grok`},{hostDir:`.iflow`,pruneRoot:`.iflow`},{hostDir:`.inferencesh`,pruneRoot:`.inferencesh`},{hostDir:`.jazz`,pruneRoot:`.jazz`},{hostDir:`.junie`,pruneRoot:`.junie`},{hostDir:`.kilocode`,pruneRoot:`.kilocode`},{hostDir:`.kiro`,pruneRoot:`.kiro`},{hostDir:`.kode`,pruneRoot:`.kode`},{hostDir:`.lingma`,pruneRoot:`.lingma`},{hostDir:`.mcpjam`,pruneRoot:`.mcpjam`},{hostDir:`.moxby`,pruneRoot:`.moxby`},{hostDir:`.mux`,pruneRoot:`.mux`},{hostDir:`.neovate`,pruneRoot:`.neovate`},{hostDir:`.ona`,pruneRoot:`.ona`},{hostDir:`.openhands`,pruneRoot:`.openhands`},{hostDir:`.pochi`,pruneRoot:`.pochi`},{hostDir:`.qoder`,pruneRoot:`.qoder`},{hostDir:`.qoder-cn`,pruneRoot:`.qoder-cn`},{hostDir:`.qwen`,pruneRoot:`.qwen`},{hostDir:`.reasonix`,pruneRoot:`.reasonix`},{hostDir:`.roo`,pruneRoot:`.roo`},{hostDir:`.rovodev`,pruneRoot:`.rovodev`},{hostDir:`.snowflake/cortex`,pruneRoot:`.snowflake`},{hostDir:`.tabnine/agent`,pruneRoot:`.tabnine`},{hostDir:`.terramind`,pruneRoot:`.terramind`},{hostDir:`.tinycloud`,pruneRoot:`.tinycloud`},{hostDir:`.trae`,pruneRoot:`.trae`},{hostDir:`.trae-cn`,pruneRoot:`.trae-cn`},{hostDir:`.vibe`,pruneRoot:`.vibe`},{hostDir:`.zcode`,pruneRoot:`.zcode`},{hostDir:`.zencoder`,pruneRoot:`.zencoder`}],h=[...t.map(e=>n[e]),`open-knowledge`];function g(e){if(!i(e))throw Error(`skill cleanup requires an absolute home directory; got ${JSON.stringify(e)}`);let t=s(e);if(t===c||r(t)===t)throw Error(`skill cleanup refuses to operate on the filesystem root (${t})`);return t}function _(e,t){let n=o(e,t);if(n.startsWith(`..`)||i(n))return!1;let r=e;for(let e of n.split(c)){r=a(r,e);try{if(!u(r).isDirectory())return!1}catch{return!1}}return!0}function v(e,t){try{return d(e).every(n=>t.has(a(e,n)))}catch{return!1}}function y(e){let t=g(e),n=[],i=[],o=new Set;for(let e of m){let s=a(t,e.hostDir,`skills`);if(!_(t,s))continue;let u=h.map(e=>a(s,e)).filter(e=>l(e));n.push(...u);for(let e of u)o.add(e);let d=a(t,e.pruneRoot),f=s;for(;v(f,o)&&(i.push(f),o.add(f),f!==d);){let e=r(f);if(e===f||e===t||!e.startsWith(t+c))break;f=e}}return{skillDirs:n,emptyDirs:i}}function b(e){try{if(!u(e).isDirectory())return!1;let t=d(e);return t.length===0||t.includes(`SKILL.md`)}catch{return!1}}function x(e){let t=new Set,n=new Set;for(let i of m){let o=a(e,i.hostDir,`skills`);for(let e of h)t.add(a(o,e));let s=a(e,i.pruneRoot),l=o;for(;n.add(l),l!==s;){let t=r(l);if(t===l||t===e||!t.startsWith(e+c))break;l=t}}return{skillDirs:t,emptyDirs:n}}function S(e,t){let n=g(e),r=x(n),i=[...t.skillDirs.filter(e=>!r.skillDirs.has(e)),...t.emptyDirs.filter(e=>!r.emptyDirs.has(e))];if(i.length>0)throw Error(`refusing skill cleanup — ${i.length} path(s) outside the known legacy set: ${i.join(`, `)}`);let a=[];for(let e of t.skillDirs)if(_(n,e)&&b(e))try{f(e,{recursive:!0,force:!0}),a.push(e)}catch{}for(let e of t.emptyDirs)if(_(n,e))try{p(e),a.push(e)}catch{}return a}function C(r){let i=g(r),o=[];for(let r of t){let t=n[r];o.push({path:a(i,`.agents`,`skills`,t),bundleId:r,scope:`central`});for(let n of e)o.push({path:a(i,n.skillsRoot,t),bundleId:r,scope:`host`,hostDir:n.hostDir})}return o}function w(e,t){let n=[];for(let r of C(e))if(r.bundleId===t)try{f(r.path,{recursive:!0,force:!0})}catch(e){n.push(e instanceof Error?e:Error(String(e)))}if(n.length>0)throw AggregateError(n,`Failed to remove ${n.length} path(s) for ${t}`)}export{C as i,y as n,w as r,S as t};
2
+ //# sourceMappingURL=skill-teardown-Dp8qru7m.mjs.map
@@ -26,7 +26,7 @@ import{i as e,o as t,t as n}from"./chunk-DTipWd-i.mjs";import{$t as r,A as i,At
26
26
  `)}\n`;this.enqueue(e,async()=>{if(!this.appendBroken.has(e))try{await ic(this.eventsPath(e),n)}catch(t){this.appendBroken.add(e),this.log.error({err:t,threadId:e},`[acp-persist] event append failed; thread continues memory-only`)}})}queueMetaWrite(e,t){this.pinHome(e);let n=`${JSON.stringify(t,null,1)}\n`;this.enqueue(e,async()=>{let t=this.metaPath(e),r=`${t}.tmp`;try{await Hs(r,n),await sc(r,t)}catch(t){this.log.warn({err:t,threadId:e},`[acp-persist] meta write failed`);try{await qs(r,{force:!0})}catch{}}})}whenIdle(e){return this.writeQueues.get(e)??Promise.resolve()}async scan(){let e=[],t=new Set,n=this.cwd===null?null:await xD(this.cwd);return await this.scanDir(this.primaryThreadsDir,n,e,t),this.legacyThreadsDir!==null&&this.legacyThreadsDir!==this.primaryThreadsDir&&await this.scanDir(this.legacyThreadsDir,null,e,t),e}async scanDir(e,t,n,r){let i;try{i=await md(e)}catch(t){t.code!==`ENOENT`&&this.log.warn({err:t,dir:e},`[acp-persist] could not read a threads dir`);return}for(let a of i){if(!a.endsWith(`.meta.json`))continue;let i=F(e,a),o;try{o=JSON.parse(await pd(i,`utf8`))}catch(e){this.log.warn({err:e,path:i},`[acp-persist] skipping unreadable thread meta`);continue}if(o.version!==1||typeof o.info!=`object`||o.info===null||typeof o.info.threadId!=`string`||typeof o.cwd!=`string`||typeof o.agentRef!=`object`||o.agentRef===null){this.log.warn({path:i},`[acp-persist] skipping unreadable thread meta`);continue}let s=o,c=s.info.threadId;r.has(c)||t!==null&&await xD(s.cwd)!==t||(r.add(c),this.homeByThread.has(c)||this.homeByThread.set(c,e),n.push(s))}}async resolveEventLog(e){let t=this.eventsPath(e);if(!z(t))return{count:0,midTurn:!1};let n=0,r=!1;return await this.forEachCompleteLine(t,e=>(n+=1,e.startsWith(`{"kind":"turn_started"`)?r=!0:e.startsWith(`{"kind":"turn_ended"`)&&(r=!1),!0)),{count:n,midTurn:r}}async readEvents(e,t,n,r){let i=this.eventsPath(e);if(t>=n||!z(i))return;let a=0,o=[],s=t,c=()=>{o.length!==0&&(r(s,o),s+=o.length,o=[])};await this.forEachCompleteLine(i,e=>a>=n?!1:(a>=t&&(o.push(bD(e)),o.length>=512&&c()),a+=1,!0)),c()}async delete(e){this.appendBroken.delete(e),this.writeQueues.delete(e);let t=[this.eventsPath(e),this.metaPath(e)],n=await Promise.allSettled(t.map(e=>qs(e,{force:!0})));this.homeByThread.delete(e);for(let[r,i]of n.entries())i.status===`rejected`&&this.log.warn({err:i.reason,threadId:e,path:t[r]},`[acp-persist] thread file removal failed`)}async forEachCompleteLine(e,t){let n=Uu(e,{encoding:`utf8`}),r=null;n.on(`error`,e=>{r=e});let i=Ote({input:n,crlfDelay:1/0}),a=!1,o=null,s=!1;try{for await(let e of i){if(o!==null&&!t(o)){s=!0;break}o=e}s||(a=await yD(e),o!==null&&a&&t(o))}finally{i.close(),n.destroy()}if(r!==null)throw r}};async function yD(e){let{open:t}=await import(`node:fs/promises`),n=await t(e,`r`);try{let{size:e}=await n.stat();if(e===0)return!1;let t=Buffer.alloc(1);return await n.read(t,0,1,e-1),t[0]===10}finally{await n.close()}}function bD(e){try{return JSON.parse(e)}catch{return{kind:`agent_stderr`,line:`[unreadable log entry]`,ts:0}}}async function xD(e){try{return await hd(e)}catch{return L(e)}}const SD=RegExp(`^(?:${`do you mind.i would like you to.i'd like you to.i want you to.i need you to.i would like to.i'd like to.i want to.i need to.we need to.we want to.we should.go ahead and.take a look at.have a look at.look into.look at.help me with.help me to.help me.can you.could you.would you.will you.can we.could we.should we.let's.lets.try to.please.kindly.hello.alright.actually.anyway.also.okay.hey.hi.yo.ok.so.pls.plz.just.maybe`.split(`.`).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})\\b(?:[\\s,:;!.\\-–—]+|$)`,`i`),CD=/^(?:[#>]+\s*|[-*]\s+|\d+[.)]\s+)+/;function wD(e){return(e.trim().split(`
27
27
  `)[0]??``).trim()}function TD(e){let t=wD(e);if(t.length<=48)return t;let n=t.slice(0,47),r=n.lastIndexOf(` `);return`${(r>=48/2?n.slice(0,r):n).trimEnd()}…`}function ED(e){let t=wD(e),n=t.replace(CD,``);for(let e=0;e<6;e++){let e=n.replace(SD,``);if(e===n)break;n=e}n=n.trim();let r=n.split(/\s+/).filter(e=>e!==``).length;return!(n!==``&&(r>=2||n.length>=12))||n===t?TD(t):TD(n.charAt(0).toUpperCase()+n.slice(1))}const DD=8,OD=5e3,kD=300*1e3,AD=45e3,jD=5e3,MD=2e3;var ND=class extends Error{code;constructor(e,t){super(t),this.name=`ThreadOpError`,this.code=e}},PD=class extends Error{constructor(){super(`authenticate timed out`),this.name=`AuthenticateTimeoutError`}},FD=class extends Error{constructor(){super(`prompt build cancelled before dispatch`),this.name=`PromptCancelledBeforeDispatchError`}};function ID(){return new ND(`not-ready`,`the thread was restarted during the sign-in`)}function LD(e){return e.source===`registry`&&pf[e.id]===`pi`}function RD(e,t,n){let[r=`open-knowledge`,...i]=e&&e.length>0?e:[`open-knowledge`],a=[...i,`mcp`,`--port`,String(t)];if(r.includes(`/`)||r.includes(`\\`))return{command:r,args:a};let o=(n?.resolveCommand??(e=>Yw(e,nE())))(r);return o===null?(n?.log?.warn({command:r},`[acp-threads] OK MCP stdio command did not resolve on PATH — injecting the bare name, which fails for harnesses that spawn MCP children under a minimal PATH`),{command:r,args:a}):{command:o,args:a}}var zD=class{opts;threads=new Map;reapTimer;maxThreads;idleReapMs;steerStallMs;authenticateTimeoutMs;unwatchedTurnCancelMs;unwatchedTurnKillMs;persistence;resolveLoginShellPath;healthyInterpreters=new Set;destroyed=!1;initialized=!1;constructor(e){this.opts=e,this.resolveLoginShellPath=e.resolveLoginShellPath??(()=>KT(e.log)()),this.maxThreads=e.maxThreads??8,this.idleReapMs=e.idleReapMs??36e5,this.steerStallMs=e.steerStallMs??1e4,this.authenticateTimeoutMs=e.authenticateTimeoutMs??3e5,this.unwatchedTurnCancelMs=e.unwatchedTurnCancelMs??6e5,this.unwatchedTurnKillMs=e.unwatchedTurnKillMs??12e5,this.persistence=new vD({primaryDir:e.globalDir??e.localDir,legacyDir:e.globalDir===null?null:e.localDir,cwd:e.globalDir===null?null:e.contentDir,log:e.log}),this.reapTimer=setInterval(()=>this.reapIdleThreads(),3e5),this.reapTimer.unref?.()}async init(){if(this.initialized)return;this.initialized=!0,this.resolveLoginShellPath().catch(()=>{}),await this.persistence.init();let e=await this.persistence.scan();for(let t of e){let e=t.info.threadId;this.threads.has(e)||this.threads.set(e,VD(t))}e.length>0&&this.opts.log.info({count:e.length},`[acp-threads] rehydrated archived threads`)}listThreads(){return[...this.threads.values()].map(e=>({...e.info}))}liveThreadCount(){let e=0;for(let t of this.threads.values())t.info.archived!==!0&&(e+=1);return e}getInfo(e){let t=this.threads.get(e);return t===void 0?void 0:{...t.info}}async subscribe(e,t,n){let r=this.mustGet(e);await this.ensureLogResolved(r);let i=Math.max(t,0),a=i;for(;a<r.baseSeq;){let t=r.baseSeq;await this.persistence.whenIdle(e),await this.persistence.readEvents(e,a,t,(t,r)=>{n({op:`events`,threadId:e,fromSeq:t,events:r})}),a=t}this.flushBroadcast(r);let o=Math.max(i,r.baseSeq),s=r.baseSeq+r.events.length;for(let t=o;t<s;t+=512){let i=Math.min(t+512,s);n({op:`events`,threadId:e,fromSeq:t,events:r.events.slice(t-r.baseSeq,i-r.baseSeq)})}return r.subscribers.add(n),r.unwatchedSince=null,r.unwatchedCancelSent=!1,{...r.info}}ensureLogResolved(e){return e.logResolved?Promise.resolve():(e.logResolution??=(async()=>{let t=await this.persistence.resolveEventLog(e.info.threadId);e.baseSeq=t.count,e.midTurnOnDisk=t.midTurn,e.info.lastSeq=t.count-1,e.logResolved=!0})(),e.logResolution)}unsubscribe(e,t){let n=this.threads.get(e);n!==void 0&&(n.subscribers.delete(t),n.subscribers.size===0&&n.unwatchedSince===null&&(n.unwatchedSince=Date.now()))}async createThread(e){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);let{info:t,custom:n}=await this.resolveAgentInfo(e.agent);if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);let r=crypto.randomUUID(),i=Date.now(),a={info:{threadId:r,agent:t,title:t.name,status:`installing`,createdAt:i,lastActivityAt:i,promptCapabilities:null,modes:null,configOptions:null,availableCommands:null,lastSeq:-1,archived:!1},docName:e.docName,agentRef:{source:e.agent.source,id:e.agent.id},launchSettings:e.settings,cwd:this.opts.contentDir,child:null,conn:null,lastInit:null,sessionId:null,agentSessionId:`acp-${r}`,events:[],baseSeq:0,logResolved:!0,logResolution:null,midTurnOnDisk:!1,resumeInFlight:!1,authInFlight:!1,suppressUpdates:!1,lastSuppressedAt:0,subscribers:new Set,pendingPermissions:new Map,pendingRuntimeConsent:new Map,pendingPiBridgeConsent:new Map,piBridgeDeclined:!1,lastPiBridgeStatus:null,stderrTail:[],authStderr:null,terminals:null,turnActive:!1,cancelRequested:!1,steerStallTimer:null,unwatchedSince:i,unwatchedCancelSent:!1,pendingBroadcast:[],pendingBroadcastFromSeq:0,flushTimer:null,closed:!1,hadUserMessage:!1,titleHint:e.titleHint,envNotePending:!1};return this.threads.set(r,a),this.emitStatus(a,`installing`),this.startThread(a,e,n).catch(e=>{this.opts.log.error({err:e,threadId:r},`[acp-threads] thread start failed`),this.emitStatus(a,`error`,e instanceof Error?e.message:String(e))}),{...a.info}}async resolveAgentInfo(e){if(e.source===`custom`){let t=(await Sf(this.opts.localDir,this.opts.log)).find(t=>t.id===e.id);if(t===void 0)throw new ND(`unknown-agent`,`no custom agent '${e.id}'`);return{info:{id:t.id,name:t.name,source:`custom`},custom:t}}let t;try{t=await this.opts.registry.getAgent(e.id)}catch(e){throw new ND(`install-failed`,`agent registry unavailable: ${e instanceof Error?e.message:String(e)}`)}if(t===void 0)throw new ND(`unknown-agent`,`agent '${e.id}' is not in the registry`);return{info:{id:t.id,name:t.name,iconUrl:t.icon,source:`registry`,version:t.version},custom:null}}async connectAgent(e,t){let n;if(t!==null)n=oE(t);else{let t=await this.opts.registry.getAgent(e.agentRef.id);if(t===void 0)throw new ND(`unknown-agent`,`agent vanished`);n=await aE(t,gf(),this.opts.log)}if(e.closed)return null;let r=await this.ensureLaunchable(e,n);if(r===null||(n=r,e.closed))return null;let i=await this.resolveLoginShellPath().catch(()=>null);if(e.closed)return null;let a=new gD({defaultCwd:e.cwd,emit:t=>this.appendEvent(e,t),log:this.opts.log,loginShellPath:i});this.emitStatus(e,`spawning`);let o=RE(n,e.cwd);if(e.child=o,e.terminals=a,o.stderr?.setEncoding(`utf8`),o.stderr?.on(`data`,t=>{for(let n of t.split(`
28
28
  `))n.trim()!==``&&(e.stderrTail.push(n.slice(0,500)),e.stderrTail.length>40&&e.stderrTail.shift(),e.authStderr!==null&&(e.authStderr.push(n.slice(0,500)),e.authStderr.length>6&&e.authStderr.shift(),e.info.signInOutput=[...e.authStderr],this.broadcastInfo(e)))}),o.on(`error`,t=>{this.emitStatus(e,`error`,`agent failed to start: ${t.message}`,{reason:`connect`,agentMessage:t.message})}),o.on(`exit`,(t,n)=>{if(e.child=null,a.disposeAll().catch(t=>{this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] terminal cleanup on agent exit failed`)}),e.closed||e.info.archived===!0)return;if(e.info.status===`error`){this.failPendingPermissions(e);return}let r=e.stderrTail.slice(-10).join(`
29
- `);this.opts.log.warn({threadId:e.info.threadId,agentId:e.info.agent.id,code:t,signal:n,machineDetail:JD(e)},`[acp-threads] agent exited unexpectedly`),this.emitStatus(e,`exited`,`agent exited (${n??t??`unknown`})${r?`\n${r}`:``}`),this.failPendingPermissions(e)}),o.stdin===null||o.stdout===null)throw new ND(`spawn-failed`,`agent process has no stdio`);let s=lie(bte.toWeb(o.stdin),_d.toWeb(o.stdout)),c=jie({name:`open-knowledge`}).onRequest(eh.client.session.requestPermission,t=>this.handlePermissionRequest(e,t.params.toolCall,t.params.options)).onRequest(eh.client.fs.readTextFile,e=>this.handleFsRead(e.params.path,e.params.line??null,e.params.limit??null)).onRequest(eh.client.fs.writeTextFile,async t=>(await this.handleFsWrite(e,t.params.path,t.params.content),{})).onRequest(eh.client.terminal.create,t=>(e.info.lastActivityAt=Date.now(),a.create(t.params))).onRequest(eh.client.terminal.output,e=>a.output(e.params.terminalId)).onRequest(eh.client.terminal.waitForExit,e=>a.waitForExit(e.params.terminalId)).onRequest(eh.client.terminal.kill,async e=>(await a.kill(e.params.terminalId),{})).onRequest(eh.client.terminal.release,async e=>(await a.release(e.params.terminalId),{})).onNotification(eh.client.session.update,t=>this.handleSessionUpdate(e,t.params)).connect(s);e.conn=c,c.closed.then(()=>{!e.closed&&e.info.archived!==!0&&e.info.status!==`exited`&&e.info.status!==`error`&&this.emitStatus(e,`exited`,`agent connection closed`)},t=>{this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] agent connection closed with error`),!e.closed&&e.info.archived!==!0&&e.info.status!==`exited`&&e.info.status!==`error`&&this.emitStatus(e,`error`,`agent connection failed: ${t instanceof Error?t.message:String(t)}`)});let l;try{l=await c.agent.request(eh.agent.initialize,{protocolVersion:1,clientInfo:{name:`open-knowledge`,title:`Open Knowledge`,version:Pc},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,session:{configOptions:{boolean:{}}}}})}catch(t){throw this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] initialize failed`),new ND(`spawn-failed`,`initialize failed: ${GD(t)}`)}return e.closed?null:(e.lastInit=l,e.info.promptCapabilities=l.agentCapabilities?.promptCapabilities??{},this.emitInfo(e),{conn:c,init:l,launch:n})}async ensureLaunchable(e,t){let n;try{await yE(t),n=await this.withLoginShellPathIfEligible(t)}catch(r){if(!(r instanceof QT)||r.code!==`command-not-found`)throw r;let i=await this.retryWithLoginShellPath(t);if(i===null)return this.fallbackToManagedRuntime(e,t,r);n=i}return e.closed?null:this.ensureInterpreterRuns(e,n)}async ensureInterpreterRuns(e,t){if(t.kind!==`npx`&&t.kind!==`uvx`)return t;let n=await this.probeInterpreterOnce(t);if(e.closed)return null;if(n===null)return t;if(n.kind===`incompatible`){let n=await this.withPreferredLoginShellPathIfEligible(t);if(e.closed)return null;if(AE(n.env)!==AE(t.env))try{await yE(n);let t=await this.probeInterpreterOnce(n);if(e.closed)return null;if(t===null)return this.opts.log.info({threadId:e.info.threadId,agentId:e.info.agent.id},`[acp-threads] compatible Node resolved via the preferred login-shell PATH`),n;this.opts.log.debug({threadId:e.info.threadId,agentId:e.info.agent.id,cmd:n.cmd,kind:n.kind,failureKind:t.kind,detail:t.detail},`[acp-threads] preferred login-shell PATH did not provide a compatible Node`)}catch(e){if(!(e instanceof QT)||e.code!==`command-not-found`)throw e}}this.opts.log.warn({threadId:e.info.threadId,agentId:e.info.agent.id,cmd:t.cmd,kind:t.kind,failureKind:n.kind,detail:n.detail},`[acp-threads] interpreter cannot run this agent — offering the managed runtime`);let r=new QT(`command-not-found`,n.kind===`incompatible`?kE(t,n.detail):xE(t,n.detail));return this.fallbackToManagedRuntime(e,t,r,r)}async fallbackToManagedRuntime(e,t,n,r){if(t.kind!==`npx`&&t.kind!==`uvx`)throw n;let i=JE(t.kind);if(!rD(i))throw n;let a=await this.provideManagedRuntime(e,i,r===void 0?`missing`:`broken`).catch(e=>{throw r!==void 0&&e instanceof QT&&e.code===`command-not-found`?r:e});if(a===null)return null;let o=sE(t,a);await yE(o);let s=await this.probeInterpreterOnce(o);if(s===null)return o;if(s.kind===`incompatible`)throw new QT(`install-failed`,CE(s.detail));return this.repairManagedRuntime(e,t,i,s.detail)}async repairManagedRuntime(e,t,n,r){let i={threadId:e.info.threadId,agentId:e.info.agent.id,runtime:n,detail:r};if(this.opts.log.warn(i,`[acp-threads] OK's own managed runtime failed to run — replacing it`),!await uD(n,this.opts.log,this.opts.runtimeInstall?.root))throw new QT(`install-failed`,wE(t,r));let a=await this.provideManagedRuntime(e,n,`damaged`).catch(e=>{throw e instanceof QT&&e.code===`command-not-found`?new QT(`command-not-found`,TE(t)):e});if(a===null)return null;let o=sE(t,a);await yE(o);let s=await this.probeInterpreterOnce(o);if(s===null)return o;throw this.opts.log.error({...i,detail:s.detail},`[acp-threads] a freshly downloaded managed runtime failed to run`),new QT(`install-failed`,s.kind===`incompatible`?CE(s.detail):SE(o,s.detail))}async probeInterpreterOnce(e){let t=JSON.stringify([e.cmd,AE(e.env)??``]);if(this.healthyInterpreters.has(t))return null;let n=await DE(e,void 0,this.opts.log);if(n!==null)return{kind:`unhealthy`,detail:n};if(e.kind===`npx`){let t=await OE(e,void 0,this.opts.log);if(t!==null)return{kind:`incompatible`,detail:t}}return this.healthyInterpreters.add(t),null}async retryWithLoginShellPath(e){let t=await this.withLoginShellPathIfEligible(e);if(AE(t.env)===AE(e.env))return null;try{await yE(t)}catch(t){if(!(t instanceof QT))throw t;return this.opts.log.debug({cmd:e.cmd,kind:e.kind},`[acp] login-shell PATH did not resolve the command either`),null}return this.opts.log.info({cmd:e.cmd,kind:e.kind},`[acp] command resolved via the login-shell PATH; skipping the managed-runtime offer`),t}async withLoginShellPathIfEligible(e){if(e.pathFromOverlay||jE(e.cmd))return e;let t=await this.resolveLoginShellPath().catch(()=>null);return t===null?e:cE(e,t)}async withPreferredLoginShellPathIfEligible(e){if(e.pathFromOverlay||jE(e.cmd))return e;let t=await this.resolveLoginShellPath().catch(()=>null);return t===null?e:lE(e,t)}async provideManagedRuntime(e,t,n){let r=this.opts.runtimeInstall?.root;await lD(t,this.opts.log,r);let i=await sD(t,r).catch(()=>null);if(i!==null)return i;let a=await this.requestRuntimeConsent(e,t,n);if(a===`closed`||e.closed)return null;if(a!==`granted`)throw new QT(`command-not-found`,UD(t));try{let n=await this.downloadRuntime(e,t);return e.closed?null:n}catch(e){let n=YE(t).displayName;throw new QT(`install-failed`,`couldn't install ${n}: ${e instanceof Error?e.message:String(e)}`)}}requestRuntimeConsent(e,t,n){let r=crypto.randomUUID(),i=YE(t);return this.appendEvent(e,{kind:`runtime_consent_request`,requestId:r,runtime:t,displayName:i.displayName,provides:i.provides,version:i.version,approxSizeMB:i.approxSizeMB,sourceHost:i.sourceHost,agentName:e.info.agent.name,reason:n,ts:Date.now()}),new Promise(t=>{let n=setTimeout(()=>{e.pendingRuntimeConsent.delete(r),this.appendEvent(e,{kind:`runtime_consent_resolved`,requestId:r,decision:`timeout`,ts:Date.now()}),t(`timeout`)},kD);n.unref?.(),e.pendingRuntimeConsent.set(r,{resolve:t,timer:n})})}respondRuntimeConsent(e,t,n){let r=this.mustGet(e),i=r.pendingRuntimeConsent.get(t);if(i===void 0)return;r.pendingRuntimeConsent.delete(t),clearTimeout(i.timer);let a=n.kind===`granted`?`granted`:`declined`;this.appendEvent(r,{kind:`runtime_consent_resolved`,requestId:t,decision:a,ts:Date.now()}),i.resolve(a)}async downloadRuntime(e,t){this.emitStatus(e,`installing`);let n=0;return dD(t,this.opts.log,{root:this.opts.runtimeInstall?.root,fetchImpl:this.opts.runtimeInstall?.fetchImpl,onProgress:r=>{let i=Date.now();i-n<400||(n=i,!e.closed&&this.appendEvent(e,{kind:`runtime_install_progress`,runtime:t,phase:`downloading`,receivedBytes:r.receivedBytes,totalBytes:r.totalBytes??void 0,ts:i}))}})}async buildMcpServers(e,t,n=kD){let r=[],i;if(LD(e.agentRef))i=await this.settlePiBridge(e,n)===`unavailable`?`none`:`unknown`;else if(await this.harnessAlreadyHasOkMcp(e)!==null)i=`unknown`;else{let e=this.opts.getServerUrl?.();if(e!==void 0&&t.agentCapabilities?.mcpCapabilities?.http===!0)r.push({type:`http`,name:`open-knowledge`,url:`${e}/mcp`,headers:[{name:lT,value:`1`}]}),i=`http-header`;else{let e=this.opts.getMcpStdioCommand?.(),t=nE();e==null?i=`none`:(r.push({name:`open-knowledge`,command:e.command,args:[...e.args],env:[{name:_r,value:`1`},...t!==void 0&&t!==``?[{name:`PATH`,value:t}]:[]]}),i=`stdio-entry-env`)}}return i===`none`?this.opts.log.warn({threadId:e.info.threadId,agentId:e.agentRef.id},`[acp-threads] no OK MCP transport available for this agent — it starts without OK tools`):this.opts.log.info({threadId:e.info.threadId,agentId:e.agentRef.id,hostedMarker:i},`[acp-threads] OK MCP injection outcome`),{servers:r,hostedMarker:i}}async harnessAlreadyHasOkMcp(e){let t=this.opts.probeHarnessManagedMcpEntry;if(t===void 0||e.agentRef.source!==`registry`)return null;let n=pf[e.agentRef.id];if(n===void 0)return null;let r;try{r=await t(n,e.cwd)}catch(t){return this.opts.log.warn({err:t,threadId:e.info.threadId,editorId:n},`[acp-threads] harness MCP-config probe failed — injecting OK MCP`),null}return r!==null&&this.opts.log.info({threadId:e.info.threadId,agentId:e.agentRef.id,editorId:r.editorId,scope:r.scope,configPath:r.configPath},`[acp-threads] skipping OK MCP injection — the agent's harness already loads OK's managed entry`),r}async settlePiBridge(e,t){let n=this.opts.probePiAcpBridge,r=e.info.threadId;if(n===void 0)return this.opts.log.debug({threadId:r,agentId:e.agentRef.id},`[acp-threads] no Pi bridge probe wired — OK tools depend on whether the project was already wired`),`unknown`;let i;try{i=await n(e.cwd)}catch(e){return this.opts.log.warn({err:e,threadId:r},`[acp-threads] Pi bridge probe failed`),`unknown`}if(e.closed)return`unknown`;if(i.bridgeLoadable)return this.opts.log.info({threadId:r,bridge:i.bridge,bridgePath:i.bridgePath},`[acp-threads] Pi already loads the OK bridge extension for this project`),`loadable`;if(i.bridge===`foreign`||i.bridge===`unreadable`)return this.opts.log.warn({threadId:r,bridge:i.bridge,bridgePath:i.bridgePath},`[acp-threads] OK can't claim the Pi bridge path — leaving it alone; this thread has no OK tools`),this.emitPiBridgeStatus(e,{kind:`pi_bridge_status`,state:i.bridge===`foreign`?`foreign-file`:`unreadable-file`,bridgePath:i.bridgePath,ts:Date.now()}),`unavailable`;if(e.piBridgeDeclined)return this.opts.log.debug({threadId:r},`[acp-threads] Pi bridge prompt already declined for this thread — not re-asking`),`unavailable`;let a=this.opts.ensurePiAcpBridge;if(a===void 0)return this.opts.log.warn({threadId:r},`[acp-threads] Pi bridge is not provisioned and no provisioning seam is wired — not prompting`),`unavailable`;let o=crypto.randomUUID(),s=await this.requestPiBridgeConsent(e,o,i,t);if(s===`declined`&&(e.piBridgeDeclined=!0),e.closed)return`unknown`;if(s!==`granted`)return this.opts.log.info({threadId:r,decision:s},`[acp-threads] Pi bridge not provisioned — the thread continues without OK tools`),`unavailable`;let c;try{c=await a(e.cwd)}catch(t){let n=t instanceof Error?t.message:String(t);return this.opts.log.warn({err:t,threadId:r},`[acp-threads] Pi bridge provisioning threw`),this.appendPiBridgeFailure(e,o,`bridge-failed`,i.bridgePath,{detail:n}),`unavailable`}if(c.ok)return this.opts.log.info({threadId:r,bridge:c.bridge,trust:c.trust,bridgePath:c.bridgePath},`[acp-threads] provisioned the Pi bridge extension for this project`),e.closed?`unknown`:(this.appendEvent(e,{kind:`pi_bridge_status`,requestId:o,state:`ready`,bridgePath:c.bridgePath,bridge:c.bridge,trust:c.trust,ts:Date.now()}),`loadable`);let l=c.bridge===`written`||c.bridge===`refreshed`||c.bridge===`unchanged`,u=c.bridge===`refused-foreign`?`foreign-file`:c.bridge===`refused-unreadable`?`unreadable-file`:l?`trust-failed`:`bridge-failed`;return this.opts.log.warn({threadId:r,bridge:c.bridge,trust:c.trust,bridgePath:c.bridgePath,err:c.error},`[acp-threads] Pi bridge provisioning did not complete — the thread continues without OK tools`),this.appendPiBridgeFailure(e,o,u,c.bridgePath,{bridge:c.bridge,trust:c.trust,...c.error===void 0?{}:{detail:c.error}}),`unavailable`}appendPiBridgeFailure(e,t,n,r,i){e.closed||this.appendEvent(e,{kind:`pi_bridge_status`,requestId:t,state:n,bridgePath:r,...i,ts:Date.now()})}emitPiBridgeStatus(e,t){e.lastPiBridgeStatus!==t.state&&(e.lastPiBridgeStatus=t.state,this.appendEvent(e,t))}requestPiBridgeConsent(e,t,n,r){return this.appendEvent(e,{kind:`pi_bridge_consent_request`,requestId:t,agentName:e.info.agent.name,bridgePath:n.bridgePath,cwd:e.cwd,otherExtensions:n.otherExtensions,ts:Date.now()}),new Promise(n=>{let i=setTimeout(()=>{e.pendingPiBridgeConsent.delete(t),this.appendEvent(e,{kind:`pi_bridge_consent_resolved`,requestId:t,decision:`timeout`,ts:Date.now()}),n(`timeout`)},r);i.unref?.(),e.pendingPiBridgeConsent.set(t,{resolve:n,timer:i})})}respondPiBridgeConsent(e,t,n){let r=this.mustGet(e),i=r.pendingPiBridgeConsent.get(t);if(i===void 0)return;r.pendingPiBridgeConsent.delete(t),clearTimeout(i.timer);let a=n.kind===`granted`?`granted`:`declined`;this.appendEvent(r,{kind:`pi_bridge_consent_resolved`,requestId:t,decision:a,ts:Date.now()}),i.resolve(a)}async startThread(e,t,n,r=kD){let i;try{i=await this.connectAgent(e,n)}catch(t){let n=t instanceof QT||t instanceof ND?t.message:String(t);this.emitStatus(e,`error`,n,{reason:`connect`,agentMessage:n,machineDetail:JD(e)}),await this.teardownFailedAgent(e);return}if(i===null)return;let{conn:a,init:o,launch:s}=i;await this.openSession(e,a,o,t.settings,`park`,r)===!0&&(this.opts.log.info({threadId:e.info.threadId,agentId:e.info.agent.id,launchKind:s.kind,msToReady:Date.now()-e.info.createdAt},`[acp-threads] agent ready`),(t.prompt!==void 0&&t.prompt!==``||t.attachments!==void 0&&t.attachments.length>0)&&this.sendPrompt(e.info.threadId,t.prompt??``,t.attachments))}async openSession(e,t,n,r,i=`park`,a=kD){e.info.availableCommands=null;let{servers:o}=await this.buildMcpServers(e,n,a);try{let n=await t.agent.request(eh.agent.session.new,{cwd:e.cwd,mcpServers:o});e.sessionId=n.sessionId,e.envNotePending=!0,this.persistence.queueMetaWrite(e.info.threadId,this.buildMeta(e)),n.modes!==void 0&&n.modes!==null&&(e.info.modes=n.modes,this.emitInfo(e)),n.configOptions!==void 0&&n.configOptions!==null&&(e.info.configOptions=n.configOptions,this.emitInfo(e))}catch(t){if(WD(t)){if(i===`report`)return`auth-required`;this.emitStatus(e,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,e),authMethods:ZD(n.authMethods)})}else this.emitStatus(e,`error`,`session setup failed: ${GD(t)}`,{reason:`session-setup`,agentMessage:GD(t),machineDetail:YD(KD(t),JD(e))}),await this.teardownFailedAgent(e);return!1}return e.closed||r?.config!==void 0&&(await this.applyInitialConfig(e,t,r.config),e.closed)||r?.modeId!==void 0&&(await this.applyInitialMode(e,t,r.modeId),e.closed)?!1:(this.emitStatus(e,`ready`),!0)}async resumeThread(e,t,n){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let r=this.mustGet(e);if(r.info.archived!==!0)throw new ND(`not-ready`,`thread is not archived`);if(r.resumeInFlight)throw new ND(`not-ready`,`a resume is already in progress`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);r.resumeInFlight=!0;let i=Date.now();try{await this.ensureLogResolved(r);let a=r.sessionId,{info:o,custom:s}=await this.resolveAgentInfo(r.agentRef);if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);r.info.agent=o,r.info.archived=!1,r.info.availableCommands=null,r.stderrTail=[],r.midTurnOnDisk&&(r.midTurnOnDisk=!1,this.appendEvent(r,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()}));let c=t!==void 0&&t!==``||n!==void 0&&n.length>0;c&&(this.echoUserMessage(r,t??``,n),this.flushBroadcast(r)),this.emitStatus(r,`installing`);try{if(a===null)throw new ND(`resume-unsupported`,`this thread never completed an agent session`);let o=await this.connectAgent(r,s);if(o===null)throw new ND(`not-ready`,`thread closed during resume`);let{conn:l,init:u}=o,{servers:d}=await this.buildMcpServers(r,u,AD),f=u.agentCapabilities,p=f?.sessionCapabilities?.resume!=null,m;if(p)m=await l.agent.request(eh.agent.session.resume,{sessionId:a,cwd:r.cwd,mcpServers:d});else if(f?.loadSession===!0){r.suppressUpdates=!0,r.lastSuppressedAt=Date.now();try{m=await l.agent.request(eh.agent.session.load,{sessionId:a,cwd:r.cwd,mcpServers:d}),await this.awaitReplayQuiescence(r)}finally{r.suppressUpdates=!1}}else throw new ND(`resume-unsupported`,`${r.info.agent.name} doesn't support resuming previous sessions`);r.sessionId=a;let h=m.modes;h!=null&&(r.info.modes=h);let g=m.configOptions;return g!=null&&(r.info.configOptions=g),this.emitStatus(r,`ready`),this.opts.log.info({threadId:e,agentId:r.info.agent.id,method:p?`session/resume`:`session/load`,msToResumed:Date.now()-i},`[acp-threads] thread resumed`),c&&this.dispatchPrompt(r,t??``,n,{echo:!1}),{...r.info}}catch(t){throw await this.abortResume(r),t instanceof ND?t:t instanceof QT?new ND(t.code===`install-failed`?`install-failed`:`spawn-failed`,t.message):(this.opts.log.warn({err:t,threadId:e},`[acp-threads] resume rejected by the agent`),new ND(`resume-unsupported`,`couldn't resume the previous session: ${GD(t)}`))}}finally{r.resumeInFlight=!1}}async retryThread(e){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let t=this.mustGet(e);if(t.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it instead`);if(t.info.status!==`error`&&t.info.status!==`auth_required`&&!t.authInFlight)throw new ND(`not-ready`,`this thread did not fail to start`);if(t.sessionId!==null)throw new ND(`not-ready`,`this thread already has an agent session`);if(t.resumeInFlight)throw new ND(`not-ready`,`a retry is already in progress`);t.resumeInFlight=!0;try{qT(),this.healthyInterpreters.clear();let{info:n,custom:r}=await this.resolveAgentInfo(t.agentRef);await this.teardownFailedAgent(t),t.info.agent=n,t.stderrTail=[],t.cancelRequested=!1,t.turnActive=!1,this.emitStatus(t,`installing`);try{await this.startThread(t,{agent:t.agentRef,settings:t.launchSettings},r,AD)}catch(e){let n=e instanceof Error?e.message:String(e);throw this.emitStatus(t,`error`,n,{reason:`connect`,agentMessage:n}),new ND(`spawn-failed`,n)}if(t.closed)throw new ND(`not-ready`,`thread closed during retry`);let i=this.getInfo(e)?.status;if(i===`ready`||i===`running`)return this.opts.log.info({threadId:e,agentId:t.info.agent.id},`[acp-threads] thread retry succeeded`),{...t.info};throw new ND(`spawn-failed`,qD(t)??`the agent failed to start`)}finally{t.resumeInFlight=!1}}async authenticateThread(e,t){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let n=this.mustGet(e);if(n.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it instead`);if(n.info.status!==`auth_required`)throw new ND(`not-ready`,`this thread is not waiting for a sign-in`);let r=n.conn,i=n.lastInit;if(r===null||i===null||n.child===null)throw new ND(`not-ready`,`${n.info.agent.name} is no longer running — use Retry to start it again`);if(n.resumeInFlight)throw new ND(`not-ready`,`the thread is starting over — wait for the retry`);if(n.authInFlight)throw new ND(`not-ready`,`a sign-in is already in progress`);n.authInFlight=!0,n.authStderr=[],n.info.signInOutput=void 0;try{this.emitStatus(n,`authenticating`);try{await this.requestAuthenticate(r,t)}catch(e){if(n.conn!==r)throw ID();let t=e instanceof PD?`the sign-in didn't complete in time — try again`:GD(e);throw this.emitStatus(n,`auth_required`,`sign-in failed: ${t}`,{reason:`auth-required`,agentMessage:t,machineDetail:XD(e,n),authMethods:ZD(i.authMethods)}),new ND(`not-ready`,t)}if(n.closed)throw new ND(`not-ready`,`thread closed during sign-in`);if(n.conn!==r)throw ID();let a=await this.openSession(n,r,i,n.launchSettings,`report`,AD);if(a===`auth-required`){this.opts.log.info({threadId:e,agentId:n.info.agent.id,methodId:t},`[acp-threads] signed in but session still refused — relaunching the agent`),this.closeSignInCapture(n);try{return await this.retryThread(e)}catch(t){throw this.getInfo(e)?.status===`authenticating`&&this.emitStatus(n,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,n),authMethods:ZD(i.authMethods)}),t}}if(a!==!0)throw new ND(`not-ready`,qD(n)??`${n.info.agent.name} still couldn't start a conversation`);return this.opts.log.info({threadId:e,agentId:n.info.agent.id,methodId:t},`[acp-threads] thread signed in`),{...n.info}}finally{n.authInFlight=!1,this.closeSignInCapture(n)}}async requestAuthenticate(e,t){let n,r=new Promise((e,t)=>{n=setTimeout(()=>t(new PD),this.authenticateTimeoutMs),n.unref?.()});try{await Promise.race([e.agent.request(eh.agent.authenticate,{methodId:t}),r])}finally{n!==void 0&&clearTimeout(n)}}async abortResume(e){e.closed=!0,e.suppressUpdates=!1,this.failPendingPermissions(e),this.failPendingConsents(e);try{e.conn?.close()}catch{}let t=e.child;t!==null&&await HE(t,{graceMs:MD}),e.child=null,e.conn=null,e.lastInit=null,e.closed=!1,e.turnActive=!1,this.opts.agentPresenceBroadcaster?.clearPresence(xh(e.agentSessionId)),e.info.archived=!0,this.emitStatus(e,`exited`,`resume failed`),this.flushBroadcast(e),this.persistence.queueMetaWrite(e.info.threadId,this.buildMeta(e)),await this.persistence.whenIdle(e.info.threadId),e.baseSeq=e.info.lastSeq+1,e.events=[]}async awaitReplayQuiescence(e){let t=Date.now()+3e3;for(;Date.now()-e.lastSuppressedAt<300&&Date.now()<t;)await new Promise(e=>setTimeout(e,50))}sendPrompt(e,t,n){let r=this.mustGet(e);if(r.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it first`);if(r.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(r.authInFlight)throw new ND(`not-ready`,`the thread is still signing in`);if(r.sessionId===null||r.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(r.turnActive){let e=r.info.queue??[];if(e.length>=20)throw new ND(`not-ready`,`20 messages are already waiting — let the agent catch up`);let i={id:crypto.randomUUID(),content:t,ts:Date.now()};n!==void 0&&n.length>0&&(i.attachments=n),r.info.queue=[...e,i],r.info.lastActivityAt=Date.now(),this.emitInfo(r);return}this.dispatchPrompt(r,t,n,{echo:!0})}steerPrompt(e,t,n){let r=this.mustGet(e);if(r.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it first`);if(r.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(r.authInFlight)throw new ND(`not-ready`,`the thread is still signing in`);if(r.sessionId===null||r.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(!r.turnActive){this.dispatchPrompt(r,t,n,{echo:!0});return}this.clearSteer(r);let i={content:t,ts:Date.now()};n!==void 0&&n.length>0&&(i.attachments=n),r.info.steer=i,r.info.lastActivityAt=Date.now(),this.emitInfo(r);let a=setTimeout(()=>this.demoteStalledSteer(r),this.steerStallMs);a.unref?.(),r.steerStallTimer=a,this.cancelTurn(r,{clearQueue:!1})}demoteStalledSteer(e){e.steerStallTimer=null;let t=e.info.steer;if(t===void 0||e.closed||!e.turnActive)return;e.info.steer=void 0;let n={id:crypto.randomUUID(),content:t.content,ts:t.ts};t.attachments!==void 0&&t.attachments.length>0&&(n.attachments=t.attachments),e.info.queue=[n,...e.info.queue??[]],this.emitInfo(e)}clearSteer(e){e.steerStallTimer!==null&&(clearTimeout(e.steerStallTimer),e.steerStallTimer=null),e.info.steer=void 0}takeSteer(e){let t=e.info.steer;return t===void 0?null:(this.clearSteer(e),t)}editQueued(e,t,n){let r=this.mustGet(e),i=r.info.queue??[];return i.some(e=>e.id===t)?(r.info.queue=i.map(e=>e.id===t?{...e,content:n,held:!1}:e),this.emitInfo(r),this.drainIfIdle(r),!0):!1}holdQueued(e,t,n){let r=this.mustGet(e),i=r.info.queue??[];return i.some(e=>e.id===t)?(r.info.queue=i.map(e=>e.id===t?{...e,held:n}:e),this.emitInfo(r),n||this.drainIfIdle(r),!0):!1}removeQueued(e,t){let n=this.mustGet(e),r=n.info.queue??[],i=r.filter(e=>e.id!==t);return i.length===r.length?!1:(n.info.queue=i.length>0?i:void 0,this.emitInfo(n),!0)}drainIfIdle(e){if(e.turnActive||e.closed||e.resumeInFlight||e.info.archived===!0||e.sessionId===null||e.conn===null)return;let t=this.takeNextQueued(e);t!==null&&this.dispatchPrompt(e,t.content,t.attachments,{echo:!0})}takeNextQueued(e){let t=e.info.queue;if(t===void 0||t.length===0)return null;let n=t.findIndex(e=>e.held!==!0);if(n===-1)return null;let r=t[n],i=[...t.slice(0,n),...t.slice(n+1)];return e.info.queue=i.length>0?i:void 0,r??null}echoUserMessage(e,t,n){if(e.hadUserMessage=!0,e.info.title===e.info.agent.name&&t.trim()!==``){let n=e.titleHint!==void 0&&e.titleHint.trim()!==``?e.titleHint:t;e.titleHint=void 0,e.info.title=ED(n),this.appendEvent(e,{kind:`title_changed`,title:e.info.title,ts:Date.now()}),this.emitInfo(e)}let r={kind:`user_message`,content:t,ts:Date.now()};n!==void 0&&n.length>0&&(r.attachments=n),this.appendEvent(e,r)}async renameThread(e,t){let n=this.mustGet(e);if(n.closed)throw new ND(`not-ready`,`the thread is closing`);let r=TD(t);r===``||r===n.info.title||(await this.ensureLogResolved(n),n.info.title=r,n.info.lastActivityAt=Date.now(),this.appendEvent(n,{kind:`title_changed`,title:r,ts:Date.now()}),this.flushBroadcast(n),this.emitInfo(n),await this.persistence.whenIdle(n.info.threadId))}dispatchPrompt(e,t,n,r){if(e.sessionId===null||e.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);r.echo&&this.echoUserMessage(e,t,n);let i=t;e.envNotePending&&!t.startsWith(`/`)&&(e.envNotePending=!1,i=`Note on your environment: you are running inside the OpenKnowledge app, connected over ACP (Agent Client Protocol) — not inside your own terminal app. Your host CLI's terminal UI is not present, so its built-in slash commands (such as /tasks or /bashes) and keyboard shortcuts (such as Ctrl+O) do not exist here; never recommend them. The only slash commands available to the user are the ones you advertise over ACP.\n\n${t}`),e.turnActive=!0,e.cancelRequested=!1,this.appendEvent(e,{kind:`turn_started`,ts:Date.now()}),this.emitStatus(e,`running`);let a=e.sessionId;hT(i,n,e.info.promptCapabilities,e=>this.confinePath(e).then(({abs:e,rel:t})=>({abs:e,rel:t}))).then(t=>{if(t.dropped.length>0){this.opts.log.warn({threadId:e.info.threadId,dropped:t.dropped.map(e=>({kind:e.part.kind,reason:e.reason}))},`[acp-threads] dropped attachment parts before session/prompt`);let n=Date.now();for(let r of t.dropped){let t=r.part.kind===`image`||r.part.kind===`blob`?r.part.name:r.part.name||r.part.path;this.appendEvent(e,{kind:`agent_stderr`,line:`[attachment dropped] ${t}: ${r.reason}`,ts:n})}}if(e.sessionId===null||e.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(e.cancelRequested)throw new FD;return e.conn.agent.request(eh.agent.session.prompt,{sessionId:a,prompt:[...t.blocks]})}).then(t=>{if(e.turnActive=!1,!e.closed){if(this.appendEvent(e,{kind:`turn_ended`,stopReason:t.stopReason,ts:Date.now()}),e.sessionId!==null&&e.conn!==null){let t=this.takeSteer(e);if(t!==null){this.dispatchPrompt(e,t.content,t.attachments,{echo:!0});return}let n=this.takeNextQueued(e);if(n!==null){this.dispatchPrompt(e,n.content,n.attachments,{echo:!0});return}}this.emitStatus(e,`ready`)}}).catch(t=>{if(e.turnActive=!1,!e.closed){if(this.appendEvent(e,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()}),e.sessionId!==null&&e.conn!==null){let t=this.takeSteer(e);if(t!==null){this.dispatchPrompt(e,t.content,t.attachments,{echo:!0});return}}if(e.cancelRequested){this.emitStatus(e,`ready`),this.drainIfIdle(e);return}if(WD(t)){this.emitStatus(e,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,e),authMethods:ZD(e.lastInit?.authMethods)});return}this.emitStatus(e,`error`,`prompt failed: ${GD(t)}`,{reason:`prompt`,agentMessage:GD(t),machineDetail:YD(KD(t),JD(e))})}})}cancel(e){this.cancelTurn(this.mustGet(e),{clearQueue:!0})}cancelTurn(e,t){t.clearQueue&&(e.info.queue!==void 0||e.info.steer!==void 0)&&(e.info.queue=void 0,this.clearSteer(e),this.emitInfo(e)),!(e.conn===null||e.sessionId===null)&&(e.turnActive&&(e.cancelRequested=!0),this.failPendingPermissions(e),this.restoreRunningAfterPermission(e),e.conn.agent.notify(eh.agent.session.cancel,{sessionId:e.sessionId}).catch(t=>{this.opts.log.debug({err:t,threadId:e.info.threadId},`[acp-threads] cancel notification never reached the agent`)}))}setMode(e,t){let n=this.mustGet(e);if(n.conn===null||n.sessionId===null)throw new ND(`not-ready`,`thread has no live agent session`);n.conn.agent.request(eh.agent.session.setMode,{sessionId:n.sessionId,modeId:t}).then(()=>{n.info.modes&&(n.info.modes={...n.info.modes,currentModeId:t},this.emitInfo(n))}).catch(t=>{this.opts.log.warn({err:t,threadId:e},`[acp-threads] set_mode failed`)})}setConfigOption(e,t,n){let r=this.mustGet(e);if(r.conn===null||r.sessionId===null)throw new ND(`not-ready`,`thread has no live agent session`);let i=typeof n==`boolean`?{sessionId:r.sessionId,configId:t,type:`boolean`,value:n}:{sessionId:r.sessionId,configId:t,value:n};r.conn.agent.request(eh.agent.session.setConfigOption,i).then(e=>{r.info.configOptions=e.configOptions,this.emitInfo(r)}).catch(n=>{this.opts.log.warn({err:n,threadId:e,configId:t},`[acp-threads] set_config_option failed`)})}async applyInitialConfig(e,t,n){let r=e.sessionId;if(r===null)return;let i=t=>(e.info.configOptions??[]).find(e=>e.id===t)?.category===`model`,a=Object.keys(n).sort((e,t)=>Number(i(t))-Number(i(e))),o=!1,s=[];for(let i of a){let a=n[i];if(a===void 0)continue;let c=(e.info.configOptions??[]).find(e=>e.id===i);if(c===void 0||c.currentValue===a||!HD(c,a))continue;let l=typeof a==`boolean`?{sessionId:r,configId:i,type:`boolean`,value:a}:{sessionId:r,configId:i,value:a};try{let n=await t.agent.request(eh.agent.session.setConfigOption,l);e.info.configOptions=n.configOptions,o=!0}catch(t){s.push(i),this.opts.log.warn({err:t,threadId:e.info.threadId,configId:i},`[acp-threads] initial config apply failed`)}if(e.closed)return}s.length>0&&this.opts.log.warn({threadId:e.info.threadId,rejectedConfigIds:s},`[acp-threads] some remembered config options could not be applied to the new session`),o&&this.emitInfo(e)}async applyInitialMode(e,t,n){let r=e.sessionId;if(r===null)return;let i=e.info.modes;if(i!=null&&i.availableModes.some(e=>e.id===n)){if(i.currentModeId===n)return;try{await t.agent.request(eh.agent.session.setMode,{sessionId:r,modeId:n}),e.info.modes={...i,currentModeId:n},this.emitInfo(e)}catch(t){this.opts.log.warn({err:t,threadId:e.info.threadId,modeId:n,method:`set_mode`},`[acp-threads] initial mode apply failed`)}return}let a=(e.info.configOptions??[]).find(e=>e.category===`mode`&&HD(e,n));if(!(a===void 0||a.currentValue===n))try{let i=await t.agent.request(eh.agent.session.setConfigOption,{sessionId:r,configId:a.id,value:n});e.info.configOptions=i.configOptions,this.emitInfo(e)}catch(t){this.opts.log.warn({err:t,threadId:e.info.threadId,modeId:n,method:`set_config_option`},`[acp-threads] initial mode apply failed`)}}respondPermission(e,t,n){let r=this.mustGet(e),i=r.pendingPermissions.get(t);i!==void 0&&(r.pendingPermissions.delete(t),clearTimeout(i.timer),n.kind===`selected`?(i.resolve({outcome:{outcome:`selected`,optionId:n.optionId}}),this.appendEvent(r,{kind:`permission_resolved`,requestId:t,optionId:n.optionId,auto:!1,ts:Date.now()})):(i.resolve({outcome:{outcome:`cancelled`}}),this.appendEvent(r,{kind:`permission_resolved`,requestId:t,optionId:null,auto:!1,ts:Date.now()})),this.restoreRunningAfterPermission(r))}restoreRunningAfterPermission(e){e.pendingPermissions.size===0&&e.turnActive&&e.info.status===`awaiting_permission`&&this.emitStatus(e,`running`)}async closeThread(e,t){let n=this.threads.get(e);if(n===void 0||n.info.archived===!0||n.closed)return;n.closed=!0,this.clearSteer(n),this.failPendingPermissions(n),this.failPendingConsents(n);try{n.conn?.close()}catch{}let r=n.child;r!==null&&(await HE(r,{graceMs:t?.killGraceMs??jD})||this.opts.log.error({threadId:e,pid:r.pid},`[acp-threads] agent process survived SIGKILL escalation`)),n.child=null,n.conn=null,n.lastInit=null,await n.terminals?.disposeAll(),n.terminals=null,this.opts.agentPresenceBroadcaster?.clearPresence(xh(n.agentSessionId)),await this.opts.sessionManager.closeAllForAgent(n.agentSessionId).catch(t=>{this.opts.log.warn({err:t,threadId:e},`[acp-threads] session cleanup failed`)});let i=n.info.status===`error`||n.info.status===`auth_required`;if(!n.hadUserMessage&&!i){this.threads.delete(e),n.subscribers.clear(),n.flushTimer!==null&&(clearTimeout(n.flushTimer),n.flushTimer=null),await this.persistence.whenIdle(e),await this.persistence.delete(e),this.opts.log.info({threadId:e},`[acp-threads] empty thread discarded on close`);return}n.turnActive&&(n.turnActive=!1,this.appendEvent(n,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()})),n.info.archived=!0,this.emitStatus(n,`exited`,`thread closed`),this.flushBroadcast(n),this.persistence.queueMetaWrite(e,this.buildMeta(n)),await this.persistence.whenIdle(e),n.baseSeq=n.info.lastSeq+1,n.events=[],n.pendingBroadcast=[],n.closed=!1,this.opts.log.info({threadId:e},`[acp-threads] thread archived`)}async deleteThread(e){let t=this.mustGet(e);if(t.info.archived!==!0)throw new ND(`not-ready`,`close the thread before deleting it`);if(t.resumeInFlight)throw new ND(`not-ready`,`a resume is in progress`);this.threads.delete(e),t.subscribers.clear(),t.flushTimer!==null&&(clearTimeout(t.flushTimer),t.flushTimer=null),await this.persistence.whenIdle(e),await this.persistence.delete(e),this.opts.log.info({threadId:e},`[acp-threads] thread deleted`)}async destroy(){this.destroyed=!0,clearInterval(this.reapTimer),await Promise.allSettled([...this.threads.keys()].map(e=>this.closeThread(e,{killGraceMs:MD})))}async handlePermissionRequest(e,t,n){e.info.lastActivityAt=Date.now();let r=this.opts.permissions.decide(e.info.agent.id,t,n);if(r.auto!==null){let t=crypto.randomUUID();return this.appendEvent(e,{kind:`permission_resolved`,requestId:t,optionId:r.auto.optionId,auto:!0,ts:Date.now()}),{outcome:{outcome:`selected`,optionId:r.auto.optionId}}}let i=crypto.randomUUID();return this.appendEvent(e,{kind:`permission_request`,requestId:i,toolCall:t,options:n,ts:Date.now()}),e.turnActive&&e.info.status===`running`&&this.emitStatus(e,`awaiting_permission`),new Promise(r=>{let a=setTimeout(()=>{e.pendingPermissions.delete(i),this.appendEvent(e,{kind:`permission_resolved`,requestId:i,optionId:null,auto:!0,ts:Date.now()}),this.restoreRunningAfterPermission(e),r({outcome:{outcome:`cancelled`}})},6e5);a.unref?.(),e.pendingPermissions.set(i,{timer:a,resolve:i=>{if(i.outcome.outcome===`selected`){let r=n.find(e=>i.outcome.outcome===`selected`&&e.optionId===i.outcome.optionId);r!==void 0&&this.opts.permissions.recordChoice(e.info.agent.id,t,r)}r(i)}})})}handleSessionUpdate(e,t){e.info.lastActivityAt=Date.now();let n=t.update;if(n.sessionUpdate===`current_mode_update`&&e.info.modes&&(e.info.modes={...e.info.modes,currentModeId:n.currentModeId},this.emitInfo(e)),n.sessionUpdate===`config_option_update`&&(e.info.configOptions=n.configOptions,this.emitInfo(e)),n.sessionUpdate===`available_commands_update`&&(e.info.availableCommands=n.availableCommands,this.emitInfo(e)),e.suppressUpdates){e.lastSuppressedAt=Date.now();return}this.appendEvent(e,{kind:`session_update`,update:bT(n),ts:Date.now()})}async handleFsRead(e,t,n){let r=await this.confinePath(e),i;if(i=r.docName===null?await pd(r.abs,`utf8`):this.opts.getLoadedDocText?.(r.docName)??await pd(r.abs,`utf8`),t!==null||n!==null){let e=i.split(`
29
+ `);this.opts.log.warn({threadId:e.info.threadId,agentId:e.info.agent.id,code:t,signal:n,machineDetail:JD(e)},`[acp-threads] agent exited unexpectedly`),this.emitStatus(e,`exited`,`agent exited (${n??t??`unknown`})${r?`\n${r}`:``}`),this.failPendingPermissions(e)}),o.stdin===null||o.stdout===null)throw new ND(`spawn-failed`,`agent process has no stdio`);let s=lie(bte.toWeb(o.stdin),_d.toWeb(o.stdout)),c=jie({name:`open-knowledge`}).onRequest(eh.client.session.requestPermission,t=>this.handlePermissionRequest(e,t.params.toolCall,t.params.options)).onRequest(eh.client.fs.readTextFile,e=>this.handleFsRead(e.params.path,e.params.line??null,e.params.limit??null)).onRequest(eh.client.fs.writeTextFile,async t=>(await this.handleFsWrite(e,t.params.path,t.params.content),{})).onRequest(eh.client.terminal.create,t=>(e.info.lastActivityAt=Date.now(),a.create(t.params))).onRequest(eh.client.terminal.output,e=>a.output(e.params.terminalId)).onRequest(eh.client.terminal.waitForExit,e=>a.waitForExit(e.params.terminalId)).onRequest(eh.client.terminal.kill,async e=>(await a.kill(e.params.terminalId),{})).onRequest(eh.client.terminal.release,async e=>(await a.release(e.params.terminalId),{})).onNotification(eh.client.session.update,t=>this.handleSessionUpdate(e,t.params)).connect(s);e.conn=c,c.closed.then(()=>{!e.closed&&e.info.archived!==!0&&e.info.status!==`exited`&&e.info.status!==`error`&&this.emitStatus(e,`exited`,`agent connection closed`)},t=>{this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] agent connection closed with error`),!e.closed&&e.info.archived!==!0&&e.info.status!==`exited`&&e.info.status!==`error`&&this.emitStatus(e,`error`,`agent connection failed: ${t instanceof Error?t.message:String(t)}`)});let l;try{l=await c.agent.request(eh.agent.initialize,{protocolVersion:1,clientInfo:{name:`open-knowledge`,title:`Open Knowledge`,version:Pc},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,session:{configOptions:{boolean:{}}}}})}catch(t){throw this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] initialize failed`),new ND(`spawn-failed`,`initialize failed: ${GD(t)}`)}return e.closed?null:(e.lastInit=l,e.info.promptCapabilities=l.agentCapabilities?.promptCapabilities??{},this.emitInfo(e),{conn:c,init:l,launch:n})}async ensureLaunchable(e,t){let n;try{await yE(t),n=await this.withLoginShellPathIfEligible(t)}catch(r){if(!(r instanceof QT)||r.code!==`command-not-found`)throw r;let i=await this.retryWithLoginShellPath(t);if(i===null)return this.fallbackToManagedRuntime(e,t,r);n=i}return e.closed?null:this.ensureInterpreterRuns(e,n)}async ensureInterpreterRuns(e,t){if(t.kind!==`npx`&&t.kind!==`uvx`)return t;let n=await this.probeInterpreterOnce(t);if(e.closed)return null;if(n===null)return t;if(n.kind===`incompatible`){let n=await this.withPreferredLoginShellPathIfEligible(t);if(e.closed)return null;if(AE(n.env)!==AE(t.env))try{await yE(n);let t=await this.probeInterpreterOnce(n);if(e.closed)return null;if(t===null)return this.opts.log.info({threadId:e.info.threadId,agentId:e.info.agent.id},`[acp-threads] compatible Node resolved via the preferred login-shell PATH`),n;this.opts.log.debug({threadId:e.info.threadId,agentId:e.info.agent.id,cmd:n.cmd,kind:n.kind,failureKind:t.kind,detail:t.detail},`[acp-threads] preferred login-shell PATH did not provide a compatible Node`)}catch(e){if(!(e instanceof QT)||e.code!==`command-not-found`)throw e}}this.opts.log.warn({threadId:e.info.threadId,agentId:e.info.agent.id,cmd:t.cmd,kind:t.kind,failureKind:n.kind,detail:n.detail},`[acp-threads] interpreter cannot run this agent — offering the managed runtime`);let r=new QT(`command-not-found`,n.kind===`incompatible`?kE(t,n.detail):xE(t,n.detail));return this.fallbackToManagedRuntime(e,t,r,r)}async fallbackToManagedRuntime(e,t,n,r){if(t.kind!==`npx`&&t.kind!==`uvx`)throw n;let i=JE(t.kind);if(!rD(i))throw n;let a=await this.provideManagedRuntime(e,i,r===void 0?`missing`:`broken`).catch(e=>{throw r!==void 0&&e instanceof QT&&e.code===`command-not-found`?r:e});if(a===null)return null;let o=sE(t,a);await yE(o);let s=await this.probeInterpreterOnce(o);if(s===null)return o;if(s.kind===`incompatible`)throw new QT(`install-failed`,CE(s.detail));return this.repairManagedRuntime(e,t,i,s.detail)}async repairManagedRuntime(e,t,n,r){let i={threadId:e.info.threadId,agentId:e.info.agent.id,runtime:n,detail:r};if(this.opts.log.warn(i,`[acp-threads] OK's own managed runtime failed to run — replacing it`),!await uD(n,this.opts.log,this.opts.runtimeInstall?.root))throw new QT(`install-failed`,wE(t,r));let a=await this.provideManagedRuntime(e,n,`damaged`).catch(e=>{throw e instanceof QT&&e.code===`command-not-found`?new QT(`command-not-found`,TE(t)):e});if(a===null)return null;let o=sE(t,a);await yE(o);let s=await this.probeInterpreterOnce(o);if(s===null)return o;throw this.opts.log.error({...i,detail:s.detail},`[acp-threads] a freshly downloaded managed runtime failed to run`),new QT(`install-failed`,s.kind===`incompatible`?CE(s.detail):SE(o,s.detail))}async probeInterpreterOnce(e){let t=JSON.stringify([e.cmd,AE(e.env)??``]);if(this.healthyInterpreters.has(t))return null;let n=await DE(e,void 0,this.opts.log);if(n!==null)return{kind:`unhealthy`,detail:n};if(e.kind===`npx`){let t=await OE(e,void 0,this.opts.log);if(t!==null)return{kind:`incompatible`,detail:t}}return this.healthyInterpreters.add(t),null}async retryWithLoginShellPath(e){let t=await this.withLoginShellPathIfEligible(e);if(AE(t.env)===AE(e.env))return null;try{await yE(t)}catch(t){if(!(t instanceof QT))throw t;return this.opts.log.debug({cmd:e.cmd,kind:e.kind},`[acp] login-shell PATH did not resolve the command either`),null}return this.opts.log.info({cmd:e.cmd,kind:e.kind},`[acp] command resolved via the login-shell PATH; skipping the managed-runtime offer`),t}async withLoginShellPathIfEligible(e){if(e.pathFromOverlay||jE(e.cmd))return e;let t=await this.resolveLoginShellPath().catch(()=>null);return t===null?e:cE(e,t)}async withPreferredLoginShellPathIfEligible(e){if(e.pathFromOverlay||jE(e.cmd))return e;let t=await this.resolveLoginShellPath().catch(()=>null);return t===null?e:lE(e,t)}async provideManagedRuntime(e,t,n){let r=this.opts.runtimeInstall?.root;await lD(t,this.opts.log,r);let i=await sD(t,r).catch(()=>null);if(i!==null)return i;let a=await this.requestRuntimeConsent(e,t,n);if(a===`closed`||e.closed)return null;if(a!==`granted`)throw new QT(`command-not-found`,UD(t));try{let n=await this.downloadRuntime(e,t);return e.closed?null:n}catch(e){let n=YE(t).displayName;throw new QT(`install-failed`,`couldn't install ${n}: ${e instanceof Error?e.message:String(e)}`)}}requestRuntimeConsent(e,t,n){let r=crypto.randomUUID(),i=YE(t);return this.appendEvent(e,{kind:`runtime_consent_request`,requestId:r,runtime:t,displayName:i.displayName,provides:i.provides,version:i.version,approxSizeMB:i.approxSizeMB,sourceHost:i.sourceHost,agentName:e.info.agent.name,reason:n,ts:Date.now()}),new Promise(t=>{let n=setTimeout(()=>{e.pendingRuntimeConsent.delete(r),this.appendEvent(e,{kind:`runtime_consent_resolved`,requestId:r,decision:`timeout`,ts:Date.now()}),t(`timeout`)},kD);n.unref?.(),e.pendingRuntimeConsent.set(r,{resolve:t,timer:n})})}respondRuntimeConsent(e,t,n){let r=this.mustGet(e),i=r.pendingRuntimeConsent.get(t);if(i===void 0)return;r.pendingRuntimeConsent.delete(t),clearTimeout(i.timer);let a=n.kind===`granted`?`granted`:`declined`;this.appendEvent(r,{kind:`runtime_consent_resolved`,requestId:t,decision:a,ts:Date.now()}),i.resolve(a)}async downloadRuntime(e,t){this.emitStatus(e,`installing`);let n=0;return dD(t,this.opts.log,{root:this.opts.runtimeInstall?.root,fetchImpl:this.opts.runtimeInstall?.fetchImpl,onProgress:r=>{let i=Date.now();i-n<400||(n=i,!e.closed&&this.appendEvent(e,{kind:`runtime_install_progress`,runtime:t,phase:`downloading`,receivedBytes:r.receivedBytes,totalBytes:r.totalBytes??void 0,ts:i}))}})}async buildMcpServers(e,t,n=kD){let r=[],i;if(LD(e.agentRef))i=await this.settlePiBridge(e,n)===`unavailable`?`none`:`unknown`;else if(await this.harnessAlreadyHasOkMcp(e)!==null)i=`unknown`;else{let e=this.opts.getServerUrl?.();if(e!==void 0&&t.agentCapabilities?.mcpCapabilities?.http===!0)r.push({type:`http`,name:`open-knowledge`,url:`${e}/mcp`,headers:[{name:lT,value:`1`}]}),i=`http-header`;else{let e=this.opts.getMcpStdioCommand?.(),t=nE();e==null?i=`none`:(r.push({name:`open-knowledge`,command:e.command,args:[...e.args],env:[{name:_r,value:`1`},...t!==void 0&&t!==``?[{name:`PATH`,value:t}]:[]]}),i=`stdio-entry-env`)}}return i===`none`?this.opts.log.warn({threadId:e.info.threadId,agentId:e.agentRef.id},`[acp-threads] no OK MCP transport available for this agent — it starts without OK tools`):this.opts.log.info({threadId:e.info.threadId,agentId:e.agentRef.id,hostedMarker:i},`[acp-threads] OK MCP injection outcome`),{servers:r,hostedMarker:i}}async harnessAlreadyHasOkMcp(e){let t=this.opts.probeHarnessManagedMcpEntry;if(t===void 0||e.agentRef.source!==`registry`)return null;let n=pf[e.agentRef.id];if(n===void 0)return null;let r;try{r=await t(n,e.cwd)}catch(t){return this.opts.log.warn({err:t,threadId:e.info.threadId,editorId:n},`[acp-threads] harness MCP-config probe failed — injecting OK MCP`),null}return r!==null&&this.opts.log.info({threadId:e.info.threadId,agentId:e.agentRef.id,editorId:r.editorId,scope:r.scope,configPath:r.configPath},`[acp-threads] skipping OK MCP injection — the agent's harness already loads OK's managed entry`),r}async settlePiBridge(e,t){let n=this.opts.probePiAcpBridge,r=e.info.threadId;if(n===void 0)return this.opts.log.debug({threadId:r,agentId:e.agentRef.id},`[acp-threads] no Pi bridge probe wired — OK tools depend on whether the project was already wired`),`unknown`;let i;try{i=await n(e.cwd)}catch(e){return this.opts.log.warn({err:e,threadId:r},`[acp-threads] Pi bridge probe failed`),`unknown`}if(e.closed)return`unknown`;if(i.bridgeLoadable)return this.opts.log.info({threadId:r,bridge:i.bridge,bridgePath:i.bridgePath},`[acp-threads] Pi already loads the OK bridge extension for this project`),`loadable`;if(i.bridge===`foreign`||i.bridge===`unreadable`)return this.opts.log.warn({threadId:r,bridge:i.bridge,bridgePath:i.bridgePath},`[acp-threads] OK can't claim the Pi bridge path — leaving it alone; this thread has no OK tools`),this.emitPiBridgeStatus(e,{kind:`pi_bridge_status`,state:i.bridge===`foreign`?`foreign-file`:`unreadable-file`,bridgePath:i.bridgePath,ts:Date.now()}),`unavailable`;if(e.piBridgeDeclined)return this.opts.log.debug({threadId:r},`[acp-threads] Pi bridge prompt already declined for this thread — not re-asking`),`unavailable`;let a=this.opts.ensurePiAcpBridge;if(a===void 0)return this.opts.log.warn({threadId:r},`[acp-threads] Pi bridge is not provisioned and no provisioning seam is wired — not prompting`),`unavailable`;let o=crypto.randomUUID(),s=await this.requestPiBridgeConsent(e,o,i,t);if(s===`declined`&&(e.piBridgeDeclined=!0),e.closed)return`unknown`;if(s!==`granted`)return this.opts.log.info({threadId:r,decision:s},`[acp-threads] Pi bridge not provisioned — the thread continues without OK tools`),`unavailable`;let c;try{c=await a(e.cwd)}catch(t){let n=t instanceof Error?t.message:String(t);return this.opts.log.warn({err:t,threadId:r},`[acp-threads] Pi bridge provisioning threw`),this.appendPiBridgeFailure(e,o,`bridge-failed`,i.bridgePath,{detail:n}),`unavailable`}if(c.ok)return this.opts.log.info({threadId:r,bridge:c.bridge,trust:c.trust,bridgePath:c.bridgePath},`[acp-threads] provisioned the Pi bridge extension for this project`),e.closed?`unknown`:(this.appendEvent(e,{kind:`pi_bridge_status`,requestId:o,state:`ready`,bridgePath:c.bridgePath,bridge:c.bridge,trust:c.trust,ts:Date.now()}),`loadable`);let l=c.bridge===`written`||c.bridge===`refreshed`||c.bridge===`unchanged`,u=c.bridge===`refused-foreign`?`foreign-file`:c.bridge===`refused-unreadable`?`unreadable-file`:l?`trust-failed`:`bridge-failed`;return this.opts.log.warn({threadId:r,bridge:c.bridge,trust:c.trust,bridgePath:c.bridgePath,err:c.error},`[acp-threads] Pi bridge provisioning did not complete — the thread continues without OK tools`),this.appendPiBridgeFailure(e,o,u,c.bridgePath,{bridge:c.bridge,trust:c.trust,...c.error===void 0?{}:{detail:c.error}}),`unavailable`}appendPiBridgeFailure(e,t,n,r,i){e.closed||this.appendEvent(e,{kind:`pi_bridge_status`,requestId:t,state:n,bridgePath:r,...i,ts:Date.now()})}emitPiBridgeStatus(e,t){e.lastPiBridgeStatus!==t.state&&(e.lastPiBridgeStatus=t.state,this.appendEvent(e,t))}requestPiBridgeConsent(e,t,n,r){return this.appendEvent(e,{kind:`pi_bridge_consent_request`,requestId:t,agentName:e.info.agent.name,bridgePath:n.bridgePath,cwd:e.cwd,otherExtensions:n.otherExtensions,ts:Date.now()}),new Promise(n=>{let i=setTimeout(()=>{e.pendingPiBridgeConsent.delete(t),this.appendEvent(e,{kind:`pi_bridge_consent_resolved`,requestId:t,decision:`timeout`,ts:Date.now()}),n(`timeout`)},r);i.unref?.(),e.pendingPiBridgeConsent.set(t,{resolve:n,timer:i})})}respondPiBridgeConsent(e,t,n){let r=this.mustGet(e),i=r.pendingPiBridgeConsent.get(t);if(i===void 0)return;r.pendingPiBridgeConsent.delete(t),clearTimeout(i.timer);let a=n.kind===`granted`?`granted`:`declined`;this.appendEvent(r,{kind:`pi_bridge_consent_resolved`,requestId:t,decision:a,ts:Date.now()}),i.resolve(a)}async startThread(e,t,n,r=kD){let i;try{i=await this.connectAgent(e,n)}catch(t){let n=t instanceof QT||t instanceof ND?t.message:String(t);this.emitStatus(e,`error`,n,{reason:`connect`,agentMessage:n,machineDetail:JD(e)}),await this.teardownFailedAgent(e);return}if(i===null)return;let{conn:a,init:o,launch:s}=i;await this.openSession(e,a,o,t.settings,`park`,r)===!0&&(this.opts.log.info({threadId:e.info.threadId,agentId:e.info.agent.id,launchKind:s.kind,msToReady:Date.now()-e.info.createdAt},`[acp-threads] agent ready`),(t.prompt!==void 0&&t.prompt!==``||t.attachments!==void 0&&t.attachments.length>0)&&this.sendPrompt(e.info.threadId,t.prompt??``,t.attachments))}async openSession(e,t,n,r,i=`park`,a=kD){e.info.availableCommands=null;let{servers:o}=await this.buildMcpServers(e,n,a);try{let n=await t.agent.request(eh.agent.session.new,{cwd:e.cwd,mcpServers:o});e.sessionId=n.sessionId,e.envNotePending=!0,this.persistence.queueMetaWrite(e.info.threadId,this.buildMeta(e)),n.modes!==void 0&&n.modes!==null&&(e.info.modes=n.modes,this.emitInfo(e)),n.configOptions!==void 0&&n.configOptions!==null&&(e.info.configOptions=n.configOptions,this.emitInfo(e))}catch(t){if(WD(t)){if(i===`report`)return`auth-required`;this.emitStatus(e,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,e),authMethods:ZD(n.authMethods)})}else this.emitStatus(e,`error`,`session setup failed: ${GD(t)}`,{reason:`session-setup`,agentMessage:GD(t),machineDetail:YD(KD(t),JD(e))}),await this.teardownFailedAgent(e);return!1}return e.closed||r?.config!==void 0&&(await this.applyInitialConfig(e,t,r.config),e.closed)||r?.modeId!==void 0&&(await this.applyInitialMode(e,t,r.modeId),e.closed)?!1:(this.emitStatus(e,`ready`),!0)}async resumeThread(e,t,n){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let r=this.mustGet(e);if(r.info.archived!==!0)throw new ND(`not-ready`,`thread is not archived`);if(r.resumeInFlight)throw new ND(`not-ready`,`a resume is already in progress`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);r.resumeInFlight=!0;let i=Date.now();try{await this.ensureLogResolved(r);let a=r.sessionId,{info:o,custom:s}=await this.resolveAgentInfo(r.agentRef);if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);if(this.liveThreadCount()>=this.maxThreads)throw new ND(`capacity`,`maximum of ${this.maxThreads} concurrent agent threads`);r.info.agent=o,r.info.archived=!1,r.info.availableCommands=null,r.stderrTail=[],r.midTurnOnDisk&&(r.midTurnOnDisk=!1,this.appendEvent(r,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()}));let c=t!==void 0&&t!==``||n!==void 0&&n.length>0;c&&(this.echoUserMessage(r,t??``,n),this.flushBroadcast(r)),this.emitStatus(r,`installing`);try{if(a===null)throw new ND(`resume-unsupported`,`this thread never completed an agent session`);let o=await this.connectAgent(r,s);if(o===null)throw new ND(`not-ready`,`thread closed during resume`);let{conn:l,init:u}=o,{servers:d}=await this.buildMcpServers(r,u,AD),f=u.agentCapabilities,p=f?.sessionCapabilities?.resume!=null,m;if(p)m=await l.agent.request(eh.agent.session.resume,{sessionId:a,cwd:r.cwd,mcpServers:d});else if(f?.loadSession===!0){r.suppressUpdates=!0,r.lastSuppressedAt=Date.now();try{m=await l.agent.request(eh.agent.session.load,{sessionId:a,cwd:r.cwd,mcpServers:d}),await this.awaitReplayQuiescence(r)}finally{r.suppressUpdates=!1}}else throw new ND(`resume-unsupported`,`${r.info.agent.name} doesn't support resuming previous sessions`);r.sessionId=a;let h=Object.fromEntries((r.info.configOptions??[]).map(e=>[e.id,e.currentValue])),g=r.info.modes?.currentModeId,_=m.modes;_!=null&&(r.info.modes=_);let v=m.configOptions;if(v!=null&&(r.info.configOptions=v),await this.applyInitialConfig(r,l,h,v==null),r.closed||g!==void 0&&(await this.applyInitialMode(r,l,g,_==null),r.closed))throw new ND(`not-ready`,`thread closed during resume`);return this.emitStatus(r,`ready`),this.opts.log.info({threadId:e,agentId:r.info.agent.id,method:p?`session/resume`:`session/load`,msToResumed:Date.now()-i},`[acp-threads] thread resumed`),c&&this.dispatchPrompt(r,t??``,n,{echo:!1}),{...r.info}}catch(t){throw await this.abortResume(r),t instanceof ND?t:t instanceof QT?new ND(t.code===`install-failed`?`install-failed`:`spawn-failed`,t.message):(this.opts.log.warn({err:t,threadId:e},`[acp-threads] resume rejected by the agent`),new ND(`resume-unsupported`,`couldn't resume the previous session: ${GD(t)}`))}}finally{r.resumeInFlight=!1}}async retryThread(e){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let t=this.mustGet(e);if(t.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it instead`);if(t.info.status!==`error`&&t.info.status!==`auth_required`&&!t.authInFlight)throw new ND(`not-ready`,`this thread did not fail to start`);if(t.sessionId!==null)throw new ND(`not-ready`,`this thread already has an agent session`);if(t.resumeInFlight)throw new ND(`not-ready`,`a retry is already in progress`);t.resumeInFlight=!0;try{qT(),this.healthyInterpreters.clear();let{info:n,custom:r}=await this.resolveAgentInfo(t.agentRef);await this.teardownFailedAgent(t),t.info.agent=n,t.stderrTail=[],t.cancelRequested=!1,t.turnActive=!1,this.emitStatus(t,`installing`);try{await this.startThread(t,{agent:t.agentRef,settings:t.launchSettings},r,AD)}catch(e){let n=e instanceof Error?e.message:String(e);throw this.emitStatus(t,`error`,n,{reason:`connect`,agentMessage:n}),new ND(`spawn-failed`,n)}if(t.closed)throw new ND(`not-ready`,`thread closed during retry`);let i=this.getInfo(e)?.status;if(i===`ready`||i===`running`)return this.opts.log.info({threadId:e,agentId:t.info.agent.id},`[acp-threads] thread retry succeeded`),{...t.info};throw new ND(`spawn-failed`,qD(t)??`the agent failed to start`)}finally{t.resumeInFlight=!1}}async authenticateThread(e,t){if(this.destroyed)throw new ND(`capacity`,`server is shutting down`);let n=this.mustGet(e);if(n.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it instead`);if(n.info.status!==`auth_required`)throw new ND(`not-ready`,`this thread is not waiting for a sign-in`);let r=n.conn,i=n.lastInit;if(r===null||i===null||n.child===null)throw new ND(`not-ready`,`${n.info.agent.name} is no longer running — use Retry to start it again`);if(n.resumeInFlight)throw new ND(`not-ready`,`the thread is starting over — wait for the retry`);if(n.authInFlight)throw new ND(`not-ready`,`a sign-in is already in progress`);n.authInFlight=!0,n.authStderr=[],n.info.signInOutput=void 0;try{this.emitStatus(n,`authenticating`);try{await this.requestAuthenticate(r,t)}catch(e){if(n.conn!==r)throw ID();let t=e instanceof PD?`the sign-in didn't complete in time — try again`:GD(e);throw this.emitStatus(n,`auth_required`,`sign-in failed: ${t}`,{reason:`auth-required`,agentMessage:t,machineDetail:XD(e,n),authMethods:ZD(i.authMethods)}),new ND(`not-ready`,t)}if(n.closed)throw new ND(`not-ready`,`thread closed during sign-in`);if(n.conn!==r)throw ID();let a=await this.openSession(n,r,i,n.launchSettings,`report`,AD);if(a===`auth-required`){this.opts.log.info({threadId:e,agentId:n.info.agent.id,methodId:t},`[acp-threads] signed in but session still refused — relaunching the agent`),this.closeSignInCapture(n);try{return await this.retryThread(e)}catch(t){throw this.getInfo(e)?.status===`authenticating`&&this.emitStatus(n,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,n),authMethods:ZD(i.authMethods)}),t}}if(a!==!0)throw new ND(`not-ready`,qD(n)??`${n.info.agent.name} still couldn't start a conversation`);return this.opts.log.info({threadId:e,agentId:n.info.agent.id,methodId:t},`[acp-threads] thread signed in`),{...n.info}}finally{n.authInFlight=!1,this.closeSignInCapture(n)}}async requestAuthenticate(e,t){let n,r=new Promise((e,t)=>{n=setTimeout(()=>t(new PD),this.authenticateTimeoutMs),n.unref?.()});try{await Promise.race([e.agent.request(eh.agent.authenticate,{methodId:t}),r])}finally{n!==void 0&&clearTimeout(n)}}async abortResume(e){e.closed=!0,e.suppressUpdates=!1,this.failPendingPermissions(e),this.failPendingConsents(e);try{e.conn?.close()}catch{}let t=e.child;t!==null&&await HE(t,{graceMs:MD}),e.child=null,e.conn=null,e.lastInit=null,e.closed=!1,e.turnActive=!1,this.opts.agentPresenceBroadcaster?.clearPresence(xh(e.agentSessionId)),e.info.archived=!0,this.emitStatus(e,`exited`,`resume failed`),this.flushBroadcast(e),this.persistence.queueMetaWrite(e.info.threadId,this.buildMeta(e)),await this.persistence.whenIdle(e.info.threadId),e.baseSeq=e.info.lastSeq+1,e.events=[]}async awaitReplayQuiescence(e){let t=Date.now()+3e3;for(;Date.now()-e.lastSuppressedAt<300&&Date.now()<t;)await new Promise(e=>setTimeout(e,50))}sendPrompt(e,t,n){let r=this.mustGet(e);if(r.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it first`);if(r.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(r.authInFlight)throw new ND(`not-ready`,`the thread is still signing in`);if(r.sessionId===null||r.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(r.turnActive){let e=r.info.queue??[];if(e.length>=20)throw new ND(`not-ready`,`20 messages are already waiting — let the agent catch up`);let i={id:crypto.randomUUID(),content:t,ts:Date.now()};n!==void 0&&n.length>0&&(i.attachments=n),r.info.queue=[...e,i],r.info.lastActivityAt=Date.now(),this.emitInfo(r);return}this.dispatchPrompt(r,t,n,{echo:!0})}steerPrompt(e,t,n){let r=this.mustGet(e);if(r.info.archived===!0)throw new ND(`not-ready`,`the thread is archived — resume it first`);if(r.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(r.authInFlight)throw new ND(`not-ready`,`the thread is still signing in`);if(r.sessionId===null||r.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(!r.turnActive){this.dispatchPrompt(r,t,n,{echo:!0});return}this.clearSteer(r);let i={content:t,ts:Date.now()};n!==void 0&&n.length>0&&(i.attachments=n),r.info.steer=i,r.info.lastActivityAt=Date.now(),this.emitInfo(r);let a=setTimeout(()=>this.demoteStalledSteer(r),this.steerStallMs);a.unref?.(),r.steerStallTimer=a,this.cancelTurn(r,{clearQueue:!1})}demoteStalledSteer(e){e.steerStallTimer=null;let t=e.info.steer;if(t===void 0||e.closed||!e.turnActive)return;e.info.steer=void 0;let n={id:crypto.randomUUID(),content:t.content,ts:t.ts};t.attachments!==void 0&&t.attachments.length>0&&(n.attachments=t.attachments),e.info.queue=[n,...e.info.queue??[]],this.emitInfo(e)}clearSteer(e){e.steerStallTimer!==null&&(clearTimeout(e.steerStallTimer),e.steerStallTimer=null),e.info.steer=void 0}takeSteer(e){let t=e.info.steer;return t===void 0?null:(this.clearSteer(e),t)}editQueued(e,t,n){let r=this.mustGet(e),i=r.info.queue??[];return i.some(e=>e.id===t)?(r.info.queue=i.map(e=>e.id===t?{...e,content:n,held:!1}:e),this.emitInfo(r),this.drainIfIdle(r),!0):!1}holdQueued(e,t,n){let r=this.mustGet(e),i=r.info.queue??[];return i.some(e=>e.id===t)?(r.info.queue=i.map(e=>e.id===t?{...e,held:n}:e),this.emitInfo(r),n||this.drainIfIdle(r),!0):!1}removeQueued(e,t){let n=this.mustGet(e),r=n.info.queue??[],i=r.filter(e=>e.id!==t);return i.length===r.length?!1:(n.info.queue=i.length>0?i:void 0,this.emitInfo(n),!0)}drainIfIdle(e){if(e.turnActive||e.closed||e.resumeInFlight||e.info.archived===!0||e.sessionId===null||e.conn===null)return;let t=this.takeNextQueued(e);t!==null&&this.dispatchPrompt(e,t.content,t.attachments,{echo:!0})}takeNextQueued(e){let t=e.info.queue;if(t===void 0||t.length===0)return null;let n=t.findIndex(e=>e.held!==!0);if(n===-1)return null;let r=t[n],i=[...t.slice(0,n),...t.slice(n+1)];return e.info.queue=i.length>0?i:void 0,r??null}echoUserMessage(e,t,n){if(e.hadUserMessage=!0,e.info.title===e.info.agent.name&&t.trim()!==``){let n=e.titleHint!==void 0&&e.titleHint.trim()!==``?e.titleHint:t;e.titleHint=void 0,e.info.title=ED(n),this.appendEvent(e,{kind:`title_changed`,title:e.info.title,ts:Date.now()}),this.emitInfo(e)}let r={kind:`user_message`,content:t,ts:Date.now()};n!==void 0&&n.length>0&&(r.attachments=n),this.appendEvent(e,r)}async renameThread(e,t){let n=this.mustGet(e);if(n.closed)throw new ND(`not-ready`,`the thread is closing`);let r=TD(t);r===``||r===n.info.title||(await this.ensureLogResolved(n),n.info.title=r,n.info.lastActivityAt=Date.now(),this.appendEvent(n,{kind:`title_changed`,title:r,ts:Date.now()}),this.flushBroadcast(n),this.emitInfo(n),await this.persistence.whenIdle(n.info.threadId))}dispatchPrompt(e,t,n,r){if(e.sessionId===null||e.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);r.echo&&this.echoUserMessage(e,t,n);let i=t;e.envNotePending&&!t.startsWith(`/`)&&(e.envNotePending=!1,i=`Note on your environment: you are running inside the OpenKnowledge app, connected over ACP (Agent Client Protocol) — not inside your own terminal app. Your host CLI's terminal UI is not present, so its built-in slash commands (such as /tasks or /bashes) and keyboard shortcuts (such as Ctrl+O) do not exist here; never recommend them. The only slash commands available to the user are the ones you advertise over ACP.\n\n${t}`),e.turnActive=!0,e.cancelRequested=!1,this.appendEvent(e,{kind:`turn_started`,ts:Date.now()}),this.emitStatus(e,`running`);let a=e.sessionId;hT(i,n,e.info.promptCapabilities,e=>this.confinePath(e).then(({abs:e,rel:t})=>({abs:e,rel:t}))).then(t=>{if(t.dropped.length>0){this.opts.log.warn({threadId:e.info.threadId,dropped:t.dropped.map(e=>({kind:e.part.kind,reason:e.reason}))},`[acp-threads] dropped attachment parts before session/prompt`);let n=Date.now();for(let r of t.dropped){let t=r.part.kind===`image`||r.part.kind===`blob`?r.part.name:r.part.name||r.part.path;this.appendEvent(e,{kind:`agent_stderr`,line:`[attachment dropped] ${t}: ${r.reason}`,ts:n})}}if(e.sessionId===null||e.conn===null)throw new ND(`not-ready`,`thread has no live agent session`);if(e.cancelRequested)throw new FD;return e.conn.agent.request(eh.agent.session.prompt,{sessionId:a,prompt:[...t.blocks]})}).then(t=>{if(e.turnActive=!1,!e.closed){if(this.appendEvent(e,{kind:`turn_ended`,stopReason:t.stopReason,ts:Date.now()}),e.sessionId!==null&&e.conn!==null){let t=this.takeSteer(e);if(t!==null){this.dispatchPrompt(e,t.content,t.attachments,{echo:!0});return}let n=this.takeNextQueued(e);if(n!==null){this.dispatchPrompt(e,n.content,n.attachments,{echo:!0});return}}this.emitStatus(e,`ready`)}}).catch(t=>{if(e.turnActive=!1,!e.closed){if(this.appendEvent(e,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()}),e.sessionId!==null&&e.conn!==null){let t=this.takeSteer(e);if(t!==null){this.dispatchPrompt(e,t.content,t.attachments,{echo:!0});return}}if(e.cancelRequested){this.emitStatus(e,`ready`),this.drainIfIdle(e);return}if(WD(t)){this.emitStatus(e,`auth_required`,`sign in required: ${GD(t)}`,{reason:`auth-required`,agentMessage:GD(t),machineDetail:XD(t,e),authMethods:ZD(e.lastInit?.authMethods)});return}this.emitStatus(e,`error`,`prompt failed: ${GD(t)}`,{reason:`prompt`,agentMessage:GD(t),machineDetail:YD(KD(t),JD(e))})}})}cancel(e){this.cancelTurn(this.mustGet(e),{clearQueue:!0})}cancelTurn(e,t){t.clearQueue&&(e.info.queue!==void 0||e.info.steer!==void 0)&&(e.info.queue=void 0,this.clearSteer(e),this.emitInfo(e)),!(e.conn===null||e.sessionId===null)&&(e.turnActive&&(e.cancelRequested=!0),this.failPendingPermissions(e),this.restoreRunningAfterPermission(e),e.conn.agent.notify(eh.agent.session.cancel,{sessionId:e.sessionId}).catch(t=>{this.opts.log.debug({err:t,threadId:e.info.threadId},`[acp-threads] cancel notification never reached the agent`)}))}setMode(e,t){let n=this.mustGet(e);if(n.info.archived===!0){let e=n.info.modes;if(e==null||!e.availableModes.some(e=>e.id===t))throw new ND(`not-ready`,`no such mode: ${t}`);n.info.modes={...e,currentModeId:t},this.emitInfo(n);return}if(n.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(n.conn===null||n.sessionId===null)throw new ND(`not-ready`,`thread has no live agent session`);n.conn.agent.request(eh.agent.session.setMode,{sessionId:n.sessionId,modeId:t}).then(()=>{n.info.modes&&(n.info.modes={...n.info.modes,currentModeId:t},this.emitInfo(n))}).catch(t=>{this.opts.log.warn({err:t,threadId:e},`[acp-threads] set_mode failed`)})}setConfigOption(e,t,n){let r=this.mustGet(e);if(r.info.archived===!0){let e=(r.info.configOptions??[]).find(e=>e.id===t);if(e===void 0)throw new ND(`not-ready`,`no such config option: ${t}`);if(!HD(e,n))throw new ND(`not-ready`,`invalid value for ${t}`);r.info.configOptions=(r.info.configOptions??[]).map(e=>e.id===t?{...e,currentValue:n}:e),this.emitInfo(r);return}if(r.resumeInFlight)throw new ND(`not-ready`,`the thread is still resuming`);if(r.conn===null||r.sessionId===null)throw new ND(`not-ready`,`thread has no live agent session`);let i=typeof n==`boolean`?{sessionId:r.sessionId,configId:t,type:`boolean`,value:n}:{sessionId:r.sessionId,configId:t,value:n};r.conn.agent.request(eh.agent.session.setConfigOption,i).then(e=>{r.info.configOptions=e.configOptions,this.emitInfo(r)}).catch(n=>{this.opts.log.warn({err:n,threadId:e,configId:t},`[acp-threads] set_config_option failed`)})}async applyInitialConfig(e,t,n,r=!1){let i=e.sessionId;if(i===null)return;let a=t=>(e.info.configOptions??[]).find(e=>e.id===t)?.category===`model`,o=Object.keys(n).sort((e,t)=>Number(a(t))-Number(a(e))),s=!1,c=[];for(let a of o){let o=n[a];if(o===void 0)continue;let l=(e.info.configOptions??[]).find(e=>e.id===a);if(l===void 0||!r&&l.currentValue===o||!HD(l,o))continue;let u=typeof o==`boolean`?{sessionId:i,configId:a,type:`boolean`,value:o}:{sessionId:i,configId:a,value:o};try{let n=await t.agent.request(eh.agent.session.setConfigOption,u);e.info.configOptions=n.configOptions,s=!0}catch(t){c.push(a),this.opts.log.warn({err:t,threadId:e.info.threadId,configId:a},`[acp-threads] initial config apply failed`)}if(e.closed)return}c.length>0&&this.opts.log.warn({threadId:e.info.threadId,rejectedConfigIds:c,sessionStateUnknown:r},`[acp-threads] some remembered config options could not be applied to the new session`),s&&this.emitInfo(e)}async applyInitialMode(e,t,n,r=!1){let i=e.sessionId;if(i===null)return;let a=e.info.modes;if(a!=null&&a.availableModes.some(e=>e.id===n)){if(!r&&a.currentModeId===n)return;try{await t.agent.request(eh.agent.session.setMode,{sessionId:i,modeId:n}),e.info.modes={...a,currentModeId:n},this.emitInfo(e)}catch(t){this.opts.log.warn({err:t,threadId:e.info.threadId,modeId:n,method:`set_mode`},`[acp-threads] initial mode apply failed`)}return}let o=(e.info.configOptions??[]).find(e=>e.category===`mode`&&HD(e,n));if(o!==void 0&&!(!r&&o.currentValue===n))try{let r=await t.agent.request(eh.agent.session.setConfigOption,{sessionId:i,configId:o.id,value:n});e.info.configOptions=r.configOptions,this.emitInfo(e)}catch(t){this.opts.log.warn({err:t,threadId:e.info.threadId,modeId:n,method:`set_config_option`},`[acp-threads] initial mode apply failed`)}}respondPermission(e,t,n){let r=this.mustGet(e),i=r.pendingPermissions.get(t);i!==void 0&&(r.pendingPermissions.delete(t),clearTimeout(i.timer),n.kind===`selected`?(i.resolve({outcome:{outcome:`selected`,optionId:n.optionId}}),this.appendEvent(r,{kind:`permission_resolved`,requestId:t,optionId:n.optionId,auto:!1,ts:Date.now()})):(i.resolve({outcome:{outcome:`cancelled`}}),this.appendEvent(r,{kind:`permission_resolved`,requestId:t,optionId:null,auto:!1,ts:Date.now()})),this.restoreRunningAfterPermission(r))}restoreRunningAfterPermission(e){e.pendingPermissions.size===0&&e.turnActive&&e.info.status===`awaiting_permission`&&this.emitStatus(e,`running`)}async closeThread(e,t){let n=this.threads.get(e);if(n===void 0||n.info.archived===!0||n.closed)return;n.closed=!0,this.clearSteer(n),this.failPendingPermissions(n),this.failPendingConsents(n);try{n.conn?.close()}catch{}let r=n.child;r!==null&&(await HE(r,{graceMs:t?.killGraceMs??jD})||this.opts.log.error({threadId:e,pid:r.pid},`[acp-threads] agent process survived SIGKILL escalation`)),n.child=null,n.conn=null,n.lastInit=null,await n.terminals?.disposeAll(),n.terminals=null,this.opts.agentPresenceBroadcaster?.clearPresence(xh(n.agentSessionId)),await this.opts.sessionManager.closeAllForAgent(n.agentSessionId).catch(t=>{this.opts.log.warn({err:t,threadId:e},`[acp-threads] session cleanup failed`)});let i=n.info.status===`error`||n.info.status===`auth_required`;if(!n.hadUserMessage&&!i){this.threads.delete(e),n.subscribers.clear(),n.flushTimer!==null&&(clearTimeout(n.flushTimer),n.flushTimer=null),await this.persistence.whenIdle(e),await this.persistence.delete(e),this.opts.log.info({threadId:e},`[acp-threads] empty thread discarded on close`);return}n.turnActive&&(n.turnActive=!1,this.appendEvent(n,{kind:`turn_ended`,stopReason:`cancelled`,ts:Date.now()})),n.info.archived=!0,this.emitStatus(n,`exited`,`thread closed`),this.flushBroadcast(n),this.persistence.queueMetaWrite(e,this.buildMeta(n)),await this.persistence.whenIdle(e),n.baseSeq=n.info.lastSeq+1,n.events=[],n.pendingBroadcast=[],n.closed=!1,this.opts.log.info({threadId:e},`[acp-threads] thread archived`)}async deleteThread(e){let t=this.mustGet(e);if(t.info.archived!==!0)throw new ND(`not-ready`,`close the thread before deleting it`);if(t.resumeInFlight)throw new ND(`not-ready`,`a resume is in progress`);this.threads.delete(e),t.subscribers.clear(),t.flushTimer!==null&&(clearTimeout(t.flushTimer),t.flushTimer=null),await this.persistence.whenIdle(e),await this.persistence.delete(e),this.opts.log.info({threadId:e},`[acp-threads] thread deleted`)}async destroy(){this.destroyed=!0,clearInterval(this.reapTimer),await Promise.allSettled([...this.threads.keys()].map(e=>this.closeThread(e,{killGraceMs:MD})))}async handlePermissionRequest(e,t,n){e.info.lastActivityAt=Date.now();let r=this.opts.permissions.decide(e.info.agent.id,t,n);if(r.auto!==null){let t=crypto.randomUUID();return this.appendEvent(e,{kind:`permission_resolved`,requestId:t,optionId:r.auto.optionId,auto:!0,ts:Date.now()}),{outcome:{outcome:`selected`,optionId:r.auto.optionId}}}let i=crypto.randomUUID();return this.appendEvent(e,{kind:`permission_request`,requestId:i,toolCall:t,options:n,ts:Date.now()}),e.turnActive&&e.info.status===`running`&&this.emitStatus(e,`awaiting_permission`),new Promise(r=>{let a=setTimeout(()=>{e.pendingPermissions.delete(i),this.appendEvent(e,{kind:`permission_resolved`,requestId:i,optionId:null,auto:!0,ts:Date.now()}),this.restoreRunningAfterPermission(e),r({outcome:{outcome:`cancelled`}})},6e5);a.unref?.(),e.pendingPermissions.set(i,{timer:a,resolve:i=>{if(i.outcome.outcome===`selected`){let r=n.find(e=>i.outcome.outcome===`selected`&&e.optionId===i.outcome.optionId);r!==void 0&&this.opts.permissions.recordChoice(e.info.agent.id,t,r)}r(i)}})})}handleSessionUpdate(e,t){e.info.lastActivityAt=Date.now();let n=t.update;if(n.sessionUpdate===`current_mode_update`&&e.info.modes&&(e.info.modes={...e.info.modes,currentModeId:n.currentModeId},this.emitInfo(e)),n.sessionUpdate===`config_option_update`&&(e.info.configOptions=n.configOptions,this.emitInfo(e)),n.sessionUpdate===`available_commands_update`&&(e.info.availableCommands=n.availableCommands,this.emitInfo(e)),e.suppressUpdates){e.lastSuppressedAt=Date.now();return}this.appendEvent(e,{kind:`session_update`,update:bT(n),ts:Date.now()})}async handleFsRead(e,t,n){let r=await this.confinePath(e),i;if(i=r.docName===null?await pd(r.abs,`utf8`):this.opts.getLoadedDocText?.(r.docName)??await pd(r.abs,`utf8`),t!==null||n!==null){let e=i.split(`
30
30
  `),r=Math.max((t??1)-1,0),a=n===null?e.length:r+n;i=e.slice(r,a).join(`
31
31
  `)}return{content:i}}async handleFsWrite(e,t,n){e.info.lastActivityAt=Date.now();let r=await this.confinePath(t);if(r.docName!==null){let t=await this.opts.sessionManager.getSession(r.docName,e.agentSessionId,{displayName:e.info.agent.name,colorSeed:e.agentSessionId,clientName:e.info.agent.id}),i=this.opts.resolveEmbed===void 0?void 0:{resolveEmbed:this.opts.resolveEmbed,sourcePath:r.rel};t.dc.document.transact(()=>{let r=ww(t.dc.document);Cw(t.dc.document,n,`replace`,i,void 0,xw(t));let a=Ri(r,ww(t.dc.document))??void 0;t.dc.document.getMap(`agent-flash`).set(e.agentSessionId,{agentId:e.agentSessionId,timestamp:Date.now(),type:`insert`,description:`Added (${e.info.agent.name}): ${n.slice(0,50)}`,...a===void 0?{}:{changedBlocks:a}})},t.origin),this.setPresence(e,r.docName)}else{if(this.opts.isIgnoredPath(r.rel))throw Error(`path is excluded from the project content scope: ${t}`);let{tracedMkdir:e,tracedWriteFile:i}=await import(`./fs-traced-DjggEXdh.mjs`);await e(P(r.abs),{recursive:!0}),await i(r.abs,n)}}confinePath(e){return BD(this.opts.contentDir,e,this.opts.isExcludedPath)}mustGet(e){let t=this.threads.get(e);if(t===void 0)throw new ND(`unknown-thread`,`no thread '${e}'`);return t}appendEvent(e,t){let n=e.pendingBroadcast;if(n.length>0&&TT(n[n.length-1],t))return;let r=e.baseSeq+e.events.length;if(e.events.push(t),e.info.lastSeq=r,e.events.length>OD){let t=e.events.length-OD;e.events.splice(0,t),e.baseSeq+=t}e.pendingBroadcast.length===0&&(e.pendingBroadcastFromSeq=r),e.pendingBroadcast.push(t),e.flushTimer===null&&(e.flushTimer=setTimeout(()=>this.flushBroadcast(e),25),e.flushTimer.unref?.())}flushBroadcast(e){if(e.flushTimer!==null&&(clearTimeout(e.flushTimer),e.flushTimer=null),e.pendingBroadcast.length===0)return;let t={op:`events`,threadId:e.info.threadId,fromSeq:e.pendingBroadcastFromSeq,events:e.pendingBroadcast};this.persistence.appendEvents(e.info.threadId,e.pendingBroadcast),e.pendingBroadcast=[];for(let n of e.subscribers)try{n(t)}catch{}}emitStatus(e,t,n,r){(t===`exited`||t===`error`)&&(e.info.queue=void 0,this.clearSteer(e)),e.info.status=t,e.info.lastActivityAt=Date.now(),(t===`error`||t===`auth_required`)&&this.opts.log.warn({threadId:e.info.threadId,agentId:e.info.agent.id,status:t,detail:n,reason:r?.reason,machineDetail:r?.machineDetail},`[acp-threads] thread failure status`),this.appendEvent(e,{kind:`status`,status:t,detail:n,...r===void 0?{}:{failure:r},ts:Date.now()}),this.emitInfo(e)}async teardownFailedAgent(e){let t=e.child,n=e.conn,r=e.terminals;e.child=null,e.conn=null,e.lastInit=null,e.terminals=null;try{n?.close()}catch{}await r?.disposeAll().catch(t=>{this.opts.log.warn({err:t,threadId:e.info.threadId},`[acp-threads] terminal cleanup on failed-agent teardown failed`)}),t!==null&&await HE(t,{graceMs:jD})}emitInfo(e){this.persistence.queueMetaWrite(e.info.threadId,this.buildMeta(e)),this.broadcastInfo(e)}broadcastInfo(e){for(let t of e.subscribers)try{t({op:`info`,info:{...e.info}})}catch{}}closeSignInCapture(e){e.authStderr=null,e.info.signInOutput!==void 0&&(e.info.signInOutput=void 0,this.broadcastInfo(e))}buildMeta(e){let{queue:t,steer:n,signInOutput:r,...i}=e.info;return{version:1,info:i,sessionId:e.sessionId,cwd:e.cwd,agentRef:e.agentRef,docName:e.docName}}failPendingPermissions(e){for(let[t,n]of e.pendingPermissions)clearTimeout(n.timer),n.resolve({outcome:{outcome:`cancelled`}}),this.appendEvent(e,{kind:`permission_resolved`,requestId:t,optionId:null,auto:!0,ts:Date.now()});e.pendingPermissions.clear()}failPendingConsents(e){for(let t of[e.pendingRuntimeConsent,e.pendingPiBridgeConsent]){for(let e of t.values())clearTimeout(e.timer),e.resolve(`closed`);t.clear()}}setPresence(e,t){let n=this.opts.agentPresenceBroadcaster;if(n!=null)try{let r=ds(e.info.agent.id),i=ui[r]??_s(e.agentSessionId);n.setPresence(xh(e.agentSessionId),{displayName:e.info.agent.name,icon:r,color:i,currentDoc:t,mode:`writing`,ts:Date.now(),docTs:Date.now()})}catch(e){this.opts.log.warn({err:e},`[acp-threads] presence update failed`)}}reapIdleThreads(){let e=Date.now(),t=e-this.idleReapMs;for(let n of this.threads.values()){if(n.info.archived===!0)continue;if(n.subscribers.size===0&&!n.turnActive&&n.info.lastActivityAt<t){this.opts.log.info({threadId:n.info.threadId},`[acp-threads] reaping idle thread`),this.closeThread(n.info.threadId).catch(e=>{this.opts.log.error({err:e,threadId:n.info.threadId},`[acp-threads] reap failed`)});continue}if(!n.turnActive||n.unwatchedSince===null)continue;let r=e-n.unwatchedSince;r>=this.unwatchedTurnKillMs?(this.opts.log.warn({threadId:n.info.threadId,unwatchedFor:r},`[acp-threads] force-closing unwatched turn that ignored cancel`),this.closeThread(n.info.threadId).catch(e=>{this.opts.log.error({err:e,threadId:n.info.threadId},`[acp-threads] force-close failed`)})):r>=this.unwatchedTurnCancelMs&&!n.unwatchedCancelSent&&(n.unwatchedCancelSent=!0,this.opts.log.warn({threadId:n.info.threadId,unwatchedFor:r},`[acp-threads] cancelling turn running with zero subscribers`),this.cancel(n.info.threadId))}}};async function BD(e,t,n){let r=await hd(e),i=ju(Au(t)?t:L(r,t)),a=i,o=``;for(;;)try{let e=await hd(a),i=o===``?e:F(e,o),s=I(r,i);if(s===``||s.startsWith(`..`)||Au(s))throw Error(`path escapes the content directory: ${t}`);let c=/\.(md|mdx)$/.exec(s),l=null;if(c!==null){let e=s.slice(0,-c[0].length).split(R).join(`/`),t=s.split(R).join(`/`);!iS(e)&&!aS(e)&&!n(t)&&(l=e)}return{abs:i,rel:s.split(R).join(`/`),docName:l}}catch(e){if(e.code!==`ENOENT`)throw e;let t=P(a);if(t===a)throw e;o=o===``?i.slice(t.length+1):F(a.slice(t.length+1),o),a=t}}function VD(e){let t=e.info.status===`error`?`error`:`exited`;return{info:{...e.info,status:t,archived:!0,queue:void 0,steer:void 0,signInOutput:void 0},docName:e.docName,agentRef:e.agentRef,cwd:e.cwd,child:null,conn:null,lastInit:null,sessionId:e.sessionId,agentSessionId:`acp-${e.info.threadId}`,events:[],baseSeq:e.info.lastSeq+1,logResolved:!1,logResolution:null,midTurnOnDisk:!1,resumeInFlight:!1,authInFlight:!1,suppressUpdates:!1,lastSuppressedAt:0,subscribers:new Set,pendingPermissions:new Map,pendingRuntimeConsent:new Map,pendingPiBridgeConsent:new Map,piBridgeDeclined:!1,lastPiBridgeStatus:null,stderrTail:[],authStderr:null,terminals:null,turnActive:!1,cancelRequested:!1,steerStallTimer:null,unwatchedSince:null,unwatchedCancelSent:!1,pendingBroadcast:[],pendingBroadcastFromSeq:0,flushTimer:null,closed:!1,hadUserMessage:!0,envNotePending:!1}}function HD(e,t){if(typeof t==`boolean`)return e.type===`boolean`;if(e.type!==`select`)return!1;for(let n of e.options)if(`value`in n){if(n.value===t)return!0}else if(n.options.some(e=>e.value===t))return!0;return!1}function UD(e){let t=YE(e),n=e===`node`?`https://nodejs.org`:`https://docs.astral.sh/uv/getting-started/installation/`;return`This agent needs \`${t.provides}\`, which isn't installed. OK can download a private copy of ${t.displayName} for you, or install ${t.displayName} yourself (${n}) and it'll be used automatically.`}function WD(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.code===-32e3||typeof t.data==`object`&&t.data!==null&&t.data.errorKind===`authentication_failed`}function GD(e){return e instanceof Error?e.message:String(e)}function KD(e){if(typeof e!=`object`||!e)return;let t=e.data;if(t!=null)try{return JSON.stringify(t).slice(0,300)}catch{return}}function qD(e){for(let t=e.events.length-1;t>=0;--t){let n=e.events[t];if(!(n===void 0||n.kind!==`status`)&&!(n.status!==`error`&&n.status!==`auth_required`))return n.detail??n.failure?.agentMessage}}function JD(e){let t=e.stderrTail.join(`
32
32
  `);return t===``?void 0:t}function YD(...e){let t=e.filter(e=>e!==void 0&&e!==``).join(`
@@ -2026,4 +2026,4 @@ native-divergence-injected
2026
2026
  `))e&&await t.raw(`update-ref`,`-d`,e)}),b.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`))}catch(e){b.error({err:e},`[branch-switch] detached cleanup failed`)}ee(!1),await M.flushDeferredStores(`discard-stale`),t=!0,ke?.emitBranchSwitched(i)}finally{ye.abortBranchSwitch(r),t||(ee(!1),await M.flushDeferredStores(`discard-stale`))}}if(e.headMoved&&e.newHead&&be.current&&t>0){let t=p??`.`;try{let n=await Ix(be.current,t,e.oldHead,e.newHead,i);ex(),b.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:n.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${n.slice(0,8)}`)}catch(e){b.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){b.error({err:e},`[server] HEAD watcher failed to start`),rn.push(`head-watcher`)}function l(e){for(let t of e)try{let e=QM(I(n,F(r,t)));if(e.startsWith(`..`))continue;let i=Jx(e),a=Ce.documents.get(i);if(!a)continue;let o=zt(i);o===null?b.warn({docName:i,file:t},`[sync] content conflict: serializeDoc returned null; reconciledBase snapshot skipped`):w(i,o);let s=a.getMap(`lifecycle`);s.set(`status`,`conflict`),s.set(`reason`,`sync-merge-conflict`),b.info({docName:i,file:t},`[sync] marked loaded content conflict`)}catch(e){b.warn({err:e,file:t},`[sync] failed to mark loaded content conflict`)}}function d(e){for(let t of e)try{let e=QM(I(n,F(r,t)));if(e.startsWith(`..`))continue;let i=Ce.documents.get(Jx(e));i&&Vt(i)}catch(e){b.warn({err:e,file:t},`[sync] failed to clear resolved content conflict`)}}let f=ZF(r);b.debug({resetAmbientCredentials:f,originKind:YF(r).kind},`[sync] ambient credential-chain reset decision at boot`);let m=Oc(h,{resetAmbient:f}),g=re();g.mode!==`off`&&b.info({mode:g.mode,source:g.source},`[sync] mode active at boot`);try{$t=new lPe({projectDir:r,contentDir:n,contentFilter:ge,contentRoot:p,mcpTomlEditor:e.mcpTomlEditor,mode:g.mode,pullIntervalSeconds:e.pullIntervalSeconds,pushIntervalSeconds:e.pushIntervalSeconds,credentialConfig:m,cc1Broadcaster:ke,detectGh:e.detectGh,tokenStore:e.tokenStore,checkPushPermissionFn:e.checkPushPermissionFn,setBatchInProgress:e=>{ee(e),e||M.flushDeferredStores(`within-branch`).catch(e=>{b.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{b.info({state:e},`[sync] state → ${e}`)},onContentConflictsDetected:l,onContentConflictsResolved:d,checkpointBeforeStrandedConversion:async({branch:e,ahead:t})=>{let n=be.current;n&&await Rx(n,p??``,{action:`pull-only-stranded-conversion`,context:{ahead:t}},e)},checkpointBeforeOverlayRestore:async({branch:e,paths:t})=>{let n=be.current;n&&await Rx(n,p??``,{action:`pull-only-overlay-restore`,context:{paths:t}},e)},onAutoDisable:async e=>{b.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await Ns({cwd:r,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||b.error({result:t,reason:e,humanError:Ee(t.error),configPath:Qs(`project-local`,r)},`[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 $t.start()}catch(e){b.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),$t=null}Je(`files`),ye.announceReadyViews();let _=BL();_!==void 0&&VL(`readyMs`,_),oe()}return an().then(()=>{Qe=!0,He(),dt()},e=>{$e=!0,et.abort(),ct({status:`failed`,indexCount:0}),ye.close(),Ge(),Ue(e)}),{hocuspocus:Ce,durabilityState:x,sessionManager:we,nativeApi:Te,localApi:De,cc1Broadcaster:ke,agentFocusBroadcaster:je,agentPresenceBroadcaster:Me,maintenanceCoordinator:j,contentFilter:ge,basenameIndex:pe,serverInstanceId:ue,destroy:nn,ready:We,generatedIndexSweepReady:st,degraded:rn,lockDir:de,get syncEngine(){return $t},getLinkPreviewsEnabled:k,resolveEmbed:me,acpRegistry:fe,acpPermissions:A}}function l9(e){return e/1048576}function hPe(){let e=process.memoryUsage();return{schemaVersion:1,capturedAt:new Date().toISOString(),snapshot:{rssMb:l9(e.rss),heapTotalMb:l9(e.heapTotal),heapUsedMb:l9(e.heapUsed),externalMb:l9(e.external),arrayBuffersMb:l9(e.arrayBuffers)}}}let u9=null,d9=null,f9=null;const p9=1e6;let m9=null,h9=null;Bs(()=>{u9=null,d9=null,f9=null,m9?.disable(),m9=null,h9=null});function gPe(){if(u9)return;let e=dc().createObservableGauge(`ok.server.memory.usage_megabytes`,{description:`Server process memory by section. Bounded labels: section ∈ {heap_used, heap_total, rss, external, array_buffers}.`,unit:`MB`});e.addCallback(e=>{let{snapshot:t}=hPe();e.observe(t.heapUsedMb,{section:`heap_used`}),e.observe(t.heapTotalMb,{section:`heap_total`}),e.observe(t.rssMb,{section:`rss`}),e.observe(t.externalMb,{section:`external`}),e.observe(t.arrayBuffersMb,{section:`array_buffers`})}),u9=e}function _Pe(){if(!d9){let e=dc().createObservableGauge(`ok.server.event_loop.delay_ms`,{description:`Event-loop delay percentiles over the last export window. Bounded labels: stat ∈ {p50, p99}.`,unit:`ms`});e.addCallback(e=>{if(!m9){m9=Dte({resolution:20}),m9.enable();return}e.observe(m9.percentile(50)/p9,{stat:`p50`}),e.observe(m9.percentile(99)/p9,{stat:`p99`}),m9.reset()}),d9=e}if(!f9){let e=dc().createObservableGauge(`ok.server.cpu.utilization`,{description:`Process CPU time as a fraction of wall time since the previous export. Bounded labels: mode ∈ {user, system}.`,unit:`1`});e.addCallback(e=>{let t=process.cpuUsage(),n=process.hrtime.bigint(),r=h9;if(h9={cpu:t,hrtimeNs:n},!r)return;let i=Number(n-r.hrtimeNs)/1e3;i<=0||(e.observe((t.user-r.cpu.user)/i,{mode:`user`}),e.observe((t.system-r.cpu.system)/i,{mode:`system`}))}),f9=e}}const g9=N(`skill-migrate`);function _9(e){return[{host:`agents`,root:Pi},...Object.entries(e).filter(e=>e[1]!==null).map(([e,t])=>({host:e,root:t}))].sort((e,t)=>{let n=YO.indexOf(e.host),r=YO.indexOf(t.host);return(n===-1?YO.length:n)-(r===-1?YO.length:r)||e.host.localeCompare(t.host)})}const vPe=_9(Mn),yPe=_9(Bn);function bPe(e,t){return z(L(e,st(t)))}function xPe(e,t){$s(P(t),{recursive:!0});try{Ks(e,t)}catch(n){if(!(n instanceof Error)||n.code!==`EXDEV`)throw n;nc(e,t,{recursive:!0}),rc(e,{recursive:!0,force:!0})}}function SPe(e,t,n){let r=YI(e,t,n);switch(r.kind){case`absent`:return{kind:`absent`};case`other`:return{kind:`occupied`,by:`different`};case`symlink`:return r.resolution===`target`?{kind:`store-link`}:{kind:`occupied`,by:`foreign-link`};case`dir`:return r.identity===`different`?{kind:`occupied`,by:`different`}:{kind:`same-copy`}}}function v9(e,t){let n;try{n=V(L(e,`.ok`,`skills`))}catch{n=L(e,`.ok`,`skills`)}return new Set(t.filter(t=>{try{return!V(L(e,t.dir)).startsWith(n+R)}catch{return!0}}).map(e=>e.name))}async function y9(e){let{projectDir:t,skillsRoot:n}=e,r=e.inPlaceNames??new Set,i=e.hostRoots??vPe,a={migrated:[],skipped:[]};if(!z(n))return a;let o;try{o=Zu(n)}catch{return a}let s=I(t,n).split(R).join(`/`),c=new Set;for(let[e,n]of Object.entries($Y(t)))for(let t of n)t.path.split(`/`).slice(0,-1).join(`/`)===s&&c.add(e);for(let e of o)try{if(!oo.test(e)||uI.has(e))continue;if(r.has(e)){a.skipped.push({name:e,reason:`placement-of-in-place`});continue}if(c.has(e)){a.skipped.push({name:e,reason:`recorded-placement`});continue}let o=L(n,e);if(!z(F(o,`SKILL.md`)))continue;let s=RO(o)?.contentHash;if(s===void 0)continue;let l=V(o),u=i.map(({host:n,root:r})=>{let i=L(t,r);return{host:n,root:r,path:F(i,e),escapes:rL(t,i),state:SPe(F(i,e),l,s)}}).filter(e=>!e.escapes),d=u.find(e=>e.state.kind===`store-link`||e.state.kind===`same-copy`)??u.find(e=>bPe(t,e.root));if(!d){a.skipped.push({name:e,reason:`no-usable-target`});continue}if(d.state.kind===`occupied`){a.skipped.push({name:e,reason:`target-occupied:${d.root} (${d.state.by})`});continue}d.state.kind===`same-copy`?rc(o,{recursive:!0,force:!0}):(d.state.kind===`store-link`&&rc(d.path,{recursive:!0,force:!0}),xPe(o,d.path));for(let e of u)e===d||e.state.kind!==`store-link`||(rc(e.path,{recursive:!0,force:!0}),nc(d.path,e.path,{recursive:!0}));await MN(t,e),a.migrated.push({name:e,to:`${d.root}/${e}`}),g9.info({skill:e,to:`${d.root}/${e}`},`migrated store skill in place`)}catch(t){a.skipped.push({name:e,reason:`error`}),g9.warn({err:t,skill:e},`store-skill migration skipped one entry after error`)}return a}const b9=N(`skill-reconcile`),CPe=uI;function x9(){let e=[];for(let t of Rt){let n=Mn[t];n!==null&&e.push({rel:n,editor:t})}return e.push({rel:Pi,editor:null}),e}function wPe(e,t){let n=I(e,L(t));return Au(n)?L(t):n}function S9(e){let{frontmatter:t,body:n}=eo(e),r={};if(t!==``)try{let e=(0,_k.parse)(Fo(t));e&&typeof e==`object`&&!Array.isArray(e)&&(r=e)}catch{}return{fm:r,body:n}}function TPe(e,t){let n=S9(e),r=S9(t);if(n.body!==r.body)return!1;for(let e of Object.keys(n.fm))if(e in r.fm&&JSON.stringify(n.fm[e])!==JSON.stringify(r.fm[e]))return!1;return!0}function C9(e,t){let n=w9(e),r=w9(t);if(n.length!==r.length)return!1;let i=0;for(let a=0;a<n.length;a+=1){if(n[a]!==r[a])return!1;let o=n[a],s=F(e,o),c=F(t,o);if(i+=nd(s).size+nd(c).size,i>1048576)return!1;let l=B(s),u=B(c);if(!l.equals(u)&&(o!==`SKILL.md`||!TPe(l.toString(`utf8`),u.toString(`utf8`))))return!1}return!0}function w9(e,t=``){let n=[];for(let r of Zu(e,{withFileTypes:!0})){let i=t?`${t}/${r.name}`:r.name;r.isDirectory()?n.push(...w9(F(e,r.name),i)):r.isFile()&&n.push(i)}return n.sort()}function T9(e,t,n){rc(t,{recursive:!0,force:!0}),$s(e,{recursive:!0}),Ys(wPe(e,n),t,`dir`)}function E9(e,t){try{let n=Qu(e);return L(Au(n)?n:L(P(e),n))===L(t)}catch{return!1}}function EPe(e,t){try{let n=Qu(e),r=Au(n)?L(n):L(P(e),n);if(!z(r))return!1;let i=I(L(t),r);return i!==``&&(i.startsWith(`..`)||Au(i))}catch(t){return b9.warn({linkPath:e,err:t},`isForeignSymlink: could not resolve symlink; treating as reconcile-managed`),!1}}const DPe=[...Rt,`agents`];function OPe(e){for(let t of DPe){let n=`-${t}`;if(e.length>n.length&&e.endsWith(n))return e.slice(0,-n.length)}return null}function kPe(e){let{projectDir:t,skillsRoot:n}=e;if(!z(n))return;let r;try{r=Zu(n)}catch{return}let i=x9();for(let e of r){let r=OPe(e);if(r===null)continue;let a=L(n,e),o=L(n,r);if(z(o))try{let n=Gu(a);if(n.isSymbolicLink()||!n.isDirectory()||!z(F(a,`SKILL.md`))||!z(F(o,`SKILL.md`))||!C9(o,a))continue;for(let{rel:n}of i){let r=L(t,n);if(rL(t,r))continue;let i=F(r,e);E9(i,a)&&T9(r,i,o)}rc(a,{recursive:!0,force:!0}),b9.info({base:r,suffixed:e},`collapsed accreted suffix-duplicate skill into its base`)}catch(t){b9.warn({err:t,base:r,suffixed:e},`suffix-dupe collapse skipped one entry after error`)}}}async function APe(e){let{projectDir:t,skillsRoot:n}=e,r={healed:[],replaced:[],orphansRemoved:[],skipped:[]},i=new Map,a=(e,t)=>{if(t===null)return;let n=i.get(e)??new Set;n.add(t),i.set(e,n)};for(let{rel:e,editor:i}of x9()){let o=L(t,e);if(!z(o)||rL(t,o))continue;let s;try{s=Zu(o)}catch(e){b9.warn({hostRoot:o,err:e},`reconcile: skipped unreadable host skills root`);continue}for(let e of s){if(CPe.has(e))continue;let t=F(o,e),s=L(n,e),c=z(s);try{let l=Gu(t);if(l.isSymbolicLink()){if(E9(t,s)&&c)continue;if(EPe(t,n)){r.skipped.push({name:e,editor:i});continue}c?(T9(o,t,s),r.healed.push({name:e,editor:i})):(rc(t,{recursive:!0,force:!0}),r.orphansRemoved.push({name:e,editor:i}));continue}if(!l.isDirectory())continue;if(!oo.test(e)){b9.warn({skill:e,editor:i},`reconcile: skipping host-dir entry with a non-skill name`);continue}if(c&&C9(t,s)){T9(o,t,s),r.replaced.push({name:e,editor:i}),a(e,i);continue}r.skipped.push({name:e,editor:i})}catch(t){b9.warn({err:t,skill:e,editor:i},`reconcile skipped one skill entry after error`)}}}if(i.size>0){let e=kN(t);for(let[r,a]of i){let i=L(n,r);if(!z(i))continue;let o=e.skills[r],s=Array.from(new Set([...o?.hosts??[],...a]));try{await jN(t,r,{hosts:s,scope:o?.scope??`project`,scripts:o?.scripts??QI(i,r).hasScripts,installedAt:o?.installedAt??new Date().toISOString()})}catch(e){b9.warn({err:e,skill:r},`reconcile marker update failed (non-fatal)`)}}}try{kPe({projectDir:t,skillsRoot:n})}catch(e){b9.warn({err:e},`suffix-dupe collapse pass failed (non-fatal)`)}return r}let D9=null,O9=!1;function k9(e=process.env){return e.OK_BRIDGE_TOLERANCE_TELEMETRY===`1`}function A9(e){if(!k9())return;let t=Yk(e);D9=new vc({currentPath:L(t,`tolerance-telemetry.jsonl`),previousPath:L(t,`tolerance-telemetry.prev.jsonl`),maxBytes:8388608}),zt(e=>{let t={event:`bridge-tolerance-fire`,timestamp:e.timestamp,class:e.className,document:e.documentName??null,codeUnitPosition:e.codeUnitPosition,severity:e.severity};D9?.append(`${JSON.stringify(t)}\n`).catch(e=>{O9||(O9=!0,N(`tolerance-telemetry`).warn({err:e instanceof Error?e:Error(String(e))},`append failed; further failures are silent`))})})}async function j9(){zt(null),await D9?.drain(),D9=null,O9=!1}ks();const jPe=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],MPe=[`cache`,`tmp`];function NPe(e){let t=L(e,ye);if(!(()=>{if(!z(t))return!0;try{return Zu(t).length===0}catch{return!0}})())return[];let n=[];for(let t of jPe)z(L(e,t))&&n.push(t);for(let t of MPe){let r=L(e,t);try{z(r)&&nd(r).isDirectory()&&n.push(`${t}/`)}catch{}}return n}function PPe(e){let t=Rd(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 M9=Number(process.env.OK_DESTROY_STEP_TIMEOUT_MS)||5e3;async function FPe(e){sge();let t=e.projectDir??e.contentDir,n=zye({projectDir:t});if(n){let e=n.telemetry.attributeDenylist,t=[];for(let n of e){t.push(n);for(let e=1;e<=5;e++)t.push(`${`*.`.repeat(e)}${n}`)}mc.configure({pinoConfig:{fileSink:n.logs,redactPaths:t}})}uc({localSink:n?.telemetry}),A9(t),gPe(),_Pe();let{kind:r,gitdir:i}=PPe(e.projectDir??e.contentDir),a={"ok.worktree.kind":r};i!==null&&(a[`ok.worktree.gitdir`]=tc(i));let o=Lye(t),s=process.env.OK_STARTUP_TRACEPARENT,c=()=>Vs(`ok.boot`,{attributes:a},async()=>IPe(e)),l=()=>{if(s)try{let e=Ds.extract(As.active(),{traceparent:s});return As.with(e,c)}catch(e){N(`boot`).warn({err:e},`ok.boot trace-join failed — starting unparented boot`)}return c()},u;try{u=await l()}catch(e){throw o.uninstall(),e}let d=u.destroy;return u.destroy=async()=>{try{await d()}finally{o.uninstall()}},u}async function IPe(e){let t=e.skipAutoInit??!1,n=e.log??N(`boot`),r=e.serverRuntime??{...ma(e.config),allowExternal:!1},i=e.bind!==void 0&&e.bind.length>0?e.bind:[e.host??`127.0.0.1`];if((Ba(r)||!mo(i))&&!r.allowExternal)throw new WB(`refusing to start: the server would bind a non-loopback address (${(mo(i)?r.bind:i).join(`, `)}), which exposes this server beyond this machine. Consent with OK_ALLOW_EXTERNAL=1, or server.allowExternal: true in .ok/local/config.yml.`);let a=qB({serverRuntime:r});r.allowExternal&&!r.loopbackOnly&&r.externalUrl===void 0&&(a.bindLiterals.length===0?n.warn({bind:r.bind},`[ingress] server.allowExternal is set on a wildcard bind (0.0.0.0/::) with no server.externalUrl — external requests will be REFUSED (403 host-not-allowed) because no external Host name is admitted. Set server.externalUrl to the public origin clients dial (e.g. behind a reverse proxy or platform edge), or bind a specific address instead of a wildcard.`):n.info({bind:r.bind},`[ingress] server.allowExternal is set with no server.externalUrl — the bind-address literals are admitted as Host names (direct IP access). Set server.externalUrl to admit a hostname.`));let o=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,s=e.lockKind??o??`interactive`,{createServer:c}=await import(`node:http`),{markServerLockDraining:l,releaseServerLock:u,updateServerLockPort:d}=await import(`./server-lock--BI6Lqjj.mjs`),f=!1;if(!t&&e.autoInitFn)try{f=!!await e.autoInitFn()}catch(e){n.warn({err:e},`autoInitFn failed`)}let p=e.projectDir??e.contentDir,m=L(p,`.ok`);if(!z(L(m,`config.yml`)))throw new i8(z(m)?`config`:`okdir`,p);let h=L(m,`.gitignore`);z(h)||N(`boot`).warn({path:h},"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 g=e.gitPreflight??Uw;try{e.gitEnabled!==!1&&g()}catch(e){if(e instanceof Bw||e instanceof Vw){let t=e instanceof Vw?e.detected:``,r=e instanceof Vw?`too_old`:`not_available`;yK(e),n.warn({event:`git_preflight_fail`,platform:e.platform,reason:r,detectedVersion:t},r===`not_available`?`git binary not found`:`git binary too old`),process.stderr.write(`${e.message}\n`)}throw await lc(),await Promise.race([j9(),new Promise(e=>setTimeout(e,M9))]),e}let _=NPe(m);_.length>0&&N(`boot`).warn({files:_},`Found legacy runtime files at .ok/${_.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${ye}/.`);let v=c9({contentDir:e.contentDir,projectDir:e.projectDir,ingressPolicy:a,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,mcpTomlEditor:e.mcpTomlEditor,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,authStreamHeartbeatMs:e.authStreamHeartbeatMs,onAgentWrite:e.onAgentWrite,lockKind:s,capabilities:e.reactShellDistDir?[`http`,`ws`,`ui`]:[`http`,`ws`],skipStateManifestCheck:e.skipStateManifestCheck,detectGh:e.detectGh,tokenStore:e.tokenStore,embeddingsKeyStore:e.embeddingsKeyStore,singleDocRelPath:e.singleDocRelPath,ephemeral:e.ephemeral}),{hocuspocus:y,destroy:b,ready:x,degraded:S,lockDir:C,sessionManager:w,agentFocusBroadcaster:T,agentPresenceBroadcaster:E,maintenanceCoordinator:ee}=v,te=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),re=e.port??0,ie=()=>`http://${te}:${re}`,D=e.ephemeral?void 0:Z6({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>ie(),localApi:v.localApi,log:n}),O=c();O.headersTimeout=3e4,O.requestTimeout=6e4;let k=e.serveContentAssets===!1?void 0:xZ({contentFilter:v.contentFilter,contentSirv:PZ(e.contentDir,{dev:!0,dotfiles:!1}),inlineExtensions:be,assetExtensions:ne,blocklistExtensions:Ne,ingressPolicy:a}),ae=e.reactShellDistDir?PZ(e.reactShellDistDir,{single:!0,gzip:!0,etag:!0,dev:!0}):void 0,oe=e.ephemeral?null:new zD({contentDir:e.contentDir,localDir:C,globalDir:L(od(),`.ok`),registry:v.acpRegistry,permissions:v.acpPermissions,sessionManager:w,agentPresenceBroadcaster:E,resolveEmbed:v.resolveEmbed,isExcludedPath:e=>v.contentFilter.isExcluded(e),isIgnoredPath:e=>v.contentFilter.isPathIgnored(e),getLoadedDocText:e=>y.documents.get(e)?.getText(`source`).toString()??null,getServerUrl:()=>ie(),getMcpStdioCommand:()=>RD(e.localOpCliArgs,re,{log:n}),probeHarnessManagedMcpEntry:e.probeHarnessManagedMcpEntry,probePiAcpBridge:e.probePiAcpBridge,ensurePiAcpBridge:e.ensurePiAcpBridge,log:n});oe!==null&&await oe.init();let se=`pending`;x.then(()=>{se=`ready`},()=>{se=`failed`});let ce=n8({httpServer:O,hocuspocus:y,nativeApi:v.nativeApi,mcpHttpHandler:D,ingressPolicy:a,health:{readiness:()=>se,degraded:()=>S},log:n,sessionManager:w,agentFocusBroadcaster:T,agentPresenceBroadcaster:E,maintenanceCoordinator:ee,keepaliveGraceMs:e.keepaliveGraceMs,contentAssetMiddleware:k,reactShellMiddleware:ae,ephemeral:e.ephemeral,acpThreadManager:oe}),le=async()=>{throw Error(`bootServer: destroy() invoked before initialization — boot did not complete`)},ue=null;e.idleShutdownMs!==null&&(ue=zZ({httpServer:O,thresholdMs:e.idleShutdownMs??18e5,log:n,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await le()})})),await N9({hocuspocus:y,projectDir:e.projectDir??e.contentDir,log:n});let de=[...new Set(i)],fe=de[0],A=async()=>{await b().catch(e=>{n.warn({err:e},`destroyHocuspocus failed during listen-error cleanup`)}),u(C)},pe=(e,t,n)=>new Promise((r,i)=>{let a=e=>i(e);e.once(`error`,a),e.listen(t,n,()=>{e.removeListener(`error`,a),r()})});try{await pe(O,e.port??0,fe??`127.0.0.1`)}catch(e){throw await A(),e}let me=O.address(),he=typeof me==`object`&&me?me.port:e.port??0,ge=[];for(let e of de.slice(1)){let t=c();t.headersTimeout=O.headersTimeout,t.requestTimeout=O.requestTimeout;for(let e of O.listeners(`request`))t.on(`request`,e);for(let e of O.listeners(`upgrade`))t.on(`upgrade`,e);try{await pe(t,he,e)}catch(t){n.error({err:t,failedAddress:e,port:he,alreadyBound:ge.length+1},`[boot] secondary address bind failed — unwinding all listeners`);for(let e of[...ge,O])e.closeAllConnections?.(),await new Promise(t=>{e.close(e=>{e&&n.warn({err:e},`[boot] listener close failed during unwind`),t()})});throw await A(),t}ge.push(t)}let _e=BL();_e!==void 0&&VL(`httpListenMs`,_e);let ve=O.address(),j=typeof ve==`object`&&ve?ve.port:e.port??0;re=j,d(C,j,ie());let M=!1,xe=async(e,t)=>{let n;try{await Promise.race([t(),new Promise((t,r)=>{n=setTimeout(()=>{r(Error(`${e} timed out after ${M9}ms`))},M9),n.unref?.()})])}finally{n!==void 0&&clearTimeout(n)}};le=async()=>{if(M)return;M=!0,se=`draining`;let e=[],t=async(t,r)=>{try{await xe(t,r)}catch(r){e.push(r),n.warn({err:r,step:t},`bootServer destroy step failed`)}};try{l(C)}catch(e){n.warn({err:e,step:`markServerLockDraining`},`bootServer destroy step failed`)}try{ue?.detach()}catch(t){e.push(t),n.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(oe!==null&&await t(`acpThreads.destroy`,()=>oe.destroy()),await t(`secondaryListeners.close`,async()=>{for(let e of ge)e.closeAllConnections?.(),await new Promise(t=>{e.close(e=>{e&&n.warn({err:e},`[boot] secondary listener close failed during teardown`),t()})})}),await t(`mount.shutdown`,()=>ce.shutdown()),D!==void 0&&await t(`mcpHttpHandler.close`,()=>D.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{ce.wss.close(n=>n?t(n):e())})),await t(`httpServer.closeAllConnections`,async()=>{O.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{O.close(n=>n&&n.code!==`ERR_SERVER_NOT_RUNNING`?t(n):e())})),await t(`destroyHocuspocus`,()=>b()),await t(`shutdownTelemetry`,()=>lc()),await t(`teardownToleranceTelemetry`,()=>j9()),await t(`flushLogFileSinks`,()=>mc.flushAllFileSinks()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)};try{let t=await y9({projectDir:p,skillsRoot:L(e.contentDir,`.ok`,`skills`),inPlaceNames:v9(e.contentDir,DL(e.contentDir))});t.migrated.length+t.skipped.length>0&&n.info?.({event:`store-skills-migrated-in-place`,migrated:t.migrated,skipped:t.skipped},`Migrated ${t.migrated.length} store skill(s) in place (${t.skipped.length} skipped).`)}catch(e){n.warn?.({err:e,event:`store-skill-migration-failed`},`Store-skill in-place migration failed (non-fatal).`)}try{let e=od(),t=await y9({projectDir:e,skillsRoot:L(e,`.ok`,`skills`),hostRoots:yPe,inPlaceNames:v9(e,OL(e))});t.migrated.length+t.skipped.length>0&&n.info?.({event:`global-store-skills-migrated-in-place`,migrated:t.migrated,skipped:t.skipped},`Migrated ${t.migrated.length} global store skill(s) in place (${t.skipped.length} skipped).`)}catch(e){n.warn?.({err:e,event:`global-store-skill-migration-failed`},`Global store-skill in-place migration failed (non-fatal).`)}try{let t=await APe({projectDir:p,skillsRoot:L(e.contentDir,`.ok`,`skills`)}),r=t.healed.length+t.replaced.length+t.orphansRemoved.length;r>0&&n.info?.({event:`installed-skills-reconciled`,healed:t.healed.length,replaced:t.replaced.length,orphansRemoved:t.orphansRemoved.length},`Reconciled ${r} editor skill entr${r===1?`y`:`ies`} to the symlink model.`)}catch(e){n.warn?.({event:`installed-skills-reconcile-failed`,err:e},`Installed-skills reconcile failed (non-fatal).`)}return{httpServer:O,destroy:le,lockDir:C,contentDir:e.contentDir,port:j,ready:x,generatedIndexSweepReady:v.generatedIndexSweepReady,degraded:S,didAutoInit:f,serverInstance:v,runtime:qAe(v,{contentDir:e.contentDir,projectDir:p}),acpThreadManager:oe}}async function N9(e){let{hocuspocus:t,projectDir:n,log:r}=e,i,a;try{i=new IZ(n),a=i.list()}catch(e){r.warn({err:e,projectDir:n},`[boot] lifecycle restore: failed to read conflicts.json — skipping`);return}if(a.length===0)return;let o=e=>e.variant===`working-tree`,s=null;try{let e=zd(n),t=e?F(e,`MERGE_HEAD`):null;if(!t||!z(t)){let e=a.filter(e=>!o(e));for(let t of e)i.removeConflict(t.file);if(a=a.filter(o),e.length>0&&console.warn(JSON.stringify({event:`lifecycle-restore-cleared-stale-conflicts`,reason:`no-merge-head`,count:e.length})),a.length===0)return}else{let e=wc({baseDir:n,timeout:{block:5e3}});s=new Set(await Zb(e,[`diff`,`--name-only`,`--diff-filter=U`]))}}catch(e){r.warn({err:e,projectDir:n},`[boot] lifecycle restore: git unmerged probe failed — restoring all entries`)}if(s!==null){let e=0;for(let t of a)!o(t)&&!s.has(t.file)&&(i.removeConflict(t.file),e++);if(e>0&&console.warn(JSON.stringify({event:`lifecycle-restore-pruned-resolved-entries`,pruned:e,remaining:a.length-e})),a=a.filter(e=>o(e)||s?.has(e.file)),a.length===0)return}for(let e of a){let n=Jx(e.file),i=null,a=!1;try{i=await t.openDirectConnection(n);let e=i.document;if(!e)continue;let r=e.getMap(`lifecycle`);r.set(`status`,`conflict`),r.set(`reason`,`conflict-markers`),a=!0,console.warn(JSON.stringify({event:`lifecycle-restored-from-conflicts-json`,"doc.name":n}))}catch(e){r.warn({err:e,docName:n},`[boot] lifecycle restore: failed to set lifecycle for doc — skipping`)}finally{if(i)try{await i.disconnect()}catch(e){r.warn({err:e,docName:n,restored:a},`[boot] lifecycle restore: disconnect failed after lifecycle write`)}}}}const LPe=Ie;function RPe(e={}){let t=e.home??od(),n=e.platformName??process.platform,r=e.env??process.env;return n===`darwin`?z(F(t,`Library`,`Application Support`,`Claude`)):n===`win32`?z(F(r.APPDATA??F(t,`AppData`,`Roaming`),`Claude`)):!1}var P9=t(_c(),1);const F9=F(od(),`.ok`,`logs`),zPe=[`authorization`,`password`,`token`,`apiKey`,`secret`,`*.authorization`,`*.password`,`*.token`,`*.apiKey`,`*.secret`];function BPe(){let e=process.env.OK_LOG_LEVEL??process.env.LOG_LEVEL;if(e){let t=[`fatal`,`error`,`warn`,`info`,`debug`],n=e.toLowerCase();if(t.includes(n))return n}return process.env.NODE_ENV===`test`?`silent`:`info`}function VPe(e){Ku(e,{recursive:!0})}function I9(){return new Date().toISOString().slice(0,10)}function HPe(e){try{if(nd(e).size<5242880)return}catch{return}for(let t=2;t>=1;t--){let n=t===1?e:`${e}.${t-1}`,r=`${e}.${t}`;try{$u(n,r)}catch{}}try{rd(`${e}.3`)}catch{}}function UPe(e){try{let t=Date.now(),n=10080*60*1e3,r=Zu(e).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(t=>{try{let n=nd(F(e,t));return{name:t,mtime:n.mtimeMs,size:n.size}}catch{return null}}).filter(Boolean);for(let i of r)if(t-i.mtime>n)try{rd(F(e,i.name))}catch{}let i=r.filter(e=>t-e.mtime<=n).sort((e,t)=>e.mtime-t.mtime),a=i.reduce((e,t)=>e+t.size,0);for(let t of i){if(a<=47185920)break;try{rd(F(e,t.name)),a-=t.size}catch{}}}catch{}}function WPe(e){VPe(F9);let t=I9(),n=e.filePath??F(F9,`${e.name}.${t}.log`);HPe(n),(e._setTimeout??setTimeout)(()=>UPe(F9),5e3).unref();let r=P9.default.destination({dest:n,append:!0,sync:!0});return(0,P9.default)({level:BPe(),name:e.name,redact:{paths:zPe,censor:`[REDACTED]`},base:{pid:process.pid,hostname:void 0,runtime:`cli`,project:e.project??`<no-project>`},timestamp:P9.default.stdTimeFunctions.isoTime,...e.additionalOptions},r)}function GPe(e,t=250){return new Promise(n=>{if(!e){n();return}let r=e[P9.default.symbols.streamSym],i=!1,a=()=>{i||(i=!0,n())};if(!r||typeof r.flushSync!=`function`){a();return}let o=()=>{try{r.flushSync?.()}catch{}a()},s=setTimeout(a,t);typeof s.unref==`function`&&s.unref(),typeof r.fd==`number`&&r.fd>=0?(clearTimeout(s),o()):typeof r.once==`function`?r.once(`ready`,()=>{clearTimeout(s),o()}):(clearTimeout(s),o())})}function KPe(e){return F(F9,`${e}.${I9()}.log`)}function qPe(){return F9}function JPe(e){let t=L(e),n=0;for(;n<30;){let e=!1;try{e=z(L(t,`.git`))}catch{e=!1}if(e)return{gitRoot:t,distance:n};let r=P(t);if(r===t)return null;t=r,n+=1}return null}const L9=Dd(Su),R9=N(`project-git`);var z9=class extends Error{stderr;constructor(e,t=``,n){super(e,n),this.name=`ProjectGitInitError`,this.stderr=t}};async function YPe(e,t){try{return await L9(e,[`var`,`GIT_COMMITTER_IDENT`],Lw({cwd:t,encoding:`utf-8`})),!0}catch{return!1}}async function XPe(e,t){try{let{stdout:n}=await L9(e,[`for-each-ref`,`--count=1`,`refs/`],Lw({cwd:t,encoding:`utf-8`}));return n.trim().length>0}catch(e){return R9.warn({path:t,stderr:B9(e)},`could not list refs — assuming history exists and skipping the initial commit`),!0}}function ZPe(e){let t=L(e,`packed-refs`);if(z(t))try{if(B(t,`utf-8`).split(`
2027
2027
  `).some(e=>e.trim()!==``&&!e.startsWith(`#`)))return!0}catch{return!0}try{return Zu(L(e,`refs/heads`)).length>0}catch{return!1}}function B9(e){let t=typeof e==`object`&&e?e:null,n=t?.stderr;return n==null?String(t?.message??e):Buffer.isBuffer(n)?n.toString(`utf-8`):String(n)}async function V9(e,t){if(await XPe(e,t))return;let n=[`commit`,`--allow-empty`,`--no-verify`,`--no-gpg-sign`,`-m`,`Initial commit`],r=await YPe(e,t),i=r?n:[`-c`,`user.name=Open Knowledge`,`-c`,`user.email=noreply@openknowledge.local`,...n];try{await L9(e,i,Lw({cwd:t,encoding:`utf-8`})),r||R9.info({path:t},`created initial commit with fallback identity (git identity unset)`)}catch(e){R9.warn({path:t,stderr:B9(e)},`could not create initial commit`)}}async function QPe(e,t){try{let{stdout:n}=await L9(e,[`rev-parse`,`--is-inside-work-tree`],Lw({cwd:t,encoding:`utf-8`}));return n.trim()===`true`}catch{return!1}}async function $Pe(e){let t=L(e);zW(t);let n=L(t,`.git`),r=L(n,`HEAD`),i=!1,a=!1;if(z(n)){if(!nd(n).isDirectory())return{didInit:!1};if(z(r)){if(ZPe(n))return{didInit:!1};a=!0}else R9.info({},`detected partial .git/ — running git init to repair`),i=!0}let o;try{o=Uw()}catch(e){throw e instanceof Bw||e instanceof Vw?(yK(e),R9.warn({event:`git_preflight_fail`,platform:e.platform,reason:e instanceof Vw?`too_old`:`not_available`,detectedVersion:e instanceof Vw?e.detected:``},e instanceof Vw?`git binary too old`:`git binary not found`)):R9.warn({event:`git_preflight_unexpected_error`,err:e},`unexpected error during git preflight`),e}let s=o.resolvedPath;if(a)return await V9(s,t),{didInit:!1};if(!i&&await QPe(s,t))return{didInit:!1};let c=``;try{c=(await L9(s,[`init`,`--initial-branch=main`,t],Lw({encoding:`utf-8`}))).stderr??``}catch(e){let n=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new z9(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,n,{cause:e})}if(!z(r))throw new z9(`git init reported success but ${n}/HEAD is missing (partial init detected)`,c);return await V9(s,t),i?(R9.info({path:t},`backfilled missing .git/HEAD`),{didInit:!0,repaired:!0}):(R9.info({path:t,branch:`main`},`initialized .git/`),{didInit:!0})}const H9=N(`project-skill-git`),U9=/^[0-9a-f]{40}$/,W9=sn.map(e=>e.replace(/\/$/,``));async function eFe(e){let t=zd(e);if(t===null)return{kind:`skipped`,reason:`no-git`};if(iFe(t))return{kind:`skipped`,reason:`operation-in-progress`};let n=Tc(e,{credentialConfig:[]});if((await G9(n)).length===0)return{kind:`nothing-tracked`};try{return await Cc(async()=>{let t=await tFe(n);if(t===null)return{kind:`skipped`,reason:`detached-head`};let r=await nFe(n);if(r===null)return{kind:`skipped`,reason:`unborn-head`};let i=await G9(n);if(i.length===0)return{kind:`nothing-tracked`};let a=Tc(e,{gitIndexFile:F(ld(),`ok-untrack-idx-${process.pid}-${Date.now()}.idx`),credentialConfig:[]});await a.git.raw([`read-tree`,r]),await a.git.raw([`rm`,`--cached`,`-r`,`--ignore-unmatch`,`--`,...i]);let o=(await a.git.raw([`write-tree`])).trim(),s=await rFe(n,r);if(s!==null&&s===o)return{kind:`nothing-tracked`};let c=await PB(e),l=c?.name??`OpenKnowledge`,u=c?.email??`sync@open-knowledge.local`;Ac(a,{GIT_AUTHOR_NAME:l,GIT_AUTHOR_EMAIL:u,GIT_COMMITTER_NAME:l,GIT_COMMITTER_EMAIL:u});let d=`Stop tracking the OpenKnowledge project skill\n\nThe \`${On}\` skill is regenerated per machine and version-stamped per app build, so tracking it causes recurring sync conflicts. It is now git-ignored.`,f=(await a.git.raw([`commit-tree`,o,`-p`,r,`-m`,d])).trim();if(!U9.test(f))return H9.warn({raw:f},`commit-tree returned invalid SHA — aborting untrack`),{kind:`failed`,error:`commit-tree returned invalid SHA`};try{await n.git.raw([`update-ref`,`refs/heads/${t}`,f,r])}catch(e){return H9.info({branch:t,err:K9(e)},`update-ref CAS failed — ref moved, retry next open`),{kind:`skipped`,reason:`ref-race`}}try{await n.git.raw([`reset`,`-q`,f,`--`,...i])}catch(e){H9.info({err:K9(e)},`real-index reset after untrack failed (cosmetic)`)}return H9.info({dirs:i,commitSha:f},`untracked project-skill projection`),{kind:`untracked`,dirs:i,commitSha:f}})}catch(e){return{kind:`failed`,error:K9(e)}}}async function G9(e){let t=[];for(let n of W9){let r=``;try{r=(await e.git.raw([`ls-files`,`--`,n])).trim()}catch{r=``}r.length>0&&t.push(n)}return t}async function tFe(e){try{let t=(await e.git.raw([`rev-parse`,`--abbrev-ref`,`HEAD`])).trim();return t.length===0||t===`HEAD`?null:t}catch{return null}}async function nFe(e){try{let t=(await e.git.raw([`rev-parse`,`--verify`,`HEAD`])).trim();return U9.test(t)?t:null}catch{return null}}async function rFe(e,t){try{let n=(await e.git.raw([`rev-parse`,`${t}^{tree}`])).trim();return U9.test(n)?n:null}catch{return null}}function iFe(e){return z(F(e,`MERGE_HEAD`))||z(F(e,`rebase-merge`))||z(F(e,`rebase-apply`))||z(F(e,`CHERRY_PICK_HEAD`))||z(F(e,`REVERT_HEAD`))}function K9(e){return e instanceof Error?e.message:String(e)}async function aFe(e,t){let n;try{n=xu(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=P(n),r=0;r<32;r+=1){let n=F(t,`package.json`);if(z(n))try{let t=JSON.parse(await pd(n,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let r=P(t);if(r===t)return;t=r}}const oFe=[{regex:/\/Users\/[^/]+\//g,replacement:`~/`},{regex:/\/home\/[^/]+\//g,replacement:`~/`},{regex:/C:\\\\Users\\\\[^\\\\]+\\\\/g,replacement:`~\\`},{regex:/C:\\Users\\[^\\]+\\/g,replacement:`~\\`}];function q9(e){if(e===void 0)return;let t=e;for(let{regex:e,replacement:n}of oFe)t=t.replace(e,n);return t}function J9(e,t=0,n=new WeakSet){if(t>=5)return{name:`SerializedError.CauseDepthExceeded`,message:`cause chain depth > 5; truncated`};if(typeof e==`object`&&e){if(n.has(e))return{name:`SerializedError.CauseCycle`,message:`cyclic cause; truncated`};n.add(e)}if(e instanceof Error)return{name:e.name,message:q9(e.message)??``,stack:q9(e.stack),code:e.code,cause:e.cause===void 0?void 0:J9(e.cause,t+1,n)};if(e==null)return{name:`UnknownError`,message:String(e)};if(typeof e==`string`)return{name:`StringError`,message:q9(e)??e};if(typeof e==`object`){let r=e;return{name:String(r.name??`ObjectError`),message:q9(String(r.message??``))??``,stack:q9(r.stack),code:r.code,cause:r.cause===void 0?void 0:J9(r.cause,t+1,n)}}return{name:`UnknownError`,message:String(e)}}var Y9=class extends Error{constructor(e){super(`File not found: ${e}`),this.filePath=e,this.name=`SingleFileNotFoundError`}},X9=class extends Error{constructor(e){super(`Not a file: ${e}. \`ok <file>\` opens a single markdown file.`),this.filePath=e,this.name=`SingleFileNotAFileError`}},Z9=class extends Error{constructor(e){super(`OpenKnowledge edits markdown files (.md / .mdx): ${e}`),this.filePath=e,this.name=`SingleFileNotMarkdownError`}};function sFe(e){if(!Kx(e))throw new Z9(e);let t;try{t=V(L(e))}catch(t){throw t.code===`ENOENT`?new Y9(e):t}if(!nd(t).isFile())throw new X9(e);let n=P(t),r=vB(n);if(r){let e=r.rootPath;return{mode:`project`,projectRoot:e,docName:Jx(I(cFe(e),t).split(R).join(`/`)),canonicalFilePath:t}}let i=Du(t);return{mode:`ephemeral`,canonicalFilePath:t,contentDir:n,singleDocRelPath:i,docName:Jx(i)}}function cFe(e){return L(e,Is({absPath:Qs(`project`,e),sideline:!1,warn:()=>{}}).value.content?.dir??`.`)}const Q9=`ok-ephemeral-`;function $9(e,t){let n=L(e,`.ok`);return Ku(n,{recursive:!0}),id(L(n,`config.yml`),`# Ephemeral single-file session (\`ok <file>\`). Throwaway — safe to delete.\ncontent:\n dir: ${JSON.stringify(t)}\n`,`utf-8`),id(L(n,`.gitignore`),`local/
2028
2028
  `,`utf-8`),e}function lFe(e){return $9(qu(L(ld(),Q9)),e)}export{$0 as $,Vx as $i,qI as $n,aM as $r,CK as $t,O7 as A,Bd as Aa,sT as Ai,Ez as An,VP as Ar,BX as At,zMe as B,Cw as Bi,Xz as Bn,fN as Br,Ige as Bt,k9 as C,xf as Ca,RD as Ci,ZB as Cn,XF as Cr,DZ as Ct,D7 as D,Ud as Da,Vw as Di,IB as Dn,XP as Dr,CZ as Dt,s9 as E,df as Ea,Bw as Ei,LB as En,YP as Er,kZ as Et,_7 as F,_w as Fi,Yz as Fn,zP as Fr,WX as Ft,i8 as G,G as Gi,dz as Gn,lN as Gr,Fge as Gt,K5 as H,KC as Hi,_z as Hn,hN as Hr,NJ as Ht,t7 as I,Nw as Ii,Wz as In,FP as Ir,Uge as It,$6 as J,aS as Ji,cz as Jn,eN as Jr,AJ as Jt,n8 as K,xS as Ki,pz as Kn,iN as Kr,PJ as Kt,ZMe as L,Iw as Li,jz as Ln,IP as Lr,RJ as Lt,M7 as M,Xw as Mi,Nz as Mn,HP as Mr,uye as Mt,E7 as N,Gw as Ni,Mz as Nn,BP as Nr,bZ as Nt,A7 as O,Hd as Oa,Rw as Oi,vB as On,qP as Or,xZ as Ot,b7 as P,Lw as Pi,$z as Pn,RP as Pr,vZ as Pt,Q0 as Q,iS as Qi,JI as Qn,cM as Qr,yJ as Qt,r7 as R,jw as Ri,Zz as Rn,lP as Rr,IJ as Rt,A9 as S,bh as Sa,DD as Si,XB as Sn,uhe as Sr,wZ as St,c9 as T,Sf as Ta,uT as Ti,RB as Tn,JP as Tr,Tye as Tt,U5 as U,hw as Ui,vz as Un,pN as Ur,DJ as Ut,Y5 as V,GC as Vi,kz as Vn,dN as Vr,Pge as Vt,r8 as W,SS as Wi,uz as Wn,mN as Wr,OJ as Wt,J6 as X,oS as Xi,RR as Xn,zM as Xr,kJ as Xt,Z6 as Y,dS as Yi,$R as Yn,BM as Yr,MJ as Yt,R6 as Z,uS as Zi,kR as Zn,lM as Zr,vJ as Zt,qPe as _,ax as _a,mk as _i,RW as _n,fI as _r,T$ as _t,lFe as a,Dx as aa,Jj as ai,dK as an,BI as ar,B0 as at,FPe as b,yh as ba,QD as bi,tV as bn,lhe as br,TZ as bt,J9 as c,Tx as ca,Bj as ci,YW as cn,II as cr,fCe as ct,z9 as d,zx as da,Ij as di,XW as dn,CI as dr,N0 as dt,Mx as ea,rfe as ei,xK as en,Rhe as er,e2 as et,$Pe as f,Ux as fa,Rj as fi,HW as fn,xI as fr,$1 as ft,KPe as g,fx as ga,Xk as gi,LW as gn,yI as gr,S$ as gt,GPe as h,mx as ha,Jk as hi,zW as hn,_I as hr,kbe as ht,Z9 as i,Ix as ia,Wde as ii,mK as in,zI as ir,G0 as it,j7 as j,Md as ja,Hw as ji,Qz as jn,UP as jr,lye as jt,N7 as k,cf as ka,Uw as ki,_B as kn,Wpe as kr,VX as kt,aFe as l,Bx as la,wde as li,WW as ln,whe as lr,P0 as lt,WPe as m,gx as ma,Yk as mi,IW as mn,bI as mr,s$ as mt,X9 as n,Px as na,nfe as ni,yK as nn,WI as nr,CCe as nt,sFe as o,jx as oa,tM as oi,BW as on,VI as or,uCe as ot,JPe as p,Cx as pa,Lj as pi,ZW as pn,SI as pr,k$ as pt,t8 as q,mS as qi,fz as qn,sN as qr,jJ as qt,Y9 as r,kx as ra,tfe as ri,hK as rn,HI as rr,K0 as rt,$9 as s,Hx as sa,Ede as si,JW as sn,LI as sr,dCe as st,Q9 as t,Nx as ta,efe as ti,vK as tn,Mhe as tr,a2 as tt,eFe as u,Rx as ua,zj as ui,$W as un,RI as ur,j0 as ut,RPe as v,Fse as va,nO as vi,WB as vn,pI as vr,zZ as vt,j9 as w,ff as wa,cT as wi,JB as wn,lF as wr,EZ as wt,N9 as x,xh as xa,zD as xi,HB as xn,mI as xr,OZ as xt,LPe as y,Fie as ya,eO as yi,qB as yn,lI as yr,AZ as yt,n7 as z,Mw as zi,hB as zn,Tpe as zr,CJ as zt};
2029
- //# sourceMappingURL=src-BHDHmhMl.mjs.map
2029
+ //# sourceMappingURL=src-32lVY8sD.mjs.map
@@ -0,0 +1 @@
1
+ import"./src-tR2kRwXj.mjs";import"./resolve-project-root-XuKmxBzQ.mjs";import"./src-H5bQHekD.mjs";import"./acp-harness-probe-DBIIsKVz.mjs";import"./init-PW1PHv2x.mjs";import{n as e}from"./loader-Cg2a3fTX.mjs";import"./skill-teardown-Dp8qru7m.mjs";import"./preview-B4X8PAmW.mjs";import"./mcp-migrate-event-9DFnNzHa.mjs";export{e as loadConfig};
@@ -1 +1 @@
1
- import{Ac as e,Hs as t,Ts as n,U as r,Ws as i,ec as a,q as o,ws as s,x as c,xs as l,y as u}from"./src-tR2kRwXj.mjs";import{$ as d,$i as f,$n as p,$r as m,$t as h,A as g,Ai as _,An as v,Ar as y,At as b,B as x,Bi as S,Bn as C,Br as w,Bt as T,C as E,Ca as D,Ci as O,Cn as k,Cr as A,Ct as j,D as M,Da as N,Di as P,Dn as F,Dr as I,Dt as L,E as R,Ea as z,Ei as B,En as V,Er as H,Et as U,F as W,Fi as G,Fn as K,Ft as q,G as J,Gi as Y,Gn as X,Gr as Z,Gt as Q,H as $,Hi as ee,Hn as te,Hr as ne,Ht as re,I as ie,Ii as ae,In as oe,It as se,J as ce,Ji as le,Jn as ue,Jr as de,Jt as fe,K as pe,Ki as me,Kn as he,Kr as ge,Kt as _e,L as ve,Li as ye,Ln as be,Lt as xe,M as Se,Mi as Ce,Mn as we,Mr as Te,Mt as Ee,N as De,Ni as Oe,Nn as ke,Nt as Ae,O as je,Oa as Me,Oi as Ne,On as Pe,Or as Fe,Ot as Ie,P as Le,Pi as Re,Pn as ze,Pt as Be,Q as Ve,Qi as He,Qn as Ue,Qr as We,Qt as Ge,R as Ke,Ri as qe,Rn as Je,Rr as Ye,Rt as Xe,S as Ze,Sa as Qe,Si as $e,Sn as et,Sr as tt,St as nt,T as rt,Ta as it,Ti as at,Tn as ot,Tr as st,Tt as ct,U as lt,Ui as ut,Un as dt,Ur as ft,Ut as pt,V as mt,Vi as ht,Vn as gt,Vr as _t,Vt as vt,W as yt,Wi as bt,Wn as xt,Wr as St,Wt as Ct,X as wt,Xi as Tt,Xn as Et,Xr as Dt,Xt as Ot,Y as kt,Yi as At,Yn as jt,Yr as Mt,Yt as Nt,Z as Pt,Zi as Ft,Zn as It,Zr as Lt,Zt as Rt,_ as zt,_a as Bt,_n as Vt,_r as Ht,a as Ut,aa as Wt,ai as Gt,an as Kt,ar as qt,at as Jt,b as Yt,ba as Xt,bi as Zt,bn as Qt,br as $t,bt as en,c as tn,ca as nn,ci as rn,cn as an,cr as on,ct as sn,d as cn,da as ln,di as un,dn,dr as fn,dt as pn,ea as mn,ei as hn,en as gn,er as _n,et as vn,f as yn,fa as bn,fi as xn,fn as Sn,fr as Cn,g as wn,ga as Tn,gi as En,gn as Dn,gr as On,h as kn,ha as An,hi as jn,hn as Mn,hr as Nn,i as Pn,ia as Fn,ii as In,in as Ln,ir as Rn,it as zn,j as Bn,ji as Vn,jn as Hn,jr as Un,jt as Wn,k as Gn,ki as Kn,kn as qn,kr as Jn,kt as Yn,l as Xn,la as Zn,li as Qn,ln as $n,lr as er,lt as tr,m as nr,ma as rr,mi as ir,mn as ar,mr as or,n as sr,na as cr,ni as lr,nn as ur,nr as dr,nt as fr,o as pr,oa as mr,oi as hr,on as gr,or as _r,ot as vr,p as yr,pa as br,pi as xr,pn as Sr,pr as Cr,q as wr,qi as Tr,qn as Er,qr as Dr,qt as Or,r as kr,ra as Ar,ri as jr,rn as Mr,rr as Nr,rt as Pr,s as Fr,sa as Ir,si as Lr,sn as Rr,sr as zr,st as Br,t as Vr,ta as Hr,ti as Ur,tn as Wr,tr as Gr,tt as Kr,u as qr,ua as Jr,ui as Yr,un as Xr,ur as Zr,ut as Qr,v as $r,va as ei,vi as ti,vn as ni,vr as ri,vt as ii,w as ai,wa as oi,wi as si,wn as ci,wr as li,wt as ui,x as di,xa as fi,xi as pi,xn as mi,xr as hi,xt as gi,y as _i,ya as vi,yi,yn as bi,yr as xi,yt as Si,z as Ci,zi as wi,zn as Ti,zr as Ei,zt as Di}from"./src-BHDHmhMl.mjs";import{C as Oi,E as ki,T as Ai,_ as ji,b as Mi,c as Ni,d as Pi,g as Fi,i as Ii,l as Li,m as Ri,n as zi,p as Bi,s as Vi,t as Hi,u as Ui,v as Wi,w as Gi,x as Ki,y as qi}from"./fs-traced-2B_-YK-g.mjs";import{a as Ji,d as Yi,f as Xi,i as Zi,l as Qi,n as $i,r as ea,t as ta,u as na}from"./logger-Dq-cRhcP.mjs";import{C as ra,S as ia,_ as aa,a as oa,b as sa,c as ca,d as la,f as ua,g as da,h as fa,i as pa,l as ma,m as ha,n as ga,o as _a,p as va,r as ya,s as ba,t as xa,u as Sa,x as Ca}from"./server-lock-Dngwkd_U.mjs";export{vi as AGENT_ID_MAX_LEN,Xt as AGENT_ID_RE,G as AGENT_WRITE_ORIGIN,z as AcpPermissionStore,D as AcpRegistry,pi as AcpThreadManager,yi as AgentFocusBroadcaster,ti as AgentPresenceBroadcaster,ae as AgentSessionCapacityError,ye as AgentSessionManager,Si as AutoStartDisabledError,Ht as BUNDLE_IDS,ri as BUNDLE_SCOPE,xi as BUNDLE_SKILL_NAME,Et as BacklinkIndex,Tr as CC1Broadcaster,i as CC1_CONTRACT_VERSION,gr as CONFIG_FILENAME,xt as CONFLICT_MARKER_RE,w as CURSOR_BUNDLE_PATHS_BY_PLATFORM,_i as ConfigSchema,f as DEFAULT_CHECKPOINT_RETENTION,In as DEFAULT_EMBEDDINGS_DIMENSIONS,Di as DEFAULT_PACK_ID,lt as DocumentDurabilityState,Gt as EMBEDDINGS_API_KEY_ENV,Vr as EPHEMERAL_PROJECT_DIR_PREFIX,ni as ExposureConsentError,oi as FEATURED_AGENT_IDS,mn as FILE_SYSTEM_WRITER,ue as FILE_WATCHER_ORIGIN,We as FileEmbeddingsBackend,Wr as GIT_PREFLIGHT_FAIL_SPAN_NAME,Hr as GIT_UPSTREAM_WRITER,N as GitDirAccessError,B as GitNotAvailableError,P as GitTooOldError,en as HOCUSPOCUS_AUTH_REJECTION_REASONS,gi as HocuspocusAuthRejection,nt as HocuspocusAuthTokenSchema,ar as HomeProjectRootError,ge as INSTALLED_AGENTS_SCHEMES,Qr as JSON_SCHEMA_DIALECT_2020_12,t as LINEAGE_EPOCH_KEY,x as LIVE_DERIVED_INDEX_DEBOUNCE_MS,T as LOG_MD_TEMPLATE,Yn as MANAGED_RENAME_ORIGIN,$e as MAX_ACP_THREADS,qe as MAX_AGENT_SESSIONS,si as MCP_CONNECTION_ID_HEADER,l as MCP_SERVER_NAME,wi as MIN_EVICTABLE_IDLE_MS,Ne as MIN_GIT_VERSION,yt as MISSING_OK_CONFIG_MESSAGE,Me as MalformedGitPointerError,fr as McpLogger,J as MissingOkConfigError,ht as OBSERVER_SYNC_ORIGIN,Rr as OK_OKIGNORE_TEMPLATE,$t as ONBOARDING_BUNDLE_IDS,s as ORPHAN_MODES,e as PROTOCOL_VERSION,ta as PinoLogger,ma as ProcessLockCollisionError,cn as ProjectGitInitError,b as ROLLBACK_ORIGIN,an as ROOT_GITIGNORE_TEMPLATE,sa as RUNTIME_VERSION,cr as SERVICE_WRITER,Cn as SKILL_INSTALL_EVENTS_FILE_REL,r as SKILL_STATE_TARGETS,vt as STARTER_FOLDERS,re as STARTER_FOLDER_FRONTMATTER_FILENAME,pt as STARTER_PACKS,Ct as STARTER_PACK_IDS,Q as STARTER_TEMPLATES,M as STATE_MANIFEST_FILENAME,Ca as STATE_SCHEMA_VERSION,a as SYSTEM_DOC_NAME,Rt as SeedPrerequisiteError,Ge as SeedRootDirError,xa as ServerLockCollisionError,sr as SingleFileNotAFileError,kr as SingleFileNotFoundError,Pn as SingleFileNotMarkdownError,je as StateManifestError,jt as TagIndex,hi as USER_GLOBAL_BUNDLE_IDS,Wn as __getShowAllWalkStatsForTesting,Ee as __resetShowAllWalkStatsForTesting,Sa as acquireProcessLock,ga as acquireServerLock,S as applyAgentMarkdownWrite,te as applyExternalChange,Xe as applySeed,Gn as assertCompatibleStateManifest,Kn as assertGitAvailable,v as assertNeverDiskEvent,Mn as assertNotHomeProjectRoot,Zt as attachAcpThreadSocket,ii as attachIdleShutdown,Yt as bootServer,Ue as buildAndOpenSkill,$n as buildConfigYmlContent,Pt as buildExecResult,bi as buildIngressPolicy,O as buildOkMcpStdioCommand,or as buildSkillZip,_e as buildStarterFolderFrontmatterYaml,Ar as buildWipTree,tt as bundleSkillMdPath,m as canonicalProjectKey,Dn as canonicalizeForCompare,Hn as classifyEvents,Hi as classifyFsPath,hn as clearAllEmbeddingsKeys,Lr as clearContributors,Or as coercePackId,u as colorFromSeed,Fn as commitUpstreamImport,Wt as commitWip,mr as commitWipFromTree,_ as compareSemver,st as composeEffectiveLinterConfig,H as composeFrontmatterSchemasConfig,X as containsConflictMarkers,we as contentHash,rn as contributorCount,ie as countShadowObjects,ve as countStaleAgentWipRefs,Ke as countWipRefs,Ae as createApiExtension,Ie as createAssetServeMiddleware,wr as createCollaborationHost,Ye as createContentFilter,Ei as createContentFilterAsync,Ur as createEmbeddingsSecretStore,Ut as createEphemeralProjectDir,dt as createExternalChangeHandler,nr as createFileLogger,mt as createLiveDerivedIndexExtension,kt as createMcpHttpHandler,Dr as createOsProbe,W as createPersistenceExtension,rt as createServer,De as createServerObserverExtension,bt as createStreamingErrorWriter,$i as createTestLogger,lr as describeStoredEmbeddingsKey,$r as detectClaudeDesktopPresence,Vn as detectGit,g as detectProjectShape,p as detectUserSkillHosts,Jt as discoverLockDirs,Jn as discoverMarkdownlintConfig,ur as emitPreflightFailureSpan,Ve as encodeDocName,d as encodeFolderRoute,vn as encodeSkillRoute,yn as ensureProjectGit,Xr as ensureProjectSkillGitignore,Y as errorResponse,ke as evictStaleTrackerEntries,Be as extractHeadings,vr as extractOkBinaryPath,It as extractWikiLinksFromMarkdown,Ce as fallbackPaths,yr as findEnclosingGitRoot,Pe as findEnclosingProjectRoot,y as findNativeMarkdownlintFile,kn as flushFileLogger,j as formatAuthRejectionWire,Qn as formatContributors,Yr as formatContributorsFrom,se as formatPackRationale,Ir as gcCheckpointRefs,Pr as getCurrentMcpLogger,Qt as getIngressContext,ir as getLocalDir,wn as getLogFilePath,ea as getLogger,zt as getLogsDir,aa as getMachineId,qi as getMeter,rr as getMetrics,Mi as getTracer,An as handleCollabSocketError,_t as handleSpawnCursor,mi as hasForwardingHeaders,Ci as hasGcLogLatch,c as iconFromClientName,Tn as incrementCollabSocketFilteredError,Bt as incrementServerObserverFire,dn as initContent,nn as initShadowRepo,Ki as initTelemetry,Ze as initToleranceTelemetryWriter,pn as installJsonSchemaDialect,tr as installPrettyZodErrors,Zi as installTestLoggers,_n as installUserSkill,F as isAllowedApiOrigin,ot as isAllowedWorkspaceHostHeader,le as isConfigDoc,ui as isHocuspocusAuthRejectionReason,Vt as isHomeDir,et as isHostAdmitted,fe as isKnownPackId,At as isLinkIndexExcludedDoc,V as isLoopbackAddress,Tt as isManagedArtifactDoc,k as isOriginAdmitted,n as isOrphanMode,ee as isPairedWriteOrigin,ne as isPathWithinDir,ci as isPeerAdmitted,ia as isProcessAlive,qn as isProjectRoot,Ft as isReservedForUserTree,ze as isSelfWrite,He as isSystemDoc,E as isToleranceTelemetryEnabled,ra as isValidLockPid,K as lastKnownHash,Zn as listRescueCheckpoints,Nt as listStarterPacks,it as loadCustomAgents,Le as loadPrincipal,ya as lockAdvertisesUi,la as lockBaseUrl,ua as lockFilePath,Ji as loggerFactory,Qi as logsCurrentPath,na as logsPreviousPath,jr as makeLazyEmbeddingsKeyStore,pa as markServerLockDraining,pe as mountMcpAndApi,zi as normalizeFsPath,A as originGitHubHost,Sn as packageVersionMajorMinor,ct as parseAuthRejectionWire,Oe as parseGitVersion,U as parseHocuspocusAuthToken,ce as parseKeepaliveConnectionId,oe as pathToDocName,xe as planSeed,pr as prepareSingleFileOpen,Br as processCommand,sn as processUsage,Nr as readAllTargets,Rn as readBundleDecision,Un as readOwnNativeRules,va as readProcessLock,ha as readProcessLockDetailed,$ as readProjectHeadState,Lt as readProjectLocalSemanticConfig,oa as readServerLock,qt as readServerPackageVersion,_r as readSkillInstallStateSnapshot,Bn as readStateManifest,zr as readTargetRecordedAt,on as readTargetVersion,he as reconcile,un as recordContributor,Cr as recordSkillInstallEvent,wt as registerAllTools,be as registerWrite,fa as releaseProcessLock,_a as releaseServerLock,Je as removeLastKnownHash,dr as reportSkillInstall,ei as resetMetrics,Gr as resolveBuiltinSkillHosts,o as resolveBundleEnabled,Nn as resolveBundledSkillDir,jn as resolveContentDir,ft as resolveCursorBinaryDefault,St as resolveCursorSpawnInvocation,I as resolveEffectiveLinterConfig,hr as resolveEmbeddingsCredential,En as resolveLockDir,Fe as resolveNativeConfigForDoc,Te as resolveNativeMarkdownlintConfig,Ot as resolvePack,Xn as resolvePackageVersion,fn as resolveSkillInstallReportSettings,Kr as resolveUiInfo,xn as restoreContributors,di as restoreLifecycleFromConflictsJson,Mt as rewriteMarkdownLinksForDocumentRename,Dt as rewriteWikiLinksForDocumentRename,Mr as runAuthReposSubprocess,Ln as runAuthStatusSubprocess,h as runCloneSubprocess,Kt as runDeviceFlowSubprocess,zn as runWithMcpLogger,de as safeContentPath,q as safeSubdir,Jr as safetyCheckpoint,at as sanitizeClientName,ln as saveInMemoryCheckpoint,bn as saveVersion,L as seedBasenameIndex,Fr as seedEphemeralProjectDir,tn as serializeError,Oi as setActiveSpanAttributes,ut as setupServerObservers,br as shadowGit,Gi as shutdownTelemetry,Yi as spansCurrentPath,Xi as spansPreviousPath,Z as spawnDetached,Er as splitMarkdownBlocks,Ti as startWatcher,me as streamingProblemEvent,xr as swapContributors,ai as teardownToleranceTelemetryWriter,fi as toBroadcasterKey,Ii as tracedAppendFileSync,Vi as tracedLinkSync,Ni as tracedMkdir,Li as tracedMkdirSync,Ui as tracedRename,Pi as tracedRenameSync,Bi as tracedRmSync,Ri as tracedRmdirSync,Fi as tracedUnlinkSync,ji as tracedWriteFile,Wi as tracedWriteFileSync,R as trustSystemCertificates,qr as untrackTrackedProjectSkillProjection,C as updateLastKnownHash,da as updateProcessLockPort,ba as updateServerLockPort,Qe as validateAgentId,gn as validateCloneInputs,On as validateSkillZip,ca as waitForServerLockDrain,Re as withHiddenWindowsConsole,Ai as withSpan,ki as withSpanSync,er as writeBundleDecision,li as writeMarkdownlintRule,Sr as writeRootGitignoreForNewRepo,Se as writeStateManifest,Zr as writeTargetVersion,gt as writeTracker};
1
+ import{Ac as e,Hs as t,Ts as n,U as r,Ws as i,ec as a,q as o,ws as s,x as c,xs as l,y as u}from"./src-tR2kRwXj.mjs";import{$ as d,$i as f,$n as p,$r as m,$t as h,A as g,Ai as _,An as v,Ar as y,At as b,B as x,Bi as S,Bn as C,Br as w,Bt as T,C as E,Ca as D,Ci as O,Cn as k,Cr as A,Ct as j,D as M,Da as N,Di as P,Dn as F,Dr as I,Dt as L,E as R,Ea as z,Ei as B,En as V,Er as H,Et as U,F as W,Fi as G,Fn as K,Ft as q,G as J,Gi as Y,Gn as X,Gr as Z,Gt as Q,H as $,Hi as ee,Hn as te,Hr as ne,Ht as re,I as ie,Ii as ae,In as oe,It as se,J as ce,Ji as le,Jn as ue,Jr as de,Jt as fe,K as pe,Ki as me,Kn as he,Kr as ge,Kt as _e,L as ve,Li as ye,Ln as be,Lt as xe,M as Se,Mi as Ce,Mn as we,Mr as Te,Mt as Ee,N as De,Ni as Oe,Nn as ke,Nt as Ae,O as je,Oa as Me,Oi as Ne,On as Pe,Or as Fe,Ot as Ie,P as Le,Pi as Re,Pn as ze,Pt as Be,Q as Ve,Qi as He,Qn as Ue,Qr as We,Qt as Ge,R as Ke,Ri as qe,Rn as Je,Rr as Ye,Rt as Xe,S as Ze,Sa as Qe,Si as $e,Sn as et,Sr as tt,St as nt,T as rt,Ta as it,Ti as at,Tn as ot,Tr as st,Tt as ct,U as lt,Ui as ut,Un as dt,Ur as ft,Ut as pt,V as mt,Vi as ht,Vn as gt,Vr as _t,Vt as vt,W as yt,Wi as bt,Wn as xt,Wr as St,Wt as Ct,X as wt,Xi as Tt,Xn as Et,Xr as Dt,Xt as Ot,Y as kt,Yi as At,Yn as jt,Yr as Mt,Yt as Nt,Z as Pt,Zi as Ft,Zn as It,Zr as Lt,Zt as Rt,_ as zt,_a as Bt,_n as Vt,_r as Ht,a as Ut,aa as Wt,ai as Gt,an as Kt,ar as qt,at as Jt,b as Yt,ba as Xt,bi as Zt,bn as Qt,br as $t,bt as en,c as tn,ca as nn,ci as rn,cn as an,cr as on,ct as sn,d as cn,da as ln,di as un,dn,dr as fn,dt as pn,ea as mn,ei as hn,en as gn,er as _n,et as vn,f as yn,fa as bn,fi as xn,fn as Sn,fr as Cn,g as wn,ga as Tn,gi as En,gn as Dn,gr as On,h as kn,ha as An,hi as jn,hn as Mn,hr as Nn,i as Pn,ia as Fn,ii as In,in as Ln,ir as Rn,it as zn,j as Bn,ji as Vn,jn as Hn,jr as Un,jt as Wn,k as Gn,ki as Kn,kn as qn,kr as Jn,kt as Yn,l as Xn,la as Zn,li as Qn,ln as $n,lr as er,lt as tr,m as nr,ma as rr,mi as ir,mn as ar,mr as or,n as sr,na as cr,ni as lr,nn as ur,nr as dr,nt as fr,o as pr,oa as mr,oi as hr,on as gr,or as _r,ot as vr,p as yr,pa as br,pi as xr,pn as Sr,pr as Cr,q as wr,qi as Tr,qn as Er,qr as Dr,qt as Or,r as kr,ra as Ar,ri as jr,rn as Mr,rr as Nr,rt as Pr,s as Fr,sa as Ir,si as Lr,sn as Rr,sr as zr,st as Br,t as Vr,ta as Hr,ti as Ur,tn as Wr,tr as Gr,tt as Kr,u as qr,ua as Jr,ui as Yr,un as Xr,ur as Zr,ut as Qr,v as $r,va as ei,vi as ti,vn as ni,vr as ri,vt as ii,w as ai,wa as oi,wi as si,wn as ci,wr as li,wt as ui,x as di,xa as fi,xi as pi,xn as mi,xr as hi,xt as gi,y as _i,ya as vi,yi,yn as bi,yr as xi,yt as Si,z as Ci,zi as wi,zn as Ti,zr as Ei,zt as Di}from"./src-32lVY8sD.mjs";import{C as Oi,E as ki,T as Ai,_ as ji,b as Mi,c as Ni,d as Pi,g as Fi,i as Ii,l as Li,m as Ri,n as zi,p as Bi,s as Vi,t as Hi,u as Ui,v as Wi,w as Gi,x as Ki,y as qi}from"./fs-traced-2B_-YK-g.mjs";import{a as Ji,d as Yi,f as Xi,i as Zi,l as Qi,n as $i,r as ea,t as ta,u as na}from"./logger-Dq-cRhcP.mjs";import{C as ra,S as ia,_ as aa,a as oa,b as sa,c as ca,d as la,f as ua,g as da,h as fa,i as pa,l as ma,m as ha,n as ga,o as _a,p as va,r as ya,s as ba,t as xa,u as Sa,x as Ca}from"./server-lock-Dngwkd_U.mjs";export{vi as AGENT_ID_MAX_LEN,Xt as AGENT_ID_RE,G as AGENT_WRITE_ORIGIN,z as AcpPermissionStore,D as AcpRegistry,pi as AcpThreadManager,yi as AgentFocusBroadcaster,ti as AgentPresenceBroadcaster,ae as AgentSessionCapacityError,ye as AgentSessionManager,Si as AutoStartDisabledError,Ht as BUNDLE_IDS,ri as BUNDLE_SCOPE,xi as BUNDLE_SKILL_NAME,Et as BacklinkIndex,Tr as CC1Broadcaster,i as CC1_CONTRACT_VERSION,gr as CONFIG_FILENAME,xt as CONFLICT_MARKER_RE,w as CURSOR_BUNDLE_PATHS_BY_PLATFORM,_i as ConfigSchema,f as DEFAULT_CHECKPOINT_RETENTION,In as DEFAULT_EMBEDDINGS_DIMENSIONS,Di as DEFAULT_PACK_ID,lt as DocumentDurabilityState,Gt as EMBEDDINGS_API_KEY_ENV,Vr as EPHEMERAL_PROJECT_DIR_PREFIX,ni as ExposureConsentError,oi as FEATURED_AGENT_IDS,mn as FILE_SYSTEM_WRITER,ue as FILE_WATCHER_ORIGIN,We as FileEmbeddingsBackend,Wr as GIT_PREFLIGHT_FAIL_SPAN_NAME,Hr as GIT_UPSTREAM_WRITER,N as GitDirAccessError,B as GitNotAvailableError,P as GitTooOldError,en as HOCUSPOCUS_AUTH_REJECTION_REASONS,gi as HocuspocusAuthRejection,nt as HocuspocusAuthTokenSchema,ar as HomeProjectRootError,ge as INSTALLED_AGENTS_SCHEMES,Qr as JSON_SCHEMA_DIALECT_2020_12,t as LINEAGE_EPOCH_KEY,x as LIVE_DERIVED_INDEX_DEBOUNCE_MS,T as LOG_MD_TEMPLATE,Yn as MANAGED_RENAME_ORIGIN,$e as MAX_ACP_THREADS,qe as MAX_AGENT_SESSIONS,si as MCP_CONNECTION_ID_HEADER,l as MCP_SERVER_NAME,wi as MIN_EVICTABLE_IDLE_MS,Ne as MIN_GIT_VERSION,yt as MISSING_OK_CONFIG_MESSAGE,Me as MalformedGitPointerError,fr as McpLogger,J as MissingOkConfigError,ht as OBSERVER_SYNC_ORIGIN,Rr as OK_OKIGNORE_TEMPLATE,$t as ONBOARDING_BUNDLE_IDS,s as ORPHAN_MODES,e as PROTOCOL_VERSION,ta as PinoLogger,ma as ProcessLockCollisionError,cn as ProjectGitInitError,b as ROLLBACK_ORIGIN,an as ROOT_GITIGNORE_TEMPLATE,sa as RUNTIME_VERSION,cr as SERVICE_WRITER,Cn as SKILL_INSTALL_EVENTS_FILE_REL,r as SKILL_STATE_TARGETS,vt as STARTER_FOLDERS,re as STARTER_FOLDER_FRONTMATTER_FILENAME,pt as STARTER_PACKS,Ct as STARTER_PACK_IDS,Q as STARTER_TEMPLATES,M as STATE_MANIFEST_FILENAME,Ca as STATE_SCHEMA_VERSION,a as SYSTEM_DOC_NAME,Rt as SeedPrerequisiteError,Ge as SeedRootDirError,xa as ServerLockCollisionError,sr as SingleFileNotAFileError,kr as SingleFileNotFoundError,Pn as SingleFileNotMarkdownError,je as StateManifestError,jt as TagIndex,hi as USER_GLOBAL_BUNDLE_IDS,Wn as __getShowAllWalkStatsForTesting,Ee as __resetShowAllWalkStatsForTesting,Sa as acquireProcessLock,ga as acquireServerLock,S as applyAgentMarkdownWrite,te as applyExternalChange,Xe as applySeed,Gn as assertCompatibleStateManifest,Kn as assertGitAvailable,v as assertNeverDiskEvent,Mn as assertNotHomeProjectRoot,Zt as attachAcpThreadSocket,ii as attachIdleShutdown,Yt as bootServer,Ue as buildAndOpenSkill,$n as buildConfigYmlContent,Pt as buildExecResult,bi as buildIngressPolicy,O as buildOkMcpStdioCommand,or as buildSkillZip,_e as buildStarterFolderFrontmatterYaml,Ar as buildWipTree,tt as bundleSkillMdPath,m as canonicalProjectKey,Dn as canonicalizeForCompare,Hn as classifyEvents,Hi as classifyFsPath,hn as clearAllEmbeddingsKeys,Lr as clearContributors,Or as coercePackId,u as colorFromSeed,Fn as commitUpstreamImport,Wt as commitWip,mr as commitWipFromTree,_ as compareSemver,st as composeEffectiveLinterConfig,H as composeFrontmatterSchemasConfig,X as containsConflictMarkers,we as contentHash,rn as contributorCount,ie as countShadowObjects,ve as countStaleAgentWipRefs,Ke as countWipRefs,Ae as createApiExtension,Ie as createAssetServeMiddleware,wr as createCollaborationHost,Ye as createContentFilter,Ei as createContentFilterAsync,Ur as createEmbeddingsSecretStore,Ut as createEphemeralProjectDir,dt as createExternalChangeHandler,nr as createFileLogger,mt as createLiveDerivedIndexExtension,kt as createMcpHttpHandler,Dr as createOsProbe,W as createPersistenceExtension,rt as createServer,De as createServerObserverExtension,bt as createStreamingErrorWriter,$i as createTestLogger,lr as describeStoredEmbeddingsKey,$r as detectClaudeDesktopPresence,Vn as detectGit,g as detectProjectShape,p as detectUserSkillHosts,Jt as discoverLockDirs,Jn as discoverMarkdownlintConfig,ur as emitPreflightFailureSpan,Ve as encodeDocName,d as encodeFolderRoute,vn as encodeSkillRoute,yn as ensureProjectGit,Xr as ensureProjectSkillGitignore,Y as errorResponse,ke as evictStaleTrackerEntries,Be as extractHeadings,vr as extractOkBinaryPath,It as extractWikiLinksFromMarkdown,Ce as fallbackPaths,yr as findEnclosingGitRoot,Pe as findEnclosingProjectRoot,y as findNativeMarkdownlintFile,kn as flushFileLogger,j as formatAuthRejectionWire,Qn as formatContributors,Yr as formatContributorsFrom,se as formatPackRationale,Ir as gcCheckpointRefs,Pr as getCurrentMcpLogger,Qt as getIngressContext,ir as getLocalDir,wn as getLogFilePath,ea as getLogger,zt as getLogsDir,aa as getMachineId,qi as getMeter,rr as getMetrics,Mi as getTracer,An as handleCollabSocketError,_t as handleSpawnCursor,mi as hasForwardingHeaders,Ci as hasGcLogLatch,c as iconFromClientName,Tn as incrementCollabSocketFilteredError,Bt as incrementServerObserverFire,dn as initContent,nn as initShadowRepo,Ki as initTelemetry,Ze as initToleranceTelemetryWriter,pn as installJsonSchemaDialect,tr as installPrettyZodErrors,Zi as installTestLoggers,_n as installUserSkill,F as isAllowedApiOrigin,ot as isAllowedWorkspaceHostHeader,le as isConfigDoc,ui as isHocuspocusAuthRejectionReason,Vt as isHomeDir,et as isHostAdmitted,fe as isKnownPackId,At as isLinkIndexExcludedDoc,V as isLoopbackAddress,Tt as isManagedArtifactDoc,k as isOriginAdmitted,n as isOrphanMode,ee as isPairedWriteOrigin,ne as isPathWithinDir,ci as isPeerAdmitted,ia as isProcessAlive,qn as isProjectRoot,Ft as isReservedForUserTree,ze as isSelfWrite,He as isSystemDoc,E as isToleranceTelemetryEnabled,ra as isValidLockPid,K as lastKnownHash,Zn as listRescueCheckpoints,Nt as listStarterPacks,it as loadCustomAgents,Le as loadPrincipal,ya as lockAdvertisesUi,la as lockBaseUrl,ua as lockFilePath,Ji as loggerFactory,Qi as logsCurrentPath,na as logsPreviousPath,jr as makeLazyEmbeddingsKeyStore,pa as markServerLockDraining,pe as mountMcpAndApi,zi as normalizeFsPath,A as originGitHubHost,Sn as packageVersionMajorMinor,ct as parseAuthRejectionWire,Oe as parseGitVersion,U as parseHocuspocusAuthToken,ce as parseKeepaliveConnectionId,oe as pathToDocName,xe as planSeed,pr as prepareSingleFileOpen,Br as processCommand,sn as processUsage,Nr as readAllTargets,Rn as readBundleDecision,Un as readOwnNativeRules,va as readProcessLock,ha as readProcessLockDetailed,$ as readProjectHeadState,Lt as readProjectLocalSemanticConfig,oa as readServerLock,qt as readServerPackageVersion,_r as readSkillInstallStateSnapshot,Bn as readStateManifest,zr as readTargetRecordedAt,on as readTargetVersion,he as reconcile,un as recordContributor,Cr as recordSkillInstallEvent,wt as registerAllTools,be as registerWrite,fa as releaseProcessLock,_a as releaseServerLock,Je as removeLastKnownHash,dr as reportSkillInstall,ei as resetMetrics,Gr as resolveBuiltinSkillHosts,o as resolveBundleEnabled,Nn as resolveBundledSkillDir,jn as resolveContentDir,ft as resolveCursorBinaryDefault,St as resolveCursorSpawnInvocation,I as resolveEffectiveLinterConfig,hr as resolveEmbeddingsCredential,En as resolveLockDir,Fe as resolveNativeConfigForDoc,Te as resolveNativeMarkdownlintConfig,Ot as resolvePack,Xn as resolvePackageVersion,fn as resolveSkillInstallReportSettings,Kr as resolveUiInfo,xn as restoreContributors,di as restoreLifecycleFromConflictsJson,Mt as rewriteMarkdownLinksForDocumentRename,Dt as rewriteWikiLinksForDocumentRename,Mr as runAuthReposSubprocess,Ln as runAuthStatusSubprocess,h as runCloneSubprocess,Kt as runDeviceFlowSubprocess,zn as runWithMcpLogger,de as safeContentPath,q as safeSubdir,Jr as safetyCheckpoint,at as sanitizeClientName,ln as saveInMemoryCheckpoint,bn as saveVersion,L as seedBasenameIndex,Fr as seedEphemeralProjectDir,tn as serializeError,Oi as setActiveSpanAttributes,ut as setupServerObservers,br as shadowGit,Gi as shutdownTelemetry,Yi as spansCurrentPath,Xi as spansPreviousPath,Z as spawnDetached,Er as splitMarkdownBlocks,Ti as startWatcher,me as streamingProblemEvent,xr as swapContributors,ai as teardownToleranceTelemetryWriter,fi as toBroadcasterKey,Ii as tracedAppendFileSync,Vi as tracedLinkSync,Ni as tracedMkdir,Li as tracedMkdirSync,Ui as tracedRename,Pi as tracedRenameSync,Bi as tracedRmSync,Ri as tracedRmdirSync,Fi as tracedUnlinkSync,ji as tracedWriteFile,Wi as tracedWriteFileSync,R as trustSystemCertificates,qr as untrackTrackedProjectSkillProjection,C as updateLastKnownHash,da as updateProcessLockPort,ba as updateServerLockPort,Qe as validateAgentId,gn as validateCloneInputs,On as validateSkillZip,ca as waitForServerLockDrain,Re as withHiddenWindowsConsole,Ai as withSpan,ki as withSpanSync,er as writeBundleDecision,li as writeMarkdownlintRule,Sr as writeRootGitignoreForNewRepo,Se as writeStateManifest,Zr as writeTargetVersion,gt as writeTracker};
@@ -1,4 +1,4 @@
1
- import{o as e}from"./chunk-DTipWd-i.mjs";import{K as t,pt as n,q as r}from"./sleep-DhRrtbfG.mjs";import{Dc as i,Ec as a,Mc as o,bo as s,ct as c,jc as l,lt as u}from"./src-tR2kRwXj.mjs";import{On as ee,Pi as d,at as f,ct as p,gi as m,ot as h,st as te}from"./src-BHDHmhMl.mjs";import{D as g,F as _,I as v,k as y}from"./fs-traced-2B_-YK-g.mjs";import{C as b,S as x,_ as S,f as C,r as w}from"./server-lock-Dngwkd_U.mjs";import{t as T}from"./yazl-DZr4PyKA.mjs";import{h as E,m as ne,x as re}from"./resolve-project-root-C94rZ_5O.mjs";import{c as D}from"./colors-DSyAT9Cz.mjs";import{a as O,i as ie}from"./acp-harness-probe-CVM8eJtq.mjs";import{D as k,E as A,S as ae,T as j,_ as oe,b as se,o as ce}from"./init-C8B6UI9S.mjs";import{n as le}from"./constants--qal1Ck2.mjs";import{t as M}from"./is-object-Bw0-z8qH.mjs";import"./loader-C6FofPdw.mjs";import"./skill-teardown-CbmpKJso.mjs";import"./preview-DfCA1MM8.mjs";import{execSync as ue,spawnSync as de}from"node:child_process";import{basename as N,dirname as P,join as F,relative as fe,resolve as I,sep as pe}from"node:path";import{cpSync as me,createWriteStream as he,existsSync as L,lstatSync as ge,mkdirSync as R,mkdtempSync as _e,readFileSync as z,readdirSync as B,readlinkSync as ve,rmSync as ye,statSync as be,writeFileSync as V}from"node:fs";import{arch as xe,freemem as Se,homedir as H,hostname as Ce,platform as we,release as Te,tmpdir as Ee,totalmem as De,type as Oe,uptime as ke}from"node:os";import"node:fs/promises";import{createHash as Ae}from"node:crypto";var je=n();const Me=new Set([`start`,`stop`,`status`,`clean`,`ui`,`mcp`,`preview`,`lint`,`deinit`,`auth`]);function Ne(e,t,n=ee){if(e!==void 0&&!Me.has(e))return null;let r=n(t);return r===null||r.distance===0?null:r.rootPath}let Pe=null;function Fe(e){Pe=e}function Ie(){return Pe??process.cwd()}function U(){return F(H(),`.ok`,`bug-reports`)}function Le(e=new Date){let t=e.toISOString().replace(/[:.]/g,`-`),n=U(),r=`${t}-bugreport`,i=F(n,`${r}.zip`);for(let e=2;L(i);e+=1)i=F(n,`${r}-${e}.zip`);return i}function Re(e,t){let n=F(e,`.ok`,`config.yml`);if(L(n))try{let e=z(n,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch(e){t?.warn({configPath:n,err:e},`bug-report: failed to read .ok/config.yml for project slug; using path-hash fallback`)}return L(F(e,`.ok`))?Ae(`sha256`).update(I(e)).digest(`hex`).slice(0,12):null}function ze(){let e={timestamp:new Date().toISOString(),platform:we(),osType:Oe(),osRelease:Te(),hostname:`[redacted]`,uptime:ke(),freeMem:Se(),totalMem:De(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=ue(`sw_vers -productVersion 2>/dev/null`,d({encoding:`utf8`})).trim()}catch{}try{let t=F(__dirname,`..`,`..`,`package.json`);L(t)&&(e.okVersion=JSON.parse(z(t,`utf8`)).version)}catch{}return e}const Be=[{prefix:`cli`,projectTagged:!0},{prefix:`desktop`,projectTagged:!1},{prefix:`mcp`,projectTagged:!1}];function Ve(e){let t=N(e);return Be.some(e=>e.projectTagged&&t.startsWith(`${e.prefix}.`))}function He(e,t){return Ke(e,t).files}const Ue=[`ShipIt_stderr.log`,`ShipIt_stdout.log`];function We(e,t=O){let n=F(e,`${t}.ShipIt`);return L(n)?Ue.map(e=>F(n,e)).filter(e=>L(e)):[]}function Ge(e){if(!L(e))return[];try{let t=new Map;for(let n of B(e).filter(e=>e.endsWith(`.yaml`)).sort()){let e=n.endsWith(`.sent.yaml`)?n.slice(0,-l.length):n.slice(0,-5),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}return[...t.values()].slice(-25).flat().map(t=>F(e,t))}catch{return[]}}function Ke(e,t){if(!L(t))return{files:[],excludedByProjectSlug:0};let n=B(t).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>F(t,e));if(!e)return{files:n,excludedByProjectSlug:0};let r=n.filter(Ve),i=[],a=r.filter(t=>{try{return z(t,`utf8`).includes(`"project":"${e}"`)}catch{return i.push(t),!1}});if(a.length===0)return{files:n,excludedByProjectSlug:0};let o=new Set([...a,...i]);return{files:n.filter(e=>!Ve(e)||o.has(e)),excludedByProjectSlug:r.length-o.size}}function qe(e){let t=F(e,`.ok`,`local`);return L(t)?{files:[`server.lock`,`last-spawn-error.log`,c].map(e=>F(t,e)).filter(e=>L(e))}:{files:[]}}function Je(e){let t=F(e,`.ok`,`local`,`logs`);return L(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>F(t,e)).filter(e=>L(e))}:{files:[]}}function Ye(e){if(e.redact){let{redacted:t,patterns:n,lineCount:r}=i(e.content);e.zipfile.addBuffer(Buffer.from(t,`utf8`),e.name),e.bundleFiles.push(e.name),n.length>0&&e.redactions.push({file:e.name,lineCount:r,patterns:n})}else e.zipfile.addBuffer(Buffer.from(e.content,`utf8`),e.name),e.bundleFiles.push(e.name)}function W(e){for(let t of e.files)try{Ye({zipfile:e.zipfile,name:`${e.prefix}/${N(t)}`,content:z(t,`utf8`),redact:e.redact,bundleFiles:e.bundleFiles,redactions:e.redactions})}catch(n){e.logger?.warn({file:t,prefix:e.prefix,err:n},`bug-report: skipped unreadable file`)}}async function Xe(t){let{redact:n,outputPath:r,logger:i}=t,s=t.userLogsDir??F(H(),`.ok`,`logs`),c=t.projectDir?Re(t.projectDir,i):null;R(P(r),{recursive:!0}),i?.info({projectSlug:c},`gathering diagnostic data`);let l=ze();l.desktop=t.desktop??null,l.language=t.language??null;let{files:u,excludedByProjectSlug:ee}=Ke(c,s),{files:d}=t.projectDir?qe(t.projectDir):{files:[]},{files:f}=t.projectDir?Je(t.projectDir):{files:[]},p=t.shipItLogFiles??[];i?.info({logFileCount:u.length,logFilesExcludedByProjectSlug:ee,lockFileCount:d.length,localSinkFileCount:f.length,shipItLogFileCount:p.length},`files collected`);let m=[],h=[],{ZipFile:te}=await import(`./yazl-jVENrf5i.mjs`).then(t=>e(t.default,1)),g=new te;W({zipfile:g,files:[...u,...p],prefix:`logs`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:d,prefix:`lockdir`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:f,prefix:`local-logs`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:t.bugReportLedgerFiles??[],prefix:o,redact:n,bundleFiles:h,redactions:m,logger:i});for(let e of t.extraFiles??[])try{let t=z(e.sourcePath),n=`extra/${e.zipName??N(e.sourcePath)}`;g.addBuffer(t,n),h.push(n)}catch(t){i?.warn({sourcePath:e.sourcePath,err:t},`extra file unreadable; omitted from bundle`)}t.note&&Ye({zipfile:g,name:`note.txt`,content:t.note,redact:n,bundleFiles:h,redactions:m});let _=JSON.stringify(l,null,2);g.addBuffer(Buffer.from(_,`utf8`),`sysinfo.json`),h.push(`sysinfo.json`);let v={generatedAt:new Date().toISOString(),disciplineVersion:`1.0.0`,projectSlug:c,files:h,redactions:m,sysinfo:l};g.addBuffer(Buffer.from(JSON.stringify(v,null,2),`utf8`),`MANIFEST.json`);let y=m.reduce((e,t)=>e+t.lineCount,0),b=new Set(p.map(e=>`logs/${N(e)}`)),x=h.filter(e=>b.has(e)),S=new Set((t.bugReportLedgerFiles??[]).map(e=>`${o}/${N(e)}`)),C=h.filter(e=>S.has(e)),w=c?h.filter(e=>e.startsWith(`logs/`)&&!Ve(e)&&!b.has(e)):[],T=[`# Bug Report Bundle`,``,`Generated: ${v.generatedAt}`,`Project: ${c??`(unscoped)`}`,`Discipline version: ${v.disciplineVersion}`,``,`## Contents`,``,...h.map(e=>`- ${e}`),``,`## Privacy`,``,...w.length>0?[`Scope: some collected logs are user-wide rather than project-scoped.`,`These are written once per machine per day and can contain activity`,`from other projects open on this machine, including captured console`,`output:`,...w.map(e=>`- ${e}`),``]:[],...x.length>0?[`Installer logs: written by the macOS update helper rather than by`,`OpenKnowledge itself, and machine-wide rather than scoped to any one`,`project. They record the install and update history of this app on`,`this machine. Only this app is collected, never other applications`,`that use the same update mechanism:`,...x.map(e=>`- ${e}`),``]:[],...C.length>0?[`Send history: a small record for each bug report previously generated`,`on this machine — when it was generated, whether sending it`,`succeeded, and why it failed if it did. This is what makes a failed`,`send diagnosable at all. It is machine-wide rather than scoped to`,`this project, so it names the other projects reports were filed`,`from. It carries no document content:`,...C.map(e=>`- ${e}`),``]:[],...n?[`This bundle was auto-redacted before packaging.`,`Patterns checked: ${a.join(`, `)}`,y>0?`${y} line(s) were scrubbed across ${m.length} file(s).`:`No redactions were needed.`,`See MANIFEST.json for the full redaction audit report.`,``,`This bundle is safe to attach to a GitHub issue.`]:[`Redaction was disabled for this bundle; file contents are unmodified.`]].join(`
1
+ import{o as e}from"./chunk-DTipWd-i.mjs";import{K as t,pt as n,q as r}from"./sleep-DhRrtbfG.mjs";import{Dc as i,Ec as a,Mc as o,bo as s,ct as c,jc as l,lt as u}from"./src-tR2kRwXj.mjs";import{On as ee,Pi as d,at as f,ct as p,gi as m,ot as h,st as te}from"./src-32lVY8sD.mjs";import{D as g,F as _,I as v,k as y}from"./fs-traced-2B_-YK-g.mjs";import{C as b,S as x,_ as S,f as C,r as w}from"./server-lock-Dngwkd_U.mjs";import{t as T}from"./yazl-DZr4PyKA.mjs";import{h as E,m as ne,x as re}from"./resolve-project-root-XuKmxBzQ.mjs";import{c as D}from"./colors-DSyAT9Cz.mjs";import{a as O,i as ie}from"./acp-harness-probe-DBIIsKVz.mjs";import{D as k,E as A,S as ae,T as j,_ as oe,b as se,o as ce}from"./init-PW1PHv2x.mjs";import{n as le}from"./constants-BXtZdqBu.mjs";import{t as M}from"./is-object-Bw0-z8qH.mjs";import"./loader-Cg2a3fTX.mjs";import"./skill-teardown-Dp8qru7m.mjs";import"./preview-B4X8PAmW.mjs";import{execSync as ue,spawnSync as de}from"node:child_process";import{basename as N,dirname as P,join as F,relative as fe,resolve as I,sep as pe}from"node:path";import{cpSync as me,createWriteStream as he,existsSync as L,lstatSync as ge,mkdirSync as R,mkdtempSync as _e,readFileSync as z,readdirSync as B,readlinkSync as ve,rmSync as ye,statSync as be,writeFileSync as V}from"node:fs";import{arch as xe,freemem as Se,homedir as H,hostname as Ce,platform as we,release as Te,tmpdir as Ee,totalmem as De,type as Oe,uptime as ke}from"node:os";import"node:fs/promises";import{createHash as Ae}from"node:crypto";var je=n();const Me=new Set([`start`,`stop`,`status`,`clean`,`ui`,`mcp`,`preview`,`lint`,`deinit`,`auth`]);function Ne(e,t,n=ee){if(e!==void 0&&!Me.has(e))return null;let r=n(t);return r===null||r.distance===0?null:r.rootPath}let Pe=null;function Fe(e){Pe=e}function Ie(){return Pe??process.cwd()}function U(){return F(H(),`.ok`,`bug-reports`)}function Le(e=new Date){let t=e.toISOString().replace(/[:.]/g,`-`),n=U(),r=`${t}-bugreport`,i=F(n,`${r}.zip`);for(let e=2;L(i);e+=1)i=F(n,`${r}-${e}.zip`);return i}function Re(e,t){let n=F(e,`.ok`,`config.yml`);if(L(n))try{let e=z(n,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch(e){t?.warn({configPath:n,err:e},`bug-report: failed to read .ok/config.yml for project slug; using path-hash fallback`)}return L(F(e,`.ok`))?Ae(`sha256`).update(I(e)).digest(`hex`).slice(0,12):null}function ze(){let e={timestamp:new Date().toISOString(),platform:we(),osType:Oe(),osRelease:Te(),hostname:`[redacted]`,uptime:ke(),freeMem:Se(),totalMem:De(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=ue(`sw_vers -productVersion 2>/dev/null`,d({encoding:`utf8`})).trim()}catch{}try{let t=F(__dirname,`..`,`..`,`package.json`);L(t)&&(e.okVersion=JSON.parse(z(t,`utf8`)).version)}catch{}return e}const Be=[{prefix:`cli`,projectTagged:!0},{prefix:`desktop`,projectTagged:!1},{prefix:`mcp`,projectTagged:!1}];function Ve(e){let t=N(e);return Be.some(e=>e.projectTagged&&t.startsWith(`${e.prefix}.`))}function He(e,t){return Ke(e,t).files}const Ue=[`ShipIt_stderr.log`,`ShipIt_stdout.log`];function We(e,t=O){let n=F(e,`${t}.ShipIt`);return L(n)?Ue.map(e=>F(n,e)).filter(e=>L(e)):[]}function Ge(e){if(!L(e))return[];try{let t=new Map;for(let n of B(e).filter(e=>e.endsWith(`.yaml`)).sort()){let e=n.endsWith(`.sent.yaml`)?n.slice(0,-l.length):n.slice(0,-5),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}return[...t.values()].slice(-25).flat().map(t=>F(e,t))}catch{return[]}}function Ke(e,t){if(!L(t))return{files:[],excludedByProjectSlug:0};let n=B(t).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>F(t,e));if(!e)return{files:n,excludedByProjectSlug:0};let r=n.filter(Ve),i=[],a=r.filter(t=>{try{return z(t,`utf8`).includes(`"project":"${e}"`)}catch{return i.push(t),!1}});if(a.length===0)return{files:n,excludedByProjectSlug:0};let o=new Set([...a,...i]);return{files:n.filter(e=>!Ve(e)||o.has(e)),excludedByProjectSlug:r.length-o.size}}function qe(e){let t=F(e,`.ok`,`local`);return L(t)?{files:[`server.lock`,`last-spawn-error.log`,c].map(e=>F(t,e)).filter(e=>L(e))}:{files:[]}}function Je(e){let t=F(e,`.ok`,`local`,`logs`);return L(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>F(t,e)).filter(e=>L(e))}:{files:[]}}function Ye(e){if(e.redact){let{redacted:t,patterns:n,lineCount:r}=i(e.content);e.zipfile.addBuffer(Buffer.from(t,`utf8`),e.name),e.bundleFiles.push(e.name),n.length>0&&e.redactions.push({file:e.name,lineCount:r,patterns:n})}else e.zipfile.addBuffer(Buffer.from(e.content,`utf8`),e.name),e.bundleFiles.push(e.name)}function W(e){for(let t of e.files)try{Ye({zipfile:e.zipfile,name:`${e.prefix}/${N(t)}`,content:z(t,`utf8`),redact:e.redact,bundleFiles:e.bundleFiles,redactions:e.redactions})}catch(n){e.logger?.warn({file:t,prefix:e.prefix,err:n},`bug-report: skipped unreadable file`)}}async function Xe(t){let{redact:n,outputPath:r,logger:i}=t,s=t.userLogsDir??F(H(),`.ok`,`logs`),c=t.projectDir?Re(t.projectDir,i):null;R(P(r),{recursive:!0}),i?.info({projectSlug:c},`gathering diagnostic data`);let l=ze();l.desktop=t.desktop??null,l.language=t.language??null;let{files:u,excludedByProjectSlug:ee}=Ke(c,s),{files:d}=t.projectDir?qe(t.projectDir):{files:[]},{files:f}=t.projectDir?Je(t.projectDir):{files:[]},p=t.shipItLogFiles??[];i?.info({logFileCount:u.length,logFilesExcludedByProjectSlug:ee,lockFileCount:d.length,localSinkFileCount:f.length,shipItLogFileCount:p.length},`files collected`);let m=[],h=[],{ZipFile:te}=await import(`./yazl-jVENrf5i.mjs`).then(t=>e(t.default,1)),g=new te;W({zipfile:g,files:[...u,...p],prefix:`logs`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:d,prefix:`lockdir`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:f,prefix:`local-logs`,redact:n,bundleFiles:h,redactions:m,logger:i}),W({zipfile:g,files:t.bugReportLedgerFiles??[],prefix:o,redact:n,bundleFiles:h,redactions:m,logger:i});for(let e of t.extraFiles??[])try{let t=z(e.sourcePath),n=`extra/${e.zipName??N(e.sourcePath)}`;g.addBuffer(t,n),h.push(n)}catch(t){i?.warn({sourcePath:e.sourcePath,err:t},`extra file unreadable; omitted from bundle`)}t.note&&Ye({zipfile:g,name:`note.txt`,content:t.note,redact:n,bundleFiles:h,redactions:m});let _=JSON.stringify(l,null,2);g.addBuffer(Buffer.from(_,`utf8`),`sysinfo.json`),h.push(`sysinfo.json`);let v={generatedAt:new Date().toISOString(),disciplineVersion:`1.0.0`,projectSlug:c,files:h,redactions:m,sysinfo:l};g.addBuffer(Buffer.from(JSON.stringify(v,null,2),`utf8`),`MANIFEST.json`);let y=m.reduce((e,t)=>e+t.lineCount,0),b=new Set(p.map(e=>`logs/${N(e)}`)),x=h.filter(e=>b.has(e)),S=new Set((t.bugReportLedgerFiles??[]).map(e=>`${o}/${N(e)}`)),C=h.filter(e=>S.has(e)),w=c?h.filter(e=>e.startsWith(`logs/`)&&!Ve(e)&&!b.has(e)):[],T=[`# Bug Report Bundle`,``,`Generated: ${v.generatedAt}`,`Project: ${c??`(unscoped)`}`,`Discipline version: ${v.disciplineVersion}`,``,`## Contents`,``,...h.map(e=>`- ${e}`),``,`## Privacy`,``,...w.length>0?[`Scope: some collected logs are user-wide rather than project-scoped.`,`These are written once per machine per day and can contain activity`,`from other projects open on this machine, including captured console`,`output:`,...w.map(e=>`- ${e}`),``]:[],...x.length>0?[`Installer logs: written by the macOS update helper rather than by`,`OpenKnowledge itself, and machine-wide rather than scoped to any one`,`project. They record the install and update history of this app on`,`this machine. Only this app is collected, never other applications`,`that use the same update mechanism:`,...x.map(e=>`- ${e}`),``]:[],...C.length>0?[`Send history: a small record for each bug report previously generated`,`on this machine — when it was generated, whether sending it`,`succeeded, and why it failed if it did. This is what makes a failed`,`send diagnosable at all. It is machine-wide rather than scoped to`,`this project, so it names the other projects reports were filed`,`from. It carries no document content:`,...C.map(e=>`- ${e}`),``]:[],...n?[`This bundle was auto-redacted before packaging.`,`Patterns checked: ${a.join(`, `)}`,y>0?`${y} line(s) were scrubbed across ${m.length} file(s).`:`No redactions were needed.`,`See MANIFEST.json for the full redaction audit report.`,``,`This bundle is safe to attach to a GitHub issue.`]:[`Redaction was disabled for this bundle; file contents are unmodified.`]].join(`
2
2
  `);g.addBuffer(Buffer.from(T,`utf8`),`README.md`),g.end();let E=he(r);return g.outputStream.pipe(E),await new Promise((e,t)=>{E.on(`close`,e),E.on(`error`,t)}),i?.info({bundlePath:r,fileCount:h.length,redactionCount:y},`bundle written`),{zipPath:r,summary:{projectSlug:c,files:h,redactions:m,redactedLineCount:y,generatedAt:v.generatedAt}}}var Ze=e(T(),1),G=e(D(),1);function Qe(e){return v({absPath:y(`user`,e,e),sideline:!1,warn:()=>{}}).value.appearance?.language??`system`}function $e({home:e=H(),env:n=process.env}={}){let i=Qe(e),{override:a,preferenceList:o}=g(n),{locale:c,source:l}=s({override:a,storedPreference:i,supportedLocales:r,preferenceList:o,autoDetectableLocales:t});return{preference:i,locale:c,source:l,systemLanguages:o}}function et(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function tt(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function K(e,t){if(typeof e==`string`)return et(e,t.contentDir);if(Array.isArray(e))return e.map(e=>K(e,t));if(!tt(e))return e;let n={};for(let[r,i]of Object.entries(e))n[r]=K(i,t);return n}function nt(e,t){let n=z(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
3
3
  `),i=n.split(`
4
4
  `),a=[];for(let e=0;e<i.length;e++){let n=i[e]??``;if(!(e===i.length-1&&n===``)){if(n.length===0){a.push(``);continue}try{let e=K(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}V(e,r?`${a.join(`
@@ -17,4 +17,4 @@ import{o as e}from"./chunk-DTipWd-i.mjs";import{K as t,pt as n,q as r}from"./sle
17
17
  `).replace(/\n/g,`\r
18
18
  `));let u=`${i?``:``}${l}`;return u!==r&&_(e,u,{mode:j(e)}),{kind:`removed`}}function gn(e){return e==null?!1:e.includes(`--type=utility`)&&e.includes(`--utility-sub-type=node.mojom.NodeService`)}function _n(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return`—`;let r=t-n,i=Math.floor(r/1e3);if(i<60)return`${i}s`;let a=Math.floor(i/60);if(a<60)return`${a}m ago`;let o=Math.floor(a/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function vn(e,t,n,r){if(t.status===`missing`||t.status===`corrupt`)return null;let i=t.lock,a=t.status===`alive`&&w(i)?{port:i.port,status:t.status,pid:i.pid,startedAt:i.startedAt,usage:r}:null;return{directory:i.worktreeRoot,server:{port:i.port,status:t.status,pid:i.pid,startedAt:i.startedAt,usage:r},ui:a,hostname:i.hostname,lockPath:t.lockPath,binary:n==null?null:h(n),command:n,isDesktop:gn(n)}}function Q(e){let t=e.server.status;return t===`alive`||t===`foreign-host`?e.isDesktop?`desktop`:t===`alive`?`running`:`foreign`:`stale`}const yn=new Set([`running`,`desktop`,`foreign`]);function bn(e){switch(e){case`running`:return G.default.green(e);case`desktop`:return G.default.blue(e);case`foreign`:return G.default.cyan(e);case`stale`:return G.default.yellow(e)}}function xn(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function Sn(e){return`${xn(e.server.usage)} | ${xn(e.ui?.usage??null)}`}function Cn(e){return`${e.server.port===0?`(starting)`:String(e.server.port)} / ${e.ui==null?`—`:String(e.ui.port)}`}function wn(e){if(e.length===0)return`No open-knowledge servers found.`;let t=[`DIRECTORY`,`PORTS (API/UI)`,`CPU/MEM (API | UI)`,`STATUS`,`PID`,`STARTED`,`BINARY`],n=e.map(e=>[e.directory,Cn(e),Sn(e),Q(e),String(e.server.pid),_n(e.server.startedAt),e.binary??`—`]),r=t.length,i=t.map(e=>e.length);for(let e of n)for(let t=0;t<r;t++)i[t]=Math.max(i[t]??0,(e[t]??``).length);let a=t.map((e,t)=>e.padEnd(i[t]??0)).join(` `).trimEnd(),o=e.map((e,t)=>{let a=n[t]??[],o=[];for(let t=0;t<r;t++){let n=(a[t]??``).padEnd(i[t]??0);if(t===3){let r=a[t]??``;n=bn(Q(e))+` `.repeat(Math.max(0,(i[t]??0)-r.length))}o.push(n)}return o.join(` `).trimEnd()}),s=G.default.dim(`To stop a server: ok stop <port|pid|directory|all>`);return[a,...o,``,s].join(`
19
19
  `)}async function Tn(e={}){let t=e.discover??f,n=e.inspect??X,r=e.log??(e=>console.log(e)),i=e.resolveCommand??te,a=e.resolveUsage??p,o=await t(),s=[];for(let e of o){let t=n(e,`server`),r=vn(e,t,t.status===`missing`||t.status===`corrupt`?null:i(t.lock.pid),t.status===`missing`||t.status===`corrupt`?null:a(t.lock.pid));r!=null&&s.push(r)}if(e.json){let e=s.map(e=>({...e,displayStatus:Q(e)}));r(JSON.stringify(e,null,2));return}r(wn(e.all?s:s.filter(e=>yn.has(Q(e)))))}function En(){return new re(`ps`).description(`List all running open-knowledge servers`).argument(`[modifier]`,`"all" to include stale (dead-pid) entries`).option(`--all`,`Include stale (dead-pid) entries (foreign-host shows by default)`).option(`--json`,`Emit structured JSON (always includes all statuses)`).action(async(e,t)=>{await Tn({all:t.all===!0||e===`all`,json:t.json===!0})})}function Dn(e,t,n={}){let r=n.isAlive??x,i=[];for(let[n,a]of[[`server`,e],[`ui`,t]])(a.status===`alive`||a.status===`foreign-host`&&r(a.lock.pid))&&i.push({name:n,pid:a.lock.pid,port:a.lock.port});return{targets:i}}function On(e){let t=e.inspect??(t=>t===`ui`?Z(e.lockDir):X(e.lockDir,t)),n=e.kill??((e,t)=>process.kill(e,t)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Dn(t(`server`),t(`ui`),{isAlive:e.isAlive});if(a.targets.length===0)return r(`No running open-knowledge processes.`),{stopped:[],failed:[],hadTargets:!1};let o=[],s=[];for(let e of a.targets)try{n(e.pid,`SIGTERM`),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}return o.length>0&&r(`Stopped: ${o.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `)}`),s.length>0&&i(`Failed to stop: ${s.map(({target:e,error:t})=>`${e.name} (pid=${e.pid}): ${t}`).join(`; `)}`),{stopped:o,failed:s,hadTargets:!0}}function $(e,t){return e.status===`alive`?!0:e.status===`foreign-host`?t(e.lock.pid):!1}async function kn(e,t=x){let n=await f(),r=null;for(let i of n){let n=X(i,`server`),a=Z(i);if($(n,t)&&n.lock.port===e||$(a,t)&&a.lock.port===e)return i;r===null&&($(n,t)&&n.lock.pid===e||$(a,t)&&a.lock.pid===e)&&(r=i)}return r}function An(e){let t=On({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function jn(e){return new re(`stop`).description(`Stop open-knowledge server(s). With no argument: stops the server for the current directory. Pass a port number, a directory path, or "all" to target globally.`).argument(`[target...]`,`port number, directory path (spaces OK), or "all"`).action(async t=>{let n=t.length===0?void 0:t.join(` `);if(n===void 0){e();let t=On({lockDir:m(process.cwd()),log:()=>{}});if(t.hadTargets){if(t.stopped.length>0){let e=t.stopped.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `);console.log(`Stopped: ${e}`)}t.failed.length>0&&(process.exitCode=1)}else await Tn({});return}if(n===`all`){let e=await f();if(e.length===0){console.log(`No running open-knowledge servers found.`);return}let t=0;for(let n of e){let e=X(n,`server`),r=Z(n);!$(e,x)&&!$(r,x)||(An(n),t++)}t===0&&console.log(`No running open-knowledge servers found.`);return}if(/^\d+$/.test(n)){let e=Number.parseInt(n,10),t=await kn(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}An(t);return}An(m(I(Ie(),n)))})}export{U as _,rn as a,Ne as b,sn as c,Z as d,X as f,Le as g,Xt as h,fn as i,cn as l,Yt as m,jn as n,ln as o,$t as p,En as r,an as s,On as t,nn as u,Ie as v,Fe as y};
20
- //# sourceMappingURL=src-CngO3W4j.mjs.map
20
+ //# sourceMappingURL=src-H5bQHekD.mjs.map
@@ -0,0 +1 @@
1
+ import{S as e,m as t,p as n,r}from"./start-d7sxUrTf.mjs";export{r as bootStartServer,n as resolveBundledReactShellDir,t as resolveHost,e as startCommand};
@@ -1,5 +1,5 @@
1
- import{j as e}from"./sleep-DhRrtbfG.mjs";import{bc as t,fc as n,hc as r,xc as i,yc as a}from"./src-tR2kRwXj.mjs";import{kn as o,o as s,ri as c,t as l}from"./src-BHDHmhMl.mjs";import{I as u,k as d}from"./fs-traced-2B_-YK-g.mjs";import{r as f}from"./server-lock-Dngwkd_U.mjs";import{C as p,S as m,x as h}from"./resolve-project-root-C94rZ_5O.mjs";import{c as g,f as _,h as v,l as y,n as b,o as x,r as S,s as C,t as w}from"./acp-harness-probe-CVM8eJtq.mjs";import{y as T}from"./init-C8B6UI9S.mjs";import{n as E}from"./constants--qal1Ck2.mjs";import{spawn as D}from"node:child_process";import{basename as O,dirname as k,resolve as A}from"node:path";import{existsSync as j,realpathSync as M}from"node:fs";import{tmpdir as N}from"node:os";import{rm as P}from"node:fs/promises";import{setTimeout as F}from"node:timers/promises";function I(e,t){return e.bind?.[0]??t.HOST??`127.0.0.1`}function L(e){if(e===`server`)return e;throw new m(`--only must be 'server'`)}function R(e=j){let t=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[A(t,`public`),A(t,`../../app/dist`),A(t,`../../../app/dist`)].find(t=>e(t))}function z(e){if(e.explicitDir!==void 0)return{dir:e.explicitDir,missingBundle:!1};if(e.only===`server`)return{dir:void 0,missingBundle:!1};let t=e.findBundledDir();return{dir:t,missingBundle:t===void 0}}function B(t){if(t===`off`)return`off`;if(!e.test(t))throw new m(`--idle-shutdown must be 'off' or a duration like 90s, 30m, 2h`);return t}function V(e){return e===`localhost`||e===`::1`||e===`[::1]`||e.startsWith(`127.`)}function H(e){return!e.flagBindSet&&!e.okBindSet&&e.hostEnvSet&&e.fileBindCount>1}function U(e){return!e.openBrowser||e.ephemeral||e.only===`server`||!e.servesUi?!1:(e.explicitOn||V(e.host))&&e.isTTY}function W(e,t){let n;try{n=new URL(t)}catch{throw new m(`${e} is not a valid URL: ${t}`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new m(`${e} must be an http(s) origin (got: ${t})`);return t}function G(e){return W(`--external-url`,e)}function K(e){let t=O(e).replace(/[^\x20-\x7E]/g,``).trim().slice(0,64);return`open-knowledge-server ${t.length>0?t:`unknown`}`}var q=class extends Error{cwd;constructor(e){super("This directory isn't set up yet. Run `ok init` first, then `ok start` again."),this.name=`OkDirMissingError`,this.cwd=e}},J=class extends Error{projectDir;constructor(e){super(`--project-dir must be a throwaway ${l}* directory under the OS temp dir. Refusing to write ephemeral session state into ${e}. Omit --project-dir to let ok start create (and clean up) its own.`),this.name=`EphemeralProjectDirNotThrowawayError`,this.projectDir=e}};function Y(e,t={}){let n=t.tmpdirFn??N,r=t.realpathFn??M,i=e=>{try{return r(e)}catch(t){return t.code===`ENOENT`?A(e):null}},a=A(e),o;try{o=r(a)}catch(e){if(e.code===`ENOENT`){let e=i(k(a));o=e===null?null:A(e,O(a))}else o=null}if(o===null)return!1;let s=i(n());return s===null?!1:k(o)===s&&O(o).startsWith(`ok-ephemeral-`)}function X(e,t,n=e=>P(e,{recursive:!0,force:!0})){return async()=>{try{await e()}finally{if(Y(t))try{await n(t)}catch(e){process.stderr.write(`[start] ephemeral temp dir reap failed for ${t}: ${e instanceof Error?e.message:String(e)}\n`)}else process.stderr.write(`[start] leaving ${t} in place: only ${l}* dirs under the OS temp dir are removed on ephemeral teardown\n`)}}}function Z(e,t={}){let n=t.exit??(e=>process.exit(e)),r=t.getActiveHandles??(()=>{let e=process._getActiveHandles;return e?e.call(process):null});return async()=>{let i=!1;try{await e()}catch(e){i=!0,t.log?.error({err:e},`idle-shutdown: destroy failed — exiting anyway`)}finally{let e=null;try{let t=r();if(t!==null){e={};for(let n of t){let t=n?.constructor?.name??`unknown`;e[t]=(e[t]??0)+1}}}catch{e=null}t.log?.info({event:`idle-shutdown-exit`,exitCode:+!!i,openHandles:e??{},handlesAvailable:e!==null},`idle-shutdown: teardown finished — exiting process`),n(+!!i)}}}async function Q(e){let{config:t,cwd:n,host:r}=e,i=e.skipAutoInit??!1,a=e.idleThresholdMs===void 0?18e5:e.idleThresholdMs,{existsSync:l,mkdirSync:u}=await import(`node:fs`),{basename:d,dirname:f,resolve:p}=await import(`node:path`),{bootServer:m,createEphemeralProjectDir:h,getLogger:g,resolveContentDir:y,resolveLockDir:x,seedEphemeralProjectDir:C,waitForServerLockDrain:E}=await import(`./src-BqEF6smt.mjs`),D=e.log??g(`start`),O=e.singleFile!==void 0,k=O?s(e.singleFile).canonicalFilePath:void 0,A=k?f(k):void 0,j=k?d(k):void 0,M,N=!1;if(A!==void 0)if(e.projectDir!==void 0){if(M=e.projectDir,!Y(M))throw new J(M);l(p(M,`.ok`,`config.yml`))||C(M,A)}else M=h(A),N=!0;let F=async()=>{if(!(!N||M===void 0)){if(!Y(M)){D.warn({ephemeralProjectDir:M},`[start] refusing to reap self-provisioned ephemeral dir: no longer resolves to an ok-ephemeral-* temp dir`);return}try{await P(M,{recursive:!0,force:!0})}catch(e){D.warn({err:e,ephemeralProjectDir:M},`[start] failed to reap self-provisioned ephemeral temp dir`)}}},I=M;if(!O){if(!i&&!o(n))throw new q(n);let t=process.env.OK_RECLAIM_DISABLE??null,r=e=>{let t=typeof e.event==`string`?e.event:``;(t.endsWith(`-failed`)||t.endsWith(`-error`)||t.endsWith(`-missing`))&&D.warn({event:e},`[start] reclaim sweep reported a problem`)};try{(e.repairMcpConfigsFn??(await import(`./repair-mcp-configs-7mR1x_gG.mjs`)).repairMcpConfigs)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] mcp-config repair sweep failed; continuing`)}try{(e.repairLaunchJsonFn??(await import(`./repair-launch-json-DF9ENtcc.mjs`)).repairLaunchJson)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] launch.json repair sweep failed; continuing`)}try{await(e.repairSkillsFn??(await import(`./repair-skills-BxzzWVm-.mjs`)).repairSkills)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] skill repair sweep failed; continuing`)}}let L=A??y(t,n);!O&&!l(L)&&(u(L,{recursive:!0}),D.info({contentDir:L},`Created content directory`));let R=v(),z=c(),B;try{{let e=x(M??n),t=Date.now(),r=await E(e);r!==`no-drain`&&D.info({event:`start-waited-for-draining-predecessor`,outcome:r,waitedMs:Date.now()-t,drainLockDir:e},r===`released`?`[start] predecessor server finished draining — proceeding`:`[start] predecessor server still draining after wait — proceeding to collide`)}B=await m({config:t,contentDir:L,projectDir:M??n,contentRoot:O?void 0:t.content.dir,port:e.port,host:r,quiet:!1,detectGh:_,tokenStore:R,embeddingsKeyStore:z,mcpTomlEditor:T(),...O?{ephemeral:!0,singleDocRelPath:j,gitEnabled:!1,gitPreflight:()=>({ok:!0,version:`0.0.0`,resolvedPath:`git`,source:`PATH`})}:{},localOpCliArgs:[process.execPath,process.argv[1]],probeHarnessManagedMcpEntry:(e,t)=>w(e,t),probePiAcpBridge:e=>S(e),ensurePiAcpBridge:e=>b(e),idleShutdownMs:a,...e.serverRuntime===void 0?{}:{serverRuntime:e.serverRuntime},...e.bind===void 0?{}:{bind:e.bind},skipAutoInit:!0,idleShutdownHandler:t=>{let n=t;return Z(I===void 0?n:X(n,I),{log:D,exit:e.idleExit})},log:D,...e.serveContentAssets===void 0?{}:{serveContentAssets:e.serveContentAssets},...e.reactShellDistDir?{reactShellDistDir:e.reactShellDistDir}:{}})}catch(e){throw await F(),e}let V=B.destroy,H=N?async()=>{try{await V()}finally{await F()}}:V;return{httpServer:B.httpServer,destroy:H,lockDir:B.lockDir,contentDir:L,port:B.port,ready:B.ready,degraded:B.degraded}}function $(e,t,n=()=>u({absPath:d(`user`,process.cwd()),sideline:!1,warn:()=>{}}).value){return t===void 0?e:n()}function ee(e){if(e===`browser`||e===`app`)return e;throw new m(`--mode must be 'browser' or 'app'`)}function te(e){return e.OK_CONSOLE_LEVEL!==void 0||e.LOG_LEVEL!==void 0?null:`warn`}function ne(e){let t=[`Stopping OpenKnowledge…`,`Saving pending changes and releasing the server lock — this can take a few seconds.`];return e===`SIGINT`&&t.push(`Press Ctrl+C again to force quit.`),t}async function re(e,o){let s=$(e,o.singleFile),c=te(process.env);c!==null&&(process.env.OK_CONSOLE_LEVEL=c);let{renderBanner:l}=await import(`./banner-B14xalho.mjs`),{accent:u,dim:d,error:f,warning:p}=await import(`./colors-CpP5E4wV.mjs`),m=process.cwd();process.title=K(m);let h;try{h=i(process.env)}catch(e){throw e instanceof a&&(console.error(f(e.message)),process.exit(78)),e}for(let e of h.diagnostics)console.warn(p(`[config] ${e.message}`));let g=t(s,h.layer),_=h.overrides.some(e=>e.envVar===`OK_BIND`),v=o.bind!==void 0&&o.bind.length>0?o.bind:void 0,y=process.env.HOST,b=y!==void 0&&y.trim()!==``?y:void 0,x=r(g),S=v??(_||b===void 0?[...x.bind]:[b]);H({flagBindSet:v!==void 0,okBindSet:_,hostEnvSet:b!==void 0,fileBindCount:x.bind.length})&&console.warn(p(`[config] HOST=${b} overrides server.bind — dropping the file-configured addresses (${x.bind.join(`, `)}). Use OK_BIND with a space-separated list to keep multiple binds.`));let C=S[0]??`127.0.0.1`,w=S,T=o.externalUrl,D=r(t(g,{server:{bind:w,...T===void 0?{}:{externalUrl:T}}}));if(D.allowExternal&&(!D.loopbackOnly||D.externalUrl)){let e=D.externalUrl??D.bind.join(`, `);console.warn(p([``,`⚠ EXTERNAL ACCESS ENABLED (server.allowExternal) — no server-side authentication.`,` This server is reachable beyond this machine (${e}). Anyone who can`,` reach it has FULL control of this knowledge base — sync, publishing, GitHub`,` credentials, and local operations (clone, sign-in, repo spawn).`,` Restrict who can reach it at the edge: a Tailscale ACL, a reverse proxy with`,` auth (Cloudflare Access, oauth2-proxy), or a firewall.`,``].join(`
2
- `)))}let O=o.port===void 0?void 0:Number(o.port),k=h.overrides.find(e=>e.envVar===`PORT`)?.value,A=O??k??s.server?.port,j=z({explicitDir:o.reactShellDistDir,only:o.only,findBundledDir:R}),M=j.dir;j.missingBundle&&console.warn(`bundled web UI not found — serving /api and /mcp only. Reinstall @inkeep/open-knowledge, or build packages/app in a source checkout.`);let N;try{N=await Q({config:s,cwd:m,host:C,port:A,bind:w,...o.serveContentAssets===void 0?{}:{serveContentAssets:o.serveContentAssets},...M?{reactShellDistDir:M}:{},idleThresholdMs:n(o.idleShutdown??D.idleShutdown),serverRuntime:D,...o.singleFile?{singleFile:o.singleFile}:{},...o.projectDir?{projectDir:o.projectDir}:{}})}catch(e){e instanceof q&&(console.error(f(e.message)),process.exit(1)),e instanceof J&&(console.error(f(e.message)),process.exit(1));let t=await import(`./src-BqEF6smt.mjs`);if((e instanceof t.GitNotAvailableError||e instanceof t.GitTooOldError)&&process.exit(78),e instanceof t.ExposureConsentError&&(console.error(f(e.message)),process.exit(78)),(e instanceof t.SingleFileNotFoundError||e instanceof t.SingleFileNotAFileError||e instanceof t.SingleFileNotMarkdownError)&&(console.error(f(e.message)),process.exit(1)),e instanceof t.MissingOkConfigError&&(console.error(f(e.message)),process.exit(1)),oe(e,t)){let e=t.resolveLockDir(m),n=null;try{n=await ie({readServerLock:()=>t.readServerLock(e),now:Date.now,sleep:e=>F(e),timeoutMs:3e3,pollIntervalMs:50})}catch(e){process.stderr.write(`[start] spawn-or-reuse: lock poll failed (${e instanceof Error?e.message:String(e)}) — falling back to the collision message\n`)}if(n!==null){let[e,...t]=ae(n);console.log(u(e));for(let e of t)console.log(d(e));process.exit(0)}}let n=se(e,m,t);n!==null&&(console.error(f(n)),process.exit(1)),console.error(`${f(`Failed to start:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exit(1)}let P=!1,I=async e=>{if(P)return;P=!0;let[t,...n]=ne(e);console.log(u(`\n${t}`));for(let e of n)console.log(d(` ${e}`));try{await N.destroy()}catch(e){console.error(`${f(`destroy() failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exitCode=1}process.exit(process.exitCode??0)};process.once(`SIGINT`,()=>{I(`SIGINT`)}),process.once(`SIGTERM`,()=>{I(`SIGTERM`)});let L=`http://${C.includes(`:`)&&!C.startsWith(`[`)?`[${C}]`:C}:${N.port}`,B=C===`0.0.0.0`||C===`::`?`http://0.0.0.0:${N.port}`:void 0,V=L;console.log(l({name:`open-knowledge`,version:E,localUrl:V,networkUrl:B,nextSteps:[`Open the Editor URL in your browser to start editing.`]}));let W={"shadow-repo":`Version history and branch-switch safety unavailable`,"file-watcher":`External file changes will not sync to the editor`,"head-watcher":`Git branch switches may cause document inconsistency`};N.ready.then(async()=>{if(N.degraded.length>0){console.log();for(let e of N.degraded){let t=W[e]??`${e} (check server logs for details)`;console.warn(` ${p(`⚠`)} ${p(e)}: ${d(t)}`)}console.log()}if(U({openBrowser:o.openBrowser!==!1&&D.openBrowser,explicitOn:o.openBrowser!==!1&&g.server?.openBrowser===!0,host:C,isTTY:process.stdout.isTTY===!0,ephemeral:o.singleFile!==void 0,only:o.only,servesUi:M!==void 0})){let{openBrowser:e}=await import(`./open-browser-CqoTUuyv.mjs`);e(V)}}).catch(e=>{console.error(` ${f(`Server initialization failed:`)} ${e instanceof Error?e.message:String(e)}`)})}async function ie(e){let t=e.now()+e.timeoutMs,n=e.readServerLock();for(;n!==null&&n.draining!==!0&&n.port<=0&&e.now()<t;)await e.sleep(e.pollIntervalMs),n=e.readServerLock();return n===null||n.draining===!0||n.port<=0?null:f(n)&&n.url!==void 0?{url:n.url,kind:n.kind,pid:n.pid,servesUi:!0}:{url:n.url??`http://127.0.0.1:${n.port}`,kind:n.kind,pid:n.pid,servesUi:!1}}function ae(e){return[`${e.kind===`mcp-spawned`?`An MCP-spawned OpenKnowledge server is already running on this project`:`OpenKnowledge is already running on this project`} (pid ${e.pid}).`,` ${e.url}`,"Leaving it running — run `ok stop` first if you want a fresh server."]}function oe(e,t){let n=t.ServerLockCollisionError;return n!==void 0&&e instanceof n}function se(e,t,n){let r=n.ServerLockCollisionError;if(r===void 0||!(e instanceof r))return null;try{let e=n.readServerLock(n.resolveLockDir(t));return e&&e.kind===`mcp-spawned`?"An MCP-spawned server holds this lock; it should release on idle-shutdown (~30 min). Or run `ok stop`.":"OpenKnowledge server is already running on this project — check `ok status` or `ok stop`."}catch{return null}}function ce(e){return new h(`start`).description(`Start the OpenKnowledge server (UI + API + MCP + collab on one port)`).option(`-p, --port <port>`,`Server port`,void 0).option(`--bind <address>`,`Bind address (repeatable; default 127.0.0.1 — loopback only)`,(e,t)=>[...t??[],e]).option(`--no-open-browser`,`Do not open the browser after start (interactive loopback starts open it by default)`).option(`--only <module>`,`Serve one module: 'server' (API + MCP only, no shell or browser)`,L).option(`--idle-shutdown <duration>`,`Shut the server down after this long with no connected clients ('off', or a duration like 90s, 30m, 2h; default 30m)`,B).option(`--mode <mode>`,`Force dispatch mode: 'browser' or 'app'`,ee).option(`--serve-content-assets`,`Serve content assets from this server (now the default; kept for compatibility)`).option(`--react-shell-dist-dir <path>`,`Serve React shell from <path>`).addOption(new p(`--single-file <path>`,`No-project ephemeral single-file mode: scope the server to one markdown file (git + MCP off)`).hideHelp()).addOption(new p(`--project-dir <dir>`,`Throwaway project root for --single-file (where ephemeral .ok/ state lives)`).hideHelp()).option(`--external-url <url>`,`Canonical external origin clients dial (sets server.externalUrl for this run) — its host joins the Host/Origin allowlists (CORS + external-Host admission). External exposure additionally requires consent (OK_ALLOW_EXTERNAL=1 or server.allowExternal).`,G).action(async t=>{let n=e();if(t.only===`server`&&t.reactShellDistDir!==void 0&&(process.stderr.write(`error: option '--only server' cannot be combined with '--react-shell-dist-dir'
1
+ import{j as e}from"./sleep-DhRrtbfG.mjs";import{bc as t,fc as n,hc as r,xc as i,yc as a}from"./src-tR2kRwXj.mjs";import{kn as o,o as s,ri as c,t as l}from"./src-32lVY8sD.mjs";import{I as u,k as d}from"./fs-traced-2B_-YK-g.mjs";import{r as f}from"./server-lock-Dngwkd_U.mjs";import{C as p,S as m,x as h}from"./resolve-project-root-XuKmxBzQ.mjs";import{c as g,f as _,h as v,l as y,n as b,o as x,r as S,s as C,t as w}from"./acp-harness-probe-DBIIsKVz.mjs";import{y as T}from"./init-PW1PHv2x.mjs";import{n as E}from"./constants-BXtZdqBu.mjs";import{spawn as D}from"node:child_process";import{basename as O,dirname as k,resolve as A}from"node:path";import{existsSync as j,realpathSync as M}from"node:fs";import{tmpdir as N}from"node:os";import{rm as P}from"node:fs/promises";import{setTimeout as F}from"node:timers/promises";function I(e,t){return e.bind?.[0]??t.HOST??`127.0.0.1`}function L(e){if(e===`server`)return e;throw new m(`--only must be 'server'`)}function R(e=j){let t=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[A(t,`public`),A(t,`../../app/dist`),A(t,`../../../app/dist`)].find(t=>e(t))}function z(e){if(e.explicitDir!==void 0)return{dir:e.explicitDir,missingBundle:!1};if(e.only===`server`)return{dir:void 0,missingBundle:!1};let t=e.findBundledDir();return{dir:t,missingBundle:t===void 0}}function B(t){if(t===`off`)return`off`;if(!e.test(t))throw new m(`--idle-shutdown must be 'off' or a duration like 90s, 30m, 2h`);return t}function V(e){return e===`localhost`||e===`::1`||e===`[::1]`||e.startsWith(`127.`)}function H(e){return!e.flagBindSet&&!e.okBindSet&&e.hostEnvSet&&e.fileBindCount>1}function U(e){return!e.openBrowser||e.ephemeral||e.only===`server`||!e.servesUi?!1:(e.explicitOn||V(e.host))&&e.isTTY}function W(e,t){let n;try{n=new URL(t)}catch{throw new m(`${e} is not a valid URL: ${t}`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new m(`${e} must be an http(s) origin (got: ${t})`);return t}function G(e){return W(`--external-url`,e)}function K(e){let t=O(e).replace(/[^\x20-\x7E]/g,``).trim().slice(0,64);return`open-knowledge-server ${t.length>0?t:`unknown`}`}var q=class extends Error{cwd;constructor(e){super("This directory isn't set up yet. Run `ok init` first, then `ok start` again."),this.name=`OkDirMissingError`,this.cwd=e}},J=class extends Error{projectDir;constructor(e){super(`--project-dir must be a throwaway ${l}* directory under the OS temp dir. Refusing to write ephemeral session state into ${e}. Omit --project-dir to let ok start create (and clean up) its own.`),this.name=`EphemeralProjectDirNotThrowawayError`,this.projectDir=e}};function Y(e,t={}){let n=t.tmpdirFn??N,r=t.realpathFn??M,i=e=>{try{return r(e)}catch(t){return t.code===`ENOENT`?A(e):null}},a=A(e),o;try{o=r(a)}catch(e){if(e.code===`ENOENT`){let e=i(k(a));o=e===null?null:A(e,O(a))}else o=null}if(o===null)return!1;let s=i(n());return s===null?!1:k(o)===s&&O(o).startsWith(`ok-ephemeral-`)}function X(e,t,n=e=>P(e,{recursive:!0,force:!0})){return async()=>{try{await e()}finally{if(Y(t))try{await n(t)}catch(e){process.stderr.write(`[start] ephemeral temp dir reap failed for ${t}: ${e instanceof Error?e.message:String(e)}\n`)}else process.stderr.write(`[start] leaving ${t} in place: only ${l}* dirs under the OS temp dir are removed on ephemeral teardown\n`)}}}function Z(e,t={}){let n=t.exit??(e=>process.exit(e)),r=t.getActiveHandles??(()=>{let e=process._getActiveHandles;return e?e.call(process):null});return async()=>{let i=!1;try{await e()}catch(e){i=!0,t.log?.error({err:e},`idle-shutdown: destroy failed — exiting anyway`)}finally{let e=null;try{let t=r();if(t!==null){e={};for(let n of t){let t=n?.constructor?.name??`unknown`;e[t]=(e[t]??0)+1}}}catch{e=null}t.log?.info({event:`idle-shutdown-exit`,exitCode:+!!i,openHandles:e??{},handlesAvailable:e!==null},`idle-shutdown: teardown finished — exiting process`),n(+!!i)}}}async function Q(e){let{config:t,cwd:n,host:r}=e,i=e.skipAutoInit??!1,a=e.idleThresholdMs===void 0?18e5:e.idleThresholdMs,{existsSync:l,mkdirSync:u}=await import(`node:fs`),{basename:d,dirname:f,resolve:p}=await import(`node:path`),{bootServer:m,createEphemeralProjectDir:h,getLogger:g,resolveContentDir:y,resolveLockDir:x,seedEphemeralProjectDir:C,waitForServerLockDrain:E}=await import(`./src-DQ3dkBL8.mjs`),D=e.log??g(`start`),O=e.singleFile!==void 0,k=O?s(e.singleFile).canonicalFilePath:void 0,A=k?f(k):void 0,j=k?d(k):void 0,M,N=!1;if(A!==void 0)if(e.projectDir!==void 0){if(M=e.projectDir,!Y(M))throw new J(M);l(p(M,`.ok`,`config.yml`))||C(M,A)}else M=h(A),N=!0;let F=async()=>{if(!(!N||M===void 0)){if(!Y(M)){D.warn({ephemeralProjectDir:M},`[start] refusing to reap self-provisioned ephemeral dir: no longer resolves to an ok-ephemeral-* temp dir`);return}try{await P(M,{recursive:!0,force:!0})}catch(e){D.warn({err:e,ephemeralProjectDir:M},`[start] failed to reap self-provisioned ephemeral temp dir`)}}},I=M;if(!O){if(!i&&!o(n))throw new q(n);let t=process.env.OK_RECLAIM_DISABLE??null,r=e=>{let t=typeof e.event==`string`?e.event:``;(t.endsWith(`-failed`)||t.endsWith(`-error`)||t.endsWith(`-missing`))&&D.warn({event:e},`[start] reclaim sweep reported a problem`)};try{(e.repairMcpConfigsFn??(await import(`./repair-mcp-configs-YzmkgoIk.mjs`)).repairMcpConfigs)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] mcp-config repair sweep failed; continuing`)}try{(e.repairLaunchJsonFn??(await import(`./repair-launch-json-MRFbgFDR.mjs`)).repairLaunchJson)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] launch.json repair sweep failed; continuing`)}try{await(e.repairSkillsFn??(await import(`./repair-skills-DycFH6DB.mjs`)).repairSkills)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){D.warn({err:e},`[start] skill repair sweep failed; continuing`)}}let L=A??y(t,n);!O&&!l(L)&&(u(L,{recursive:!0}),D.info({contentDir:L},`Created content directory`));let R=v(),z=c(),B;try{{let e=x(M??n),t=Date.now(),r=await E(e);r!==`no-drain`&&D.info({event:`start-waited-for-draining-predecessor`,outcome:r,waitedMs:Date.now()-t,drainLockDir:e},r===`released`?`[start] predecessor server finished draining — proceeding`:`[start] predecessor server still draining after wait — proceeding to collide`)}B=await m({config:t,contentDir:L,projectDir:M??n,contentRoot:O?void 0:t.content.dir,port:e.port,host:r,quiet:!1,detectGh:_,tokenStore:R,embeddingsKeyStore:z,mcpTomlEditor:T(),...O?{ephemeral:!0,singleDocRelPath:j,gitEnabled:!1,gitPreflight:()=>({ok:!0,version:`0.0.0`,resolvedPath:`git`,source:`PATH`})}:{},localOpCliArgs:[process.execPath,process.argv[1]],probeHarnessManagedMcpEntry:(e,t)=>w(e,t),probePiAcpBridge:e=>S(e),ensurePiAcpBridge:e=>b(e),idleShutdownMs:a,...e.serverRuntime===void 0?{}:{serverRuntime:e.serverRuntime},...e.bind===void 0?{}:{bind:e.bind},skipAutoInit:!0,idleShutdownHandler:t=>{let n=t;return Z(I===void 0?n:X(n,I),{log:D,exit:e.idleExit})},log:D,...e.serveContentAssets===void 0?{}:{serveContentAssets:e.serveContentAssets},...e.reactShellDistDir?{reactShellDistDir:e.reactShellDistDir}:{}})}catch(e){throw await F(),e}let V=B.destroy,H=N?async()=>{try{await V()}finally{await F()}}:V;return{httpServer:B.httpServer,destroy:H,lockDir:B.lockDir,contentDir:L,port:B.port,ready:B.ready,degraded:B.degraded}}function $(e,t,n=()=>u({absPath:d(`user`,process.cwd()),sideline:!1,warn:()=>{}}).value){return t===void 0?e:n()}function ee(e){if(e===`browser`||e===`app`)return e;throw new m(`--mode must be 'browser' or 'app'`)}function te(e){return e.OK_CONSOLE_LEVEL!==void 0||e.LOG_LEVEL!==void 0?null:`warn`}function ne(e){let t=[`Stopping OpenKnowledge…`,`Saving pending changes and releasing the server lock — this can take a few seconds.`];return e===`SIGINT`&&t.push(`Press Ctrl+C again to force quit.`),t}async function re(e,o){let s=$(e,o.singleFile),c=te(process.env);c!==null&&(process.env.OK_CONSOLE_LEVEL=c);let{renderBanner:l}=await import(`./banner-B14xalho.mjs`),{accent:u,dim:d,error:f,warning:p}=await import(`./colors-CpP5E4wV.mjs`),m=process.cwd();process.title=K(m);let h;try{h=i(process.env)}catch(e){throw e instanceof a&&(console.error(f(e.message)),process.exit(78)),e}for(let e of h.diagnostics)console.warn(p(`[config] ${e.message}`));let g=t(s,h.layer),_=h.overrides.some(e=>e.envVar===`OK_BIND`),v=o.bind!==void 0&&o.bind.length>0?o.bind:void 0,y=process.env.HOST,b=y!==void 0&&y.trim()!==``?y:void 0,x=r(g),S=v??(_||b===void 0?[...x.bind]:[b]);H({flagBindSet:v!==void 0,okBindSet:_,hostEnvSet:b!==void 0,fileBindCount:x.bind.length})&&console.warn(p(`[config] HOST=${b} overrides server.bind — dropping the file-configured addresses (${x.bind.join(`, `)}). Use OK_BIND with a space-separated list to keep multiple binds.`));let C=S[0]??`127.0.0.1`,w=S,T=o.externalUrl,D=r(t(g,{server:{bind:w,...T===void 0?{}:{externalUrl:T}}}));if(D.allowExternal&&(!D.loopbackOnly||D.externalUrl)){let e=D.externalUrl??D.bind.join(`, `);console.warn(p([``,`⚠ EXTERNAL ACCESS ENABLED (server.allowExternal) — no server-side authentication.`,` This server is reachable beyond this machine (${e}). Anyone who can`,` reach it has FULL control of this knowledge base — sync, publishing, GitHub`,` credentials, and local operations (clone, sign-in, repo spawn).`,` Restrict who can reach it at the edge: a Tailscale ACL, a reverse proxy with`,` auth (Cloudflare Access, oauth2-proxy), or a firewall.`,``].join(`
2
+ `)))}let O=o.port===void 0?void 0:Number(o.port),k=h.overrides.find(e=>e.envVar===`PORT`)?.value,A=O??k??s.server?.port,j=z({explicitDir:o.reactShellDistDir,only:o.only,findBundledDir:R}),M=j.dir;j.missingBundle&&console.warn(`bundled web UI not found — serving /api and /mcp only. Reinstall @inkeep/open-knowledge, or build packages/app in a source checkout.`);let N;try{N=await Q({config:s,cwd:m,host:C,port:A,bind:w,...o.serveContentAssets===void 0?{}:{serveContentAssets:o.serveContentAssets},...M?{reactShellDistDir:M}:{},idleThresholdMs:n(o.idleShutdown??D.idleShutdown),serverRuntime:D,...o.singleFile?{singleFile:o.singleFile}:{},...o.projectDir?{projectDir:o.projectDir}:{}})}catch(e){e instanceof q&&(console.error(f(e.message)),process.exit(1)),e instanceof J&&(console.error(f(e.message)),process.exit(1));let t=await import(`./src-DQ3dkBL8.mjs`);if((e instanceof t.GitNotAvailableError||e instanceof t.GitTooOldError)&&process.exit(78),e instanceof t.ExposureConsentError&&(console.error(f(e.message)),process.exit(78)),(e instanceof t.SingleFileNotFoundError||e instanceof t.SingleFileNotAFileError||e instanceof t.SingleFileNotMarkdownError)&&(console.error(f(e.message)),process.exit(1)),e instanceof t.MissingOkConfigError&&(console.error(f(e.message)),process.exit(1)),oe(e,t)){let e=t.resolveLockDir(m),n=null;try{n=await ie({readServerLock:()=>t.readServerLock(e),now:Date.now,sleep:e=>F(e),timeoutMs:3e3,pollIntervalMs:50})}catch(e){process.stderr.write(`[start] spawn-or-reuse: lock poll failed (${e instanceof Error?e.message:String(e)}) — falling back to the collision message\n`)}if(n!==null){let[e,...t]=ae(n);console.log(u(e));for(let e of t)console.log(d(e));process.exit(0)}}let n=se(e,m,t);n!==null&&(console.error(f(n)),process.exit(1)),console.error(`${f(`Failed to start:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exit(1)}let P=!1,I=async e=>{if(P)return;P=!0;let[t,...n]=ne(e);console.log(u(`\n${t}`));for(let e of n)console.log(d(` ${e}`));try{await N.destroy()}catch(e){console.error(`${f(`destroy() failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exitCode=1}process.exit(process.exitCode??0)};process.once(`SIGINT`,()=>{I(`SIGINT`)}),process.once(`SIGTERM`,()=>{I(`SIGTERM`)});let L=`http://${C.includes(`:`)&&!C.startsWith(`[`)?`[${C}]`:C}:${N.port}`,B=C===`0.0.0.0`||C===`::`?`http://0.0.0.0:${N.port}`:void 0,V=L;console.log(l({name:`open-knowledge`,version:E,localUrl:V,networkUrl:B,nextSteps:[`Open the Editor URL in your browser to start editing.`]}));let W={"shadow-repo":`Version history and branch-switch safety unavailable`,"file-watcher":`External file changes will not sync to the editor`,"head-watcher":`Git branch switches may cause document inconsistency`};N.ready.then(async()=>{if(N.degraded.length>0){console.log();for(let e of N.degraded){let t=W[e]??`${e} (check server logs for details)`;console.warn(` ${p(`⚠`)} ${p(e)}: ${d(t)}`)}console.log()}if(U({openBrowser:o.openBrowser!==!1&&D.openBrowser,explicitOn:o.openBrowser!==!1&&g.server?.openBrowser===!0,host:C,isTTY:process.stdout.isTTY===!0,ephemeral:o.singleFile!==void 0,only:o.only,servesUi:M!==void 0})){let{openBrowser:e}=await import(`./open-browser-D60Dz1iI.mjs`);e(V)}}).catch(e=>{console.error(` ${f(`Server initialization failed:`)} ${e instanceof Error?e.message:String(e)}`)})}async function ie(e){let t=e.now()+e.timeoutMs,n=e.readServerLock();for(;n!==null&&n.draining!==!0&&n.port<=0&&e.now()<t;)await e.sleep(e.pollIntervalMs),n=e.readServerLock();return n===null||n.draining===!0||n.port<=0?null:f(n)&&n.url!==void 0?{url:n.url,kind:n.kind,pid:n.pid,servesUi:!0}:{url:n.url??`http://127.0.0.1:${n.port}`,kind:n.kind,pid:n.pid,servesUi:!1}}function ae(e){return[`${e.kind===`mcp-spawned`?`An MCP-spawned OpenKnowledge server is already running on this project`:`OpenKnowledge is already running on this project`} (pid ${e.pid}).`,` ${e.url}`,"Leaving it running — run `ok stop` first if you want a fresh server."]}function oe(e,t){let n=t.ServerLockCollisionError;return n!==void 0&&e instanceof n}function se(e,t,n){let r=n.ServerLockCollisionError;if(r===void 0||!(e instanceof r))return null;try{let e=n.readServerLock(n.resolveLockDir(t));return e&&e.kind===`mcp-spawned`?"An MCP-spawned server holds this lock; it should release on idle-shutdown (~30 min). Or run `ok stop`.":"OpenKnowledge server is already running on this project — check `ok status` or `ok stop`."}catch{return null}}function ce(e){return new h(`start`).description(`Start the OpenKnowledge server (UI + API + MCP + collab on one port)`).option(`-p, --port <port>`,`Server port`,void 0).option(`--bind <address>`,`Bind address (repeatable; default 127.0.0.1 — loopback only)`,(e,t)=>[...t??[],e]).option(`--no-open-browser`,`Do not open the browser after start (interactive loopback starts open it by default)`).option(`--only <module>`,`Serve one module: 'server' (API + MCP only, no shell or browser)`,L).option(`--idle-shutdown <duration>`,`Shut the server down after this long with no connected clients ('off', or a duration like 90s, 30m, 2h; default 30m)`,B).option(`--mode <mode>`,`Force dispatch mode: 'browser' or 'app'`,ee).option(`--serve-content-assets`,`Serve content assets from this server (now the default; kept for compatibility)`).option(`--react-shell-dist-dir <path>`,`Serve React shell from <path>`).addOption(new p(`--single-file <path>`,`No-project ephemeral single-file mode: scope the server to one markdown file (git + MCP off)`).hideHelp()).addOption(new p(`--project-dir <dir>`,`Throwaway project root for --single-file (where ephemeral .ok/ state lives)`).hideHelp()).option(`--external-url <url>`,`Canonical external origin clients dial (sets server.externalUrl for this run) — its host joins the Host/Origin allowlists (CORS + external-Host admission). External exposure additionally requires consent (OK_ALLOW_EXTERNAL=1 or server.allowExternal).`,G).action(async t=>{let n=e();if(t.only===`server`&&t.reactShellDistDir!==void 0&&(process.stderr.write(`error: option '--only server' cannot be combined with '--react-shell-dist-dir'
3
3
  `),process.exit(2)),t.projectDir!==void 0&&t.singleFile===void 0&&(process.stderr.write(`error: option '--project-dir' requires '--single-file'
4
4
  `),process.exit(2)),t.mode===`app`){let e=[];if(t.port!==void 0&&e.push(`--port`),t.bind!==void 0&&e.push(`--bind`),t.only!==void 0&&e.push(`--only`),t.idleShutdown!==void 0&&e.push(`--idle-shutdown`),t.openBrowser===!1&&e.push(`--no-open-browser`),t.externalUrl!==void 0&&e.push(`--external-url`),e.length>0){let t=process.env.OK_LOG_LEVEL??`info`;(t===`debug`||t===`trace`)&&console.error(`--mode=app: ignoring ${e.join(`, `)}`)}let n=C(x());if(n.available){g({spawn:D},n);return}console.error(y(n.reason)),process.exit(1)}await re(n,t)})}export{se as C,ce as S,Z as T,te as _,ae as a,U as b,Y as c,B as d,L as f,$ as g,ie as h,K as i,oe as l,I as m,q as n,ne as o,R as p,Q as r,V as s,J as t,G as u,z as v,X as w,H as x,re as y};
5
- //# sourceMappingURL=start-C3YGfc7d.mjs.map
5
+ //# sourceMappingURL=start-d7sxUrTf.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/open-knowledge",
3
- "version": "0.62.0-beta.7",
3
+ "version": "0.62.0-beta.9",
4
4
  "description": "Local-first, agent-friendly Markdown knowledge base with a cross-platform CLI and web editor",
5
5
  "keywords": [
6
6
  "knowledge-base",
@@ -71,10 +71,10 @@
71
71
  "ajv-formats": "^3.0.1",
72
72
  "tsdown": "^0.21.7",
73
73
  "typescript": "^5.9.3",
74
- "@inkeep/open-knowledge-app": "0.62.0-beta.7",
75
- "@inkeep/open-knowledge-core": "0.62.0-beta.7",
74
+ "@inkeep/open-knowledge-core": "0.62.0-beta.9",
76
75
  "@inkeep/open-knowledge-native-config": "0.0.0",
77
- "@inkeep/open-knowledge-server": "0.62.0-beta.7"
76
+ "@inkeep/open-knowledge-app": "0.62.0-beta.9",
77
+ "@inkeep/open-knowledge-server": "0.62.0-beta.9"
78
78
  },
79
79
  "scripts": {
80
80
  "build:cli": "rm -rf dist && tsdown",