@inkeep/open-knowledge 0.46.0-beta.14 → 0.46.0-beta.16

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 (365) hide show
  1. package/dist/{acp-harness-probe-DyGzojAs.mjs → acp-harness-probe-Dgh1Ipmo.mjs} +3 -3
  2. package/dist/cli.mjs +7 -7
  3. package/dist/constants-BMyLpSJ8.mjs +2 -0
  4. package/dist/index.d.mts +17 -1
  5. package/dist/index.mjs +1 -1
  6. package/dist/init-BnKh4hJB.mjs +1 -0
  7. package/dist/{init-UsHQ5nkw.mjs → init-DXZ5ZL-d.mjs} +37 -37
  8. package/dist/{launch-json-removal-HQmTN2zF.mjs → launch-json-removal-B6IOQFk9.mjs} +2 -2
  9. package/dist/loader-DJaTAEVI.mjs +1 -0
  10. package/dist/{loader-TX84kNNr.mjs → loader-di8ingCA.mjs} +2 -2
  11. package/dist/{preview-BO-_TVuU.mjs → preview-CCY8KBS2.mjs} +2 -2
  12. package/dist/preview-ChlChU-0.mjs +1 -0
  13. package/dist/public/assets/{ActivityModeContent-D04ZTB05.js → ActivityModeContent-BSGDxL9R.js} +1 -1
  14. package/dist/public/assets/{AgentDiffPane-BCcrDXW5.js → AgentDiffPane-D7bJvGdp.js} +2 -2
  15. package/dist/public/assets/{AgentThreadClientBinder--w-hCCkY.js → AgentThreadClientBinder-CaTryHIE.js} +1 -1
  16. package/dist/public/assets/{BugReportHistory-DJ9tF746.js → BugReportHistory-DJY_ATlh.js} +1 -1
  17. package/dist/public/assets/{BugReportHistoryDialog-8V1yE7Ti.js → BugReportHistoryDialog-BIDjQ_82.js} +1 -1
  18. package/dist/public/assets/{ChangedOutsideBadge-Jw_1ftdU.js → ChangedOutsideBadge-C-Qu_Pl8.js} +1 -1
  19. package/dist/public/assets/{CodeMirrorPropInput-6uPyBi97.js → CodeMirrorPropInput-CRKAndsx.js} +3 -3
  20. package/dist/public/assets/{ConfigSharingInfoTooltip-BEi44Q-l.js → ConfigSharingInfoTooltip-OJruUI3H.js} +1 -1
  21. package/dist/public/assets/{ConsentDialogBody-D6HuxFrl.js → ConsentDialogBody-DRrUivNs.js} +1 -1
  22. package/dist/public/assets/{DiffView-KapiOFto.js → DiffView-DITcPuOr.js} +1 -1
  23. package/dist/public/assets/{DocumentContext-Ddtfw06F.js → DocumentContext-COt_qsrp.js} +2 -2
  24. package/dist/public/assets/{EditorModeToggle-B622Ggff.js → EditorModeToggle-N6JjLfr-.js} +1 -1
  25. package/dist/public/assets/{EnableSyncConfirmDialog-Dt2Km8QO.js → EnableSyncConfirmDialog-Bc_A_XCY.js} +1 -1
  26. package/dist/public/assets/FeedbackForm-DtN1ab2c.js +1 -0
  27. package/dist/public/assets/{GraphPanel-DAJMshWv.js → GraphPanel-aAVgqxld.js} +1 -1
  28. package/dist/public/assets/{ImportSkillDialog-7_9XdUL4.js → ImportSkillDialog-LkmkJ0YU.js} +1 -1
  29. package/dist/public/assets/{LintConfigEditor-DoWT7p5q.js → LintConfigEditor-9eXwxoS2.js} +1 -1
  30. package/dist/public/assets/{ManagedArtifactProperties-7dshK0Jv.js → ManagedArtifactProperties-Bte_ppBh.js} +2 -2
  31. package/dist/public/assets/ManagedArtifactProperties-TmTNhIv4.js +1 -0
  32. package/dist/public/assets/McpConsentDialogBody-090py53F.js +1 -0
  33. package/dist/public/assets/{Mermaid-D-PR8Nq0.js → Mermaid-BQAWkx48.js} +2 -2
  34. package/dist/public/assets/{MermaidDocEditor-xVs3RYNL.js → MermaidDocEditor-C_G_ovY8.js} +1 -1
  35. package/dist/public/assets/{RegisteredAgentIcon-CKpJ_hgB.js → RegisteredAgentIcon-UInuA1Ei.js} +1 -1
  36. package/dist/public/assets/{ReportBugDialogBody-BOsNuOIC.js → ReportBugDialogBody-5eJLreAy.js} +1 -1
  37. package/dist/public/assets/{SchemaConfigEditor-dViX9E3z.js → SchemaConfigEditor-DcJSH6Kd.js} +1 -1
  38. package/dist/public/assets/{SessionsHost-DwEoO1aA.js → SessionsHost-9g8XG0FA.js} +2 -2
  39. package/dist/public/assets/{SettingsDialogBody-DapiVVeV.js → SettingsDialogBody-DYeGMO3E.js} +1 -1
  40. package/dist/public/assets/{ShareBranchSwitchDialog-P949gbnF.js → ShareBranchSwitchDialog-Dm4ZdzUl.js} +1 -1
  41. package/dist/public/assets/{ShareReceiveDialog-Bhnm-iQX.js → ShareReceiveDialog-Cd240Jdo.js} +1 -1
  42. package/dist/public/assets/{ShareReceiveMissDialog-UEKRcm_k.js → ShareReceiveMissDialog--hmiMg2v.js} +1 -1
  43. package/dist/public/assets/{SkillEditBanner-DLVzp3KP.js → SkillEditBanner-DIJcGPhx.js} +1 -1
  44. package/dist/public/assets/{SkillOriginInline-D2WanLMv.js → SkillOriginInline-M3Vr6Vl3.js} +1 -1
  45. package/dist/public/assets/{SkillToolbarControls-hj3PWE0K.js → SkillToolbarControls-CkezCxAG.js} +1 -1
  46. package/dist/public/assets/{SourceEditor-JLV4zFVy.js → SourceEditor-D3d3_XjY.js} +1 -1
  47. package/dist/public/assets/{TerminalPanel-CJ96nwqY.js → TerminalPanel-DEwu_bZF.js} +1 -1
  48. package/dist/public/assets/{TerminalWindowApp-DJKxzDZB.js → TerminalWindowApp-cq0ZjlPg.js} +1 -1
  49. package/dist/public/assets/{TextDocEditor-Bkkf7noz.js → TextDocEditor-4ayETwjy.js} +1 -1
  50. package/dist/public/assets/{ThreadView-BaD0xIEg.js → ThreadView-BxHj-gwp.js} +1 -1
  51. package/dist/public/assets/TimelineDiffPane-EP2JbHka.js +2 -0
  52. package/dist/public/assets/{abnfDiagram-VRR7QNED-DthMMUp7.js → abnfDiagram-VRR7QNED-DHJtI87X.js} +1 -1
  53. package/dist/public/assets/{agent-diff-store-P7Uc0zvh.js → agent-diff-store-NxhFZCYu.js} +1 -1
  54. package/dist/public/assets/{agent-visibility-Bj5OOTN2.js → agent-visibility-BVTKArCQ.js} +1 -1
  55. package/dist/public/assets/{arc-D6dkQwuB.js → arc-CcVRsw3e.js} +1 -1
  56. package/dist/public/assets/architecture-TIHT7OUA-B22-UzyM.js +1 -0
  57. package/dist/public/assets/{architectureDiagram-ZJ3FMSHR-D2AdknnG.js → architectureDiagram-ZJ3FMSHR-CiwaxO5n.js} +1 -1
  58. package/dist/public/assets/{auth-state-cache-Du0vALuT.js → auth-state-cache-DeOaKoC3.js} +1 -1
  59. package/dist/public/assets/{blockDiagram-677ZJIJ3-CQpuKURY.js → blockDiagram-677ZJIJ3-0zO7n7Sf.js} +1 -1
  60. package/dist/public/assets/{c4Diagram-LMCZKHZV-vMnsf6JP.js → c4Diagram-LMCZKHZV-C662qesx.js} +1 -1
  61. package/dist/public/assets/{calendar-DvE9J6Sj.js → calendar-BRay90Yd.js} +1 -1
  62. package/dist/public/assets/channel-DfI0YSva.js +1 -0
  63. package/dist/public/assets/{checkbox-CgM6fL3A.js → checkbox-Cq1BnJ3x.js} +1 -1
  64. package/dist/public/assets/chevron-up-CSNoGrd3.js +1 -0
  65. package/dist/public/assets/chunk-2Q5K7J3B-BSFIGC1j.js +1 -0
  66. package/dist/public/assets/{chunk-32BRIVSS-CVMNE9FE.js → chunk-32BRIVSS-CydyM0Ml.js} +1 -1
  67. package/dist/public/assets/{chunk-52WLFC77-ByP8adiF.js → chunk-52WLFC77-cG-DvO_j.js} +1 -1
  68. package/dist/public/assets/{chunk-5FCAYU7R-apcsbWAl.js → chunk-5FCAYU7R-Bxw_oikr.js} +1 -1
  69. package/dist/public/assets/{chunk-5HE753X5-BApo3bqD.js → chunk-5HE753X5-DKXmxfLW.js} +1 -1
  70. package/dist/public/assets/{chunk-5JV3BV7I-BHpORvdP.js → chunk-5JV3BV7I-DvmJcvTR.js} +1 -1
  71. package/dist/public/assets/{chunk-5TONJI2A-DFa3pMK9.js → chunk-5TONJI2A-DzotvxWN.js} +1 -1
  72. package/dist/public/assets/{chunk-5VM5RSS4-Dv_-BFYa.js → chunk-5VM5RSS4-BhXaeUUw.js} +1 -1
  73. package/dist/public/assets/{chunk-7BUUIJ7U-CAEbPbJV.js → chunk-7BUUIJ7U-nkQ2KUUq.js} +1 -1
  74. package/dist/public/assets/{chunk-BIQX33UG-BAiXBHCK.js → chunk-BIQX33UG-dgZifYB8.js} +1 -1
  75. package/dist/public/assets/{chunk-BO2N2NFS-BuvkRQr-.js → chunk-BO2N2NFS-BgpjQQXT.js} +3 -3
  76. package/dist/public/assets/{chunk-C7G6YPKG-1I7HAvac.js → chunk-C7G6YPKG-DeJ7KSfD.js} +1 -1
  77. package/dist/public/assets/{chunk-CQNSW5MT-CWAJXUKm.js → chunk-CQNSW5MT-WJU8lHxD.js} +1 -1
  78. package/dist/public/assets/{chunk-CYSBUYHQ-okSmY2v_.js → chunk-CYSBUYHQ-5BxfdOgL.js} +1 -1
  79. package/dist/public/assets/{chunk-EMLP6XTP-BoC1pbij.js → chunk-EMLP6XTP-mSjYkSCS.js} +1 -1
  80. package/dist/public/assets/{chunk-EX3LRPZG-g376BU8Z.js → chunk-EX3LRPZG-BNd6Cxwo.js} +1 -1
  81. package/dist/public/assets/{chunk-FWX5IMBZ-C-l8NZxe.js → chunk-FWX5IMBZ-CXQqiinv.js} +2 -2
  82. package/dist/public/assets/{chunk-HOUHSVGY-Do2Y3Btv.js → chunk-HOUHSVGY-FQeseOdw.js} +1 -1
  83. package/dist/public/assets/{chunk-ICXQ74PX-Ce0LzbhW.js → chunk-ICXQ74PX-QBz75RJe.js} +1 -1
  84. package/dist/public/assets/{chunk-JG7HCLWE-KxXMgbns.js → chunk-JG7HCLWE-ClAPLVoN.js} +1 -1
  85. package/dist/public/assets/{chunk-JWPE2WC7-CEvGtkOv.js → chunk-JWPE2WC7-D00QuO4l.js} +1 -1
  86. package/dist/public/assets/{chunk-MOJQB5TN-CqgruPhq.js → chunk-MOJQB5TN-BHolK4Fc.js} +1 -1
  87. package/dist/public/assets/{chunk-MOZMSUNE-_PphKf7-.js → chunk-MOZMSUNE-B2zrwpvW.js} +1 -1
  88. package/dist/public/assets/{chunk-OGEWGWER-DEtBK0B_.js → chunk-OGEWGWER-D9rNoxcC.js} +1 -1
  89. package/dist/public/assets/{chunk-OSBZ3O6U-CZ7_DsZG.js → chunk-OSBZ3O6U-pMDQqwwa.js} +1 -1
  90. package/dist/public/assets/{chunk-PUDLZKDR-DOJ6xYbt.js → chunk-PUDLZKDR-zvmgn7x_.js} +1 -1
  91. package/dist/public/assets/{chunk-Q4XR5HBZ-BE54IG_w.js → chunk-Q4XR5HBZ-FwXZQ9hY.js} +1 -1
  92. package/dist/public/assets/{chunk-QBLGF6JB-DhkUA6kz.js → chunk-QBLGF6JB-gQMNwA9k.js} +1 -1
  93. package/dist/public/assets/{chunk-R7FJI6CG-C8R_fEMX.js → chunk-R7FJI6CG-4qEQ9dBZ.js} +1 -1
  94. package/dist/public/assets/{chunk-RYQCIY6F-BGQYOx1F.js → chunk-RYQCIY6F-BV0ikdQB.js} +1 -1
  95. package/dist/public/assets/{chunk-U6XO7XAA-S326EP4t.js → chunk-U6XO7XAA-CaNmcaAV.js} +1 -1
  96. package/dist/public/assets/{chunk-V7JOEXUC-CRcOKbTq.js → chunk-V7JOEXUC-CsJjje8x.js} +1 -1
  97. package/dist/public/assets/chunk-VAUOI2AC-B_byVmRb.js +1 -0
  98. package/dist/public/assets/{chunk-VR4S4FIN-DI4tyiVg.js → chunk-VR4S4FIN-bcHVGPIL.js} +1 -1
  99. package/dist/public/assets/{chunk-WYO6CB5R-CB_foSvM.js → chunk-WYO6CB5R-BMZjhy31.js} +1 -1
  100. package/dist/public/assets/chunk-XXDRQBXY-BW_2kVvu.js +1 -0
  101. package/dist/public/assets/{chunk-YOTPTUD7-Df82opFk.js → chunk-YOTPTUD7-NNZ-Yv3s.js} +1 -1
  102. package/dist/public/assets/{chunk-ZGVPDNZ5-BwKc2ci4.js → chunk-ZGVPDNZ5-DN7h9evR.js} +1 -1
  103. package/dist/public/assets/{chunk-ZIRB5QZD-x2paC8Ym.js → chunk-ZIRB5QZD-BUzL4gtl.js} +1 -1
  104. package/dist/public/assets/classDiagram-OUVF2IWQ-D-ugBPkQ.js +1 -0
  105. package/dist/public/assets/classDiagram-v2-EOCWNBFH-Bn6YRP9I.js +1 -0
  106. package/dist/public/assets/{comment-chips-Dffri1Xa.js → comment-chips-qxdAVfqd.js} +1 -1
  107. package/dist/public/assets/{config-provider-DpMwlMEo.js → config-provider-C5VnXykq.js} +1 -1
  108. package/dist/public/assets/{cose-bilkent-JH36ORCC-CYGNHPN1.js → cose-bilkent-JH36ORCC-C3tuxXMJ.js} +1 -1
  109. package/dist/public/assets/cynefin-VYW2F7L2-g7Kr3o9e.js +1 -0
  110. package/dist/public/assets/{cynefinDiagram-TSTJHNR4-B2WpbGQm.js → cynefinDiagram-TSTJHNR4-gF8dJ8RL.js} +1 -1
  111. package/dist/public/assets/{dagre-m0poQDwd.js → dagre-DqpVUR-3.js} +1 -1
  112. package/dist/public/assets/{dagre-VKFMJZFB-D9UQmJxN.js → dagre-VKFMJZFB-Bdh7Hq5O.js} +1 -1
  113. package/dist/public/assets/{diagram-FQU43EPY-7M2ET6l3.js → diagram-FQU43EPY-BZ8uLueR.js} +1 -1
  114. package/dist/public/assets/{diagram-G47NLZAW-DpsDaYFM.js → diagram-G47NLZAW-QyYub_Y-.js} +1 -1
  115. package/dist/public/assets/{diagram-NH7WQ7WH-CwGRC_4A.js → diagram-NH7WQ7WH-BZmKErWp.js} +1 -1
  116. package/dist/public/assets/{diagram-OA4YK3LP-Cv8Yslyv.js → diagram-OA4YK3LP-X4I0Ny_1.js} +1 -1
  117. package/dist/public/assets/{diagram-WEI45ONY-BQVzDEI1.js → diagram-WEI45ONY-Dvn-EcwS.js} +1 -1
  118. package/dist/public/assets/{dialog-C1XaLkpS.js → dialog-BRwYcDyc.js} +1 -1
  119. package/dist/public/assets/{dist-CPb8nv1S.js → dist-1bY-7L2j.js} +1 -1
  120. package/dist/public/assets/{dist-DhhvZ-Fu.js → dist-4KAJEfHq.js} +1 -1
  121. package/dist/public/assets/{dist-DH19Ha9g.js → dist-9KHzlPis.js} +1 -1
  122. package/dist/public/assets/{dist-BFl6CzPt.js → dist-B5YN73un.js} +1 -1
  123. package/dist/public/assets/{dist-BUtHqenk2.js → dist-B_pBFyj72.js} +1 -1
  124. package/dist/public/assets/{dist-Dibn-GMd.js → dist-BawYG08a.js} +1 -1
  125. package/dist/public/assets/{dist-CWm4Y27g.js → dist-BhBnufkS.js} +1 -1
  126. package/dist/public/assets/{dist-CZ_7whgD.js → dist-DhrsAcRJ.js} +1 -1
  127. package/dist/public/assets/{dist-DXiLicfm.js → dist-DmGGmoBk.js} +1 -1
  128. package/dist/public/assets/{dist-Bcmi_W0T2.js → dist-Dsr-OKxp2.js} +1 -1
  129. package/dist/public/assets/{dist-CqYx5K2X.js → dist-Dtdr1fU5.js} +1 -1
  130. package/dist/public/assets/{dist-B6UNek5u.js → dist-ZmxLttHl.js} +1 -1
  131. package/dist/public/assets/{dist-CKIx-azO.js → dist-zNz6UTbN.js} +1 -1
  132. package/dist/public/assets/{ebnfDiagram-CCIWWBDH-DMAh9nKT.js → ebnfDiagram-CCIWWBDH-Bee-0Vsa.js} +1 -1
  133. package/dist/public/assets/{erDiagram-Q63AITRT-DKFiE0Vo.js → erDiagram-Q63AITRT-DxkcAaEh.js} +1 -1
  134. package/dist/public/assets/{esm-C2ewNoEu.js → esm-Dn0h--OG.js} +1 -1
  135. package/dist/public/assets/eventmodeling-45OFAUF4-DdR7ha8I.js +1 -0
  136. package/dist/public/assets/{file-tree-adapter-B4ykQtEb.js → file-tree-adapter-CRvIFP_w.js} +1 -1
  137. package/dist/public/assets/flowDiagram-23GEKE2U-BAuyQn3U.js +1 -0
  138. package/dist/public/assets/{folder-config-api-CqtfjrQF.js → folder-config-api-DI42D8Ib.js} +1 -1
  139. package/dist/public/assets/follow-file-B9VBGXDD.js +1 -0
  140. package/dist/public/assets/{ganttDiagram-NO4QXBWP--SJpls7L.js → ganttDiagram-NO4QXBWP-CfKrR8t0.js} +1 -1
  141. package/dist/public/assets/gitGraph-TEB2WS4Q-B9_Hbzw_.js +1 -0
  142. package/dist/public/assets/{gitGraphDiagram-IHSO6WYX-B1AjnInE.js → gitGraphDiagram-IHSO6WYX-l_eG9uKD.js} +1 -1
  143. package/dist/public/assets/globals-Ba8zXfL4.css +1 -0
  144. package/dist/public/assets/{globals-prQJiwR-.js → globals-Wwv5HfuY.js} +2 -2
  145. package/dist/public/assets/{graphlib-D6a-9iLo.js → graphlib-2mbBufU8.js} +1 -1
  146. package/dist/public/assets/{highlighted-body-OFNGDK62-xJQZHz65.js → highlighted-body-OFNGDK62-BIipOt-U.js} +1 -1
  147. package/dist/public/assets/{index-C3pQc8vq.js → index-COolXpYV.js} +15 -15
  148. package/dist/public/assets/info-DKCQHKI2-BQeDe2mR.js +1 -0
  149. package/dist/public/assets/{infoDiagram-FWYZ7A6U-DBicCXZU.js → infoDiagram-FWYZ7A6U-DgvJ7Awn.js} +1 -1
  150. package/dist/public/assets/{input-group-C_zrpbIa.js → input-group-DpE_QejY.js} +1 -1
  151. package/dist/public/assets/{ishikawaDiagram-FXEZZL3T-B5hPGOul.js → ishikawaDiagram-FXEZZL3T-DQ4Gskk4.js} +1 -1
  152. package/dist/public/assets/{journeyDiagram-5HDEW3XC-Dl3OnoGl.js → journeyDiagram-5HDEW3XC-DPs0RcwQ.js} +1 -1
  153. package/dist/public/assets/{kanban-definition-HUTT4EX6-maq6lkuf.js → kanban-definition-HUTT4EX6-Ck2HSfan.js} +1 -1
  154. package/dist/public/assets/{line-B2_EkJOy.js → line-DWKLErsv.js} +1 -1
  155. package/dist/public/assets/{linear-Bskk1XDV.js → linear-dbIThZWJ.js} +1 -1
  156. package/dist/public/assets/{map-BEHMQBu2.js → map-DCuMc749.js} +1 -1
  157. package/dist/public/assets/{markdownlint-rule-browser-DSfETRq3.js → markdownlint-rule-browser-taWXhAIu.js} +1 -1
  158. package/dist/public/assets/mermaid-GHXKKRXX-DE1vq5OK.js +1 -0
  159. package/dist/public/assets/{mermaid-parser.core-DDjZMctQ.js → mermaid-parser.core-B2uYfibA.js} +2 -2
  160. package/dist/public/assets/{mermaid.core-DJBoiuub.js → mermaid.core-BUTR3k00.js} +3 -3
  161. package/dist/public/assets/{mindmap-definition-LN4V7U3C-BMKM5jZf.js → mindmap-definition-LN4V7U3C-CjuwnrRK.js} +1 -1
  162. package/dist/public/assets/{navigation-targets-x6iOvvv-.js → navigation-targets-Cqw8JcW2.js} +1 -1
  163. package/dist/public/assets/{now-DQUsv__I.js → now-D9M3Ys6o.js} +1 -1
  164. package/dist/public/assets/{open-managed-artifact-tab-D7O6shhm.js → open-managed-artifact-tab-BJBa-17A.js} +1 -1
  165. package/dist/public/assets/{ordinal-Cy_9j7oo.js → ordinal-DdrNAXbu.js} +1 -1
  166. package/dist/public/assets/packet-7NZHBO7P-BW9abikZ.js +1 -0
  167. package/dist/public/assets/{pegDiagram-2B236MQR-XqQZD2V0.js → pegDiagram-2B236MQR-BbkSvB2I.js} +1 -1
  168. package/dist/public/assets/{pending-receive-nav-store-D4P72ovr.js → pending-receive-nav-store-BZZR-nkd.js} +1 -1
  169. package/dist/public/assets/pie-RZYD4A2V-D86NaVqt.js +1 -0
  170. package/dist/public/assets/{pieDiagram-ENE6RG2P-BtvwA4qL.js → pieDiagram-ENE6RG2P-mC03ntFr.js} +1 -1
  171. package/dist/public/assets/{project-paths-CqnImr76.js → project-paths-DZoifJi3.js} +1 -1
  172. package/dist/public/assets/{prop-types-BfZ_j9wJ.js → prop-types-UV1Ku4nq.js} +1 -1
  173. package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-CI6wpHnQ.js → quadrantDiagram-ABIIQ3AL-C5Wf9EzX.js} +1 -1
  174. package/dist/public/assets/radar-I7S5WNFK-DQAd0dLq.js +1 -0
  175. package/dist/public/assets/railroad-3IZDKUUU-BpjxCYYP.js +1 -0
  176. package/dist/public/assets/railroad-abnf-AHOZXSZD-BVzINhcN.js +1 -0
  177. package/dist/public/assets/railroad-ebnf-EBAXGLYW-FAz3aWnD.js +1 -0
  178. package/dist/public/assets/railroad-peg-LSFZ7HO6-Smtu6BYl.js +1 -0
  179. package/dist/public/assets/{railroadDiagram-RFXS5EU6-esD3LX2s.js → railroadDiagram-RFXS5EU6-D5k_b8X2.js} +1 -1
  180. package/dist/public/assets/{requirementDiagram-TGXJPOKE-BInMn3Xh.js → requirementDiagram-TGXJPOKE-sZXA_y1K.js} +1 -1
  181. package/dist/public/assets/{sankeyDiagram-HTMAVEWB-DjH7kut4.js → sankeyDiagram-HTMAVEWB-VaejSuXD.js} +1 -1
  182. package/dist/public/assets/{schema-fields-view-intent-ywCTOcjb.js → schema-fields-view-intent-BMcQ1vbw.js} +1 -1
  183. package/dist/public/assets/select-DnZ213p0.js +1 -0
  184. package/dist/public/assets/{selection-context-UHJm7wNO.js → selection-context-SAJ9lGhe.js} +1 -1
  185. package/dist/public/assets/{sequenceDiagram-DBY2YBRQ-D9rSuKJA.js → sequenceDiagram-DBY2YBRQ-nCH-USjy.js} +1 -1
  186. package/dist/public/assets/{sizeCapture-X5ZJPWSS-BpnFIdO9.js → sizeCapture-X5ZJPWSS-CyNe-U3Z.js} +1 -1
  187. package/dist/public/assets/{skill-actions-Dm5ldBEc.js → skill-actions-bjJCqQ6r.js} +1 -1
  188. package/dist/public/assets/{skills-api-CcFN0_Po.js → skills-api-DqNFNsgd.js} +1 -1
  189. package/dist/public/assets/{src--VBSbHrD.js → src-D2I-MNPe.js} +1 -1
  190. package/dist/public/assets/{src-D9tbVCHI.js → src-DFZupjZD.js} +1 -1
  191. package/dist/public/assets/{stateDiagram-2N3HPSRC-B0iumw-I.js → stateDiagram-2N3HPSRC-uY9Mif8t.js} +1 -1
  192. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-BdS5vmc7.js +1 -0
  193. package/dist/public/assets/{swimlanes-5IMT3BWC-DPME_yO4.js → swimlanes-5IMT3BWC-cGipHfZ5.js} +2 -2
  194. package/dist/public/assets/swimlanesDiagram-G3AALYLV-Do_H-wCL.js +8 -0
  195. package/dist/public/assets/{tag-pill-input-Br5GXzD6.js → tag-pill-input-Dm-oHELs.js} +1 -1
  196. package/dist/public/assets/{target-navigation-intent-DEjv2wu2.js → target-navigation-intent-D4NuVWIm.js} +1 -1
  197. package/dist/public/assets/{telemetry-impl-D5iNhayi.js → telemetry-impl-wWahzeD4.js} +2 -2
  198. package/dist/public/assets/{telemetry-startup-gGtzcYyd.js → telemetry-startup-DqooJFoo.js} +1 -1
  199. package/dist/public/assets/{terminal-launch-events-cds9D2zG.js → terminal-launch-events-DPnh23jk.js} +1 -1
  200. package/dist/public/assets/{terminal-telemetry-B0_vjUSm.js → terminal-telemetry-C0iAhsN9.js} +1 -1
  201. package/dist/public/assets/{text-viewer-languages-BHFZCAL-.js → text-viewer-languages-qm3MvP0J.js} +2 -2
  202. package/dist/public/assets/{thread-client-DmkqHx9Q.js → thread-client-CylUCx4y.js} +1 -1
  203. package/dist/public/assets/{timeline-definition-FHXFAJF6-DXT31kug.js → timeline-definition-FHXFAJF6-BaWSHiEf.js} +1 -1
  204. package/dist/public/assets/treeView-QDETBFTQ-BgORrhQ0.js +1 -0
  205. package/dist/public/assets/treemap-6X3UGDF4-Zr5ZEdj0.js +1 -0
  206. package/dist/public/assets/{typing-burst-detector-BOmCFurR.js → typing-burst-detector-aQ1X_8Fj.js} +1 -1
  207. package/dist/public/assets/{uninstall-DNe6MvBi.js → uninstall-CZ4_m9Qa.js} +1 -1
  208. package/dist/public/assets/{use-activity-panel-DbcErwrL.js → use-activity-panel-CrUZg0eD.js} +1 -1
  209. package/dist/public/assets/{use-live-xterm-theme-KQpLA6Ig.js → use-live-xterm-theme-C7ahxcoU.js} +1 -1
  210. package/dist/public/assets/{use-open-skill-BYpqVFnY.js → use-open-skill-BQedNtMG.js} +1 -1
  211. package/dist/public/assets/{use-skill-directory-CZ_74a8P.js → use-skill-directory-CVAgFkVK.js} +1 -1
  212. package/dist/public/assets/{use-skills-DBT082yp.js → use-skills-LdaAjRrH.js} +1 -1
  213. package/dist/public/assets/{use-terminal-enabled-BtMJcFpZ.js → use-terminal-enabled-DwK_rPTk.js} +1 -1
  214. package/dist/public/assets/{use-timeline-entry-diff-CHAJ_uzb.js → use-timeline-entry-diff-B5KnaOaD.js} +1 -1
  215. package/dist/public/assets/{vennDiagram-L72KCM5P-DIsQhsUb.js → vennDiagram-L72KCM5P-boRPAxOy.js} +1 -1
  216. package/dist/public/assets/wardley-OPB4EBWU-WeTAUrVk.js +1 -0
  217. package/dist/public/assets/{wardleyDiagram-EHGQE667-CeHWZQuw.js → wardleyDiagram-EHGQE667-vi90NC-5.js} +1 -1
  218. package/dist/public/assets/{xychartDiagram-FW5EYKEG-5ub1f-kN.js → xychartDiagram-FW5EYKEG-Ckph0Tnv.js} +1 -1
  219. package/dist/public/index.html +113 -112
  220. package/dist/public/uninstall.html +10 -10
  221. package/dist/{repair-launch-json-Cc9RPEk-.mjs → repair-launch-json-BECz0463.mjs} +2 -2
  222. package/dist/repair-mcp-configs-CVA75ZZh.mjs +2 -0
  223. package/dist/{repair-skills-BMYnxn3h.mjs → repair-skills-B5s_18d0.mjs} +2 -2
  224. package/dist/repair-skills-ByGIGa0z.mjs +1 -0
  225. package/dist/{src-DDzpg6rN.mjs → src-Da5rL2HL.mjs} +4 -4
  226. package/dist/{start-BPeS-cjq.mjs → start-BsQjO-tR.mjs} +3 -3
  227. package/dist/start-D08mufE-.mjs +1 -0
  228. package/dist/{write-project-skill-DPGLaFfB.mjs → write-project-skill-BIBvYtT6.mjs} +2 -2
  229. package/package.json +5 -5
  230. package/dist/constants-BMl86IqT.mjs +0 -2
  231. package/dist/init-YMPn7j-R.mjs +0 -1
  232. package/dist/loader-_6OcHbvd.mjs +0 -1
  233. package/dist/preview-Ba0S1iHw.mjs +0 -1
  234. package/dist/public/assets/FeedbackForm-BB-M0GcJ.js +0 -1
  235. package/dist/public/assets/ManagedArtifactProperties-_eOhIDmZ.js +0 -1
  236. package/dist/public/assets/McpConsentDialogBody-N1L0Uz4o.js +0 -1
  237. package/dist/public/assets/TimelineDiffPane-BwLDgxHU.js +0 -2
  238. package/dist/public/assets/architecture-TIHT7OUA-BY9GAchj.js +0 -1
  239. package/dist/public/assets/channel-Bkag9BhJ.js +0 -1
  240. package/dist/public/assets/chunk-2Q5K7J3B-BsdS7tBq.js +0 -1
  241. package/dist/public/assets/chunk-VAUOI2AC-Bwx73Zo5.js +0 -1
  242. package/dist/public/assets/chunk-XXDRQBXY-B0w7NWS1.js +0 -1
  243. package/dist/public/assets/classDiagram-OUVF2IWQ-CBMdybof.js +0 -1
  244. package/dist/public/assets/classDiagram-v2-EOCWNBFH-_6omkEAt.js +0 -1
  245. package/dist/public/assets/cynefin-VYW2F7L2-Bld4CPSL.js +0 -1
  246. package/dist/public/assets/eventmodeling-45OFAUF4-BM0_rW2P.js +0 -1
  247. package/dist/public/assets/flowDiagram-23GEKE2U-B4eMpKzl.js +0 -1
  248. package/dist/public/assets/follow-file-bH1z3rvn.js +0 -1
  249. package/dist/public/assets/gitGraph-TEB2WS4Q-BFnnOjnN.js +0 -1
  250. package/dist/public/assets/globals-GzZHGkrT.css +0 -1
  251. package/dist/public/assets/info-DKCQHKI2-C4iD29MB.js +0 -1
  252. package/dist/public/assets/mermaid-GHXKKRXX-DE1sjxOE.js +0 -1
  253. package/dist/public/assets/packet-7NZHBO7P-7H_SSh7g.js +0 -1
  254. package/dist/public/assets/pie-RZYD4A2V-B5KrTLE6.js +0 -1
  255. package/dist/public/assets/radar-I7S5WNFK-BmyXCsHA.js +0 -1
  256. package/dist/public/assets/railroad-3IZDKUUU-BR0L2Ycb.js +0 -1
  257. package/dist/public/assets/railroad-abnf-AHOZXSZD-BJSVlTW3.js +0 -1
  258. package/dist/public/assets/railroad-ebnf-EBAXGLYW-DQeJc96K.js +0 -1
  259. package/dist/public/assets/railroad-peg-LSFZ7HO6-BOBB_YAC.js +0 -1
  260. package/dist/public/assets/select-BVnl5AhR.js +0 -1
  261. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-nM3zWRo5.js +0 -1
  262. package/dist/public/assets/swimlanesDiagram-G3AALYLV-Bkn7cRsX.js +0 -8
  263. package/dist/public/assets/treeView-QDETBFTQ-BmMqItzI.js +0 -1
  264. package/dist/public/assets/treemap-6X3UGDF4-muRT0NuT.js +0 -1
  265. package/dist/public/assets/wardley-OPB4EBWU-vOd_RJdo.js +0 -1
  266. package/dist/repair-mcp-configs-Bk7nIh5R.mjs +0 -2
  267. package/dist/repair-skills-C-ey2QcX.mjs +0 -1
  268. package/dist/start-BRdG0jJw.mjs +0 -1
  269. /package/dist/public/assets/{ActivityPanelDiffView-DmVrPrCH.js → ActivityPanelDiffView-DzcGG-3T.js} +0 -0
  270. /package/dist/public/assets/{AppMenubar-CMfyQoWX.js → AppMenubar-rFZzqUIz.js} +0 -0
  271. /package/dist/public/assets/{CopyButton-C_GVjBMW.js → CopyButton-Dk8yDsPs.js} +0 -0
  272. /package/dist/public/assets/{SkillModeBanner-BGvDA8_3.js → SkillModeBanner-BPmqGiVe.js} +0 -0
  273. /package/dist/public/assets/{__vite-browser-external-B4L9Bgvr.js → __vite-browser-external-DRftbq1J.js} +0 -0
  274. /package/dist/public/assets/{agent-presence-CuSKbQIG.js → agent-presence-DspgbUIJ.js} +0 -0
  275. /package/dist/public/assets/{array-jB8ZVI0g.js → array-BlR6RSqS.js} +0 -0
  276. /package/dist/public/assets/{auth-prompt-store-C7w8BqXG.js → auth-prompt-store-2KB0Hew5.js} +0 -0
  277. /package/dist/public/assets/{badge-BTPyRUGW.js → badge-DwfQ2IQa.js} +0 -0
  278. /package/dist/public/assets/{chunk-KEIR6QF5-BoNEB_HG.js → chunk-KEIR6QF5-Cvu_RfZc.js} +0 -0
  279. /package/dist/public/assets/{chunk-Y2CYZVJY-DCzjAn36.js → chunk-Y2CYZVJY-BavonG01.js} +0 -0
  280. /package/dist/public/assets/{client-version-CI3pzxaH.js → client-version-BhYZd6K_.js} +0 -0
  281. /package/dist/public/assets/{clike-volkcHCn.js → clike-BTKURkAr.js} +0 -0
  282. /package/dist/public/assets/{clipboard-adapter-DdkYoUY3.js → clipboard-adapter-Brbch5VX.js} +0 -0
  283. /package/dist/public/assets/{colors-DP6EPL4e.js → colors-DThYSuj1.js} +0 -0
  284. /package/dist/public/assets/{copilot-CYbxld_I.js → copilot-_tsUyzgD.js} +0 -0
  285. /package/dist/public/assets/{cursor-CVuYJhcM.js → cursor-D_UKSHL6.js} +0 -0
  286. /package/dist/public/assets/{cytoscape.esm-DBvPDb1U.js → cytoscape.esm-CcKBPOPz.js} +0 -0
  287. /package/dist/public/assets/{defaultLocale-DHYtiGMG.js → defaultLocale-Bj1aksfd.js} +0 -0
  288. /package/dist/public/assets/{desktop-bridge-types-ByIs2Wy8.js → desktop-bridge-types-cNTLS5xb.js} +0 -0
  289. /package/dist/public/assets/{diff-DCzkDf0s.js → diff-CC9Zbhye.js} +0 -0
  290. /package/dist/public/assets/{dist-CvBo_0Zd.js → dist-BKO-SihH.js} +0 -0
  291. /package/dist/public/assets/{dist-Dr52ya0i.js → dist-BNVxnBBw.js} +0 -0
  292. /package/dist/public/assets/{dist-D5z-4WeG.js → dist-CublDHOR.js} +0 -0
  293. /package/dist/public/assets/{dist-D-OluTzV.js → dist-Du3GTGo5.js} +0 -0
  294. /package/dist/public/assets/{dist-DEf6luEB.js → dist-pl6OT5yc.js} +0 -0
  295. /package/dist/public/assets/{doc-paths-C6_l5qhr.js → doc-paths-CBQZMJ5n.js} +0 -0
  296. /package/dist/public/assets/{documents-events-Bh1LSWeJ.js → documents-events-CUD1Vtsd.js} +0 -0
  297. /package/dist/public/assets/{documents-fetch-Ks0Eoaj3.js → documents-fetch-D4kwvrzo.js} +0 -0
  298. /package/dist/public/assets/{download-DLNGh9PS.js → download-C_7Cu8X8.js} +0 -0
  299. /package/dist/public/assets/{external-link-CIs3ZL0b.js → external-link-CKZFgCFq.js} +0 -0
  300. /package/dist/public/assets/{eye-DDAm7EsR.js → eye-DGKT_dXT.js} +0 -0
  301. /package/dist/public/assets/{field-Cq66GDVw.js → field-mSLytCEk.js} +0 -0
  302. /package/dist/public/assets/{file-tree-rename-validation-D3F7wC1T.js → file-tree-rename-validation-BH8L3cc3.js} +0 -0
  303. /package/dist/public/assets/{file-tree-utils-COZ5qd1A.js → file-tree-utils-Bz8x8io4.js} +0 -0
  304. /package/dist/public/assets/{folder-CnSwxkO-.js → folder-CyL8AyXY.js} +0 -0
  305. /package/dist/public/assets/{folder-open-BKx7QmM_.js → folder-open-DxWbBr3T.js} +0 -0
  306. /package/dist/public/assets/{form-VEn6ZPb_.js → form-DipRd6xO.js} +0 -0
  307. /package/dist/public/assets/{format-B72MB8qy.js → format-DAPkd5Gj.js} +0 -0
  308. /package/dist/public/assets/{go-DJh4zI5a.js → go-BOoSlAXr.js} +0 -0
  309. /package/dist/public/assets/{hash-DId30u-_.js → hash-C-OUp5vU.js} +0 -0
  310. /package/dist/public/assets/{info-BcCY_Or2.js → info-DybUB5k_.js} +0 -0
  311. /package/dist/public/assets/{init-tVp38eyI.js → init-tTyHApSS.js} +0 -0
  312. /package/dist/public/assets/{input-CdGQDWjM.js → input-DcoGZoTQ.js} +0 -0
  313. /package/dist/public/assets/{isObject-C7xg_t-t.js → isObject-CS6pZNNk.js} +0 -0
  314. /package/dist/public/assets/{libesm-BjhN8jLl.js → libesm-COuF-Ycc.js} +0 -0
  315. /package/dist/public/assets/{lint-config-client-bEZXQCEN.js → lint-config-client-B3CFuMcz.js} +0 -0
  316. /package/dist/public/assets/{lint-plugin-meta-7A6ZrPoH.js → lint-plugin-meta-BxfSlkph.js} +0 -0
  317. /package/dist/public/assets/{loader-circle-A8fM_hha.js → loader-circle-C4uszcbe.js} +0 -0
  318. /package/dist/public/assets/{lru-string-cache-CTK2PJbw.js → lru-string-cache-DXyh0UqD.js} +0 -0
  319. /package/dist/public/assets/{lua-xZf4SjJ3.js → lua-Dxo01oIG.js} +0 -0
  320. /package/dist/public/assets/{mcp-consent-store-CsArEV-K.js → mcp-consent-store-BivjPpLe.js} +0 -0
  321. /package/dist/public/assets/{min-GIYS61kh.js → min-B52VabRz.js} +0 -0
  322. /package/dist/public/assets/{minus-BqVmr9UG.js → minus-dDmjPbo4.js} +0 -0
  323. /package/dist/public/assets/{miss-dialog-store-CU8cCSmK.js → miss-dialog-store-DRsTysxn.js} +0 -0
  324. /package/dist/public/assets/{overlay-layers-gL_2dQqz.js → overlay-layers-DGwgwjHg.js} +0 -0
  325. /package/dist/public/assets/{panel-Boo96yEj.js → panel-Bjv8raTx.js} +0 -0
  326. /package/dist/public/assets/{panel-right-open-mOxBnqyo.js → panel-right-open-EPKoGQBE.js} +0 -0
  327. /package/dist/public/assets/{panzoom.es-CKxXrXUu.js → panzoom.es-JQqfaE6_.js} +0 -0
  328. /package/dist/public/assets/{paperclip-mdBEQ0WS.js → paperclip-DSaV3jTp.js} +0 -0
  329. /package/dist/public/assets/{parse-api-error-9c-Rs5WJ.js → parse-api-error-CGRziNbI.js} +0 -0
  330. /package/dist/public/assets/{path-BYW9Uhnc.js → path-BTSnI4V0.js} +0 -0
  331. /package/dist/public/assets/{pdf-CGE64eYM.js → pdf-DDNlrbvd.js} +0 -0
  332. /package/dist/public/assets/{pdf.worker-Cxt0GdPg.js → pdf.worker-MgQT7Lb-.js} +0 -0
  333. /package/dist/public/assets/{perl-BwX6Ksou.js → perl-L_d0-K7D.js} +0 -0
  334. /package/dist/public/assets/{properties-DagD85j5.js → properties-B1mL7FEj.js} +0 -0
  335. /package/dist/public/assets/{r-DUn7ZAa_.js → r-D1HJ6WJD.js} +0 -0
  336. /package/dist/public/assets/{receive-store-C-X60pJ_.js → receive-store-CqvpoBpo.js} +0 -0
  337. /package/dist/public/assets/{refresh-cw-CsRXA9N2.js → refresh-cw-DaKSQ-xL.js} +0 -0
  338. /package/dist/public/assets/{rough.esm-xhKrnp4d.js → rough.esm-FREjYXwx.js} +0 -0
  339. /package/dist/public/assets/{ruby-BIPfMRfv.js → ruby-BWJ7ZkjF.js} +0 -0
  340. /package/dist/public/assets/{share-metadata-rows-Ci33wJ2t.js → share-metadata-rows-c17l05D6.js} +0 -0
  341. /package/dist/public/assets/{shell-Cq5Ihso3.js → shell-ul8ysUs1.js} +0 -0
  342. /package/dist/public/assets/{skeleton-CD1oYYfF.js → skeleton-Zj40UZU5.js} +0 -0
  343. /package/dist/public/assets/{skill-scope-B58Ho5RB.js → skill-scope-CEk2zosm.js} +0 -0
  344. /package/dist/public/assets/{sortable.esm-Dngr9VJ1.js → sortable.esm-BuA5-2It.js} +0 -0
  345. /package/dist/public/assets/{sql-C1ugTeux.js → sql-BJVFbIWu.js} +0 -0
  346. /package/dist/public/assets/{square-pen-BbETm_LZ.js → square-pen-BETfUJNH.js} +0 -0
  347. /package/dist/public/assets/{src-o9HvXeVZ.js → src-CIOeKeVw.js} +0 -0
  348. /package/dist/public/assets/{startup-marks-BFvG00Uu.js → startup-marks-Bl-kvAXX.js} +0 -0
  349. /package/dist/public/assets/{stex-BRz73jPo.js → stex-WCjgSIWy.js} +0 -0
  350. /package/dist/public/assets/{swift-DG2ERlv4.js → swift-BmJYIPlb.js} +0 -0
  351. /package/dist/public/assets/{textarea-BzPGvj03.js → textarea-Cl4IJ1LU.js} +0 -0
  352. /package/dist/public/assets/{thread-draft-staging-CcGOkG5T.js → thread-draft-staging-Df0IT4FR.js} +0 -0
  353. /package/dist/public/assets/{timeline-diff-store-BYDskbwd.js → timeline-diff-store-B-Ea84Rl.js} +0 -0
  354. /package/dist/public/assets/{toml-_AQXZoMV.js → toml-BOOm8Wvq.js} +0 -0
  355. /package/dist/public/assets/{trash-2-4ZuuBm4P.js → trash-2-YBQNhePb.js} +0 -0
  356. /package/dist/public/assets/{triangle-alert-BB_1Bz59.js → triangle-alert-Dk8dL1G6.js} +0 -0
  357. /package/dist/public/assets/{undo-2-BxTugTzj.js → undo-2-1g5Fg6rD.js} +0 -0
  358. /package/dist/public/assets/{use-apply-config-color-theme-C5xWr7J7.js → use-apply-config-color-theme-CFZIZmfZ.js} +0 -0
  359. /package/dist/public/assets/{use-collab-url-D_rLtDaU.js → use-collab-url-DrWInPcY.js} +0 -0
  360. /package/dist/public/assets/{use-installed-clis-a0f5-upA.js → use-installed-clis-BpdGnrVu.js} +0 -0
  361. /package/dist/public/assets/{use-settings-route-xhvjUTtD.js → use-settings-route-DHvE2hA4.js} +0 -0
  362. /package/dist/public/assets/{use-workspace-D6_5od5W.js → use-workspace-Csf6sHD8.js} +0 -0
  363. /package/dist/public/assets/{useLintConfigViewMode-RQ4d4hHC.js → useLintConfigViewMode-15VleUG7.js} +0 -0
  364. /package/dist/public/assets/{wrench-BHZvMfZp.js → wrench-86_Xzzag.js} +0 -0
  365. /package/dist/public/assets/{x-BL2rz544.js → x-M_y7ybHr.js} +0 -0
