@linghun/tui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/LICENSE +190 -0
  2. package/dist/agent-completion-finalizer.d.ts +31 -0
  3. package/dist/agent-completion-finalizer.d.ts.map +1 -0
  4. package/dist/agent-completion-finalizer.js +20 -0
  5. package/dist/agent-handoff-safety.d.ts +13 -0
  6. package/dist/agent-handoff-safety.d.ts.map +1 -0
  7. package/dist/agent-handoff-safety.js +43 -0
  8. package/dist/agent-workflow-registry.d.ts +45 -0
  9. package/dist/agent-workflow-registry.d.ts.map +1 -0
  10. package/dist/agent-workflow-registry.js +12 -0
  11. package/dist/architecture-boundary.d.ts +151 -0
  12. package/dist/architecture-boundary.d.ts.map +1 -0
  13. package/dist/architecture-boundary.js +24 -0
  14. package/dist/architecture-runtime.d.ts +56 -0
  15. package/dist/architecture-runtime.d.ts.map +1 -0
  16. package/dist/architecture-runtime.js +18 -0
  17. package/dist/background-control-runtime.d.ts +29 -0
  18. package/dist/background-control-runtime.d.ts.map +1 -0
  19. package/dist/background-control-runtime.js +148 -0
  20. package/dist/bash-subcommand-parser.d.ts +34 -0
  21. package/dist/bash-subcommand-parser.d.ts.map +1 -0
  22. package/dist/bash-subcommand-parser.js +8 -0
  23. package/dist/batch-tool-confirmation.d.ts +18 -0
  24. package/dist/batch-tool-confirmation.d.ts.map +1 -0
  25. package/dist/batch-tool-confirmation.js +100 -0
  26. package/dist/break-cache-runtime.d.ts +40 -0
  27. package/dist/break-cache-runtime.d.ts.map +1 -0
  28. package/dist/break-cache-runtime.js +17 -0
  29. package/dist/btw-runtime.d.ts +45 -0
  30. package/dist/btw-runtime.d.ts.map +1 -0
  31. package/dist/btw-runtime.js +14 -0
  32. package/dist/cache-command-runtime.d.ts +22 -0
  33. package/dist/cache-command-runtime.d.ts.map +1 -0
  34. package/dist/cache-command-runtime.js +33 -0
  35. package/dist/cache-freshness.d.ts +26 -0
  36. package/dist/cache-freshness.d.ts.map +1 -0
  37. package/dist/cache-freshness.js +14 -0
  38. package/dist/capability-runtime.d.ts +75 -0
  39. package/dist/capability-runtime.d.ts.map +1 -0
  40. package/dist/capability-runtime.js +97 -0
  41. package/dist/chunk-2FVEKTKN.js +86 -0
  42. package/dist/chunk-2YL5VKJ5.js +531 -0
  43. package/dist/chunk-3AKXDMVS.js +85 -0
  44. package/dist/chunk-3GCIXKCI.js +221 -0
  45. package/dist/chunk-3LT6OWQ2.js +258 -0
  46. package/dist/chunk-3XNUDLOM.js +91 -0
  47. package/dist/chunk-4EIC5BCT.js +475 -0
  48. package/dist/chunk-4EP3TUFF.js +238 -0
  49. package/dist/chunk-4I2NWBOM.js +117 -0
  50. package/dist/chunk-4K6UB524.js +443 -0
  51. package/dist/chunk-4T5DJW54.js +88 -0
  52. package/dist/chunk-4WHZ6JKD.js +8105 -0
  53. package/dist/chunk-5H7RRF7C.js +6 -0
  54. package/dist/chunk-64MJP6FK.js +558 -0
  55. package/dist/chunk-66BNE332.js +1617 -0
  56. package/dist/chunk-6CI6TKLN.js +50 -0
  57. package/dist/chunk-6RJVTUWI.js +16 -0
  58. package/dist/chunk-6SMM5CMP.js +100 -0
  59. package/dist/chunk-6USL33ZO.js +289 -0
  60. package/dist/chunk-7ZE5JFAZ.js +760 -0
  61. package/dist/chunk-AKPXMCVF.js +1373 -0
  62. package/dist/chunk-AO4CXI37.js +284 -0
  63. package/dist/chunk-APJIC2O5.js +150 -0
  64. package/dist/chunk-B4GQTZMT.js +607 -0
  65. package/dist/chunk-BFVPLGAC.js +93 -0
  66. package/dist/chunk-BOV4K7FP.js +588 -0
  67. package/dist/chunk-CFMSB6ST.js +59 -0
  68. package/dist/chunk-CFXB5SE5.js +502 -0
  69. package/dist/chunk-CRQORMFF.js +32 -0
  70. package/dist/chunk-CRSLDQOA.js +146 -0
  71. package/dist/chunk-CRW3636S.js +214 -0
  72. package/dist/chunk-D3UTL2QX.js +86 -0
  73. package/dist/chunk-D7TCSOAZ.js +331 -0
  74. package/dist/chunk-DDXS2RDZ.js +228 -0
  75. package/dist/chunk-DICVLZHH.js +144 -0
  76. package/dist/chunk-DNQN74CC.js +1186 -0
  77. package/dist/chunk-DTK5NBTV.js +912 -0
  78. package/dist/chunk-E72U7WW7.js +50 -0
  79. package/dist/chunk-EBACIBJP.js +356 -0
  80. package/dist/chunk-ECFLCY5V.js +530 -0
  81. package/dist/chunk-EORRZP3F.js +109 -0
  82. package/dist/chunk-F43AMWLZ.js +115 -0
  83. package/dist/chunk-F46N43MG.js +56 -0
  84. package/dist/chunk-F6TVBCZV.js +51 -0
  85. package/dist/chunk-FRIMDSRU.js +242 -0
  86. package/dist/chunk-FTAEPAVY.js +314 -0
  87. package/dist/chunk-GC55DMZV.js +156 -0
  88. package/dist/chunk-GCMH5P4W.js +422 -0
  89. package/dist/chunk-GDQQNPBP.js +251 -0
  90. package/dist/chunk-GKZYTPN2.js +279 -0
  91. package/dist/chunk-GLWTWEGX.js +272 -0
  92. package/dist/chunk-GMUCSNUD.js +586 -0
  93. package/dist/chunk-GTP2KPLY.js +167 -0
  94. package/dist/chunk-GW5YDCRZ.js +42 -0
  95. package/dist/chunk-H3T4EF5F.js +87 -0
  96. package/dist/chunk-HAEU6OTS.js +381 -0
  97. package/dist/chunk-HQIJGQYU.js +172 -0
  98. package/dist/chunk-HW2TBXVK.js +34 -0
  99. package/dist/chunk-HWD22O6F.js +94 -0
  100. package/dist/chunk-I3NTAIMF.js +280 -0
  101. package/dist/chunk-IN42UISW.js +372 -0
  102. package/dist/chunk-IWUIOLMF.js +82 -0
  103. package/dist/chunk-J7ZE2JKP.js +283 -0
  104. package/dist/chunk-JBLVBO3U.js +109 -0
  105. package/dist/chunk-JDWXC2OQ.js +800 -0
  106. package/dist/chunk-JGDIO2NF.js +74 -0
  107. package/dist/chunk-JHGWGH2C.js +182 -0
  108. package/dist/chunk-JLCPHVBN.js +42 -0
  109. package/dist/chunk-JO5ANTMR.js +6027 -0
  110. package/dist/chunk-JPXSFZFC.js +100 -0
  111. package/dist/chunk-JQCRCDOC.js +1195 -0
  112. package/dist/chunk-K4FSYBSY.js +41 -0
  113. package/dist/chunk-K56D3X7S.js +1225 -0
  114. package/dist/chunk-KI7C6ZOD.js +92 -0
  115. package/dist/chunk-KO64OFSG.js +58 -0
  116. package/dist/chunk-KQJHVJZB.js +227 -0
  117. package/dist/chunk-KTWV5JC5.js +59 -0
  118. package/dist/chunk-L4XXW6Y5.js +374 -0
  119. package/dist/chunk-L5GOCMZP.js +18 -0
  120. package/dist/chunk-LDABZV5V.js +278 -0
  121. package/dist/chunk-LHHKPGLX.js +903 -0
  122. package/dist/chunk-LL7LBRDL.js +60 -0
  123. package/dist/chunk-LQTVYUT3.js +421 -0
  124. package/dist/chunk-LVIM2PA7.js +663 -0
  125. package/dist/chunk-M4AIK2SP.js +215 -0
  126. package/dist/chunk-MLUIOBKL.js +420 -0
  127. package/dist/chunk-MOJL4X4L.js +47 -0
  128. package/dist/chunk-MVONSJEN.js +300 -0
  129. package/dist/chunk-N7G2X2LK.js +709 -0
  130. package/dist/chunk-NKFKOEYX.js +146 -0
  131. package/dist/chunk-NMNOAFFT.js +167 -0
  132. package/dist/chunk-NSIKYD3X.js +74 -0
  133. package/dist/chunk-O7EFPSMC.js +60 -0
  134. package/dist/chunk-O7S3HYE6.js +210 -0
  135. package/dist/chunk-OEYW3JE3.js +262 -0
  136. package/dist/chunk-OF3K3CU5.js +159 -0
  137. package/dist/chunk-OMZYPQVA.js +298 -0
  138. package/dist/chunk-OZMX3E35.js +248 -0
  139. package/dist/chunk-P277M7Z5.js +303 -0
  140. package/dist/chunk-P4CPRJLI.js +65 -0
  141. package/dist/chunk-PBIPV4LD.js +494 -0
  142. package/dist/chunk-PGNALDEH.js +2003 -0
  143. package/dist/chunk-PGWW3DVE.js +157 -0
  144. package/dist/chunk-QB4VWH7W.js +515 -0
  145. package/dist/chunk-QBCGAIU7.js +120 -0
  146. package/dist/chunk-QIU3FJPC.js +99 -0
  147. package/dist/chunk-QLRTQHTR.js +744 -0
  148. package/dist/chunk-QTDGRZMZ.js +171 -0
  149. package/dist/chunk-RBOQJFIZ.js +183 -0
  150. package/dist/chunk-RDGM4RUE.js +178 -0
  151. package/dist/chunk-RM5JDRCW.js +71 -0
  152. package/dist/chunk-RM5QMOFY.js +189 -0
  153. package/dist/chunk-RMLTVKOY.js +588 -0
  154. package/dist/chunk-RVY34HK4.js +79 -0
  155. package/dist/chunk-S3YWTBXL.js +43 -0
  156. package/dist/chunk-SJOS5PM6.js +64 -0
  157. package/dist/chunk-SOPYWTFV.js +90 -0
  158. package/dist/chunk-SQIBPLLV.js +15 -0
  159. package/dist/chunk-SRZIA6B4.js +136 -0
  160. package/dist/chunk-SYBNJZEL.js +250 -0
  161. package/dist/chunk-TFZEFIQT.js +17 -0
  162. package/dist/chunk-THZBFYAH.js +136 -0
  163. package/dist/chunk-TJLC3QAS.js +83 -0
  164. package/dist/chunk-TYF4GJR3.js +598 -0
  165. package/dist/chunk-UDQT5CWK.js +252 -0
  166. package/dist/chunk-UOHZQIVL.js +168 -0
  167. package/dist/chunk-URNQUECO.js +187 -0
  168. package/dist/chunk-UT2TYK2A.js +148 -0
  169. package/dist/chunk-UT5BOJKU.js +190 -0
  170. package/dist/chunk-V7GDHHBL.js +526 -0
  171. package/dist/chunk-VCSRBS47.js +133 -0
  172. package/dist/chunk-VIBENDE3.js +152 -0
  173. package/dist/chunk-VTQL23UM.js +302 -0
  174. package/dist/chunk-W3KHJNSH.js +281 -0
  175. package/dist/chunk-W6NU7ZAV.js +52 -0
  176. package/dist/chunk-WHFDDZHY.js +407 -0
  177. package/dist/chunk-WJWYRBWH.js +48 -0
  178. package/dist/chunk-WKMBK5UP.js +145 -0
  179. package/dist/chunk-WQMSRO4D.js +489 -0
  180. package/dist/chunk-WV6YJGZR.js +81 -0
  181. package/dist/chunk-WVAQYKGL.js +269 -0
  182. package/dist/chunk-X7A22JHP.js +106 -0
  183. package/dist/chunk-XFPNU42I.js +59 -0
  184. package/dist/chunk-YH6UIHNF.js +161 -0
  185. package/dist/chunk-YPQFSFYK.js +19 -0
  186. package/dist/chunk-YTQFOZRZ.js +110 -0
  187. package/dist/chunk-ZJK25VFP.js +506 -0
  188. package/dist/chunk-ZOSK2UEU.js +1555 -0
  189. package/dist/chunk-ZYSN7AWW.js +336 -0
  190. package/dist/chunk-ZZ2CNCXJ.js +282 -0
  191. package/dist/command-panel-runtime.d.ts +33 -0
  192. package/dist/command-panel-runtime.d.ts.map +1 -0
  193. package/dist/command-panel-runtime.js +80 -0
  194. package/dist/compact-cache-command-runtime.d.ts +38 -0
  195. package/dist/compact-cache-command-runtime.d.ts.map +1 -0
  196. package/dist/compact-cache-command-runtime.js +146 -0
  197. package/dist/compact-context.d.ts +35 -0
  198. package/dist/compact-context.d.ts.map +1 -0
  199. package/dist/compact-context.js +16 -0
  200. package/dist/compact-preflight-runtime.d.ts +46 -0
  201. package/dist/compact-preflight-runtime.d.ts.map +1 -0
  202. package/dist/compact-preflight-runtime.js +62 -0
  203. package/dist/connector-runtime.d.ts +72 -0
  204. package/dist/connector-runtime.d.ts.map +1 -0
  205. package/dist/connector-runtime.js +88 -0
  206. package/dist/context-estimator.d.ts +20 -0
  207. package/dist/context-estimator.d.ts.map +1 -0
  208. package/dist/context-estimator.js +18 -0
  209. package/dist/context-window-runtime.d.ts +12 -0
  210. package/dist/context-window-runtime.d.ts.map +1 -0
  211. package/dist/context-window-runtime.js +10 -0
  212. package/dist/deep-compact-runtime.d.ts +53 -0
  213. package/dist/deep-compact-runtime.d.ts.map +1 -0
  214. package/dist/deep-compact-runtime.js +35 -0
  215. package/dist/deferred-tools-catalog.d.ts +52 -0
  216. package/dist/deferred-tools-catalog.d.ts.map +1 -0
  217. package/dist/deferred-tools-catalog.js +42 -0
  218. package/dist/details-status-runtime.d.ts +48 -0
  219. package/dist/details-status-runtime.d.ts.map +1 -0
  220. package/dist/details-status-runtime.js +102 -0
  221. package/dist/evidence-runtime.d.ts +48 -0
  222. package/dist/evidence-runtime.d.ts.map +1 -0
  223. package/dist/evidence-runtime.js +92 -0
  224. package/dist/extension-command-runtime.d.ts +63 -0
  225. package/dist/extension-command-runtime.d.ts.map +1 -0
  226. package/dist/extension-command-runtime.js +67 -0
  227. package/dist/extension-slash-runtime.d.ts +11 -0
  228. package/dist/extension-slash-runtime.d.ts.map +1 -0
  229. package/dist/extension-slash-runtime.js +79 -0
  230. package/dist/external-editor-runtime.d.ts +32 -0
  231. package/dist/external-editor-runtime.d.ts.map +1 -0
  232. package/dist/external-editor-runtime.js +71 -0
  233. package/dist/failure-learning-command-runtime.d.ts +10 -0
  234. package/dist/failure-learning-command-runtime.d.ts.map +1 -0
  235. package/dist/failure-learning-command-runtime.js +78 -0
  236. package/dist/failure-learning-presenter.d.ts +6 -0
  237. package/dist/failure-learning-presenter.d.ts.map +1 -0
  238. package/dist/failure-learning-presenter.js +12 -0
  239. package/dist/failure-learning-runtime.d.ts +39 -0
  240. package/dist/failure-learning-runtime.d.ts.map +1 -0
  241. package/dist/failure-learning-runtime.js +39 -0
  242. package/dist/feature-flag-runtime.d.ts +8 -0
  243. package/dist/feature-flag-runtime.d.ts.map +1 -0
  244. package/dist/feature-flag-runtime.js +12 -0
  245. package/dist/feishu-long-connection-runtime.d.ts +12 -0
  246. package/dist/feishu-long-connection-runtime.d.ts.map +1 -0
  247. package/dist/feishu-long-connection-runtime.js +7 -0
  248. package/dist/final-answer-gate.d.ts +24 -0
  249. package/dist/final-answer-gate.d.ts.map +1 -0
  250. package/dist/final-answer-gate.js +26 -0
  251. package/dist/ghost-text.d.ts +16 -0
  252. package/dist/ghost-text.d.ts.map +1 -0
  253. package/dist/ghost-text.js +8 -0
  254. package/dist/git-branch-runtime.d.ts +14 -0
  255. package/dist/git-branch-runtime.d.ts.map +1 -0
  256. package/dist/git-branch-runtime.js +68 -0
  257. package/dist/git-command-runtime.d.ts +22 -0
  258. package/dist/git-command-runtime.d.ts.map +1 -0
  259. package/dist/git-command-runtime.js +89 -0
  260. package/dist/git-operation-runtime.d.ts +188 -0
  261. package/dist/git-operation-runtime.d.ts.map +1 -0
  262. package/dist/git-operation-runtime.js +45 -0
  263. package/dist/git-runtime.d.ts +113 -0
  264. package/dist/git-runtime.d.ts.map +1 -0
  265. package/dist/git-runtime.js +16 -0
  266. package/dist/git-slash-runtime.d.ts +38 -0
  267. package/dist/git-slash-runtime.d.ts.map +1 -0
  268. package/dist/git-slash-runtime.js +18 -0
  269. package/dist/git-tool-dispatch-runtime.d.ts +108 -0
  270. package/dist/git-tool-dispatch-runtime.d.ts.map +1 -0
  271. package/dist/git-tool-dispatch-runtime.js +25 -0
  272. package/dist/git-tool-runtime.d.ts +64 -0
  273. package/dist/git-tool-runtime.d.ts.map +1 -0
  274. package/dist/git-tool-runtime.js +36 -0
  275. package/dist/guard-wiring.d.ts +67 -0
  276. package/dist/guard-wiring.d.ts.map +1 -0
  277. package/dist/guard-wiring.js +21 -0
  278. package/dist/handoff-session-runtime.d.ts +11 -0
  279. package/dist/handoff-session-runtime.d.ts.map +1 -0
  280. package/dist/handoff-session-runtime.js +36 -0
  281. package/dist/index-result-presenter.d.ts +14 -0
  282. package/dist/index-result-presenter.d.ts.map +1 -0
  283. package/dist/index-result-presenter.js +28 -0
  284. package/dist/index-runtime.d.ts +64 -0
  285. package/dist/index-runtime.d.ts.map +1 -0
  286. package/dist/index-runtime.js +28 -0
  287. package/dist/index-tool-runtime.d.ts +44 -0
  288. package/dist/index-tool-runtime.d.ts.map +1 -0
  289. package/dist/index-tool-runtime.js +24 -0
  290. package/dist/index.d.ts +57 -0
  291. package/dist/index.d.ts.map +1 -0
  292. package/dist/index.js +2346 -0
  293. package/dist/job-agent-command-runtime.d.ts +127 -0
  294. package/dist/job-agent-command-runtime.d.ts.map +1 -0
  295. package/dist/job-agent-command-runtime.js +138 -0
  296. package/dist/job-runner-presenter.d.ts +32 -0
  297. package/dist/job-runner-presenter.d.ts.map +1 -0
  298. package/dist/job-runner-presenter.js +30 -0
  299. package/dist/job-runtime.d.ts +65 -0
  300. package/dist/job-runtime.d.ts.map +1 -0
  301. package/dist/job-runtime.js +88 -0
  302. package/dist/keybinding-runtime.d.ts +29 -0
  303. package/dist/keybinding-runtime.d.ts.map +1 -0
  304. package/dist/keybinding-runtime.js +14 -0
  305. package/dist/log-artifact.d.ts +55 -0
  306. package/dist/log-artifact.d.ts.map +1 -0
  307. package/dist/log-artifact.js +10 -0
  308. package/dist/mcp-index-command-runtime.d.ts +21 -0
  309. package/dist/mcp-index-command-runtime.d.ts.map +1 -0
  310. package/dist/mcp-index-command-runtime.js +18 -0
  311. package/dist/mcp-index-runtime.d.ts +106 -0
  312. package/dist/mcp-index-runtime.d.ts.map +1 -0
  313. package/dist/mcp-index-runtime.js +142 -0
  314. package/dist/mcp-sse-runtime.d.ts +13 -0
  315. package/dist/mcp-sse-runtime.d.ts.map +1 -0
  316. package/dist/mcp-sse-runtime.js +8 -0
  317. package/dist/mcp-stdio-runtime.d.ts +37 -0
  318. package/dist/mcp-stdio-runtime.d.ts.map +1 -0
  319. package/dist/mcp-stdio-runtime.js +15 -0
  320. package/dist/memory-command-runtime.d.ts +37 -0
  321. package/dist/memory-command-runtime.d.ts.map +1 -0
  322. package/dist/memory-command-runtime.js +88 -0
  323. package/dist/memory-eviction-runtime.d.ts +7 -0
  324. package/dist/memory-eviction-runtime.d.ts.map +1 -0
  325. package/dist/memory-eviction-runtime.js +12 -0
  326. package/dist/memory-extraction-runtime.d.ts +40 -0
  327. package/dist/memory-extraction-runtime.d.ts.map +1 -0
  328. package/dist/memory-extraction-runtime.js +20 -0
  329. package/dist/memory-rules-runtime.d.ts +15 -0
  330. package/dist/memory-rules-runtime.d.ts.map +1 -0
  331. package/dist/memory-rules-runtime.js +14 -0
  332. package/dist/meta-scheduler-complexity.d.ts +16 -0
  333. package/dist/meta-scheduler-complexity.d.ts.map +1 -0
  334. package/dist/meta-scheduler-complexity.js +37 -0
  335. package/dist/meta-scheduler-runtime.d.ts +288 -0
  336. package/dist/meta-scheduler-runtime.d.ts.map +1 -0
  337. package/dist/meta-scheduler-runtime.js +17 -0
  338. package/dist/model-command-runtime.d.ts +12 -0
  339. package/dist/model-command-runtime.d.ts.map +1 -0
  340. package/dist/model-command-runtime.js +84 -0
  341. package/dist/model-doctor-runtime.d.ts +81 -0
  342. package/dist/model-doctor-runtime.d.ts.map +1 -0
  343. package/dist/model-doctor-runtime.js +46 -0
  344. package/dist/model-loop-runtime.d.ts +189 -0
  345. package/dist/model-loop-runtime.d.ts.map +1 -0
  346. package/dist/model-loop-runtime.js +141 -0
  347. package/dist/model-prompt-runtime.d.ts +25 -0
  348. package/dist/model-prompt-runtime.d.ts.map +1 -0
  349. package/dist/model-prompt-runtime.js +33 -0
  350. package/dist/model-setup-runtime.d.ts +28 -0
  351. package/dist/model-setup-runtime.d.ts.map +1 -0
  352. package/dist/model-setup-runtime.js +26 -0
  353. package/dist/model-stream-runtime.d.ts +47 -0
  354. package/dist/model-stream-runtime.d.ts.map +1 -0
  355. package/dist/model-stream-runtime.js +136 -0
  356. package/dist/model-tool-runtime.d.ts +114 -0
  357. package/dist/model-tool-runtime.d.ts.map +1 -0
  358. package/dist/model-tool-runtime.js +144 -0
  359. package/dist/natural-command-bridge.d.ts +158 -0
  360. package/dist/natural-command-bridge.d.ts.map +1 -0
  361. package/dist/natural-command-bridge.js +36 -0
  362. package/dist/pending-details-presenter.d.ts +8 -0
  363. package/dist/pending-details-presenter.d.ts.map +1 -0
  364. package/dist/pending-details-presenter.js +12 -0
  365. package/dist/permission-approval-runtime.d.ts +28 -0
  366. package/dist/permission-approval-runtime.d.ts.map +1 -0
  367. package/dist/permission-approval-runtime.js +136 -0
  368. package/dist/permission-continuation-runtime.d.ts +90 -0
  369. package/dist/permission-continuation-runtime.d.ts.map +1 -0
  370. package/dist/permission-continuation-runtime.js +68 -0
  371. package/dist/permission-policy-engine.d.ts +51 -0
  372. package/dist/permission-policy-engine.d.ts.map +1 -0
  373. package/dist/permission-policy-engine.js +12 -0
  374. package/dist/permission-presenter.d.ts +13 -0
  375. package/dist/permission-presenter.d.ts.map +1 -0
  376. package/dist/permission-presenter.js +8 -0
  377. package/dist/persistent-history.d.ts +18 -0
  378. package/dist/persistent-history.d.ts.map +1 -0
  379. package/dist/persistent-history.js +126 -0
  380. package/dist/platform-security.d.ts +4 -0
  381. package/dist/platform-security.d.ts.map +1 -0
  382. package/dist/platform-security.js +10 -0
  383. package/dist/process-command-runtime.d.ts +9 -0
  384. package/dist/process-command-runtime.d.ts.map +1 -0
  385. package/dist/process-command-runtime.js +11 -0
  386. package/dist/process-guard.d.ts +56 -0
  387. package/dist/process-guard.d.ts.map +1 -0
  388. package/dist/process-guard.js +22 -0
  389. package/dist/prompt-command-runtime.d.ts +12 -0
  390. package/dist/prompt-command-runtime.d.ts.map +1 -0
  391. package/dist/prompt-command-runtime.js +10 -0
  392. package/dist/prompt-stash.d.ts +15 -0
  393. package/dist/prompt-stash.d.ts.map +1 -0
  394. package/dist/prompt-stash.js +8 -0
  395. package/dist/provider-circuit-breaker.d.ts +132 -0
  396. package/dist/provider-circuit-breaker.d.ts.map +1 -0
  397. package/dist/provider-circuit-breaker.js +31 -0
  398. package/dist/provider-loop-runtime.d.ts +18 -0
  399. package/dist/provider-loop-runtime.d.ts.map +1 -0
  400. package/dist/provider-loop-runtime.js +16 -0
  401. package/dist/remote-command-runtime.d.ts +47 -0
  402. package/dist/remote-command-runtime.d.ts.map +1 -0
  403. package/dist/remote-command-runtime.js +125 -0
  404. package/dist/remote-inbound-bridge-runtime.d.ts +152 -0
  405. package/dist/remote-inbound-bridge-runtime.d.ts.map +1 -0
  406. package/dist/remote-inbound-bridge-runtime.js +44 -0
  407. package/dist/remote-mcp-presenter.d.ts +5 -0
  408. package/dist/remote-mcp-presenter.d.ts.map +1 -0
  409. package/dist/remote-mcp-presenter.js +10 -0
  410. package/dist/remote-repl-bridge-runtime.d.ts +134 -0
  411. package/dist/remote-repl-bridge-runtime.d.ts.map +1 -0
  412. package/dist/remote-repl-bridge-runtime.js +20 -0
  413. package/dist/remote-transport.d.ts +50 -0
  414. package/dist/remote-transport.d.ts.map +1 -0
  415. package/dist/remote-transport.js +14 -0
  416. package/dist/request-lifecycle-presenter.d.ts +25 -0
  417. package/dist/request-lifecycle-presenter.d.ts.map +1 -0
  418. package/dist/request-lifecycle-presenter.js +22 -0
  419. package/dist/runner-runtime.d.ts +41 -0
  420. package/dist/runner-runtime.d.ts.map +1 -0
  421. package/dist/runner-runtime.js +35 -0
  422. package/dist/runtime-budget.d.ts +38 -0
  423. package/dist/runtime-budget.d.ts.map +1 -0
  424. package/dist/runtime-budget.js +78 -0
  425. package/dist/runtime-path-marker.d.ts +112 -0
  426. package/dist/runtime-path-marker.d.ts.map +1 -0
  427. package/dist/runtime-path-marker.js +18 -0
  428. package/dist/runtime-status-presenter.d.ts +22 -0
  429. package/dist/runtime-status-presenter.d.ts.map +1 -0
  430. package/dist/runtime-status-presenter.js +15 -0
  431. package/dist/runtime-status-snapshot.d.ts +52 -0
  432. package/dist/runtime-status-snapshot.d.ts.map +1 -0
  433. package/dist/runtime-status-snapshot.js +11 -0
  434. package/dist/runtime-utils.d.ts +2 -0
  435. package/dist/runtime-utils.d.ts.map +1 -0
  436. package/dist/runtime-utils.js +6 -0
  437. package/dist/shell/clipboard.d.ts +23 -0
  438. package/dist/shell/clipboard.d.ts.map +1 -0
  439. package/dist/shell/clipboard.js +8 -0
  440. package/dist/shell/components/AgentProgressTree.d.ts +9 -0
  441. package/dist/shell/components/AgentProgressTree.d.ts.map +1 -0
  442. package/dist/shell/components/AgentProgressTree.js +9 -0
  443. package/dist/shell/components/BackgroundTaskOverlay.d.ts +8 -0
  444. package/dist/shell/components/BackgroundTaskOverlay.d.ts.map +1 -0
  445. package/dist/shell/components/BackgroundTaskOverlay.js +8 -0
  446. package/dist/shell/components/BtwPanel.d.ts +16 -0
  447. package/dist/shell/components/BtwPanel.d.ts.map +1 -0
  448. package/dist/shell/components/BtwPanel.js +8 -0
  449. package/dist/shell/components/CommandPanel.d.ts +11 -0
  450. package/dist/shell/components/CommandPanel.d.ts.map +1 -0
  451. package/dist/shell/components/CommandPanel.js +8 -0
  452. package/dist/shell/components/Composer.d.ts +187 -0
  453. package/dist/shell/components/Composer.d.ts.map +1 -0
  454. package/dist/shell/components/Composer.js +99 -0
  455. package/dist/shell/components/ConfigPanel.d.ts +11 -0
  456. package/dist/shell/components/ConfigPanel.d.ts.map +1 -0
  457. package/dist/shell/components/ConfigPanel.js +8 -0
  458. package/dist/shell/components/CtrlOToExpand.d.ts +30 -0
  459. package/dist/shell/components/CtrlOToExpand.d.ts.map +1 -0
  460. package/dist/shell/components/CtrlOToExpand.js +16 -0
  461. package/dist/shell/components/HelpPanel.d.ts +19 -0
  462. package/dist/shell/components/HelpPanel.d.ts.map +1 -0
  463. package/dist/shell/components/HelpPanel.js +8 -0
  464. package/dist/shell/components/HistorySearchPanel.d.ts +14 -0
  465. package/dist/shell/components/HistorySearchPanel.d.ts.map +1 -0
  466. package/dist/shell/components/HistorySearchPanel.js +104 -0
  467. package/dist/shell/components/MessageMarkdown.d.ts +34 -0
  468. package/dist/shell/components/MessageMarkdown.d.ts.map +1 -0
  469. package/dist/shell/components/MessageMarkdown.js +18 -0
  470. package/dist/shell/components/MessageResponse.d.ts +14 -0
  471. package/dist/shell/components/MessageResponse.d.ts.map +1 -0
  472. package/dist/shell/components/MessageResponse.js +6 -0
  473. package/dist/shell/components/MouseInputRouter.d.ts +28 -0
  474. package/dist/shell/components/MouseInputRouter.d.ts.map +1 -0
  475. package/dist/shell/components/MouseInputRouter.js +84 -0
  476. package/dist/shell/components/NotificationStack.d.ts +19 -0
  477. package/dist/shell/components/NotificationStack.d.ts.map +1 -0
  478. package/dist/shell/components/NotificationStack.js +6 -0
  479. package/dist/shell/components/OutputLine.d.ts +19 -0
  480. package/dist/shell/components/OutputLine.d.ts.map +1 -0
  481. package/dist/shell/components/OutputLine.js +38 -0
  482. package/dist/shell/components/ProductBlock.d.ts +10 -0
  483. package/dist/shell/components/ProductBlock.d.ts.map +1 -0
  484. package/dist/shell/components/ProductBlock.js +12 -0
  485. package/dist/shell/components/ScrollViewport.d.ts +43 -0
  486. package/dist/shell/components/ScrollViewport.d.ts.map +1 -0
  487. package/dist/shell/components/ScrollViewport.js +86 -0
  488. package/dist/shell/components/SessionsPanel.d.ts +24 -0
  489. package/dist/shell/components/SessionsPanel.d.ts.map +1 -0
  490. package/dist/shell/components/SessionsPanel.js +8 -0
  491. package/dist/shell/components/ShellApp.d.ts +8 -0
  492. package/dist/shell/components/ShellApp.d.ts.map +1 -0
  493. package/dist/shell/components/ShellApp.js +45 -0
  494. package/dist/shell/components/ShortcutPanel.d.ts +14 -0
  495. package/dist/shell/components/ShortcutPanel.d.ts.map +1 -0
  496. package/dist/shell/components/ShortcutPanel.js +59 -0
  497. package/dist/shell/components/SlashSuggestions.d.ts +24 -0
  498. package/dist/shell/components/SlashSuggestions.d.ts.map +1 -0
  499. package/dist/shell/components/SlashSuggestions.js +7 -0
  500. package/dist/shell/components/StatusFooter.d.ts +30 -0
  501. package/dist/shell/components/StatusFooter.d.ts.map +1 -0
  502. package/dist/shell/components/StatusFooter.js +7 -0
  503. package/dist/shell/components/StatusTray.d.ts +9 -0
  504. package/dist/shell/components/StatusTray.d.ts.map +1 -0
  505. package/dist/shell/components/StatusTray.js +6 -0
  506. package/dist/shell/components/StructuredDiff.d.ts +9 -0
  507. package/dist/shell/components/StructuredDiff.d.ts.map +1 -0
  508. package/dist/shell/components/StructuredDiff.js +7 -0
  509. package/dist/shell/components/TaskListView.d.ts +9 -0
  510. package/dist/shell/components/TaskListView.d.ts.map +1 -0
  511. package/dist/shell/components/TaskListView.js +9 -0
  512. package/dist/shell/components/TaskSuggestionBar.d.ts +15 -0
  513. package/dist/shell/components/TaskSuggestionBar.d.ts.map +1 -0
  514. package/dist/shell/components/TaskSuggestionBar.js +8 -0
  515. package/dist/shell/components/UnseenMessagePill.d.ts +12 -0
  516. package/dist/shell/components/UnseenMessagePill.d.ts.map +1 -0
  517. package/dist/shell/components/UnseenMessagePill.js +6 -0
  518. package/dist/shell/components/WorkflowProgressView.d.ts +9 -0
  519. package/dist/shell/components/WorkflowProgressView.d.ts.map +1 -0
  520. package/dist/shell/components/WorkflowProgressView.js +9 -0
  521. package/dist/shell/components/useAnchoredCursor.d.ts +32 -0
  522. package/dist/shell/components/useAnchoredCursor.d.ts.map +1 -0
  523. package/dist/shell/components/useAnchoredCursor.js +6 -0
  524. package/dist/shell/hooks/useRenderThrottle.d.ts +2 -0
  525. package/dist/shell/hooks/useRenderThrottle.d.ts.map +1 -0
  526. package/dist/shell/hooks/useRenderThrottle.js +35 -0
  527. package/dist/shell/hooks/useScrollBatcher.d.ts +10 -0
  528. package/dist/shell/hooks/useScrollBatcher.d.ts.map +1 -0
  529. package/dist/shell/hooks/useScrollBatcher.js +23 -0
  530. package/dist/shell/hooks/useScrollRuntime.d.ts +2 -0
  531. package/dist/shell/hooks/useScrollRuntime.d.ts.map +1 -0
  532. package/dist/shell/hooks/useScrollRuntime.js +6 -0
  533. package/dist/shell/hyperlink-utils.d.ts +18 -0
  534. package/dist/shell/hyperlink-utils.d.ts.map +1 -0
  535. package/dist/shell/hyperlink-utils.js +8 -0
  536. package/dist/shell/ink-renderer.d.ts +18 -0
  537. package/dist/shell/ink-renderer.d.ts.map +1 -0
  538. package/dist/shell/ink-renderer.js +54 -0
  539. package/dist/shell/models/command-transcript-presenter.d.ts +73 -0
  540. package/dist/shell/models/command-transcript-presenter.d.ts.map +1 -0
  541. package/dist/shell/models/command-transcript-presenter.js +26 -0
  542. package/dist/shell/models/help-panel.d.ts +37 -0
  543. package/dist/shell/models/help-panel.d.ts.map +1 -0
  544. package/dist/shell/models/help-panel.js +10 -0
  545. package/dist/shell/models/permission-elevation.d.ts +65 -0
  546. package/dist/shell/models/permission-elevation.d.ts.map +1 -0
  547. package/dist/shell/models/permission-elevation.js +10 -0
  548. package/dist/shell/models/permission-explanation.d.ts +45 -0
  549. package/dist/shell/models/permission-explanation.d.ts.map +1 -0
  550. package/dist/shell/models/permission-explanation.js +14 -0
  551. package/dist/shell/models/session-panel.d.ts +22 -0
  552. package/dist/shell/models/session-panel.d.ts.map +1 -0
  553. package/dist/shell/models/session-panel.js +18 -0
  554. package/dist/shell/models/task-scroll-state.d.ts +24 -0
  555. package/dist/shell/models/task-scroll-state.d.ts.map +1 -0
  556. package/dist/shell/models/task-scroll-state.js +26 -0
  557. package/dist/shell/models/terminal-input-runtime.d.ts +37 -0
  558. package/dist/shell/models/terminal-input-runtime.d.ts.map +1 -0
  559. package/dist/shell/models/terminal-input-runtime.js +18 -0
  560. package/dist/shell/models/transcript-scroll-state.d.ts +57 -0
  561. package/dist/shell/models/transcript-scroll-state.d.ts.map +1 -0
  562. package/dist/shell/models/transcript-scroll-state.js +12 -0
  563. package/dist/shell/models/transcript-selection-state.d.ts +39 -0
  564. package/dist/shell/models/transcript-selection-state.d.ts.map +1 -0
  565. package/dist/shell/models/transcript-selection-state.js +25 -0
  566. package/dist/shell/models/wheel-acceleration.d.ts +52 -0
  567. package/dist/shell/models/wheel-acceleration.d.ts.map +1 -0
  568. package/dist/shell/models/wheel-acceleration.js +6 -0
  569. package/dist/shell/output-utils.d.ts +22 -0
  570. package/dist/shell/output-utils.d.ts.map +1 -0
  571. package/dist/shell/output-utils.js +12 -0
  572. package/dist/shell/plain-renderer.d.ts +12 -0
  573. package/dist/shell/plain-renderer.d.ts.map +1 -0
  574. package/dist/shell/plain-renderer.js +13 -0
  575. package/dist/shell/progress-views.d.ts +10 -0
  576. package/dist/shell/progress-views.d.ts.map +1 -0
  577. package/dist/shell/progress-views.js +17 -0
  578. package/dist/shell/stdout-flush-barrier.d.ts +39 -0
  579. package/dist/shell/stdout-flush-barrier.d.ts.map +1 -0
  580. package/dist/shell/stdout-flush-barrier.js +10 -0
  581. package/dist/shell/terminal-capability.d.ts +54 -0
  582. package/dist/shell/terminal-capability.d.ts.map +1 -0
  583. package/dist/shell/terminal-capability.js +10 -0
  584. package/dist/shell/terminal-interaction-runtime.d.ts +11 -0
  585. package/dist/shell/terminal-interaction-runtime.d.ts.map +1 -0
  586. package/dist/shell/terminal-interaction-runtime.js +38 -0
  587. package/dist/shell/terminal-state-recovery.d.ts +52 -0
  588. package/dist/shell/terminal-state-recovery.d.ts.map +1 -0
  589. package/dist/shell/terminal-state-recovery.js +11 -0
  590. package/dist/shell/text-utils.d.ts +40 -0
  591. package/dist/shell/text-utils.d.ts.map +1 -0
  592. package/dist/shell/text-utils.js +26 -0
  593. package/dist/shell/theme.d.ts +41 -0
  594. package/dist/shell/theme.d.ts.map +1 -0
  595. package/dist/shell/theme.js +8 -0
  596. package/dist/shell/types.d.ts +784 -0
  597. package/dist/shell/types.d.ts.map +1 -0
  598. package/dist/shell/types.js +0 -0
  599. package/dist/shell/view-model.d.ts +82 -0
  600. package/dist/shell/view-model.d.ts.map +1 -0
  601. package/dist/shell/view-model.js +48 -0
  602. package/dist/slash-command-runtime.d.ts +64 -0
  603. package/dist/slash-command-runtime.d.ts.map +1 -0
  604. package/dist/slash-command-runtime.js +186 -0
  605. package/dist/slash-dispatch.d.ts +48 -0
  606. package/dist/slash-dispatch.d.ts.map +1 -0
  607. package/dist/slash-dispatch.js +53 -0
  608. package/dist/startup-runtime.d.ts +48 -0
  609. package/dist/startup-runtime.d.ts.map +1 -0
  610. package/dist/startup-runtime.js +43 -0
  611. package/dist/terminal-readiness-presenter.d.ts +131 -0
  612. package/dist/terminal-readiness-presenter.d.ts.map +1 -0
  613. package/dist/terminal-readiness-presenter.js +16 -0
  614. package/dist/terminal-readiness-runtime.d.ts +5 -0
  615. package/dist/terminal-readiness-runtime.d.ts.map +1 -0
  616. package/dist/terminal-readiness-runtime.js +15 -0
  617. package/dist/terminal-setup-runtime.d.ts +34 -0
  618. package/dist/terminal-setup-runtime.d.ts.map +1 -0
  619. package/dist/terminal-setup-runtime.js +257 -0
  620. package/dist/tool-output-presenter.d.ts +38 -0
  621. package/dist/tool-output-presenter.d.ts.map +1 -0
  622. package/dist/tool-output-presenter.js +16 -0
  623. package/dist/tool-result-budget.d.ts +42 -0
  624. package/dist/tool-result-budget.d.ts.map +1 -0
  625. package/dist/tool-result-budget.js +11 -0
  626. package/dist/tui-agent-job-runtime.d.ts +38 -0
  627. package/dist/tui-agent-job-runtime.d.ts.map +1 -0
  628. package/dist/tui-agent-job-runtime.js +86 -0
  629. package/dist/tui-context-runtime.d.ts +426 -0
  630. package/dist/tui-context-runtime.d.ts.map +1 -0
  631. package/dist/tui-context-runtime.js +65 -0
  632. package/dist/tui-data-types.d.ts +923 -0
  633. package/dist/tui-data-types.d.ts.map +1 -0
  634. package/dist/tui-data-types.js +0 -0
  635. package/dist/tui-details-runtime.d.ts +25 -0
  636. package/dist/tui-details-runtime.d.ts.map +1 -0
  637. package/dist/tui-details-runtime.js +29 -0
  638. package/dist/tui-memory-runtime.d.ts +33 -0
  639. package/dist/tui-memory-runtime.d.ts.map +1 -0
  640. package/dist/tui-memory-runtime.js +58 -0
  641. package/dist/tui-messages.d.ts +4 -0
  642. package/dist/tui-messages.d.ts.map +1 -0
  643. package/dist/tui-messages.js +6 -0
  644. package/dist/tui-model-runtime.d.ts +30 -0
  645. package/dist/tui-model-runtime.d.ts.map +1 -0
  646. package/dist/tui-model-runtime.js +39 -0
  647. package/dist/tui-output-surface.d.ts +141 -0
  648. package/dist/tui-output-surface.d.ts.map +1 -0
  649. package/dist/tui-output-surface.js +55 -0
  650. package/dist/tui-permission-runtime.d.ts +62 -0
  651. package/dist/tui-permission-runtime.d.ts.map +1 -0
  652. package/dist/tui-permission-runtime.js +24 -0
  653. package/dist/tui-state-runtime.d.ts +21 -0
  654. package/dist/tui-state-runtime.d.ts.map +1 -0
  655. package/dist/tui-state-runtime.js +47 -0
  656. package/dist/turn-continuity-runtime.d.ts +30 -0
  657. package/dist/turn-continuity-runtime.d.ts.map +1 -0
  658. package/dist/turn-continuity-runtime.js +8 -0
  659. package/dist/undo-ring.d.ts +16 -0
  660. package/dist/undo-ring.d.ts.map +1 -0
  661. package/dist/undo-ring.js +12 -0
  662. package/dist/usage-stats-presenter.d.ts +17 -0
  663. package/dist/usage-stats-presenter.d.ts.map +1 -0
  664. package/dist/usage-stats-presenter.js +22 -0
  665. package/dist/user-state-signal-runtime.d.ts +33 -0
  666. package/dist/user-state-signal-runtime.d.ts.map +1 -0
  667. package/dist/user-state-signal-runtime.js +8 -0
  668. package/dist/verification-command-runtime.d.ts +25 -0
  669. package/dist/verification-command-runtime.d.ts.map +1 -0
  670. package/dist/verification-command-runtime.js +51 -0
  671. package/dist/verification-level.d.ts +93 -0
  672. package/dist/verification-level.d.ts.map +1 -0
  673. package/dist/verification-level.js +18 -0
  674. package/dist/workflow-agent-runtime-bridge.d.ts +169 -0
  675. package/dist/workflow-agent-runtime-bridge.d.ts.map +1 -0
  676. package/dist/workflow-agent-runtime-bridge.js +9 -0
  677. package/dist/workflow-command-runtime.d.ts +94 -0
  678. package/dist/workflow-command-runtime.d.ts.map +1 -0
  679. package/dist/workflow-command-runtime.js +114 -0
  680. package/dist/workflow-plan-schema.d.ts +161 -0
  681. package/dist/workflow-plan-schema.d.ts.map +1 -0
  682. package/dist/workflow-plan-schema.js +12 -0
  683. package/dist/workflow-planner-entry.d.ts +52 -0
  684. package/dist/workflow-planner-entry.d.ts.map +1 -0
  685. package/dist/workflow-planner-entry.js +328 -0
  686. package/dist/workflow-task-surface.d.ts +39 -0
  687. package/dist/workflow-task-surface.d.ts.map +1 -0
  688. package/dist/workflow-task-surface.js +7 -0
  689. package/dist/workspace-reference-cache.d.ts +110 -0
  690. package/dist/workspace-reference-cache.d.ts.map +1 -0
  691. package/dist/workspace-reference-cache.js +12 -0
  692. package/package.json +41 -0
