@roackb2/heddle 0.0.2

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 (370) hide show
  1. package/README.md +273 -0
  2. package/dist/examples/conversation.d.ts +2 -0
  3. package/dist/examples/conversation.d.ts.map +1 -0
  4. package/dist/examples/conversation.js +3 -0
  5. package/dist/examples/conversation.js.map +1 -0
  6. package/dist/examples/repo-investigator.d.ts +2 -0
  7. package/dist/examples/repo-investigator.d.ts.map +1 -0
  8. package/dist/examples/repo-investigator.js +57 -0
  9. package/dist/examples/repo-investigator.js.map +1 -0
  10. package/dist/src/__tests__/chat-activity-format.test.d.ts +2 -0
  11. package/dist/src/__tests__/chat-activity-format.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/chat-activity-format.test.js +41 -0
  13. package/dist/src/__tests__/chat-activity-format.test.js.map +1 -0
  14. package/dist/src/__tests__/chat-compaction.test.d.ts +2 -0
  15. package/dist/src/__tests__/chat-compaction.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/chat-compaction.test.js +24 -0
  17. package/dist/src/__tests__/chat-compaction.test.js.map +1 -0
  18. package/dist/src/__tests__/chat-format.test.d.ts +2 -0
  19. package/dist/src/__tests__/chat-format.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/chat-format.test.js +124 -0
  21. package/dist/src/__tests__/chat-format.test.js.map +1 -0
  22. package/dist/src/__tests__/chat-runtime.test.d.ts +2 -0
  23. package/dist/src/__tests__/chat-runtime.test.d.ts.map +1 -0
  24. package/dist/src/__tests__/chat-runtime.test.js +39 -0
  25. package/dist/src/__tests__/chat-runtime.test.js.map +1 -0
  26. package/dist/src/__tests__/core-utils.test.d.ts +2 -0
  27. package/dist/src/__tests__/core-utils.test.d.ts.map +1 -0
  28. package/dist/src/__tests__/core-utils.test.js +87 -0
  29. package/dist/src/__tests__/core-utils.test.js.map +1 -0
  30. package/dist/src/__tests__/llm-factory.test.d.ts +2 -0
  31. package/dist/src/__tests__/llm-factory.test.d.ts.map +1 -0
  32. package/dist/src/__tests__/llm-factory.test.js +45 -0
  33. package/dist/src/__tests__/llm-factory.test.js.map +1 -0
  34. package/dist/src/__tests__/local-commands.test.d.ts +2 -0
  35. package/dist/src/__tests__/local-commands.test.d.ts.map +1 -0
  36. package/dist/src/__tests__/local-commands.test.js +163 -0
  37. package/dist/src/__tests__/local-commands.test.js.map +1 -0
  38. package/dist/src/__tests__/project-approval-rules.test.d.ts +2 -0
  39. package/dist/src/__tests__/project-approval-rules.test.d.ts.map +1 -0
  40. package/dist/src/__tests__/project-approval-rules.test.js +135 -0
  41. package/dist/src/__tests__/project-approval-rules.test.js.map +1 -0
  42. package/dist/src/__tests__/prompts.test.d.ts +2 -0
  43. package/dist/src/__tests__/prompts.test.d.ts.map +1 -0
  44. package/dist/src/__tests__/prompts.test.js +43 -0
  45. package/dist/src/__tests__/prompts.test.js.map +1 -0
  46. package/dist/src/__tests__/run-agent.test.d.ts +2 -0
  47. package/dist/src/__tests__/run-agent.test.d.ts.map +1 -0
  48. package/dist/src/__tests__/run-agent.test.js +1276 -0
  49. package/dist/src/__tests__/run-agent.test.js.map +1 -0
  50. package/dist/src/__tests__/run-shell.command.test.d.ts +2 -0
  51. package/dist/src/__tests__/run-shell.command.test.d.ts.map +1 -0
  52. package/dist/src/__tests__/run-shell.command.test.js +188 -0
  53. package/dist/src/__tests__/run-shell.command.test.js.map +1 -0
  54. package/dist/src/__tests__/smoke.test.d.ts +2 -0
  55. package/dist/src/__tests__/smoke.test.d.ts.map +1 -0
  56. package/dist/src/__tests__/smoke.test.js +314 -0
  57. package/dist/src/__tests__/smoke.test.js.map +1 -0
  58. package/dist/src/__tests__/tools.test.d.ts +2 -0
  59. package/dist/src/__tests__/tools.test.d.ts.map +1 -0
  60. package/dist/src/__tests__/tools.test.js +557 -0
  61. package/dist/src/__tests__/tools.test.js.map +1 -0
  62. package/dist/src/__tests__/trace-format.test.d.ts +2 -0
  63. package/dist/src/__tests__/trace-format.test.d.ts.map +1 -0
  64. package/dist/src/__tests__/trace-format.test.js +148 -0
  65. package/dist/src/__tests__/trace-format.test.js.map +1 -0
  66. package/dist/src/cli/ask.d.ts +11 -0
  67. package/dist/src/cli/ask.d.ts.map +1 -0
  68. package/dist/src/cli/ask.js +59 -0
  69. package/dist/src/cli/ask.js.map +1 -0
  70. package/dist/src/cli/chat/App.d.ts +5 -0
  71. package/dist/src/cli/chat/App.d.ts.map +1 -0
  72. package/dist/src/cli/chat/App.js +348 -0
  73. package/dist/src/cli/chat/App.js.map +1 -0
  74. package/dist/src/cli/chat/actions.d.ts +47 -0
  75. package/dist/src/cli/chat/actions.d.ts.map +1 -0
  76. package/dist/src/cli/chat/actions.js +215 -0
  77. package/dist/src/cli/chat/actions.js.map +1 -0
  78. package/dist/src/cli/chat/components/ActivityPanel.d.ts +11 -0
  79. package/dist/src/cli/chat/components/ActivityPanel.d.ts.map +1 -0
  80. package/dist/src/cli/chat/components/ActivityPanel.js +20 -0
  81. package/dist/src/cli/chat/components/ActivityPanel.js.map +1 -0
  82. package/dist/src/cli/chat/components/ApprovalComposer.d.ts +6 -0
  83. package/dist/src/cli/chat/components/ApprovalComposer.d.ts.map +1 -0
  84. package/dist/src/cli/chat/components/ApprovalComposer.js +30 -0
  85. package/dist/src/cli/chat/components/ApprovalComposer.js.map +1 -0
  86. package/dist/src/cli/chat/components/CommandHintPanel.d.ts +5 -0
  87. package/dist/src/cli/chat/components/CommandHintPanel.d.ts.map +1 -0
  88. package/dist/src/cli/chat/components/CommandHintPanel.js +13 -0
  89. package/dist/src/cli/chat/components/CommandHintPanel.js.map +1 -0
  90. package/dist/src/cli/chat/components/ConversationPanel.d.ts +16 -0
  91. package/dist/src/cli/chat/components/ConversationPanel.d.ts.map +1 -0
  92. package/dist/src/cli/chat/components/ConversationPanel.js +218 -0
  93. package/dist/src/cli/chat/components/ConversationPanel.js.map +1 -0
  94. package/dist/src/cli/chat/components/ModelPickerPanel.d.ts +7 -0
  95. package/dist/src/cli/chat/components/ModelPickerPanel.d.ts.map +1 -0
  96. package/dist/src/cli/chat/components/ModelPickerPanel.js +32 -0
  97. package/dist/src/cli/chat/components/ModelPickerPanel.js.map +1 -0
  98. package/dist/src/cli/chat/components/PromptInput.d.ts +29 -0
  99. package/dist/src/cli/chat/components/PromptInput.d.ts.map +1 -0
  100. package/dist/src/cli/chat/components/PromptInput.js +132 -0
  101. package/dist/src/cli/chat/components/PromptInput.js.map +1 -0
  102. package/dist/src/cli/chat/components/RecentTurnsPanel.d.ts +5 -0
  103. package/dist/src/cli/chat/components/RecentTurnsPanel.d.ts.map +1 -0
  104. package/dist/src/cli/chat/components/RecentTurnsPanel.js +10 -0
  105. package/dist/src/cli/chat/components/RecentTurnsPanel.js.map +1 -0
  106. package/dist/src/cli/chat/components/SessionPickerPanel.d.ts +12 -0
  107. package/dist/src/cli/chat/components/SessionPickerPanel.d.ts.map +1 -0
  108. package/dist/src/cli/chat/components/SessionPickerPanel.js +32 -0
  109. package/dist/src/cli/chat/components/SessionPickerPanel.js.map +1 -0
  110. package/dist/src/cli/chat/components/SlashHintPanel.d.ts +8 -0
  111. package/dist/src/cli/chat/components/SlashHintPanel.d.ts.map +1 -0
  112. package/dist/src/cli/chat/components/SlashHintPanel.js +38 -0
  113. package/dist/src/cli/chat/components/SlashHintPanel.js.map +1 -0
  114. package/dist/src/cli/chat/components/index.d.ts +10 -0
  115. package/dist/src/cli/chat/components/index.d.ts.map +1 -0
  116. package/dist/src/cli/chat/components/index.js +10 -0
  117. package/dist/src/cli/chat/components/index.js.map +1 -0
  118. package/dist/src/cli/chat/format.d.ts +23 -0
  119. package/dist/src/cli/chat/format.d.ts.map +1 -0
  120. package/dist/src/cli/chat/format.js +243 -0
  121. package/dist/src/cli/chat/format.js.map +1 -0
  122. package/dist/src/cli/chat/hooks/useAgentRun.d.ts +61 -0
  123. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -0
  124. package/dist/src/cli/chat/hooks/useAgentRun.js +463 -0
  125. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -0
  126. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts +31 -0
  127. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts.map +1 -0
  128. package/dist/src/cli/chat/hooks/useApprovalFlow.js +145 -0
  129. package/dist/src/cli/chat/hooks/useApprovalFlow.js.map +1 -0
  130. package/dist/src/cli/chat/hooks/useChatSessions.d.ts +23 -0
  131. package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -0
  132. package/dist/src/cli/chat/hooks/useChatSessions.js +124 -0
  133. package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -0
  134. package/dist/src/cli/chat/hooks/useProjectApprovals.d.ts +8 -0
  135. package/dist/src/cli/chat/hooks/useProjectApprovals.d.ts.map +1 -0
  136. package/dist/src/cli/chat/hooks/useProjectApprovals.js +33 -0
  137. package/dist/src/cli/chat/hooks/useProjectApprovals.js.map +1 -0
  138. package/dist/src/cli/chat/index.d.ts +4 -0
  139. package/dist/src/cli/chat/index.d.ts.map +1 -0
  140. package/dist/src/cli/chat/index.js +9 -0
  141. package/dist/src/cli/chat/index.js.map +1 -0
  142. package/dist/src/cli/chat/local-commands.d.ts +17 -0
  143. package/dist/src/cli/chat/local-commands.d.ts.map +1 -0
  144. package/dist/src/cli/chat/local-commands.js +180 -0
  145. package/dist/src/cli/chat/local-commands.js.map +1 -0
  146. package/dist/src/cli/chat/panels.d.ts +37 -0
  147. package/dist/src/cli/chat/panels.d.ts.map +1 -0
  148. package/dist/src/cli/chat/panels.js +142 -0
  149. package/dist/src/cli/chat/panels.js.map +1 -0
  150. package/dist/src/cli/chat/runtime.d.ts +26 -0
  151. package/dist/src/cli/chat/runtime.d.ts.map +1 -0
  152. package/dist/src/cli/chat/runtime.js +28 -0
  153. package/dist/src/cli/chat/runtime.js.map +1 -0
  154. package/dist/src/cli/chat/state/approval-rules.d.ts +21 -0
  155. package/dist/src/cli/chat/state/approval-rules.d.ts.map +1 -0
  156. package/dist/src/cli/chat/state/approval-rules.js +196 -0
  157. package/dist/src/cli/chat/state/approval-rules.js.map +1 -0
  158. package/dist/src/cli/chat/state/compaction.d.ts +13 -0
  159. package/dist/src/cli/chat/state/compaction.d.ts.map +1 -0
  160. package/dist/src/cli/chat/state/compaction.js +143 -0
  161. package/dist/src/cli/chat/state/compaction.js.map +1 -0
  162. package/dist/src/cli/chat/state/local-commands.d.ts +17 -0
  163. package/dist/src/cli/chat/state/local-commands.d.ts.map +1 -0
  164. package/dist/src/cli/chat/state/local-commands.js +169 -0
  165. package/dist/src/cli/chat/state/local-commands.js.map +1 -0
  166. package/dist/src/cli/chat/state/storage.d.ts +14 -0
  167. package/dist/src/cli/chat/state/storage.d.ts.map +1 -0
  168. package/dist/src/cli/chat/state/storage.js +144 -0
  169. package/dist/src/cli/chat/state/storage.js.map +1 -0
  170. package/dist/src/cli/chat/state/types.d.ts +69 -0
  171. package/dist/src/cli/chat/state/types.d.ts.map +1 -0
  172. package/dist/src/cli/chat/state/types.js +2 -0
  173. package/dist/src/cli/chat/state/types.js.map +1 -0
  174. package/dist/src/cli/chat/storage.d.ts +13 -0
  175. package/dist/src/cli/chat/storage.d.ts.map +1 -0
  176. package/dist/src/cli/chat/storage.js +126 -0
  177. package/dist/src/cli/chat/storage.js.map +1 -0
  178. package/dist/src/cli/chat/submit.d.ts +28 -0
  179. package/dist/src/cli/chat/submit.d.ts.map +1 -0
  180. package/dist/src/cli/chat/submit.js +90 -0
  181. package/dist/src/cli/chat/submit.js.map +1 -0
  182. package/dist/src/cli/chat/types.d.ts +51 -0
  183. package/dist/src/cli/chat/types.d.ts.map +1 -0
  184. package/dist/src/cli/chat/types.js +2 -0
  185. package/dist/src/cli/chat/types.js.map +1 -0
  186. package/dist/src/cli/chat/use-run-state.d.ts +23 -0
  187. package/dist/src/cli/chat/use-run-state.d.ts.map +1 -0
  188. package/dist/src/cli/chat/use-run-state.js +118 -0
  189. package/dist/src/cli/chat/use-run-state.js.map +1 -0
  190. package/dist/src/cli/chat/use-sessions.d.ts +21 -0
  191. package/dist/src/cli/chat/use-sessions.d.ts.map +1 -0
  192. package/dist/src/cli/chat/use-sessions.js +111 -0
  193. package/dist/src/cli/chat/use-sessions.js.map +1 -0
  194. package/dist/src/cli/chat/utils/format.d.ts +41 -0
  195. package/dist/src/cli/chat/utils/format.d.ts.map +1 -0
  196. package/dist/src/cli/chat/utils/format.js +578 -0
  197. package/dist/src/cli/chat/utils/format.js.map +1 -0
  198. package/dist/src/cli/chat/utils/runtime.d.ts +31 -0
  199. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -0
  200. package/dist/src/cli/chat/utils/runtime.js +56 -0
  201. package/dist/src/cli/chat/utils/runtime.js.map +1 -0
  202. package/dist/src/cli/chat-actions.d.ts +47 -0
  203. package/dist/src/cli/chat-actions.d.ts.map +1 -0
  204. package/dist/src/cli/chat-actions.js +215 -0
  205. package/dist/src/cli/chat-actions.js.map +1 -0
  206. package/dist/src/cli/chat-format.d.ts +23 -0
  207. package/dist/src/cli/chat-format.d.ts.map +1 -0
  208. package/dist/src/cli/chat-format.js +243 -0
  209. package/dist/src/cli/chat-format.js.map +1 -0
  210. package/dist/src/cli/chat-local-commands.d.ts +17 -0
  211. package/dist/src/cli/chat-local-commands.d.ts.map +1 -0
  212. package/dist/src/cli/chat-local-commands.js +180 -0
  213. package/dist/src/cli/chat-local-commands.js.map +1 -0
  214. package/dist/src/cli/chat-panels.d.ts +37 -0
  215. package/dist/src/cli/chat-panels.d.ts.map +1 -0
  216. package/dist/src/cli/chat-panels.js +142 -0
  217. package/dist/src/cli/chat-panels.js.map +1 -0
  218. package/dist/src/cli/chat-runtime.d.ts +26 -0
  219. package/dist/src/cli/chat-runtime.d.ts.map +1 -0
  220. package/dist/src/cli/chat-runtime.js +28 -0
  221. package/dist/src/cli/chat-runtime.js.map +1 -0
  222. package/dist/src/cli/chat-storage.d.ts +13 -0
  223. package/dist/src/cli/chat-storage.d.ts.map +1 -0
  224. package/dist/src/cli/chat-storage.js +126 -0
  225. package/dist/src/cli/chat-storage.js.map +1 -0
  226. package/dist/src/cli/chat-submit.d.ts +28 -0
  227. package/dist/src/cli/chat-submit.d.ts.map +1 -0
  228. package/dist/src/cli/chat-submit.js +90 -0
  229. package/dist/src/cli/chat-submit.js.map +1 -0
  230. package/dist/src/cli/chat-types.d.ts +51 -0
  231. package/dist/src/cli/chat-types.d.ts.map +1 -0
  232. package/dist/src/cli/chat-types.js +2 -0
  233. package/dist/src/cli/chat-types.js.map +1 -0
  234. package/dist/src/cli/chat.d.ts +4 -0
  235. package/dist/src/cli/chat.d.ts.map +1 -0
  236. package/dist/src/cli/chat.js +153 -0
  237. package/dist/src/cli/chat.js.map +1 -0
  238. package/dist/src/cli/main.d.ts +3 -0
  239. package/dist/src/cli/main.d.ts.map +1 -0
  240. package/dist/src/cli/main.js +190 -0
  241. package/dist/src/cli/main.js.map +1 -0
  242. package/dist/src/cli/useChatRunState.d.ts +23 -0
  243. package/dist/src/cli/useChatRunState.d.ts.map +1 -0
  244. package/dist/src/cli/useChatRunState.js +118 -0
  245. package/dist/src/cli/useChatRunState.js.map +1 -0
  246. package/dist/src/cli/useChatSessions.d.ts +21 -0
  247. package/dist/src/cli/useChatSessions.d.ts.map +1 -0
  248. package/dist/src/cli/useChatSessions.js +111 -0
  249. package/dist/src/cli/useChatSessions.js.map +1 -0
  250. package/dist/src/config.d.ts +4 -0
  251. package/dist/src/config.d.ts.map +1 -0
  252. package/dist/src/config.js +7 -0
  253. package/dist/src/config.js.map +1 -0
  254. package/dist/src/index.d.ts +36 -0
  255. package/dist/src/index.d.ts.map +1 -0
  256. package/dist/src/index.js +31 -0
  257. package/dist/src/index.js.map +1 -0
  258. package/dist/src/llm/anthropic.d.ts +7 -0
  259. package/dist/src/llm/anthropic.d.ts.map +1 -0
  260. package/dist/src/llm/anthropic.js +115 -0
  261. package/dist/src/llm/anthropic.js.map +1 -0
  262. package/dist/src/llm/factory.d.ts +10 -0
  263. package/dist/src/llm/factory.d.ts.map +1 -0
  264. package/dist/src/llm/factory.js +53 -0
  265. package/dist/src/llm/factory.js.map +1 -0
  266. package/dist/src/llm/openai-models.d.ts +15 -0
  267. package/dist/src/llm/openai-models.d.ts.map +1 -0
  268. package/dist/src/llm/openai-models.js +97 -0
  269. package/dist/src/llm/openai-models.js.map +1 -0
  270. package/dist/src/llm/openai.d.ts +10 -0
  271. package/dist/src/llm/openai.d.ts.map +1 -0
  272. package/dist/src/llm/openai.js +170 -0
  273. package/dist/src/llm/openai.js.map +1 -0
  274. package/dist/src/llm/types.d.ts +64 -0
  275. package/dist/src/llm/types.d.ts.map +1 -0
  276. package/dist/src/llm/types.js +5 -0
  277. package/dist/src/llm/types.js.map +1 -0
  278. package/dist/src/prompts/system-prompt.d.ts +6 -0
  279. package/dist/src/prompts/system-prompt.d.ts.map +1 -0
  280. package/dist/src/prompts/system-prompt.js +117 -0
  281. package/dist/src/prompts/system-prompt.js.map +1 -0
  282. package/dist/src/run-agent/history.d.ts +3 -0
  283. package/dist/src/run-agent/history.d.ts.map +1 -0
  284. package/dist/src/run-agent/history.js +36 -0
  285. package/dist/src/run-agent/history.js.map +1 -0
  286. package/dist/src/run-agent/mutation-tracking.d.ts +22 -0
  287. package/dist/src/run-agent/mutation-tracking.d.ts.map +1 -0
  288. package/dist/src/run-agent/mutation-tracking.js +116 -0
  289. package/dist/src/run-agent/mutation-tracking.js.map +1 -0
  290. package/dist/src/run-agent/post-mutation.d.ts +23 -0
  291. package/dist/src/run-agent/post-mutation.d.ts.map +1 -0
  292. package/dist/src/run-agent/post-mutation.js +106 -0
  293. package/dist/src/run-agent/post-mutation.js.map +1 -0
  294. package/dist/src/run-agent/progress-reminders.d.ts +13 -0
  295. package/dist/src/run-agent/progress-reminders.d.ts.map +1 -0
  296. package/dist/src/run-agent/progress-reminders.js +65 -0
  297. package/dist/src/run-agent/progress-reminders.js.map +1 -0
  298. package/dist/src/run-agent/tool-dispatch.d.ts +31 -0
  299. package/dist/src/run-agent/tool-dispatch.d.ts.map +1 -0
  300. package/dist/src/run-agent/tool-dispatch.js +114 -0
  301. package/dist/src/run-agent/tool-dispatch.js.map +1 -0
  302. package/dist/src/run-agent/util.d.ts +10 -0
  303. package/dist/src/run-agent/util.d.ts.map +1 -0
  304. package/dist/src/run-agent/util.js +64 -0
  305. package/dist/src/run-agent/util.js.map +1 -0
  306. package/dist/src/run-agent.d.ts +36 -0
  307. package/dist/src/run-agent.d.ts.map +1 -0
  308. package/dist/src/run-agent.js +477 -0
  309. package/dist/src/run-agent.js.map +1 -0
  310. package/dist/src/tools/edit-file.d.ts +10 -0
  311. package/dist/src/tools/edit-file.d.ts.map +1 -0
  312. package/dist/src/tools/edit-file.js +268 -0
  313. package/dist/src/tools/edit-file.js.map +1 -0
  314. package/dist/src/tools/execute-tool.d.ts +8 -0
  315. package/dist/src/tools/execute-tool.d.ts.map +1 -0
  316. package/dist/src/tools/execute-tool.js +31 -0
  317. package/dist/src/tools/execute-tool.js.map +1 -0
  318. package/dist/src/tools/list-files.d.ts +3 -0
  319. package/dist/src/tools/list-files.d.ts.map +1 -0
  320. package/dist/src/tools/list-files.js +49 -0
  321. package/dist/src/tools/list-files.js.map +1 -0
  322. package/dist/src/tools/read-file.d.ts +3 -0
  323. package/dist/src/tools/read-file.d.ts.map +1 -0
  324. package/dist/src/tools/read-file.js +73 -0
  325. package/dist/src/tools/read-file.js.map +1 -0
  326. package/dist/src/tools/registry.d.ts +11 -0
  327. package/dist/src/tools/registry.d.ts.map +1 -0
  328. package/dist/src/tools/registry.js +27 -0
  329. package/dist/src/tools/registry.js.map +1 -0
  330. package/dist/src/tools/report-state.d.ts +3 -0
  331. package/dist/src/tools/report-state.d.ts.map +1 -0
  332. package/dist/src/tools/report-state.js +63 -0
  333. package/dist/src/tools/report-state.js.map +1 -0
  334. package/dist/src/tools/run-shell.d.ts +41 -0
  335. package/dist/src/tools/run-shell.d.ts.map +1 -0
  336. package/dist/src/tools/run-shell.js +407 -0
  337. package/dist/src/tools/run-shell.js.map +1 -0
  338. package/dist/src/tools/search-files.d.ts +8 -0
  339. package/dist/src/tools/search-files.d.ts.map +1 -0
  340. package/dist/src/tools/search-files.js +86 -0
  341. package/dist/src/tools/search-files.js.map +1 -0
  342. package/dist/src/tools/update-plan.d.ts +8 -0
  343. package/dist/src/tools/update-plan.d.ts.map +1 -0
  344. package/dist/src/tools/update-plan.js +85 -0
  345. package/dist/src/tools/update-plan.js.map +1 -0
  346. package/dist/src/trace/format.d.ts +6 -0
  347. package/dist/src/trace/format.d.ts.map +1 -0
  348. package/dist/src/trace/format.js +94 -0
  349. package/dist/src/trace/format.js.map +1 -0
  350. package/dist/src/trace/recorder.d.ts +11 -0
  351. package/dist/src/trace/recorder.d.ts.map +1 -0
  352. package/dist/src/trace/recorder.js +21 -0
  353. package/dist/src/trace/recorder.js.map +1 -0
  354. package/dist/src/types.d.ts +110 -0
  355. package/dist/src/types.d.ts.map +1 -0
  356. package/dist/src/types.js +6 -0
  357. package/dist/src/types.js.map +1 -0
  358. package/dist/src/utils/budget.d.ts +13 -0
  359. package/dist/src/utils/budget.d.ts.map +1 -0
  360. package/dist/src/utils/budget.js +22 -0
  361. package/dist/src/utils/budget.js.map +1 -0
  362. package/dist/src/utils/errors.d.ts +14 -0
  363. package/dist/src/utils/errors.d.ts.map +1 -0
  364. package/dist/src/utils/errors.js +31 -0
  365. package/dist/src/utils/errors.js.map +1 -0
  366. package/dist/src/utils/logger.d.ts +17 -0
  367. package/dist/src/utils/logger.d.ts.map +1 -0
  368. package/dist/src/utils/logger.js +50 -0
  369. package/dist/src/utils/logger.js.map +1 -0
  370. package/package.json +57 -0
