openhorse 0.2.19 → 0.2.22

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 (423) hide show
  1. package/dist/agents/coordinator.d.ts.map +1 -1
  2. package/dist/agents/fork.d.ts.map +1 -1
  3. package/dist/agents/fork.js +0 -1
  4. package/dist/agents/fork.js.map +1 -1
  5. package/dist/agents/worker-pool.d.ts.map +1 -1
  6. package/dist/agents/worker-pool.js +3 -1
  7. package/dist/agents/worker-pool.js.map +1 -1
  8. package/dist/cli.js +28 -3
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/index.d.ts.map +1 -1
  11. package/dist/commands/index.js +202 -77
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/commands/parser.d.ts.map +1 -1
  14. package/dist/commands/parser.js +8 -3
  15. package/dist/commands/parser.js.map +1 -1
  16. package/dist/commands/types.d.ts +2 -0
  17. package/dist/commands/types.d.ts.map +1 -1
  18. package/dist/commands/types.js.map +1 -1
  19. package/dist/core/checkpoint.d.ts.map +1 -1
  20. package/dist/core/checkpoint.js +3 -0
  21. package/dist/core/checkpoint.js.map +1 -1
  22. package/dist/core/cost-tracker.d.ts +45 -5
  23. package/dist/core/cost-tracker.d.ts.map +1 -1
  24. package/dist/core/cost-tracker.js +78 -13
  25. package/dist/core/cost-tracker.js.map +1 -1
  26. package/dist/framework/index.d.ts +1 -1
  27. package/dist/framework/index.d.ts.map +1 -1
  28. package/dist/framework/index.js.map +1 -1
  29. package/dist/framework/prompt.d.ts.map +1 -1
  30. package/dist/framework/prompt.js +16 -0
  31. package/dist/framework/prompt.js.map +1 -1
  32. package/dist/framework/query.d.ts +25 -0
  33. package/dist/framework/query.d.ts.map +1 -1
  34. package/dist/framework/query.js +196 -56
  35. package/dist/framework/query.js.map +1 -1
  36. package/dist/framework/store.d.ts +6 -1
  37. package/dist/framework/store.d.ts.map +1 -1
  38. package/dist/framework/store.js +10 -1
  39. package/dist/framework/store.js.map +1 -1
  40. package/dist/harness/context-harness.d.ts.map +1 -1
  41. package/dist/harness/context-harness.js +6 -1
  42. package/dist/harness/context-harness.js.map +1 -1
  43. package/dist/harness/ledger.d.ts +1 -0
  44. package/dist/harness/ledger.d.ts.map +1 -1
  45. package/dist/harness/ledger.js +12 -0
  46. package/dist/harness/ledger.js.map +1 -1
  47. package/dist/harness/safety.d.ts +2 -0
  48. package/dist/harness/safety.d.ts.map +1 -1
  49. package/dist/harness/safety.js +27 -3
  50. package/dist/harness/safety.js.map +1 -1
  51. package/dist/index.d.ts +2 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/init.d.ts +1 -1
  54. package/dist/init.d.ts.map +1 -1
  55. package/dist/init.js +1 -1
  56. package/dist/init.js.map +1 -1
  57. package/dist/ink-ui/components/Markdown.d.ts +1 -1
  58. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  59. package/dist/ink-ui/components/Markdown.js +1 -1
  60. package/dist/ink-ui/components/Markdown.js.map +1 -1
  61. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  62. package/dist/ink-ui/components/StatusLine.js +0 -2
  63. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  64. package/dist/ink-ui/runtime/grapheme.d.ts +9 -8
  65. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -1
  66. package/dist/ink-ui/runtime/grapheme.js +14 -60
  67. package/dist/ink-ui/runtime/grapheme.js.map +1 -1
  68. package/dist/ink-ui/runtime/input-buffer.d.ts +9 -31
  69. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -1
  70. package/dist/ink-ui/runtime/input-buffer.js +15 -162
  71. package/dist/ink-ui/runtime/input-buffer.js.map +1 -1
  72. package/dist/ink-ui/runtime/native-cursor.js +0 -25
  73. package/dist/ink-ui/runtime/native-cursor.js.map +1 -1
  74. package/dist/ink-ui/runtime/prompt-layout.d.ts +9 -29
  75. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  76. package/dist/ink-ui/runtime/prompt-layout.js +18 -166
  77. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  78. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -1
  79. package/dist/ink-ui/runtime/transcript-state.js +2 -0
  80. package/dist/ink-ui/runtime/transcript-state.js.map +1 -1
  81. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  82. package/dist/ink-ui/screens/ReplScreen.js +23 -5
  83. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  84. package/dist/memory/entrypoint.js +1 -1
  85. package/dist/memory/entrypoint.js.map +1 -1
  86. package/dist/memory/storage.js +1 -1
  87. package/dist/memory/storage.js.map +1 -1
  88. package/dist/memory/store.d.ts +1 -0
  89. package/dist/memory/store.d.ts.map +1 -1
  90. package/dist/memory/store.js +9 -0
  91. package/dist/memory/store.js.map +1 -1
  92. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  93. package/dist/runtime/agent-runtime-controller.js +25 -0
  94. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  95. package/dist/runtime/agent-runtime-protocol.d.ts +4 -1
  96. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  97. package/dist/runtime/agent-runtime-protocol.js +6 -0
  98. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  99. package/dist/runtime/chat-controller.d.ts +27 -0
  100. package/dist/runtime/chat-controller.d.ts.map +1 -1
  101. package/dist/runtime/chat-controller.js +374 -88
  102. package/dist/runtime/chat-controller.js.map +1 -1
  103. package/dist/runtime/composer/buffer.d.ts +43 -0
  104. package/dist/runtime/composer/buffer.d.ts.map +1 -0
  105. package/dist/runtime/composer/buffer.js +176 -0
  106. package/dist/runtime/composer/buffer.js.map +1 -0
  107. package/dist/runtime/composer/grapheme.d.ts +19 -0
  108. package/dist/runtime/composer/grapheme.d.ts.map +1 -0
  109. package/dist/runtime/composer/grapheme.js +73 -0
  110. package/dist/runtime/composer/grapheme.js.map +1 -0
  111. package/dist/runtime/composer/history.d.ts +39 -0
  112. package/dist/runtime/composer/history.d.ts.map +1 -0
  113. package/dist/runtime/composer/history.js +91 -0
  114. package/dist/runtime/composer/history.js.map +1 -0
  115. package/dist/runtime/composer/layout.d.ts +40 -0
  116. package/dist/runtime/composer/layout.d.ts.map +1 -0
  117. package/dist/runtime/composer/layout.js +174 -0
  118. package/dist/runtime/composer/layout.js.map +1 -0
  119. package/dist/runtime/rich-text/ansi-parser.d.ts +31 -0
  120. package/dist/runtime/rich-text/ansi-parser.d.ts.map +1 -0
  121. package/dist/runtime/rich-text/ansi-parser.js +310 -0
  122. package/dist/runtime/rich-text/ansi-parser.js.map +1 -0
  123. package/dist/runtime/rich-text/layout.d.ts +12 -0
  124. package/dist/runtime/rich-text/layout.d.ts.map +1 -0
  125. package/dist/runtime/rich-text/layout.js +362 -0
  126. package/dist/runtime/rich-text/layout.js.map +1 -0
  127. package/dist/runtime/rich-text/markdown-parser.d.ts +17 -0
  128. package/dist/runtime/rich-text/markdown-parser.d.ts.map +1 -0
  129. package/dist/runtime/rich-text/markdown-parser.js +218 -0
  130. package/dist/runtime/rich-text/markdown-parser.js.map +1 -0
  131. package/dist/runtime/rich-text/sanitizer.d.ts +18 -0
  132. package/dist/runtime/rich-text/sanitizer.d.ts.map +1 -0
  133. package/dist/runtime/rich-text/sanitizer.js +32 -0
  134. package/dist/runtime/rich-text/sanitizer.js.map +1 -0
  135. package/dist/runtime/rich-text/types.d.ts +59 -0
  136. package/dist/runtime/rich-text/types.d.ts.map +1 -0
  137. package/dist/runtime/rich-text/types.js +17 -0
  138. package/dist/runtime/rich-text/types.js.map +1 -0
  139. package/dist/runtime/subagents/budget.d.ts +118 -0
  140. package/dist/runtime/subagents/budget.d.ts.map +1 -0
  141. package/dist/runtime/subagents/budget.js +173 -0
  142. package/dist/runtime/subagents/budget.js.map +1 -0
  143. package/dist/runtime/subagents/child-executor-guard.d.ts +60 -0
  144. package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -0
  145. package/dist/runtime/subagents/child-executor-guard.js +219 -0
  146. package/dist/runtime/subagents/child-executor-guard.js.map +1 -0
  147. package/dist/runtime/subagents/context-builder.d.ts +34 -0
  148. package/dist/runtime/subagents/context-builder.d.ts.map +1 -0
  149. package/dist/runtime/subagents/context-builder.js +99 -0
  150. package/dist/runtime/subagents/context-builder.js.map +1 -0
  151. package/dist/runtime/subagents/index.d.ts +21 -0
  152. package/dist/runtime/subagents/index.d.ts.map +1 -0
  153. package/dist/runtime/subagents/index.js +62 -0
  154. package/dist/runtime/subagents/index.js.map +1 -0
  155. package/dist/runtime/subagents/policy.d.ts +68 -0
  156. package/dist/runtime/subagents/policy.d.ts.map +1 -0
  157. package/dist/runtime/subagents/policy.js +230 -0
  158. package/dist/runtime/subagents/policy.js.map +1 -0
  159. package/dist/runtime/subagents/presets.d.ts +44 -0
  160. package/dist/runtime/subagents/presets.d.ts.map +1 -0
  161. package/dist/runtime/subagents/presets.js +148 -0
  162. package/dist/runtime/subagents/presets.js.map +1 -0
  163. package/dist/runtime/subagents/production.d.ts +44 -0
  164. package/dist/runtime/subagents/production.d.ts.map +1 -0
  165. package/dist/runtime/subagents/production.js +143 -0
  166. package/dist/runtime/subagents/production.js.map +1 -0
  167. package/dist/runtime/subagents/provider-gate.d.ts +99 -0
  168. package/dist/runtime/subagents/provider-gate.d.ts.map +1 -0
  169. package/dist/runtime/subagents/provider-gate.js +186 -0
  170. package/dist/runtime/subagents/provider-gate.js.map +1 -0
  171. package/dist/runtime/subagents/result-parser.d.ts +40 -0
  172. package/dist/runtime/subagents/result-parser.d.ts.map +1 -0
  173. package/dist/runtime/subagents/result-parser.js +240 -0
  174. package/dist/runtime/subagents/result-parser.js.map +1 -0
  175. package/dist/runtime/subagents/runner.d.ts +53 -0
  176. package/dist/runtime/subagents/runner.d.ts.map +1 -0
  177. package/dist/runtime/subagents/runner.js +172 -0
  178. package/dist/runtime/subagents/runner.js.map +1 -0
  179. package/dist/runtime/subagents/runtime-integration.d.ts +73 -0
  180. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -0
  181. package/dist/runtime/subagents/runtime-integration.js +148 -0
  182. package/dist/runtime/subagents/runtime-integration.js.map +1 -0
  183. package/dist/runtime/subagents/supervisor.d.ts +79 -0
  184. package/dist/runtime/subagents/supervisor.d.ts.map +1 -0
  185. package/dist/runtime/subagents/supervisor.js +301 -0
  186. package/dist/runtime/subagents/supervisor.js.map +1 -0
  187. package/dist/runtime/subagents/tool.d.ts +38 -0
  188. package/dist/runtime/subagents/tool.d.ts.map +1 -0
  189. package/dist/runtime/subagents/tool.js +171 -0
  190. package/dist/runtime/subagents/tool.js.map +1 -0
  191. package/dist/runtime/subagents/types.d.ts +152 -0
  192. package/dist/runtime/subagents/types.d.ts.map +1 -0
  193. package/dist/runtime/subagents/types.js +56 -0
  194. package/dist/runtime/subagents/types.js.map +1 -0
  195. package/dist/runtime/ui-events.d.ts +18 -0
  196. package/dist/runtime/ui-events.d.ts.map +1 -1
  197. package/dist/runtime/ui-events.js.map +1 -1
  198. package/dist/runtime/ui-view-model.d.ts +44 -1
  199. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  200. package/dist/runtime/ui-view-model.js +90 -37
  201. package/dist/runtime/ui-view-model.js.map +1 -1
  202. package/dist/sdk/query.d.ts.map +1 -1
  203. package/dist/sdk/query.js +0 -1
  204. package/dist/sdk/query.js.map +1 -1
  205. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
  206. package/dist/services/auto-fix/autoFixHook.js +3 -2
  207. package/dist/services/auto-fix/autoFixHook.js.map +1 -1
  208. package/dist/services/auto-fix/autoFixRunner.d.ts +2 -2
  209. package/dist/services/auto-fix/autoFixRunner.d.ts.map +1 -1
  210. package/dist/services/auto-fix/autoFixRunner.js +2 -2
  211. package/dist/services/auto-fix/autoFixRunner.js.map +1 -1
  212. package/dist/services/compact/auto-compact.d.ts +15 -2
  213. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  214. package/dist/services/compact/auto-compact.js +59 -27
  215. package/dist/services/compact/auto-compact.js.map +1 -1
  216. package/dist/services/compact/compact.d.ts +2 -0
  217. package/dist/services/compact/compact.d.ts.map +1 -1
  218. package/dist/services/compact/compact.js +22 -5
  219. package/dist/services/compact/compact.js.map +1 -1
  220. package/dist/services/compact/coordinator.d.ts +26 -0
  221. package/dist/services/compact/coordinator.d.ts.map +1 -0
  222. package/dist/services/compact/coordinator.js +44 -0
  223. package/dist/services/compact/coordinator.js.map +1 -0
  224. package/dist/services/compact/index.d.ts +1 -0
  225. package/dist/services/compact/index.d.ts.map +1 -1
  226. package/dist/services/compact/index.js +3 -1
  227. package/dist/services/compact/index.js.map +1 -1
  228. package/dist/services/compact/summary-generator.d.ts +6 -2
  229. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  230. package/dist/services/compact/summary-generator.js +73 -32
  231. package/dist/services/compact/summary-generator.js.map +1 -1
  232. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  233. package/dist/services/concurrent-sessions.js +3 -0
  234. package/dist/services/concurrent-sessions.js.map +1 -1
  235. package/dist/services/config-dir.d.ts +11 -1
  236. package/dist/services/config-dir.d.ts.map +1 -1
  237. package/dist/services/config-dir.js +19 -2
  238. package/dist/services/config-dir.js.map +1 -1
  239. package/dist/services/config.d.ts +13 -4
  240. package/dist/services/config.d.ts.map +1 -1
  241. package/dist/services/config.js +85 -4
  242. package/dist/services/config.js.map +1 -1
  243. package/dist/services/doctor.d.ts +2 -0
  244. package/dist/services/doctor.d.ts.map +1 -1
  245. package/dist/services/doctor.js +9 -2
  246. package/dist/services/doctor.js.map +1 -1
  247. package/dist/services/global-config.d.ts +33 -1
  248. package/dist/services/global-config.d.ts.map +1 -1
  249. package/dist/services/global-config.js +3 -0
  250. package/dist/services/global-config.js.map +1 -1
  251. package/dist/services/llm.d.ts +21 -4
  252. package/dist/services/llm.d.ts.map +1 -1
  253. package/dist/services/llm.js +75 -9
  254. package/dist/services/llm.js.map +1 -1
  255. package/dist/services/mcp/transports.d.ts +2 -0
  256. package/dist/services/mcp/transports.d.ts.map +1 -1
  257. package/dist/services/mcp/transports.js +23 -2
  258. package/dist/services/mcp/transports.js.map +1 -1
  259. package/dist/services/memory.d.ts.map +1 -1
  260. package/dist/services/memory.js.map +1 -1
  261. package/dist/services/model-context.d.ts +36 -0
  262. package/dist/services/model-context.d.ts.map +1 -1
  263. package/dist/services/model-context.js +243 -31
  264. package/dist/services/model-context.js.map +1 -1
  265. package/dist/services/redaction.js +1 -1
  266. package/dist/services/redaction.js.map +1 -1
  267. package/dist/services/session-memory/sessionMemory.js +1 -1
  268. package/dist/services/session-memory/sessionMemory.js.map +1 -1
  269. package/dist/services/session-storage.d.ts +39 -1
  270. package/dist/services/session-storage.d.ts.map +1 -1
  271. package/dist/services/session-storage.js +156 -28
  272. package/dist/services/session-storage.js.map +1 -1
  273. package/dist/services/task-manager.d.ts +2 -0
  274. package/dist/services/task-manager.d.ts.map +1 -1
  275. package/dist/services/task-manager.js +13 -0
  276. package/dist/services/task-manager.js.map +1 -1
  277. package/dist/services/usage-state.d.ts +55 -5
  278. package/dist/services/usage-state.d.ts.map +1 -1
  279. package/dist/services/usage-state.js +188 -59
  280. package/dist/services/usage-state.js.map +1 -1
  281. package/dist/services/verification-profile.d.ts.map +1 -1
  282. package/dist/services/verification-profile.js +3 -2
  283. package/dist/services/verification-profile.js.map +1 -1
  284. package/dist/services/workspace-diff.d.ts.map +1 -1
  285. package/dist/services/workspace-diff.js +34 -3
  286. package/dist/services/workspace-diff.js.map +1 -1
  287. package/dist/services/yaml-config.js +1 -1
  288. package/dist/skills/loader.d.ts +1 -1
  289. package/dist/skills/loader.d.ts.map +1 -1
  290. package/dist/skills/loader.js +1 -1
  291. package/dist/skills/loader.js.map +1 -1
  292. package/dist/skills/registry.d.ts +1 -1
  293. package/dist/skills/registry.d.ts.map +1 -1
  294. package/dist/skills/registry.js +1 -1
  295. package/dist/skills/registry.js.map +1 -1
  296. package/dist/skills/runtime.d.ts +9 -5
  297. package/dist/skills/runtime.d.ts.map +1 -1
  298. package/dist/skills/runtime.js +157 -12
  299. package/dist/skills/runtime.js.map +1 -1
  300. package/dist/terminal-ui/launch.d.ts +20 -3
  301. package/dist/terminal-ui/launch.d.ts.map +1 -1
  302. package/dist/terminal-ui/launch.js +86 -25
  303. package/dist/terminal-ui/launch.js.map +1 -1
  304. package/dist/terminal-ui/raw-editor.d.ts +9 -0
  305. package/dist/terminal-ui/raw-editor.d.ts.map +1 -1
  306. package/dist/terminal-ui/raw-editor.js +207 -30
  307. package/dist/terminal-ui/raw-editor.js.map +1 -1
  308. package/dist/tools/bash_security.d.ts.map +1 -1
  309. package/dist/tools/bash_security.js +14 -5
  310. package/dist/tools/bash_security.js.map +1 -1
  311. package/dist/tools/index.d.ts.map +1 -1
  312. package/dist/tools/index.js +51 -24
  313. package/dist/tools/index.js.map +1 -1
  314. package/dist/tools/lsp.js.map +1 -1
  315. package/dist/tools/plan.d.ts.map +1 -1
  316. package/dist/tools/plan.js +7 -0
  317. package/dist/tools/plan.js.map +1 -1
  318. package/dist/tools/web.d.ts +10 -0
  319. package/dist/tools/web.d.ts.map +1 -1
  320. package/dist/tools/web.js +84 -4
  321. package/dist/tools/web.js.map +1 -1
  322. package/dist/tui-core/frame.d.ts +13 -1
  323. package/dist/tui-core/frame.d.ts.map +1 -1
  324. package/dist/tui-core/frame.js +61 -8
  325. package/dist/tui-core/frame.js.map +1 -1
  326. package/dist/tui-core/input-parser.d.ts +1 -1
  327. package/dist/tui-core/input-parser.d.ts.map +1 -1
  328. package/dist/tui-core/input-parser.js +20 -1
  329. package/dist/tui-core/input-parser.js.map +1 -1
  330. package/dist/tui-core/style.d.ts +103 -0
  331. package/dist/tui-core/style.d.ts.map +1 -0
  332. package/dist/tui-core/style.js +269 -0
  333. package/dist/tui-core/style.js.map +1 -0
  334. package/dist/tui-core/terminal-writer.d.ts.map +1 -1
  335. package/dist/tui-core/terminal-writer.js +16 -3
  336. package/dist/tui-core/terminal-writer.js.map +1 -1
  337. package/dist/tui-ui/inline-surface.d.ts +185 -0
  338. package/dist/tui-ui/inline-surface.d.ts.map +1 -0
  339. package/dist/tui-ui/inline-surface.js +615 -0
  340. package/dist/tui-ui/inline-surface.js.map +1 -0
  341. package/dist/tui-ui/launch.d.ts +1 -0
  342. package/dist/tui-ui/launch.d.ts.map +1 -1
  343. package/dist/tui-ui/launch.js +398 -69
  344. package/dist/tui-ui/launch.js.map +1 -1
  345. package/dist/tui-ui/layout.d.ts +51 -2
  346. package/dist/tui-ui/layout.d.ts.map +1 -1
  347. package/dist/tui-ui/layout.js +240 -77
  348. package/dist/tui-ui/layout.js.map +1 -1
  349. package/dist/tui-ui/render-scheduler.d.ts +37 -0
  350. package/dist/tui-ui/render-scheduler.d.ts.map +1 -0
  351. package/dist/tui-ui/render-scheduler.js +118 -0
  352. package/dist/tui-ui/render-scheduler.js.map +1 -0
  353. package/dist/tui-ui/runner.d.ts +78 -5
  354. package/dist/tui-ui/runner.d.ts.map +1 -1
  355. package/dist/tui-ui/runner.js +317 -22
  356. package/dist/tui-ui/runner.js.map +1 -1
  357. package/dist/tui-ui/state.d.ts +38 -7
  358. package/dist/tui-ui/state.d.ts.map +1 -1
  359. package/dist/tui-ui/state.js +199 -40
  360. package/dist/tui-ui/state.js.map +1 -1
  361. package/dist/tui-ui/theme.d.ts +13 -0
  362. package/dist/tui-ui/theme.d.ts.map +1 -0
  363. package/dist/tui-ui/theme.js +20 -0
  364. package/dist/tui-ui/theme.js.map +1 -0
  365. package/dist/tui-ui/transcript-cache.d.ts +35 -0
  366. package/dist/tui-ui/transcript-cache.d.ts.map +1 -0
  367. package/dist/tui-ui/transcript-cache.js +74 -0
  368. package/dist/tui-ui/transcript-cache.js.map +1 -0
  369. package/dist/tui-ui/transcript-layout.d.ts +21 -0
  370. package/dist/tui-ui/transcript-layout.d.ts.map +1 -0
  371. package/dist/tui-ui/transcript-layout.js +398 -0
  372. package/dist/tui-ui/transcript-layout.js.map +1 -0
  373. package/dist/ui/box.d.ts.map +1 -1
  374. package/dist/ui/box.js +0 -11
  375. package/dist/ui/box.js.map +1 -1
  376. package/dist/ui/command-panel.d.ts.map +1 -1
  377. package/dist/ui/command-panel.js +1 -3
  378. package/dist/ui/command-panel.js.map +1 -1
  379. package/dist/ui/file-completion.js +1 -1
  380. package/dist/ui/file-completion.js.map +1 -1
  381. package/dist/ui/markdown.d.ts.map +1 -1
  382. package/dist/ui/markdown.js +1 -2
  383. package/dist/ui/markdown.js.map +1 -1
  384. package/dist/ui/multiline-input.d.ts.map +1 -1
  385. package/dist/ui/multiline-input.js +1 -2
  386. package/dist/ui/multiline-input.js.map +1 -1
  387. package/dist/ui/progress.d.ts.map +1 -1
  388. package/dist/ui/progress.js +0 -3
  389. package/dist/ui/progress.js.map +1 -1
  390. package/dist/ui/status-bar.d.ts +1 -1
  391. package/dist/ui/status-bar.d.ts.map +1 -1
  392. package/dist/ui/status-bar.js +2 -16
  393. package/dist/ui/status-bar.js.map +1 -1
  394. package/dist/ui/stream-markdown.d.ts +3 -0
  395. package/dist/ui/stream-markdown.d.ts.map +1 -1
  396. package/dist/ui/stream-markdown.js +0 -6
  397. package/dist/ui/stream-markdown.js.map +1 -1
  398. package/dist/ui/tool-preview.d.ts.map +1 -1
  399. package/dist/ui/tool-preview.js +0 -1
  400. package/dist/ui/tool-preview.js.map +1 -1
  401. package/dist/ui-v2/components/shell.d.ts.map +1 -1
  402. package/dist/ui-v2/components/shell.js +0 -8
  403. package/dist/ui-v2/components/shell.js.map +1 -1
  404. package/package.json +1 -1
  405. package/dist/cli-dbg.js +0 -717
  406. package/dist/cli-debug.d.ts +0 -7
  407. package/dist/cli-debug.d.ts.map +0 -1
  408. package/dist/cli-debug.js +0 -717
  409. package/dist/cli-debug.js.map +0 -1
  410. package/dist/cli-debug2.d.ts +0 -7
  411. package/dist/cli-debug2.d.ts.map +0 -1
  412. package/dist/cli-debug2.js +0 -717
  413. package/dist/cli-debug2.js.map +0 -1
  414. package/dist/cli-debug3.d.ts +0 -7
  415. package/dist/cli-debug3.d.ts.map +0 -1
  416. package/dist/cli-debug3.js +0 -719
  417. package/dist/cli-debug3.js.map +0 -1
  418. package/dist/cli-ink.d.ts +0 -8
  419. package/dist/cli-ink.d.ts.map +0 -1
  420. package/dist/cli-ink.js +0 -32
  421. package/dist/cli-ink.js.map +0 -1
  422. package/dist/cli-patch.js +0 -716
  423. package/dist/cli-test.js +0 -726