@@ -0,0 +1,1195 @@
1
+ import {
2
+ formatMcpTools
3
+ } from "./chunk-W6NU7ZAV.js";
4
+ import {
5
+ buildIndexStatusPanel,
6
+ buildMcpStatusPanel,
7
+ formatIndexRefreshSummary,
8
+ formatIndexStatus,
9
+ formatMcpStatus
10
+ } from "./chunk-OF3K3CU5.js";
11
+ import {
12
+ runMcpSseToolCall
13
+ } from "./chunk-SRZIA6B4.js";
14
+ import {
15
+ isPotentiallyMutatingMcpTool,
16
+ runMcpStdioToolCall,
17
+ runMcpStdioToolList
18
+ } from "./chunk-OEYW3JE3.js";
19
+ import {
20
+ createIndexTransientExcludes,
21
+ formatIndexAutoSkipDetails,
22
+ formatIndexAutoSkipNextAction,
23
+ formatIndexAutoSkipPrimary,
24
+ scanIndexSafety,
25
+ summarizeIndexResult
26
+ } from "./chunk-W3KHJNSH.js";
27
+ import {
28
+ showCommandPanel
29
+ } from "./chunk-JO5ANTMR.js";
30
+ import {
31
+ writeDiagnosticLine
32
+ } from "./chunk-ECFLCY5V.js";
33
+ import {
34
+ redactedPath,
35
+ runCommandCapture
36
+ } from "./chunk-RVY34HK4.js";
37
+ import {
38
+ findDeferredTool,
39
+ getCodebaseMemoryToolRisk,
40
+ isCodebaseMemoryToolName,
41
+ isLocalStdioMcpServer,
42
+ listDeferredTools,
43
+ parseMcpDeferredToolName,
44
+ searchDeferredTools,
45
+ summarizeDeferredToolMatch,
46
+ validateCodebaseMemoryToolExecution
47
+ } from "./chunk-I3NTAIMF.js";
48
+ import {
49
+ findCurrentIndexProject,
50
+ readLocalIndexArtifactState
51
+ } from "./chunk-UT2TYK2A.js";
52
+ import {
53
+ createMcpState,
54
+ createMcpToolPlaceholders,
55
+ pathExists
56
+ } from "./chunk-QLRTQHTR.js";
57
+ import {
58
+ diffFreshness
59
+ } from "./chunk-4T5DJW54.js";
60
+ import {
61
+ formatError,
62
+ sanitizeDiagnosticText,
63
+ truncateDisplay,
64
+ writeLine
65
+ } from "./chunk-OMZYPQVA.js";
66
+
67
+ // src/mcp-index-runtime.ts
68
+ import { randomUUID } from "crypto";
69
+ import { readFile } from "fs/promises";
70
+ import { delimiter, dirname, join, resolve } from "path";
71
+ import { fileURLToPath } from "url";
72
+ import {
73
+ removeMcpServerConfig,
74
+ resolveStoragePaths,
75
+ saveMcpServerConfig
76
+ } from "@linghun/config";
77
+ import { TOGGLE_DETAILS_KEYBIND } from "@linghun/shared";
78
+ var CODEBASE_MEMORY_COMMAND = "codebase-memory-mcp";
79
+ var CODEBASE_MEMORY_ENV = "LINGHUN_CODEBASE_MEMORY_MCP";
80
+ var CLI_BUNDLED_ROOT_ENV = "LINGHUN_CLI_BUNDLED_ROOT";
81
+ var CODEBASE_MEMORY_BUNDLED_ENV = "LINGHUN_CODEBASE_MEMORY_BUNDLED_DIR";
82
+ var CODEBASE_MEMORY_BUNDLED_PLATFORM_ARCHES = /* @__PURE__ */ new Set([
83
+ "win32-x64",
84
+ "linux-x64",
85
+ "darwin-arm64",
86
+ "darwin-x64"
87
+ ]);
88
+ var runtimeDeps;
89
+ function configureMcpIndexRuntime(deps2) {
90
+ runtimeDeps = deps2;
91
+ }
92
+ function deps() {
93
+ if (!runtimeDeps) {
94
+ throw new Error("mcp-index-runtime deps not configured");
95
+ }
96
+ return runtimeDeps;
97
+ }
98
+ function refreshCacheFreshness(context) {
99
+ const freshness = deps().getCurrentFreshness(context);
100
+ context.cache.lastFreshness = {
101
+ ...freshness,
102
+ changedKeys: diffFreshness(context.cache.lastFreshness, freshness)
103
+ };
104
+ }
105
+ async function handleMcpCommand(args, context, output) {
106
+ const action = args[0] ?? "status";
107
+ if (action === "status") {
108
+ showCommandPanel(context, output, buildMcpStatusPanel(context));
109
+ return;
110
+ }
111
+ if (action === "tools") {
112
+ context.mcp.tools = stabilizeMcpToolList(context.mcp.tools);
113
+ refreshCacheFreshness(context);
114
+ writeDiagnosticLine(output, formatMcpTools(context.mcp));
115
+ return;
116
+ }
117
+ if (action === "doctor") {
118
+ await runMcpDoctor(context);
119
+ const isEn = context.language === "en-US";
120
+ showCommandPanel(context, output, {
121
+ title: "/mcp doctor",
122
+ tone: "neutral",
123
+ summary: [
124
+ isEn ? `MCP doctor \u2014 ${TOGGLE_DETAILS_KEYBIND} for full diagnostics.` : `MCP \u8BCA\u65AD \u2014 ${TOGGLE_DETAILS_KEYBIND} \u67E5\u770B\u5B8C\u6574\u8BCA\u65AD\u3002`
125
+ ],
126
+ detailsText: formatMcpStatus(context)
127
+ });
128
+ return;
129
+ }
130
+ if (action === "validate") {
131
+ const isEn = context.language === "en-US";
132
+ showCommandPanel(context, output, {
133
+ title: "/mcp validate",
134
+ tone: "neutral",
135
+ summary: [
136
+ isEn ? `MCP validate \u2014 ${TOGGLE_DETAILS_KEYBIND} for details.` : `MCP \u6821\u9A8C \u2014 ${TOGGLE_DETAILS_KEYBIND} \u67E5\u770B\u8BE6\u60C5\u3002`
137
+ ],
138
+ detailsText: validateMcpServers(context, args[1])
139
+ });
140
+ return;
141
+ }
142
+ if (action === "add" || action === "install") {
143
+ const result = await addMcpServer(args.slice(1), context);
144
+ writeLine(output, result);
145
+ return;
146
+ }
147
+ if (action === "enable" || action === "disable") {
148
+ const id = args[1];
149
+ writeLine(
150
+ output,
151
+ id ? await setMcpServerEnabled(id, action === "enable", context) : `\u7528\u6CD5\uFF1A/mcp ${action} <server-id>`
152
+ );
153
+ return;
154
+ }
155
+ if (action === "remove") {
156
+ const id = args[1];
157
+ writeLine(output, id ? await removeMcpServer(id, context) : "\u7528\u6CD5\uFF1A/mcp remove <server-id>");
158
+ return;
159
+ }
160
+ if (action === "update") {
161
+ writeLine(output, await updateMcpServer(args.slice(1), context));
162
+ return;
163
+ }
164
+ writeLine(
165
+ output,
166
+ "\u7528\u6CD5\uFF1A/mcp | /mcp status | /mcp tools | /mcp doctor | /mcp validate [id] | /mcp add local <id> <command> [args...] | /mcp update <id> local <command> [args...] | /mcp enable|disable <id> | /mcp remove <id>"
167
+ );
168
+ }
169
+ async function handleIndexCommand(args, context, output) {
170
+ const action = args[0] ?? "status";
171
+ if (action === "status") {
172
+ await refreshIndexStatus(context, args.includes("--fresh"));
173
+ showCommandPanel(context, output, buildIndexStatusPanel(context));
174
+ if (!context.isInkSession) deps().writeStatus(output, context);
175
+ return;
176
+ }
177
+ if (action === "doctor") {
178
+ await refreshIndexStatus(context, true);
179
+ showCommandPanel(context, output, buildIndexStatusPanel(context));
180
+ if (!context.isInkSession) deps().writeStatus(output, context);
181
+ return;
182
+ }
183
+ if (action === "check") {
184
+ await refreshIndexStatus(context, true);
185
+ showCommandPanel(context, output, buildIndexStatusPanel(context));
186
+ if (!context.isInkSession) deps().writeStatus(output, context);
187
+ return;
188
+ }
189
+ if (action === "init" && args[1] === "fast") {
190
+ const guard = deps().checkBackgroundStartGuard(context, "index", true);
191
+ if (guard) {
192
+ writeLine(output, guard);
193
+ return;
194
+ }
195
+ await runIndexRepository(context, "fast", "init fast", args.includes("--force"), output, {
196
+ guardAlreadyChecked: true
197
+ });
198
+ if (context.index.status === "ready") {
199
+ if (!context.index.safetyWarning) {
200
+ writeLine(output, formatIndexRefreshSummary(context, "init fast"));
201
+ }
202
+ }
203
+ if (!context.isInkSession) deps().writeStatus(output, context);
204
+ return;
205
+ }
206
+ if (action === "refresh") {
207
+ const guard = deps().checkBackgroundStartGuard(context, "index", true);
208
+ if (guard) {
209
+ writeLine(output, guard);
210
+ return;
211
+ }
212
+ await runIndexRepository(
213
+ context,
214
+ context.config.index.mode,
215
+ "refresh",
216
+ args.includes("--force"),
217
+ output,
218
+ { guardAlreadyChecked: true }
219
+ );
220
+ if (context.index.status === "ready") {
221
+ if (!context.index.safetyWarning) {
222
+ writeLine(output, formatIndexRefreshSummary(context, "refresh"));
223
+ }
224
+ }
225
+ if (!context.isInkSession) deps().writeStatus(output, context);
226
+ return;
227
+ }
228
+ if (action === "search") {
229
+ const query = args.slice(1).join(" ").trim();
230
+ if (!query) {
231
+ writeLine(output, "\u7528\u6CD5\uFF1A/index search <query>");
232
+ return;
233
+ }
234
+ const result = await runIndexQuery(context, "search_graph", { query, limit: 5 });
235
+ await recordIndexEvidence(context, `search ${query}`, result.summary);
236
+ showCommandPanel(context, output, {
237
+ title: "/index search",
238
+ tone: result.summary.includes("no matches") && context.index.nodes !== void 0 && context.index.nodes > 0 ? "warning" : "neutral",
239
+ summary: [
240
+ context.language === "en-US" ? `Index search result \u2014 ${TOGGLE_DETAILS_KEYBIND} for details.` : `\u7D22\u5F15\u641C\u7D22\u7ED3\u679C \u2014 ${TOGGLE_DETAILS_KEYBIND} \u67E5\u770B\u8BE6\u60C5\u3002`
241
+ ],
242
+ detailsText: result.summary
243
+ });
244
+ deps().writeStatus(output, context);
245
+ return;
246
+ }
247
+ if (action === "architecture") {
248
+ const result = await runIndexQuery(context, "get_architecture", {});
249
+ await recordIndexEvidence(context, "architecture", result.summary);
250
+ showCommandPanel(context, output, {
251
+ title: "/index architecture",
252
+ tone: "neutral",
253
+ summary: [
254
+ context.language === "en-US" ? `Index architecture summary \u2014 ${TOGGLE_DETAILS_KEYBIND} for details.` : `\u7D22\u5F15\u67B6\u6784\u6458\u8981 \u2014 ${TOGGLE_DETAILS_KEYBIND} \u67E5\u770B\u8BE6\u60C5\u3002`
255
+ ],
256
+ detailsText: result.summary
257
+ });
258
+ deps().writeStatus(output, context);
259
+ return;
260
+ }
261
+ writeLine(
262
+ output,
263
+ "\u7528\u6CD5\uFF1A/index status [--fresh] | /index doctor | /index check | /index search <query> | /index architecture\uFF08\u53EA\u8BFB\uFF09 | /index init fast | /index refresh\uFF08\u9700\u786E\u8BA4\uFF09"
264
+ );
265
+ }
266
+ async function resolveCodebaseMemoryBinary(context) {
267
+ const configured = context.config.mcp.servers["codebase-memory"];
268
+ const configuredCommand = configured?.command?.trim();
269
+ const configuredArgs = configured?.args ?? [];
270
+ const envCommand = process.env[CODEBASE_MEMORY_ENV]?.trim();
271
+ if (envCommand) {
272
+ const spec = await codebaseMemoryCommandSpec(envCommand, []);
273
+ return probeCodebaseMemoryBinary(spec.command, spec.args, "env", context, spec.detailPath);
274
+ }
275
+ if (configuredCommand && configuredCommand !== CODEBASE_MEMORY_COMMAND) {
276
+ const spec = await codebaseMemoryCommandSpec(configuredCommand, configuredArgs);
277
+ return probeCodebaseMemoryBinary(spec.command, spec.args, "env", context, spec.detailPath);
278
+ }
279
+ const bundled = await findBundledCodebaseMemoryBinary();
280
+ if (bundled) {
281
+ return probeCodebaseMemoryBinary(
282
+ bundled.command,
283
+ bundled.args,
284
+ "bundled",
285
+ context,
286
+ bundled.detailPath
287
+ );
288
+ }
289
+ const managed = await findManagedCodebaseMemoryBinary(context);
290
+ if (managed) {
291
+ return probeCodebaseMemoryBinary(
292
+ managed.command,
293
+ managed.args,
294
+ "managed",
295
+ context,
296
+ managed.detailPath
297
+ );
298
+ }
299
+ const pathBinary = await findPathCodebaseMemoryBinary();
300
+ if (pathBinary) {
301
+ return probeCodebaseMemoryBinary(
302
+ pathBinary.command,
303
+ pathBinary.args,
304
+ "path",
305
+ context,
306
+ pathBinary.detailPath
307
+ );
308
+ }
309
+ const pathProbe = await probeCodebaseMemoryBinary(CODEBASE_MEMORY_COMMAND, [], "path", context);
310
+ if (pathProbe.status === "missing") {
311
+ return { ...pathProbe, source: "missing" };
312
+ }
313
+ return pathProbe;
314
+ }
315
+ async function codebaseMemoryCommandSpec(command, args) {
316
+ const lowerCommand = command.toLowerCase();
317
+ if (lowerCommand.endsWith(".cjs")) {
318
+ return { command: process.execPath, args: [command, ...args], detailPath: command };
319
+ }
320
+ if (process.platform === "win32" && (lowerCommand.endsWith(".cmd") || lowerCommand.endsWith(".bat"))) {
321
+ const script = await resolveWindowsShimNodeScript(command);
322
+ if (script) {
323
+ return {
324
+ command: process.execPath,
325
+ args: [script, ...args],
326
+ detailPath: command
327
+ };
328
+ }
329
+ return {
330
+ command: "cmd.exe",
331
+ args: ["/d", "/c", "call", command, ...args],
332
+ detailPath: command
333
+ };
334
+ }
335
+ if (process.platform === "win32" && lowerCommand.endsWith(".ps1")) {
336
+ const script = await resolveWindowsShimNodeScript(command);
337
+ if (script) {
338
+ return {
339
+ command: process.execPath,
340
+ args: [script, ...args],
341
+ detailPath: command
342
+ };
343
+ }
344
+ return {
345
+ command: "powershell.exe",
346
+ args: ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", command, ...args],
347
+ detailPath: command
348
+ };
349
+ }
350
+ return { command, args, detailPath: command };
351
+ }
352
+ async function resolveWindowsShimNodeScript(command) {
353
+ let content;
354
+ try {
355
+ content = await readFile(command, "utf8");
356
+ } catch {
357
+ return void 0;
358
+ }
359
+ const dir = dirname(command);
360
+ const patterns = [
361
+ /(?:node\.exe|node)["']?\s+"([^"]+\.(?:cjs|mjs|js))"/iu,
362
+ /(?:node\.exe|node)["']?\s+'([^']+\.(?:cjs|mjs|js))'/iu,
363
+ /(?:node\.exe|node)["']?\s+([^\s"'`]+\.(?:cjs|mjs|js))/iu
364
+ ];
365
+ for (const pattern of patterns) {
366
+ const raw = pattern.exec(content)?.[1];
367
+ if (!raw) continue;
368
+ return resolveShimTarget(dir, raw);
369
+ }
370
+ const ps1Match = /(?:&\s*)?\$basedir[\\/ ]*["']?([^"'\r\n]+?\.(?:cjs|mjs|js))["']?/iu.exec(
371
+ content
372
+ )?.[1];
373
+ return ps1Match ? resolveShimTarget(dir, ps1Match) : void 0;
374
+ }
375
+ function resolveShimTarget(dir, rawTarget) {
376
+ const expanded = rawTarget.replace(/%~dp0/giu, dir.endsWith("\\") || dir.endsWith("/") ? dir : `${dir}\\`).replace(/\$basedir/giu, dir);
377
+ return resolve(dir, expanded.replace(/^["']|["']$/g, ""));
378
+ }
379
+ async function findManagedCodebaseMemoryBinary(context) {
380
+ const paths = resolveStoragePaths(context.config, context.projectPath);
381
+ const candidates = [
382
+ join(context.projectPath, ".linghun", "bin", CODEBASE_MEMORY_COMMAND),
383
+ join(paths.index, "bin", CODEBASE_MEMORY_COMMAND),
384
+ join(paths.userData, "bin", CODEBASE_MEMORY_COMMAND)
385
+ ];
386
+ return findCodebaseMemoryBinaryCandidate(candidates);
387
+ }
388
+ async function findBundledCodebaseMemoryBinary() {
389
+ const roots = getBundledCodebaseMemoryRoots();
390
+ const platformArch = getCodebaseMemoryPlatformArch();
391
+ if (!CODEBASE_MEMORY_BUNDLED_PLATFORM_ARCHES.has(platformArch)) {
392
+ return void 0;
393
+ }
394
+ const names = platformArch.startsWith("win32") ? [`${CODEBASE_MEMORY_COMMAND}.exe`, `${CODEBASE_MEMORY_COMMAND}.cjs`] : [CODEBASE_MEMORY_COMMAND, `${CODEBASE_MEMORY_COMMAND}.cjs`];
395
+ for (const root of roots) {
396
+ for (const name of names) {
397
+ const candidate = join(root, platformArch, name);
398
+ if (await pathExists(candidate)) {
399
+ return codebaseMemoryCommandSpec(candidate, []);
400
+ }
401
+ }
402
+ }
403
+ return void 0;
404
+ }
405
+ function getBundledCodebaseMemoryRoots() {
406
+ const roots = [];
407
+ if (process.env[CODEBASE_MEMORY_BUNDLED_ENV]) {
408
+ roots.push(process.env[CODEBASE_MEMORY_BUNDLED_ENV]);
409
+ }
410
+ if (process.env[CLI_BUNDLED_ROOT_ENV]) {
411
+ roots.push(join(process.env[CLI_BUNDLED_ROOT_ENV], "codebase-memory"));
412
+ }
413
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
414
+ roots.push(join(moduleDir, "..", "bundled", "codebase-memory"));
415
+ roots.push(join(moduleDir, "bundled", "codebase-memory"));
416
+ return roots;
417
+ }
418
+ function getCodebaseMemoryPlatformArch() {
419
+ const override = process.env.LINGHUN_CODEBASE_MEMORY_PLATFORM_ARCH_TEST;
420
+ if (override && CODEBASE_MEMORY_BUNDLED_PLATFORM_ARCHES.has(override)) {
421
+ return override;
422
+ }
423
+ return `${process.platform}-${process.arch}`;
424
+ }
425
+ async function findPathCodebaseMemoryBinary() {
426
+ const pathDirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
427
+ const candidates = pathDirs.map((dir) => join(dir, CODEBASE_MEMORY_COMMAND));
428
+ return findCodebaseMemoryBinaryCandidate(candidates);
429
+ }
430
+ async function findCodebaseMemoryBinaryCandidate(candidates) {
431
+ const suffixes = process.platform === "win32" ? [".cmd", ".exe", ".ps1", ".cjs", ""] : [".cjs", ""];
432
+ for (const candidate of candidates) {
433
+ for (const suffix of suffixes) {
434
+ const path = `${candidate}${suffix}`;
435
+ if (!await pathExists(path)) {
436
+ continue;
437
+ }
438
+ return await codebaseMemoryCommandSpec(path, []);
439
+ }
440
+ }
441
+ return void 0;
442
+ }
443
+ async function probeCodebaseMemoryBinary(command, args, source, context, detailPath = command) {
444
+ const result = await runCommandCapture(
445
+ command,
446
+ [...args, "--version"],
447
+ context.projectPath,
448
+ 5e3
449
+ );
450
+ if (result.errorCode === "ENOENT") {
451
+ return {
452
+ command,
453
+ args,
454
+ source,
455
+ status: "missing",
456
+ detailPath,
457
+ summary: "codebase-memory binary not found"
458
+ };
459
+ }
460
+ if (result.exitCode !== 0) {
461
+ return {
462
+ command,
463
+ args,
464
+ source,
465
+ status: "corrupt",
466
+ detailPath,
467
+ summary: `codebase-memory --version failed: ${result.summary}`
468
+ };
469
+ }
470
+ const version = extractCodebaseMemoryVersion(result.stdout || result.stderr);
471
+ if (!version) {
472
+ return {
473
+ command,
474
+ args,
475
+ source,
476
+ status: "unsupported",
477
+ detailPath,
478
+ summary: "codebase-memory --version did not return a supported version string"
479
+ };
480
+ }
481
+ return {
482
+ command,
483
+ args,
484
+ source,
485
+ status: "ready",
486
+ version,
487
+ detailPath,
488
+ summary: "codebase-memory binary ready"
489
+ };
490
+ }
491
+ function extractCodebaseMemoryVersion(output) {
492
+ const compact = output.replace(/\s+/g, " ").trim();
493
+ const version = compact.match(/\b\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?\b/)?.[0];
494
+ if (!version) {
495
+ return void 0;
496
+ }
497
+ return version;
498
+ }
499
+ function rememberCodebaseMemoryResolution(context, resolution) {
500
+ context.index.binarySource = resolution.source;
501
+ context.index.binaryStatus = resolution.status;
502
+ context.index.binaryVersion = resolution.version;
503
+ context.index.binaryCommand = redactedPath(resolution.detailPath);
504
+ context.index.runtime = resolution.source === "bundled" ? "bundled codebase-memory" : resolution.source === "managed" ? "Linghun-managed codebase-memory" : resolution.source === "path" ? "external fallback from PATH" : resolution.source === "env" ? "explicit codebase-memory override" : "missing codebase-memory runtime";
505
+ }
506
+ async function getCodebaseMemoryResolution(context) {
507
+ const resolution = await resolveCodebaseMemoryBinary(context);
508
+ rememberCodebaseMemoryResolution(context, resolution);
509
+ return resolution;
510
+ }
511
+ async function runMcpDoctor(context) {
512
+ for (const server of context.mcp.servers) {
513
+ if (server.status === "disabled") {
514
+ continue;
515
+ }
516
+ if (server.name !== "codebase-memory") {
517
+ const result = await runCommandCapture(
518
+ server.command,
519
+ ["--version"],
520
+ context.projectPath,
521
+ 5e3
522
+ );
523
+ if (result.exitCode === 0) {
524
+ server.status = "configured";
525
+ server.error = void 0;
526
+ continue;
527
+ }
528
+ server.status = result.errorCode === "ENOENT" ? "missing" : "error";
529
+ server.error = result.summary;
530
+ continue;
531
+ }
532
+ const resolution = await getCodebaseMemoryResolution(context);
533
+ server.command = redactedPath(resolution.detailPath);
534
+ server.status = resolution.status === "ready" ? "configured" : resolution.status === "missing" ? "missing" : "error";
535
+ server.error = resolution.status === "ready" ? void 0 : resolution.summary;
536
+ }
537
+ context.mcp.lastDoctor = (/* @__PURE__ */ new Date()).toISOString();
538
+ const discoveredTools = [];
539
+ for (const server of context.mcp.servers) {
540
+ if (server.status !== "configured") continue;
541
+ if (server.name === "codebase-memory") {
542
+ discoveredTools.push(...createMcpToolPlaceholders(server.name, "discovered"));
543
+ continue;
544
+ }
545
+ const serverConfig = context.config.mcp.servers[server.name];
546
+ if (!isLocalStdioMcpServer(serverConfig)) {
547
+ discoveredTools.push(...createMcpToolPlaceholders(server.name, "discovered"));
548
+ continue;
549
+ }
550
+ const listResult = await runMcpStdioToolList(
551
+ serverConfig,
552
+ context.projectPath
553
+ );
554
+ if (listResult.ok && listResult.toolNames.length > 0) {
555
+ for (const toolName of listResult.toolNames) {
556
+ discoveredTools.push({
557
+ server: server.name,
558
+ name: toolName,
559
+ description: `MCP tool ${server.name}:${toolName}`,
560
+ discovery: "discovered",
561
+ trusted: true,
562
+ schemaLoaded: true,
563
+ runtimeVersion: "compatible"
564
+ });
565
+ }
566
+ } else {
567
+ discoveredTools.push({
568
+ server: server.name,
569
+ name: `${server.name}.status`,
570
+ description: `MCP server tools/list failed: ${truncateDisplay(listResult.summary, 80)}`,
571
+ discovery: "placeholder",
572
+ trusted: false,
573
+ schemaLoaded: false,
574
+ runtimeVersion: "unknown"
575
+ });
576
+ }
577
+ }
578
+ context.mcp.tools = stabilizeMcpToolList(discoveredTools);
579
+ refreshCacheFreshness(context);
580
+ }
581
+ function validateMcpServers(context, id) {
582
+ const servers = id ? context.mcp.servers.filter((server) => server.name === id) : context.mcp.servers;
583
+ if (servers.length === 0) {
584
+ return id ? `\u672A\u627E\u5230 MCP server\uFF1A${id}` : "\u6CA1\u6709 MCP server \u914D\u7F6E\u3002";
585
+ }
586
+ return [
587
+ "MCP validate",
588
+ ...servers.map((server) => {
589
+ const config = context.config.mcp.servers[server.name];
590
+ const problems = [];
591
+ if (!config) problems.push("not registered");
592
+ if (server.status === "disabled") problems.push("disabled");
593
+ if (server.status === "missing") problems.push("missing binary");
594
+ if (server.status === "error") problems.push("doctor error");
595
+ if (config?.trustLevel === "untrusted") problems.push("untrusted");
596
+ return `- ${server.name}: ${problems.length === 0 ? "ok" : problems.join("; ")}; source ${config?.sourceUrl ? sanitizeDiagnosticText(config.sourceUrl) : redactedPath(config?.localPath ?? config?.command)}; ref ${config?.ref ?? "-"}; commit ${config?.commit ?? "-"}; permissions ${config?.permissionSummary ?? "tool-discovery"}; next ${problems.length === 0 ? "tools/status available" : "run /mcp doctor, then validate/enable after fixing"}`;
597
+ })
598
+ ].join("\n");
599
+ }
600
+ async function addMcpServer(args, context) {
601
+ const [source, id, command, ...commandArgs] = args;
602
+ if (source === "sse" && id && command) {
603
+ const server2 = {
604
+ command: "",
605
+ url: command,
606
+ transport: "sse",
607
+ sourceUrl: command,
608
+ scope: "project",
609
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
610
+ disabled: true,
611
+ trustLevel: "untrusted",
612
+ permissionSummary: "tool-discovery"
613
+ };
614
+ context.config = await saveMcpServerConfig(id, server2, false, context.projectPath);
615
+ context.mcp = createMcpState(context.config);
616
+ refreshCacheFreshness(context);
617
+ return `\u5DF2\u6DFB\u52A0 MCP SSE server\uFF1A${id}\uFF1B\u9ED8\u8BA4 untrusted/disabled\uFF0C\u672A\u8FDE\u63A5\u8FDC\u7A0B endpoint\u3002\u4E0B\u4E00\u6B65\u8FD0\u884C /mcp validate ${id}\uFF1B\u786E\u8BA4\u4FE1\u4EFB\u540E\u518D\u8FD0\u884C /mcp enable ${id}\u3002`;
618
+ }
619
+ if (source !== "local" || !id || !command) {
620
+ return [
621
+ "MCP add\uFF08Connect Lite\uFF09",
622
+ "- usage: /mcp add local <server-id> <command> [args...]",
623
+ "- usage: /mcp add sse <server-id> <url>",
624
+ "- \u672C\u9636\u6BB5 MCP \u652F\u6301\u672C\u5730 command \u4E0E SSE endpoint metadata\uFF1BGit/GitHub install \u53EA\u7528\u4E8E skills/plugins\u3002",
625
+ "- add \u53EA\u5199\u6765\u6E90/\u6743\u9650\u8BB0\u5F55\uFF0C\u4E0D\u6267\u884C server\uFF1B\u8FD0\u884C /mcp doctor \u624D\u505A\u53D7\u63A7 --version \u8BCA\u65AD\u3002"
626
+ ].join("\n");
627
+ }
628
+ const server = {
629
+ command,
630
+ args: commandArgs,
631
+ localPath: command,
632
+ scope: "project",
633
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
634
+ disabled: true,
635
+ trustLevel: "untrusted",
636
+ permissionSummary: "tool-discovery"
637
+ };
638
+ context.config = await saveMcpServerConfig(id, server, false, context.projectPath);
639
+ context.mcp = createMcpState(context.config);
640
+ refreshCacheFreshness(context);
641
+ return `\u5DF2\u6DFB\u52A0 MCP server\uFF1A${id}\uFF1B\u9ED8\u8BA4 untrusted/disabled\uFF0C\u672A\u6267\u884C server\u3002\u4E0B\u4E00\u6B65\u8FD0\u884C /mcp validate ${id} \u6216 /mcp doctor\uFF1B\u786E\u8BA4\u4FE1\u4EFB\u540E\u518D\u8FD0\u884C /mcp enable ${id}\u3002`;
642
+ }
643
+ async function setMcpServerEnabled(id, enabled, context) {
644
+ const current = context.config.mcp.servers[id];
645
+ if (!current) {
646
+ return `\u672A\u627E\u5230 MCP server\uFF1A${id}`;
647
+ }
648
+ const nextTrustLevel = enabled ? "trusted" : "disabled";
649
+ context.config = await saveMcpServerConfig(
650
+ id,
651
+ { ...current, disabled: !enabled, trustLevel: nextTrustLevel },
652
+ enabled,
653
+ context.projectPath
654
+ );
655
+ context.mcp = createMcpState(context.config);
656
+ refreshCacheFreshness(context);
657
+ const trustNotice = enabled ? "Trust notice\uFF1A\u5373\u5C06\u542F\u7528\u672C\u5730 MCP server\uFF1BLinghun \u4E0D\u4F1A\u5728 enable \u65F6\u6267\u884C server\uFF0C\u4F46\u540E\u7EED tools/call \u4ECD\u5FC5\u987B\u7ECF\u8FC7 discovery/schema/required-args \u548C\u6743\u9650\u7BA1\u9053\u3002" : "";
658
+ return [
659
+ trustNotice,
660
+ `${enabled ? "\u5DF2\u542F\u7528" : "\u5DF2\u7981\u7528"} MCP server\uFF1A${id}\uFF1B\u5931\u8D25\u53EF\u901A\u8FC7 /mcp doctor \u9694\u79BB\u8BCA\u65AD\u3002`
661
+ ].filter(Boolean).join("\n");
662
+ }
663
+ async function updateMcpServer(args, context) {
664
+ const [id, source, command, ...commandArgs] = args;
665
+ const current = id ? context.config.mcp.servers[id] : void 0;
666
+ if (!id || source !== "local" && source !== "sse" || !command) {
667
+ return "\u7528\u6CD5\uFF1A/mcp update <server-id> local <command> [args...] \u6216 /mcp update <server-id> sse <url>\uFF1BConnect Lite \u4E0D\u6267\u884C server\uFF0C\u53EA\u66F4\u65B0 metadata\u3002";
668
+ }
669
+ if (!current) {
670
+ return `\u672A\u627E\u5230 MCP server\uFF1A${id}`;
671
+ }
672
+ if (source === "sse") {
673
+ const server2 = {
674
+ ...current,
675
+ command: "",
676
+ args: [],
677
+ url: command,
678
+ transport: "sse",
679
+ sourceUrl: command,
680
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
681
+ disabled: current.disabled ?? !context.config.mcp.enabledServers.includes(id),
682
+ trustLevel: current.trustLevel ?? (current.disabled ? "disabled" : "untrusted"),
683
+ permissionSummary: current.permissionSummary ?? "tool-discovery"
684
+ };
685
+ context.config = await saveMcpServerConfig(id, server2, !server2.disabled, context.projectPath);
686
+ context.mcp = createMcpState(context.config);
687
+ refreshCacheFreshness(context);
688
+ return `\u5DF2\u66F4\u65B0 MCP SSE server\uFF1A${id}\uFF1B\u53EA\u66F4\u65B0 endpoint metadata\uFF0C\u672A\u8FDE\u63A5\u8FDC\u7A0B server\u3002\u4E0B\u4E00\u6B65\u8FD0\u884C /mcp validate ${id} \u6216 /mcp doctor\u3002`;
689
+ }
690
+ const server = {
691
+ ...current,
692
+ command,
693
+ args: commandArgs,
694
+ localPath: command,
695
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
696
+ disabled: current.disabled ?? !context.config.mcp.enabledServers.includes(id),
697
+ trustLevel: current.trustLevel ?? (current.disabled ? "disabled" : "untrusted"),
698
+ permissionSummary: current.permissionSummary ?? "tool-discovery"
699
+ };
700
+ context.config = await saveMcpServerConfig(id, server, !server.disabled, context.projectPath);
701
+ context.mcp = createMcpState(context.config);
702
+ refreshCacheFreshness(context);
703
+ return `\u5DF2\u66F4\u65B0 MCP server\uFF1A${id}\uFF1B\u53EA\u66F4\u65B0\u672C\u5730 command metadata\uFF0C\u672A\u6267\u884C server\u3002\u4E0B\u4E00\u6B65\u8FD0\u884C /mcp validate ${id} \u6216 /mcp doctor\u3002`;
704
+ }
705
+ async function removeMcpServer(id, context) {
706
+ if (!context.config.mcp.servers[id]) {
707
+ return `\u672A\u627E\u5230 MCP server\uFF1A${id}`;
708
+ }
709
+ context.config = await removeMcpServerConfig(id, context.projectPath);
710
+ context.mcp = createMcpState(context.config);
711
+ refreshCacheFreshness(context);
712
+ return `\u5DF2\u79FB\u9664 MCP server\uFF1A${id}\uFF1B\u5DF2\u6709\u666E\u901A\u804A\u5929\u548C\u672C\u5730\u5DE5\u5177\u4E0D\u53D7\u5F71\u54CD\u3002`;
713
+ }
714
+ async function refreshIndexStatus(context, fresh = false) {
715
+ if (!context.index.enabled) {
716
+ context.index.status = "disabled";
717
+ context.index.artifactStatus = "disabled";
718
+ context.index.error = "codebase index is disabled in settings.";
719
+ context.index.projectName = void 0;
720
+ context.index.projectSelectionSource = "missing";
721
+ context.index.safetyRiskyFiles = void 0;
722
+ context.index.safetyAction = void 0;
723
+ return;
724
+ }
725
+ await refreshLocalIndexArtifactState(context);
726
+ const resolution = await getCodebaseMemoryResolution(context);
727
+ if (resolution.status !== "ready") {
728
+ context.index.status = context.index.artifactStatus === "ready" ? "unknown-project" : context.index.artifactStatus === "corrupt" ? "error" : "missing";
729
+ const artifactError = context.index.error;
730
+ context.index.artifactStatus = context.index.artifactStatus ?? "unknown";
731
+ context.index.error = `${resolution.summary}\u3002\u666E\u901A\u804A\u5929\u4E0D\u53D7\u5F71\u54CD\uFF1B\u5982\u9700\u7D22\u5F15\uFF0C\u8BF7\u914D\u7F6E ${CODEBASE_MEMORY_ENV} \u6216\u5B89\u88C5 Linghun-managed codebase-memory\u3002`;
732
+ if (context.index.status === "error" && artifactError) {
733
+ context.index.error = artifactError;
734
+ }
735
+ if (context.index.status === "missing") context.index.projectName = void 0;
736
+ context.index.projectSelectionSource = "missing";
737
+ context.index.safetyRiskyFiles = void 0;
738
+ context.index.safetyAction = void 0;
739
+ return;
740
+ }
741
+ const projects = await runCodebaseMemoryCli(context, "list_projects", {}, context.projectPath);
742
+ if (!projects.ok) {
743
+ context.index.status = projects.errorCode === "ENOENT" ? "missing" : "error";
744
+ context.index.artifactStatus = projects.errorCode === "ENOENT" ? "missing" : "corrupt";
745
+ context.index.error = projects.summary;
746
+ context.index.projectName = void 0;
747
+ context.index.projectSelectionSource = "missing";
748
+ context.index.safetyRiskyFiles = void 0;
749
+ context.index.safetyAction = void 0;
750
+ return;
751
+ }
752
+ const project = findCurrentIndexProject(projects.data, context.projectPath);
753
+ if (!project) {
754
+ await refreshLocalIndexArtifactState(context);
755
+ context.index.status = context.index.artifactStatus === "ready" ? "unknown-project" : context.index.artifactStatus === "corrupt" ? "error" : "missing";
756
+ context.index.artifactStatus = context.index.artifactStatus === "ready" || context.index.artifactStatus === "corrupt" ? context.index.artifactStatus : "missing";
757
+ context.index.projectSelectionSource = "missing";
758
+ context.index.error = context.index.status === "error" ? context.index.error ?? "\u672C\u5730 codebase-memory artifact \u635F\u574F\u3002" : context.index.status === "unknown-project" ? "\u68C0\u6D4B\u5230\u672C\u5730 .codebase-memory/graph.db.zst\uFF0C\u4F46 codebase-memory list_projects \u672A\u80FD\u5339\u914D\u5F53\u524D\u9879\u76EE\u3002\u8BF7\u8FD0\u884C /index status --fresh \u6216 /index refresh \u91CD\u65B0\u7ED1\u5B9A\u9879\u76EE\u3002" : "\u672A\u627E\u5230\u5F53\u524D\u9879\u76EE\u7D22\u5F15\u3002\u8BF7\u8FD0\u884C /index init fast \u5EFA\u7ACB\u7D22\u5F15\u3002";
759
+ context.index.safetyRiskyFiles = void 0;
760
+ context.index.safetyAction = void 0;
761
+ return;
762
+ }
763
+ context.index.projectName = project.name;
764
+ context.index.artifactPath = project.rootPath;
765
+ context.index.projectSelectionSource = project.source;
766
+ const status = await runCodebaseMemoryCli(
767
+ context,
768
+ "index_status",
769
+ { project: project.name },
770
+ context.projectPath
771
+ );
772
+ if (!status.ok) {
773
+ context.index.status = "error";
774
+ context.index.artifactStatus = "corrupt";
775
+ context.index.error = status.summary;
776
+ context.index.safetyRiskyFiles = void 0;
777
+ context.index.safetyAction = void 0;
778
+ return;
779
+ }
780
+ const data = status.data;
781
+ context.index.status = data.status === "ready" ? "ready" : "stale";
782
+ context.index.artifactStatus = data.status === "ready" ? "ready" : "stale";
783
+ context.index.nodes = data.nodes;
784
+ context.index.edges = data.edges;
785
+ context.index.error = void 0;
786
+ context.index.changedFiles = void 0;
787
+ context.index.staleHint = fresh ? void 0 : "fast status\uFF1A\u672A\u8FD0\u884C detect_changes\uFF1B\u9700\u8981\u65B0\u9C9C\u5EA6\u68C0\u67E5\u8BF7\u7528 /index status --fresh \u6216 /index check\u3002";
788
+ context.index.safetyWarning = void 0;
789
+ context.index.safetyRiskyFiles = void 0;
790
+ context.index.safetyAction = void 0;
791
+ if (fresh) {
792
+ await refreshIndexStaleHint(context, project.name);
793
+ }
794
+ }
795
+ async function refreshLocalIndexArtifactState(context) {
796
+ const artifact = await readLocalIndexArtifactState(context.projectPath);
797
+ context.index.artifactStatus = artifact.status === "ready" ? "ready" : artifact.status;
798
+ context.index.artifactPath = artifact.artifactPath;
799
+ if (artifact.status === "ready") {
800
+ context.index.projectName = context.index.projectName ?? artifact.projectName;
801
+ context.index.nodes = context.index.nodes ?? artifact.nodes;
802
+ context.index.edges = context.index.edges ?? artifact.edges;
803
+ context.index.indexedAt = context.index.indexedAt ?? artifact.indexedAt;
804
+ return;
805
+ }
806
+ if (artifact.status === "corrupt") {
807
+ context.index.error = artifact.error;
808
+ }
809
+ }
810
+ async function refreshIndexStaleHint(context, projectName) {
811
+ const changes = await runCodebaseMemoryCli(
812
+ context,
813
+ "detect_changes",
814
+ { project: projectName },
815
+ context.projectPath,
816
+ 15e3
817
+ );
818
+ if (!changes.ok) {
819
+ context.index.staleHint = `detect_changes \u4E0D\u53EF\u7528\uFF1A${changes.summary}\u3002/index status \u4ECD\u6309 index_status \u5C55\u793A\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u5237\u65B0\u3002`;
820
+ return;
821
+ }
822
+ const data = changes.data;
823
+ const changedCount = typeof data.changed_count === "number" ? data.changed_count : Array.isArray(data.changed_files) ? data.changed_files.length : 0;
824
+ context.index.changedFiles = changedCount;
825
+ if (changedCount > 0) {
826
+ context.index.status = "stale";
827
+ context.index.artifactStatus = "stale";
828
+ context.index.staleHint = `detect_changes \u53D1\u73B0 ${changedCount} \u4E2A\u53D8\u66F4\u6587\u4EF6\uFF0C\u5EFA\u8BAE\u8FD0\u884C /index refresh\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u5237\u65B0\u3002`;
829
+ return;
830
+ }
831
+ context.index.staleHint = "detect_changes \u672A\u53D1\u73B0\u53D8\u66F4\uFF1B/index refresh \u4ECD\u53EA\u5728\u7528\u6237\u663E\u5F0F\u6267\u884C\u65F6\u8FD0\u884C\u3002";
832
+ }
833
+ async function runIndexRepository(context, mode, actionLabel, force, output, options = {}) {
834
+ if (!options.guardAlreadyChecked) {
835
+ const guard = deps().checkBackgroundStartGuard(context, "index", true);
836
+ if (guard) {
837
+ context.index.status = "error";
838
+ context.index.error = guard;
839
+ writeLine(output, guard);
840
+ return;
841
+ }
842
+ }
843
+ const safety = await scanIndexSafety(context.projectPath);
844
+ const transientExcludes = !force && safety.riskyFiles.length > 0 ? createIndexTransientExcludes(safety) : [];
845
+ context.index.safetyWarning = void 0;
846
+ context.index.safetyRiskyFiles = safety.riskyFiles.length > 0 ? safety.riskyFiles : void 0;
847
+ context.index.safetyAction = safety.riskyFiles.length > 0 ? actionLabel : void 0;
848
+ context.index.error = void 0;
849
+ context.index.status = "indexing";
850
+ if (transientExcludes.length > 0) {
851
+ await recordIndexEvidence(
852
+ context,
853
+ `auto-skip:${actionLabel}`,
854
+ formatIndexAutoSkipDetails(safety, actionLabel, context.language),
855
+ transientExcludes.map((file) => `skipped_file:${file}`)
856
+ );
857
+ }
858
+ const now = (/* @__PURE__ */ new Date()).toISOString();
859
+ const task = {
860
+ id: `index-${randomUUID().slice(0, 8)}`,
861
+ kind: "index",
862
+ title: `Index ${actionLabel}`,
863
+ status: "running",
864
+ currentStep: "index_repository",
865
+ progress: { completed: 0, total: 1, label: "index" },
866
+ startedAt: now,
867
+ updatedAt: now,
868
+ heartbeatIntervalMs: 3e4,
869
+ staleAfterMs: 12e4,
870
+ hasOutput: false,
871
+ userVisibleSummary: `\u7D22\u5F15${actionLabel === "refresh" ? "\u5237\u65B0" : "\u521D\u59CB\u5316"}\u6B63\u5728\u6267\u884C\u3002`,
872
+ nextAction: "\u7B49\u5F85\u5B8C\u6210\uFF0C\u6216\u7528 /interrupt \u6807\u8BB0\u53D6\u6D88\u540E\u68C0\u67E5 /index status\u3002"
873
+ };
874
+ const sessionId = await deps().ensureSession(context);
875
+ deps().rememberBackgroundTask(context, task);
876
+ await deps().appendBackgroundTaskEvent(context, sessionId, task);
877
+ const result = await runCodebaseMemoryCli(
878
+ context,
879
+ "index_repository",
880
+ {
881
+ repo_path: context.projectPath,
882
+ mode,
883
+ persistence: true,
884
+ ...transientExcludes.length > 0 ? {
885
+ transient_exclude_paths: transientExcludes,
886
+ skip_paths: transientExcludes
887
+ } : {}
888
+ },
889
+ context.projectPath,
890
+ 12e4
891
+ );
892
+ const endedAt = (/* @__PURE__ */ new Date()).toISOString();
893
+ task.updatedAt = endedAt;
894
+ task.lastOutputAt = endedAt;
895
+ task.hasOutput = Boolean(result.ok || result.summary);
896
+ if (!result.ok) {
897
+ context.index.status = result.errorCode === "ENOENT" ? "missing" : "error";
898
+ context.index.error = `${result.summary}\u3002\u8BF7\u786E\u8BA4\u7D22\u5F15\u8FD0\u884C\u65F6\u53EF\u7528\uFF0C\u4FEE\u590D\u540E\u91CD\u8BD5\u3002`;
899
+ task.status = result.summary.includes("\u547D\u4EE4\u8D85\u65F6") ? "timeout" : "failed";
900
+ task.result = task.status === "timeout" ? "timeout" : "fail";
901
+ task.currentStep = task.status === "timeout" ? "timeout" : "index failed";
902
+ task.progress = { completed: 1, total: 1, label: "index" };
903
+ task.userVisibleSummary = `Index ${task.status}: ${context.index.error}`;
904
+ task.nextAction = "\u67E5\u770B /index status\uFF0C\u4FEE\u590D runtime/artifact \u540E\u91CD\u8BD5\uFF1B\u4E0D\u5F97\u58F0\u79F0\u7D22\u5F15\u5237\u65B0\u6210\u529F\u3002";
905
+ await deps().appendBackgroundTaskEvent(context, sessionId, task);
906
+ writeLine(output, `Index: ${context.index.status}. ${context.index.error}`);
907
+ return;
908
+ }
909
+ await refreshIndexStatus(context);
910
+ const statusAfterRefresh = context.index.status;
911
+ if (statusAfterRefresh === "missing" || statusAfterRefresh === "unknown" || statusAfterRefresh === "error") {
912
+ context.index.status = "refresh_completed_but_unverified";
913
+ context.index.artifactStatus = "stale";
914
+ context.index.indexedAt = (/* @__PURE__ */ new Date()).toISOString();
915
+ context.index.error = void 0;
916
+ context.index.staleHint = context.language === "en-US" ? "Index refresh command completed, but status read-back/freshness was not verified. Run /index status --fresh to confirm." : "\u7D22\u5F15\u5237\u65B0\u547D\u4EE4\u5DF2\u5B8C\u6210\uFF0C\u4F46\u72B6\u6001\u8BFB\u56DE/\u65B0\u9C9C\u5EA6\u5C1A\u672A\u9A8C\u8BC1\u3002\u8FD0\u884C /index status --fresh \u53EF\u786E\u8BA4\u3002";
917
+ } else {
918
+ context.index.indexedAt = (/* @__PURE__ */ new Date()).toISOString();
919
+ }
920
+ task.status = "completed";
921
+ task.result = "pass";
922
+ task.currentStep = "index finished";
923
+ task.progress = { completed: 1, total: 1, label: "index" };
924
+ task.userVisibleSummary = `Index ${actionLabel} completed: ${context.index.status}`;
925
+ task.nextAction = "\u7528 /index status \u67E5\u770B\u8BE6\u60C5\uFF1B\u9700\u8981\u65B0\u9C9C\u5EA6\u68C0\u67E5\u65F6\u7528 /index status --fresh\u3002";
926
+ await deps().appendBackgroundTaskEvent(context, sessionId, task);
927
+ if (transientExcludes.length > 0) {
928
+ const detailsText = formatIndexAutoSkipDetails(safety, actionLabel, context.language);
929
+ context.index.safetyWarning = formatIndexAutoSkipPrimary(
930
+ safety,
931
+ context.index.status,
932
+ actionLabel,
933
+ context.language
934
+ );
935
+ context.index.safetyRiskyFiles = safety.riskyFiles;
936
+ context.index.safetyAction = actionLabel;
937
+ await recordIndexEvidence(
938
+ context,
939
+ `auto-skip-result:${actionLabel}`,
940
+ detailsText,
941
+ transientExcludes.map((file) => `skipped_file:${file}`)
942
+ );
943
+ context.lastFullOutput = detailsText;
944
+ writeLine(output, context.index.safetyWarning);
945
+ writeLine(output, formatIndexAutoSkipNextAction(context.language));
946
+ }
947
+ }
948
+ async function runIndexQuery(context, tool, input) {
949
+ await refreshIndexStatus(context);
950
+ if (context.index.status !== "ready" || !context.index.projectName) {
951
+ const summary2 = formatIndexStatus(context);
952
+ return { summary: summary2 };
953
+ }
954
+ const result = await runCodebaseMemoryCli(
955
+ context,
956
+ tool,
957
+ { project: context.index.projectName, ...input },
958
+ context.projectPath
959
+ );
960
+ if (!result.ok) {
961
+ context.index.status = result.errorCode === "ENOENT" ? "missing" : "error";
962
+ context.index.error = result.summary;
963
+ return { summary: formatIndexStatus(context) };
964
+ }
965
+ const summary = summarizeIndexResult(tool, result.data);
966
+ context.index.lastQuery = tool === "search_code" || tool === "search_graph" ? String(input.pattern ?? input.query ?? "") : "architecture";
967
+ context.index.lastSummary = summary;
968
+ return { summary };
969
+ }
970
+ async function recordIndexEvidence(context, query, summary, supportsClaims = []) {
971
+ const supportsIndexCodeFact = isSupportiveIndexEvidence(context, query, summary);
972
+ const isSupplementalEvidence = supportsClaims.length > 0;
973
+ if (!supportsIndexCodeFact && !isSupplementalEvidence) {
974
+ return;
975
+ }
976
+ const sessionId = await deps().ensureSession(context);
977
+ const evidence = {
978
+ id: randomUUID(),
979
+ kind: "index_query",
980
+ summary: truncateDisplay(summary.replace(/\s+/g, " "), 160),
981
+ source: `codebase-memory:${context.index.projectName ?? "unknown"}:${query}`,
982
+ supportsClaims: [
983
+ "index_query",
984
+ ...supportsIndexCodeFact ? ["index_code_fact"] : [],
985
+ query,
986
+ ...supportsClaims
987
+ ],
988
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
989
+ };
990
+ deps().rememberEvidence(context, evidence);
991
+ await context.store.appendEvent(sessionId, { type: "evidence_record", ...evidence });
992
+ }
993
+ function isSupportiveIndexEvidence(context, query, summary) {
994
+ if (context.index.status !== "ready" || !context.index.projectName) {
995
+ return false;
996
+ }
997
+ const text = `${query}
998
+ ${summary}`;
999
+ if (/(?:missing|stale|error|not ready|no matches|status[:=\s]+(?:missing|stale|error))/iu.test(text)) {
1000
+ return false;
1001
+ }
1002
+ return /(?:\bpath\s*(?:=|:|\s)\s*(?!unknown\b|-)(?:[^\s,;]+)|\bfile_path\s*[:=]\s*(?!unknown\b|-)(?:[^\s,;]+)|\bfile:\s*(?!unknown\b|-)(?:[^\s,;]+)|\bsymbol\s*(?:=|:|\s)\s*(?!unknown\b|-)(?:[^\s,;]+)|\bsnippet\s*=\s*(?!\s*$).+|\bmatch\s*=\s*(?!\s*$).+)/imu.test(
1003
+ text
1004
+ );
1005
+ }
1006
+ async function runCodebaseMemoryCli(context, tool, input, cwd, timeoutMs = 3e4) {
1007
+ const guard = validateCodebaseMemoryToolExecution(tool, input);
1008
+ if (!guard.ok) {
1009
+ return { ok: false, summary: guard.summary };
1010
+ }
1011
+ const resolution = await getCodebaseMemoryResolution(context);
1012
+ if (resolution.status !== "ready") {
1013
+ return { ok: false, summary: resolution.summary, errorCode: resolution.status };
1014
+ }
1015
+ const result = await runCommandCapture(
1016
+ resolution.command,
1017
+ [...resolution.args, "cli", tool, JSON.stringify(input)],
1018
+ cwd,
1019
+ timeoutMs
1020
+ );
1021
+ if (result.exitCode !== 0) {
1022
+ return { ok: false, summary: result.summary, errorCode: result.errorCode };
1023
+ }
1024
+ const jsonLine = [...result.stdout.trim().split(/\r?\n/)].reverse().find((line) => line.trim().startsWith("{"));
1025
+ if (!jsonLine) {
1026
+ return { ok: false, summary: "codebase-memory-mcp \u672A\u8FD4\u56DE JSON\u3002" };
1027
+ }
1028
+ try {
1029
+ return { ok: true, data: JSON.parse(jsonLine) };
1030
+ } catch (error) {
1031
+ return { ok: false, summary: `\u65E0\u6CD5\u89E3\u6790 codebase-memory-mcp \u8F93\u51FA\uFF1A${formatError(error)}` };
1032
+ }
1033
+ }
1034
+ function executeSearchExtraTools(query, context) {
1035
+ const all = listDeferredTools(context);
1036
+ const filtered = searchDeferredTools(query, all);
1037
+ for (const tool of filtered) {
1038
+ context.discoveredDeferredToolNames.add(tool.name);
1039
+ }
1040
+ return {
1041
+ ok: true,
1042
+ text: `SearchExtraTools matched ${filtered.length}/${all.length} deferred tools (query=${JSON.stringify(query)}).`,
1043
+ data: { matches: filtered.map(summarizeDeferredToolMatch), total: filtered.length }
1044
+ };
1045
+ }
1046
+ async function executeExtraTool(args, context) {
1047
+ if (typeof args.tool_name !== "string" || args.tool_name.trim() === "") {
1048
+ return {
1049
+ ok: false,
1050
+ text: "ExecuteExtraTool: tool_name \u7F3A\u5931\u6216\u4E3A\u7A7A\uFF0C\u8BF7\u5148\u8FD0\u884C SearchExtraTools \u627E\u5230\u76EE\u6807\u5DE5\u5177\u3002"
1051
+ };
1052
+ }
1053
+ if (!context.discoveredDeferredToolNames.has(args.tool_name)) {
1054
+ return {
1055
+ ok: false,
1056
+ text: `ExecuteExtraTool: \u5DE5\u5177 ${args.tool_name} \u672A\u5728\u672C session \u901A\u8FC7 SearchExtraTools \u53D1\u73B0\u8FC7\u3002\u8BF7\u5148\u8FD0\u884C SearchExtraTools \u53D1\u73B0\u8BE5\u5DE5\u5177\u3002`
1057
+ };
1058
+ }
1059
+ const all = listDeferredTools(context);
1060
+ const target = findDeferredTool(args.tool_name, all);
1061
+ if (!target) {
1062
+ return {
1063
+ ok: false,
1064
+ text: `ExecuteExtraTool: \u5DE5\u5177 ${args.tool_name} \u5DF2\u88AB\u672C session \u8BB0\u4E3A\u53D1\u73B0\u8FC7\uFF0C\u4F46\u5DF2\u4E0D\u5728\u5F53\u524D\u53EF\u7528 deferred \u5DE5\u5177\u6E05\u5355\u4E2D\uFF08\u767D\u540D\u5355\u6216\u4F1A\u8BDD\u72B6\u6001\u53EF\u80FD\u5DF2\u53D8\u5316\uFF09\u3002\u8BF7\u91CD\u65B0\u8FD0\u884C SearchExtraTools\u3002`
1065
+ };
1066
+ }
1067
+ if (!target.executable) {
1068
+ return {
1069
+ ok: false,
1070
+ text: `ExecuteExtraTool: \u5DE5\u5177 ${target.name} (${target.kind}) \u5DF2\u53D1\u73B0\u4F46\u5F53\u524D\u6CA1\u6709\u5B89\u5168\u6267\u884C\u9002\u914D\u5668\uFF1A${target.reason}`
1071
+ };
1072
+ }
1073
+ const params = args.params && typeof args.params === "object" && !Array.isArray(args.params) ? args.params : {};
1074
+ if (target.kind === "codebase-memory") {
1075
+ if (!isCodebaseMemoryToolName(target.name)) {
1076
+ return {
1077
+ ok: false,
1078
+ text: `ExecuteExtraTool: ${target.name} \u672A\u901A\u8FC7 codebase-memory \u767D\u540D\u5355\u3002`
1079
+ };
1080
+ }
1081
+ const guard = validateCodebaseMemoryToolExecution(target.name, params);
1082
+ if (!guard.ok) {
1083
+ return { ok: false, text: guard.summary };
1084
+ }
1085
+ const risk = getCodebaseMemoryToolRisk(target.name);
1086
+ if (risk === "mutating" && !context.codebaseMemoryMutatingGranted) {
1087
+ return {
1088
+ ok: false,
1089
+ text: "\u8BE5\u7D22\u5F15\u5199\u5165\u52A8\u4F5C\u4E0D\u80FD\u901A\u8FC7\u901A\u7528\u5DE5\u5177\u5165\u53E3\u6267\u884C\u3002\u8BF7\u4F7F\u7528 /index refresh \u6216\u8BA9\u6A21\u578B\u53D1\u8D77\u7ED3\u6784\u5316\u7684\u4EE3\u7801\u7D22\u5F15\u5237\u65B0\u5DE5\u5177\uFF1B\u6267\u884C\u65F6\u4ECD\u4F1A\u8D70 Linghun \u6743\u9650\u8FB9\u754C\u3002"
1090
+ };
1091
+ }
1092
+ const cliResult = await runCodebaseMemoryCli(context, target.name, params, context.projectPath);
1093
+ if (!cliResult.ok) {
1094
+ return {
1095
+ ok: false,
1096
+ text: `ExecuteExtraTool(codebase-memory:${target.name}) \u5931\u8D25\uFF1A${cliResult.summary}${cliResult.errorCode ? ` [${cliResult.errorCode}]` : ""}`
1097
+ };
1098
+ }
1099
+ return {
1100
+ ok: true,
1101
+ text: `ExecuteExtraTool(codebase-memory:${target.name}) \u5B8C\u6210\u3002`,
1102
+ data: cliResult.data
1103
+ };
1104
+ }
1105
+ if (target.kind === "mcp") {
1106
+ const parsed = parseMcpDeferredToolName(target.name);
1107
+ if (!parsed) {
1108
+ return {
1109
+ ok: false,
1110
+ text: `ExecuteExtraTool: \u65E0\u6CD5\u89E3\u6790 MCP \u5DE5\u5177\u540D ${target.name}\uFF0C\u671F\u671B\u683C\u5F0F mcp:<server>:<tool>\u3002`
1111
+ };
1112
+ }
1113
+ const serverConfig = context.config.mcp.servers[parsed.server];
1114
+ const isSse = serverConfig?.transport === "sse" && typeof serverConfig.url === "string";
1115
+ if (!isLocalStdioMcpServer(serverConfig) && !isSse) {
1116
+ return {
1117
+ ok: false,
1118
+ text: `ExecuteExtraTool: MCP server ${parsed.server} \u4E0D\u662F\u672C\u5730 stdio \u6216 SSE\uFF08\u7F3A\u5C11 command/url \u6216\u5DF2\u7981\u7528\uFF09\u3002`
1119
+ };
1120
+ }
1121
+ if (!context.mcpStdioMutatingGranted && isPotentiallyMutatingMcpTool(parsed.tool)) {
1122
+ return {
1123
+ ok: false,
1124
+ text: "\u8BE5 MCP \u5DE5\u5177\u770B\u8D77\u6765\u4F1A\u4FEE\u6539\u5DE5\u4F5C\u533A\uFF0C\u4E0D\u80FD\u901A\u8FC7\u901A\u7528\u5DE5\u5177\u5165\u53E3\u76F4\u63A5\u6267\u884C\u3002\u8BF7\u6539\u7528\u660E\u786E\u7684\u53D7\u63A7\u547D\u4EE4\u6216\u8BA9\u6A21\u578B\u53D1\u8D77\u5BF9\u5E94\u7ED3\u6784\u5316\u5DE5\u5177\uFF1B\u6267\u884C\u65F6\u4ECD\u4F1A\u8D70 Linghun \u6743\u9650\u8FB9\u754C\u3002"
1125
+ };
1126
+ }
1127
+ const result = isSse ? await runMcpSseToolCall(serverConfig, parsed.tool, params) : await runMcpStdioToolCall(
1128
+ serverConfig,
1129
+ parsed.tool,
1130
+ params,
1131
+ context.projectPath
1132
+ );
1133
+ if (!result.ok) {
1134
+ return {
1135
+ ok: false,
1136
+ text: `ExecuteExtraTool(${target.name}) \u5931\u8D25\uFF1A${result.summary}${result.errorCode ? ` [${result.errorCode}]` : ""}`
1137
+ };
1138
+ }
1139
+ return {
1140
+ ok: true,
1141
+ text: `ExecuteExtraTool(${target.name}) \u5B8C\u6210\u3002`,
1142
+ data: result.data
1143
+ };
1144
+ }
1145
+ return {
1146
+ ok: false,
1147
+ text: `ExecuteExtraTool: \u5DE5\u5177 ${target.name} (${target.kind}) \u6CA1\u6709\u53EF\u7528\u7684\u5B89\u5168\u6267\u884C\u9002\u914D\u5668\u3002`
1148
+ };
1149
+ }
1150
+ function stabilizeMcpToolList(tools) {
1151
+ return tools.map((tool) => ({
1152
+ server: tool.server,
1153
+ name: tool.name,
1154
+ description: truncateDisplay(tool.description.replace(/\s+/g, " "), 120),
1155
+ discovery: tool.discovery ?? "placeholder",
1156
+ trusted: tool.trusted ?? false,
1157
+ schemaLoaded: tool.schemaLoaded ?? false,
1158
+ runtimeVersion: tool.runtimeVersion ?? "unknown"
1159
+ })).sort((a, b) => `${a.server}:${a.name}`.localeCompare(`${b.server}:${b.name}`));
1160
+ }
1161
+
1162
+ export {
1163
+ configureMcpIndexRuntime,
1164
+ handleMcpCommand,
1165
+ handleIndexCommand,
1166
+ resolveCodebaseMemoryBinary,
1167
+ codebaseMemoryCommandSpec,
1168
+ findManagedCodebaseMemoryBinary,
1169
+ findBundledCodebaseMemoryBinary,
1170
+ getBundledCodebaseMemoryRoots,
1171
+ getCodebaseMemoryPlatformArch,
1172
+ findPathCodebaseMemoryBinary,
1173
+ findCodebaseMemoryBinaryCandidate,
1174
+ probeCodebaseMemoryBinary,
1175
+ extractCodebaseMemoryVersion,
1176
+ rememberCodebaseMemoryResolution,
1177
+ getCodebaseMemoryResolution,
1178
+ runMcpDoctor,
1179
+ validateMcpServers,
1180
+ addMcpServer,
1181
+ setMcpServerEnabled,
1182
+ updateMcpServer,
1183
+ removeMcpServer,
1184
+ refreshIndexStatus,
1185
+ refreshLocalIndexArtifactState,
1186
+ refreshIndexStaleHint,
1187
+ runIndexRepository,
1188
+ runIndexQuery,
1189
+ recordIndexEvidence,
1190
+ isSupportiveIndexEvidence,
1191
+ runCodebaseMemoryCli,
1192
+ executeSearchExtraTools,
1193
+ executeExtraTool,
1194
+ stabilizeMcpToolList
1195
+ };