@@ -0,0 +1,116 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Mutation tracking — classifies shell commands and tool calls by their
3
+ // workspace effect (change, verify, review) so the main loop can enforce
4
+ // post-mutation requirements.
5
+ // ---------------------------------------------------------------------------
6
+ import { extractShellCommand } from './util.js';
7
+ export function createMutationState() {
8
+ return {
9
+ pendingVerification: false,
10
+ pendingChangeReview: false,
11
+ requiresStructuredChangeSummary: false,
12
+ needsImmediateReviewReminder: false,
13
+ needsImmediateVerificationReminder: false,
14
+ executedMutationCommands: [],
15
+ executedReviewCommands: [],
16
+ executedVerificationCommands: [],
17
+ executedReviewEvidence: [],
18
+ executedVerificationEvidence: [],
19
+ };
20
+ }
21
+ export function trackToolResult(state, effectiveCall, result) {
22
+ if (!result.ok) {
23
+ return;
24
+ }
25
+ const command = extractShellCommand(effectiveCall.input);
26
+ if (effectiveCall.tool === 'run_shell_mutate' && command) {
27
+ if (isWorkspaceChangeMutateCommand(command)) {
28
+ state.pendingVerification = true;
29
+ state.pendingChangeReview = true;
30
+ state.requiresStructuredChangeSummary = true;
31
+ state.needsImmediateReviewReminder = true;
32
+ state.needsImmediateVerificationReminder = true;
33
+ state.executedMutationCommands.push(command);
34
+ }
35
+ if (isVerificationMutateCommand(command)) {
36
+ state.pendingVerification = false;
37
+ state.needsImmediateVerificationReminder = false;
38
+ state.executedVerificationCommands.push(command);
39
+ }
40
+ }
41
+ if (effectiveCall.tool === 'edit_file') {
42
+ state.executedMutationCommands.push(describeEditMutation(effectiveCall.input));
43
+ }
44
+ if (effectiveCall.tool === 'run_shell_inspect' && command && isRepoReviewCommand(command)) {
45
+ state.pendingChangeReview = false;
46
+ state.needsImmediateReviewReminder = false;
47
+ state.executedReviewCommands.push(command);
48
+ state.executedReviewEvidence.push(summarizeCommandEvidence(result.output));
49
+ }
50
+ if (effectiveCall.tool === 'run_shell_mutate' && command && isVerificationMutateCommand(command)) {
51
+ state.pendingVerification = false;
52
+ state.needsImmediateVerificationReminder = false;
53
+ state.executedVerificationEvidence.push(summarizeCommandEvidence(result.output));
54
+ }
55
+ }
56
+ export function isWorkspaceChangeMutateCommand(command) {
57
+ return (/^yarn format\b/.test(command) ||
58
+ /^yarn prettier\b/.test(command) ||
59
+ /^yarn eslint\b/.test(command) ||
60
+ /^yarn add\b/.test(command) ||
61
+ /^yarn install\b/.test(command) ||
62
+ /^yarn remove\b/.test(command) ||
63
+ /^mkdir\b/.test(command) ||
64
+ /^touch\b/.test(command) ||
65
+ /^mv\b/.test(command) ||
66
+ /^cp\b/.test(command) ||
67
+ /^git add\b/.test(command) ||
68
+ /^git mv\b/.test(command) ||
69
+ /^npx prettier --write\b/.test(command) ||
70
+ /^npx eslint --fix\b/.test(command) ||
71
+ /^prettier --write\b/.test(command) ||
72
+ /^eslint --fix\b/.test(command));
73
+ }
74
+ export function isVerificationMutateCommand(command) {
75
+ return (/^yarn test\b/.test(command) ||
76
+ /^yarn build\b/.test(command) ||
77
+ /^yarn lint\b/.test(command) ||
78
+ /^yarn vitest\b/.test(command) ||
79
+ /^vitest\b/.test(command) ||
80
+ /^tsc\b/.test(command));
81
+ }
82
+ export function isRepoReviewCommand(command) {
83
+ const normalized = normalizeCommand(command);
84
+ return (normalized.startsWith('git status') && includesFlag(normalized, '--short')) || (normalized.startsWith('git diff') && includesFlag(normalized, '--stat'));
85
+ }
86
+ function normalizeCommand(command) {
87
+ return command.trim().replace(/\s+/g, ' ');
88
+ }
89
+ function includesFlag(command, flag) {
90
+ const pattern = new RegExp(`(?:^|\\s)${escapeRegExp(flag)}(?:=\\S+|\\s|$)`);
91
+ return pattern.test(command);
92
+ }
93
+ function escapeRegExp(value) {
94
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
95
+ }
96
+ function describeEditMutation(input) {
97
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
98
+ return 'edit_file';
99
+ }
100
+ const path = input.path;
101
+ return typeof path === 'string' && path.trim() ? `edit_file ${path.trim()}` : 'edit_file';
102
+ }
103
+ function summarizeCommandEvidence(output) {
104
+ if (!output || typeof output !== 'object' || Array.isArray(output)) {
105
+ return 'no structured command output recorded';
106
+ }
107
+ const candidate = output;
108
+ const command = typeof candidate.command === 'string' && candidate.command.trim() ? candidate.command.trim() : 'command';
109
+ const stdout = typeof candidate.stdout === 'string' ? candidate.stdout.trim() : '';
110
+ const stderr = typeof candidate.stderr === 'string' ? candidate.stderr.trim() : '';
111
+ const exitCode = typeof candidate.exitCode === 'number' ? candidate.exitCode : 0;
112
+ const body = stdout || stderr;
113
+ const snippet = body ? body.replace(/\s+/g, ' ').slice(0, 120) : 'no stdout/stderr output';
114
+ return `${command} => exit ${exitCode}, ${snippet}`;
115
+ }
116
+ //# sourceMappingURL=mutation-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-tracking.js","sourceRoot":"","sources":["../../../src/run-agent/mutation-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { MutationState } from './mutation-tracking.js';
2
+ export declare function buildPostMutationRequirement(options: {
3
+ pendingVerification: boolean;
4
+ pendingChangeReview: boolean;
5
+ reviewCommands?: string[];
6
+ verificationCommands?: string[];
7
+ noteExistingVerification?: boolean;
8
+ }): string;
9
+ export declare function buildImmediateReviewReminder(options: {
10
+ executedReviewCommands: string[];
11
+ pendingChangeReview: boolean;
12
+ }): string;
13
+ export declare function buildImmediateVerificationReminder(options: {
14
+ executedVerificationCommands: string[];
15
+ pendingVerification: boolean;
16
+ }): string;
17
+ export declare function hasStructuredChangeSummary(content: string, options: {
18
+ mutationCommands: string[];
19
+ reviewCommands: string[];
20
+ verificationCommands: string[];
21
+ }): boolean;
22
+ export declare function buildStructuredChangeSummaryRequirement(state: MutationState): string;
23
+ //# sourceMappingURL=post-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-mutation.d.ts","sourceRoot":"","sources":["../../../src/run-agent/post-mutation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,MAAM,CAoBT;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,MAAM,CAQT;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE;IAC1D,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,MAAM,CAQT;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACA,OAAO,CAqCT;AAED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkBpF"}
@@ -0,0 +1,106 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Post-mutation host requirements — blocks premature final answers until
3
+ // the agent has reviewed and verified workspace-changing mutations.
4
+ // ---------------------------------------------------------------------------
5
+ export function buildPostMutationRequirement(options) {
6
+ const requirements = [];
7
+ if (options.pendingChangeReview) {
8
+ const reviewGuidance = options.reviewCommands && options.reviewCommands.length > 0
9
+ ? `inspect the resulting repo state with concrete git review evidence. Review already captured: ${options.reviewCommands.join('; ')}. Also run the missing git-native review command such as git status --short or git diff --stat`
10
+ : 'inspect the resulting repo state with concrete git review evidence such as git status --short or git diff --stat';
11
+ requirements.push(reviewGuidance);
12
+ }
13
+ if (options.pendingVerification) {
14
+ const verificationGuidance = options.verificationCommands && options.verificationCommands.length > 0
15
+ ? `run a verification command such as yarn test, yarn build, yarn lint, vitest, or tsc. Verification already captured: ${options.verificationCommands.join('; ')}. Re-run or add another verification command only if needed`
16
+ : 'run a verification command such as yarn test, yarn build, yarn lint, vitest, or tsc';
17
+ requirements.push(verificationGuidance);
18
+ }
19
+ else if (options.noteExistingVerification && options.verificationCommands && options.verificationCommands.length > 0) {
20
+ requirements.push(`note: verification already captured: ${options.verificationCommands.join('; ')}. Additional verification is not required unless the repo state changed again.`);
21
+ }
22
+ return `Host requirement: before giving a final answer after a workspace-changing mutate command, you must ${requirements.join(' and ')}. After doing that, then provide the final answer.`;
23
+ }
24
+ export function buildImmediateReviewReminder(options) {
25
+ const lastReview = options.executedReviewCommands.at(-1);
26
+ const baseline = 'Host reminder: you ran a workspace-changing command; inspect the resulting repo state now with git status --short or git diff --stat before continuing.';
27
+ if (!lastReview) {
28
+ return baseline;
29
+ }
30
+ return `${baseline} Last review command recorded: ${lastReview}.`;
31
+ }
32
+ export function buildImmediateVerificationReminder(options) {
33
+ const lastVerification = options.executedVerificationCommands.at(-1);
34
+ const baseline = 'Host reminder: you ran a workspace-changing command; run a verification command such as yarn test or yarn build before continuing.';
35
+ if (!lastVerification) {
36
+ return baseline;
37
+ }
38
+ return `${baseline} Last verification command recorded: ${lastVerification}.`;
39
+ }
40
+ export function hasStructuredChangeSummary(content, options) {
41
+ const summaryLead = extractSummaryLead(content);
42
+ if (!summaryLead) {
43
+ return false;
44
+ }
45
+ const changedLine = extractStructuredSummaryLine(content, 'Changed');
46
+ const verifiedLine = extractStructuredSummaryLine(content, 'Verified');
47
+ const uncertaintyLine = extractStructuredSummaryLine(content, 'Remaining uncertainty') ??
48
+ extractStructuredSummaryLine(content, 'Uncertainty') ??
49
+ extractStructuredSummaryLine(content, 'Remaining risks');
50
+ if (!changedLine || !verifiedLine || !uncertaintyLine) {
51
+ return false;
52
+ }
53
+ const normalizedChangedLine = changedLine.toLowerCase();
54
+ const normalizedVerifiedLine = verifiedLine.toLowerCase();
55
+ const mentionsMutation = options.mutationCommands.length === 0 ||
56
+ options.mutationCommands.some((command) => normalizedChangedLine.includes(command.toLowerCase()));
57
+ const mentionsReview = options.reviewCommands.length === 0 ||
58
+ options.reviewCommands.some((command) => normalizedVerifiedLine.includes(command.toLowerCase()));
59
+ const mentionsVerification = options.verificationCommands.length === 0 ||
60
+ options.verificationCommands.some((command) => normalizedVerifiedLine.includes(command.toLowerCase()));
61
+ const mentionsReviewEvidence = options.reviewCommands.length === 0 ||
62
+ options.reviewCommands.some((command) => normalizedVerifiedLine.includes(`${command.toLowerCase()} => exit`));
63
+ const mentionsVerificationEvidence = options.verificationCommands.length === 0 ||
64
+ options.verificationCommands.some((command) => normalizedVerifiedLine.includes(`${command.toLowerCase()} => exit`));
65
+ return mentionsMutation && mentionsReview && mentionsVerification && mentionsReviewEvidence && mentionsVerificationEvidence;
66
+ }
67
+ export function buildStructuredChangeSummaryRequirement(state) {
68
+ const mutationSummary = state.executedMutationCommands.length > 0
69
+ ? state.executedMutationCommands.join('; ')
70
+ : 'workspace-changing command(s) already executed';
71
+ const reviewSummary = state.executedReviewCommands.length > 0
72
+ ? state.executedReviewCommands.join('; ')
73
+ : 'no repo review command recorded';
74
+ const verificationSummary = state.executedVerificationCommands.length > 0
75
+ ? state.executedVerificationCommands.join('; ')
76
+ : 'no verification command recorded';
77
+ const reviewEvidenceSummary = state.executedReviewEvidence.length > 0
78
+ ? state.executedReviewEvidence.join('; ')
79
+ : 'no repo review evidence captured';
80
+ const verificationEvidenceSummary = state.executedVerificationEvidence.length > 0
81
+ ? state.executedVerificationEvidence.join('; ')
82
+ : 'no verification evidence captured';
83
+ return `Host requirement: after a workspace-changing mutate command, your final answer must start with a short summary sentence or short paragraph, then include bullet points labeled "Changed:", "Verified:", and "Remaining uncertainty:". In "Changed:", mention the concrete change work and name the exact command(s) or edit action used (${mutationSummary}). In "Verified:", name the exact repo review command(s) (${reviewSummary}) and exact verification command(s) (${verificationSummary}), and ground them in concrete evidence from the command results (${reviewEvidenceSummary}; ${verificationEvidenceSummary}). If nothing remains uncertain, explicitly write "Remaining uncertainty: none".`;
84
+ }
85
+ function extractStructuredSummaryLine(content, label) {
86
+ const match = content.match(new RegExp(`(?:^|\\n)\\s*(?:[-*]\\s+)?${escapeRegExp(label)}\\s*:\\s*([^\\n]+)`, 'i'));
87
+ return match?.[1]?.trim();
88
+ }
89
+ function extractSummaryLead(content) {
90
+ const lines = content
91
+ .split('\n')
92
+ .map((line) => line.trim())
93
+ .filter(Boolean);
94
+ const first = lines[0];
95
+ if (!first) {
96
+ return undefined;
97
+ }
98
+ if (/^(?:[-*]\s+)?(?:changed|verified|remaining uncertainty|uncertainty|remaining risks?)\s*:/i.test(first)) {
99
+ return undefined;
100
+ }
101
+ return first;
102
+ }
103
+ function escapeRegExp(value) {
104
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
105
+ }
106
+ //# sourceMappingURL=post-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-mutation.js","sourceRoot":"","sources":["../../../src/run-agent/post-mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ToolCall, ToolResult } from '../types.js';
2
+ export type ProgressReminderState = {
3
+ successfulNonMutationToolCalls: number;
4
+ sentDriftReminder: boolean;
5
+ sentLowStepReminder: boolean;
6
+ };
7
+ export declare function createProgressReminderState(): ProgressReminderState;
8
+ export declare function buildProgressReminders(state: ProgressReminderState, options: {
9
+ effectiveCall: ToolCall;
10
+ result: ToolResult;
11
+ remainingSteps: number;
12
+ }): string[];
13
+ //# sourceMappingURL=progress-reminders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reminders.d.ts","sourceRoot":"","sources":["../../../src/run-agent/progress-reminders.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,MAAM,qBAAqB,GAAG;IAClC,8BAA8B,EAAE,MAAM,CAAC;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,2BAA2B,IAAI,qBAAqB,CAMnE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,GACA,MAAM,EAAE,CAmCV"}
@@ -0,0 +1,65 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Progress reminders — nudges the agent to follow through when it starts
3
+ // drifting into planning/meta loops instead of executing or concluding.
4
+ // ---------------------------------------------------------------------------
5
+ import { isWorkspaceChangeMutateCommand } from './mutation-tracking.js';
6
+ import { extractShellCommand } from './util.js';
7
+ const DRIFT_REMINDER_THRESHOLD = 6;
8
+ const LOW_STEP_REMINDER_THRESHOLD = 2;
9
+ export function createProgressReminderState() {
10
+ return {
11
+ successfulNonMutationToolCalls: 0,
12
+ sentDriftReminder: false,
13
+ sentLowStepReminder: false,
14
+ };
15
+ }
16
+ export function buildProgressReminders(state, options) {
17
+ const reminders = [];
18
+ if (options.result.ok) {
19
+ if (isWorkspaceChangingCall(options.effectiveCall)) {
20
+ state.successfulNonMutationToolCalls = 0;
21
+ state.sentDriftReminder = false;
22
+ }
23
+ else {
24
+ state.successfulNonMutationToolCalls += 1;
25
+ }
26
+ if (options.effectiveCall.tool === 'report_state') {
27
+ reminders.push(buildReportStateReminder(options.result.output));
28
+ }
29
+ }
30
+ if (!state.sentDriftReminder && state.successfulNonMutationToolCalls >= DRIFT_REMINDER_THRESHOLD) {
31
+ state.sentDriftReminder = true;
32
+ reminders.push('Host reminder: you have already spent several successful tool calls gathering context. Stop restating the plan. Either answer directly from the evidence you have or execute one bounded next action now.');
33
+ }
34
+ if (!state.sentLowStepReminder &&
35
+ state.successfulNonMutationToolCalls >= 3 &&
36
+ options.remainingSteps <= LOW_STEP_REMINDER_THRESHOLD) {
37
+ state.sentLowStepReminder = true;
38
+ reminders.push(`Host reminder: only ${options.remainingSteps} step(s) remain. Do not spend another turn rephrasing the plan. Either execute the single next concrete action needed to finish, or answer with the best grounded blocker.`);
39
+ }
40
+ return reminders;
41
+ }
42
+ function isWorkspaceChangingCall(call) {
43
+ if (call.tool === 'edit_file') {
44
+ return true;
45
+ }
46
+ if (call.tool !== 'run_shell_mutate') {
47
+ return false;
48
+ }
49
+ const command = extractShellCommand(call.input);
50
+ return !!command && isWorkspaceChangeMutateCommand(command);
51
+ }
52
+ function buildReportStateReminder(output) {
53
+ const nextNeed = extractNextNeed(output);
54
+ return nextNeed ?
55
+ `Host reminder: report_state is only a checkpoint. On the next turn, either do the concrete nextNeed you identified (${nextNeed}) or finish with the best grounded blocker. Do not repeat the same planning state.`
56
+ : 'Host reminder: report_state is only a checkpoint. On the next turn, either do the concrete next action you identified or finish with the best grounded blocker. Do not repeat the same planning state.';
57
+ }
58
+ function extractNextNeed(output) {
59
+ if (!output || typeof output !== 'object' || Array.isArray(output)) {
60
+ return undefined;
61
+ }
62
+ const nextNeed = output.nextNeed;
63
+ return typeof nextNeed === 'string' && nextNeed.trim() ? nextNeed.trim() : undefined;
64
+ }
65
+ //# sourceMappingURL=progress-reminders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reminders.js","sourceRoot":"","sources":["../../../src/run-agent/progress-reminders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ToolDefinition, ToolCall, TraceEvent } from '../types.js';
2
+ import type { RunAgentOptions } from '../run-agent.js';
3
+ import { createToolRegistry } from '../tools/registry.js';
4
+ import { executeTool } from '../tools/execute-tool.js';
5
+ import type { Logger } from 'pino';
6
+ export declare function maybeDenyToolCall(args: {
7
+ call: ToolCall;
8
+ tool: ToolDefinition | undefined;
9
+ step: number;
10
+ now: () => string;
11
+ approveToolCall: RunAgentOptions['approveToolCall'];
12
+ record: (event: TraceEvent) => void;
13
+ log: Logger;
14
+ }): Promise<{
15
+ ok: false;
16
+ error: string;
17
+ } | undefined>;
18
+ export declare function executeToolCallWithFallback(args: {
19
+ call: ToolCall;
20
+ step: number;
21
+ now: () => string;
22
+ registry: ReturnType<typeof createToolRegistry>;
23
+ seenToolCalls: Map<string, number>;
24
+ approveToolCall: RunAgentOptions['approveToolCall'];
25
+ record: (event: TraceEvent) => void;
26
+ log: Logger;
27
+ }): Promise<{
28
+ effectiveCall: ToolCall;
29
+ result: Awaited<ReturnType<typeof executeTool>>;
30
+ }>;
31
+ //# sourceMappingURL=tool-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-dispatch.d.ts","sourceRoot":"","sources":["../../../src/run-agent/tool-dispatch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAoBpD;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAE,CAAC,CA2CxF"}
@@ -0,0 +1,114 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Tool dispatch — approval, execution, fallback, and deduplication logic
3
+ // for the agent loop.
4
+ // ---------------------------------------------------------------------------
5
+ import { executeTool } from '../tools/execute-tool.js';
6
+ import { stableSerialize, normalizeToolInput, buildRepeatedToolCallResult } from './util.js';
7
+ const MAX_IDENTICAL_TOOL_CALLS = 2;
8
+ export async function maybeDenyToolCall(args) {
9
+ const { call, tool, step, now, approveToolCall, record, log } = args;
10
+ if (!tool?.requiresApproval) {
11
+ return undefined;
12
+ }
13
+ const approval = await resolveToolApproval({ call, tool, step, now, approveToolCall, record });
14
+ if (approval.approved) {
15
+ return undefined;
16
+ }
17
+ const result = {
18
+ ok: false,
19
+ error: approval.reason ? `Approval denied for ${call.tool}: ${approval.reason}`
20
+ : `Approval denied for ${call.tool}`,
21
+ };
22
+ log.warn({ step, tool: call.tool, reason: approval.reason }, 'Tool execution denied by approval policy');
23
+ record({ type: 'tool.result', tool: call.tool, result, step, timestamp: now() });
24
+ return result;
25
+ }
26
+ export async function executeToolCallWithFallback(args) {
27
+ const primary = await executeRecordedToolCall(args.call, args);
28
+ const fallbackReason = getInspectFallbackReason(args.call, primary.result);
29
+ if (!fallbackReason) {
30
+ return primary;
31
+ }
32
+ const mutateTool = args.registry.get('run_shell_mutate');
33
+ if (!mutateTool) {
34
+ return primary;
35
+ }
36
+ const mutateCall = {
37
+ id: `${args.call.id}-mutate-fallback`,
38
+ tool: 'run_shell_mutate',
39
+ input: args.call.input,
40
+ };
41
+ args.record({
42
+ type: 'tool.fallback',
43
+ fromCall: args.call,
44
+ toCall: mutateCall,
45
+ reason: fallbackReason,
46
+ step: args.step,
47
+ timestamp: args.now(),
48
+ });
49
+ const approvalDeniedResult = await maybeDenyToolCall({
50
+ call: mutateCall,
51
+ tool: mutateTool,
52
+ step: args.step,
53
+ now: args.now,
54
+ approveToolCall: args.approveToolCall,
55
+ record: args.record,
56
+ log: args.log,
57
+ });
58
+ if (approvalDeniedResult) {
59
+ return { effectiveCall: mutateCall, result: approvalDeniedResult };
60
+ }
61
+ args.log.info({ step: args.step, from: args.call.tool, to: mutateCall.tool, reason: fallbackReason }, 'Retrying inspect failure through mutate fallback');
62
+ return executeRecordedToolCall(mutateCall, args);
63
+ }
64
+ async function executeRecordedToolCall(call, args) {
65
+ const { step, now, registry, seenToolCalls, record, log } = args;
66
+ log.info({ step, tool: call.tool }, 'Executing tool');
67
+ record({ type: 'tool.call', call, step, timestamp: now() });
68
+ const signature = `${call.tool}:${stableSerialize(normalizeToolInput(call.tool, call.input))}`;
69
+ const seenCount = seenToolCalls.get(signature) ?? 0;
70
+ const result = seenCount >= MAX_IDENTICAL_TOOL_CALLS
71
+ ? buildRepeatedToolCallResult(call.tool)
72
+ : await executeTool(registry, call);
73
+ seenToolCalls.set(signature, seenCount + 1);
74
+ log.debug({ step, tool: call.tool, ok: result.ok }, 'Tool result');
75
+ record({ type: 'tool.result', tool: call.tool, result, step, timestamp: now() });
76
+ return { effectiveCall: call, result };
77
+ }
78
+ async function resolveToolApproval(args) {
79
+ const { call, tool, step, now, approveToolCall, record } = args;
80
+ record({ type: 'tool.approval_requested', call, step, timestamp: now() });
81
+ const approval = approveToolCall ? await approveToolCall(call, tool)
82
+ : {
83
+ approved: false,
84
+ reason: `No approval handler configured for ${call.tool}`,
85
+ };
86
+ record({
87
+ type: 'tool.approval_resolved',
88
+ call,
89
+ approved: approval.approved,
90
+ reason: approval.reason,
91
+ step,
92
+ timestamp: now(),
93
+ });
94
+ return approval;
95
+ }
96
+ function getInspectFallbackReason(call, result) {
97
+ if (call.tool !== 'run_shell_inspect' || result.ok) {
98
+ return undefined;
99
+ }
100
+ return getInspectMutateFallbackReason(result.error);
101
+ }
102
+ function getInspectMutateFallbackReason(error) {
103
+ if (!error) {
104
+ return undefined;
105
+ }
106
+ if (error.includes('run_shell_inspect policy')) {
107
+ return 'inspect policy rejected the command';
108
+ }
109
+ if (error.includes('Inspect mode permits read-only pipes')) {
110
+ return 'inspect shell restrictions rejected the command';
111
+ }
112
+ return undefined;
113
+ }
114
+ //# sourceMappingURL=tool-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-dispatch.js","sourceRoot":"","sources":["../../../src/run-agent/tool-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function extractShellCommand(input: unknown): string | undefined;
2
+ export declare function stableSerialize(value: unknown): string;
3
+ export declare function normalizeToolInput(tool: string, input: unknown): unknown;
4
+ export declare function isRecoverableToolError(error: string | undefined): boolean;
5
+ export declare function isAbortError(err: unknown): boolean;
6
+ export declare function buildRepeatedToolCallResult(tool: string): {
7
+ ok: false;
8
+ error: string;
9
+ };
10
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/run-agent/util.ts"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAoBxE;AAWD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMzE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAUlD;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKtF"}
@@ -0,0 +1,64 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Small utilities shared across the run-agent submodules.
3
+ // ---------------------------------------------------------------------------
4
+ export function extractShellCommand(input) {
5
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
6
+ return undefined;
7
+ }
8
+ const command = input.command;
9
+ return typeof command === 'string' && command.trim() ? command.trim() : undefined;
10
+ }
11
+ export function stableSerialize(value) {
12
+ if (Array.isArray(value)) {
13
+ return `[${value.map((item) => stableSerialize(item)).join(',')}]`;
14
+ }
15
+ if (value && typeof value === 'object') {
16
+ const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
17
+ return `{${entries.map(([key, entryValue]) => `${JSON.stringify(key)}:${stableSerialize(entryValue)}`).join(',')}}`;
18
+ }
19
+ return JSON.stringify(value);
20
+ }
21
+ export function normalizeToolInput(tool, input) {
22
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
23
+ return input;
24
+ }
25
+ const normalized = { ...input };
26
+ if ((tool === 'list_files' || tool === 'read_file' || tool === 'search_files') && typeof normalized.path === 'string') {
27
+ normalized.path = normalizePathValue(normalized.path);
28
+ }
29
+ if (tool === 'edit_file' && typeof normalized.path === 'string') {
30
+ normalized.path = normalizePathValue(normalized.path);
31
+ }
32
+ if ((tool === 'run_shell_inspect' || tool === 'run_shell_mutate') && typeof normalized.command === 'string') {
33
+ normalized.command = normalized.command.trim().replace(/\s+/g, ' ');
34
+ }
35
+ return normalized;
36
+ }
37
+ function normalizePathValue(path) {
38
+ const trimmed = path.trim();
39
+ if (trimmed === './' || trimmed === '.') {
40
+ return '.';
41
+ }
42
+ return trimmed.replace(/\/+$/, '') || '.';
43
+ }
44
+ export function isRecoverableToolError(error) {
45
+ if (!error) {
46
+ return false;
47
+ }
48
+ return error.startsWith('Invalid input for ') || error.startsWith('Repeated tool call blocked:');
49
+ }
50
+ export function isAbortError(err) {
51
+ if (!(err instanceof Error)) {
52
+ return false;
53
+ }
54
+ return (err.name === 'AbortError' ||
55
+ err.name === 'APIUserAbortError' ||
56
+ /aborted/i.test(err.message));
57
+ }
58
+ export function buildRepeatedToolCallResult(tool) {
59
+ return {
60
+ ok: false,
61
+ error: `Repeated tool call blocked: ${tool} was already called ${2} times with the same input earlier in this run. Try a different tool or different input.`,
62
+ };
63
+ }
64
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/run-agent/util.ts"],"names":[],"mappings":"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"}