@pentoshi/clai 4.19.0 → 5.0.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 (570) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/PROVIDERS.md +2 -2
  3. package/REA.md +96 -0
  4. package/README.md +2 -0
  5. package/dist/agent/compaction/compaction-prompt.d.ts +49 -0
  6. package/dist/agent/compaction/compaction-prompt.js +163 -0
  7. package/dist/agent/compaction/compaction-prompt.js.map +1 -0
  8. package/dist/agent/compaction/memory-sections.d.ts +27 -0
  9. package/dist/agent/compaction/memory-sections.js +144 -0
  10. package/dist/agent/compaction/memory-sections.js.map +1 -0
  11. package/dist/agent/compaction-summary.d.ts +2 -33
  12. package/dist/agent/compaction-summary.js +3 -113
  13. package/dist/agent/compaction-summary.js.map +1 -1
  14. package/dist/agent/context/compact-with-summary.d.ts +2 -4
  15. package/dist/agent/context/compact-with-summary.js +42 -68
  16. package/dist/agent/context/compact-with-summary.js.map +1 -1
  17. package/dist/agent/context/compaction-recent-history.d.ts +4 -3
  18. package/dist/agent/context/compaction-recent-history.js +30 -52
  19. package/dist/agent/context/compaction-recent-history.js.map +1 -1
  20. package/dist/agent/context/compaction-user-instructions.d.ts +5 -6
  21. package/dist/agent/context/compaction-user-instructions.js +156 -231
  22. package/dist/agent/context/compaction-user-instructions.js.map +1 -1
  23. package/dist/agent/context-manager.js +17 -8
  24. package/dist/agent/context-manager.js.map +1 -1
  25. package/dist/agent/events.d.ts +6 -0
  26. package/dist/agent/parser/dsml.d.ts +30 -0
  27. package/dist/agent/parser/dsml.js +233 -0
  28. package/dist/agent/parser/dsml.js.map +1 -0
  29. package/dist/agent/parser/vendor-protocols.d.ts +2 -5
  30. package/dist/agent/parser/vendor-protocols.js +4 -93
  31. package/dist/agent/parser/vendor-protocols.js.map +1 -1
  32. package/dist/agent/plan-implement-compact.js +1 -2
  33. package/dist/agent/plan-implement-compact.js.map +1 -1
  34. package/dist/agent/reliability-policy.d.ts +1 -0
  35. package/dist/agent/reliability-policy.js +14 -15
  36. package/dist/agent/reliability-policy.js.map +1 -1
  37. package/dist/agent/runner.js +12 -1
  38. package/dist/agent/runner.js.map +1 -1
  39. package/dist/agent/tool-call-parser.js +6 -8
  40. package/dist/agent/tool-call-parser.js.map +1 -1
  41. package/dist/agent/turn/event-emitter.js +2 -0
  42. package/dist/agent/turn/event-emitter.js.map +1 -1
  43. package/dist/agent/turn/loop/answer-path.js +3 -1
  44. package/dist/agent/turn/loop/answer-path.js.map +1 -1
  45. package/dist/agent/turn/loop/canonicalize-turn-call.js +5 -3
  46. package/dist/agent/turn/loop/canonicalize-turn-call.js.map +1 -1
  47. package/dist/agent/turn/loop/output-budget.d.ts +0 -1
  48. package/dist/agent/turn/loop/output-budget.js +5 -13
  49. package/dist/agent/turn/loop/output-budget.js.map +1 -1
  50. package/dist/agent/turn/loop/request-assembly.js +39 -33
  51. package/dist/agent/turn/loop/request-assembly.js.map +1 -1
  52. package/dist/agent/turn/loop/round-request.js +31 -18
  53. package/dist/agent/turn/loop/round-request.js.map +1 -1
  54. package/dist/agent/turn/loop/run-rounds.js +0 -2
  55. package/dist/agent/turn/loop/run-rounds.js.map +1 -1
  56. package/dist/agent/turn/loop/tool-call-recovery.d.ts +2 -0
  57. package/dist/agent/turn/loop/tool-call-recovery.js +26 -11
  58. package/dist/agent/turn/loop/tool-call-recovery.js.map +1 -1
  59. package/dist/agent/turn/mcp-agent-tools.d.ts +3 -0
  60. package/dist/agent/turn/mcp-agent-tools.js +11 -2
  61. package/dist/agent/turn/mcp-agent-tools.js.map +1 -1
  62. package/dist/agent/turn/prompt-sections.js +1 -0
  63. package/dist/agent/turn/prompt-sections.js.map +1 -1
  64. package/dist/agent/turn/scaffold-preflight.d.ts +6 -1
  65. package/dist/agent/turn/scaffold-preflight.js +10 -2
  66. package/dist/agent/turn/scaffold-preflight.js.map +1 -1
  67. package/dist/agent/turn/setup/mcp-agent-ports.d.ts +5 -1
  68. package/dist/agent/turn/setup/mcp-agent-ports.js +2 -0
  69. package/dist/agent/turn/setup/mcp-agent-ports.js.map +1 -1
  70. package/dist/agent/turn/system-sections.d.ts +2 -0
  71. package/dist/agent/turn/system-sections.js +12 -8
  72. package/dist/agent/turn/system-sections.js.map +1 -1
  73. package/dist/agent/turn/tool-execution/deps.d.ts +2 -0
  74. package/dist/agent/turn/tool-execution/single-tool.js +4 -1
  75. package/dist/agent/turn/tool-execution/single-tool.js.map +1 -1
  76. package/dist/agent/turn/turn-counters.d.ts +1 -0
  77. package/dist/agent/turn/turn-counters.js +2 -0
  78. package/dist/agent/turn/turn-counters.js.map +1 -1
  79. package/dist/agent/turn/workspace-setup.d.ts +7 -2
  80. package/dist/agent/turn/workspace-setup.js +45 -30
  81. package/dist/agent/turn/workspace-setup.js.map +1 -1
  82. package/dist/agent/workspace-orient.d.ts +4 -0
  83. package/dist/agent/workspace-orient.js +83 -37
  84. package/dist/agent/workspace-orient.js.map +1 -1
  85. package/dist/app/adapters/agent-event-adapter.d.ts +1 -0
  86. package/dist/app/adapters/agent-event-adapter.js +17 -2
  87. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  88. package/dist/app/adapters/current-agent-adapter.js +1 -0
  89. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  90. package/dist/app/adapters/current-store-adapter.js +3 -0
  91. package/dist/app/adapters/current-store-adapter.js.map +1 -1
  92. package/dist/app/commands/catalog.js +9 -4
  93. package/dist/app/commands/catalog.js.map +1 -1
  94. package/dist/app/controllers/session-compact-helper.js +2 -5
  95. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  96. package/dist/app/controllers/session-controller.js +34 -3
  97. package/dist/app/controllers/session-controller.js.map +1 -1
  98. package/dist/app/controllers/session-prompt-queue.d.ts +13 -1
  99. package/dist/app/controllers/session-prompt-queue.js +96 -24
  100. package/dist/app/controllers/session-prompt-queue.js.map +1 -1
  101. package/dist/app/controllers/turn-controller.d.ts +1 -0
  102. package/dist/app/controllers/turn-controller.js +14 -1
  103. package/dist/app/controllers/turn-controller.js.map +1 -1
  104. package/dist/app/events/app-event.d.ts +4 -0
  105. package/dist/app/events/app-event.js.map +1 -1
  106. package/dist/app/ports/agent-port.d.ts +1 -0
  107. package/dist/app/ports/persistence-port.d.ts +7 -0
  108. package/dist/app/ports/transcript-item.d.ts +2 -0
  109. package/dist/classic/app/app-wiring.d.ts +5 -2
  110. package/dist/classic/app/app-wiring.js +7 -3
  111. package/dist/classic/app/app-wiring.js.map +1 -1
  112. package/dist/classic/app/paint-pacing.js +2 -2
  113. package/dist/classic/app/paint-pacing.js.map +1 -1
  114. package/dist/classic/app/use-feed.js +7 -9
  115. package/dist/classic/app/use-feed.js.map +1 -1
  116. package/dist/classic/app/wiring-disclosure.js +1 -1
  117. package/dist/classic/app/wiring-disclosure.js.map +1 -1
  118. package/dist/classic/app/wiring-feed-scroll.d.ts +5 -0
  119. package/dist/classic/app/wiring-feed-scroll.js +39 -0
  120. package/dist/classic/app/wiring-feed-scroll.js.map +1 -0
  121. package/dist/classic/app/wiring-interactions.d.ts +0 -3
  122. package/dist/classic/app/wiring-interactions.js +6 -28
  123. package/dist/classic/app/wiring-interactions.js.map +1 -1
  124. package/dist/classic/app/wiring-lifecycle.d.ts +1 -0
  125. package/dist/classic/app/wiring-lifecycle.js +11 -1
  126. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  127. package/dist/classic/app/wiring-selection.js +46 -37
  128. package/dist/classic/app/wiring-selection.js.map +1 -1
  129. package/dist/classic/app/wiring-types.d.ts +5 -2
  130. package/dist/classic/blocks/intro-lines.js +1 -0
  131. package/dist/classic/blocks/intro-lines.js.map +1 -1
  132. package/dist/classic/blocks/thinking-lines.d.ts +6 -0
  133. package/dist/classic/blocks/thinking-lines.js +21 -7
  134. package/dist/classic/blocks/thinking-lines.js.map +1 -1
  135. package/dist/classic/blocks/tool-lines.js +1 -1
  136. package/dist/classic/blocks/tool-lines.js.map +1 -1
  137. package/dist/classic/blocks/turn-summary-lines.d.ts +1 -1
  138. package/dist/classic/blocks/turn-summary-lines.js +5 -3
  139. package/dist/classic/blocks/turn-summary-lines.js.map +1 -1
  140. package/dist/classic/bootstrap/start-classic.js +4 -1
  141. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  142. package/dist/classic/chrome/composer-mentions.js +2 -1
  143. package/dist/classic/chrome/composer-mentions.js.map +1 -1
  144. package/dist/classic/chrome/directory-row.js +5 -5
  145. package/dist/classic/chrome/directory-row.js.map +1 -1
  146. package/dist/classic/chrome/status-rows.d.ts +2 -1
  147. package/dist/classic/chrome/status-rows.js +18 -8
  148. package/dist/classic/chrome/status-rows.js.map +1 -1
  149. package/dist/classic/feed/feed-blocks.js +6 -4
  150. package/dist/classic/feed/feed-blocks.js.map +1 -1
  151. package/dist/classic/feed/transcript-selection.d.ts +2 -1
  152. package/dist/classic/feed/transcript-selection.js +15 -10
  153. package/dist/classic/feed/transcript-selection.js.map +1 -1
  154. package/dist/classic/panels/confirm-panel.js +1 -0
  155. package/dist/classic/panels/confirm-panel.js.map +1 -1
  156. package/dist/classic/panels/jobs-panel.js +1 -1
  157. package/dist/classic/panels/jobs-panel.js.map +1 -1
  158. package/dist/classic/render/shell-width.js +1 -1
  159. package/dist/classic/render/shell-width.js.map +1 -1
  160. package/dist/classic/render/widest-line.d.ts +1 -0
  161. package/dist/classic/render/widest-line.js +5 -0
  162. package/dist/classic/render/widest-line.js.map +1 -0
  163. package/dist/commands/doctor.js +2 -1
  164. package/dist/commands/doctor.js.map +1 -1
  165. package/dist/index.js +5 -4
  166. package/dist/index.js.map +1 -1
  167. package/dist/instructions/scaffold.js +2 -1
  168. package/dist/instructions/scaffold.js.map +1 -1
  169. package/dist/llm/agentrouter.js +6 -11
  170. package/dist/llm/agentrouter.js.map +1 -1
  171. package/dist/llm/anthropic.js +6 -8
  172. package/dist/llm/anthropic.js.map +1 -1
  173. package/dist/llm/bynara.js +6 -10
  174. package/dist/llm/bynara.js.map +1 -1
  175. package/dist/llm/cline.js +3 -2
  176. package/dist/llm/cline.js.map +1 -1
  177. package/dist/llm/codex-models.d.ts +1 -1
  178. package/dist/llm/codex-models.js +11 -6
  179. package/dist/llm/codex-models.js.map +1 -1
  180. package/dist/llm/codex.js +2 -1
  181. package/dist/llm/codex.js.map +1 -1
  182. package/dist/llm/constellation.js +5 -0
  183. package/dist/llm/constellation.js.map +1 -1
  184. package/dist/llm/context-windows.js +17 -13
  185. package/dist/llm/context-windows.js.map +1 -1
  186. package/dist/llm/copilot.js +19 -21
  187. package/dist/llm/copilot.js.map +1 -1
  188. package/dist/llm/custom-providers.d.ts +2 -1
  189. package/dist/llm/custom-providers.js +16 -10
  190. package/dist/llm/custom-providers.js.map +1 -1
  191. package/dist/llm/deepseek.js +6 -11
  192. package/dist/llm/deepseek.js.map +1 -1
  193. package/dist/llm/explabs.js +8 -9
  194. package/dist/llm/explabs.js.map +1 -1
  195. package/dist/llm/fireworks.js +9 -11
  196. package/dist/llm/fireworks.js.map +1 -1
  197. package/dist/llm/free-default-model.js +5 -3
  198. package/dist/llm/free-default-model.js.map +1 -1
  199. package/dist/llm/free-model-limits.js +2 -1
  200. package/dist/llm/free-model-limits.js.map +1 -1
  201. package/dist/llm/free.js +20 -23
  202. package/dist/llm/free.js.map +1 -1
  203. package/dist/llm/freebuff-models.js +11 -2
  204. package/dist/llm/freebuff-models.js.map +1 -1
  205. package/dist/llm/freebuff.js +2 -1
  206. package/dist/llm/freebuff.js.map +1 -1
  207. package/dist/llm/generation-metrics.d.ts +11 -0
  208. package/dist/llm/generation-metrics.js +54 -0
  209. package/dist/llm/generation-metrics.js.map +1 -0
  210. package/dist/llm/generation-submission.d.ts +2 -0
  211. package/dist/llm/generation-submission.js +13 -0
  212. package/dist/llm/generation-submission.js.map +1 -0
  213. package/dist/llm/glm.js +6 -11
  214. package/dist/llm/glm.js.map +1 -1
  215. package/dist/llm/hetzner.js +9 -11
  216. package/dist/llm/hetzner.js.map +1 -1
  217. package/dist/llm/kimi.js +6 -11
  218. package/dist/llm/kimi.js.map +1 -1
  219. package/dist/llm/kiro.js +11 -10
  220. package/dist/llm/kiro.js.map +1 -1
  221. package/dist/llm/lightning.js +6 -10
  222. package/dist/llm/lightning.js.map +1 -1
  223. package/dist/llm/merge-gateway.js +9 -10
  224. package/dist/llm/merge-gateway.js.map +1 -1
  225. package/dist/llm/meta.js +6 -10
  226. package/dist/llm/meta.js.map +1 -1
  227. package/dist/llm/mimo.js +6 -11
  228. package/dist/llm/mimo.js.map +1 -1
  229. package/dist/llm/minimax.js +6 -11
  230. package/dist/llm/minimax.js.map +1 -1
  231. package/dist/llm/mistral.js +10 -5
  232. package/dist/llm/mistral.js.map +1 -1
  233. package/dist/llm/modal.js +6 -11
  234. package/dist/llm/modal.js.map +1 -1
  235. package/dist/llm/model-discovery.d.ts +4 -1
  236. package/dist/llm/model-discovery.js +5 -2
  237. package/dist/llm/model-discovery.js.map +1 -1
  238. package/dist/llm/model-limit-store.d.ts +2 -0
  239. package/dist/llm/model-limit-store.js +44 -12
  240. package/dist/llm/model-limit-store.js.map +1 -1
  241. package/dist/llm/model-list-cache.d.ts +15 -0
  242. package/dist/llm/model-list-cache.js +55 -0
  243. package/dist/llm/model-list-cache.js.map +1 -0
  244. package/dist/llm/nvidia.js +9 -10
  245. package/dist/llm/nvidia.js.map +1 -1
  246. package/dist/llm/ollama.js +4 -0
  247. package/dist/llm/ollama.js.map +1 -1
  248. package/dist/llm/omnirush.js +10 -14
  249. package/dist/llm/omnirush.js.map +1 -1
  250. package/dist/llm/openrouter.js +6 -11
  251. package/dist/llm/openrouter.js.map +1 -1
  252. package/dist/llm/operation-usage.js +22 -5
  253. package/dist/llm/operation-usage.js.map +1 -1
  254. package/dist/llm/orcarouter.js +9 -13
  255. package/dist/llm/orcarouter.js.map +1 -1
  256. package/dist/llm/provider-info-text.js +2 -1
  257. package/dist/llm/provider-info-text.js.map +1 -1
  258. package/dist/llm/provider-model-layers.js +4 -0
  259. package/dist/llm/provider-model-layers.js.map +1 -1
  260. package/dist/llm/provider-profile-layers.js +2 -1
  261. package/dist/llm/provider-profile-layers.js.map +1 -1
  262. package/dist/llm/provider-profiles.d.ts +1 -0
  263. package/dist/llm/provider-profiles.js +4 -0
  264. package/dist/llm/provider-profiles.js.map +1 -1
  265. package/dist/llm/qoder/qoder.js +6 -10
  266. package/dist/llm/qoder/qoder.js.map +1 -1
  267. package/dist/llm/qwen-cloud.js +6 -9
  268. package/dist/llm/qwen-cloud.js.map +1 -1
  269. package/dist/llm/request-plan.js +4 -2
  270. package/dist/llm/request-plan.js.map +1 -1
  271. package/dist/llm/river-models.d.ts +1 -0
  272. package/dist/llm/river-models.js +3 -0
  273. package/dist/llm/river-models.js.map +1 -1
  274. package/dist/llm/routing/request-option-fallback.d.ts +6 -0
  275. package/dist/llm/routing/request-option-fallback.js +63 -3
  276. package/dist/llm/routing/request-option-fallback.js.map +1 -1
  277. package/dist/llm/token-usage.js +7 -2
  278. package/dist/llm/token-usage.js.map +1 -1
  279. package/dist/llm/tokenharbor.js +10 -13
  280. package/dist/llm/tokenharbor.js.map +1 -1
  281. package/dist/llm/tokenrouter.js +10 -14
  282. package/dist/llm/tokenrouter.js.map +1 -1
  283. package/dist/llm/vercel.js +12 -12
  284. package/dist/llm/vercel.js.map +1 -1
  285. package/dist/llm/wire/chat-body.js +3 -1
  286. package/dist/llm/wire/chat-body.js.map +1 -1
  287. package/dist/llm/zen-catalog.d.ts +3 -1
  288. package/dist/llm/zen-catalog.js +9 -3
  289. package/dist/llm/zen-catalog.js.map +1 -1
  290. package/dist/mcp/argument-hint.d.ts +9 -0
  291. package/dist/mcp/argument-hint.js +17 -0
  292. package/dist/mcp/argument-hint.js.map +1 -0
  293. package/dist/mcp/catalog.js +5 -5
  294. package/dist/mcp/catalog.js.map +1 -1
  295. package/dist/mcp/manager.d.ts +2 -0
  296. package/dist/mcp/manager.js +21 -1
  297. package/dist/mcp/manager.js.map +1 -1
  298. package/dist/mcp/runtime.d.ts +5 -1
  299. package/dist/mcp/runtime.js +33 -2
  300. package/dist/mcp/runtime.js.map +1 -1
  301. package/dist/noninteractive/stream-renderer.js +2 -0
  302. package/dist/noninteractive/stream-renderer.js.map +1 -1
  303. package/dist/os/runtime-error.d.ts +2 -0
  304. package/dist/os/runtime-error.js +39 -0
  305. package/dist/os/runtime-error.js.map +1 -0
  306. package/dist/prompts/embedded.js +1 -1
  307. package/dist/prompts/embedded.js.map +1 -1
  308. package/dist/prompts/index.js +21 -18
  309. package/dist/prompts/index.js.map +1 -1
  310. package/dist/prompts/system.agent.md +10 -9
  311. package/dist/rea/availability.d.ts +22 -0
  312. package/dist/rea/availability.js +82 -0
  313. package/dist/rea/availability.js.map +1 -0
  314. package/dist/rea/connection.d.ts +8 -0
  315. package/dist/rea/connection.js +12 -0
  316. package/dist/rea/connection.js.map +1 -0
  317. package/dist/rea/distribution.d.ts +13 -0
  318. package/dist/rea/distribution.js +140 -0
  319. package/dist/rea/distribution.js.map +1 -0
  320. package/dist/rea/download.d.ts +22 -0
  321. package/dist/rea/download.js +198 -0
  322. package/dist/rea/download.js.map +1 -0
  323. package/dist/rea/engine-report.d.ts +4 -0
  324. package/dist/rea/engine-report.js +77 -0
  325. package/dist/rea/engine-report.js.map +1 -0
  326. package/dist/rea/engine-status.d.ts +24 -0
  327. package/dist/rea/engine-status.js +103 -0
  328. package/dist/rea/engine-status.js.map +1 -0
  329. package/dist/rea/engines.d.ts +43 -0
  330. package/dist/rea/engines.js +160 -0
  331. package/dist/rea/engines.js.map +1 -0
  332. package/dist/rea/ghidra.d.ts +83 -0
  333. package/dist/rea/ghidra.js +316 -0
  334. package/dist/rea/ghidra.js.map +1 -0
  335. package/dist/rea/guide.d.ts +14 -0
  336. package/dist/rea/guide.js +178 -0
  337. package/dist/rea/guide.js.map +1 -0
  338. package/dist/rea/hints.d.ts +3 -0
  339. package/dist/rea/hints.js +99 -0
  340. package/dist/rea/hints.js.map +1 -0
  341. package/dist/rea/install.d.ts +10 -0
  342. package/dist/rea/install.js +173 -0
  343. package/dist/rea/install.js.map +1 -0
  344. package/dist/rea/jdk.d.ts +50 -0
  345. package/dist/rea/jdk.js +171 -0
  346. package/dist/rea/jdk.js.map +1 -0
  347. package/dist/rea/node.d.ts +22 -0
  348. package/dist/rea/node.js +150 -0
  349. package/dist/rea/node.js.map +1 -0
  350. package/dist/rea/runtime.d.ts +11 -0
  351. package/dist/rea/runtime.js +186 -0
  352. package/dist/rea/runtime.js.map +1 -0
  353. package/dist/rea/tool-index.d.ts +7 -0
  354. package/dist/rea/tool-index.js +105 -0
  355. package/dist/rea/tool-index.js.map +1 -0
  356. package/dist/rea/types.d.ts +36 -0
  357. package/dist/rea/types.js +2 -0
  358. package/dist/rea/types.js.map +1 -0
  359. package/dist/rea/workflow.d.ts +14 -0
  360. package/dist/rea/workflow.js +60 -0
  361. package/dist/rea/workflow.js.map +1 -0
  362. package/dist/rea/zip.d.ts +19 -0
  363. package/dist/rea/zip.js +257 -0
  364. package/dist/rea/zip.js.map +1 -0
  365. package/dist/safety/tool-classification.js +6 -0
  366. package/dist/safety/tool-classification.js.map +1 -1
  367. package/dist/store/history/jsonl-backend.d.ts +0 -1
  368. package/dist/store/history/jsonl-backend.js +3 -136
  369. package/dist/store/history/jsonl-backend.js.map +1 -1
  370. package/dist/store/history/legacy-migration.d.ts +6 -0
  371. package/dist/store/history/legacy-migration.js +127 -0
  372. package/dist/store/history/legacy-migration.js.map +1 -0
  373. package/dist/store/history/lifecycle.js +11 -2
  374. package/dist/store/history/lifecycle.js.map +1 -1
  375. package/dist/store/history/recovery.js +6 -1
  376. package/dist/store/history/recovery.js.map +1 -1
  377. package/dist/store/history/session-frames.d.ts +74 -0
  378. package/dist/store/history/session-frames.js +234 -0
  379. package/dist/store/history/session-frames.js.map +1 -0
  380. package/dist/store/history/session-index.d.ts +13 -0
  381. package/dist/store/history/session-index.js +135 -0
  382. package/dist/store/history/session-index.js.map +1 -0
  383. package/dist/store/history/session-log.d.ts +44 -0
  384. package/dist/store/history/session-log.js +386 -0
  385. package/dist/store/history/session-log.js.map +1 -0
  386. package/dist/store/history/session-paths.d.ts +11 -0
  387. package/dist/store/history/session-paths.js +35 -0
  388. package/dist/store/history/session-paths.js.map +1 -0
  389. package/dist/store/history/session-queries.js +34 -16
  390. package/dist/store/history/session-queries.js.map +1 -1
  391. package/dist/store/history/session-store.d.ts +11 -0
  392. package/dist/store/history/session-store.js +202 -0
  393. package/dist/store/history/session-store.js.map +1 -0
  394. package/dist/store/history-index.d.ts +0 -2
  395. package/dist/store/history-index.js +0 -16
  396. package/dist/store/history-index.js.map +1 -1
  397. package/dist/store/history.d.ts +2 -0
  398. package/dist/store/history.js +76 -56
  399. package/dist/store/history.js.map +1 -1
  400. package/dist/store/session-queue.d.ts +4 -0
  401. package/dist/store/session-queue.js +62 -0
  402. package/dist/store/session-queue.js.map +1 -0
  403. package/dist/store/session-workspace-activity.d.ts +4 -0
  404. package/dist/store/session-workspace-activity.js +69 -0
  405. package/dist/store/session-workspace-activity.js.map +1 -0
  406. package/dist/store/session-workspace-cleanup.d.ts +4 -0
  407. package/dist/store/session-workspace-cleanup.js +246 -0
  408. package/dist/store/session-workspace-cleanup.js.map +1 -0
  409. package/dist/store/session-workspace.js +6 -0
  410. package/dist/store/session-workspace.js.map +1 -1
  411. package/dist/tools/definitions/aggregate.js +8 -0
  412. package/dist/tools/definitions/aggregate.js.map +1 -1
  413. package/dist/tools/definitions/files.js +4 -4
  414. package/dist/tools/definitions/files.js.map +1 -1
  415. package/dist/tools/definitions/shell.js +2 -2
  416. package/dist/tools/definitions/shell.js.map +1 -1
  417. package/dist/tools/definitions.js +2 -1
  418. package/dist/tools/definitions.js.map +1 -1
  419. package/dist/tools/fs/mutations.js +1 -1
  420. package/dist/tools/fs/mutations.js.map +1 -1
  421. package/dist/tools/handlers/files-2.js +1 -1
  422. package/dist/tools/handlers/files-2.js.map +1 -1
  423. package/dist/tools/http/agents.d.ts +4 -5
  424. package/dist/tools/http/agents.js +4 -12
  425. package/dist/tools/http/agents.js.map +1 -1
  426. package/dist/tools/http/fetch.js +3 -10
  427. package/dist/tools/http/fetch.js.map +1 -1
  428. package/dist/tools/registry.d.ts +1 -0
  429. package/dist/tools/registry.js +3 -0
  430. package/dist/tools/registry.js.map +1 -1
  431. package/dist/tools/shell/artifact.d.ts +7 -0
  432. package/dist/tools/shell/artifact.js +85 -0
  433. package/dist/tools/shell/artifact.js.map +1 -0
  434. package/dist/tools/shell/capture.d.ts +1 -5
  435. package/dist/tools/shell/capture.js +1 -18
  436. package/dist/tools/shell/capture.js.map +1 -1
  437. package/dist/tools/shell/exec-attempt.js +9 -27
  438. package/dist/tools/shell/exec-attempt.js.map +1 -1
  439. package/dist/tools/shell/spawn-argv.js +7 -21
  440. package/dist/tools/shell/spawn-argv.js.map +1 -1
  441. package/dist/tui-v2/app/App.js +3 -7
  442. package/dist/tui-v2/app/App.js.map +1 -1
  443. package/dist/tui-v2/app/layout-widths.js +2 -1
  444. package/dist/tui-v2/app/layout-widths.js.map +1 -1
  445. package/dist/tui-v2/bootstrap/patch-opentui-selection.d.ts +6 -0
  446. package/dist/tui-v2/bootstrap/patch-opentui-selection.js +27 -0
  447. package/dist/tui-v2/bootstrap/patch-opentui-selection.js.map +1 -0
  448. package/dist/tui-v2/bootstrap/runtime-view.js +2 -0
  449. package/dist/tui-v2/bootstrap/runtime-view.js.map +1 -1
  450. package/dist/tui-v2/bootstrap/start-tui-v2.js +6 -1
  451. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  452. package/dist/tui-v2/components/jobs/jobs-panel.js +1 -9
  453. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  454. package/dist/tui-v2/components/modal/confirm-modal.js +1 -0
  455. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
  456. package/dist/tui-v2/components/pager/pager.js +2 -2
  457. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  458. package/dist/tui-v2/components/plan/plan-view.js +24 -4
  459. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  460. package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
  461. package/dist/tui-v2/components/status/status-line.js +13 -12
  462. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  463. package/dist/tui-v2/components/transcript/compacted-row.js +3 -1
  464. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  465. package/dist/tui-v2/components/transcript/intro-card.js +5 -8
  466. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
  467. package/dist/tui-v2/components/transcript/selection-snap.d.ts +43 -0
  468. package/dist/tui-v2/components/transcript/selection-snap.js +68 -0
  469. package/dist/tui-v2/components/transcript/selection-snap.js.map +1 -0
  470. package/dist/tui-v2/components/transcript/thinking-block.d.ts +2 -0
  471. package/dist/tui-v2/components/transcript/thinking-block.js +36 -19
  472. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  473. package/dist/tui-v2/components/transcript/thinking-presentation.d.ts +0 -2
  474. package/dist/tui-v2/components/transcript/thinking-presentation.js +0 -52
  475. package/dist/tui-v2/components/transcript/thinking-presentation.js.map +1 -1
  476. package/dist/tui-v2/components/transcript/transcript-row.js +20 -6
  477. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  478. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +2 -0
  479. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +35 -0
  480. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -1
  481. package/dist/tui-v2/components/transcript/transcript-view.js +159 -109
  482. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  483. package/dist/tui-v2/composer/composer-editor.js +2 -4
  484. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  485. package/dist/tui-v2/composer/composer-highlight.js +2 -1
  486. package/dist/tui-v2/composer/composer-highlight.js.map +1 -1
  487. package/dist/tui-v2/composer/composer-wheel.d.ts +1 -1
  488. package/dist/tui-v2/composer/composer-wheel.js +4 -4
  489. package/dist/tui-v2/composer/composer-wheel.js.map +1 -1
  490. package/dist/tui-v2/rendering/ansi-to-styled.js +16 -20
  491. package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -1
  492. package/dist/types.d.ts +4 -7
  493. package/dist/types.js.map +1 -1
  494. package/dist/ui/mentions/expand.js +4 -0
  495. package/dist/ui/mentions/expand.js.map +1 -1
  496. package/dist/ui-core/bootstrap/fatal-diagnostics.d.ts +1 -0
  497. package/dist/ui-core/bootstrap/fatal-diagnostics.js +9 -0
  498. package/dist/ui-core/bootstrap/fatal-diagnostics.js.map +1 -0
  499. package/dist/ui-core/bootstrap/lifecycle.d.ts +4 -0
  500. package/dist/ui-core/bootstrap/lifecycle.js +27 -4
  501. package/dist/ui-core/bootstrap/lifecycle.js.map +1 -1
  502. package/dist/ui-core/commands/command-handlers.js +2 -0
  503. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  504. package/dist/ui-core/commands/picker-commands.d.ts +6 -2
  505. package/dist/ui-core/commands/picker-commands.js +30 -17
  506. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  507. package/dist/ui-core/commands/rea-commands.d.ts +3 -0
  508. package/dist/ui-core/commands/rea-commands.js +176 -0
  509. package/dist/ui-core/commands/rea-commands.js.map +1 -0
  510. package/dist/ui-core/commands/rea-engines-commands.d.ts +37 -0
  511. package/dist/ui-core/commands/rea-engines-commands.js +433 -0
  512. package/dist/ui-core/commands/rea-engines-commands.js.map +1 -0
  513. package/dist/ui-core/composer/completion.js +3 -0
  514. package/dist/ui-core/composer/completion.js.map +1 -1
  515. package/dist/ui-core/controllers/overlay-controller.d.ts +1 -1
  516. package/dist/ui-core/controllers/selection-controller.d.ts +2 -1
  517. package/dist/ui-core/controllers/selection-controller.js +27 -0
  518. package/dist/ui-core/controllers/selection-controller.js.map +1 -1
  519. package/dist/ui-core/motion/wheel-scroll.d.ts +7 -0
  520. package/dist/ui-core/motion/wheel-scroll.js +24 -0
  521. package/dist/ui-core/motion/wheel-scroll.js.map +1 -0
  522. package/dist/ui-core/rendering/compaction-pager-source.d.ts +4 -0
  523. package/dist/ui-core/rendering/compaction-pager-source.js +65 -0
  524. package/dist/ui-core/rendering/compaction-pager-source.js.map +1 -0
  525. package/dist/ui-core/rendering/duration.d.ts +3 -1
  526. package/dist/ui-core/rendering/duration.js +12 -3
  527. package/dist/ui-core/rendering/duration.js.map +1 -1
  528. package/dist/ui-core/rendering/incremental-strip.js +4 -1
  529. package/dist/ui-core/rendering/incremental-strip.js.map +1 -1
  530. package/dist/ui-core/rendering/intro-header.d.ts +3 -0
  531. package/dist/ui-core/rendering/intro-header.js +145 -161
  532. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  533. package/dist/ui-core/rendering/job-tail-source.js +30 -2
  534. package/dist/ui-core/rendering/job-tail-source.js.map +1 -1
  535. package/dist/ui-core/rendering/open-tool-output.d.ts +1 -0
  536. package/dist/ui-core/rendering/open-tool-output.js +8 -0
  537. package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
  538. package/dist/ui-core/rendering/strip-tool-surfaces.js +7 -7
  539. package/dist/ui-core/rendering/strip-tool-surfaces.js.map +1 -1
  540. package/dist/ui-core/rendering/text-width.d.ts +1 -0
  541. package/dist/ui-core/rendering/text-width.js +22 -2
  542. package/dist/ui-core/rendering/text-width.js.map +1 -1
  543. package/dist/ui-core/rendering/thinking-tail.js +6 -2
  544. package/dist/ui-core/rendering/thinking-tail.js.map +1 -1
  545. package/dist/ui-core/rendering/tool-output-pager-source.d.ts +4 -0
  546. package/dist/ui-core/rendering/tool-output-pager-source.js +94 -0
  547. package/dist/ui-core/rendering/tool-output-pager-source.js.map +1 -0
  548. package/dist/ui-core/state/hydrate/classic-transcript.js +2 -0
  549. package/dist/ui-core/state/hydrate/classic-transcript.js.map +1 -1
  550. package/dist/ui-core/state/semantic-document.d.ts +4 -0
  551. package/dist/ui-core/state/semantic-document.js.map +1 -1
  552. package/dist/ui-core/state/transcript/apply-app-event.js +1 -0
  553. package/dist/ui-core/state/transcript/apply-app-event.js.map +1 -1
  554. package/dist/ui-core/state/transcript-hydrate.js +1 -0
  555. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  556. package/dist/ui-core/state/transcript-types.d.ts +2 -0
  557. package/dist/ui-core/state/transcript-types.js.map +1 -1
  558. package/dist/ui-core/state/transcript-window.d.ts +9 -0
  559. package/dist/ui-core/state/transcript-window.js +9 -0
  560. package/dist/ui-core/state/transcript-window.js.map +1 -1
  561. package/dist/version.generated.d.ts +2 -2
  562. package/dist/version.generated.js +2 -2
  563. package/dist/version.generated.js.map +1 -1
  564. package/package.json +5 -2
  565. package/dist/agent/context/compaction-work-history.d.ts +0 -13
  566. package/dist/agent/context/compaction-work-history.js +0 -150
  567. package/dist/agent/context/compaction-work-history.js.map +0 -1
  568. package/dist/tui-v2/components/transcript/transcript-scrollbar.d.ts +0 -29
  569. package/dist/tui-v2/components/transcript/transcript-scrollbar.js +0 -211
  570. package/dist/tui-v2/components/transcript/transcript-scrollbar.js.map +0 -1
