@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,374 @@
1
+ // src/log-artifact.ts
2
+ import { createReadStream } from "fs";
3
+ import { open, realpath, stat } from "fs/promises";
4
+ import { basename, resolve } from "path";
5
+ import { createInterface } from "readline";
6
+ import { isPathInside, normalizePathSeparators } from "@linghun/shared";
7
+ var DEFAULT_TAIL_LINES = 40;
8
+ var MAX_TAIL_LINES = 200;
9
+ var DEFAULT_MAX_BYTES = 64 * 1024;
10
+ var DEFAULT_SCAN_BYTES = 1024 * 1024;
11
+ var DEFAULT_MAX_MATCHES = 20;
12
+ var DEFAULT_MAX_OUTPUT_LINES = 200;
13
+ var DEFAULT_TIMEOUT_MS = 2e3;
14
+ var MAX_CONTEXT_LINES = 5;
15
+ var UTF8_BOUNDARY_PADDING_BYTES = 4;
16
+ var MAX_EXACT_LINE_PREFIX_BYTES = 256 * 1024;
17
+ var RELATIVE_LINE_NUMBER_WARNING = "Line numbers are relative to the bounded scan window; exact prefix scan was skipped for performance.";
18
+ var COMPLETE_ARTIFACT_WITHHELD_WARNING = "Complete artifact withheld; showing a bounded slice only.";
19
+ var ERROR_CANDIDATE_PATTERN = /\b(error|failed|exception|panic|fatal)\b|traceback|AssertionError|TypeError|SyntaxError|\bFAIL(?:ED)?\b|TS\d{4}|exitCode=[1-9]\d*|exit code [1-9]\d*|non-zero|command failed/iu;
20
+ async function readLogArtifactSlice(source, request, registry) {
21
+ const sourcePath = await resolveLogArtifactPath(source, registry);
22
+ const info = await stat(sourcePath).catch((error) => {
23
+ if (error.code === "ENOENT") {
24
+ throw new Error(`\u65E5\u5FD7 artifact \u4E0D\u5B58\u5728\uFF1A${sourcePath}\u3002\u8BF7\u786E\u8BA4\u4EFB\u52A1\u5DF2\u4EA7\u751F\u8F93\u51FA\u3002`);
25
+ }
26
+ throw error;
27
+ });
28
+ if (!info.isFile()) {
29
+ throw new Error(`\u65E5\u5FD7 artifact \u4E0D\u662F\u6587\u4EF6\uFF1A${sourcePath}\u3002`);
30
+ }
31
+ if (request.mode === "tail") {
32
+ return readTail(sourcePath, info.size, request);
33
+ }
34
+ if (request.mode === "grep") {
35
+ return readGrep(sourcePath, info.size, request, compileUserPattern(request.pattern));
36
+ }
37
+ return readErrors(sourcePath, info.size, request);
38
+ }
39
+ function formatLogArtifactSlice(slice, language) {
40
+ const title = language === "en-US" ? `Log artifact ${slice.mode}` : `Log artifact ${slice.mode} \u5207\u7247`;
41
+ const lines = [
42
+ title,
43
+ `- sourcePath: ${formatDisplaySourcePath(slice.sourcePath)}`,
44
+ `- mode: ${slice.mode}`,
45
+ `- range: ${formatRange(slice)}`,
46
+ `- truncated: ${slice.truncated ? "true" : "false"}`
47
+ ];
48
+ if (slice.matches) {
49
+ lines.push(`- matches: ${slice.matches.length}`);
50
+ }
51
+ if (slice.warnings?.length) {
52
+ for (const warning of slice.warnings) {
53
+ lines.push(`- warning: ${warning}`);
54
+ }
55
+ }
56
+ lines.push(
57
+ language === "en-US" ? "- boundary: bounded read only; full log was not inserted into the main screen, prompt, memory, or handoff." : "- boundary: \u4EC5\u6709\u754C\u8BFB\u53D6\uFF1B\u5B8C\u6574\u65E5\u5FD7\u4E0D\u4F1A\u8FDB\u5165\u4E3B\u5C4F\u3001prompt\u3001memory \u6216 handoff\u3002"
58
+ );
59
+ if (slice.content.trim()) {
60
+ lines.push("", slice.content);
61
+ } else {
62
+ lines.push("", language === "en-US" ? "No matching log content." : "\u672A\u627E\u5230\u5339\u914D\u65E5\u5FD7\u5185\u5BB9\u3002");
63
+ }
64
+ return lines.join("\n");
65
+ }
66
+ async function resolveLogArtifactPath(source, registry) {
67
+ if (source.backgroundId) {
68
+ const background = registry.backgrounds?.find(
69
+ (item) => item.id === source.backgroundId || item.id.endsWith(source.backgroundId ?? "")
70
+ );
71
+ if (!background) {
72
+ throw new Error(`\u672A\u627E\u5230 background\uFF1A${source.backgroundId}\u3002\u8BF7\u7528 /background \u67E5\u770B\u53EF\u7528\u4EFB\u52A1\u3002`);
73
+ }
74
+ const candidate = background.outputPath ?? background.logPath;
75
+ if (!candidate) {
76
+ throw new Error(`Background ${background.id} \u5C1A\u65E0 log/output artifact\u3002`);
77
+ }
78
+ return ensureAllowedPath(candidate, registry);
79
+ }
80
+ if (source.evidenceId) {
81
+ const evidence = registry.evidence?.find(
82
+ (item) => item.id === source.evidenceId || item.id.endsWith(source.evidenceId ?? "")
83
+ );
84
+ if (!evidence) {
85
+ throw new Error(
86
+ `\u672A\u627E\u5230 evidence\uFF1A${source.evidenceId}\u3002\u8BF7\u7528 /details evidence \u67E5\u770B\u53EF\u7528\u8BC1\u636E\u3002`
87
+ );
88
+ }
89
+ const explicitArtifact = evidence.fullOutputPath ?? evidence.outputPath ?? evidence.logPath;
90
+ if (explicitArtifact) {
91
+ return ensureAllowedPath(explicitArtifact, registry);
92
+ }
93
+ if (!evidence.source) {
94
+ throw new Error(`Evidence ${evidence.id} \u5C1A\u65E0 source artifact\u3002`);
95
+ }
96
+ return ensureEvidenceSourceArtifactPath(evidence.source, registry);
97
+ }
98
+ if (source.path) {
99
+ return ensureAllowedPath(source.path, registry);
100
+ }
101
+ throw new Error("\u7F3A\u5C11 log artifact source\uFF1A\u9700\u8981 backgroundId\u3001evidenceId \u6216 path\u3002");
102
+ }
103
+ async function ensureAllowedPath(path, registry) {
104
+ const resolved = resolve(registry.workspaceRoot, path);
105
+ const roots = [registry.workspaceRoot, ...registry.logRoots ?? []].map((root) => resolve(root));
106
+ if (!roots.some((root) => isPathInside(resolved, root))) {
107
+ throw new Error("\u62D2\u7EDD\u8BFB\u53D6\u65E5\u5FD7 artifact\uFF1A\u8DEF\u5F84\u4E0D\u5728 workspace \u6216\u5DF2\u77E5 log root \u5185\u3002");
108
+ }
109
+ const realResolved = await realpath(resolved).catch(() => resolved);
110
+ const realRoots = await Promise.all(roots.map((root) => realpath(root).catch(() => root)));
111
+ if (!realRoots.some((root) => isPathInside(realResolved, root))) {
112
+ throw new Error("\u62D2\u7EDD\u8BFB\u53D6\u65E5\u5FD7 artifact\uFF1A\u8DEF\u5F84\u4E0D\u5728 workspace \u6216\u5DF2\u77E5 log root \u5185\u3002");
113
+ }
114
+ return realResolved;
115
+ }
116
+ async function ensureEvidenceSourceArtifactPath(path, registry) {
117
+ const resolved = await ensureAllowedPath(path, registry);
118
+ const logRoots = (registry.logRoots?.length ? registry.logRoots : [resolve(registry.workspaceRoot, ".linghun", "logs")]).map((root) => resolve(root));
119
+ const realLogRoots = await Promise.all(logRoots.map((root) => realpath(root).catch(() => root)));
120
+ if (realLogRoots.some((root) => isPathInside(resolved, root))) {
121
+ return resolved;
122
+ }
123
+ throw new Error(
124
+ "Evidence source \u4E0D\u662F log/output artifact\uFF1A\u8BF7\u7528 Read \u6216\u5176\u4ED6\u5408\u9002\u5DE5\u5177\u67E5\u770B\u666E\u901A workspace \u6587\u4EF6\u3002"
125
+ );
126
+ }
127
+ async function readTail(sourcePath, fileSize, request) {
128
+ const maxBytes = clampPositive(request.maxBytes, DEFAULT_MAX_BYTES, DEFAULT_MAX_BYTES);
129
+ const lines = clampPositive(request.lines, DEFAULT_TAIL_LINES, MAX_TAIL_LINES);
130
+ const readStart = Math.max(0, fileSize - maxBytes - UTF8_BOUNDARY_PADDING_BYTES);
131
+ const readLength = Math.max(0, fileSize - readStart);
132
+ const buffer = Buffer.alloc(readLength);
133
+ const file = await open(sourcePath, "r");
134
+ try {
135
+ await file.read(buffer, 0, readLength, readStart);
136
+ } finally {
137
+ await file.close();
138
+ }
139
+ const decoded = buffer.toString("utf8");
140
+ const allLines = decoded.split(/\r?\n/u);
141
+ const usableLines = readStart > 0 ? allLines.slice(1) : allLines;
142
+ const selected = preventCompleteLineDump(usableLines.slice(-lines), usableLines.length);
143
+ const truncated = readStart > 0 || usableLines.length > selected.lines.length;
144
+ const numbering = await resolveLineNumberOffset(sourcePath, readStart);
145
+ const firstUsableLine = readStart > 0 ? numbering.countBeforeStart + 2 : 1;
146
+ const tailStartLine = firstUsableLine + Math.max(0, usableLines.length - lines);
147
+ const selectedStartLine = selected.lines.length > 0 ? tailStartLine + (selected.withheld ? 1 : 0) : void 0;
148
+ const selectedEndLine = selectedStartLine === void 0 ? void 0 : selectedStartLine + selected.lines.length - 1;
149
+ const warnings = [
150
+ ...selected.withheld ? [COMPLETE_ARTIFACT_WITHHELD_WARNING] : [],
151
+ ...truncated ? ["Output capped; increase --tail lines only when necessary."] : [],
152
+ ...!numbering.exact ? [RELATIVE_LINE_NUMBER_WARNING] : []
153
+ ];
154
+ return {
155
+ sourcePath,
156
+ mode: "tail",
157
+ byteRange: { start: readStart, end: fileSize },
158
+ lineRange: { start: selectedStartLine, end: selectedEndLine },
159
+ truncated,
160
+ content: redactLogContent(selected.lines.join("\n")),
161
+ warnings: warnings.length > 0 ? warnings : void 0
162
+ };
163
+ }
164
+ async function readGrep(sourcePath, fileSize, request, pattern) {
165
+ const maxBytes = clampPositive(request.maxBytes, DEFAULT_SCAN_BYTES, DEFAULT_SCAN_BYTES);
166
+ const maxMatches = clampPositive(request.maxMatches, DEFAULT_MAX_MATCHES, DEFAULT_MAX_MATCHES);
167
+ const maxOutputLines = clampPositive(
168
+ request.maxLines,
169
+ DEFAULT_MAX_OUTPUT_LINES,
170
+ DEFAULT_MAX_OUTPUT_LINES
171
+ );
172
+ const timeoutMs = clampPositive(request.timeoutMs, DEFAULT_TIMEOUT_MS, DEFAULT_TIMEOUT_MS);
173
+ const startedAt = Date.now();
174
+ const contextLines = Math.min(
175
+ clampPositive(request.contextLines, 0, MAX_CONTEXT_LINES),
176
+ MAX_CONTEXT_LINES
177
+ );
178
+ const readStart = Math.max(0, fileSize - maxBytes - UTF8_BOUNDARY_PADDING_BYTES);
179
+ const numbering = await resolveLineNumberOffset(sourcePath, readStart);
180
+ let lineNumber = numbering.countBeforeStart;
181
+ const stream = createReadStream(sourcePath, { encoding: "utf8", start: readStart });
182
+ const reader = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });
183
+ const before = [];
184
+ const outputLines = [];
185
+ const emitted = /* @__PURE__ */ new Set();
186
+ const matches = [];
187
+ let skippedPartialLine = readStart === 0;
188
+ let afterRemaining = 0;
189
+ let truncated = fileSize > maxBytes;
190
+ for await (const line of reader) {
191
+ if (Date.now() - startedAt > timeoutMs) {
192
+ truncated = true;
193
+ break;
194
+ }
195
+ if (!skippedPartialLine) {
196
+ skippedPartialLine = true;
197
+ lineNumber += 1;
198
+ continue;
199
+ }
200
+ lineNumber += 1;
201
+ if (pattern.test(line)) {
202
+ matches.push({ line: lineNumber, text: redactLogContent(line) });
203
+ for (const item of before) {
204
+ pushLine(outputLines, emitted, item);
205
+ }
206
+ pushLine(outputLines, emitted, { line: lineNumber, text: line });
207
+ afterRemaining = contextLines;
208
+ if (matches.length >= maxMatches || outputLines.length >= maxOutputLines) {
209
+ truncated = true;
210
+ break;
211
+ }
212
+ continue;
213
+ }
214
+ if (afterRemaining > 0) {
215
+ pushLine(outputLines, emitted, { line: lineNumber, text: line });
216
+ afterRemaining -= 1;
217
+ if (outputLines.length >= maxOutputLines) {
218
+ truncated = true;
219
+ break;
220
+ }
221
+ }
222
+ before.push({ line: lineNumber, text: line });
223
+ if (before.length > contextLines) {
224
+ before.shift();
225
+ }
226
+ }
227
+ reader.close();
228
+ stream.destroy();
229
+ const selected = preventCompleteNumberedLineDump(
230
+ outputLines,
231
+ lineNumber,
232
+ truncated,
233
+ new Set(matches.map((match) => match.line))
234
+ );
235
+ const warnings = [
236
+ ...selected.withheld ? [COMPLETE_ARTIFACT_WITHHELD_WARNING] : [],
237
+ ...truncated ? ["Output capped; narrow the pattern or inspect a smaller artifact slice."] : [],
238
+ ...!numbering.exact ? [RELATIVE_LINE_NUMBER_WARNING] : [],
239
+ ...matches.length === 0 ? ["No matches found in the bounded scan window."] : []
240
+ ];
241
+ return {
242
+ sourcePath,
243
+ mode: "grep",
244
+ byteRange: { start: readStart, end: fileSize },
245
+ lineRange: { start: selected.lines[0]?.line, end: selected.lines.at(-1)?.line },
246
+ truncated: truncated || selected.withheld,
247
+ matches,
248
+ content: formatNumberedLines(selected.lines),
249
+ warnings: warnings.length > 0 ? warnings : void 0
250
+ };
251
+ }
252
+ async function readErrors(sourcePath, fileSize, request) {
253
+ const slice = await readGrep(
254
+ sourcePath,
255
+ fileSize,
256
+ { ...request, contextLines: request.contextLines ?? 2 },
257
+ ERROR_CANDIDATE_PATTERN
258
+ );
259
+ return {
260
+ ...slice,
261
+ mode: "errors",
262
+ warnings: [
263
+ "Error candidates are diagnostic slices only; they do not change verification PASS/PARTIAL/FAIL semantics or identify root cause.",
264
+ ...slice.warnings ?? []
265
+ ]
266
+ };
267
+ }
268
+ function pushLine(outputLines, emitted, item) {
269
+ if (emitted.has(item.line)) {
270
+ return;
271
+ }
272
+ emitted.add(item.line);
273
+ outputLines.push({ line: item.line, text: redactLogContent(item.text) });
274
+ }
275
+ async function resolveLineNumberOffset(sourcePath, offset) {
276
+ if (offset <= 0) {
277
+ return { countBeforeStart: 0, exact: true };
278
+ }
279
+ if (offset > MAX_EXACT_LINE_PREFIX_BYTES) {
280
+ return { countBeforeStart: 0, exact: false };
281
+ }
282
+ return { countBeforeStart: await countLineBreaksBeforeOffset(sourcePath, offset), exact: true };
283
+ }
284
+ async function countLineBreaksBeforeOffset(sourcePath, offset) {
285
+ return new Promise((resolveCount, reject) => {
286
+ let count = 0;
287
+ const stream = createReadStream(sourcePath, { start: 0, end: offset - 1 });
288
+ stream.on("data", (chunk) => {
289
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
290
+ for (const byte of buffer) {
291
+ if (byte === 10) {
292
+ count += 1;
293
+ }
294
+ }
295
+ });
296
+ stream.on("error", reject);
297
+ stream.on("end", () => resolveCount(count));
298
+ });
299
+ }
300
+ function preventCompleteLineDump(lines, totalLinesInWindow) {
301
+ if (lines.length === 0 || lines.length < totalLinesInWindow) {
302
+ return { lines, withheld: false };
303
+ }
304
+ if (lines.length === 1) {
305
+ return { lines: [], withheld: true };
306
+ }
307
+ return { lines: lines.slice(1), withheld: true };
308
+ }
309
+ function preventCompleteNumberedLineDump(lines, scannedLines, alreadyTruncated, matchLineNumbers) {
310
+ if (alreadyTruncated || lines.length === 0 || lines.length < scannedLines) {
311
+ return { lines, withheld: false };
312
+ }
313
+ if (lines.length === 1) {
314
+ return { lines: [], withheld: true };
315
+ }
316
+ let indexToWithhold = 0;
317
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
318
+ if (!matchLineNumbers.has(lines[index]?.line ?? 0)) {
319
+ indexToWithhold = index;
320
+ break;
321
+ }
322
+ }
323
+ return {
324
+ lines: lines.filter((_, index) => index !== indexToWithhold),
325
+ withheld: true
326
+ };
327
+ }
328
+ function formatNumberedLines(lines) {
329
+ return lines.map((line) => `${line.line}: ${line.text}`).join("\n");
330
+ }
331
+ function compileUserPattern(pattern) {
332
+ if (!pattern?.trim()) {
333
+ throw new Error("grep \u6A21\u5F0F\u7F3A\u5931\u3002\u7528\u6CD5\uFF1A/details output <id> --grep <pattern> [--context N]");
334
+ }
335
+ return new RegExp(escapeRegExp(pattern), "iu");
336
+ }
337
+ function escapeRegExp(value) {
338
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
339
+ }
340
+ function clampPositive(value, fallback, max) {
341
+ if (!Number.isFinite(value) || value === void 0 || value <= 0) {
342
+ return fallback;
343
+ }
344
+ return Math.min(Math.floor(value), max);
345
+ }
346
+ function formatDisplaySourcePath(sourcePath) {
347
+ const normalized = normalizePathSeparators(sourcePath);
348
+ const logRootIndex = normalized.indexOf("/.linghun/logs/");
349
+ if (logRootIndex >= 0) {
350
+ return normalized.slice(logRootIndex + 1);
351
+ }
352
+ if (normalized.startsWith(".linghun/logs/")) {
353
+ return normalized;
354
+ }
355
+ return `redacted:${basename(sourcePath)}`;
356
+ }
357
+ function formatRange(slice) {
358
+ if (slice.byteRange) {
359
+ return `bytes ${slice.byteRange.start}-${slice.byteRange.end}`;
360
+ }
361
+ if (slice.lineRange) {
362
+ return `lines ${slice.lineRange.start ?? "?"}-${slice.lineRange.end ?? "?"}`;
363
+ }
364
+ return "bounded";
365
+ }
366
+ function redactLogContent(text) {
367
+ return text.replace(/(Authorization\s*:\s*)[^\r\n]+/giu, "$1[REDACTED]").replace(/(Cookie\s*:\s*)[^\r\n]+/giu, "$1[REDACTED]").replace(/\bBearer\s+[A-Za-z0-9._~+/=-]+/giu, "Bearer [REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu, "sk-[REDACTED]").replace(/((?:api[_-]?key|token|cookie)\s*[:=]\s*)[^\s;]+/giu, "$1[REDACTED]");
368
+ }
369
+
370
+ export {
371
+ readLogArtifactSlice,
372
+ formatLogArtifactSlice,
373
+ redactLogContent
374
+ };
@@ -0,0 +1,18 @@
1
+ // src/shell/components/MessageResponse.tsx
2
+ import { Box, Text } from "@linghun/ink-runtime";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function MessageResponse({
5
+ children,
6
+ width
7
+ }) {
8
+ const prefixWidth = 5;
9
+ const childWidth = width ? Math.max(8, width - prefixWidth) : void 0;
10
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", width, children: [
11
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: " \u23BF " }) }),
12
+ /* @__PURE__ */ jsx(Box, { flexShrink: 1, flexGrow: 1, width: childWidth, children })
13
+ ] });
14
+ }
15
+
16
+ export {
17
+ MessageResponse
18
+ };
@@ -0,0 +1,278 @@
1
+ import {
2
+ formatPercent
3
+ } from "./chunk-QBCGAIU7.js";
4
+ import {
5
+ calculateContextPercentages,
6
+ formatContextProgressBar,
7
+ getContextWindowForModel
8
+ } from "./chunk-K4FSYBSY.js";
9
+ import {
10
+ getSelectedModelRuntime
11
+ } from "./chunk-3LT6OWQ2.js";
12
+ import {
13
+ diffFreshness
14
+ } from "./chunk-4T5DJW54.js";
15
+ import {
16
+ sanitizeDiagnosticText
17
+ } from "./chunk-OMZYPQVA.js";
18
+
19
+ // src/cache-command-runtime.ts
20
+ import { randomUUID } from "crypto";
21
+ import { redactCommonSecrets } from "@linghun/shared";
22
+ var DEFAULT_LIGHT_HINT_COOLDOWN_MS = 5 * 60 * 1e3;
23
+ var MAX_LIGHT_HINTS_PER_TURN = 1;
24
+ function buildCacheStatusPanel(context, currentFreshness) {
25
+ const isEn = context.language === "en-US";
26
+ const last = context.cache.history.at(-1);
27
+ const hitRate = last?.hitRate ?? null;
28
+ const summary = [];
29
+ if (hitRate === null || Number.isNaN(hitRate)) {
30
+ summary.push(isEn ? "Cache \xB7 no usage yet" : "\u7F13\u5B58 \xB7 \u5C1A\u65E0\u6837\u672C");
31
+ } else {
32
+ const pct = `${Math.round(hitRate * 100)}%`;
33
+ summary.push(isEn ? `Cache hit rate: ${pct}` : `\u7F13\u5B58\u547D\u4E2D\u7387\uFF1A${pct}`);
34
+ }
35
+ const isLow = typeof hitRate === "number" && Number.isFinite(hitRate) && hitRate < 0.3;
36
+ const tone = isLow ? "warning" : "neutral";
37
+ if (isLow) {
38
+ summary.push(
39
+ isEn ? "Hit rate is low \u2014 try /cache warmup or check provider usage." : "\u547D\u4E2D\u7387\u504F\u4F4E \u2014 \u53EF\u8FD0\u884C /cache warmup \u6216\u6838\u5BF9 provider usage\u3002"
40
+ );
41
+ }
42
+ return {
43
+ title: "/cache",
44
+ tone,
45
+ summary,
46
+ actions: ["/cache warmup", "/cache refresh"],
47
+ detailsText: formatCacheStatus(context, currentFreshness)
48
+ };
49
+ }
50
+ function formatCacheLog(context) {
51
+ if (context.cache.history.length === 0) {
52
+ return "\u6700\u8FD1\u7F13\u5B58\u65E5\u5FD7\u4E3A\u7A7A\u3002\u771F\u5B9E usage \u9700\u8981 provider \u8FD4\u56DE token/cache \u5B57\u6BB5\uFF1B\u53EF\u7528 /cache warmup \u5C1D\u8BD5\u9884\u70ED\u3002";
53
+ }
54
+ return [
55
+ `Cache log \u6700\u8FD1 ${context.cache.history.length}/${context.cache.config.maxTurns} \u8F6E\uFF1A`,
56
+ ...context.cache.history.map(
57
+ (item) => `#${item.turn} \u547D\u4E2D\u7387 ${formatPercent(item.hitRate)} \u8F93\u5165 ${item.inputTokens} \u8F93\u51FA ${item.outputTokens} \u7F13\u5B58\u8BFB\u53D6 ${item.cacheReadTokens} \u7F13\u5B58\u5199\u5165 ${item.cacheWriteTokens} \u6765\u6E90 ${formatCacheWriteSource(item.cacheWriteTokensSource)} \u6A21\u578B ${item.model} provider ${item.provider}`
58
+ )
59
+ ].join("\n");
60
+ }
61
+ function formatCacheWriteSource(source) {
62
+ if (source === "reported") return "provider reported";
63
+ if (source === "zero_reported") return "provider reported zero";
64
+ if (source === "estimated") return "estimated";
65
+ return "not reported";
66
+ }
67
+ function formatCacheStatus(context, currentFreshness) {
68
+ const latest = context.cache.history.at(-1);
69
+ const freshness = latest?.freshness ?? currentFreshness;
70
+ const changed = latest?.freshness.changedKeys ?? diffFreshness(context.cache.lastFreshness, freshness);
71
+ const source = latest?.cacheWriteTokensSource ?? "missing";
72
+ const zeroNote = source === "zero_reported" ? "provider \u5F53\u524D\u8FD4\u56DE cache_creation/cache write \u4E3A 0\uFF1B\u8FD9\u53EA\u662F\u5B57\u6BB5\u53E3\u5F84\uFF0C\u4E0D\u4EE3\u8868\u96F6\u5199\u5165\u6210\u672C\u3002" : source === "missing" ? "provider \u672A\u8FD4\u56DE cache_creation/cache write \u5B57\u6BB5\uFF1B\u4E0D\u652F\u6301\u771F\u5B9E\u7F13\u5B58\u5199\u5165\u7EDF\u8BA1\u3002" : "cache write/create \u5B57\u6BB5\u6765\u81EA provider/API usage\u3002";
73
+ return [
74
+ "Cache status",
75
+ `- history: ${context.cache.history.length}/${context.cache.config.maxTurns}`,
76
+ `- latest hitRate: ${formatPercent(latest?.hitRate ?? null)}\uFF08\u516C\u5F0F\uFF1AcacheRead / (input + cacheWrite + cacheRead)\uFF0Coutput \u4E0D\u8FDB\u5206\u6BCD\uFF09`,
77
+ `- read/write tokens: ${latest?.cacheReadTokens ?? 0}/${latest?.cacheWriteTokens ?? 0}`,
78
+ `- cache write source: ${source}`,
79
+ `- compact: ${context.cache.compacted ? "yes" : "no"}`,
80
+ `- workspace reference: hits ${context.cache.workspaceReference.hits}; misses ${context.cache.workspaceReference.misses}; failures ${context.cache.workspaceReference.failures}; latest ${context.cache.workspaceReference.latest?.source ?? "none"}`,
81
+ `- workspace snapshot lite: ${formatWorkspaceSnapshotLiteStatus(context)}`,
82
+ `- freshness changedKeys: ${changed.length > 0 ? changed.join(", ") : "none"}`,
83
+ `- note: ${zeroNote}`
84
+ ].join("\n");
85
+ }
86
+ function formatWorkspaceSnapshotLiteStatus(context) {
87
+ const snapshot = context.cache.workspaceReference.latest?.workspaceSnapshot;
88
+ if (!snapshot) {
89
+ return "none";
90
+ }
91
+ const changed = snapshot.changedSummary?.changedKeys.length ? snapshot.changedSummary.changedKeys.join(",") : "none";
92
+ return `files ${snapshot.counts.files}; dirs ${snapshot.counts.directories}; ignored ${snapshot.counts.ignored}; stored ${snapshot.counts.storedEntries}; partial ${snapshot.partial ? "yes" : "no"}; changed ${changed}`;
93
+ }
94
+ function formatCompactStatus(context) {
95
+ const latest = context.cache.compactBoundaries.at(-1);
96
+ const pressure = context.cache.compactPressure;
97
+ const runtime = getSelectedModelRuntime(context);
98
+ const contextUsage = pressure ? calculateContextPercentages(
99
+ Math.ceil(pressure.estimatedChars / 4),
100
+ Math.ceil(pressure.maxChars / 4) || getContextWindowForModel(runtime.model)
101
+ ) : void 0;
102
+ const projection = context.cache.compactProjection;
103
+ const deep = context.cache.deepCompact;
104
+ const failure = context.cache.compactFailure;
105
+ const lines = [
106
+ "Context Compact status",
107
+ `- pressure: ${pressure ? `${formatPercent(pressure.ratio)} (${pressure.estimatedChars}/${pressure.maxChars} chars; trigger ${pressure.triggerChars})` : "unknown"}`,
108
+ `- compacted: ${context.cache.compacted ? "yes" : "no"} \xB7 boundaries: ${context.cache.compactBoundaries.length}`,
109
+ `- latest: ${latest ? `${latest.kind}/${latest.id}` : "none"}`,
110
+ `- latest tokens: ${latest ? `${latest.preCompactTokenEstimate ?? "-"}\u2192${latest.postCompactTokenEstimate ?? "-"}` : "-"}`,
111
+ `- latest compact time: ${deep?.createdAt ?? projection?.createdAt ?? latest?.createdAt ?? "none"}`
112
+ ];
113
+ if (contextUsage) {
114
+ const bar = formatContextProgressBar(contextUsage.ratio, 24);
115
+ lines.push(` context ${bar} ${contextUsage.usedTokens}/${contextUsage.maxTokens}`);
116
+ }
117
+ const apiInputTokens = context.lastApiTokenCount?.inputTokens;
118
+ if (apiInputTokens !== void 0) {
119
+ const inputK = Math.round(apiInputTokens / 1e3);
120
+ lines.push(` latest request tokens: input ${inputK}k`);
121
+ }
122
+ lines.push(
123
+ "- deep scope: full transcript semantic compact",
124
+ "- projection scope: provider-visible recent context projection",
125
+ `- deep packet: ${deep ? `${deep.id}; trigger ${deep.trigger}; events ${deep.transcriptEventCount}` : "none"}`,
126
+ `- deep summary: ${deep ? sanitizeCompactStatusText(deep.summary.split(/\r?\n/u).slice(0, 4).join(" | ")) : "none"}`,
127
+ `- projection summary: ${projection ? sanitizeCompactStatusText(projection.summary.split(/\r?\n/u).slice(0, 4).join(" | ")) : "none"}`,
128
+ `- discarded/degraded scope: ${projection ? sanitizeCompactStatusText(projection.discardedRange) : "none"}`,
129
+ `- tool pairing safe: ${projection ? projection.toolPairingSafe ? "yes" : "no" : pressure ? pressure.toolPairingSafe ? "yes" : "no" : "unknown"}`,
130
+ `- failure/cooldown: ${failure ? `${failure.blocked ? "blocked" : "partial"}; ${sanitizeCompactStatusText(failure.reason)}; cooldown until ${failure.cooldownUntil}` : "none"}`,
131
+ `- preserved evidence refs: ${deep?.preservedEvidenceRefs.length ?? latest?.preservedEvidenceRefs.length ?? 0}`,
132
+ `- preserved files: ${deep?.preservedFiles.length ?? latest?.preservedFiles.length ?? 0}`,
133
+ "- boundary: deep summary and projection are redacted; raw transcript, secrets, large tool results, provider raw requests, and absolute paths stay out."
134
+ );
135
+ const suggestions = buildCompactSuggestions(context, contextUsage, pressure);
136
+ if (suggestions.length > 0) {
137
+ lines.push("", ...suggestions);
138
+ }
139
+ return lines.join("\n");
140
+ }
141
+ function buildCompactSuggestions(context, usage, pressure) {
142
+ const out = [];
143
+ const en = context.language === "en-US";
144
+ if (!usage || !pressure) return out;
145
+ if (usage.ratio > 0.85) {
146
+ out.push(
147
+ en ? `\u26A0 Suggestion: Context at ${(usage.ratio * 100).toFixed(0)}% \u2014 run /compact deep to semantically summarize older context and free capacity.` : `\u26A0 \u5EFA\u8BAE\uFF1A\u4E0A\u4E0B\u6587\u4F7F\u7528\u7387 ${(usage.ratio * 100).toFixed(0)}% \u2014 \u8FD0\u884C /compact deep \u8BED\u4E49\u6458\u8981\u8F83\u65E9\u4E0A\u4E0B\u6587\u4EE5\u91CA\u653E\u5BB9\u91CF\u3002`
148
+ );
149
+ } else if (usage.ratio > 0.7) {
150
+ out.push(
151
+ en ? `Suggestion: Context at ${(usage.ratio * 100).toFixed(0)}% \u2014 approaching limit. Deep compact is available when needed.` : `\u5EFA\u8BAE\uFF1A\u4E0A\u4E0B\u6587\u4F7F\u7528\u7387 ${(usage.ratio * 100).toFixed(0)}% \u2014 \u63A5\u8FD1\u4E0A\u9650\u3002\u9700\u8981\u65F6\u53EF\u8FD0\u884C deep compact\u3002`
152
+ );
153
+ }
154
+ if (usage.ratio > 0.6 && !context.cache.compacted) {
155
+ out.push(
156
+ en ? "Tip: Auto-compact triggers around 80%. You can also /compact manual for a semantic rewrite of older context." : "\u63D0\u793A\uFF1A\u81EA\u52A8\u538B\u7F29\u7EA6\u5728 80% \u89E6\u53D1\u3002\u4F60\u4E5F\u53EF\u4EE5 /compact manual \u5BF9\u8F83\u65E9\u4E0A\u4E0B\u6587\u505A\u8BED\u4E49\u91CD\u5199\u3002"
157
+ );
158
+ }
159
+ return out;
160
+ }
161
+ function sanitizeCompactStatusText(value) {
162
+ return sanitizeDiagnosticText(redactCommonSecrets(value));
163
+ }
164
+ function collectLightHints(context) {
165
+ const latest = context.cache.history.at(-1);
166
+ const hints = [];
167
+ if (latest?.hitRate !== null && latest?.hitRate !== void 0 && latest.hitRate < context.cache.config.warnBelowHitRate) {
168
+ hints.push(
169
+ createLightHint(
170
+ "cache-hit-low",
171
+ "info",
172
+ 10,
173
+ context.language === "en-US" ? "Reuse became less effective in the latest turn" : "\u6700\u8FD1\u4E00\u8F6E\u590D\u7528\u6548\u679C\u53D8\u4F4E",
174
+ "/break-cache status"
175
+ )
176
+ );
177
+ }
178
+ if ((latest?.inputTokens ?? 0) > 96e3) {
179
+ hints.push(
180
+ createLightHint(
181
+ "context-long",
182
+ "info",
183
+ 4,
184
+ context.language === "en-US" ? "This conversation is getting long; compact only if it starts feeling slow" : "\u8FD9\u8F6E\u5BF9\u8BDD\u8F83\u957F\uFF1B\u5982\u679C\u5F00\u59CB\u53D8\u6162\uFF0C\u518D\u6309\u9700\u538B\u7F29",
185
+ "/compact"
186
+ )
187
+ );
188
+ }
189
+ if (latest?.cacheWriteTokensSource === "zero_reported" && latest.cacheReadTokens > 0) {
190
+ hints.push(
191
+ createLightHint(
192
+ "cache-zero-create-with-read",
193
+ "info",
194
+ 2,
195
+ context.language === "en-US" ? "Usage numbers may need checking before cost claims" : "\u8981\u4E0B\u6210\u672C\u7ED3\u8BBA\u524D\uFF0C\u5EFA\u8BAE\u5148\u6838\u5BF9\u7528\u91CF\u53E3\u5F84",
196
+ "/usage"
197
+ )
198
+ );
199
+ }
200
+ const changedKeys = latest?.freshness.changedKeys ?? [];
201
+ if (changedKeys.some(
202
+ (key) => ["systemPromptHash", "toolSchemaHash", "mcpToolListHash"].includes(key)
203
+ )) {
204
+ hints.push(
205
+ createLightHint(
206
+ "freshness-changed",
207
+ "warning",
208
+ 8,
209
+ context.language === "en-US" ? "Project context changed; refresh reuse data when results look stale" : "\u9879\u76EE\u4E0A\u4E0B\u6587\u6709\u53D8\u5316\uFF1B\u7ED3\u679C\u50CF\u65E7\u4FE1\u606F\u65F6\u518D\u5237\u65B0\u590D\u7528\u6570\u636E",
210
+ "/cache warmup"
211
+ )
212
+ );
213
+ }
214
+ return hints;
215
+ }
216
+ function createLightHint(dedupeKey, severity, priority, message, suggestedCommand) {
217
+ return {
218
+ id: randomUUID(),
219
+ severity,
220
+ priority,
221
+ message,
222
+ suggestedCommand,
223
+ dedupeKey,
224
+ cooldownMs: DEFAULT_LIGHT_HINT_COOLDOWN_MS
225
+ };
226
+ }
227
+ function writeLightHints(_output, context) {
228
+ if (context.cache.config.hintsMuted) {
229
+ return;
230
+ }
231
+ const now = Date.now();
232
+ const visibleHints = collectLightHints(context).filter((hint) => now - (context.cache.hintLastShownAt[hint.dedupeKey] ?? 0) >= hint.cooldownMs).sort((a, b) => b.priority - a.priority).slice(0, MAX_LIGHT_HINTS_PER_TURN);
233
+ if (visibleHints.length === 0) return;
234
+ if (!context.notifications) context.notifications = [];
235
+ for (const hint of visibleHints) {
236
+ context.cache.hintLastShownAt[hint.dedupeKey] = now;
237
+ const text = formatPlainLightHint(hint, context.language);
238
+ context.notifications.push({
239
+ key: `lighthint:${hint.dedupeKey}`,
240
+ text,
241
+ priority: hint.severity === "warning" ? "medium" : "low",
242
+ timeoutMs: 5e3,
243
+ createdAt: now,
244
+ tone: hint.severity === "warning" ? "warning" : "dim"
245
+ });
246
+ }
247
+ }
248
+ function formatPlainLightHint(hint, language) {
249
+ const isEn = language === "en-US";
250
+ switch (hint.dedupeKey) {
251
+ case "cache-hit-low":
252
+ return isEn ? "Cache reuse dipped a bit; the next response may be slower." : "\u6700\u8FD1\u7F13\u5B58\u590D\u7528\u53D8\u4F4E\uFF0C\u540E\u7EED\u54CD\u5E94\u53EF\u80FD\u4F1A\u6162\u4E00\u70B9\u3002";
253
+ case "context-long":
254
+ return isEn ? "This conversation is getting long; compact only if it starts feeling slow." : "\u8FD9\u8F6E\u5BF9\u8BDD\u8F83\u957F\uFF1B\u5982\u679C\u5F00\u59CB\u53D8\u6162\uFF0C\u518D\u6309\u9700\u538B\u7F29\u3002";
255
+ case "cache-zero-create-with-read":
256
+ return isEn ? "Usage numbers may need a quick check before drawing cost conclusions." : "\u7528\u91CF\u6570\u636E\u53EF\u80FD\u9700\u8981\u590D\u6838\u540E\u518D\u4E0B\u7ED3\u8BBA\u3002";
257
+ case "freshness-changed":
258
+ return isEn ? "Project context changed; refresh reuse data when results look stale." : "\u9879\u76EE\u4E0A\u4E0B\u6587\u6709\u53D8\u5316\uFF1B\u7ED3\u679C\u50CF\u65E7\u4FE1\u606F\u65F6\u518D\u5237\u65B0\u3002";
259
+ default:
260
+ return hint.message;
261
+ }
262
+ }
263
+ function writeLightHintsForTest(output, context) {
264
+ writeLightHints(output, context);
265
+ }
266
+
267
+ export {
268
+ buildCacheStatusPanel,
269
+ formatCacheLog,
270
+ formatCacheStatus,
271
+ formatWorkspaceSnapshotLiteStatus,
272
+ formatCompactStatus,
273
+ collectLightHints,
274
+ createLightHint,
275
+ writeLightHints,
276
+ formatPlainLightHint,
277
+ writeLightHintsForTest
278
+ };