@@ -31,6 +31,7 @@ const mcp_1 = require("../tools/mcp");
31
31
  const session_storage_1 = require("../services/session-storage");
32
32
  const session_index_1 = require("../services/session-index");
33
33
  const auto_compact_1 = require("../services/compact/auto-compact");
34
+ const coordinator_1 = require("../services/compact/coordinator");
34
35
  const harness_1 = require("../harness");
35
36
  const skills_1 = require("../skills");
36
37
  const file_context_1 = require("../services/file-context");
@@ -38,6 +39,7 @@ const project_instructions_1 = require("../services/project-instructions");
38
39
  const prompt_context_1 = require("../services/prompt-context");
39
40
  const doctor_1 = require("../services/doctor");
40
41
  const model_context_1 = require("../services/model-context");
42
+ const token_estimate_1 = require("../utils/token-estimate");
41
43
  const model_catalog_1 = require("../services/model-catalog");
42
44
  const workspace_diff_1 = require("../services/workspace-diff");
43
45
  const commit_plan_1 = require("../services/commit-plan");
@@ -46,6 +48,7 @@ const checkpoint_1 = require("../core/checkpoint");
46
48
  const storage_maintenance_1 = require("../services/storage-maintenance");
47
49
  const agent_status_1 = require("../runtime/agent-status");