@@ -0,0 +1,316 @@
1
+ import { spawn } from "node:child_process";
2
+ import { availableParallelism } from "node:os";
3
+ import { chmod, copyFile, mkdir, readFile, readdir, rm, stat } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { withMcpStorageLock } from "../mcp/storage-lock.js";
6
+ import { findExecutable } from "../os/command.js";
7
+ import { downloadFile, fetchJsonValue } from "./download.js";
8
+ import { clearStaging, discardTree, engineRoots, removeTree, stagingName, updateEngineSettings, windowsPathProblem } from "./engines.js";
9
+ import { publish, reaRoot } from "./install.js";
10
+ import { ensureFreeSpace, extractZip } from "./zip.js";
11
+ export const GHIDRA_SERIES = "12.1";
12
+ const RELEASES_URL = "https://api.github.com/repos/NationalSecurityAgency/ghidra/releases?per_page=30";
13
+ const DOWNLOAD_HOSTS = ["github.com", "*.githubusercontent.com"];
14
+ const METADATA_HOSTS = ["api.github.com"];
15
+ const MIN_ARCHIVE_BYTES = 100_000_000;
16
+ const MAX_ARCHIVE_BYTES = 2_000_000_000;
17
+ const BUILD_TIMEOUT_MS = 30 * 60 * 1000;
18
+ const BUILD_TAIL_CHARS = 6_000;
19
+ const CPP_DIRECTORY = ["Ghidra", "Features", "Decompiler", "src", "decompile", "cpp"];
20
+ const EXTRACTED_BYTES = 1_000_000_000;
21
+ export const GHIDRA_INSTALLED_BYTES = 900_000_000;
22
+ const DEEPEST_ENTRY_CHARS = 140;
23
+ const DECOMPILER_DIRECTORIES = {
24
+ "darwin:arm64": "mac_arm_64",
25
+ "darwin:x64": "mac_x86_64",
26
+ "linux:x64": "linux_x86_64",
27
+ "linux:arm64": "linux_arm_64",
28
+ "win32:x64": "win_x86_64",
29
+ };
30
+ const BUNDLED_DECOMPILERS = new Set(["linux_x86_64", "win_x86_64"]);
31
+ const VERSION_DIRECTORY = /^\d+(?:\.\d+){1,3}$/;
32
+ export function isMuslLinux() {
33
+ if (process.platform !== "linux")
34
+ return false;
35
+ const report = (process.report?.getReport?.() ?? undefined);
36
+ return report !== undefined && report.header !== undefined && report.header.glibcVersionRuntime === undefined;
37
+ }
38
+ export function currentHost() {
39
+ return { platform: process.platform, arch: process.arch, musl: isMuslLinux() };
40
+ }
41
+ export function decompilerDirectory(host) {
42
+ return DECOMPILER_DIRECTORIES[`${host.platform}:${host.arch}`];
43
+ }
44
+ export function ghidraHostProblem(host) {
45
+ if (!decompilerDirectory(host)) {
46
+ return `REA supports Ghidra on macOS (x64, arm64), Linux (x64, arm64) and Windows (x64); this machine is ${host.platform}/${host.arch}.`;
47
+ }
48
+ if (host.platform === "linux" && host.musl) {
49
+ return "Ghidra's native decompiler is built for glibc and this Linux uses musl (Alpine), so clai does not install Ghidra here.";
50
+ }
51
+ return undefined;
52
+ }
53
+ export function bundlesDecompiler(host) {
54
+ const directory = decompilerDirectory(host);
55
+ return directory !== undefined && BUNDLED_DECOMPILERS.has(directory);
56
+ }
57
+ export function versionParts(version) {
58
+ return version.split(".").map((part) => Number(part));
59
+ }
60
+ export function compareVersions(left, right) {
61
+ const a = versionParts(left);
62
+ const b = versionParts(right);
63
+ for (let index = 0; index < Math.max(a.length, b.length); index += 1) {
64
+ const difference = (a[index] ?? 0) - (b[index] ?? 0);
65
+ if (difference !== 0)
66
+ return difference;
67
+ }
68
+ return 0;
69
+ }
70
+ export function supportedGhidraVersion(version) {
71
+ return version === GHIDRA_SERIES || version.startsWith(`${GHIDRA_SERIES}.`);
72
+ }
73
+ function isRecord(value) {
74
+ return typeof value === "object" && value !== null && !Array.isArray(value);
75
+ }
76
+ export function selectGhidraRelease(releases) {
77
+ if (!Array.isArray(releases))
78
+ throw new Error("Unexpected Ghidra release listing");
79
+ let best;
80
+ for (const release of releases) {
81
+ if (!isRecord(release) || release.draft === true || release.prerelease === true)
82
+ continue;
83
+ const tag = typeof release.tag_name === "string" ? release.tag_name : "";
84
+ const version = /^Ghidra_(\d+\.\d+(?:\.\d+)?)_build$/.exec(tag)?.[1];
85
+ if (!version || !supportedGhidraVersion(version) || !Array.isArray(release.assets))
86
+ continue;
87
+ const pattern = new RegExp(`^ghidra_${version.replace(/\./g, "\\.")}_PUBLIC_\\d{8}\\.zip$`);
88
+ for (const asset of release.assets) {
89
+ if (!isRecord(asset) || typeof asset.name !== "string" || !pattern.test(asset.name))
90
+ continue;
91
+ const sha256 = typeof asset.digest === "string" ? /^sha256:([0-9a-f]{64})$/.exec(asset.digest)?.[1] : undefined;
92
+ const bytes = asset.size;
93
+ if (!sha256 || typeof bytes !== "number" || !Number.isInteger(bytes) || bytes < MIN_ARCHIVE_BYTES || bytes > MAX_ARCHIVE_BYTES)
94
+ continue;
95
+ if (asset.state !== undefined && asset.state !== "uploaded")
96
+ continue;
97
+ if (!best || compareVersions(version, best.version) > 0) {
98
+ best = {
99
+ version, tag, name: asset.name, bytes, sha256,
100
+ url: `https://github.com/NationalSecurityAgency/ghidra/releases/download/${encodeURIComponent(tag)}/${encodeURIComponent(asset.name)}`,
101
+ };
102
+ }
103
+ }
104
+ }
105
+ if (!best)
106
+ throw new Error(`No official Ghidra ${GHIDRA_SERIES}.x release with a published checksum was found`);
107
+ return best;
108
+ }
109
+ export async function resolveGhidraRelease(options = {}) {
110
+ const releases = await fetchJsonValue(RELEASES_URL, {
111
+ hosts: METADATA_HOSTS, maxBytes: 8 * 1024 * 1024, signal: options.signal, fetch: options.fetch,
112
+ headers: { Accept: "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28" },
113
+ });
114
+ return selectGhidraRelease(releases);
115
+ }
116
+ export function ghidraDiskBytes(release) {
117
+ return release.bytes + EXTRACTED_BYTES;
118
+ }
119
+ export async function inspectGhidraDirectory(dir, host = currentHost()) {
120
+ let properties;
121
+ try {
122
+ properties = await readFile(join(dir, "Ghidra", "application.properties"), "utf8");
123
+ }
124
+ catch {
125
+ return { ok: false, reason: `${dir} is not an extracted Ghidra release (Ghidra/application.properties is missing)` };
126
+ }
127
+ const version = /^application\.version=(\S+)\s*$/m.exec(properties)?.[1];
128
+ if (!version)
129
+ return { ok: false, reason: `${dir} does not declare a Ghidra version` };
130
+ if (!supportedGhidraVersion(version))
131
+ return { ok: false, reason: `Ghidra ${version} is not supported by REA; it needs Ghidra ${GHIDRA_SERIES}.x` };
132
+ const launcher = join(dir, "support", host.platform === "win32" ? "analyzeHeadless.bat" : "analyzeHeadless");
133
+ if (!(await stat(launcher).then((info) => info.isFile(), () => false))) {
134
+ return { ok: false, reason: `${dir} has no headless launcher (support/${host.platform === "win32" ? "analyzeHeadless.bat" : "analyzeHeadless"})` };
135
+ }
136
+ const directory = decompilerDirectory(host);
137
+ const executable = host.platform === "win32" ? "decompile.exe" : "decompile";
138
+ let decompiler = false;
139
+ if (directory) {
140
+ for (const base of [["os"], ["build", "os"]]) {
141
+ const candidate = join(dir, "Ghidra", "Features", "Decompiler", ...base, directory, executable);
142
+ if (await stat(candidate).then((info) => info.isFile(), () => false)) {
143
+ decompiler = true;
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ return { ok: true, dir, version, decompiler };
149
+ }
150
+ export function decompilerBuildTarget(host) {
151
+ const directory = decompilerDirectory(host);
152
+ if (!directory)
153
+ return undefined;
154
+ switch (directory) {
155
+ case "mac_arm_64": return { directory, arguments: ["ghidra_opt", "ARCH_TYPE=-arch arm64", `OSDIR=${directory}`, "ADDITIONAL_FLAGS=-w"] };
156
+ case "mac_x86_64": return { directory, arguments: ["ghidra_opt", "ADDITIONAL_FLAGS=-w"] };
157
+ case "linux_arm_64": return { directory, arguments: ["ghidra_opt", "ARCH_TYPE=", `OSDIR=${directory}`] };
158
+ default: return { directory, arguments: ["ghidra_opt"] };
159
+ }
160
+ }
161
+ export function buildToolsHelp(host) {
162
+ if (host.platform === "darwin")
163
+ return "Install the Xcode Command Line Tools with `xcode-select --install`, then run the command again.";
164
+ if (host.platform === "linux") {
165
+ return "Install a C++ toolchain, make and bison, for example `sudo apt install build-essential bison` (Debian, Ubuntu), `sudo dnf install gcc-c++ make bison` (Fedora) or `sudo pacman -S base-devel bison` (Arch), then run the command again.";
166
+ }
167
+ return "Install a C++ toolchain, make and bison, then run the command again.";
168
+ }
169
+ export async function missingBuildTools(host) {
170
+ const missing = [];
171
+ if (host.platform === "darwin") {
172
+ const ready = await new Promise((resolve) => {
173
+ const child = spawn("/usr/bin/xcode-select", ["-p"], { stdio: "ignore", windowsHide: true });
174
+ child.once("error", () => resolve(false));
175
+ child.once("exit", (code) => resolve(code === 0));
176
+ });
177
+ if (!ready)
178
+ return ["Xcode Command Line Tools"];
179
+ }
180
+ for (const [label, names] of [["make", ["make"]], ["a C++ compiler", ["g++", "c++", "clang++"]], ["bison", ["bison"]]]) {
181
+ const found = await Promise.all(names.map((name) => findExecutable(name).catch(() => undefined)));
182
+ if (!found.some(Boolean))
183
+ missing.push(label);
184
+ }
185
+ return missing;
186
+ }
187
+ function runMake(cwd, args, signal) {
188
+ return new Promise((resolve, reject) => {
189
+ const child = spawn("make", [...args], { cwd, stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
190
+ let tail = "";
191
+ const keep = (chunk) => {
192
+ tail = (tail + chunk.toString("utf8")).slice(-BUILD_TAIL_CHARS);
193
+ };
194
+ child.stdout.on("data", keep);
195
+ child.stderr.on("data", keep);
196
+ const stop = (reason) => {
197
+ child.kill("SIGTERM");
198
+ reject(reason instanceof Error ? reason : new Error("Build cancelled"));
199
+ };
200
+ const timer = setTimeout(() => stop(new Error("The decompiler build took longer than 30 minutes and was stopped")), BUILD_TIMEOUT_MS);
201
+ const onAbort = () => stop(signal?.reason);
202
+ if (signal?.aborted)
203
+ onAbort();
204
+ else
205
+ signal?.addEventListener("abort", onAbort, { once: true });
206
+ child.once("error", (error) => {
207
+ clearTimeout(timer);
208
+ reject(error);
209
+ });
210
+ child.once("exit", (code) => {
211
+ clearTimeout(timer);
212
+ signal?.removeEventListener("abort", onAbort);
213
+ if (code === 0)
214
+ resolve();
215
+ else
216
+ reject(new Error(`The decompiler build failed (make exited with ${code}):\n${tail.trim().split("\n").slice(-25).join("\n")}`));
217
+ });
218
+ });
219
+ }
220
+ export const buildGhidraDecompiler = async ({ tree, host, signal, onProgress, missing: probe }) => {
221
+ const target = decompilerBuildTarget(host);
222
+ if (!target)
223
+ throw new Error(`Ghidra has no native decompiler for ${host.platform}/${host.arch}`);
224
+ const missing = await (probe ?? missingBuildTools)(host);
225
+ if (missing.length > 0) {
226
+ throw new Error(`Building Ghidra's native decompiler for ${host.platform}/${host.arch} needs ${missing.join(", ")}. ${buildToolsHelp(host)}`);
227
+ }
228
+ onProgress?.({ phase: "building", message: `Building Ghidra's native decompiler for ${host.platform}/${host.arch} (a few minutes, once)` });
229
+ const source = join(tree, ...CPP_DIRECTORY);
230
+ const jobs = Math.max(1, Math.min(4, availableParallelism()));
231
+ await runMake(source, ["-j", String(jobs), ...target.arguments], signal);
232
+ const built = join(source, "ghidra_opt");
233
+ const destination = join(tree, "Ghidra", "Features", "Decompiler", "os", target.directory);
234
+ await mkdir(destination, { recursive: true, mode: 0o755 });
235
+ const executable = join(destination, host.platform === "win32" ? "decompile.exe" : "decompile");
236
+ await copyFile(built, executable);
237
+ await chmod(executable, 0o755);
238
+ const names = await readdir(source).catch(() => []);
239
+ await Promise.all(names.filter((name) => name.endsWith(".o") || name === "ghidra_opt").map((name) => rm(join(source, name), { force: true }).catch(() => undefined)));
240
+ };
241
+ const operations = new Map();
242
+ async function install(release, options, root) {
243
+ const { signal, onProgress } = options;
244
+ const host = options.host ?? currentHost();
245
+ const roots = engineRoots(root);
246
+ const target = join(roots.ghidra, release.version);
247
+ signal?.throwIfAborted();
248
+ const existing = await inspectGhidraDirectory(target, host);
249
+ if (existing.ok && existing.decompiler) {
250
+ await updateEngineSettings((current) => ({ ...current, ghidra: { dir: target, managed: true, version: release.version } }), root, signal);
251
+ return { ok: true, dir: target, version: release.version, built: false, changed: false };
252
+ }
253
+ const unsupported = ghidraHostProblem(host);
254
+ if (unsupported)
255
+ throw new Error(unsupported);
256
+ const tooDeep = windowsPathProblem(host.platform, roots.ghidra, DEEPEST_ENTRY_CHARS);
257
+ if (tooDeep)
258
+ throw new Error(tooDeep);
259
+ await mkdir(roots.ghidra, { recursive: true, mode: 0o700 });
260
+ await clearStaging(roots.ghidra);
261
+ await ensureFreeSpace(roots.ghidra, ghidraDiskBytes(release));
262
+ const staging = join(roots.ghidra, stagingName());
263
+ await mkdir(staging, { mode: 0o700 });
264
+ try {
265
+ const archive = join(staging, "ghidra.zip");
266
+ onProgress?.({ phase: "downloading", message: `Downloading Ghidra ${release.version}`, totalBytes: release.bytes });
267
+ await downloadFile(release.url, archive, {
268
+ hosts: DOWNLOAD_HOSTS, maxBytes: MAX_ARCHIVE_BYTES, sha256: release.sha256, bytes: release.bytes, signal, fetch: options.fetch,
269
+ onProgress: (receivedBytes, totalBytes) => onProgress?.({ phase: "downloading", message: `Downloading Ghidra ${release.version}`, receivedBytes, totalBytes: totalBytes ?? release.bytes }),
270
+ });
271
+ const tree = join(staging, "t");
272
+ onProgress?.({ phase: "extracting", message: `Extracting Ghidra ${release.version}` });
273
+ await extractZip(archive, tree, {
274
+ strip: 1, signal,
275
+ onProgress: (receivedBytes, totalBytes) => onProgress?.({ phase: "extracting", message: `Extracting Ghidra ${release.version}`, receivedBytes, totalBytes }),
276
+ });
277
+ await rm(archive, { force: true });
278
+ let inspection = await inspectGhidraDirectory(tree, host);
279
+ if (!inspection.ok)
280
+ throw new Error(inspection.reason);
281
+ let built = false;
282
+ if (!inspection.decompiler) {
283
+ await (options.build ?? buildGhidraDecompiler)({ tree, host, signal, onProgress });
284
+ built = true;
285
+ inspection = await inspectGhidraDirectory(tree, host);
286
+ if (!inspection.ok || !inspection.decompiler)
287
+ throw new Error("The native decompiler is still missing after the build");
288
+ }
289
+ signal?.throwIfAborted();
290
+ if (await discardTree(target) === "busy")
291
+ throw new Error(`${target} is in use by another program. Stop REA with /rea disable, then run the install again.`);
292
+ await publish(tree, target);
293
+ await updateEngineSettings((current) => ({ ...current, ghidra: { dir: target, managed: true, version: release.version } }), root, signal);
294
+ const siblings = await readdir(roots.ghidra, { withFileTypes: true }).catch(() => []);
295
+ await Promise.all(siblings
296
+ .filter((entry) => entry.isDirectory() && entry.name !== release.version && VERSION_DIRECTORY.test(entry.name))
297
+ .map((entry) => discardTree(join(roots.ghidra, entry.name)).catch(() => undefined)));
298
+ return { ok: true, dir: target, version: release.version, built, changed: true };
299
+ }
300
+ finally {
301
+ await removeTree(staging).catch(() => undefined);
302
+ }
303
+ }
304
+ export function installGhidra(options) {
305
+ const root = options.root ?? reaRoot();
306
+ const key = `ghidra:${engineRoots(root).ghidra}`;
307
+ const running = operations.get(key);
308
+ if (running)
309
+ return running;
310
+ const promise = withMcpStorageLock(`rea-engine:${key}`, () => install(options.release, options, root), options.signal)
311
+ .catch((error) => ({ ok: false, reason: error instanceof Error ? error.message : String(error) }))
312
+ .finally(() => { operations.delete(key); });
313
+ operations.set(key, promise);
314
+ return promise;
315
+ }
316
+ //# sourceMappingURL=ghidra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghidra.js","sourceRoot":"","sources":["../../src/rea/ghidra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ReaMaintenanceAction, ReaStatus } from "./types.js";
2
+ export interface ReaGuideView {
3
+ readonly status: ReaStatus;
4
+ readonly server?: {
5
+ readonly status: string;
6
+ readonly toolCount: number;
7
+ readonly detail?: string | undefined;
8
+ } | undefined;
9
+ readonly selected: boolean;
10
+ readonly maintenance?: ReaMaintenanceAction | undefined;
11
+ readonly root: string;
12
+ readonly platform: NodeJS.Platform;
13
+ }
14
+ export declare function reaUserGuide(view: ReaGuideView): string;
@@ -0,0 +1,178 @@
1
+ import { join } from "node:path";
2
+ import { REA_SERVER } from "./workflow.js";
3
+ const REFERENCES = [
4
+ ["javascript-applications.md", "JavaScript, Electron and ASAR workflows"],
5
+ ["native-and-artifacts.md", "native binaries, archives, SQLite and firmware"],
6
+ ["android-applications.md", "APK and device analysis"],
7
+ ["evidence-workflows.md", "Evidence IDs, paging and comparisons"],
8
+ ["runtime-observation.md", "browser, Electron and process observation"],
9
+ ["connection-and-recovery.md", "connection problems and provider prerequisites"],
10
+ ];
11
+ const SYSTEM_NOTES = {
12
+ darwin: [
13
+ "Native decompilation uses Ghidra, Hopper or IDA. `/rea engines install ghidra` sets up Ghidra for you (x64 and arm64) and builds its native decompiler once, which needs the Xcode Command Line Tools (`xcode-select --install`). Hopper is started on demand; complete its first-run demo or licence dialog once in your user session.",
14
+ "Ghidra opens one architecture at a time, so the agent thins a universal Mach-O with `lipo` first. Hopper opens universal files itself.",
15
+ "Process capture and runtime observation are available (native PTY).",
16
+ "Linux-only features are unavailable here: firmware extraction, offline ELF layout, recorded crashes, EVM bytecode, TShark field extraction and sigrok decoding.",
17
+ ],
18
+ linux: [
19
+ "JavaScript/Electron analysis, Ghidra, JADX and firmware tools need a procps-compatible `ps` on PATH. Minimal containers often lack it: install `procps` (or `procps-ng`).",
20
+ "Native decompilation uses Ghidra, Hopper or IDA. `/rea engines install ghidra` sets up Ghidra: x64 ships a ready decompiler, arm64 builds it once and needs make, a C++ compiler and bison.",
21
+ "Linux supports the widest range of targets, including firmware, ELF layout, packet and signal tools.",
22
+ ],
23
+ win32: [
24
+ "Static analysis needs no extra software for JavaScript/Electron, .NET, Go, Rust, Flutter and saved captures. Android packages also need JADX and a JDK.",
25
+ "Native decompilation uses Ghidra's experimental, read-only Windows support for PE files (x64). `/rea engines install ghidra` sets it up with its bundled decompiler. Hopper and Kuna are not available on Windows.",
26
+ "Linux-only features are unavailable here: firmware extraction, offline ELF layout, recorded crashes, EVM bytecode, TShark field extraction and sigrok decoding. Process capture needs a native PTY (Linux or macOS).",
27
+ ],
28
+ };
29
+ function statusLine(view) {
30
+ const progress = view.maintenance ? ` · ${view.maintenance} in progress` : "";
31
+ if (view.status.state === "missing")
32
+ return `**Status:** not installed${progress}. Run \`/rea setup\` to install and connect it.`;
33
+ if (view.status.state === "broken")
34
+ return `**Status:** needs repair${progress}. ${view.status.reason}`;
35
+ const installed = `REA ${view.status.installation.version} installed`;
36
+ if (!view.server)
37
+ return `**Status:** ${installed} · not running (it starts only when enabled)${progress}`;
38
+ const detail = view.server.detail ? ` — ${view.server.detail}` : "";
39
+ const selected = view.selected ? "selected for this session" : "not selected";
40
+ return `**Status:** ${installed} · ${view.server.status} (${view.server.toolCount} tools) · ${selected}${detail}${progress}`;
41
+ }
42
+ function filesSection(view) {
43
+ const lines = [
44
+ "## Files and settings",
45
+ "",
46
+ `- Everything lives in \`${view.root}\`: \`current.json\` (the active release), \`versions/\`, \`npm-cache/\` and \`engines.json\` (the engines you set up). Engines that clai installs live beside it in \`ghidra/\` and \`jdk/\`. \`CLAI_DATA_DIR\` moves them all.`,
47
+ "- `CLAI_REA_NODE` selects the Node executable REA runs on. It must be set before installing; to switch an existing installation, delete `current.json` and run `/rea setup`.",
48
+ "- clai passes your environment to REA, so engine settings such as `GHIDRA_INSTALL_DIR`, `JAVA_HOME`, `HOPPER_LAUNCHER_PATH`, `REA_GHIDRA_STARTUP_TIMEOUT_MS`, `REA_TSHARK_COMMAND`, `REA_WABT_BIN_DIRECTORY`, `REA_KUNA_COMMAND` and `REA_JEB_MCP_URL` work when set before you start clai. An engine you choose with `/rea engines` takes precedence over the same variable in your environment (for REA only); `/rea engines remove` hands control back.",
49
+ ];
50
+ if (view.status.state !== "ready")
51
+ return lines;
52
+ const skill = join(view.status.installation.directory, "node_modules", "rea-agents", "skills", "reverse-engineer-anything");
53
+ return [
54
+ ...lines,
55
+ "",
56
+ "The installed version ships its own detailed references. Ask the agent to read the one you need, or open them yourself:",
57
+ "",
58
+ `- \`${join(skill, "SKILL.md")}\``,
59
+ ...REFERENCES.map(([file, topic]) => `- \`${join(skill, "references", file)}\` — ${topic}`),
60
+ ];
61
+ }
62
+ export function reaUserGuide(view) {
63
+ return [
64
+ "# REA · Reverse Engineer Anything",
65
+ "",
66
+ statusLine(view),
67
+ "",
68
+ "REA lets the agent inspect software that you only have in shipped form — binaries, packaged apps, Electron and JavaScript bundles, .NET assemblies, Android packages, firmware and saved network captures — and explain how it works, with the evidence behind each claim. clai installs and runs it privately. Nothing is added to other agents, skills or your project's MCP configuration.",
69
+ "",
70
+ "## Quick start",
71
+ "",
72
+ "1. `/rea setup` installs the latest official release if needed and connects it for this session. The first run can take a minute or more; press Esc to cancel.",
73
+ "2. Ask for the analysis and name the artifact: `@rea explain how the updater in /Applications/Foo.app works`.",
74
+ "3. `/rea off` stops its background process when you are done.",
75
+ "",
76
+ "You do not have to enable REA yourself. In agent mode the agent can choose it when a task needs it; your permission policy decides whether it asks first.",
77
+ "",
78
+ "## When to use it",
79
+ "",
80
+ "Use REA when the answer depends on a **shipped artifact** rather than source code:",
81
+ "",
82
+ "- native executables, libraries and firmware images",
83
+ "- Electron and JavaScript applications, ASAR archives, minified bundles",
84
+ "- .NET assemblies, Android APKs, Flutter apps, Unity IL2CPP metadata, Go and Rust binaries",
85
+ "- saved network captures (HAR, SAZ), packet captures and SQLite databases",
86
+ "- runtime behaviour of an application you are authorised to run",
87
+ "",
88
+ "Do not use it to read or change a source repository you already have. Normal file and search tools are faster and cheaper.",
89
+ "",
90
+ "## Commands",
91
+ "",
92
+ "- `/rea` opens a picker with the actions below. `/rea` is the command; `@rea` is the token that attaches REA to a prompt.",
93
+ "- `/rea setup` installs if needed and connects.",
94
+ "- `/rea install` installs or repairs without connecting.",
95
+ "- `/rea update` stages the newest release. A running analysis keeps its version.",
96
+ "- `/rea use` connects and inserts an editable `@rea` token in your draft.",
97
+ "- `/rea on` connects without touching the draft. `/rea off` disconnects.",
98
+ "- `/rea status` reports installation and connection state without starting anything.",
99
+ "- `/rea reconnect` restarts the connection to adopt an update or repair a fault. It discards the current analysis.",
100
+ "- `/rea engines` shows which analysis engines are ready and what to run for the rest. `/rea engines install ghidra` downloads and sets up Ghidra after you confirm, `/rea engines install java` adds a private JDK 21, `/rea engines use <ghidra|java|hopper|ida|kuna> <location>` adopts one you already have, and `/rea engines remove <engine>` forgets it. Only you can run these; the agent never installs or configures an engine.",
101
+ "- `/rea guide` shows this page.",
102
+ "- `/rea <task>` submits `@rea <task>`.",
103
+ "- Type `@rea` anywhere in a prompt to select it. It is highlighted like `@mcp:` and `skill:` mentions, and connects REA first if it is installed but not running. A file named `rea` is not affected: use `@./rea` to attach it.",
104
+ "",
105
+ "## How the agent uses it",
106
+ "",
107
+ "REA has about 200 tools. Sending all of them with every message would be slow and costly, so they stay out of the model's tool list. Three small steps replace that:",
108
+ "",
109
+ "1. `@rea` in your prompt, or `rea.manage` called by the agent, connects REA and hands the model a short workflow plus an index of every tool with its required arguments. It is sent once per conversation (roughly 3,500 tokens).",
110
+ `2. \`mcp.call\` runs a tool as \`mcp.${REA_SERVER}.<tool>\` straight from that index.`,
111
+ `3. \`mcp.tools server="${REA_SERVER}" query="<tool name>"\` reads one full schema when the agent needs optional fields or a structured argument, or after a call is rejected.`,
112
+ "",
113
+ "REA validates arguments strictly: a field a tool does not list is rejected, and clai then shows the agent the accepted names. Results carry **Evidence IDs**. The agent starts from a summary, then pages through the retained evidence with exact filters instead of repeating the analysis. Turning REA on or off never changes the system prompt or the native tool list, so the provider's prompt cache survives it. Compaction and switching models still reset that cache.",
114
+ "",
115
+ "## Example prompts",
116
+ "",
117
+ "- `@rea show how the Electron app at ~/Downloads/Foo.asar talks to its backend, with evidence`",
118
+ "- `@rea which Go modules and compiler version was ./agent built with?`",
119
+ "- `@rea compare the exports of old.asar and new.asar and summarise the behaviour changes`",
120
+ "- `@rea decompile the licence check in ./target.exe` (needs an engine: `/rea engines`)",
121
+ "- `@rea list the endpoints in session.har and where the bundle builds each request`",
122
+ "",
123
+ "## What REA can analyse",
124
+ "",
125
+ "| Target | Needs |",
126
+ "| --- | --- |",
127
+ "| Native binaries | Ghidra (`/rea engines install ghidra`), Hopper, IDA or Kuna |",
128
+ "| JavaScript / Electron | nothing extra (Linux: `ps` from procps) |",
129
+ "| .NET, Go, Rust, Flutter, IL2CPP | nothing extra (static) |",
130
+ "| Saved captures (HAR, SAZ) | nothing extra |",
131
+ "| SQLite databases | Node.js 24.15+ or 26+ |",
132
+ "| Android APKs | headless JADX and a full JDK |",
133
+ "| Android devices | adb |",
134
+ "| Websites | a Chrome-family browser |",
135
+ "| Packet captures | Wireshark tshark and capinfos |",
136
+ "| Firmware | Binwalk or Unblob (Linux) |",
137
+ "| ELF layout, crashes | pwntools (Linux x64) |",
138
+ "| Process behaviour | Linux or macOS |",
139
+ "",
140
+ "Android packages, ELF layout, recorded crashes and EVM bytecode are documented for x64 hosts. Without a native engine REA still inspects JavaScript, .NET, archives, Mach-O headers, plists and signatures. When a tool needs something missing, the agent says what and continues with what is supported; it never installs software itself. You install Ghidra from `/rea engines`, and the other tools are yours to provide.",
141
+ "",
142
+ `## On this system (${view.platform})`,
143
+ "",
144
+ ...(SYSTEM_NOTES[view.platform] ?? ["REA runs wherever a compatible Node.js does. Engine support depends on the host."]).map((note) => `- ${note}`),
145
+ "",
146
+ "REA needs Node.js 22.19+, 24.15+ or 26+ with npm. clai reuses a compatible Node it finds (`CLAI_REA_NODE`, the Node running clai, then PATH) and otherwise downloads the official Node 24 LTS for itself. Linux builds for musl (Alpine) are not published, so install Node there with your package manager.",
147
+ "",
148
+ "## Permissions and safety",
149
+ "",
150
+ "- `/rea status` and `/rea guide` are read-only. Commands you type run immediately; when the agent installs or connects REA, your permission policy applies.",
151
+ "- `@rea` connects an installed REA in any mode, because you asked for it. In ask mode only the few tools REA marks read-only can run and the agent cannot install or reconnect it; in plan mode it cannot install or change REA's state. Switch to agent mode for analysis.",
152
+ "- Under `/permissions default` each REA tool call asks for approval, because almost none of its tools are marked read-only. `auto-allow` and `full-access` (the default for new setups) do not ask.",
153
+ "- Analysis is local, but the model provider you chose receives the tool results. Do not analyse material you cannot share with it.",
154
+ "- Static analysis never runs the target. Runtime tools (process capture, browser and Electron observation, Frida, debuggers, adb) execute or attach to software with your permissions. Use them only on targets you own or are authorised to test.",
155
+ "- Text inside an analysed artifact is untrusted data. The agent is told not to follow instructions found in it.",
156
+ "",
157
+ "## Disk, memory and network",
158
+ "",
159
+ "- Nothing runs until REA is enabled. Install, update, status and guide never start its server.",
160
+ "- An install uses about 250 MB with your own Node, or about 450 MB when clai also downloads Node. Releases older than the previous one are removed after 7 days. Ghidra adds about 900 MB (1.6 GB of free space is needed while it installs) and a private JDK about 350 MB, only if you install them. Installing streams to disk and keeps clai itself near 250 MB of memory; building the decompiler on macOS and arm64 Linux runs `make` with at most four jobs for about a minute.",
161
+ "- Installing needs HTTPS access to `registry.npmjs.org`, plus `nodejs.org` when clai downloads Node. `/rea engines install` uses `api.github.com`, `github.com` and its release CDN for Ghidra, and `api.adoptium.net` for the JDK. Downloads are checksum-verified and package install scripts are disabled.",
162
+ "- While connected, the REA process typically holds 400-650 MB (measured with REA 6.7.0), and native engines such as Ghidra add their own. `/rea off`, or ending the session, stops it and frees that memory.",
163
+ "",
164
+ ...filesSection(view),
165
+ "",
166
+ "## Troubleshooting",
167
+ "",
168
+ "- **Not installed or needs repair:** run `/rea setup`.",
169
+ "- **Did not connect:** `/rea status` shows the launch error. `/rea reconnect` retries without reinstalling.",
170
+ "- **A tool reports a missing engine:** run `/rea engines`. It shows what is ready and the exact command for the rest, such as `/rea engines install ghidra`. Hopper, IDA and Kuna are yours to install; point REA at them with `/rea engines use`.",
171
+ "- **Ghidra cannot build its decompiler:** on macOS install the Command Line Tools (`xcode-select --install`); on Linux install `build-essential bison` or your distribution's equivalent. Then run the install again.",
172
+ "- **A call timed out:** the analysis may still be running. Ask the agent to check state and retained Evidence before retrying.",
173
+ "- **Another session is installing:** wait for it, then check `/rea status`.",
174
+ `- **Name clash:** a server you configured as \`${REA_SERVER}\` is never replaced. Rename yours to use the managed integration.`,
175
+ "- **Install stalls or fails:** clai downloads from the hosts above and does not configure a proxy for them, so make sure they are reachable from this machine. A compatible Node on PATH, or `CLAI_REA_NODE`, avoids the `nodejs.org` download.",
176
+ ].join("\n");
177
+ }
178
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/rea/guide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpFailureHint } from "../mcp/argument-hint.js";
2
+ import type { ReaAvailability } from "./availability.js";
3
+ export declare function reaFailureHint(availability: () => ReaAvailability | undefined): McpFailureHint;