@@ -1,3 +1,3 @@
1
- import{q as e}from"./sleep-TXRFWg8x.mjs";import{_ as t,b as n,d as r}from"./write-project-skill-DPGLaFfB.mjs";import{d as i}from"./init-UsHQ5nkw.mjs";import{execFileSync as a}from"node:child_process";import{dirname as o,join as s}from"node:path";import{existsSync as c,mkdirSync as l,readFileSync as u,writeFileSync as d}from"node:fs";import{homedir as f}from"node:os";var p=e();const m=`open-knowledge`;function h(e){try{e()}catch{}}var g=class{backend=`keyring`;constructor(e){this.onKeychainRead=e}async get(e){let{Entry:t}=await import(`@napi-rs/keyring`),n;try{n=new t(m,e).getPassword()}catch(t){return h(()=>this.onKeychainRead?.({kind:`read-error`,host:e,error:t instanceof Error?t.name:`unknown`})),null}if(n==null)return h(()=>this.onKeychainRead?.({kind:`absent`,host:e})),null;try{return JSON.parse(n)}catch{return h(()=>this.onKeychainRead?.({kind:`corrupt-entry`,host:e,error:`corrupt-entry`})),null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(m,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(m,e).deletePassword()}catch{}}},_=class{backend=`file`;authFile;constructor(e){this.authFile=e??s(f(),`.ok`,`auth.yml`)}read(){if(!c(this.authFile))return{};try{return(0,p.parse)(u(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=o(this.authFile);c(t)||l(t,{recursive:!0,mode:448}),d(this.authFile,(0,p.stringify)(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}},v=class{backend=`keyring`;constructor(e,t){this.keychain=e,this.file=t}async get(e){let t=await this.keychain.get(e);if(t!=null)return t;let n=await this.file.get(e);if(n==null)return null;try{await this.keychain.set(e,n.login,n.token,{gitProtocol:n.gitProtocol,name:n.name,email:n.email}),await this.file.clear(e),process.stderr.write(`[auth] migrated ${e} credential from ~/.ok/auth.yml to the OS keychain\n`)}catch{}return n}set(e,t,n,r){return this.keychain.set(e,t,n,r)}async clear(e){await this.keychain.clear(e),await this.file.get(e)!=null&&await this.file.clear(e)}};async function y(e,t){try{let{Entry:n}=await import(`@napi-rs/keyring`);return new n(m,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
2
- `),h(()=>t?.onBackendSelected?.({backend:`keyring`})),new v(new g(t?.onKeychainRead),new _(e))}catch(n){let r=n instanceof Error?`${n.name}: ${n.message}`:String(n);return process.stderr.write(`[auth] token storage: file (~/.ok/auth.yml) — OS keychain unavailable: ${r}\n`),h(()=>t?.onBackendSelected?.({backend:`file`,reason:r})),new _(e)}}function b(e){let t=null;return function(){if(t)return t;let n=2e3;return t=(async()=>{let t=null,r=new Promise(r=>{t=setTimeout(()=>{process.stderr.write(`[auth] token storage: keyring init exceeded ${n}ms; falling back to file (~/.ok/auth.yml)\n`),r(new _(e))},n)});try{return await Promise.race([y(e),r])}catch{return new _(e)}finally{t!==null&&clearTimeout(t)}})(),t}}function x(e){let t=b(e);return{async get(e){let n=await(await t()).get(e);return n===null?null:{token:n.token}}}}function S(e){let t=b(e);return{backend:`file`,async get(e){return(await t()).get(e)},async set(e,n,r,i){return(await t()).set(e,n,r,i)},async clear(e){return(await t()).clear(e)}}}async function C(e,t){let n=[],r=new _(t);await r.get(e)!=null&&(await r.clear(e),n.push(`file`));let i;try{let{Entry:t}=await import(`@napi-rs/keyring`);new t(m,`__probe__`);let r,a=await new g(e=>{e.kind===`read-error`&&(r=e.error??`read-error`)}).get(e);if(r!==void 0)i=r;else if(a!=null)try{new t(m,e).deletePassword(),n.push(`keychain`)}catch(e){i=e instanceof Error?e.name:`delete-error`}}catch{}return{touched:n,keychainError:i}}const w=[`/opt/homebrew/bin/gh`,`/usr/local/bin/gh`,`/opt/local/bin/gh`,`/snap/bin/gh`,`/usr/bin/gh`],T={encoding:`utf-8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3,windowsHide:!0};function E(e,t={}){let n=t._exec??a,r=t._fileExists??c,i=[`auth`,`token`,...e?[`--hostname`,e]:[]],o=[`gh`,...w.filter(r)];for(let e of o)try{let t=n(e,i,T).toString().trim();if(t.length>0)return{available:!0,token:t}}catch{}return{available:!1}}function D(e,a,o){let s=r[e],c=e===`opencode`?n:t,l=[],u=s.projectConfigPath?.(a);u!==void 0&&l.push({scope:`project`,configPath:u});try{l.push({scope:`user`,configPath:s.configPath(a,o)})}catch{}for(let t of l){let n=i(s,a,o,t.configPath);if(n!==null&&c(n))return{editorId:e,scope:t.scope,configPath:t.configPath}}return null}export{x as a,y as i,E as n,S as o,C as r,D as t};
3
- //# sourceMappingURL=acp-harness-probe-DyGzojAs.mjs.map
1
+ import{q as e}from"./sleep-TXRFWg8x.mjs";import{S as t,d as n,y as r}from"./write-project-skill-BIBvYtT6.mjs";import{d as i}from"./init-DXZ5ZL-d.mjs";import{execFileSync as a}from"node:child_process";import{dirname as o,join as s}from"node:path";import{existsSync as c,mkdirSync as l,readFileSync as u,writeFileSync as d}from"node:fs";import{homedir as f}from"node:os";var p=e();const m=`open-knowledge`;function h(e){try{e()}catch{}}var g=class{backend=`keyring`;constructor(e){this.onKeychainRead=e}async get(e){let{Entry:t}=await import(`@napi-rs/keyring`),n;try{n=new t(m,e).getPassword()}catch(t){return h(()=>this.onKeychainRead?.({kind:`read-error`,host:e,error:t instanceof Error?t.name:`unknown`})),null}if(n==null)return h(()=>this.onKeychainRead?.({kind:`absent`,host:e})),null;try{return JSON.parse(n)}catch{return h(()=>this.onKeychainRead?.({kind:`corrupt-entry`,host:e,error:`corrupt-entry`})),null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(m,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(m,e).deletePassword()}catch{}}},_=class{backend=`file`;authFile;constructor(e){this.authFile=e??s(f(),`.ok`,`auth.yml`)}read(){if(!c(this.authFile))return{};try{return(0,p.parse)(u(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=o(this.authFile);c(t)||l(t,{recursive:!0,mode:448}),d(this.authFile,(0,p.stringify)(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}},v=class{backend=`keyring`;constructor(e,t){this.keychain=e,this.file=t}async get(e){let t=await this.keychain.get(e);if(t!=null)return t;let n=await this.file.get(e);if(n==null)return null;try{await this.keychain.set(e,n.login,n.token,{gitProtocol:n.gitProtocol,name:n.name,email:n.email}),await this.file.clear(e),process.stderr.write(`[auth] migrated ${e} credential from ~/.ok/auth.yml to the OS keychain\n`)}catch{}return n}set(e,t,n,r){return this.keychain.set(e,t,n,r)}async clear(e){await this.keychain.clear(e),await this.file.get(e)!=null&&await this.file.clear(e)}};async function y(e,t){try{let{Entry:n}=await import(`@napi-rs/keyring`);return new n(m,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
2
+ `),h(()=>t?.onBackendSelected?.({backend:`keyring`})),new v(new g(t?.onKeychainRead),new _(e))}catch(n){let r=n instanceof Error?`${n.name}: ${n.message}`:String(n);return process.stderr.write(`[auth] token storage: file (~/.ok/auth.yml) — OS keychain unavailable: ${r}\n`),h(()=>t?.onBackendSelected?.({backend:`file`,reason:r})),new _(e)}}function b(e){let t=null;return function(){if(t)return t;let n=2e3;return t=(async()=>{let t=null,r=new Promise(r=>{t=setTimeout(()=>{process.stderr.write(`[auth] token storage: keyring init exceeded ${n}ms; falling back to file (~/.ok/auth.yml)\n`),r(new _(e))},n)});try{return await Promise.race([y(e),r])}catch{return new _(e)}finally{t!==null&&clearTimeout(t)}})(),t}}function x(e){let t=b(e);return{async get(e){let n=await(await t()).get(e);return n===null?null:{token:n.token}}}}function S(e){let t=b(e);return{backend:`file`,async get(e){return(await t()).get(e)},async set(e,n,r,i){return(await t()).set(e,n,r,i)},async clear(e){return(await t()).clear(e)}}}async function C(e,t){let n=[],r=new _(t);await r.get(e)!=null&&(await r.clear(e),n.push(`file`));let i;try{let{Entry:t}=await import(`@napi-rs/keyring`);new t(m,`__probe__`);let r,a=await new g(e=>{e.kind===`read-error`&&(r=e.error??`read-error`)}).get(e);if(r!==void 0)i=r;else if(a!=null)try{new t(m,e).deletePassword(),n.push(`keychain`)}catch(e){i=e instanceof Error?e.name:`delete-error`}}catch{}return{touched:n,keychainError:i}}const w=[`/opt/homebrew/bin/gh`,`/usr/local/bin/gh`,`/opt/local/bin/gh`,`/snap/bin/gh`,`/usr/bin/gh`],T={encoding:`utf-8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3,windowsHide:!0};function E(e,t={}){let n=t._exec??a,r=t._fileExists??c,i=[`auth`,`token`,...e?[`--hostname`,e]:[]],o=[`gh`,...w.filter(r)];for(let e of o)try{let t=n(e,i,T).toString().trim();if(t.length>0)return{available:!0,token:t}}catch{}return{available:!1}}function D(e,a,o){let s=n[e],c=e===`opencode`?t:r,l=[],u=s.projectConfigPath?.(a);u!==void 0&&l.push({scope:`project`,configPath:u});try{l.push({scope:`user`,configPath:s.configPath(a,o)})}catch{}for(let t of l){let n=i(s,a,o,t.configPath);if(n!==null&&c(n))return{editorId:e,scope:t.scope,configPath:t.configPath}}return null}export{x as a,y as i,E as n,S as o,C as r,D as t};
3
+ //# sourceMappingURL=acp-harness-probe-Dgh1Ipmo.mjs.map
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{o as e}from"./chunk-DTipWd-i.mjs";import{$a as t,$o as n,At as r,Cs as i,Fa as a,Ji as o,Q as s,To as c,Uo as l,Yi as u,ao as d,eo as f,ga as p,go as m,gs as h,ha as g,ko as _,kt as v,ma as y,to as b,tt as x,w as S,xo as C,zo as w}from"./src-C9yhZBbO.mjs";import{$t as T,Bt as ee,F as te,Ft as ne,Gr as re,Hr as ie,I as ae,Kr as oe,L as se,Mt as ce,Nt as le,P as ue,Pt as E,Q as de,Vr as D,X as fe,Xr as pe,Y as me,Z as he,Zr as ge,_ as _e,_a as ve,_i as ye,_r as be,a as xe,ai as Se,at as Ce,ct as we,dt as Te,en as Ee,f as De,ft as Oe,ga as ke,gi as Ae,gr as je,gt as Me,hi as Ne,hn as Pe,it as Fe,kr as Ie,lt as Le,mr as Re,mt as ze,n as Be,nn as Ve,nt as He,oi as Ue,ot as We,p as Ge,pt as Ke,q as qe,qn as Je,qt as Ye,r as Xe,si as O,st as Ze,t as Qe,ui as $e,ut as et,va as tt,vn as nt,w as rt,ya as it,yn as at,yr as ot,zt as st}from"./src-CJQ7Tr0x.mjs";import{C as ct,Ct as lt,I as ut,It as dt,N as ft,Z as pt,a as mt,dt as ht,ft as gt,gt as k,l as _t,lt as vt,nt as A,q as yt,r as bt,rt as j,tt as xt,ut as St,v as Ct,y as wt,yt as Tt,z as Et}from"./sleep-TXRFWg8x.mjs";import{O as Dt,P as Ot,k as kt}from"./fs-traced-wfI5VoOz.mjs";import{a as At}from"./git-handle-TtCDd9Le.mjs";import{g as jt,i as Mt,x as Nt}from"./server-lock-CCS3UzJQ.mjs";import{C as M,c as Pt,d as Ft,l as It,n as Lt,x as Rt}from"./write-project-skill-DPGLaFfB.mjs";import{C as zt,D as Bt,E as Vt,S as Ht,T as Ut,a as Wt,b as Gt,d as Kt,i as qt,m as Jt,o as Yt,p as Xt,s as Zt,v as Qt,x as $t,y as en}from"./src-DDzpg6rN.mjs";import{c as tn,i as N,n as P,o as F,r as I,s as L,t as R}from"./colors-BsmVIwfM.mjs";import{i as nn,n as rn,o as an,r as on}from"./acp-harness-probe-DyGzojAs.mjs";import{n as sn,r as cn,t as ln}from"./dist-bundle-CFfKBclM.mjs";import{A as un,B as dn,C as fn,F as pn,H as mn,L as hn,M as gn,N as _n,O as vn,P as yn,R as bn,T as xn,U as Sn,V as Cn,j as wn,u as Tn,w as En,z as Dn}from"./init-UsHQ5nkw.mjs";import{n as On,t as kn}from"./constants-BMl86IqT.mjs";import{C as An,D as jn,E as Mn,T as Nn,h as Pn,v as Fn,w as In}from"./start-BPeS-cjq.mjs";import{n as Ln,t as Rn}from"./loader-TX84kNNr.mjs";import{t as zn}from"./launch-json-removal-HQmTN2zF.mjs";import{n as Bn}from"./repair-skills-BMYnxn3h.mjs";import{execFile as Vn,execFileSync as Hn,execSync as Un,spawn as Wn,spawnSync as Gn}from"node:child_process";import{basename as Kn,dirname as qn,isAbsolute as Jn,join as z,relative as B,resolve as V,sep as Yn}from"node:path";import{accessSync as Xn,appendFileSync as Zn,closeSync as Qn,constants as $n,existsSync as H,lstatSync as er,mkdirSync as tr,mkdtempSync as nr,openSync as rr,readFileSync as U,readdirSync as ir,realpathSync as ar,renameSync as or,rmSync as sr,statSync as W,unlinkSync as G,writeFileSync as cr}from"node:fs";import{homedir as lr,platform as ur,tmpdir as dr}from"node:os";import{rm as fr}from"node:fs/promises";import pr from"node:process";import{fileURLToPath as mr}from"node:url";import{randomUUID as hr}from"node:crypto";import{setTimeout as gr}from"node:timers/promises";import{promisify as _r}from"node:util";import{createServer as vr,request as yr}from"node:http";import{createInterface as br}from"node:readline/promises";import{connect as xr}from"node:net";const Sr={invalid_type:`invalid_type`,too_big:`too_big`,too_small:`too_small`,invalid_format:`invalid_format`,not_multiple_of:`not_multiple_of`,unrecognized_keys:`unrecognized_keys`,invalid_union:`invalid_union`,invalid_key:`invalid_key`,invalid_element:`invalid_element`,invalid_value:`invalid_value`,custom:`custom`};var Cr;(function(e){})(Cr||={});function wr(e){return lt(pt,e)}async function Tr(e){let{projectDir:t,contentDir:n,baseConfig:r,targetPath:i,fix:a=!1}=e,s=[],c=Ie({projectDir:t,contentDir:n}),l=new Set,d=e=>{l.has(e)||(l.add(e),s.push(e))},f=be(t,r,d),p=new Map,m=e=>{let t=qn(e),r=p.get(t);if(r)return r;let i=je(f,ot(n,e,d));return p.set(t,i),i},h=[],g=Er(i,n);g.kind===`file`?h.push(B(n,g.path)):_(g.path);function _(e){let t;try{t=ir(e,{withFileTypes:!0})}catch(t){s.push(`could not read directory ${B(n,e)||`.`}: ${Or(t)}`);return}for(let r of t){if(r.name.startsWith(`.`))continue;let t=z(e,r.name),i=B(n,t);if(r.isDirectory()){if(c.isDirExcluded(i))continue;_(t)}else if(r.isFile()){if(!Dr(r.name)||c.isExcluded(i))continue;h.push(i)}}}h.sort();let v=[],y=0,b=0,x=0;for(let e of h){let t=z(n,e),r;try{r=U(t,`utf-8`)}catch(t){s.push(`could not read ${e}: ${Or(t)}`);continue}let i=m(e),c=!1;if(a&&i.enabled){let n=o(r,i);if(n!==r){let i=`${t}.tmp.${process.pid}.${Date.now()}`;try{cr(i,n,`utf-8`),or(i,t),r=n,c=!0,x++}catch(t){try{G(i)}catch{}s.push(`could not write fix to ${e}: ${Or(t)}`)}}}let l=await u(r,i,e);for(let e of l)e.severity===`error`?y++:b++;v.push({file:e,diagnostics:l,fixed:c})}return{contentDir:n,files:v,warnings:s,fileCount:h.length,errorCount:y,warningCount:b,fixedCount:x}}function Er(e,t){if(e===void 0||e===``)return{kind:`dir`,path:t};let n=Jn(e)?e:V(t,e);try{if(W(n).isFile())return{kind:`file`,path:n}}catch{}return{kind:`dir`,path:n}}function Dr(e){let t=e.toLowerCase();return l.some(e=>t.endsWith(e))}function Or(e){return e instanceof Error?e.message:String(e)}function kr(e){return new M(`lint`).description(`Lint markdown content (headless) — whole project, a folder, or a single file`).argument(`[path]`,`Folder or file to lint, relative to where you run the command`).option(`--json`,`Emit structured JSON instead of formatted text`).option(`--fix`,`Auto-fix fixable issues in place (markdownlint rules only)`).option(`--errors-only`,`Exit non-zero only on error-severity problems (findings are warning-severity unless your .markdownlint.* assigns a rule "error")`).action(async(t,n)=>{let r=e(),i=process.cwd(),a=Ue(r,i),o=t===void 0?void 0:Ar(t,Ut()),s=r.contentRules,c=await Tr({projectDir:i,contentDir:a,baseConfig:s?g(s):p,targetPath:o,fix:n.fix===!0});n.json===!0?process.stdout.write(`${JSON.stringify(c,null,2)}\n`):process.stdout.write(`${Nr(c)}\n`),(n.errorsOnly===!0?c.errorCount>0:jr(c))&&(process.exitCode=1)})}function Ar(e,t){return V(t,e)}function jr(e){return e.errorCount>0||e.warningCount>0}function Mr(e){let t=[R(e.file)+(e.fixed?P(` (fixed)`):``)];for(let n of e.diagnostics){let e=P(`${n.range.start.line+1}:${n.range.start.character+1}`.padEnd(7)),r=n.severity===`error`?I(`error `):L(`warning`);t.push(` ${e} ${r} ${n.message} ${P(`${n.source}/${n.code}`)}`)}return t.push(``),t}function Nr(e){let t=[];for(let n of e.files)n.diagnostics.length>0&&t.push(...Mr(n));for(let n of e.warnings)t.push(L(`! ${n}`));e.warnings.length>0&&t.push(``);let n=e.errorCount+e.warningCount;if(n===0)t.push(F(`✓ No problems in ${e.fileCount} file${e.fileCount===1?``:`s`}.`));else{let r=[`${n} problem${n===1?``:`s`}`];r.push(`${e.errorCount} error${e.errorCount===1?``:`s`}`),r.push(`${e.warningCount} warning${e.warningCount===1?``:`s`}`),t.push(`${I(r[0]??``)} (${r[1]}, ${r[2]}) across ${e.fileCount} file${e.fileCount===1?``:`s`}.`)}return e.fixedCount>0&&t.push(P(`Fixed ${e.fixedCount} file${e.fixedCount===1?``:`s`}.`)),t.join(`
2
+ import{o as e}from"./chunk-DTipWd-i.mjs";import{$a as t,$o as n,At as r,Cs as i,Fa as a,Ji as o,Q as s,To as c,Uo as l,Yi as u,ao as d,eo as f,ga as p,go as m,gs as h,ha as g,ko as _,kt as v,ma as y,to as b,tt as x,w as S,xo as C,zo as w}from"./src-C9yhZBbO.mjs";import{$t as T,Bt as ee,F as te,Ft as ne,Gr as re,Hr as ie,I as ae,Kr as oe,L as se,Mt as ce,Nt as le,P as ue,Pt as E,Q as de,Vr as D,X as fe,Xr as pe,Y as me,Z as he,Zr as ge,_ as _e,_a as ve,_i as ye,_r as be,a as xe,ai as Se,at as Ce,ct as we,dt as Te,en as Ee,f as De,ft as Oe,ga as ke,gi as Ae,gr as je,gt as Me,hi as Ne,hn as Pe,it as Fe,kr as Ie,lt as Le,mr as Re,mt as ze,n as Be,nn as Ve,nt as He,oi as Ue,ot as We,p as Ge,pt as Ke,q as qe,qn as Je,qt as Ye,r as Xe,si as O,st as Ze,t as Qe,ui as $e,ut as et,va as tt,vn as nt,w as rt,ya as it,yn as at,yr as ot,zt as st}from"./src-CJQ7Tr0x.mjs";import{C as ct,Ct as lt,I as ut,It as dt,N as ft,Z as pt,a as mt,dt as ht,ft as gt,gt as k,l as _t,lt as vt,nt as A,q as yt,r as bt,rt as j,tt as xt,ut as St,v as Ct,y as wt,yt as Tt,z as Et}from"./sleep-TXRFWg8x.mjs";import{O as Dt,P as Ot,k as kt}from"./fs-traced-wfI5VoOz.mjs";import{a as At}from"./git-handle-TtCDd9Le.mjs";import{g as jt,i as Mt,x as Nt}from"./server-lock-CCS3UzJQ.mjs";import{C as Pt,T as M,c as Ft,d as It,l as Lt,n as Rt}from"./write-project-skill-BIBvYtT6.mjs";import{C as zt,D as Bt,E as Vt,S as Ht,T as Ut,a as Wt,b as Gt,d as Kt,i as qt,m as Jt,o as Yt,p as Xt,s as Zt,v as Qt,x as $t,y as en}from"./src-Da5rL2HL.mjs";import{c as tn,i as N,n as P,o as F,r as I,s as L,t as R}from"./colors-BsmVIwfM.mjs";import{i as nn,n as rn,o as an,r as on}from"./acp-harness-probe-Dgh1Ipmo.mjs";import{n as sn,r as cn,t as ln}from"./dist-bundle-CFfKBclM.mjs";import{A as un,B as dn,C as fn,F as pn,H as mn,L as hn,M as gn,N as _n,O as vn,P as yn,R as bn,T as xn,U as Sn,V as Cn,j as wn,u as Tn,w as En,z as Dn}from"./init-DXZ5ZL-d.mjs";import{n as On,t as kn}from"./constants-BMyLpSJ8.mjs";import{C as An,D as jn,E as Mn,T as Nn,h as Pn,v as Fn,w as In}from"./start-BsQjO-tR.mjs";import{n as Ln,t as Rn}from"./loader-di8ingCA.mjs";import{t as zn}from"./launch-json-removal-B6IOQFk9.mjs";import{n as Bn}from"./repair-skills-B5s_18d0.mjs";import{execFile as Vn,execFileSync as Hn,execSync as Un,spawn as Wn,spawnSync as Gn}from"node:child_process";import{basename as Kn,dirname as qn,isAbsolute as Jn,join as z,relative as B,resolve as V,sep as Yn}from"node:path";import{accessSync as Xn,appendFileSync as Zn,closeSync as Qn,constants as $n,existsSync as H,lstatSync as er,mkdirSync as tr,mkdtempSync as nr,openSync as rr,readFileSync as U,readdirSync as ir,realpathSync as ar,renameSync as or,rmSync as sr,statSync as W,unlinkSync as G,writeFileSync as cr}from"node:fs";import{homedir as lr,platform as ur,tmpdir as dr}from"node:os";import{rm as fr}from"node:fs/promises";import pr from"node:process";import{fileURLToPath as mr}from"node:url";import{randomUUID as hr}from"node:crypto";import{setTimeout as gr}from"node:timers/promises";import{promisify as _r}from"node:util";import{createServer as vr,request as yr}from"node:http";import{createInterface as br}from"node:readline/promises";import{connect as xr}from"node:net";const Sr={invalid_type:`invalid_type`,too_big:`too_big`,too_small:`too_small`,invalid_format:`invalid_format`,not_multiple_of:`not_multiple_of`,unrecognized_keys:`unrecognized_keys`,invalid_union:`invalid_union`,invalid_key:`invalid_key`,invalid_element:`invalid_element`,invalid_value:`invalid_value`,custom:`custom`};var Cr;(function(e){})(Cr||={});function wr(e){return lt(pt,e)}async function Tr(e){let{projectDir:t,contentDir:n,baseConfig:r,targetPath:i,fix:a=!1}=e,s=[],c=Ie({projectDir:t,contentDir:n}),l=new Set,d=e=>{l.has(e)||(l.add(e),s.push(e))},f=be(t,r,d),p=new Map,m=e=>{let t=qn(e),r=p.get(t);if(r)return r;let i=je(f,ot(n,e,d));return p.set(t,i),i},h=[],g=Er(i,n);g.kind===`file`?h.push(B(n,g.path)):_(g.path);function _(e){let t;try{t=ir(e,{withFileTypes:!0})}catch(t){s.push(`could not read directory ${B(n,e)||`.`}: ${Or(t)}`);return}for(let r of t){if(r.name.startsWith(`.`))continue;let t=z(e,r.name),i=B(n,t);if(r.isDirectory()){if(c.isDirExcluded(i))continue;_(t)}else if(r.isFile()){if(!Dr(r.name)||c.isExcluded(i))continue;h.push(i)}}}h.sort();let v=[],y=0,b=0,x=0;for(let e of h){let t=z(n,e),r;try{r=U(t,`utf-8`)}catch(t){s.push(`could not read ${e}: ${Or(t)}`);continue}let i=m(e),c=!1;if(a&&i.enabled){let n=o(r,i);if(n!==r){let i=`${t}.tmp.${process.pid}.${Date.now()}`;try{cr(i,n,`utf-8`),or(i,t),r=n,c=!0,x++}catch(t){try{G(i)}catch{}s.push(`could not write fix to ${e}: ${Or(t)}`)}}}let l=await u(r,i,e);for(let e of l)e.severity===`error`?y++:b++;v.push({file:e,diagnostics:l,fixed:c})}return{contentDir:n,files:v,warnings:s,fileCount:h.length,errorCount:y,warningCount:b,fixedCount:x}}function Er(e,t){if(e===void 0||e===``)return{kind:`dir`,path:t};let n=Jn(e)?e:V(t,e);try{if(W(n).isFile())return{kind:`file`,path:n}}catch{}return{kind:`dir`,path:n}}function Dr(e){let t=e.toLowerCase();return l.some(e=>t.endsWith(e))}function Or(e){return e instanceof Error?e.message:String(e)}function kr(e){return new M(`lint`).description(`Lint markdown content (headless) — whole project, a folder, or a single file`).argument(`[path]`,`Folder or file to lint, relative to where you run the command`).option(`--json`,`Emit structured JSON instead of formatted text`).option(`--fix`,`Auto-fix fixable issues in place (markdownlint rules only)`).option(`--errors-only`,`Exit non-zero only on error-severity problems (findings are warning-severity unless your .markdownlint.* assigns a rule "error")`).action(async(t,n)=>{let r=e(),i=process.cwd(),a=Ue(r,i),o=t===void 0?void 0:Ar(t,Ut()),s=r.contentRules,c=await Tr({projectDir:i,contentDir:a,baseConfig:s?g(s):p,targetPath:o,fix:n.fix===!0});n.json===!0?process.stdout.write(`${JSON.stringify(c,null,2)}\n`):process.stdout.write(`${Nr(c)}\n`),(n.errorsOnly===!0?c.errorCount>0:jr(c))&&(process.exitCode=1)})}function Ar(e,t){return V(t,e)}function jr(e){return e.errorCount>0||e.warningCount>0}function Mr(e){let t=[R(e.file)+(e.fixed?P(` (fixed)`):``)];for(let n of e.diagnostics){let e=P(`${n.range.start.line+1}:${n.range.start.character+1}`.padEnd(7)),r=n.severity===`error`?I(`error `):L(`warning`);t.push(` ${e} ${r} ${n.message} ${P(`${n.source}/${n.code}`)}`)}return t.push(``),t}function Nr(e){let t=[];for(let n of e.files)n.diagnostics.length>0&&t.push(...Mr(n));for(let n of e.warnings)t.push(L(`! ${n}`));e.warnings.length>0&&t.push(``);let n=e.errorCount+e.warningCount;if(n===0)t.push(F(`✓ No problems in ${e.fileCount} file${e.fileCount===1?``:`s`}.`));else{let r=[`${n} problem${n===1?``:`s`}`];r.push(`${e.errorCount} error${e.errorCount===1?``:`s`}`),r.push(`${e.warningCount} warning${e.warningCount===1?``:`s`}`),t.push(`${I(r[0]??``)} (${r[1]}, ${r[2]}) across ${e.fileCount} file${e.fileCount===1?``:`s`}.`)}return e.fixedCount>0&&t.push(P(`Fixed ${e.fixedCount} file${e.fixedCount===1?``:`s`}.`)),t.join(`
3
3
  `)}const Pr={out:e=>process.stdout.write(`${e}\n`),err:e=>process.stderr.write(`${e}\n`)};function Fr(e){return new M(`audit`).description(`Unified validation audit (markdown lint + broken internal links) via the running project server`).argument(`[path]`,`Folder or file to audit, relative to where you run the command`).option(`--json`,`Emit the full structured JSON response instead of formatted text`).option(`--errors-only`,`Exit non-zero only on error-severity problems (broken links default to warnings; the project's validation.links setting can raise them to errors)`).action(async(t,n)=>{let r=await Ir(t,n,e(),process.cwd(),Ut());r!==0&&(process.exitCode=r)})}async function Ir(e,t,n,r,i,a=Pr){let o=Ue(n,r),s;if(e!==void 0){let t=Lr(e,i,o);if(t===null)return a.err(`Path is outside the content directory (${o}): ${e}`),1;s=t===``?void 0:t}let c=Mt(O(r));if(!c||c.port<=0)return a.err("OpenKnowledge server is not running — the links validator needs the live backlink index. Start it with `ok start` (or open OK Desktop) and re-run. For headless lint-only checks, use `ok lint`."),1;let l=s===void 0?``:`?path=${encodeURIComponent(s)}`,u;try{u=await fetch(`http://127.0.0.1:${c.port}/api/audit${l}`,{headers:h({kind:`cli`,runtimeVersion:jt})})}catch(e){return a.err(`Could not reach the OpenKnowledge server on port ${c.port}: ${String(e)}`),1}if(!u.ok){let e=await u.json().catch(()=>({}));return a.err(`Audit failed: ${e.title??e.error??e.message??`server responded with ${u.status}`}`),1}let d=y.safeParse(await u.json().catch(()=>null));if(!d.success){let e=d.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);return a.err(`Audit failed: unexpected response shape from the server. Schema issues: ${e}`),1}let f=d.data;return t.json===!0?a.out(JSON.stringify(f,null,2)):a.out(Nr(Rr(f))),+(t.errorsOnly===!0?f.errorCount>0:f.errorCount+f.warningCount>0)}function Lr(e,t,n){let r=B(n,V(t,e));return r===``?``:r.startsWith(`..`)||Jn(r)?null:r.split(Yn).join(`/`)}function Rr(e){return{files:e.files.map(e=>({file:e.file,fixed:!1,diagnostics:e.diagnostics})),warnings:e.warnings,fileCount:e.fileCount,errorCount:e.errorCount,warningCount:e.warningCount,fixedCount:0}}async function zr(e,t,n,r){let i=Br(await Vr(e)).host??``,a=e=>e.replace(/[\r\n]/g,``);if(!i)return r?.log?.warn({outcome:`no-host`,backend:n.backend},`[auth] git-credential get`),1;let o=process.env.OK_GH_TOKEN,s=process.env.OK_GH_TOKEN_HOST;if(o&&s===i)return r?.log?.debug({host:i,outcome:`gh-env-token`,backend:n.backend},`[auth] git-credential get`),t.write(`username=x-access-token\npassword=${a(o)}\n`),0;let c=await n.get(i),l=r?.getDiag?.(),u=c==null?l?.kind??`absent`:`found`;if(r?.log){let e={host:i,outcome:u,backend:n.backend,...l?.error?{keychainError:l.error}:{}};u===`found`?r.log.debug(e,`[auth] git-credential get`):r.log.warn(e,`[auth] git-credential get`)}return c==null?1:(t.write(`username=${a(c.login)}\npassword=${a(c.token)}\n`),0)}function Br(e){let t={};for(let n of e.split(`
4
4
  `)){let e=n.trim();if(e===``)continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r)]=e.slice(r+1))}return t}function Vr(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(e)),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf-8`))),e.on(`error`,n)})}function Hr(e,t){let n=new M(`git-credential`);return n.description(`Git credential helper (git credential-helper protocol)`),n.command(`get`).description(`Lookup credentials from TokenStore (called by git)`).action(async()=>{let n=t?.();try{let t,r=await e({onKeychainRead:e=>{t=e},onBackendSelected:e=>{e.backend===`file`&&e.reason&&n?.warn({backend:`file`,reason:e.reason},`[auth] token storage fallback`)}}),i=await zr(process.stdin,process.stdout,r,{log:n,getDiag:()=>t});await Ge(n),process.exit(i)}catch(e){n?.error({err:e},`[auth] git-credential get: unexpected error`),await Ge(n),process.exit(1)}}),n}function Ur(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function Wr(e,t,n){let r={baseUrl:Ur(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new sn(`${i.data.error_description} (${i.data.error}, ${i.data.error_uri})`,400,{request:e.endpoint.merge(t,r)});throw n.response=i,n}return i}async function Gr(e){let t=e.request||ln,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),Wr(t,`POST /login/device/code`,n)}async function Kr(e){let t=await Wr(e.request||ln,`POST /login/oauth/access_token`,{client_id:e.clientId,device_code:e.code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),n={clientType:e.clientType,clientId:e.clientId,token:t.data.access_token,scopes:t.data.scope.split(/\s+/).filter(Boolean)};if(`clientSecret`in e&&(n.clientSecret=e.clientSecret),e.clientType===`github-app`){if(`refresh_token`in t.data){let e=new Date(t.headers.date).getTime();n.refreshToken=t.data.refresh_token,n.expiresAt=qr(e,t.data.expires_in),n.refreshTokenExpiresAt=qr(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function qr(e,t){return new Date(e+t*1e3).toISOString()}async function Jr(e,t){let n=Yr(e,t.auth);if(n)return n;let{data:r}=await Gr({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await Zr(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function Yr(e,t){if(t.refresh===!0||!e.authentication)return!1;if(e.clientType===`github-app`)return e.authentication;let n=e.authentication;return(`scopes`in t&&t.scopes||e.scopes).join(` `)===n.scopes.join(` `)?n:!1}async function Xr(e){await new Promise(t=>setTimeout(t,e*1e3))}async function Zr(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Kr({...i,clientType:`oauth-app`}):await Kr({...i,clientType:`github-app`});return{type:`token`,tokenType:`oauth`,...a}}catch(i){if(!i.response)throw i;let a=i.response.data.error;if(a===`authorization_pending`)return await Xr(r.interval),Zr(e,t,n,r);if(a===`slow_down`)return await Xr(r.interval+7),Zr(e,t,n,r);throw i}}async function Qr(e,t){return Jr(e,{auth:t})}async function $r(e,t,n,r){let i=t.endpoint.merge(n,r);if(/\/login\/(oauth\/access_token|device\/code)$/.test(i.url))return t(i);let{token:a}=await Jr(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var ei=`0.0.0-development`;function ti(e){let t=e.request||ln.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${ei} ${cn()}`}}),{request:n=t,...r}=e,i=e.clientType===`github-app`?{...r,clientType:`github-app`,request:n}:{...r,clientType:`oauth-app`,request:n,scopes:e.scopes||[]};if(!e.clientId)throw Error(`[@octokit/auth-oauth-device] "clientId" option must be set (https://github.com/octokit/auth-oauth-device.js#usage)`);if(!e.onVerification)throw Error(`[@octokit/auth-oauth-device] "onVerification" option must be a function (https://github.com/octokit/auth-oauth-device.js#usage)`);return Object.assign(Qr.bind(null,i),{hook:$r.bind(null,i)})}async function ni(e){let{clientId:t,scopes:n=[`repo`,`read:user`,`user:email`],onVerification:r,host:i}=e,a=i&&i!==`github.com`?`https://${i}/api/v3`:`https://api.github.com`,o=ti({clientType:`oauth-app`,clientId:t,scopes:n,onVerification:async e=>{await r({verificationUri:e.verification_uri,userCode:e.user_code,expiresIn:e.expires_in,interval:e.interval})},request:a===`https://api.github.com`?void 0:(await import(`./dist-bundle-BT5p_5Yl.mjs`)).request.defaults({baseUrl:a})}),s;try{s=await o({type:`oauth`})}catch(e){if(e instanceof Error){let t=e.message.toLowerCase();throw t.includes(`access_denied`)?Error(`Device-flow authorization was denied.`):t.includes(`expired_token`)||t.includes(`timeout`)||t.includes(`timed out`)?Error(`Device-flow code expired before authorization — please try again.`):Error(`GitHub sign-in failed: ${e.message}`)}throw e}return{token:s.token,tokenType:s.tokenType,scopes:s.scopes??[]}}function ri(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}function K(e){let t=e.toLowerCase().replace(/:\d+$/,``);_.has(t)&&(process.stderr.write(`Error: ${e} is not a GitHub host. Only GitHub and GitHub Enterprise Server are supported.\n`),process.exit(1))}function ii(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function ai(e,t,n=ni){let r=ri(),{host:i,json:a}=e;K(i),a||process.stderr.write(`Logging in to ${i}\n`);let o=await n({clientId:r,host:i===`github.com`?void 0:i,onVerification:e=>{e.userCode,e.verificationUri,a?ii(!0,{type:`verification`,user_code:e.userCode,verification_uri:e.verificationUri,expires_in:e.expiresIn}):process.stderr.write(`Open: ${e.verificationUri}\nEnter code: ${e.userCode}\n`)}}),s=`unknown`,c,l;try{let e=i===`github.com`?`https://api.github.com`:`https://${i}/api/v3`,t=await fetch(`${e}/user`,{headers:{Authorization:`Bearer ${o.token}`,"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();s=e.login??s,c=e.name??void 0,l=e.email??void 0}}catch{}await t.set(i,s,o.token,{gitProtocol:`https`,name:c,email:l}),a?ii(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function oi(e){return new M(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{let n=t.host??Re(process.cwd()),r=await e();await ai({...t,host:n},r)})}const si={style:{maskedText:`[input is masked]`}};var ci=hn((e,t)=>{let{validate:n=()=>!0}=e,r=Cn(si,e.theme),[i,a]=mn(`idle`),[o,s]=mn(),[c,l]=mn(``),u=dn({status:i,theme:r});Dn(async(e,r)=>{if(i===`idle`)if(Sn(e)){let e=c;a(`loading`);let i=await n(e);i===!0?(l(e),a(`done`),t(e)):(r.write(c),s(i||`You must provide a valid value`),a(`idle`))}else l(r.line),s(void 0)});let d=r.style.message(e.message,i),f=``,p;e.mask?f=(typeof e.mask==`string`?e.mask:`*`).repeat(c.length):i!==`done`&&(p=`${r.style.help(r.style.maskedText)}${bn}`),i===`done`&&(f=r.style.answer(f));let m=``;return o&&(m=r.style.error(o)),[[u,d,e.mask?f:p].join(` `),m]});function li(e,t,n,r){if(typeof n!=`function`)throw Error(`method for before hook must be a function`);return r||={},Array.isArray(t)?t.reverse().reduce((t,n)=>li.bind(null,e,n,t,r),n)():Promise.resolve().then(()=>e.registry[t]?e.registry[t].reduce((e,t)=>t.hook.bind(null,e,r),n)():n(r))}function ui(e,t,n,r){let i=r;e.registry[n]||(e.registry[n]=[]),t===`before`&&(r=(e,t)=>Promise.resolve().then(i.bind(null,t)).then(e.bind(null,t))),t===`after`&&(r=(e,t)=>{let n;return Promise.resolve().then(e.bind(null,t)).then(e=>(n=e,i(n,t))).then(()=>n)}),t===`error`&&(r=(e,t)=>Promise.resolve().then(e.bind(null,t)).catch(e=>i(e,t))),e.registry[n].push({hook:r,orig:i})}function di(e,t,n){if(!e.registry[t])return;let r=e.registry[t].map(e=>e.orig).indexOf(n);r!==-1&&e.registry[t].splice(r,1)}const fi=Function.bind,pi=fi.bind(fi);function mi(e,t,n){let r=pi(di,null).apply(null,n?[t,n]:[t]);e.api={remove:r},e.remove=r,[`before`,`error`,`after`,`wrap`].forEach(r=>{let i=n?[t,r,n]:[t,r];e[r]=e.api[r]=pi(ui,null).apply(null,i)})}function hi(){let e=Symbol(`Singular`),t={registry:{}},n=li.bind(null,t,e);return mi(n,t,e),n}function gi(){let e={registry:{}},t=li.bind(null,e);return mi(t,e),t}var _i={Singular:hi,Collection:gi},vi=`0.0.0-development`;function yi(e){return`Request failed due to following response errors:
5
5
  `+e.errors.map(e=>` - ${e.message}`).join(`
@@ -8,12 +8,12 @@ import{o as e}from"./chunk-DTipWd-i.mjs";import{$a as t,$o as n,At as r,Cs as i,
8
8
  `),n.includes(`file`)&&process.stderr.write(` cleared from ~/.ok/auth.yml
9
9
  `)}function ma(){return new M(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).action(async e=>{let t=e.host??Re(process.cwd());await pa({...e,host:t})})}async function ha(e,t,n=rn){let r=n(e);if(r.available&&r.token)return{tier:`A`,token:r.token};let i=await t.get(e);return i==null?{tier:`none`}:{tier:i.gitProtocol===`ssh`?`C`:`B`,token:i.token}}function ga(e,t,n){return{type:`status`,host:e,backend:t,...n}}async function _a(e,t){let{host:n,json:r}=e;K(n);let i=t.backend,a=await ha(n,t);a.tier===`none`&&(r?process.stdout.write(`${JSON.stringify(ga(n,i,{authenticated:!1}))}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let o=n===`github.com`?void 0:`https://${n}/api/v3`,s=new ra({auth:a.token,...o?{baseUrl:o}:{}});try{let{data:e}=await s.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify(ga(n,i,{authenticated:!0,tier:a.tier,login:e.login,name:e.name,email:e.email}))}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch(e){let t=oa(e,n);r?process.stdout.write(`${JSON.stringify(ga(n,i,{authenticated:!1,error:t.message}))}\n`):process.stderr.write(`✗ ${t.message}\n`),process.exit(1)}}function va(e){return new M(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).option(`--json`,`Output JSON`,!1).action(async t=>{let n=t.host??Re(process.cwd());await _a({...t,host:n},await e())})}function ya(e){let t=new M(`auth`);t.description(`GitHub authentication management`);let n=e=>nn(void 0,e);return t.addCommand(oi(n)),t.addCommand(va(n)),t.addCommand(fa(n)),t.addCommand(ma()),t.addCommand(la(n)),t.addCommand(Hr(n,e)),t}function ba(){return new M(`bug-report`).description(`Generate a diagnostic bundle for bug reporting`).option(`--reveal`,`Reveal the bundle in Finder (default: true)`,!0).option(`--no-reveal`,`Do not reveal the bundle in Finder`).action(async e=>{try{let{zipPath:t,summary:n}=await Gt({level:`standard`,projectDir:process.cwd(),redact:!0,outputPath:zt(),logger:Nf()});if(process.stdout.write(`${t}\n`),n.redactedLineCount>0&&process.stderr.write(`ok bug-report: ${n.redactedLineCount} line(s) auto-redacted across ${n.redactions.length} file(s)\n`),e.reveal&&ur()===`darwin`)try{jn(`/usr/bin/open`,[`-R`,t])}catch{}}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`ok bug-report: failed — ${t}\n`),process.exitCode=1}})}function xa(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function Sa(e){let t=e.inspect??(t=>en(e.lockDir,t)),n=e.unlink??(e=>G(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=xa(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function Ca(e){return new M(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Sa({lockDir:O(process.cwd())}).failed.length>0&&(process.exitCode=1)})}function wa(e){return`credential.helper=!${e.map(d).join(` `)} auth git-credential`}async function Ta(e,t,n={},r=rn){let i=[`credential.helper=`,wa(n.selfCliArgs??[`open-knowledge`])];if(!n.skipGhDetect){let t=r(e);if(t.available&&t.token)return{tier:`A`,gitConfig:i,relayToken:{token:t.token,host:e}}}let a=await t.get(e);return a==null?{tier:`none`,gitConfig:[]}:{tier:a.gitProtocol===`ssh`?`C`:`B`,gitConfig:i}}async function Ea(e,t,n=fetch){let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return(await n(`https://api.github.com/repos/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{signal:r.signal,headers:{"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}})).status===200}catch{return!1}finally{clearTimeout(i)}}const Da=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Oa(e){let t=/^([\w ]+):\s+(\d+)%/.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase(),r=Number(t[2]);for(let[e,i,a]of Da)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function q(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function ka(e=process.env){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t.GIT_TERMINAL_PROMPT=`0`,t.LANG=`C`,t.LC_ALL=`C`,t}function Aa(e,t=process.env){let n=ka(t);return e.relayToken?(n.OK_GH_TOKEN=e.relayToken.token,n.OK_GH_TOKEN_HOST=e.relayToken.host):(delete n.OK_GH_TOKEN,delete n.OK_GH_TOKEN_HOST),n}function ja(e=process.argv,t=process.execPath){let n=e[1];return n?[t,n]:[t]}function Ma(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Na=f;async function Pa(e){try{return await e.clone(Ma(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Na(t))return e.onFallback(e.branch),await e.clone(Ma(null)),{fellBack:!0};throw t}}function Fa(e,t){return{baseDir:e,config:t,unsafe:{allowUnsafeCredentialHelper:!0,allowUnsafePager:!0,allowUnsafeSshCommand:!0,allowUnsafeAskPass:!0,allowUnsafeEditor:!0}}}function Ia(e,t,n){return e===`https`&&t===`github.com`&&n}function La(e,t){let n=`${t.owner}/${t.name}`;return e===n||e===`${n}.git`?`https://${t.hostname}/${n}`:e}async function Ra(e,t,n,r=process.cwd()){let i=Qt(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=La(e,i),o=t.dir?V(r,t.dir):V(r,i.name);if(H(o)&&ir(o).length>0)throw Error(`Target directory is not empty: ${o}`);Ve();let s=an(),c=i.protocol===`https`&&i.hostname===`github.com`?await Ea(i.owner,i.name):!1,l=Ia(i.protocol,i.hostname,c)?{tier:`none`,gitConfig:[]}:await Ta(i.hostname,s,{selfCliArgs:ja()}),u=Aa(l),d=At(Fa(r,l.gitConfig)).env(u),f=-1;d.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
10
10
  `)){let n=Oa(e);n&&n.pct!==f&&(f=n.pct,q(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await Pa({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:e=>d.clone(a,o,e),onFallback:e=>{q(t.json,{type:`branch-fallback`,branch:e}),t.json||process.stderr.write(`\n Branch '${e}' not found upstream — cloning default branch instead.\n`)}}),t.json||process.stderr.write(`
11
- `);try{let{runInit:e}=await import(`./init-YMPn7j-R.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{za(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function za(e){let t=vn(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const Ba=/^[A-Za-z0-9._/:@-]+$/;function Va(e){return Ba.test(e)?e:d(e)}function Ha(e,t){let n=typeof t==`string`&&t.length>0?` -b ${Va(t)}`:``;return`ok clone ${Va(e)}${n}`}function Ua(e){let n=t(e.error);if(n.kind!==`auth`)return null;if(b(n)){let t=Ha(e.url,e.branch);return[`✗ Couldn't clone ${e.url} — authentication is required.`,``,` To fix:`,` 1. Run: ok auth login`,` 2. Then re-run: ${t}`].join(`
11
+ `);try{let{runInit:e}=await import(`./init-BnKh4hJB.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{za(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function za(e){let t=vn(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const Ba=/^[A-Za-z0-9._/:@-]+$/;function Va(e){return Ba.test(e)?e:d(e)}function Ha(e,t){let n=typeof t==`string`&&t.length>0?` -b ${Va(t)}`:``;return`ok clone ${Va(e)}${n}`}function Ua(e){let n=t(e.error);if(n.kind!==`auth`)return null;if(b(n)){let t=Ha(e.url,e.branch);return[`✗ Couldn't clone ${e.url} — authentication is required.`,``,` To fix:`,` 1. Run: ok auth login`,` 2. Then re-run: ${t}`].join(`
12
12
  `)}if(n.subclass===`403`){let t=typeof e.principal==`string`&&e.principal.length>0?` (signed in as @${e.principal} — may lack access)`:``;return`✗ Access denied when cloning ${e.url}${t}. Check that your account has access to the repository.`}return n.subclass===`ssh-auth`?`✗ Couldn't clone ${e.url} over SSH — authentication failed. Check that your SSH key is added to your GitHub account and the host key is trusted, or clone the HTTPS URL instead.`:["✗ Your GitHub token is missing required OAuth scopes — likely the `repo` scope.",``,` To fix:`," 1. Create a token with `repo` scope at https://github.com/settings/tokens",` 2. Run: ok auth pat`,` 3. Then re-run: ${Ha(e.url,e.branch)}`].join(`
13
- `)}function Wa(e){let t=e.error instanceof Error?e.error.message:String(e.error);if(e.json){e.emit({type:`error`,message:t});return}let n=Ua({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function Ga(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function Ka(e){let n=t(e.error),r=null;if(!e.json&&n.kind===`auth`&&n.subclass===`403`){let t=Qt(e.url);t&&(r=await(e.resolvePrincipal??(e=>Ga(an(),e)))(t.hostname))}Wa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:r,emit:e.emit,printStderr:e.printStderr})}function qa(e){return new M(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await Ra(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-BRdG0jJw.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){if(e instanceof T||e instanceof Ee){r.json?q(!0,{type:`error`,message:e.message}):process.stderr.write(`${e.message}\n`),process.exitCode=78;return}await Ka({error:e,url:t,branch:r.branch??null,json:r.json,emit:e=>q(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var Ja=yt();const Ya=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...mt.map(e=>e.path)];function Xa(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Ln;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function Za(e){let t=(0,Ja.parseDocument)(U(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of Ya)t.hasIn(e)&&n.push(e.join(`.`));return n}function Qa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $a(e){let t={};for(let n of e){let e=t;for(let t=0;t<n.length-1;t++){let r=n[t],i=e[r],a=Qa(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function eo(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??kt,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Dt(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Dt(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!H(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Za(n)}catch(e){let r=e instanceof Error?e.message:String(e);c.push({path:n,scope:t,found:[],removed:[],error:r}),l=!1;continue}if(r.length===0||i){c.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:$a(Ya.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:_t(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}function to(){let e=new M(`config`).description(`Inspect and maintain OpenKnowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{Xa({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*, server.port)`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await eo({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}const no=[` 1. ${R(`Customize`)} (sidebar) → ${R(`Skills`)}`,` 2. Click the ${R(`+`)} button`,` 3. Click ${R(`Create skill`)}`,` 4. Click ${R(`Upload skill`)}`,` 5. Pick ${R(`openknowledge.skill`)} from Downloads`],ro=N(` Open the Claude Desktop App, then: ${R(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function io(e){let t=[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(L(` Handoff failed: ${e.handoffError.message}`)),t.push(ro),t.join(`
13
+ `)}function Wa(e){let t=e.error instanceof Error?e.error.message:String(e.error);if(e.json){e.emit({type:`error`,message:t});return}let n=Ua({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function Ga(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function Ka(e){let n=t(e.error),r=null;if(!e.json&&n.kind===`auth`&&n.subclass===`403`){let t=Qt(e.url);t&&(r=await(e.resolvePrincipal??(e=>Ga(an(),e)))(t.hostname))}Wa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:r,emit:e.emit,printStderr:e.printStderr})}function qa(e){return new M(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await Ra(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-D08mufE-.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){if(e instanceof T||e instanceof Ee){r.json?q(!0,{type:`error`,message:e.message}):process.stderr.write(`${e.message}\n`),process.exitCode=78;return}await Ka({error:e,url:t,branch:r.branch??null,json:r.json,emit:e=>q(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var Ja=yt();const Ya=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...mt.map(e=>e.path)];function Xa(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Ln;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function Za(e){let t=(0,Ja.parseDocument)(U(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of Ya)t.hasIn(e)&&n.push(e.join(`.`));return n}function Qa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $a(e){let t={};for(let n of e){let e=t;for(let t=0;t<n.length-1;t++){let r=n[t],i=e[r],a=Qa(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function eo(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??kt,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Dt(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Dt(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!H(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Za(n)}catch(e){let r=e instanceof Error?e.message:String(e);c.push({path:n,scope:t,found:[],removed:[],error:r}),l=!1;continue}if(r.length===0||i){c.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:$a(Ya.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:_t(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}function to(){let e=new M(`config`).description(`Inspect and maintain OpenKnowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{Xa({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*, server.port)`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await eo({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}const no=[` 1. ${R(`Customize`)} (sidebar) → ${R(`Skills`)}`,` 2. Click the ${R(`+`)} button`,` 3. Click ${R(`Create skill`)}`,` 4. Click ${R(`Upload skill`)}`,` 5. Pick ${R(`openknowledge.skill`)} from Downloads`],ro=N(` Open the Claude Desktop App, then: ${R(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function io(e){let t=[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(L(` Handoff failed: ${e.handoffError.message}`)),t.push(ro),t.join(`
14
14
  `)}function ao(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[N(`OpenKnowledge skill ${R(`v${t}`)} already delivered to Claude Desktop.`),P(` Recorded at ${n} in ~/.ok/skill-state.yml`),P(` Use ${R(`--force`)} to rebuild and re-open the install dialog.`)].join(`
15
15
  `)}function oo(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),N(` Claude Desktop App opened. Now upload the file manually:`),...no,P(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
16
- `)}function so(e){return`${I(`Error:`)} ${e.buildError??`unknown build failure`}`}async function co(e={}){let t=await Je(e);return t.status===`failed`?{...t,message:so(t),exitCode:1}:t.status===`skip-current`?{...t,message:ao(t),exitCode:0}:t.status===`installed`?{...t,message:oo(t),exitCode:0}:{...t,message:io(t),exitCode:0}}function lo(){return new M(`cowork`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. (Advanced/rarely needed — `ok init` already wires Claude.)").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await co({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}async function uo(e,t){let n=br({input:t??process.stdin,output:process.stderr});try{let t=(await n.question(e)).trim().toLowerCase();return t===`y`||t===`yes`}finally{n.close()}}function fo(e={}){let t=e.productName??`OpenKnowledge`;return z(Rt(e),t)}function po(e){if(typeof e!=`object`||!e)return null;let t=e.recentProjects;if(!Array.isArray(t))return null;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;typeof t.path==`string`&&typeof t.name==`string`&&n.push({path:t.path,name:t.name})}return n}function mo(e){let t=z(e,`state.json`);if(!H(t))return[];let n;try{n=JSON.parse(U(t,`utf-8`))}catch{return[]}return po(n)??[]}function ho(e){let t=z(e,`state.json`);if(!H(t))return!1;try{return po(JSON.parse(U(t,`utf-8`)))!==null}catch{return!1}}function J(e,t){return e===t?`~`:e.startsWith(`${t}/`)?`~${e.slice(t.length)}`:e}function go(e){return Yn===`/`?e:e.split(Yn).join(`/`)}function _o(e,t,n=`This project`){let r=[];r.push({kind:`stop-server`,group:n,label:`Stop the project server (if running)`,lockDir:O(e)});let i=new Set;for(let a of It){let o=Ft[a];if(!o.projectConfigPath)continue;let s=o.projectConfigPath(e);i.add(go(B(e,s))),r.push({kind:`mcp-entry`,group:n,label:`Remove OK's MCP entry from ${o.label} (${go(B(e,s))})`,editorId:a,scope:`project`,cwd:e,home:t,configPath:s})}r.push({kind:`launch-entry`,group:n,label:`Remove OK's entry from .claude/launch.json`,projectRoot:e}),r.push({kind:`git-exclude`,group:n,label:`Remove OK paths from .git/info/exclude`,projectRoot:e});let a=new Set([...wn(e),...w]);for(let t of a){let a=t.replace(/\/$/,``);i.has(a)||a!==`.claude/launch.json`&&r.push({kind:`remove-path`,group:n,label:`Remove ${t}`,path:z(e,a),containWithin:e})}try{r.push({kind:`remove-path`,group:n,label:`Remove the OK shadow repo (.git/ok/)`,path:it(e)})}catch{}return r}function vo(e,t){return{scope:`deinit`,ops:_o(e,t)}}function yo(e){let{home:t,platform:n,host:r,lockDirs:i,marker:a,recentDeinitProjectRoots:o,purgeContent:s}=e,c=[];for(let e of i)c.push({kind:`stop-server`,group:`Running servers`,label:`Stop server at ${J(z(e,`..`,`..`),t)}`,lockDir:e});c.push({kind:`keychain-token`,group:`Credentials`,label:`Remove the GitHub credential (${r}) from the OS keychain + auth.yml`,host:r}),c.push({kind:`embeddings-key`,group:`Credentials`,label:`Remove all embeddings API keys (secrets.yml)`}),c.push(...xo(a,t));for(let e of It){let n=Ft[e],r;try{r=n.configPath(``,t)}catch{continue}c.push({kind:`mcp-entry`,group:`Editor MCP configs`,label:`Remove OK's MCP entry from ${n.label} (${J(r,t)})`,editorId:e,scope:`user`,cwd:t,home:t,configPath:r})}for(let e of Pt(t))c.push({kind:`remove-path`,group:`Skill bundles`,label:`Remove ${J(e.path,t)}`,path:e.path});c.push(...So(t,n,e.env));for(let e of o)c.push(..._o(e,t,`Project: ${Kn(e)}`));return c.push({kind:`remove-path`,group:`Global directory`,label:s?`Remove ~/.ok (including user-authored skills)`:`Remove ~/.ok (keeping ~/.ok/skills)`,path:z(t,`.ok`),preserve:s?void 0:[`skills`]}),{scope:`uninstall`,ops:c}}function bo(e){return[z(e,`.zshrc`),z(e,`.bash_profile`),z(e,`.config`,`fish`,`conf.d`,`open-knowledge.fish`)]}function xo(e,t){let n=[],r=new Set([...bo(t),...e?.rcFiles??[]]);for(let e of r)H(e)&&n.push({kind:`shell-block`,group:`Shell PATH`,label:`Strip the OK block from ${J(e,t)}`,rcFile:e});for(let r of e?.extraSymlinks??[])n.push({kind:`extra-symlink`,group:`Shell PATH`,label:`Remove the ok symlink at ${J(r.path,t)}`,path:r.path,target:r.target});return n}function So(e,t,n){if(t!==`darwin`)return[];let r={home:e,platformName:t,env:n},i=fo(r),a=fo({...r,productName:`Open Knowledge`}),o=z(e,`Library`,`Caches`,`OpenKnowledge-updater`);return[{kind:`remove-path`,group:`Application data`,label:`Remove ${J(i,e)}`,path:i},{kind:`remove-path`,group:`Application data`,label:`Remove ${J(a,e)} (only if it is OpenKnowledge's)`,path:a,requireOurState:!0},{kind:`remove-path`,group:`Application data`,label:`Remove ${J(o,e)}`,path:o}]}async function Co(e,t={}){let n=t.clearToken??on,r=t.clearEmbeddingsKey??re,i=t.stopServer??(e=>{let t=qt({lockDir:e,log:()=>{},error:()=>{}});return{stopped:t.stopped.length,failed:t.failed.map(e=>({pid:e.target.pid,error:e.error}))}}),a=[];for(let t of e.ops)try{a.push(await wo(t,{clearToken:n,clearEmbeddingsKey:r,stopServer:i}))}catch(e){a.push({op:t,status:`failed`,detail:e instanceof Error?e.message:String(e)})}return{results:a,removed:a.filter(e=>e.status===`removed`),failed:a.filter(e=>e.status===`failed`)}}async function wo(e,t){switch(e.kind){case`stop-server`:{let{stopped:n,failed:r}=t.stopServer(e.lockDir);return r.length>0?{op:e,status:`failed`,detail:`could not stop the server (${r.map(e=>`pid ${e.pid}: ${e.error}`).join(`; `)}); a process may still be using files that were removed`}:{op:e,status:n>0?`removed`:`not-present`}}case`keychain-token`:{let{touched:n,keychainError:r}=await t.clearToken(e.host);return r?{op:e,status:`failed`,detail:`keychain unreachable (${r}); remove manually: Keychain Access → service "open-knowledge"`}:{op:e,status:n.length>0?`removed`:`not-present`}}case`embeddings-key`:{let{touched:n}=await t.clearEmbeddingsKey();return{op:e,status:n.length>0?`removed`:`not-present`}}case`shell-block`:{if(!H(e.rcFile))return{op:e,status:`not-present`};let{text:t,changed:n,emptyAfter:r}=Jt(U(e.rcFile,`utf-8`));return n?r?(sr(e.rcFile,{force:!0}),{op:e,status:`removed`,detail:`file removed (was OK-owned)`}):(Ot(e.rcFile,t,{mode:xn(e.rcFile)}),{op:e,status:`removed`}):{op:e,status:`not-present`}}case`extra-symlink`:return Kt(e.path,e.target)?(G(e.path),{op:e,status:`removed`}):{op:e,status:`not-present`};case`mcp-entry`:{let t=Zt(Ft[e.editorId],e.cwd,e.home,e.configPath);switch(t.kind){case`removed`:return{op:e,status:`removed`};case`not-present`:return{op:e,status:`not-present`};case`left-foreign`:return{op:e,status:`skipped`,detail:`left a non-OK server in place`};case`declined`:return{op:e,status:`skipped`,detail:`declined (${t.reason})`};default:throw Error(`unhandled mcp-remove outcome: ${t.kind}`)}}case`launch-entry`:{let t=zn(e.projectRoot);switch(t.kind){case`removed`:case`removed-file`:return{op:e,status:`removed`};case`not-present`:return{op:e,status:`not-present`};case`declined`:return{op:e,status:`skipped`,detail:`declined (unparseable)`};default:throw Error(`unhandled launch-remove outcome: ${t.kind}`)}}case`git-exclude`:{if(un(e.projectRoot).length===0)return{op:e,status:`not-present`};let t=pn(e.projectRoot,wn(e.projectRoot));return t.kind===`no-exclude`?t.reason===`inaccessible`?{op:e,status:`failed`,detail:`could not write .git/info/exclude (inaccessible)`}:{op:e,status:`not-present`,detail:t.reason}:{op:e,status:t.removed.length>0?`removed`:`not-present`}}case`remove-path`:return To(e)}}function To(e){if(e.requireOurState&&!ho(e.path))return{op:e,status:`skipped`,detail:`not verified as OpenKnowledge — left untouched`};e.containWithin&&Lt(e.path,e.containWithin);let t;try{t=er(e.path)}catch(e){if(e.code!==`ENOENT`)throw e}if(!t)return{op:e,status:`not-present`};if(t.isSymbolicLink())return G(e.path),{op:e,status:`removed`};if(e.preserve&&e.preserve.length>0){let t=new Set(e.preserve),n=!1;for(let r of ir(e.path))t.has(r)||(sr(z(e.path,r),{recursive:!0,force:!0}),n=!0);return{op:e,status:n?`removed`:`not-present`}}return sr(e.path,{recursive:!0,force:!0}),{op:e,status:`removed`}}function Eo(e){let t=new Map;for(let n of e){let e=t.get(n.group)??[];e.push(n),t.set(n.group,e)}return t}function Do(e){if(e.ops.length===0)return P(`Nothing to remove.`);let t=[];for(let[n,r]of Eo(e.ops)){t.length>0&&t.push(``),t.push(R(`${n}:`));for(let e of r)t.push(` ${L(`-`)} ${e.label}`)}return t.join(`
16
+ `)}function so(e){return`${I(`Error:`)} ${e.buildError??`unknown build failure`}`}async function co(e={}){let t=await Je(e);return t.status===`failed`?{...t,message:so(t),exitCode:1}:t.status===`skip-current`?{...t,message:ao(t),exitCode:0}:t.status===`installed`?{...t,message:oo(t),exitCode:0}:{...t,message:io(t),exitCode:0}}function lo(){return new M(`cowork`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. (Advanced/rarely needed — `ok init` already wires Claude.)").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await co({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}async function uo(e,t){let n=br({input:t??process.stdin,output:process.stderr});try{let t=(await n.question(e)).trim().toLowerCase();return t===`y`||t===`yes`}finally{n.close()}}function fo(e={}){let t=e.productName??`OpenKnowledge`;return z(Pt(e),t)}function po(e){if(typeof e!=`object`||!e)return null;let t=e.recentProjects;if(!Array.isArray(t))return null;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;typeof t.path==`string`&&typeof t.name==`string`&&n.push({path:t.path,name:t.name})}return n}function mo(e){let t=z(e,`state.json`);if(!H(t))return[];let n;try{n=JSON.parse(U(t,`utf-8`))}catch{return[]}return po(n)??[]}function ho(e){let t=z(e,`state.json`);if(!H(t))return!1;try{return po(JSON.parse(U(t,`utf-8`)))!==null}catch{return!1}}function J(e,t){return e===t?`~`:e.startsWith(`${t}/`)?`~${e.slice(t.length)}`:e}function go(e){return Yn===`/`?e:e.split(Yn).join(`/`)}function _o(e,t,n=`This project`){let r=[];r.push({kind:`stop-server`,group:n,label:`Stop the project server (if running)`,lockDir:O(e)});let i=new Set;for(let a of Lt){let o=It[a];if(!o.projectConfigPath)continue;let s=o.projectConfigPath(e);i.add(go(B(e,s))),r.push({kind:`mcp-entry`,group:n,label:`Remove OK's MCP entry from ${o.label} (${go(B(e,s))})`,editorId:a,scope:`project`,cwd:e,home:t,configPath:s})}r.push({kind:`launch-entry`,group:n,label:`Remove OK's entry from .claude/launch.json`,projectRoot:e}),r.push({kind:`git-exclude`,group:n,label:`Remove OK paths from .git/info/exclude`,projectRoot:e});let a=new Set([...wn(e),...w]);for(let t of a){let a=t.replace(/\/$/,``);i.has(a)||a!==`.claude/launch.json`&&r.push({kind:`remove-path`,group:n,label:`Remove ${t}`,path:z(e,a),containWithin:e})}try{r.push({kind:`remove-path`,group:n,label:`Remove the OK shadow repo (.git/ok/)`,path:it(e)})}catch{}return r}function vo(e,t){return{scope:`deinit`,ops:_o(e,t)}}function yo(e){let{home:t,platform:n,host:r,lockDirs:i,marker:a,recentDeinitProjectRoots:o,purgeContent:s}=e,c=[];for(let e of i)c.push({kind:`stop-server`,group:`Running servers`,label:`Stop server at ${J(z(e,`..`,`..`),t)}`,lockDir:e});c.push({kind:`keychain-token`,group:`Credentials`,label:`Remove the GitHub credential (${r}) from the OS keychain + auth.yml`,host:r}),c.push({kind:`embeddings-key`,group:`Credentials`,label:`Remove all embeddings API keys (secrets.yml)`}),c.push(...xo(a,t));for(let e of Lt){let n=It[e],r;try{r=n.configPath(``,t)}catch{continue}c.push({kind:`mcp-entry`,group:`Editor MCP configs`,label:`Remove OK's MCP entry from ${n.label} (${J(r,t)})`,editorId:e,scope:`user`,cwd:t,home:t,configPath:r})}for(let e of Ft(t))c.push({kind:`remove-path`,group:`Skill bundles`,label:`Remove ${J(e.path,t)}`,path:e.path});c.push(...So(t,n,e.env));for(let e of o)c.push(..._o(e,t,`Project: ${Kn(e)}`));return c.push({kind:`remove-path`,group:`Global directory`,label:s?`Remove ~/.ok (including user-authored skills)`:`Remove ~/.ok (keeping ~/.ok/skills)`,path:z(t,`.ok`),preserve:s?void 0:[`skills`]}),{scope:`uninstall`,ops:c}}function bo(e){return[z(e,`.zshrc`),z(e,`.bash_profile`),z(e,`.config`,`fish`,`conf.d`,`open-knowledge.fish`)]}function xo(e,t){let n=[],r=new Set([...bo(t),...e?.rcFiles??[]]);for(let e of r)H(e)&&n.push({kind:`shell-block`,group:`Shell PATH`,label:`Strip the OK block from ${J(e,t)}`,rcFile:e});for(let r of e?.extraSymlinks??[])n.push({kind:`extra-symlink`,group:`Shell PATH`,label:`Remove the ok symlink at ${J(r.path,t)}`,path:r.path,target:r.target});return n}function So(e,t,n){if(t!==`darwin`)return[];let r={home:e,platformName:t,env:n},i=fo(r),a=fo({...r,productName:`Open Knowledge`}),o=z(e,`Library`,`Caches`,`OpenKnowledge-updater`);return[{kind:`remove-path`,group:`Application data`,label:`Remove ${J(i,e)}`,path:i},{kind:`remove-path`,group:`Application data`,label:`Remove ${J(a,e)} (only if it is OpenKnowledge's)`,path:a,requireOurState:!0},{kind:`remove-path`,group:`Application data`,label:`Remove ${J(o,e)}`,path:o}]}async function Co(e,t={}){let n=t.clearToken??on,r=t.clearEmbeddingsKey??re,i=t.stopServer??(e=>{let t=qt({lockDir:e,log:()=>{},error:()=>{}});return{stopped:t.stopped.length,failed:t.failed.map(e=>({pid:e.target.pid,error:e.error}))}}),a=[];for(let t of e.ops)try{a.push(await wo(t,{clearToken:n,clearEmbeddingsKey:r,stopServer:i}))}catch(e){a.push({op:t,status:`failed`,detail:e instanceof Error?e.message:String(e)})}return{results:a,removed:a.filter(e=>e.status===`removed`),failed:a.filter(e=>e.status===`failed`)}}async function wo(e,t){switch(e.kind){case`stop-server`:{let{stopped:n,failed:r}=t.stopServer(e.lockDir);return r.length>0?{op:e,status:`failed`,detail:`could not stop the server (${r.map(e=>`pid ${e.pid}: ${e.error}`).join(`; `)}); a process may still be using files that were removed`}:{op:e,status:n>0?`removed`:`not-present`}}case`keychain-token`:{let{touched:n,keychainError:r}=await t.clearToken(e.host);return r?{op:e,status:`failed`,detail:`keychain unreachable (${r}); remove manually: Keychain Access → service "open-knowledge"`}:{op:e,status:n.length>0?`removed`:`not-present`}}case`embeddings-key`:{let{touched:n}=await t.clearEmbeddingsKey();return{op:e,status:n.length>0?`removed`:`not-present`}}case`shell-block`:{if(!H(e.rcFile))return{op:e,status:`not-present`};let{text:t,changed:n,emptyAfter:r}=Jt(U(e.rcFile,`utf-8`));return n?r?(sr(e.rcFile,{force:!0}),{op:e,status:`removed`,detail:`file removed (was OK-owned)`}):(Ot(e.rcFile,t,{mode:xn(e.rcFile)}),{op:e,status:`removed`}):{op:e,status:`not-present`}}case`extra-symlink`:return Kt(e.path,e.target)?(G(e.path),{op:e,status:`removed`}):{op:e,status:`not-present`};case`mcp-entry`:{let t=Zt(It[e.editorId],e.cwd,e.home,e.configPath);switch(t.kind){case`removed`:return{op:e,status:`removed`};case`not-present`:return{op:e,status:`not-present`};case`left-foreign`:return{op:e,status:`skipped`,detail:`left a non-OK server in place`};case`declined`:return{op:e,status:`skipped`,detail:`declined (${t.reason})`};default:throw Error(`unhandled mcp-remove outcome: ${t.kind}`)}}case`launch-entry`:{let t=zn(e.projectRoot);switch(t.kind){case`removed`:case`removed-file`:return{op:e,status:`removed`};case`not-present`:return{op:e,status:`not-present`};case`declined`:return{op:e,status:`skipped`,detail:`declined (unparseable)`};default:throw Error(`unhandled launch-remove outcome: ${t.kind}`)}}case`git-exclude`:{if(un(e.projectRoot).length===0)return{op:e,status:`not-present`};let t=pn(e.projectRoot,wn(e.projectRoot));return t.kind===`no-exclude`?t.reason===`inaccessible`?{op:e,status:`failed`,detail:`could not write .git/info/exclude (inaccessible)`}:{op:e,status:`not-present`,detail:t.reason}:{op:e,status:t.removed.length>0?`removed`:`not-present`}}case`remove-path`:return To(e)}}function To(e){if(e.requireOurState&&!ho(e.path))return{op:e,status:`skipped`,detail:`not verified as OpenKnowledge — left untouched`};e.containWithin&&Rt(e.path,e.containWithin);let t;try{t=er(e.path)}catch(e){if(e.code!==`ENOENT`)throw e}if(!t)return{op:e,status:`not-present`};if(t.isSymbolicLink())return G(e.path),{op:e,status:`removed`};if(e.preserve&&e.preserve.length>0){let t=new Set(e.preserve),n=!1;for(let r of ir(e.path))t.has(r)||(sr(z(e.path,r),{recursive:!0,force:!0}),n=!0);return{op:e,status:n?`removed`:`not-present`}}return sr(e.path,{recursive:!0,force:!0}),{op:e,status:`removed`}}function Eo(e){let t=new Map;for(let n of e){let e=t.get(n.group)??[];e.push(n),t.set(n.group,e)}return t}function Do(e){if(e.ops.length===0)return P(`Nothing to remove.`);let t=[];for(let[n,r]of Eo(e.ops)){t.length>0&&t.push(``),t.push(R(`${n}:`));for(let e of r)t.push(` ${L(`-`)} ${e.label}`)}return t.join(`
17
17
  `)}function Oo(e){let t=e.removed.length,n=e.failed.length,r=e.results.filter(e=>e.status===`not-present`).length,i=e.results.filter(e=>e.status===`skipped`),a=[];a.push(n>0?L(`Removed ${t} item${t===1?``:`s`}, ${n} could not be removed.`):F(`✓ Removed ${t} item${t===1?``:`s`}.`)),r>0&&a.push(P(` ${r} already absent.`));for(let e of i)a.push(` ${L(`·`)} Left in place: ${e.op.label}${e.detail?` — ${P(e.detail)}`:``}`);if(n>0){a.push(``),a.push(I(`Could not remove:`));for(let t of e.failed)a.push(` ${I(`✗`)} ${t.op.label}${t.detail?` — ${t.detail}`:``}`)}return a.join(`
18
18
  `)}function ko(e){return{scope:e.scope,mode:`dry-run`,planned:e.ops.map(e=>({kind:e.kind,label:e.label}))}}function Ao(e,t){return{scope:e,mode:`applied`,removed:t.removed.map(e=>({kind:e.op.kind,label:e.op.label})),skipped:t.results.filter(e=>e.status===`skipped`).map(e=>({kind:e.op.kind,label:e.op.label,detail:e.detail})),failed:t.failed.map(e=>({kind:e.op.kind,label:e.op.label,detail:e.detail}))}}async function jo(e={}){let t=V(e.cwd??process.cwd()),n=e.home??lr();if(!H(z(t,`.ok`)))return{status:`no-op`,message:P(`No OpenKnowledge project found at ${t}. Nothing to remove.`),exitCode:0};let r=vo(t,n);if(e.dryRun)return{status:`dry-run`,message:e.json?JSON.stringify(ko(r),null,2):`${R(`Would remove (dry-run — no changes made):`)}\n\n${Do(r)}`,exitCode:0};if(e.json&&!e.yes)return{status:`failed`,message:`${I(`Error:`)} --json requires --yes (or --dry-run) so there is no interactive prompt.`,exitCode:1};if(!e.yes&&(process.stderr.write(`${R(`Remove OpenKnowledge from ${t}:`)}\n\n${Do(r)}\n\n`),!await uo(`${R(`Remove these?`)} ${P(`[y/N] `)}`,e.confirmStream)))return{status:`cancelled`,message:P(`Cancelled.`),exitCode:0};let i=await Co(r,e.runRemovalDeps);return{status:i.failed.length>0?`failed`:`done`,message:e.json?JSON.stringify(Ao(`deinit`,i),null,2):Oo(i),exitCode:+(i.failed.length>0)}}function Mo(){return new M(`deinit`).description("Remove OpenKnowledge from this project (its .ok/, editor MCP entries, git-exclude lines, shadow repo) while leaving your markdown content untouched. Re-run `ok start` to re-scaffold.").argument(`[path]`,`Project directory (defaults to the current project)`).option(`-y, --yes`,`Skip the confirmation prompt`).option(`--dry-run`,`Print the removal plan and exit without changing anything`).option(`--json`,`Emit a machine-readable plan/outcome (requires --yes or --dry-run)`).action(async(e,t)=>{let n=await jo({cwd:e??process.cwd(),yes:t.yes,dryRun:t.dryRun,json:t.json});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}var Y=e(tn(),1);function No(){let e=Gn(`bun`,[`--version`],D({encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}}));return e.error?{ok:!1,error:e.error.message}:e.signal===`SIGTERM`?{ok:!1,error:`probe timed out`}:e.status===0?{ok:!0,version:e.stdout.trim()}:{ok:!1,error:e.stderr?.trim()||`exit code ${e.status}`}}function Po(e={}){let t=e.probe??No;return{name:`bun`,run:async()=>{let e=t();return e.ok?{name:`bun`,status:`pass`,summary:`bun ${e.version}`}:{name:`bun`,status:`fail`,summary:`bun not found on PATH`,remediation:`Install Bun: https://bun.sh/docs/installation`,detail:e.error}}}}function Fo(e={}){let t=e.loader??Ln;return{name:`config-yaml`,run:async e=>{if(!H(V(e.cwd,`.ok`,`config.yml`)))return{name:`config-yaml`,status:`warn`,summary:`.ok/${kn} not found (project not initialized)`,remediation:"Run `ok init` to scaffold the project."};try{let{config:n,sources:r}=t(e.cwd);return{name:`config-yaml`,status:`pass`,summary:`parses; content.dir = ${n.content.dir}`,detail:`sources: ${r.join(`, `)}`}}catch(e){let t=e instanceof Error?e.message:String(e);return{name:`config-yaml`,status:`fail`,summary:`.ok/${kn} failed to parse`,detail:t}}}}}function Io(e){try{return Xn(e,$n.W_OK),{writable:!0}}catch(e){return{writable:!1,reason:e instanceof Error?e.message:String(e)}}}function Lo(e={}){let t=e.loader??Ln,n=e.probeWritable??Io;return{name:`content-dir`,run:async e=>{if(!H(V(e.cwd,`.ok`,`config.yml`)))return{name:`content-dir`,status:`warn`,summary:`project not initialized`,remediation:"Run `ok init` to scaffold the project."};let r;try{let{config:n}=t(e.cwd);r=V(e.cwd,n.content.dir)}catch(e){return{name:`content-dir`,status:`fail`,summary:`content.dir unresolved (config invalid)`,detail:e instanceof Error?e.message:String(e)}}if(!H(r))return{name:`content-dir`,status:`fail`,summary:`content.dir does not exist: ${r}`,remediation:`Create the directory or fix \`content.dir\` in .ok/${kn}.`};if(!W(r).isDirectory())return{name:`content-dir`,status:`fail`,summary:`content.dir is not a directory: ${r}`};let i=n(r);return i.writable?{name:`content-dir`,status:`pass`,summary:`${r} (writable)`}:{name:`content-dir`,status:`fail`,summary:`content.dir is not writable: ${r}`,detail:i.reason}}}}function Ro(e={}){let t=e.assert??Ve;return{name:`git`,run:async()=>{try{let e=t();return{name:`git`,status:`pass`,summary:`git ${e.version} (${e.source} — ${e.resolvedPath})`}}catch(e){if(e instanceof T)return{name:`git`,status:`fail`,summary:`git not found`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};if(e instanceof Ee)return{name:`git`,status:`fail`,summary:`git ${e.detected} is older than required ${e.required}`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};throw e}}}}function zo(e){let t=Gn(`codesign`,[`--verify`,`--deep`,`--strict`,e],{encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}});return t.error?{ok:!1,stderr:t.error.message}:t.signal===`SIGTERM`?{ok:!1,stderr:`codesign probe timed out`}:{ok:t.status===0,stderr:(t.stderr??``).trim()}}function Bo(e={}){let t=e.platform??process.platform,n=e.execPath??process.execPath,r=e.codesignVerify??zo;return{name:`macos-codesig`,run:async()=>{if(t!==`darwin`)return{name:`macos-codesig`,status:`pass`,summary:`skipped on ${t} (macOS-only check)`};let e=n.indexOf(`/Contents/MacOS/`);if(e===-1)return{name:`macos-codesig`,status:`pass`,summary:`dev mode (no app bundle)`};let i=n.slice(0,e);if(i.startsWith(`/private/var/folders/`))return{name:`macos-codesig`,status:`fail`,summary:`app is running translocated (quarantine sandbox)`,remediation:`Drag OpenKnowledge.app to /Applications/ and re-launch.`,detail:`bundlePath: ${i}`};let a=r(i);return a.ok?{name:`macos-codesig`,status:`pass`,summary:`signed bundle at ${i}`}:{name:`macos-codesig`,status:`fail`,summary:`codesign --verify failed`,remediation:`Re-download OpenKnowledge from the official releases page.`,detail:`bundlePath: ${i}\n${a.stderr}`}}}}const Vo=[`git`,`bun`,`config-yaml`,`content-dir`,`server-lock`,`shadow-repo`,`shadow-health`,`macos-codesig`];function Ho(e){return Vo.includes(e)}async function Uo(e,t,n={}){let r=n.timeoutMs??5e3,i,a=Math.round(r/1e3);try{let n=new Promise(t=>{i=setTimeout(()=>{t({name:e.name,status:`fail`,summary:`check timed out after ${a}s`})},r)}),o=e.run(t),s=await Promise.race([o,n]);return o.catch(()=>{}),s}catch(t){let n=t instanceof Error?t.message:String(t);return{name:e.name,status:`fail`,summary:`check crashed: ${n}`}}finally{i!==void 0&&clearTimeout(i)}}async function Wo(e,t,n={}){let r=[];for(let i of e)r.push(await Uo(i,t,n));return r}function Go(e={}){let t=e.inspect??en;return{name:`server-lock`,run:async e=>{let n=O(e.cwd);if(!H(n))return{name:`server-lock`,status:`pass`,summary:"no server lock (no `.ok/local/` yet)"};let r=t(n,`server`);switch(r.status){case`missing`:return{name:`server-lock`,status:`pass`,summary:`no server holding the lock`};case`alive`:return{name:`server-lock`,status:`fail`,summary:`server lock held by pid ${r.lock.pid} on this host`,remediation:"Stop the other OpenKnowledge process or run `ok stop`.",detail:`lockPath: ${r.lockPath}; port: ${r.lock.port}; started: ${r.lock.startedAt}`};case`foreign-host`:return{name:`server-lock`,status:`warn`,summary:`lock claimed by ${r.lock.hostname} (foreign host)`,remediation:`Run \`ok clean\` to prune the stale lock at ${V(n,`server.lock`)}.`,detail:`lockPath: ${r.lockPath}; pid: ${r.lock.pid}`};case`dead-pid`:return{name:`server-lock`,status:`warn`,summary:`stale lock for non-existent pid ${r.lock.pid}`,remediation:"Run `ok clean` to prune.",detail:`lockPath: ${r.lockPath}`};case`corrupt`:return{name:`server-lock`,status:`warn`,summary:`server.lock is corrupt (unparseable or invalid pid)`,remediation:`Delete ${r.lockPath} and rerun.`};default:return r}}}}async function Ko(e,t){let n={gitDir:e,workTree:t},r=await ue(n),a=await ae(n),o=await te(n,Date.now()-18e5),s=se(n),c=null;for(let t of[`objects/info/commit-graph`,`objects/info/commit-graphs`]){let n=V(e,t);if(H(n))try{c=Math.max(c??0,W(n).mtimeMs)}catch{}}let l=null;try{let n=At({baseDir:t,timeout:{block:4e3}}).env({GIT_DIR:e}),r=(await n.raw(`for-each-ref`,`--sort=-creatordate`,`--format=%(objectname)`,`refs/checkpoints/`)).trim().split(`
19
19
  `).filter(Boolean).slice(0,25);for(let e of r){let t=(await n.raw(`log`,`-1`,`--format=%cI%x00%B`,e)).trim(),r=t.indexOf(`\0`);if(r<0)continue;let a=t.slice(0,r);if(i(t.slice(r+1))?.kind===`auto-consolidation`){let e=Date.parse(a);Number.isFinite(e)&&(l=e);break}}}catch{}return{looseObjects:r.looseObjects,packfiles:r.packfiles,wipWidth:a,deadChains:o,gcLogLatch:s,lastPackedAtMs:c,lastConsolidationAtMs:l}}function qo(e){if(e===null)return`never`;let t=Date.now()-e,n=t/(1440*60*1e3);if(n>=1)return`${Math.round(n)}d ago`;let r=t/(3600*1e3);return r>=1?`${Math.round(r)}h ago`:`${Math.max(0,Math.round(t/6e4))}m ago`}function Jo(e={}){let t=e.resolveDir??it,n=e.readFacts??Ko;return{name:`shadow-health`,run:async e=>{if(!H(V(e.cwd,`.git`)))return{name:`shadow-health`,status:`warn`,summary:`no .git/ at project root (shadow repo not initialized)`,remediation:"Run `ok start` once to initialize the shadow repo."};let r;try{r=t(e.cwd)}catch(e){return{name:`shadow-health`,status:`warn`,summary:`cannot resolve shadow gitdir: ${e instanceof Error?e.message:String(e)}`}}if(!H(r))return{name:`shadow-health`,status:`warn`,summary:`shadow repo not yet initialized`,remediation:"Run `ok start` once to initialize the shadow repo."};let i=await n(r,e.cwd),a=[];i.gcLogLatch&&a.push(`gc.log latch present (auto-packing disabled until it self-expires)`),i.looseObjects>2e3?a.push(`${i.looseObjects} loose objects (unpacked)`):i.packfiles===0&&i.looseObjects>512&&a.push(`${i.looseObjects} loose objects, never packed`),i.deadChains>5&&a.push(`${i.deadChains} dead chains unfolded (auto-consolidation not keeping up)`),i.wipWidth>20&&a.push(`${i.wipWidth} WIP refs (version-journal width high)`);let o=[`loose objects: ${i.looseObjects}`,`packfiles: ${i.packfiles}`,`WIP refs: ${i.wipWidth}`,`dead chains: ${i.deadChains}`,`gc.log latch: ${i.gcLogLatch?`present`:`none`}`,`last packed: ${qo(i.lastPackedAtMs)}`,`last fold: ${qo(i.lastConsolidationAtMs)}`].join(`, `);return a.length>0?{name:`shadow-health`,status:`warn`,summary:`history may be slow: ${a.join(`; `)}`,remediation:`Packing and journal cleanup run automatically on the next server start and during use. If this persists, check the server logs.`,detail:o}:{name:`shadow-health`,status:`pass`,summary:`${i.looseObjects} loose, ${i.packfiles} packs, ${i.wipWidth} WIP refs`,detail:o}}}}function Yo(e={}){let t=e.resolve??it;return{name:`shadow-repo`,run:async e=>{if(!H(V(e.cwd,`.git`)))return{name:`shadow-repo`,status:`warn`,summary:`no .git/ at project root (shadow repo not initialized)`,remediation:"Run `ok start` once to initialize the shadow repo."};let n;try{n=t(e.cwd)}catch(e){if(e instanceof ve||e instanceof ke)return{name:`shadow-repo`,status:`fail`,summary:`cannot resolve shadow gitdir: ${e.message}`};throw e}if(!H(n))return{name:`shadow-repo`,status:`warn`,summary:`shadow repo at ${n} not yet initialized`,remediation:"Run `ok start` once to initialize the shadow repo."};let r=V(n,`HEAD`);if(!H(r))return{name:`shadow-repo`,status:`fail`,summary:`shadow repo at ${n} is missing HEAD`};let i;try{i=U(r,`utf-8`).trim()}catch(e){return{name:`shadow-repo`,status:`fail`,summary:`cannot read shadow HEAD: ${e instanceof Error?e.message:String(e)}`}}return{name:`shadow-repo`,status:`pass`,summary:`${n} (HEAD: ${i})`}}}}function Xo(){return[Ro(),Po(),Fo(),Lo(),Go(),Yo(),Jo(),Bo()]}function Zo(e){switch(e){case`pass`:return Y.default.green(`✓`);case`warn`:return Y.default.yellow(`!`);case`fail`:return Y.default.red(`✗`)}}function Qo(e,t){let n=[`[${Zo(e.status)}] ${e.name}: ${e.summary}`];if(e.remediation!==void 0&&e.status!==`pass`&&n.push(` → ${e.remediation}`),t&&e.detail!==void 0)for(let t of e.detail.split(`
@@ -39,7 +39,7 @@ ws.addEventListener('error', () => process.exit(1));
39
39
  setTimeout(() => process.exit(2), ${t+1e4});
40
40
  `),r}async function ss(e,t,n,r,i){let a=os(e,t,z(r,`cpu.cpuprofile`)),o=!1,s=Wn(process.execPath,[a],D({stdio:`ignore`})),c=setInterval(()=>{let e=ns(n);e&&i(e)},1e3);await new Promise(e=>{s.once(`close`,t=>{o=t===0,e()}),setTimeout(()=>{s.kill(),e()},t+12e3)}),clearInterval(c);try{sr(z(a,`..`),{recursive:!0,force:!0})}catch{}return o}function cs(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
41
41
  `)}async function ls(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??He,s=t.inspect??en,c=t.resolveCommand??Fe,l=t.resolveUsage??Ce,u=t.collectLsofFn??rs,d=t.getEndpoints??as,f=t.profiler??ss,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(Y.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e,`server`);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){v=t.lock.worktreeRoot,y={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let b=new Date().toISOString().replace(/[:.]/g,`-`),x=e.output?e.output:v?z(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):z(process.cwd(),`ok-diagnose-${n}-${b}`);try{tr(x,{recursive:!0})}catch(e){a(Y.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(Y.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{cr(z(x,e),t),a(` wrote ${e}`)},C=c(n),w=l(n);S(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:C,usage:w,lockInfo:y},null,2)),a(` sampling lsof`);let T=u(n);if(T&&S(`lsof.txt`,T),!i){let e=T?is(T).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(Y.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){S(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile`);let t=[];await f(e,g,n,x,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(Y.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
42
- `)}\n`);try{S(`stacks.txt`,cs(U(z(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function us(e){let t=br({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function ds(e){let t=nr(z(dr(),`ok-bundle-process-`));return await ls({pid:e,output:t}),t}function fs(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function ps(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function ms(e){let{summary:t,manifest:n}=e;return t.redacted?t.contentDirVisible?`masked as <CONTENT_DIR>, but still present in some files`:`masked as <CONTENT_DIR>`:t.contentDirVisible?`visible (${n.contentDir.absolutePath})`:`not present`}function hs(e){let t=e.manifest.redaction.secretScrub;return t===void 0?Y.default.yellow(`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${t.redactedLineCount} line(s) across ${t.redactions.length} file(s))`}function gs(e,t,n){let{summary:r,manifest:i}=t;e(``),e(Y.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${fs(r.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${r.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${ms(t)}`),e(` Credentials: ${hs(t)}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function _s(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??us,i=t.runProcessDiagnose??ds,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=qn(o);if(!H(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);tr(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=await $t({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,deps:t.collectDeps});try{return l.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),gs(n,l,o),e.yes!==!0&&!ps(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Ht({collected:l,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(l.cleanup(),s!==void 0)try{sr(s,{recursive:!0,force:!0})}catch{}}}function vs(){let e=new M(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await ls({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(ts()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--no-redact`,`Write a raw bundle: skip credential scrubbing and content-dir path masking`).option(`--redact`,`Scrub credentials and mask the content-dir path (the default)`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-_6OcHbvd.mjs`),{resolveContentDir:r}=await import(`./src-Dmoupsem.mjs`),i=process.cwd(),{config:a}=n(i);await _s({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(Y.default.red(t)),process.exit(1)}}),e}async function ys(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await ci({message:`Enter embeddings provider API key:`})).trim()}function bs(e){return ie(e)}async function xs(e,t){let n=await ge(oe(),e,t);return n.apiKey?{present:!0,notRequired:!1,source:n.source}:{present:!1,notRequired:n.keyless,source:null}}async function Ss(e){try{let t=Mt(O(e));if(!t||t.port<=0||!Nt(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Cs(){return new M(`set-key`).description(`Store the embeddings API key for THIS project's configured endpoint`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=await ys();if(!t){process.stderr.write(`No key provided.
42
+ `)}\n`);try{S(`stacks.txt`,cs(U(z(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function us(e){let t=br({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function ds(e){let t=nr(z(dr(),`ok-bundle-process-`));return await ls({pid:e,output:t}),t}function fs(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function ps(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function ms(e){let{summary:t,manifest:n}=e;return t.redacted?t.contentDirVisible?`masked as <CONTENT_DIR>, but still present in some files`:`masked as <CONTENT_DIR>`:t.contentDirVisible?`visible (${n.contentDir.absolutePath})`:`not present`}function hs(e){let t=e.manifest.redaction.secretScrub;return t===void 0?Y.default.yellow(`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${t.redactedLineCount} line(s) across ${t.redactions.length} file(s))`}function gs(e,t,n){let{summary:r,manifest:i}=t;e(``),e(Y.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${fs(r.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${r.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${ms(t)}`),e(` Credentials: ${hs(t)}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function _s(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??us,i=t.runProcessDiagnose??ds,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=qn(o);if(!H(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);tr(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=await $t({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,deps:t.collectDeps});try{return l.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),gs(n,l,o),e.yes!==!0&&!ps(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Ht({collected:l,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(l.cleanup(),s!==void 0)try{sr(s,{recursive:!0,force:!0})}catch{}}}function vs(){let e=new M(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await ls({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(ts()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--no-redact`,`Write a raw bundle: skip credential scrubbing and content-dir path masking`).option(`--redact`,`Scrub credentials and mask the content-dir path (the default)`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-DJaTAEVI.mjs`),{resolveContentDir:r}=await import(`./src-Dmoupsem.mjs`),i=process.cwd(),{config:a}=n(i);await _s({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(Y.default.red(t)),process.exit(1)}}),e}async function ys(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await ci({message:`Enter embeddings provider API key:`})).trim()}function bs(e){return ie(e)}async function xs(e,t){let n=await ge(oe(),e,t);return n.apiKey?{present:!0,notRequired:!1,source:n.source}:{present:!1,notRequired:n.keyless,source:null}}async function Ss(e){try{let t=Mt(O(e));if(!t||t.port<=0||!Nt(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Cs(){return new M(`set-key`).description(`Store the embeddings API key for THIS project's configured endpoint`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=await ys();if(!t){process.stderr.write(`No key provided.
43
43
  `),process.exitCode=1;return}let n=V(e.cwd??process.cwd()),{baseUrl:r}=bs(n);try{await oe().setForProject(n,r,t)}catch(e){process.stderr.write(`Failed to store the embeddings key: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings API key stored for ${r}\n (kept in ~/.ok/secrets.yml, 0600, this machine only — never in the project).
44
44
  Enable semantic search with \`ok embeddings enable\`, or in
45
45
  OK Desktop → Settings → This project → Search.
@@ -74,7 +74,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
74
74
  `).replace(/\n+$/,``);return e.endsWith(`
75
75
  `)?`${c}\n`:c}function ku(e){return e.replace(/\r\n|\r|\n/g,`<br>`).replace(/\|/g,`\\|`)}function Au(e){return/\s/.test(e)?`<${e}>`:e}function ju(e,t={}){let{header:n,rows:r}=eu(e),i=n.length;if(i===0)return{table:``,columns:0,wide:!1};let a=t.wideThreshold??15,o=t.titleColumn??0;return{table:[`| ${n.map(ku).join(` | `)} |`,`| ${n.map(()=>`---`).join(` | `)} |`,...r.map(e=>`| ${n.map((n,r)=>{let i=e[r]??``,a=ku(i);if(r===o&&t.linkForTitle&&i.trim()!==``){let e=t.linkForTitle(i);if(e)return`[${a}](${Au(e)})`}return a}).join(` | `)} |`)].join(`
76
76
  `),columns:i,wide:i>a}}function Mu(e,t){let n=e.match(/^#\s+(.+)$/m);return n?n[1].trim():t}function Nu(e,t){return`# ${e}\n\n${t}\n`}const Pu=[`links`,`frontmatter`,`callouts`,`images`,`tables`],Fu=/\.mdx?$/i;function Iu(e){return{isNotionExport:e,transforms:{links:0,frontmatter:0,callouts:0,images:0,tables:0},assetsExtracted:0,stubsCreated:0,csvsRemoved:0,wideTables:[],ambiguousTitleLinks:0,unreadable:[],filesChanged:0}}function Lu(e,t={}){let n=t.selected??new Set(Pu),r=xu(e);if(!r&&!t.force)return{changes:[],assets:[],deletions:[],report:Iu(!1)};let i=Iu(r),a=vu(e),o=lu(a,{onUnreadable:e=>i.unreadable.push(e)}),s=n.has(`tables`),c=new Map,l=new Set;for(let e of o){e.stubPath&&l.add(e.stubPath);for(let t of e.rowFiles)c.set(t,e)}let u=[],d=[],f=[];for(let e of a){if(!Fu.test(e)||s&&l.has(e))continue;let r;try{r=U(e,`utf8`)}catch{i.unreadable.push(e);continue}let a=r,o=(e,t)=>{a!==t&&(i.transforms[e]+=1)};if(n.has(`images`)){let n=a,r=$l(a,Kn(e),{strip:t.stripBase64});a=r.markdown;for(let t of r.assets)d.push({path:z(qn(e),t.filename),bytes:t.bytes});i.assetsExtracted+=r.assets.length,o(`images`,n)}if(n.has(`callouts`)){let e=a;a=Yl(a),o(`callouts`,e)}if(n.has(`frontmatter`)){let t=c.get(e);if(t){let e=a;a=Ou(a,t.propertyKeys),o(`frontmatter`,e)}}if(n.has(`links`)){let e=a;a=_u(a,{redirectCsv:s}),o(`links`,e)}a!==r&&u.push({path:e,content:a})}if(s)for(let e of o){let r=ju(e.csvText,{linkForTitle:t=>{let n=ou(e.folderIndex,t);return n.ambiguous&&(i.ambiguousTitleLinks+=1),n.path?B(qn(e.stubTargetPath),n.path):null}});if(r.columns===0)continue;let a=e.stubPath??e.stubTargetPath,o=null;if(e.stubPath)try{o=U(e.stubPath,`utf8`)}catch{i.unreadable.push(e.stubPath);continue}let c=Nu(o===null?e.fallbackTitle:Mu(o,e.fallbackTitle),r.table);n.has(`links`)&&(c=_u(c,{redirectCsv:s})),r.wide&&i.wideTables.push(a),o===null?(u.push({path:a,content:c}),i.stubsCreated+=1,i.transforms.tables+=1):c!==o&&(u.push({path:a,content:c}),i.transforms.tables+=1),t.removeCsv&&(f.push(e.csvPath),i.csvsRemoved+=1)}return i.filesChanged=new Set(u.map(e=>e.path)).size,{changes:u,assets:d,deletions:f,report:i}}function Ru(e){for(let t of e.assets)tr(qn(t.path),{recursive:!0}),cr(t.path,t.bytes);for(let t of e.changes)tr(qn(t.path),{recursive:!0}),cr(t.path,t.content,`utf8`);for(let t of e.deletions)try{G(t)}catch(e){if(e.code!==`ENOENT`)throw e}}const zu={images:`Inline base64 images extracted`,callouts:`Notion <aside> callouts converted`,frontmatter:`Row properties lifted to frontmatter`,tables:`Databases rendered as tables`,links:`Internal links decoded`},Bu=[`images`,`callouts`,`frontmatter`,`tables`,`links`];function Vu(e,t){let n=[];n.push(t.applied?`Applied Notion cleanup in ${t.dir}`:`Dry run — no changes written (${t.dir})`);for(let t of Bu)n.push(` ${zu[t]}: ${e.transforms[t]}`);return n.push(` Assets written: ${e.assetsExtracted}`),e.stubsCreated>0&&n.push(` Database pages created (CSVs without a stub): ${e.stubsCreated}`),e.csvsRemoved>0&&n.push(` CSV files removed: ${e.csvsRemoved}`),n.push(` Files changed: ${e.filesChanged}`),e.ambiguousTitleLinks>0&&n.push(` Ambiguous title links left as plain text: ${e.ambiguousTitleLinks}`),e.wideTables.length>0&&n.push(` Wide tables (>15 columns): ${e.wideTables.length}`),e.unreadable.length>0&&n.push(` Skipped unreadable files: ${e.unreadable.length}`),!t.applied&&e.filesChanged+e.assetsExtracted+e.csvsRemoved>0&&(n.push(``),n.push(`Re-run with --apply to write these changes.`)),n.join(`
77
- `)}function Hu(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function Uu(e){let t=new Set(Pu);return e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0).map(e=>{if(!t.has(e))throw Error(`Unknown transform "${e}". Valid transforms: ${Pu.join(`, `)}`);return e})}function Wu(e,t){let n=new Set(Pu);if(e&&(n=new Set(Uu(e))),t)for(let e of Uu(t))n.delete(e);return n}function Gu(){let e=new M(`migrate`).description(`Migrate content from other tools into Open Knowledge`);return e.command(`notion [dir]`).description(`Clean up a Notion "Markdown & CSV" export in place (dry-run unless --apply)`).option(`--apply`,`write changes to disk (default: dry-run preview)`).option(`--strip-base64`,`delete inline base64 images instead of extracting them to files`).option(`--remove-csv`,`delete each "_all.csv" once its table page exists (destructive)`).option(`--only <transforms>`,`run only these transforms (comma-separated: links,frontmatter,callouts,images,tables)`).option(`--skip <transforms>`,`skip these transforms (comma-separated)`).option(`--force`,`run even if the directory is not detected as a Notion export`).option(`--json`,`print a machine-readable JSON report`).action((e,t)=>{let n=V(e??process.cwd()),r;try{r=Wu(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=Lu(n,{selected:r,stripBase64:t.stripBase64??!1,removeCsv:t.removeCsv??!1,force:t.force??!1}),{report:a}=i;if(!a.isNotionExport&&!t.force){t.json?console.log(JSON.stringify({refused:!0,reason:`not-a-notion-export`,dir:n},null,2)):console.error(`Not a Notion export: ${n}\nNo id-suffixed pages, "_all.csv", or inline base64 images were found. Re-run with --force to override.`),process.exitCode=2;return}if(t.apply)try{Ru(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?Hu(a,{applied:t.apply??!1}):Vu(a,{applied:t.apply??!1,dir:n})),a.filesChanged===0&&a.assetsExtracted===0&&i.deletions.length===0?process.exitCode=1:t.apply&&(a.ambiguousTitleLinks>0||a.wideTables.length>0)&&(process.exitCode=3)}),e}function Ku(e=()=>Nn(In())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>de({lockDir:O(e)}).baseUrl,classifyName:(e,t)=>{let n=z(e,t);try{return W(n).isDirectory()?`folder`:`doc`}catch(e){let t=e?.code;return t!==`ENOENT`&&t!==`ENOTDIR`&&process.stderr.write(`[ok open] statSync failed for ${n} (${t??`unknown`}); treating as a doc\n`),`doc`}},openTarget:e=>{jn(`open`,[e])},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function qu(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function Ju(e){return e.error("No OpenKnowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function Yu(e,t,n,r){let i=`openknowledge://open?project=${encodeURIComponent(e)}&${t}=${encodeURIComponent(n)}`;r.openTarget(i)}function Xu(e,t,r){let i=V(t.project??process.cwd()),a=e.replace(/\/+$/,``);if(!a)return r.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(qu(a))return r.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!n.includes(e))return r.error(`Invalid --scope "${t.scope}": expected one of ${n.join(`, `)}.`),1;if(r.detectBundlePath())return Yu(i,`doc`,`__skill__/${e}/${a}`,r),r.log(`Opening skill ${a} (${e}) in the OpenKnowledge desktop app.`),0;let o=r.resolveBaseUrl(i);if(o){let t=`${o}/#/${he(e,a)}`;return r.openTarget(t),r.log(`Opening skill ${a} (${e}) in your browser: ${t}`),0}return Ju(r)}let o=/\/+$/.test(e)||r.classifyName(i,a)===`folder`,s=r.detectBundlePath();if(o){if(s)return Yu(i,`folder`,a,r),r.log(`Opening folder ${a} in the OpenKnowledge desktop app.`),0;let e=r.resolveBaseUrl(i);if(e){let t=`${e}/#/${fe(a)}`;return r.openTarget(t),r.log(`Opening folder ${a} in your browser: ${t}`),0}return Ju(r)}if(s)return Yu(i,`doc`,a,r),r.log(`Opening ${a} in the OpenKnowledge desktop app.`),0;let c=r.resolveBaseUrl(i);if(c){let e=`${c}/#/${me(a)}`;return r.openTarget(e),r.log(`Opening ${a} in your browser: ${e}`),0}return Ju(r)}function Zu(){return new M(`open`).description(`Open a doc, folder, or skill in the OK Desktop app (falls back to the browser UI). Docs and folders are auto-detected — no flag needed.`).argument(`<name>`,`Doc path (specs/foo/SPEC), folder path (specs/foo or specs/foo/), or a skill name with --skill`).option(`--skill`,`Open <name> as a skill in the skill editor`).option(`--scope <scope>`,`Skill scope when --skill is set: ${n.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=Xu(e,t,Ku())})}function Qu(e){return new M(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-Ba0S1iHw.mjs`),r=e(),i=process.cwd(),a=Ue(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function $u(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function ed(e,t,n=process.cwd()){let r=e.op??`sync`,i=Mt(O(n));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...h({kind:`cli`,runtimeVersion:jt})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}$u(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let a=At({baseDir:n});if(r===`sync`||r===`pull`){$u(e.json,{type:`step`,step:`pull`});let t=await a.pull();$u(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&($u(e.json,{type:`step`,step:`push`}),await a.push(),$u(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
77
+ `)}function Hu(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function Uu(e){let t=new Set(Pu);return e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0).map(e=>{if(!t.has(e))throw Error(`Unknown transform "${e}". Valid transforms: ${Pu.join(`, `)}`);return e})}function Wu(e,t){let n=new Set(Pu);if(e&&(n=new Set(Uu(e))),t)for(let e of Uu(t))n.delete(e);return n}function Gu(){let e=new M(`migrate`).description(`Migrate content from other tools into Open Knowledge`);return e.command(`notion [dir]`).description(`Clean up a Notion "Markdown & CSV" export in place (dry-run unless --apply)`).option(`--apply`,`write changes to disk (default: dry-run preview)`).option(`--strip-base64`,`delete inline base64 images instead of extracting them to files`).option(`--remove-csv`,`delete each "_all.csv" once its table page exists (destructive)`).option(`--only <transforms>`,`run only these transforms (comma-separated: links,frontmatter,callouts,images,tables)`).option(`--skip <transforms>`,`skip these transforms (comma-separated)`).option(`--force`,`run even if the directory is not detected as a Notion export`).option(`--json`,`print a machine-readable JSON report`).action((e,t)=>{let n=V(e??process.cwd()),r;try{r=Wu(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=Lu(n,{selected:r,stripBase64:t.stripBase64??!1,removeCsv:t.removeCsv??!1,force:t.force??!1}),{report:a}=i;if(!a.isNotionExport&&!t.force){t.json?console.log(JSON.stringify({refused:!0,reason:`not-a-notion-export`,dir:n},null,2)):console.error(`Not a Notion export: ${n}\nNo id-suffixed pages, "_all.csv", or inline base64 images were found. Re-run with --force to override.`),process.exitCode=2;return}if(t.apply)try{Ru(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?Hu(a,{applied:t.apply??!1}):Vu(a,{applied:t.apply??!1,dir:n})),a.filesChanged===0&&a.assetsExtracted===0&&i.deletions.length===0?process.exitCode=1:t.apply&&(a.ambiguousTitleLinks>0||a.wideTables.length>0)&&(process.exitCode=3)}),e}function Ku(e=()=>Nn(In())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>de({lockDir:O(e)}).baseUrl,classifyName:(e,t)=>{let n=z(e,t);try{return W(n).isDirectory()?`folder`:`doc`}catch(e){let t=e?.code;return t!==`ENOENT`&&t!==`ENOTDIR`&&process.stderr.write(`[ok open] statSync failed for ${n} (${t??`unknown`}); treating as a doc\n`),`doc`}},openTarget:e=>{jn(`open`,[e])},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function qu(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function Ju(e){return e.error("No OpenKnowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function Yu(e,t,n,r){let i=`openknowledge://open?project=${encodeURIComponent(e)}&${t}=${encodeURIComponent(n)}`;r.openTarget(i)}function Xu(e,t,r){let i=V(t.project??process.cwd()),a=e.replace(/\/+$/,``);if(!a)return r.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(qu(a))return r.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!n.includes(e))return r.error(`Invalid --scope "${t.scope}": expected one of ${n.join(`, `)}.`),1;if(r.detectBundlePath())return Yu(i,`doc`,`__skill__/${e}/${a}`,r),r.log(`Opening skill ${a} (${e}) in the OpenKnowledge desktop app.`),0;let o=r.resolveBaseUrl(i);if(o){let t=`${o}/#/${he(e,a)}`;return r.openTarget(t),r.log(`Opening skill ${a} (${e}) in your browser: ${t}`),0}return Ju(r)}let o=/\/+$/.test(e)||r.classifyName(i,a)===`folder`,s=r.detectBundlePath();if(o){if(s)return Yu(i,`folder`,a,r),r.log(`Opening folder ${a} in the OpenKnowledge desktop app.`),0;let e=r.resolveBaseUrl(i);if(e){let t=`${e}/#/${fe(a)}`;return r.openTarget(t),r.log(`Opening folder ${a} in your browser: ${t}`),0}return Ju(r)}if(s)return Yu(i,`doc`,a,r),r.log(`Opening ${a} in the OpenKnowledge desktop app.`),0;let c=r.resolveBaseUrl(i);if(c){let e=`${c}/#/${me(a)}`;return r.openTarget(e),r.log(`Opening ${a} in your browser: ${e}`),0}return Ju(r)}function Zu(){return new M(`open`).description(`Open a doc, folder, or skill in the OK Desktop app (falls back to the browser UI). Docs and folders are auto-detected — no flag needed.`).argument(`<name>`,`Doc path (specs/foo/SPEC), folder path (specs/foo or specs/foo/), or a skill name with --skill`).option(`--skill`,`Open <name> as a skill in the skill editor`).option(`--scope <scope>`,`Skill scope when --skill is set: ${n.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=Xu(e,t,Ku())})}function Qu(e){return new M(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-ChlChU-0.mjs`),r=e(),i=process.cwd(),a=Ue(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function $u(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function ed(e,t,n=process.cwd()){let r=e.op??`sync`,i=Mt(O(n));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...h({kind:`cli`,runtimeVersion:jt})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}$u(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let a=At({baseDir:n});if(r===`sync`||r===`pull`){$u(e.json,{type:`step`,step:`pull`});let t=await a.pull();$u(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&($u(e.json,{type:`step`,step:`push`}),await a.push(),$u(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
78
78
  `)),$u(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function td(e){return new M(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ed({json:t.json,op:`sync`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ sync failed: ${n}\n`),process.exit(1)}})}function nd(e){return new M(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ed({json:t.json,op:`pull`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ pull failed: ${n}\n`),process.exit(1)}})}function rd(e){return new M(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ed({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}function id(e){return typeof e==`string`&&ee.includes(e)}async function ad(e={}){let t=V(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!st[n])return{status:`failed`,message:`${I(`Error:`)} Unknown pack "${n}". Available: ${ee.join(`, `)}`,exitCode:1};let r;try{r=await le({projectDir:t,rootDir:e.root,packId:n,skipPrerequisite:e.dryRun===!0})}catch(e){return e instanceof Ye?{status:`prerequisite-missing`,message:`${I(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${I(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0&&!r.packSkills?.some(e=>e.pending)){let e=st[n].name;return{status:`no-op`,message:`${F(`Your ${e} pack is already seeded.`)}\n${P(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun){let e=ce(st[n]);return{status:`dry-run`,message:`${R(`Reference this pack for inspiration (dry-run — no changes made):`)}\n\n${e}\n\n${R(`Plan:`)}\n\n${sd(r,t)}`,plan:r,exitCode:0}}if(!e.yes&&!await cd(`${R(`Plan:`)}\n\n${sd(r,t)}\n\n${R(`Apply?`)} ${P(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:P(`Cancelled.`),plan:r,exitCode:0};let i=await E(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${I(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${L(`Applied`)} ${i.applied} entries, ${L(String(i.errors.length))} error(s):`,...e].join(`
79
79
  `),plan:r,exitCode:1}}let a=st[n].name,o=i.packSkillsInstalled.length>0?`\n${P(`Installed the ${a} skills for: ${i.packSkillsInstalled.join(`, `)}`)}`:``;return{status:`applied`,message:`${F(`✓ Seeded ${a}`)} ${P(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}`,plan:r,exitCode:0}}function od(){let e=[R(`Available packs:`)];for(let t of ee){let n=st[t];e.push(` ${F(t)} ${P(`—`)} ${n.name}: ${n.description}`)}return e.join(`
80
80
  `)}function sd(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(R(`Folders to create:`));for(let e of r)n.push(` ${F(`+`)} ${N(B(t,V(t,e.path))||e.path)}${P(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(R(`Files to create:`));for(let e of i)n.push(` ${F(`+`)} ${N(B(t,V(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(P(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${P(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(L(`Warnings:`));for(let t of e.warnings)n.push(` ${L(`!`)} ${t}`)}return n.join(`
@@ -83,7 +83,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
83
83
  `);return}if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:c.kind})}\n`);return}process.stderr.write(`✗ share name-check failed: ${c.kind}\n`),process.exit(1)}function fd(e){return new M(`name-check`).description(`Check if owner/name is available on GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await dd(t,await e())})}async function pd(e){try{let t=[],n=await e.users.getAuthenticated();t.push({login:n.data.login,kind:`user`,avatarUrl:n.data.avatar_url});for await(let n of e.paginate.iterator(e.orgs.listMembershipsForAuthenticatedUser,{state:`active`,per_page:100}))for(let e of n.data)(e.permissions?.can_create_repository===!0||e.role===`admin`)&&t.push({login:e.organization.login,kind:`org`,avatarUrl:e.organization.avatar_url??void 0});return{kind:`ok`,owners:t}}catch(e){return e.status===401?{kind:`auth-required`}:{kind:`network`}}}async function md(e,t){let{host:n,json:r}=e;K(n);let i=await ua(n,t);if(i==null){if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=await pd(new ra({auth:i,...a?{baseUrl:a}:{}}));if(o.kind===`ok`){if(r)process.stdout.write(`${JSON.stringify({type:`owners`,owners:o.owners})}\n`);else for(let e of o.owners)process.stdout.write(`${e.kind}\t${e.login}\n`);return}if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:o.kind})}\n`);return}process.stderr.write(`✗ share owners failed: ${o.kind}\n`),process.exit(1)}function hd(e){return new M(`owners`).description(`List GitHub owners eligible to host a new repository`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await md(t,await e())})}function gd(e){let t=e,n=t.status,r=t.response?.data,i=t.response?.headers,a=`${r?.message??r?.errors?.map(e=>e.message??``).join(`
84
84
  `)??``}\n${t.message??``}`.toLowerCase();return n===401?`auth-required`:n===403?i?.[`x-github-sso`]||a.includes(`saml`)||a.includes(`sso`)?`saml-sso`:`network`:n===422&&(r?.errors?.some(e=>e.field===`name`)||a.includes(`already exists`)||a.includes(`name already exists`))?`name-conflict`:`network`}async function _d(e){let{octokit:t,ownerLogin:n,ownerKind:r,name:i,visibility:a,description:o}=e,s=a===`private`;if(r===`user`){let{data:e}=await t.repos.createForAuthenticatedUser({name:i,private:s,...o?{description:o}:{}});return{cloneUrl:e.clone_url,defaultBranch:e.default_branch??`main`}}let{data:c}=await t.repos.createInOrg({org:n,name:i,visibility:a,...o?{description:o}:{}});return{cloneUrl:c.clone_url,defaultBranch:c.default_branch??`main`}}async function vd(e,t,n){try{let{data:r}=await e.repos.get({owner:t,repo:n});return{cloneUrl:r.clone_url,defaultBranch:r.default_branch??`main`}}catch{return null}}async function yd(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function bd(e){return At(Fa(e,[])).env(ka())}function xd(e,t){if(!e.startsWith(`https://`))return e;try{if(new URL(e).hostname!==`github.com`)return e}catch{return e}return e.replace(`https://`,`https://x-access-token:${t}@`)}const Sd={ensureOkScaffold:e=>{Pe(e)},gitFactory:bd};async function Cd(e){let t={...Sd,...e.deps},n=V(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await yd(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:gd(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!H(z(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await _d({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(gd(t)===`name-conflict`){let t=await vd(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:gd(t)}}try{await i.addRemote(`origin`,a.cloneUrl)}catch(e){if(!String(e.message??``).toLowerCase().includes(`remote origin already exists`))return{kind:`error`,code:`push-failed`}}let o=!1;try{await i.raw([`rev-parse`,`--verify`,`HEAD`])}catch{o=!0}if(o)try{await i.add(`.`),await i.raw([`commit`,`--allow-empty`,`-m`,`Initial commit`])}catch{return{kind:`error`,code:`init-failed`}}let s=xd(a.cloneUrl,e.token);try{await i.raw([`push`,s,`HEAD:refs/heads/${a.defaultBranch}`])}catch(e){let t=String(e.message??``).toLowerCase();return t.includes(`saml`)||t.includes(`sso`)?{kind:`error`,code:`saml-sso`}:{kind:`error`,code:`push-failed`}}try{await i.raw([`update-ref`,`refs/remotes/origin/${a.defaultBranch}`,`HEAD`])}catch{}return{kind:`ok`,value:{ownerLogin:e.body.owner,repoName:e.body.name,cloneUrl:a.cloneUrl,defaultBranch:a.defaultBranch}}}function wd(e,t){if(!e){t.kind===`ok`?process.stdout.write(`✓ Published ${t.value.cloneUrl}\n`):(process.stderr.write(`✗ share publish failed: ${t.code}\n`),process.exit(1));return}if(t.kind===`ok`){process.stdout.write(`${JSON.stringify({type:`publish`,...t.value})}\n`);return}process.stdout.write(`${JSON.stringify({type:`error`,code:t.code})}\n`)}async function Td(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;K(n);let l=await ua(n,t);if(l==null){wd(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new ra({auth:l,...u?{baseUrl:u}:{}});try{Un(`git config user.email`,D({cwd:s,stdio:`ignore`}))}catch{process.env.GIT_AUTHOR_NAME??=`OpenKnowledge`,process.env.GIT_AUTHOR_EMAIL??=`noreply@inkeep.com`,process.env.GIT_COMMITTER_NAME??=`OpenKnowledge`,process.env.GIT_COMMITTER_EMAIL??=`noreply@inkeep.com`}wd(c,await Cd({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function Ed(e){return new M(`publish`).description(`Publish a no-remote project to GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).requiredOption(`--visibility <visibility>`,`public or private`).option(`--description <description>`,`Repository description`).requiredOption(`--project-dir <projectDir>`,`Path to the project on disk`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{t.visibility!==`public`&&t.visibility!==`private`&&(process.stderr.write(`✗ visibility must be 'public' or 'private'
85
85
  `),process.exit(1)),await Td(t,await e())})}function Dd(){let e=new M(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let t=()=>nn();return e.addCommand(hd(t)),e.addCommand(fd(t)),e.addCommand(Ed(t)),e}function Od(){return new M(`share`).description(`Switch this project to shared mode (commit OK config alongside content)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=_n(t),r=pn(t,wn(t));if(r.kind===`no-exclude`){kd(e.json,t,r.reason);return}let i=_n(t);if(e.json){let e={type:`sharing-share`,projectRoot:t,mode:i,removed:r.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n===`shared`){process.stderr.write(`${N(`Sharing mode is already`)} ${R(`shared`)} ${N(`— nothing to do.`)}\n`);return}process.stderr.write(`${F(`✓`)} ${R(`Sharing mode set to`)} ${F(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${R(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function kd(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-share`,projectRoot:t,mode:`no-git`,removed:[],reason:n})}\n`);return}process.stderr.write(`${L({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Ad(){return new M(`status`).description(`Print the current sharing mode and the OK paths in .git/info/exclude`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=_n(t),r=yn(t),i=[...un(t)],a=gn(t,wn(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,skillsShared:r,excluded:i,trackedUpstream:a};process.stdout.write(`${JSON.stringify(e)}\n`);return}let o=[];if(o.push(`OpenKnowledge sharing mode: ${jd(n)}`),r&&o.push(` ${R(`.ok/skills`)} is committable (carved out); the rest of .ok/ stays local.`),o.push(``),o.push(`Excluded from git via ${R(`.git/info/exclude`)}:`),i.length===0)o.push(` (none)`);else for(let e of i)o.push(` ${e}`);if(o.push(``),o.push(`Other OK paths exist but are tracked upstream:`),a.length===0)o.push(` (none)`);else for(let e of a)o.push(` ${e}`);o.push(``),o.push(`Toggle with: ${N(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),r&&o.push(` (that shares the whole project; to undo only the skills carve-out, use the desktop app: Settings > Config sharing)`),process.stdout.write(`${o.join(`
86
- `)}\n`)})}function jd(e){switch(e){case`shared`:return F(`shared`);case`local-only`:return F(`local-only`);case`no-git`:return L(`no-git (not a git repository)`)}}function Md(){return new M(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=vn(t,wn(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){Nd(e.json,t,n.reason);return}let r=_n(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${R(`Sharing mode is already`)} ${F(`local-only`)} ${R(`— nothing to do.`)}\n`);return}process.stderr.write(`${F(`✓`)} ${R(`Sharing mode set to`)} ${F(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${R(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function Nd(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-unshare`,projectRoot:t,mode:`no-git`,appended:[],alreadyPresent:[],reason:n})}\n`);return}process.stderr.write(`${L({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Pd(){let e=new M(`config-sharing`);return e.description(`Manage OpenKnowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(Od()),e.addCommand(Md()),e.addCommand(Ad()),e}const Fd=new Set([`--cwd`,`--log-level`]);function Id(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){Fd.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function Ld(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function Rd(e){return/\.(md|mdx)$/i.test(e)}function zd(e,t){if(Rd(t))return!0;try{return W(e).isFile()}catch(t){let n=t?.code;return n!==`ENOENT`&&n!==`ENOTDIR`&&process.stderr.write(`[ok] statSync failed for ${e} (${n??`unknown`}); treating as non-fileish\n`),!1}}function Bd(e=()=>Nn(In())){return{prepare:xe,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{jn(`open`,[e])},runProjectOpen:(e,t)=>Xu(e,{project:t},Ku()),runBrowserOpen:e=>Ud(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Vd(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof Be||e instanceof Qe||e instanceof Xe)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the OpenKnowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function Hd(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[V(e,`public`),V(e,`../../app/dist`),V(e,`../../../app/dist`)].find(e=>H(e))}async function Ud(e){let{createEphemeralProjectDir:t}=await import(`./src-Dmoupsem.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-BRdG0jJw.mjs`),{openBrowser:a}=await import(`./open-browser-BiK9JzSf.mjs`),o=Hd();o||(process.stderr.write("OpenKnowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let s=t(e.contentDir),c=!1,l,u=async()=>{if(!c){c=!0;try{await l?.destroy()}catch{}try{await fr(s,{recursive:!0,force:!0})}catch{}}},d=()=>{u().then(()=>process.exit(0))};process.once(`SIGINT`,d),process.once(`SIGTERM`,d);let{config:f}=n(s),p=i({},process.env);try{l=await r({config:f,cwd:s,host:p,port:0,projectDir:s,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:o,idleThresholdMs:6e5})}catch(t){await u(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let m=`http://${p}:${l.port}/#/${me(e.docName)}`;process.env.OK_SINGLE_FILE_NO_OPEN===`1`?process.stdout.write(`Serving ${e.singleDocRelPath} (headless) at: ${m}\n`):(process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
86
+ `)}\n`)})}function jd(e){switch(e){case`shared`:return F(`shared`);case`local-only`:return F(`local-only`);case`no-git`:return L(`no-git (not a git repository)`)}}function Md(){return new M(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=vn(t,wn(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){Nd(e.json,t,n.reason);return}let r=_n(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${R(`Sharing mode is already`)} ${F(`local-only`)} ${R(`— nothing to do.`)}\n`);return}process.stderr.write(`${F(`✓`)} ${R(`Sharing mode set to`)} ${F(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${R(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function Nd(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-unshare`,projectRoot:t,mode:`no-git`,appended:[],alreadyPresent:[],reason:n})}\n`);return}process.stderr.write(`${L({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Pd(){let e=new M(`config-sharing`);return e.description(`Manage OpenKnowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(Od()),e.addCommand(Md()),e.addCommand(Ad()),e}const Fd=new Set([`--cwd`,`--log-level`]);function Id(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){Fd.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function Ld(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function Rd(e){return/\.(md|mdx)$/i.test(e)}function zd(e,t){if(Rd(t))return!0;try{return W(e).isFile()}catch(t){let n=t?.code;return n!==`ENOENT`&&n!==`ENOTDIR`&&process.stderr.write(`[ok] statSync failed for ${e} (${n??`unknown`}); treating as non-fileish\n`),!1}}function Bd(e=()=>Nn(In())){return{prepare:xe,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{jn(`open`,[e])},runProjectOpen:(e,t)=>Xu(e,{project:t},Ku()),runBrowserOpen:e=>Ud(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Vd(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof Be||e instanceof Qe||e instanceof Xe)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the OpenKnowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function Hd(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[V(e,`public`),V(e,`../../app/dist`),V(e,`../../../app/dist`)].find(e=>H(e))}async function Ud(e){let{createEphemeralProjectDir:t}=await import(`./src-Dmoupsem.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-D08mufE-.mjs`),{openBrowser:a}=await import(`./open-browser-BiK9JzSf.mjs`),o=Hd();o||(process.stderr.write("OpenKnowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let s=t(e.contentDir),c=!1,l,u=async()=>{if(!c){c=!0;try{await l?.destroy()}catch{}try{await fr(s,{recursive:!0,force:!0})}catch{}}},d=()=>{u().then(()=>process.exit(0))};process.once(`SIGINT`,d),process.once(`SIGTERM`,d);let{config:f}=n(s),p=i({},process.env);try{l=await r({config:f,cwd:s,host:p,port:0,projectDir:s,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:o,idleThresholdMs:6e5})}catch(t){await u(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let m=`http://${p}:${l.port}/#/${me(e.docName)}`;process.env.OK_SINGLE_FILE_NO_OPEN===`1`?process.stdout.write(`Serving ${e.singleDocRelPath} (headless) at: ${m}\n`):(process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
87
87
  `),a(m)),await new Promise(()=>{})}function Wd(){let e=new M(`skills`).description(`Manage Open Knowledge skills for this project.`);return e.command(`installed`).description(`List every skill installed across all your agents (read-only).`).option(`--json`,`Emit the raw enumeration as JSON.`).action(e=>{let t=V(process.cwd()),n=tt(nt(t)?.rootPath??t),r=ye({projectDir:n}),i={...r,skills:r.skills.filter(e=>S(e.provenance,n))};if(e.json){process.stdout.write(`${JSON.stringify(i,null,2)}\n`);return}if(i.skills.length===0){process.stdout.write(`${P(`No installed skills found across any agent.`)}\n`);return}process.stdout.write(`${R(`${i.skills.length} installed skill(s):`)}\n`);for(let e of i.skills){let t=e.provenance.version?P(` v${e.provenance.version}`):``,n=[e.inert.commands&&`commands`,e.inert.hooks&&`hooks`,e.inert.mcp&&`mcp`].filter(Boolean),r=n.length>0?P(` [${n.join(`, `)}]`):``;process.stdout.write(` ${F(e.name)}${t} ${P(e.sourceHarnesses.join(`, `))}${r}\n`)}process.stdout.write(`\n${R(`${i.packs.length} pack(s):`)}\n`);for(let e of i.packs)process.stdout.write(` ${N(e.name)} ${P(`v${e.version}`)} — ${e.skills.length} skill(s)\n`)}),e.command(`import <source>`).description(`Import a skill into this project as versioned content (github owner/repo, a git URL, or a local path).`).option(`--skill <name>`,`Pick one skill from a multi-skill source.`).option(`--scope <scope>`,`project (default) or global.`,`project`).action(async(e,t)=>{let n=en(O(process.cwd()),`server`);if(n.status!==`alive`){process.stderr.write(`${I(`Error:`)} no running Open Knowledge server for this project. Start it with ${R(`ok start`)} and retry.\n`),process.exitCode=1;return}let r;try{r=await fetch(`http://127.0.0.1:${n.lock.port}/api/skill/import`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({source:e,...t.skill?{skill:t.skill}:{},scope:t.scope===`global`?`global`:`project`})})}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`${I(`Error:`)} could not reach the server: ${t}\n`),process.exitCode=1;return}let i=await r.json().catch(()=>({}));if(!r.ok){let e=i.detail??i.title??`HTTP ${r.status}`;process.stderr.write(`${I(`Import failed:`)} ${e}\n`),process.exitCode=1;return}let a=i.name;if(i.alreadyImported){process.stdout.write(`${N(`Already imported:`)} ${R(a)} (identical content).\n`);return}let o=i.provenance??{},s=i.collisionRenamedFrom;process.stdout.write(`${F(`Imported`)} ${R(a)}${s?P(` (renamed from ${s} — name was taken)`):``} from ${P(o.source??e)}${o.publisher?P(` · ${o.publisher}`):``}.\n${P(`Saved as versioned content in this project's skill home. Scripts shown, never run. Use the skill's install menu (or the install MCP verb) to add it to your other editors.`)}\n`);for(let e of i.warnings??[])process.stdout.write(` ${P(`! ${e}`)}\n`)}),e}function Gd(e,t){return{server:Kd(`server`,e),ui:Kd(`ui`,t)}}function Kd(e,t){switch(t.status){case`missing`:return{name:e,state:`missing`,alive:!1};case`corrupt`:return{name:e,state:`corrupt`,alive:!1};case`foreign-host`:return{name:e,state:`foreign-host`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:`unknown`};case`dead-pid`:return{name:e,state:`dead-pid`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!1};case`alive`:return{name:e,state:`alive`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!0}}}function qd(e){return`${Jd(e.server)}\n${Jd(e.ui)}`}function Jd(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function Yd(e){let t=e.inspect??(t=>en(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Gd(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(qd(r)),r}function Xd(e){return new M(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),Yd({lockDir:O(process.cwd()),json:t.json===!0})})}function Zd(e,t,n,r,i){let o=`urn:uuid:${hr()}`;if(e.headersSent||e.writableEnded||e.destroyed){console.error(`[ok ui] emitProblem called after headers sent — suppressed`,{type:n,status:t,instance:o});return}let s={type:n,title:r,status:t,instance:o,...i===void 0?{}:{detail:i}},c=a.safeParse(s);if(!c.success){console.error(`[ok ui] emitProblem produced an invalid ProblemDetails body:`,{issues:c.error.issues,originalStatus:t,body:s}),e.writeHead(500,{"Content-Type":`application/problem+json`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-store`}),e.end(JSON.stringify({type:`urn:ok:error:internal-server-error`,title:`Internal server error.`,status:500,instance:o}));return}e.writeHead(t,{"Content-Type":`application/problem+json`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-store`}),e.end(JSON.stringify(s))}const Qd=1e4;function $d(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!Ae(n))return Zd(t,403,`urn:ok:error:loopback-required`,`Request must originate from a loopback address.`),!0;if(!Ne(e.headers.host))return Zd(t,403,`urn:ok:error:host-not-allowed`,`Host header is not in the loopback allowlist.`),!0;let r=e.headers.origin;return r!==void 0&&!$e(r)?(Zd(t,403,`urn:ok:error:invalid-origin`,`Origin header is not in the loopback allowlist.`),!0):!1}const ef=3e4;function tf(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!Ae(n)||!Ne(e.headers.host))return t.destroy(),!0;let r=e.headers.origin;return typeof r==`string`&&!$e(r)?(t.destroy(),!0):!1}function nf(e,t,n,r,i,a){a.add(t),t.once(`close`,()=>a.delete(t));let o=xr({host:r,port:i,timeout:Qd});a.add(o),o.once(`close`,()=>a.delete(o));let s=!1,c=n=>{if(!s){if(s=!0,n!==void 0){let t=n.err;console.warn(JSON.stringify({event:n.event,upstreamHost:r,upstreamPort:i,url:e.url,code:t instanceof Error?t.code:void 0,message:t instanceof Error?t.message:void 0}))}try{o.destroy()}catch{}try{t.destroy()}catch{}}};o.once(`connect`,()=>{o.setTimeout(0);let a=[`${e.method??`GET`} ${e.url??`/`} HTTP/1.1`,`host: ${r}:${i}`];for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()!==`host`&&n!==void 0)if(Array.isArray(n))for(let e of n)a.push(`${t}: ${e}`);else a.push(`${t}: ${n}`);try{o.write(`${a.join(`\r
88
88
  `)}\r\n\r\n`),n.length>0&&o.write(n)}catch(e){c({event:`proxy-upgrade-handshake-write-failed`,err:e});return}o.on(`data`,e=>{t.writable&&t.write(e)}),t.on(`data`,e=>{o.writable&&o.write(e)})}),o.once(`timeout`,()=>{c({event:`proxy-upgrade-upstream-connect-timeout`})}),o.on(`error`,e=>c({event:`proxy-upgrade-upstream-error`,err:e})),t.on(`error`,e=>c({event:`proxy-upgrade-client-error`,err:e})),o.once(`close`,()=>c()),t.once(`close`,()=>c())}const rf=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function af(e){let t=e.upstreamTimeoutMs??Qd,n=new Set,r=vr((n,r)=>{$d(n,r)||sf(n,r,e.upstreamHost,e.upstreamPort,t)});r.on(`upgrade`,(t,r,i)=>{tf(t,r)||nf(t,r,i,e.upstreamHost,e.upstreamPort,n)}),await new Promise((t,n)=>{let i=e=>n(e);r.once(`error`,i),r.listen(e.listenPort,e.host,()=>{r.off(`error`,i),t()})});let i=r.address();return{httpServer:r,port:typeof i==`object`&&i?i.port:e.listenPort,close:()=>new Promise(e=>{for(let e of n)try{e.destroy()}catch{}n.clear(),r.close(()=>e()),r.closeIdleConnections()})}}function of(e,t,n){sf(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Qd)}function sf(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of rf)delete a[e];e.setTimeout(ef,()=>{if(t.headersSent)try{t.end()}catch{}else try{Zd(t,408,`urn:ok:error:request-timeout`,`Proxy request exceeded the per-request deadline.`,`Slow-loris-class: client did not finish within ${ef/1e3}s.`)}catch{}try{e.socket?.destroy()}catch{}});let o=yr({host:n,port:r,method:e.method,path:e.url,headers:{...a,host:`${n}:${r}`}},e=>{let n={...e.headers};for(let e of rf)delete n[e];t.writeHead(e.statusCode??502,n),e.pipe(t),e.once(`error`,()=>{try{t.end()}catch{}})});i>0&&o.setTimeout(i,()=>{if(!t.headersSent)Zd(t,504,`urn:ok:error:gateway-timeout`,`Upstream did not respond before the gateway deadline.`,`Upstream timeout: ${i/1e3}s elapsed without a response.`);else try{t.end()}catch{}o.destroy()}),o.on(`error`,()=>{if(!t.headersSent)Zd(t,502,`urn:ok:error:collab-server-not-running`,`Collab server is unreachable.`,`Upstream connection failed or dropped before a response was received.`);else try{t.end()}catch{}}),e.on(`error`,()=>{o.destroy()}),e.pipe(o)}const cf=39847;async function lf(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function uf(e){let{existsSync:t}=await import(`node:fs`),{createServer:n}=await import(`node:http`),{resolve:r}=await import(`node:path`),{acquireUiLock:i,createAssetServeMiddleware:a,createContentFilter:o,readServerLock:s,releaseUiLock:c,updateUiLockPort:l}=await import(`./src-Dmoupsem.mjs`),{default:u}=await import(`./build-DcqN8tua.mjs`),{resolveContentDir:d,resolveLockDir:f}=await import(`./src-Dmoupsem.mjs`),p=d(e.config,e.cwd),m=f(e.cwd);i(m,{port:0,worktreeRoot:e.cwd});let h=import.meta.dirname??new URL(`.`,import.meta.url).pathname,g=[r(h,`public`),r(h,`../../app/dist`),r(h,`../../../app/dist`)],_=e.assetDir??g.find(e=>t(e)),v=_?u(_,{single:!0,gzip:!0,etag:!0,dev:!0,extensions:[]}):null,y=t(p)?a({contentFilter:o({projectDir:e.cwd,contentDir:p}),contentSirv:u(p,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:Et,assetExtensions:ft,blocklistExtensions:ut}):null,b=e.port,S=null,w=(e,t)=>{let n=e.url?.split(`?`)[0];if((n===`/`||n===``)&&(e.url=`/index.html`),!(n?.startsWith(`/api/`)&&$d(e,t))){if(n===`/api/config`&&(e.method===`GET`||e.method===`HEAD`)){S?.();let n=s(m),r=e.headers.host??`localhost:${b}`,i=n&&n.port>0?`ws://${r}/collab`:null,a=JSON.stringify({collabUrl:i,previewUrl:null,port:b});t.setHeader(`Content-Type`,`application/json`),t.setHeader(`Cache-Control`,`no-store`),t.setHeader(`X-Content-Type-Options`,`nosniff`),t.statusCode=200,e.method===`HEAD`?t.end():t.end(a);return}if(n?.startsWith(`/api/`)){S?.();let r=s(m);if(!r||r.port<=0){Zd(t,503,`urn:ok:error:collab-server-not-running`,"Collab server not running. Start `ok start` or run `ok status`.",`Path: ${n}`);return}of(e,t,{upstreamHost:C,upstreamPort:r.port});return}if(v&&n?.startsWith(`/assets/`)){v(e,t,()=>{y?y(e,t,()=>df(t)):df(t)});return}if(y){y(e,t,()=>{v?v(e,t):df(t)});return}if(v){v(e,t);return}df(t)}},T=new Set,ee=(e,t,n)=>{if(tf(e,t))return;let r=e.url?.split(`?`)[0]??``;if(r!==`/collab`&&!r.startsWith(`/collab/`)){t.destroy();return}let i=s(m);if(!i||i.port<=0){console.warn(JSON.stringify({event:`ok-ui-upgrade-no-collab-lock`,url:r,reason:"server.lock missing or port unbound — is `ok start` running?"})),t.destroy();return}nf(e,t,n,C,i.port,T)},te=()=>{for(let e of T)try{e.destroy()}catch{}T.clear()},ne=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],re=[],ie=e.port,ae=e=>e instanceof Error&&e.code===`EADDRINUSE`,oe=async()=>{await Promise.all(re.splice(0).map(e=>new Promise(t=>{try{e.close(()=>t())}catch{t()}})))},se=async e=>{ie=e;for(let e of ne){let t=n(w);t.on(`upgrade`,ee),re.push(t),await new Promise((n,r)=>{let i=e=>r(e);t.once(`error`,i),t.listen(ie,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(ie=e.port),n()})})}};try{try{await se(e.port)}catch(t){if(e.fallbackToKernel===!0&&ae(t))await oe(),await se(0);else throw t}}catch(e){await oe();try{c(m)}catch{}throw e}let ce=ie;b=ce,l(m,ce);let le=e.scheduler??x,ue=e.safetyNetMs??432e5,E=null,de=!1,D=!1,fe=()=>{de||(de=!0,E!==null&&(le.clearTimeout(E),E=null))},pe=()=>{if(fe(),!D){D=!0;try{c(m)}catch{}}},me=()=>{de||ue<=0||(E!==null&&(le.clearTimeout(E),E=null),E=le.setTimeout(()=>{E=null,console.warn(`[ui] safety-net (${ue}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}te();for(let e of re)try{e.close()}catch{}pe()},ue))},he=()=>{de||ue<=0||me()};return S=he,me(),{httpServers:re,port:ce,release:pe,detachSafetyNet:fe,nudgeSafetyNet:he,drainUpgradeSockets:te}}function df(e){e.headersSent||e.writableEnded||e.destroyed||(e.setHeader(`X-Content-Type-Options`,`nosniff`),e.setHeader(`Cache-Control`,`no-store`),e.statusCode=404,e.end())}function ff(e,t){if(e!==void 0){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<0||t>65535)throw Error(`Invalid --port value '${e}'`);return{port:t,fallbackToKernel:!1}}if(t!==void 0&&t!==``){let e=Number.parseInt(t,10);if(Number.isNaN(e)||e<0||e>65535)throw Error(`Invalid PORT env value '${t}'`);return{port:e,fallbackToKernel:!1}}return{port:cf,fallbackToKernel:!0}}async function pf(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./src-Dmoupsem.mjs`);return t(e.lockDir)}),n=await t();if(!n)throw Error(`UI lock collision reported but the lock disappeared before handling — retry acquiring.`);if(n.port===e.requestedPort&&n.port>0)return{mode:`already-running`,port:n.port};let r=n.port;if(r===0){let n=Date.now()+(e.pollDeadlineMs??2e3),i=e.pollIntervalMs??100;for(;Date.now()<n;){await new Promise(e=>{setTimeout(e,i)});let e=await t();if(e&&e.port>0){r=e.port;break}}if(r===0)throw Error("UI did not bind within 2s; run `ok clean`");if(r===e.requestedPort)return{mode:`already-running`,port:r}}return{mode:`proxy`,handle:await af({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function mf(e){return new M(`ui`).description(`Serve the OpenKnowledge React editor UI`).option(`-p, --port <port>`,`UI port (default: $PORT env or ${cf}, kernel-allocated fallback if busy)`).option(`-H, --host <host>`,"UI host. Default: two-socket loopback bind (`[::1]` + `127.0.0.1`) so cross-family collisions fail loud. Pass an explicit host (e.g. `127.0.0.1`, `0.0.0.0`) to bind a single socket on that host.").action(async t=>{let{dim:n}=await import(`./colors-MGDi6UGf.mjs`),{UiLockCollisionError:r}=await import(`./src-Dmoupsem.mjs`),{resolveLockDir:i}=await import(`./src-Dmoupsem.mjs`),a=e(),o=t.host,s;try{s=ff(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}let c=s.port;try{let e=await uf({config:a,cwd:process.cwd(),port:c,fallbackToKernel:s.fallbackToKernel,host:o}),t=o===void 0||o===`::`||o===`0.0.0.0`?`localhost`:o;console.log(`${n(`[ui]`)} listening on http://${t}:${e.port}`);let r=!1,i=t=>{if(r)return;r=!0,console.log(n(`\n[ui] Shutting down (${t})`)),e.detachSafetyNet();let i=()=>{try{e.release()}finally{process.exit(process.exitCode??0)}};e.drainUpgradeSockets(),lf(e.httpServers).then(i,i),setTimeout(i,2e3).unref()};process.once(`SIGINT`,()=>i(`SIGINT`)),process.once(`SIGTERM`,()=>i(`SIGTERM`));return}catch(e){if(!(e instanceof r))throw e;let t=i(process.cwd()),a=o??`localhost`,s;try{s=await pf({requestedPort:c,host:a,lockDir:t})}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}if(s.mode===`already-running`){if(console.log(`UI already running at http://${a}:${s.port}`),hf(process)){await new Promise(e=>{let t=t=>{console.log(n(`\n[ui-keepalive] Shutting down (${t})`)),e()};process.once(`SIGINT`,()=>t(`SIGINT`)),process.once(`SIGTERM`,()=>t(`SIGTERM`))});return}process.exit(0)}console.log(`UI running at http://${a}:${s.upstreamPort}; acting as HTTP proxy on port ${s.handle.port}`);let l=!1,u=e=>{l||(l=!0,console.log(n(`\n[ui-proxy] Shutting down (${e})`)),s.handle.close().finally(()=>process.exit(process.exitCode??0)),setTimeout(()=>process.exit(process.exitCode??0),2e3).unref())};process.once(`SIGINT`,()=>u(`SIGINT`)),process.once(`SIGTERM`,()=>u(`SIGTERM`))}})}function hf(e){let t=e.stdout.isTTY===!0,n=typeof e.env.PORT==`string`&&e.env.PORT!==``;return!t||n}function gf(e){if(e.yes===!0||e.json===!0)return!1;let t=e.stdinIsTTY??process.stdin.isTTY,n=e.stdoutIsTTY??process.stdout.isTTY;return t===!0&&n===!0}async function _f(e,t){let n=br({input:e.input,output:e.output});try{return(await n.question(t)).trim()}finally{n.close()}}async function vf(e={}){let t={input:e.input??process.stdin,output:e.output??process.stderr};t.output.write(P(`
89
89
  What you share is sent to the OpenKnowledge team.
@@ -0,0 +1,2 @@
1
+ import"./src-C9yhZBbO.mjs";var e=`0.46.0-beta.16`;const t=`config.yml`,n=e;export{n,t};
2
+ //# sourceMappingURL=constants-BMyLpSJ8.mjs.map
package/dist/index.d.mts CHANGED
@@ -3567,6 +3567,22 @@ interface EditorMcpTarget {
3567
3567
  /** Project-local Agent Skill entrypoint, when the editor has a known skill surface. */
3568
3568
  projectSkillPath?: (cwd: string) => string;
3569
3569
  }
3570
+ /**
3571
+ * Human-readable locator for an editor's `open-knowledge` entry within its
3572
+ * config file — `[mcp_servers.open-knowledge]` for TOML, the dotted key path
3573
+ * (`mcpServers.open-knowledge`, or `mcp.servers.open-knowledge` when nested)
3574
+ * for JSON/YAML. Pure projection of the target's format + key shape; used as a
3575
+ * disclosure aid in Settings → AI tools and the first-launch consent dialog.
3576
+ */
3577
+ declare function editorEntryLocator(target: EditorMcpTarget): string;
3578
+ /**
3579
+ * Display-form user-global MCP config path for an editor: the absolute path
3580
+ * with the home prefix collapsed to `~`, or `null` when the editor has no
3581
+ * user-global surface on this platform (its `configPath()` throws — Claude
3582
+ * Desktop off-macOS, Pi everywhere). Same disclosure aid as
3583
+ * {@link editorEntryLocator}.
3584
+ */
3585
+ declare function editorConfigPathDisplay(target: EditorMcpTarget, home: string): string | null;
3570
3586
  declare const EDITOR_TARGETS: Record<EditorId, EditorMcpTarget>;
3571
3587
  //#endregion
3572
3588
  //#region src/commands/acp-harness-probe.d.ts
@@ -4762,5 +4778,5 @@ interface ReportBundleResult {
4762
4778
  */
4763
4779
  declare function collectReportBundle(opts: CollectReportBundleOptions): Promise<ReportBundleResult>;
4764
4780
  //#endregion
4765
- export { ALL_EDITOR_IDS, type BundleExtraFile, type BundleLogger, type CollectReportBundleOptions, EDITOR_LABELS, EDITOR_TARGETS, type EditorId, type EditorMcpResult, type EditorMcpTarget, type ExcludeWriteResult, type ExpectedShareRepo, type GhDetectResult, HOSTS_WITH_USER_SKILL_DIR, type IntegrationWriteOutcome, LAUNCH_CONFIG_NAME, type LoadConfigResult, type McpConfigDeclineEvent, type McpConfigDeclineScope, type McpConfigMigrateEvent, type McpConfigMigrateScope, type McpDeclineReason, type McpEntryClassification, type McpInstallOptions, type McpRemoveOutcome, type OwnManagedMcpEntryHit, PATH_SHIM_BEGIN, PATH_SHIM_BLOCK_RE, PATH_SHIM_END, type ParsedGitHubBlobUrl, type ParsedGitHubShareTarget, type ParsedGitHubTreeUrl, type PathDiscovery, type PathInstallConsent, type PathInstallMarker, type PreviewResult, type ProjectAiIntegrationsResult, type ProjectSkillRemoveResult, type ProjectSkillResult, type ReportBundleLevel, type ReportBundleResult, type ReportBundleSummary, type ResolveProjectRootOptions, type ResolveProjectRootResult, type ShareFolderValidationResult, type SharingMode, type SkillBundleTarget, type TokenStore, type TrackedRefusal, type UserMcpConfigsOptions, addOkPathsToGitExclude, assertProjectPathSafe, buildManagedServerEntry, buildMcpConfigDeclineEvent, buildMcpConfigMigrateEvent, classifyExistingMcpEntry, collectReportBundle, createTokenStore, defaultBugReportZipPath, detectGh, detectInstalledEditors, formatTrackedRemediation, getExcludedOkPaths, getOkArtifactPaths, isEntryUpToDate, isOwnManagedEntry, loadConfig, makeLazyProbeTokenStore, okBugReportsDir, parseGitHubBlobUrl, parseGitHubShareUrl, parseGitHubTreeUrl, parseGitUrl, pathInstallMarkerPath, previewContent, probeOwnManagedEditorMcpEntry, probeTrackedOkPaths, readExistingMcpEntry, readSharingMode, readSkillsShared, redactSecrets as redactContent, removeOkPathsFromGitExclude, removeOwnMcpEntry, removeProjectSkill, removeUserGlobalSkillBundle, resolveProjectRoot, runStop, setSkillsShared, truncatePriorEntry, userGlobalSkillBundleTargets, validateLocalFolderForShare, writeEditorMcpConfig, writeProjectAiIntegrations, writeProjectSkill, writeUserMcpConfigs };
4781
+ export { ALL_EDITOR_IDS, type BundleExtraFile, type BundleLogger, type CollectReportBundleOptions, EDITOR_LABELS, EDITOR_TARGETS, type EditorId, type EditorMcpResult, type EditorMcpTarget, type ExcludeWriteResult, type ExpectedShareRepo, type GhDetectResult, HOSTS_WITH_USER_SKILL_DIR, type IntegrationWriteOutcome, LAUNCH_CONFIG_NAME, type LoadConfigResult, type McpConfigDeclineEvent, type McpConfigDeclineScope, type McpConfigMigrateEvent, type McpConfigMigrateScope, type McpDeclineReason, type McpEntryClassification, type McpInstallOptions, type McpRemoveOutcome, type OwnManagedMcpEntryHit, PATH_SHIM_BEGIN, PATH_SHIM_BLOCK_RE, PATH_SHIM_END, type ParsedGitHubBlobUrl, type ParsedGitHubShareTarget, type ParsedGitHubTreeUrl, type PathDiscovery, type PathInstallConsent, type PathInstallMarker, type PreviewResult, type ProjectAiIntegrationsResult, type ProjectSkillRemoveResult, type ProjectSkillResult, type ReportBundleLevel, type ReportBundleResult, type ReportBundleSummary, type ResolveProjectRootOptions, type ResolveProjectRootResult, type ShareFolderValidationResult, type SharingMode, type SkillBundleTarget, type TokenStore, type TrackedRefusal, type UserMcpConfigsOptions, addOkPathsToGitExclude, assertProjectPathSafe, buildManagedServerEntry, buildMcpConfigDeclineEvent, buildMcpConfigMigrateEvent, classifyExistingMcpEntry, collectReportBundle, createTokenStore, defaultBugReportZipPath, detectGh, detectInstalledEditors, editorConfigPathDisplay, editorEntryLocator, formatTrackedRemediation, getExcludedOkPaths, getOkArtifactPaths, isEntryUpToDate, isOwnManagedEntry, loadConfig, makeLazyProbeTokenStore, okBugReportsDir, parseGitHubBlobUrl, parseGitHubShareUrl, parseGitHubTreeUrl, parseGitUrl, pathInstallMarkerPath, previewContent, probeOwnManagedEditorMcpEntry, probeTrackedOkPaths, readExistingMcpEntry, readSharingMode, readSkillsShared, redactSecrets as redactContent, removeOkPathsFromGitExclude, removeOwnMcpEntry, removeProjectSkill, removeUserGlobalSkillBundle, resolveProjectRoot, runStop, setSkillsShared, truncatePriorEntry, userGlobalSkillBundleTargets, validateLocalFolderForShare, writeEditorMcpConfig, writeProjectAiIntegrations, writeProjectSkill, writeUserMcpConfigs };
4766
4782
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{ms as e}from"./src-C9yhZBbO.mjs";import{c as t,d as n,f as r,g as i,i as a,l as o,r as s,s as c,t as l,u,v as d,y as f}from"./write-project-skill-DPGLaFfB.mjs";import{C as p,_ as m,b as h,c as g,f as _,g as v,h as y,i as b,l as x,n as S,r as C,s as w,t as T,u as E,v as D,w as O}from"./src-DDzpg6rN.mjs";import{a as k,i as A,n as j,t as M}from"./acp-harness-probe-DyGzojAs.mjs";import{A as N,F as P,I as F,M as I,N as L,O as R,P as z,d as B,j as V,k as H,n as U,o as W,s as G,v as K,x as q,y as J}from"./init-UsHQ5nkw.mjs";import{n as Y}from"./loader-TX84kNNr.mjs";import{n as X}from"./preview-BO-_TVuU.mjs";import{n as Z,t as Q}from"./mcp-migrate-event-CWx0WLdE.mjs";export{o as ALL_EDITOR_IDS,u as EDITOR_LABELS,n as EDITOR_TARGETS,r as HOSTS_WITH_USER_SKILL_DIR,U as LAUNCH_CONFIG_NAME,g as PATH_SHIM_BEGIN,x as PATH_SHIM_BLOCK_RE,E as PATH_SHIM_END,R as addOkPathsToGitExclude,l as assertProjectPathSafe,i as buildManagedServerEntry,C as buildMcpConfigDeclineEvent,Q as buildMcpConfigMigrateEvent,W as classifyExistingMcpEntry,h as collectReportBundle,A as createTokenStore,p as defaultBugReportZipPath,j as detectGh,G as detectInstalledEditors,H as formatTrackedRemediation,N as getExcludedOkPaths,V as getOkArtifactPaths,d as isEntryUpToDate,f as isOwnManagedEntry,Y as loadConfig,k as makeLazyProbeTokenStore,O as okBugReportsDir,y as parseGitHubBlobUrl,v as parseGitHubShareUrl,m as parseGitHubTreeUrl,D as parseGitUrl,_ as pathInstallMarkerPath,X as previewContent,M as probeOwnManagedEditorMcpEntry,I as probeTrackedOkPaths,B as readExistingMcpEntry,L as readSharingMode,z as readSkillsShared,e as redactContent,P as removeOkPathsFromGitExclude,w as removeOwnMcpEntry,s as removeProjectSkill,c as removeUserGlobalSkillBundle,q as resolveProjectRoot,b as runStop,F as setSkillsShared,Z as truncatePriorEntry,t as userGlobalSkillBundleTargets,S as validateLocalFolderForShare,K as writeEditorMcpConfig,T as writeProjectAiIntegrations,a as writeProjectSkill,J as writeUserMcpConfigs};
1
+ import{ms as e}from"./src-C9yhZBbO.mjs";import{_ as t,b as n,c as r,d as i,f as a,g as o,i as s,l as c,r as l,s as u,t as d,u as f,v as p,x as m}from"./write-project-skill-BIBvYtT6.mjs";import{C as h,_ as g,b as _,c as v,f as y,g as b,h as x,i as S,l as C,n as w,r as T,s as E,t as D,u as O,v as k,w as A}from"./src-Da5rL2HL.mjs";import{a as j,i as M,n as N,t as P}from"./acp-harness-probe-Dgh1Ipmo.mjs";import{A as F,F as I,I as L,M as R,N as z,O as B,P as V,d as H,j as U,k as W,n as G,o as K,s as q,v as J,x as Y,y as X}from"./init-DXZ5ZL-d.mjs";import{n as Z}from"./loader-di8ingCA.mjs";import{n as Q}from"./preview-CCY8KBS2.mjs";import{n as $,t as ee}from"./mcp-migrate-event-CWx0WLdE.mjs";export{c as ALL_EDITOR_IDS,f as EDITOR_LABELS,i as EDITOR_TARGETS,a as HOSTS_WITH_USER_SKILL_DIR,G as LAUNCH_CONFIG_NAME,v as PATH_SHIM_BEGIN,C as PATH_SHIM_BLOCK_RE,O as PATH_SHIM_END,B as addOkPathsToGitExclude,d as assertProjectPathSafe,o as buildManagedServerEntry,T as buildMcpConfigDeclineEvent,ee as buildMcpConfigMigrateEvent,K as classifyExistingMcpEntry,_ as collectReportBundle,M as createTokenStore,h as defaultBugReportZipPath,N as detectGh,q as detectInstalledEditors,t as editorConfigPathDisplay,p as editorEntryLocator,W as formatTrackedRemediation,F as getExcludedOkPaths,U as getOkArtifactPaths,n as isEntryUpToDate,m as isOwnManagedEntry,Z as loadConfig,j as makeLazyProbeTokenStore,A as okBugReportsDir,x as parseGitHubBlobUrl,b as parseGitHubShareUrl,g as parseGitHubTreeUrl,k as parseGitUrl,y as pathInstallMarkerPath,Q as previewContent,P as probeOwnManagedEditorMcpEntry,R as probeTrackedOkPaths,H as readExistingMcpEntry,z as readSharingMode,V as readSkillsShared,e as redactContent,I as removeOkPathsFromGitExclude,E as removeOwnMcpEntry,l as removeProjectSkill,u as removeUserGlobalSkillBundle,Y as resolveProjectRoot,S as runStop,L as setSkillsShared,$ as truncatePriorEntry,r as userGlobalSkillBundleTargets,w as validateLocalFolderForShare,J as writeEditorMcpConfig,D as writeProjectAiIntegrations,s as writeProjectSkill,X as writeUserMcpConfigs};
@@ -0,0 +1 @@
1
+ import{g as e}from"./init-DXZ5ZL-d.mjs";export{e as runInit};