48
50
  const loop_budget_1 = require("../runtime/loop-budget");
51
+ const usage_state_1 = require("../services/usage-state");
49
52
  // ============================================================================
50
53
  // 颜色常量
51
54
  // ============================================================================
@@ -92,13 +95,15 @@ function formatRendererStatus(ctx) {
92
95
  renderer: ctx.uiRenderer ?? ctx.config.ui?.renderer ?? 'terminal',
93
96
  capabilities: ctx.uiCapabilities,
94
97
  });
95
- const status = snapshot.renderer.status === 'beta' || (0, config_1.isBetaUIRenderer)(snapshot.renderer.name)
96
- ? WARN('beta')
97
- : snapshot.renderer.status === 'stable'
98
- ? SUCCESS('stable')
99
- : snapshot.renderer.status === 'non-interactive'
100
- ? DIM('non-interactive')
101
- : DIM('custom');
98
+ const status = snapshot.renderer.status === 'deprecated'
99
+ ? WARN('deprecated')
100
+ : snapshot.renderer.status === 'beta' || (0, config_1.isBetaUIRenderer)(snapshot.renderer.name)
101
+ ? WARN('beta')
102
+ : snapshot.renderer.status === 'stable'
103
+ ? SUCCESS('stable')
104
+ : snapshot.renderer.status === 'non-interactive'
105
+ ? DIM('non-interactive')
106
+ : DIM('custom');
102
107
  return `${BRAND(snapshot.renderer.name)} ${status} ${DIM(snapshot.renderer.capabilityLabels.join(', '))}`;
103
108
  }
104
109
  function formatModelAliasHelp() {
@@ -243,23 +248,6 @@ function isAbortError(error, abortSignal) {
243
248
  // ============================================================================
244
249
  // 工具参数摘要
245
250
  // ============================================================================
246
- function compactToolArgs(args) {
247
- if (typeof args.path === 'string') {
248
- return args.path.length > 48 ? args.path.slice(0, 45) + '...' : args.path;
249
- }
250
- if (typeof args.command === 'string') {
251
- return args.command.length > 48 ? args.command.slice(0, 45) + '...' : args.command;
252
- }
253
- if (typeof args.pattern === 'string') {
254
- return args.pattern.length > 48 ? args.pattern.slice(0, 45) + '...' : args.pattern;
255
- }
256
- for (const val of Object.values(args)) {
257
- if (typeof val === 'string') {
258
- return val.length > 48 ? val.slice(0, 45) + '...' : val;
259
- }
260
- }
261
- return '';
262
- }
263
251
  // ============================================================================
264
252
  // 命令实现
265
253
  // ============================================================================
@@ -297,7 +285,7 @@ function showStatus(ctx) {
297
285
  console.log(` Log level ${DIM(ctx.config.logLevel)}`);
298
286
  const modelId = ctx.llm?.getModel() ?? snapshotCurrentModel(ctx);
299
287
  const modelContext = (0, model_context_1.resolveModelContext)(modelId);
300
- const compactStats = (0, auto_compact_1.getAutoCompact)({ modelId }).getStats();
288
+ const compactStats = getCommandAutoCompact(ctx, modelId).getStats();
301
289
  console.log(` Model ${BRAND(modelId)}`);
302
290
  console.log(` Context ${DIM(`${formatTokenCount(modelContext.contextWindow)} tokens (${modelContext.source}${modelContext.source === 'fuzzy' ? `:${modelContext.matchedId}` : ''})`)}`);
303
291
  console.log(` Compact ${compactStats.enabled ? SUCCESS('auto') : WARN('off')} ${DIM(`predict ${formatThreshold(compactStats.predictiveCompactThreshold)}, hard ${formatThreshold(compactStats.threshold)}, used ${compactStats.ctxPercent}%`)}`);
@@ -1008,6 +996,17 @@ function handleCheckpoint(ctx, args = '') {
1008
996
  function snapshotCurrentModel(ctx) {
1009
997
  return ctx.store.getSnapshot().currentModel || ctx.config.model;
1010
998
  }
999
+ function getCommandAutoCompact(ctx, modelId) {
1000
+ if (ctx.compactCoordinator) {
1001
+ ctx.compactCoordinator.configure({
1002
+ modelId,
1003
+ llm: ctx.llm,
1004
+ outputReserveTokens: ctx.llm?.getMaxTokens?.(),
1005
+ });
1006
+ return ctx.compactCoordinator.getAutomatic();
1007
+ }
1008
+ return (0, auto_compact_1.getAutoCompact)({ modelId });
1009
+ }
1011
1010
  function showAgents(ctx) {
1012
1011
  console.log();
1013
1012
  console.log(HEADER('Registered Agents'));
@@ -1042,7 +1041,7 @@ function showMemory(ctx) {
1042
1041
  console.log();
1043
1042
  return { success: true };
1044
1043
  }
1045
- async function handleMemoryReindex(ctx) {
1044
+ async function handleMemoryReindex(_ctx) {
1046
1045
  const { isSemanticEnabled, getSemanticSearchService } = require('../memory/semantic-search');
1047
1046
  if (!isSemanticEnabled()) {
1048
1047
  console.log();
@@ -1249,9 +1248,7 @@ function showHarness(ctx, args = '') {
1249
1248
  }
1250
1249
  console.log();
1251
1250
  console.log(HEADER(' Auto Compact'));
1252
- const compactStats = (0, auto_compact_1.getAutoCompact)({
1253
- modelId: state.promptAssemblyStats?.modelId ?? snapshotCurrentModel(ctx),
1254
- }).getStats();
1251
+ const compactStats = getCommandAutoCompact(ctx, state.promptAssemblyStats?.modelId ?? snapshotCurrentModel(ctx)).getStats();
1255
1252
  const contextInfo = (0, model_context_1.resolveModelContext)(compactStats.modelId);
1256
1253
  console.log(` Model ${ACCENT(compactStats.modelId)}`);
1257
1254
  console.log(` Window ${DIM(`${formatTokenCount(contextInfo.contextWindow)} tokens (${contextInfo.source}${contextInfo.source === 'fuzzy' ? `:${contextInfo.matchedId}` : ''})`)}`);
@@ -1320,7 +1317,7 @@ function handleModel(ctx, args) {
1320
1317
  const currentModel = ctx.llm.getModel();
1321
1318
  const aliasEntry = (0, model_catalog_1.getModelCatalogEntry)(currentModel);
1322
1319
  const contextInfo = (0, model_context_1.resolveModelContext)(currentModel);
1323
- const compactStats = (0, auto_compact_1.getAutoCompact)({ modelId: currentModel }).getStats();
1320
+ const compactStats = getCommandAutoCompact(ctx, currentModel).getStats();
1324
1321
  console.log(HEADER('Current Model'));
1325
1322
  console.log(DIM('─'.repeat(40)));
1326
1323
  console.log(` Model ${BRAND(currentModel)}`);
@@ -1396,7 +1393,7 @@ function handleModel(ctx, args) {
1396
1393
  // 解析别名
1397
1394
  const resolvedModel = (0, model_catalog_1.resolveModelAlias)(args);
1398
1395
  ctx.llm.setModel(resolvedModel);
1399
- (0, auto_compact_1.getAutoCompact)({ modelId: resolvedModel });
1396
+ getCommandAutoCompact(ctx, resolvedModel);
1400
1397
  ctx.store.setState({ currentModel: resolvedModel });
1401
1398
  console.log(SUCCESS(`✔ Model changed to ${BRAND(resolvedModel)}`));
1402
1399
  const contextInfo = (0, model_context_1.resolveModelContext)(resolvedModel);
@@ -1453,7 +1450,7 @@ function handleMode(ctx, args) {
1453
1450
  };
1454
1451
  }
1455
1452
  function handleTask(ctx, args) {
1456
- const [sub, ...rest] = args.trim().split(/\s+/);
1453
+ const [sub] = args.trim().split(/\s+/);
1457
1454
  if (sub === 'list' || sub === 'ls') {
1458
1455
  if (!taskManager) {
1459
1456
  taskManager = new task_manager_1.TaskManager();
@@ -1872,11 +1869,12 @@ async function handleExit(ctx) {
1872
1869
  }
1873
1870
  function handleCost(ctx) {
1874
1871
  console.log();
1875
- console.log(HEADER('Session Cost'));
1872
+ console.log(HEADER('Lifetime Cost'));
1876
1873
  console.log(DIM('─'.repeat(40)));
1877
1874
  const costTracker = ctx.store.getSnapshot().costTracker;
1878
- const stats = costTracker.getSessionStats();
1879
- if (stats.recordCount === 0) {
1875
+ const state = (0, usage_state_1.loadUsageState)();
1876
+ const ledger = (0, usage_state_1.summarizeUsageLedger)();
1877
+ if (state.totalTokens === 0 && state.totalCost === 0) {
1880
1878
  console.log(DIM(' No usage recorded yet.'));
1881
1879
  console.log(DIM(' Use /run or /chat to interact with LLM.'));
1882
1880
  console.log();
@@ -1884,19 +1882,36 @@ function handleCost(ctx) {
1884
1882
  }
1885
1883
  // Summary
1886
1884
  console.log();
1887
- console.log(` ${ACCENT('Total Tokens')} ${stats.totalTokens}`);
1888
- console.log(` ${ACCENT('Prompt')} ${stats.totalPromptTokens}`);
1889
- console.log(` ${ACCENT('Completion')} ${stats.totalCompletionTokens}`);
1890
- console.log(` ${ACCENT('Est. Cost')} ${costTracker.formatCost(stats.totalCost)}`);
1891
- console.log(` ${ACCENT('Requests')} ${stats.recordCount}`);
1885
+ console.log(` ${ACCENT('Total Tokens')} ${state.totalTokens.toLocaleString()}`);
1886
+ console.log(` ${ACCENT('Tracked Cost')} ${costTracker.formatCost(state.totalCost)}`);
1887
+ console.log(` ${ACCENT('Provider Cost')} ${costTracker.formatCost(state.providerCost)}`);
1888
+ console.log(` ${ACCENT('Estimated Cost')} ${costTracker.formatCost(state.estimatedCost)}`);
1889
+ console.log(` ${ACCENT('Requests')} ${state.usageRecords.toLocaleString()}`);
1890
+ console.log(` ${ACCENT('Sessions')} ${state.totalSessions.toLocaleString()}`);
1892
1891
  // By Model
1893
- if (Object.keys(stats.byModel).length > 0) {
1892
+ if (Object.keys(ledger.byModel).length > 0) {
1894
1893
  console.log();
1895
1894
  console.log(HEADER(' By Model:'));
1896
- for (const [model, data] of Object.entries(stats.byModel)) {
1895
+ for (const [model, data] of Object.entries(ledger.byModel)) {
1897
1896
  console.log(` ${BRAND(model.padEnd(20))} ${data.tokens} tokens, ${costTracker.formatCost(data.cost)}`);
1898
1897
  }
1899
1898
  }
1899
+ console.log();
1900
+ console.log(HEADER(' Cost Sources:'));
1901
+ for (const source of ['provider', 'configured', 'builtin', 'fallback']) {
1902
+ const data = ledger.bySource[source];
1903
+ if (data.count === 0)
1904
+ continue;
1905
+ console.log(` ${source.padEnd(12)} ${data.count} requests, ${costTracker.formatCost(data.cost)}`);
1906
+ }
1907
+ if (state.baselineCost > 0 || state.baselineTokens > 0) {
1908
+ console.log(DIM(` legacy ${state.baselineTokens.toLocaleString()} tokens, ${costTracker.formatCost(state.baselineCost)}`));
1909
+ }
1910
+ if (ledger.bySource.fallback.count > 0) {
1911
+ console.log();
1912
+ console.log(WARN(' Unknown-model fallback pricing is an estimate.'));
1913
+ console.log(DIM(' Configure cost.modelPricing in ~/.openhorse/openhorse.json for accuracy.'));
1914
+ }
1900
1915
  // Budget
1901
1916
  const budget = costTracker.getBudget();
1902
1917
  if (budget !== null) {
@@ -1904,13 +1919,13 @@ function handleCost(ctx) {
1904
1919
  console.log();
1905
1920
  console.log(HEADER(' Budget:'));
1906
1921
  console.log(` ${ACCENT('Limit')} ${costTracker.formatCost(budget)}`);
1907
- console.log(` ${ACCENT('Used')} ${costTracker.formatCost(check.used)}`);
1922
+ console.log(` ${ACCENT('Used this run')} ${costTracker.formatCost(check.used)}`);
1908
1923
  console.log(` ${check.ok ? SUCCESS('✓ Within budget') : WARN('⚠ Budget exceeded')}`);
1909
1924
  }
1910
1925
  console.log();
1911
1926
  return { success: true };
1912
1927
  }
1913
- function handleSkills(ctx) {
1928
+ function handleSkills(_ctx) {
1914
1929
  console.log();
1915
1930
  console.log(HEADER('Loaded Skills'));
1916
1931
  console.log(DIM('─'.repeat(40)));
@@ -1949,7 +1964,7 @@ function handleSkills(ctx) {
1949
1964
  }
1950
1965
  return { success: true };
1951
1966
  }
1952
- function handleSkill(args) {
1967
+ function handleSkill(ctx, args) {
1953
1968
  const trimmed = args.trim();
1954
1969
  const registry = (0, skills_1.getSkillsRegistry)();
1955
1970
  registry.initialize();
@@ -1963,9 +1978,17 @@ function handleSkill(args) {
1963
1978
  ].join('\n'),
1964
1979
  };
1965
1980
  }
1966
- const [rawName, ...rest] = trimmed.split(/\s+/);
1967
- const requestedName = (0, skills_1.normalizeRequestedSkillName)(rawName);
1968
- const skill = registry.getAllSkills()
1981
+ const parsed = (0, skills_1.parseSkillCommandInput)(`/skill ${trimmed}`);
1982
+ const rawName = trimmed.split(/\s+/, 1)[0] || '';
1983
+ const requestedName = parsed.skillName || (0, skills_1.normalizeRequestedSkillName)(rawName);
1984
+ const referencedSkill = (0, skills_1.loadExplicitSkillReference)(`/skill ${trimmed}`, ctx.cwd);
1985
+ if (parsed.skillPath && !referencedSkill) {
1986
+ return {
1987
+ success: false,
1988
+ error: `Invalid skill reference: ${parsed.skillPath}`,
1989
+ };
1990
+ }
1991
+ const skill = referencedSkill || registry.getAllSkills()
1969
1992
  .find(candidate => (0, skills_1.skillActivationNames)(candidate)
1970
1993
  .some(name => (0, skills_1.normalizeRequestedSkillName)(name) === requestedName));
1971
1994
  if (!skill) {
@@ -1980,30 +2003,40 @@ function handleSkill(args) {
1980
2003
  : `Unknown skill: ${rawName}`,
1981
2004
  };
1982
2005
  }
1983
- const task = rest.join(' ').trim();
2006
+ const task = parsed.task;
1984
2007
  const source = registry.getSource(skill.name);
1985
2008
  const resourceRoot = skill.resourceRoot || skill.source || source?.path;
1986
2009
  const skillFile = resourceRoot
1987
2010
  ? `${resourceRoot.replace(/\/SKILL\.md$/i, '')}/SKILL.md`
1988
2011
  : source?.skillFile;
1989
2012
  if (!task) {
2013
+ const usageSelector = parsed.skillPath
2014
+ ? `[$${skill.name}](${formatSkillReferencePath(parsed.skillPath)})`
2015
+ : skill.name;
1990
2016
  return {
1991
2017
  success: true,
1992
2018
  output: [
1993
- `Skill ${skill.name} is loaded.`,
2019
+ parsed.skillPath
2020
+ ? `Skill reference ${skill.name} is valid for one turn.`
2021
+ : `Skill ${skill.name} is loaded.`,
1994
2022
  skillFile ? `SKILL.md ${skillFile}` : '',
1995
2023
  resourceRoot ? `Root ${resourceRoot}` : '',
1996
- `Use: /skill ${skill.name} <task>`,
2024
+ `Use: /skill ${usageSelector} <task>`,
1997
2025
  ].filter(Boolean).join('\n'),
1998
2026
  };
1999
2027
  }
2000
2028
  return {
2001
2029
  success: true,
2002
2030
  continueAsChat: true,
2003
- chatInput: `/skill ${skill.name} ${task}`,
2031
+ chatInput: parsed.skillPath
2032
+ ? `/skill [$${skill.name}](${formatSkillReferencePath(parsed.skillPath)}) ${task}`
2033
+ : `/skill ${skill.name} ${task}`,
2004
2034
  };
2005
2035
  }
2006
- function handleMcp(ctx) {
2036
+ function formatSkillReferencePath(path) {
2037
+ return /[\s()]/u.test(path) ? `<${path}>` : path;
2038
+ }
2039
+ function handleMcp(_ctx) {
2007
2040
  console.log();
2008
2041
  console.log(HEADER('MCP Servers'));
2009
2042
  console.log(DIM('─'.repeat(40)));
@@ -2175,29 +2208,78 @@ async function handleCompact(ctx, args) {
2175
2208
  }
2176
2209
  console.log(DIM((0, agent_status_1.compactStatus)()));
2177
2210
  try {
2178
- const autoCompact = (0, auto_compact_1.getAutoCompact)();
2179
- autoCompact.configure({
2180
- maxMessages: threshold,
2211
+ const modelId = ctx.llm?.getModel() ?? ctx.store.getSnapshot().currentModel;
2212
+ const coordinator = ctx.compactCoordinator ?? new coordinator_1.CompactCoordinator({
2213
+ modelId,
2214
+ llm: ctx.llm,
2215
+ outputReserveTokens: ctx.llm?.getMaxTokens?.(),
2181
2216
  getContextCapsule: () => ctx.store.getSnapshot().harnessState?.capsule,
2182
2217
  getHarnessState: () => ctx.store.getSnapshot().harnessState,
2218
+ });
2219
+ coordinator.configure({
2220
+ modelId,
2183
2221
  llm: ctx.llm,
2222
+ outputReserveTokens: ctx.llm?.getMaxTokens?.(),
2223
+ getContextCapsule: () => ctx.store.getSnapshot().harnessState?.capsule,
2224
+ getHarnessState: () => ctx.store.getSnapshot().harnessState,
2225
+ });
2226
+ const beforeTokens = (0, token_estimate_1.estimateMessagesTokens)(history);
2227
+ const automaticStats = coordinator.getAutomatic().getStats();
2228
+ const beforeUsage = (0, model_context_1.createContextUsageSnapshot)({
2229
+ modelId,
2230
+ usedTokens: beforeTokens,
2231
+ source: 'estimated',
2232
+ outputReserveTokens: ctx.llm?.getMaxTokens?.(),
2233
+ warningThreshold: automaticStats.preCompactThreshold,
2234
+ autoCompactThreshold: automaticStats.threshold,
2235
+ autoCompactEnabled: automaticStats.enabled,
2236
+ });
2237
+ const result = await coordinator.compactManual(history, threshold);
2238
+ const compacted = result.messages;
2239
+ const compactedTokens = (0, token_estimate_1.estimateMessagesTokens)(compacted);
2240
+ const afterUsage = (0, model_context_1.createContextUsageSnapshot)({
2241
+ modelId,
2242
+ usedTokens: compactedTokens,
2243
+ source: 'estimated',
2244
+ outputReserveTokens: ctx.llm?.getMaxTokens?.(),
2245
+ warningThreshold: automaticStats.preCompactThreshold,
2246
+ autoCompactThreshold: automaticStats.threshold,
2247
+ autoCompactEnabled: automaticStats.enabled,
2184
2248
  });
2185
- const compacted = await autoCompact.forceCompact(history);
2186
- // 更新 store
2187
- ctx.store.setState({ conversationHistory: compacted });
2188
2249
  const reduction = history.length - compacted.length;
2189
2250
  const percent = Math.round((reduction / history.length) * 100);
2190
2251
  const sessionId = ctx.getSession?.()?.id ?? ctx.sessionId;
2191
2252
  if (sessionId) {
2192
- (0, session_storage_1.persistSessionCompactHistory)(sessionId, compacted);
2253
+ const sourceMessageCount = (0, session_storage_1.readSessionMessages)(sessionId).length;
2254
+ const checkpoint = (0, session_storage_1.commitSessionCompactCheckpoint)({
2255
+ sessionId,
2256
+ mode: 'manual',
2257
+ modelId,
2258
+ sourceMessageCount,
2259
+ transcriptStartMessageIndex: Math.max(0, sourceMessageCount - threshold),
2260
+ modelHistory: compacted,
2261
+ summary: {
2262
+ text: result.summary,
2263
+ generatedAt: result.summaryGeneratedAt,
2264
+ source: result.summarySource,
2265
+ },
2266
+ beforeUsage,
2267
+ afterUsage,
2268
+ });
2269
+ ctx.store.setState({ conversationHistory: checkpoint.modelHistory });
2193
2270
  }
2271
+ else {
2272
+ ctx.store.setState({ conversationHistory: compacted });
2273
+ }
2274
+ ctx.store.setContextUsage(afterUsage);
2194
2275
  console.log(SUCCESS(`✔ Compacted ${history.length} → ${compacted.length} messages`));
2195
2276
  console.log(DIM(` Reduced by ${reduction} messages (${percent}%)`));
2196
2277
  console.log();
2197
2278
  return { success: true };
2198
2279
  }
2199
2280
  catch (err) {
2200
- console.log(ERROR(`✗ Compact failed: ${err.message}`));
2281
+ const message = err instanceof Error ? err.message : String(err);
2282
+ console.log(ERROR(`✗ Compact failed: ${message}`));
2201
2283
  console.log();
2202
2284
  return { success: false };
2203
2285
  }
@@ -2456,20 +2538,22 @@ function handleResume(ctx, args) {
2456
2538
  }
2457
2539
  function restoreSession(ctx, session, isLast) {
2458
2540
  const resumed = (0, session_storage_1.resumeSession)(session.id) ?? session;
2459
- console.log();
2460
- console.log(HEADER(isLast ? 'Resuming last session' : `Resuming session ${resumed.id.slice(0, 8)}`));
2461
- console.log(DIM(` ID: ${resumed.id}`));
2462
- console.log(DIM(` Model: ${resumed.model}`));
2463
- console.log(DIM(` Project: ${resumed.projectPath}`));
2464
- console.log(DIM(` Started: ${new Date(resumed.startTime).toLocaleString()}`));
2541
+ // Swap in the resumed session's transcript BEFORE emitting any command output,
2542
+ // so the output is appended after the history rather than wiped by the
2543
+ // transcript replacement below.
2465
2544
  ctx.setSession?.(resumed);
2466
- // Load history and show summary
2545
+ // Load history and notify runtime/TUI consumers.
2467
2546
  const history = (0, session_storage_1.loadSessionHistory)(resumed.id);
2547
+ const transcriptMessages = (0, session_storage_1.loadSessionTranscriptMessages)(resumed.id);
2548
+ const rawMessages = (0, session_storage_1.readSessionMessages)(resumed.id);
2549
+ const checkpoint = (0, session_storage_1.loadSessionCompactCheckpoint)(resumed.id);
2550
+ const resumeGeneratedAt = Date.now();
2551
+ const summary = checkpoint?.summary.text ?? (history.length > 0 ? generateHistorySummary(history) : '');
2552
+ const summaryGeneratedAt = checkpoint?.summary.generatedAt ?? resumeGeneratedAt;
2553
+ const summarySource = checkpoint?.summary.source ?? 'resume_heuristic';
2554
+ const summaryCoveredMessages = checkpoint?.summary.sourceMessageCount ?? rawMessages.length;
2468
2555
  if (history.length > 0) {
2469
- const summary = generateHistorySummary(history);
2470
- const eventSummary = generateRestoredSessionEventSummary(history);
2471
- console.log(DIM(` Summary: ${summary}`));
2472
- console.log();
2556
+ const eventSummary = checkpoint?.summary.text ?? generateRestoredSessionEventSummary(history);
2473
2557
  ctx.store.setState({ conversationHistory: history });
2474
2558
  ctx.store.setState({ harnessState: (0, session_storage_1.loadSessionHarnessState)(resumed.id) ?? resumed.harnessState });
2475
2559
  (0, framework_1.resetToolState)();
@@ -2480,21 +2564,62 @@ function restoreSession(ctx, session, isLast) {
2480
2564
  restoredMessages: history.length,
2481
2565
  messageCount: resumed.messageCount,
2482
2566
  summary: eventSummary,
2567
+ summaryGeneratedAt,
2568
+ summarySource,
2569
+ summaryCoveredMessages,
2570
+ checkpointId: checkpoint?.checkpointId,
2571
+ transcriptMessages: transcriptMessages.length,
2483
2572
  });
2484
- console.log(SUCCESS(`✔ Restored ${history.length} messages`));
2485
2573
  }
2486
2574
  else {
2487
- console.log();
2488
- console.log(DIM(' No messages in session'));
2489
2575
  ctx.sessionRestored?.({
2490
2576
  sessionId: resumed.id,
2491
2577
  projectPath: resumed.projectPath,
2492
2578
  model: resumed.model,
2493
2579
  restoredMessages: 0,
2494
2580
  messageCount: resumed.messageCount,
2581
+ summaryGeneratedAt,
2582
+ summarySource,
2583
+ summaryCoveredMessages,
2584
+ checkpointId: checkpoint?.checkpointId,
2585
+ transcriptMessages: transcriptMessages.length,
2495
2586
  });
2496
2587
  }
2497
- console.log();
2588
+ // Emit the resume summary. In TUI (inline-surface) mode, route through the
2589
+ // command-output sink instead of raw console.log: a bare console.log writes
2590
+ // directly to stdout and desyncs the surface's cursor tracking, leaving the
2591
+ // live region mis-positioned (blank lower screen, content stuck at top).
2592
+ // Plain text is used so no raw ANSI escapes leak into the TUI frame.
2593
+ const bannerLines = [
2594
+ isLast ? 'Resuming last session' : `Resuming session ${resumed.id.slice(0, 8)}`,
2595
+ ` ID: ${resumed.id}`,
2596
+ ` Model: ${resumed.model}`,
2597
+ ` Project: ${resumed.projectPath}`,
2598
+ ` Started: ${new Date(resumed.startTime).toLocaleString()}`,
2599
+ ];
2600
+ if (history.length > 0) {
2601
+ bannerLines.push(` Summary: ${summary}`);
2602
+ bannerLines.push(` Generated: ${new Date(summaryGeneratedAt).toLocaleString()} (${checkpoint ? 'compact checkpoint' : 'generated on resume'})`);
2603
+ bannerLines.push(` Covers: ${summaryCoveredMessages} source messages`);
2604
+ bannerLines.push(`✔ Restored ${history.length} model-context messages / ${transcriptMessages.length} transcript messages`);
2605
+ }
2606
+ else {
2607
+ bannerLines.push(' No messages in session');
2608
+ }
2609
+ if (ctx.uiRenderer === 'tui' || ctx.uiRenderer === 'ink') {
2610
+ if (!ctx.sessionRestored) {
2611
+ for (const line of bannerLines)
2612
+ ctx.writeLine?.(line);
2613
+ }
2614
+ }
2615
+ else {
2616
+ console.log();
2617
+ console.log(HEADER(bannerLines[0]));
2618
+ for (const line of bannerLines.slice(1)) {
2619
+ console.log(line.startsWith('✔') ? SUCCESS(line) : DIM(line));
2620
+ }
2621
+ console.log();
2622
+ }
2498
2623
  return { success: true };
2499
2624
  }
2500
2625
  function handleSessionRename(ctx, args) {
@@ -2803,7 +2928,7 @@ const COMMANDS = [
2803
2928
  category: 'context',
2804
2929
  priority: 21,
2805
2930
  type: 'chat',
2806
- execute: (_ctx, args) => handleSkill(args),
2931
+ execute: (ctx, args) => handleSkill(ctx, args),
2807
2932
  },
2808
2933
  {
2809
2934
  name: 'memory',