@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,41 @@
1
+ import type { ToolDefinition, ToolResult } from '../types.js';
2
+ export type RunShellScope = 'inspect' | 'workspace' | 'external';
3
+ export type RunShellRisk = 'low' | 'medium' | 'unknown';
4
+ export type RunShellCapability = 'workspace_listing' | 'file_inspection' | 'workspace_search' | 'structured_inspection' | 'environment_inspection' | 'git_inspection' | 'dependency' | 'verification' | 'formatting' | 'file_operation' | 'git_staging' | 'project_script' | 'unknown_workspace';
5
+ export type RunShellPolicyDecision = {
6
+ binary: string;
7
+ scope: RunShellScope;
8
+ risk: RunShellRisk;
9
+ capability: RunShellCapability;
10
+ reason: string;
11
+ };
12
+ type RunShellRule = {
13
+ binary: string;
14
+ argsPrefix?: string[];
15
+ scope: RunShellScope;
16
+ risk: RunShellRisk;
17
+ capability: RunShellCapability;
18
+ reason: string;
19
+ };
20
+ export type RunShellOptions = {
21
+ rules?: RunShellRule[];
22
+ };
23
+ export declare const DEFAULT_INSPECT_RULES: RunShellRule[];
24
+ export declare const DEFAULT_MUTATE_RULES: RunShellRule[];
25
+ export declare function createRunShellInspectTool(options?: RunShellOptions): ToolDefinition;
26
+ export declare function createRunShellMutateTool(options?: RunShellOptions): ToolDefinition;
27
+ export declare function createRunShellTool(options?: RunShellOptions): ToolDefinition;
28
+ export declare function runShellCommand(raw: unknown, options: {
29
+ toolName: string;
30
+ rules: RunShellRule[];
31
+ allowUnknown: boolean;
32
+ }, signal?: AbortSignal): Promise<ToolResult>;
33
+ export declare function classifyShellCommandPolicy(command: string, options: {
34
+ toolName: string;
35
+ rules: RunShellRule[];
36
+ allowUnknown: boolean;
37
+ }): RunShellPolicyDecision | {
38
+ error: string;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=run-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-shell.d.ts","sourceRoot":"","sources":["../../../src/tools/run-shell.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,uBAAuB,GACvB,wBAAwB,GACxB,gBAAgB,GAChB,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,aAAa,GACb,gBAAgB,GAChB,mBAAmB,CAAC;AAExB,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAUF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,YAAY,EA+B/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAwB9C,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAcvF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAetF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAEhF;AAgBD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,EACD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA+JrB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,GACA,sBAAsB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA+B5C"}
@@ -0,0 +1,407 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Tools: run_shell_inspect / run_shell_mutate
3
+ // Policy-based shell execution with explicit scope/risk metadata.
4
+ // ---------------------------------------------------------------------------
5
+ import { spawn } from 'node:child_process';
6
+ export const DEFAULT_INSPECT_RULES = [
7
+ inspectRule('ls', 'workspace_listing', 'workspace listing'),
8
+ inspectRule('nl', 'file_inspection', 'numbered file inspection'),
9
+ inspectRule('cat', 'file_inspection', 'file inspection'),
10
+ inspectRule('head', 'file_inspection', 'file inspection'),
11
+ inspectRule('tail', 'file_inspection', 'file inspection'),
12
+ inspectRule('wc', 'file_inspection', 'workspace inspection'),
13
+ inspectRule('grep', 'workspace_search', 'workspace inspection'),
14
+ inspectRule('rg', 'workspace_search', 'workspace inspection'),
15
+ inspectRule('find', 'workspace_search', 'workspace inspection'),
16
+ inspectRule('sed', 'file_inspection', 'workspace inspection'),
17
+ inspectRule('sort', 'structured_inspection', 'workspace inspection'),
18
+ inspectRule('uniq', 'structured_inspection', 'workspace inspection'),
19
+ inspectRule('jq', 'structured_inspection', 'structured output inspection'),
20
+ inspectRule('echo', 'environment_inspection', 'simple shell inspection'),
21
+ inspectRule('pwd', 'environment_inspection', 'workspace location check'),
22
+ inspectRule('which', 'environment_inspection', 'binary discovery'),
23
+ inspectRule('file', 'file_inspection', 'file metadata inspection'),
24
+ inspectRule('tree', 'workspace_listing', 'workspace tree inspection'),
25
+ inspectRule('du', 'environment_inspection', 'workspace disk inspection'),
26
+ inspectRule('df', 'environment_inspection', 'filesystem inspection'),
27
+ inspectRule('git', 'git_inspection', 'git history inspection', ['log']),
28
+ inspectRule('git', 'git_inspection', 'git diff inspection', ['diff']),
29
+ inspectRule('git', 'git_inspection', 'git status inspection', ['status']),
30
+ inspectRule('git', 'git_inspection', 'git object inspection', ['show']),
31
+ inspectRule('git', 'git_inspection', 'git revision inspection', ['rev-parse']),
32
+ inspectRule('git', 'git_inspection', 'git file inventory inspection', ['ls-files']),
33
+ inspectRule('git', 'git_inspection', 'git content search inspection', ['grep']),
34
+ inspectRule('git', 'git_inspection', 'git branch inspection', ['branch']),
35
+ inspectRule('git', 'git_inspection', 'git tag inspection', ['tag']),
36
+ inspectRule('git', 'git_inspection', 'git remote inspection', ['remote']),
37
+ ];
38
+ export const DEFAULT_MUTATE_RULES = [
39
+ workspaceRule('yarn', 'medium', 'dependency', 'workspace dependency install command', ['add']),
40
+ workspaceRule('yarn', 'medium', 'dependency', 'workspace dependency install command', ['install']),
41
+ workspaceRule('yarn', 'medium', 'dependency', 'workspace dependency removal command', ['remove']),
42
+ workspaceRule('yarn', 'low', 'verification', 'workspace verification command', ['test']),
43
+ workspaceRule('yarn', 'low', 'verification', 'workspace verification command', ['build']),
44
+ workspaceRule('yarn', 'low', 'verification', 'workspace verification command', ['lint']),
45
+ workspaceRule('yarn', 'low', 'verification', 'workspace verification command', ['vitest']),
46
+ workspaceRule('vitest', 'low', 'verification', 'workspace verification command'),
47
+ workspaceRule('tsc', 'low', 'verification', 'workspace verification command'),
48
+ workspaceRule('yarn', 'medium', 'project_script', 'workspace project script command', ['run']),
49
+ workspaceRule('yarn', 'medium', 'formatting', 'workspace formatting command', ['format']),
50
+ workspaceRule('yarn', 'medium', 'formatting', 'workspace formatting command', ['prettier']),
51
+ workspaceRule('yarn', 'medium', 'formatting', 'workspace formatting command', ['eslint']),
52
+ workspaceRule('npx', 'medium', 'formatting', 'workspace formatting command', ['prettier', '--write']),
53
+ workspaceRule('npx', 'medium', 'formatting', 'workspace formatting command', ['eslint', '--fix']),
54
+ workspaceRule('prettier', 'medium', 'formatting', 'workspace formatting command', ['--write']),
55
+ workspaceRule('eslint', 'medium', 'formatting', 'workspace formatting command', ['--fix']),
56
+ workspaceRule('mkdir', 'medium', 'file_operation', 'workspace file operation'),
57
+ workspaceRule('touch', 'medium', 'file_operation', 'workspace file operation'),
58
+ workspaceRule('mv', 'medium', 'file_operation', 'workspace file operation'),
59
+ workspaceRule('cp', 'medium', 'file_operation', 'workspace file operation'),
60
+ workspaceRule('git', 'medium', 'git_staging', 'git staging operation', ['add']),
61
+ workspaceRule('git', 'medium', 'file_operation', 'git file move operation', ['mv']),
62
+ ];
63
+ export function createRunShellInspectTool(options = {}) {
64
+ const rules = options.rules ?? DEFAULT_INSPECT_RULES;
65
+ return {
66
+ name: 'run_shell_inspect',
67
+ description: `Run a bounded read-oriented shell command inside the current workspace. Use this for CLI-native inspection, search, diff, and git state checks when mature commands like rg, git, sed, or ls are a better fit than bespoke file tools. Returns structured output with command, exitCode, stdout, stderr, and policy metadata. This tool is governed by low-risk inspect rules, not arbitrary shell access. Use this when the command is clearly read-oriented and likely to fit the inspect policy. If inspect rejects a command because it is arbitrary, uses inline scripts, or needs broader shell expressiveness, retry with run_shell_mutate instead of concluding the command cannot be run. Read-only pipelines with | are allowed for inspection commands, but redirects, command chaining, and subshells are blocked.`,
68
+ parameters: buildParameters(),
69
+ execute: (raw) => runShellCommand(raw, {
70
+ toolName: 'run_shell_inspect',
71
+ rules,
72
+ allowUnknown: false,
73
+ }),
74
+ };
75
+ }
76
+ export function createRunShellMutateTool(options = {}) {
77
+ const rules = options.rules ?? DEFAULT_MUTATE_RULES;
78
+ return {
79
+ name: 'run_shell_mutate',
80
+ requiresApproval: true,
81
+ description: `Run an approval-gated shell command inside the current workspace. Use this when inspection is not enough, when the command is arbitrary or unclassified, when you need inline scripts or broader shell expressiveness, or when run_shell_inspect rejects a still-necessary command. Returns structured output with command, exitCode, stdout, stderr, and policy metadata. This tool is governed by host-side execution rules with explicit risk classification and approval instead of a narrow command allowlist. Arbitrary commands are allowed here through approval; do not assume a command is impossible just because inspect refused it.`,
82
+ parameters: buildParameters(),
83
+ execute: (raw) => runShellCommand(raw, {
84
+ toolName: 'run_shell_mutate',
85
+ rules,
86
+ allowUnknown: true,
87
+ }),
88
+ };
89
+ }
90
+ export function createRunShellTool(options = {}) {
91
+ return createRunShellInspectTool(options);
92
+ }
93
+ function buildParameters() {
94
+ return {
95
+ type: 'object',
96
+ additionalProperties: false,
97
+ properties: {
98
+ command: {
99
+ type: 'string',
100
+ description: 'The shell command to execute',
101
+ },
102
+ },
103
+ required: ['command'],
104
+ };
105
+ }
106
+ export function runShellCommand(raw, options, signal) {
107
+ if (!isRunShellInput(raw)) {
108
+ return Promise.resolve({
109
+ ok: false,
110
+ error: `Invalid input for ${options.toolName}. Required field: command.`,
111
+ });
112
+ }
113
+ const cmd = raw.command.trim();
114
+ const mutateCatastrophicError = getCatastrophicCommandError(cmd, options.toolName);
115
+ if (mutateCatastrophicError) {
116
+ return Promise.resolve({
117
+ ok: false,
118
+ error: mutateCatastrophicError,
119
+ });
120
+ }
121
+ if (containsBlockedShellControlOperators(cmd, options.toolName)) {
122
+ return Promise.resolve({
123
+ ok: false,
124
+ error: 'Command not allowed. Inspect mode permits read-only pipes, but redirects, command chaining, backgrounding, and subshells are blocked. If the command is still needed, retry with run_shell_mutate.',
125
+ });
126
+ }
127
+ const argv = tokenizeCommand(cmd);
128
+ if (argv.length === 0) {
129
+ return Promise.resolve({
130
+ ok: false,
131
+ error: 'Command not allowed. The command must not be empty.',
132
+ });
133
+ }
134
+ const policy = classifyCommand(argv, options.rules, options.allowUnknown);
135
+ if (!policy) {
136
+ return Promise.resolve({
137
+ ok: false,
138
+ error: options.toolName === 'run_shell_inspect' ?
139
+ `Command not allowed by ${options.toolName} policy. This tool only permits bounded read-oriented commands that match its configured workspace risk/scope rules. If the command is still needed, retry with run_shell_mutate.`
140
+ : `Command not allowed by ${options.toolName} policy. This tool only permits bounded commands that match its configured workspace risk/scope rules.`,
141
+ });
142
+ }
143
+ return new Promise((resolve) => {
144
+ let stdout = '';
145
+ let stderr = '';
146
+ let settled = false;
147
+ let timedOut = false;
148
+ let aborted = false;
149
+ const child = spawn(cmd, {
150
+ shell: true,
151
+ stdio: ['ignore', 'pipe', 'pipe'],
152
+ });
153
+ const cleanup = () => {
154
+ clearTimeout(timeoutId);
155
+ if (signal) {
156
+ signal.removeEventListener('abort', onAbort);
157
+ }
158
+ };
159
+ const finish = (result) => {
160
+ if (settled) {
161
+ return;
162
+ }
163
+ settled = true;
164
+ cleanup();
165
+ resolve(result);
166
+ };
167
+ const onAbort = () => {
168
+ aborted = true;
169
+ child.kill('SIGTERM');
170
+ setTimeout(() => {
171
+ if (!child.killed) {
172
+ child.kill('SIGKILL');
173
+ }
174
+ }, 500).unref();
175
+ };
176
+ const timeoutId = setTimeout(() => {
177
+ timedOut = true;
178
+ child.kill('SIGTERM');
179
+ setTimeout(() => {
180
+ if (!child.killed) {
181
+ child.kill('SIGKILL');
182
+ }
183
+ }, 500).unref();
184
+ }, 30_000);
185
+ if (signal?.aborted) {
186
+ onAbort();
187
+ }
188
+ else if (signal) {
189
+ signal.addEventListener('abort', onAbort, { once: true });
190
+ }
191
+ child.stdout?.on('data', (chunk) => {
192
+ stdout += chunk.toString();
193
+ if (stdout.length > 1024 * 1024) {
194
+ stdout = stdout.slice(-1024 * 1024);
195
+ }
196
+ });
197
+ child.stderr?.on('data', (chunk) => {
198
+ stderr += chunk.toString();
199
+ if (stderr.length > 1024 * 1024) {
200
+ stderr = stderr.slice(-1024 * 1024);
201
+ }
202
+ });
203
+ child.on('error', (error) => {
204
+ finish({
205
+ ok: false,
206
+ error: `Shell command failed: ${error.message}`,
207
+ });
208
+ });
209
+ child.on('close', (code) => {
210
+ const output = {
211
+ command: cmd,
212
+ exitCode: code ?? 0,
213
+ stdout: stdout.trim(),
214
+ stderr: stderr.trim(),
215
+ policy,
216
+ };
217
+ if (aborted) {
218
+ finish({
219
+ ok: false,
220
+ error: 'Shell command aborted by host request',
221
+ output,
222
+ });
223
+ return;
224
+ }
225
+ if (timedOut) {
226
+ finish({
227
+ ok: false,
228
+ error: 'Shell command timed out after 30000ms',
229
+ output,
230
+ });
231
+ return;
232
+ }
233
+ if ((code ?? 0) !== 0) {
234
+ finish({
235
+ ok: false,
236
+ error: `Shell command failed with exit code ${output.exitCode}`,
237
+ output,
238
+ });
239
+ return;
240
+ }
241
+ finish({ ok: true, output });
242
+ });
243
+ });
244
+ }
245
+ export function classifyShellCommandPolicy(command, options) {
246
+ const normalized = command.trim();
247
+ if (!normalized) {
248
+ return { error: 'Command not allowed. The command must not be empty.' };
249
+ }
250
+ const mutateCatastrophicError = getCatastrophicCommandError(normalized, options.toolName);
251
+ if (mutateCatastrophicError) {
252
+ return { error: mutateCatastrophicError };
253
+ }
254
+ if (containsBlockedShellControlOperators(normalized, options.toolName)) {
255
+ return {
256
+ error: 'Command not allowed. Inspect mode permits read-only pipes, but redirects, command chaining, backgrounding, and subshells are blocked.',
257
+ };
258
+ }
259
+ const argv = tokenizeCommand(normalized);
260
+ if (argv.length === 0) {
261
+ return { error: 'Command not allowed. The command must not be empty.' };
262
+ }
263
+ const policy = classifyCommand(argv, options.rules, options.allowUnknown);
264
+ if (!policy) {
265
+ return {
266
+ error: `Command not allowed by ${options.toolName} policy. This tool only permits bounded commands that match its configured workspace risk/scope rules.`,
267
+ };
268
+ }
269
+ return policy;
270
+ }
271
+ function classifyCommand(argv, rules, allowUnknown) {
272
+ const binary = argv[0] ?? '';
273
+ const args = argv.slice(1);
274
+ const rule = rules.find((candidate) => {
275
+ if (candidate.binary !== binary) {
276
+ return false;
277
+ }
278
+ if (!candidate.argsPrefix || candidate.argsPrefix.length === 0) {
279
+ return true;
280
+ }
281
+ return candidate.argsPrefix.every((part, index) => args[index] === part);
282
+ });
283
+ if (!rule) {
284
+ if (!allowUnknown) {
285
+ return undefined;
286
+ }
287
+ return {
288
+ binary,
289
+ scope: 'workspace',
290
+ risk: 'unknown',
291
+ capability: 'unknown_workspace',
292
+ reason: 'unclassified workspace command requiring explicit approval',
293
+ };
294
+ }
295
+ return {
296
+ binary: rule.binary,
297
+ scope: rule.scope,
298
+ risk: rule.risk,
299
+ capability: rule.capability,
300
+ reason: rule.reason,
301
+ };
302
+ }
303
+ function tokenizeCommand(command) {
304
+ return command
305
+ .trim()
306
+ .split(/\s+/)
307
+ .filter(Boolean);
308
+ }
309
+ function isRunShellInput(raw) {
310
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
311
+ return false;
312
+ }
313
+ const input = raw;
314
+ return typeof input.command === 'string';
315
+ }
316
+ function containsBlockedShellControlOperators(command, toolName) {
317
+ const inspectMode = toolName === 'run_shell_inspect';
318
+ if (!inspectMode) {
319
+ return false;
320
+ }
321
+ let quote;
322
+ let escaped = false;
323
+ for (let index = 0; index < command.length; index++) {
324
+ const current = command[index] ?? '';
325
+ const next = command[index + 1] ?? '';
326
+ if (escaped) {
327
+ escaped = false;
328
+ continue;
329
+ }
330
+ if (current === '\\') {
331
+ escaped = true;
332
+ continue;
333
+ }
334
+ if (quote) {
335
+ if (current === quote) {
336
+ quote = undefined;
337
+ }
338
+ continue;
339
+ }
340
+ if (current === '"' || current === "'") {
341
+ quote = current;
342
+ continue;
343
+ }
344
+ if (current === '|' && inspectMode && next === '|') {
345
+ return true;
346
+ }
347
+ if (current === '&' && next === '&') {
348
+ return true;
349
+ }
350
+ if (current === ';' || current === '`') {
351
+ return true;
352
+ }
353
+ if (current === '&') {
354
+ return true;
355
+ }
356
+ if (inspectMode && (current === '>' || current === '<')) {
357
+ return true;
358
+ }
359
+ if (current === '$' && next === '(') {
360
+ return true;
361
+ }
362
+ }
363
+ return false;
364
+ }
365
+ function getCatastrophicCommandError(command, toolName) {
366
+ if (toolName !== 'run_shell_mutate') {
367
+ return undefined;
368
+ }
369
+ const normalized = command.trim().toLowerCase().replace(/\s+/g, ' ');
370
+ if (!normalized) {
371
+ return undefined;
372
+ }
373
+ const catastrophicPatterns = [
374
+ /(?:^|[;&|])\s*rm\s+-rf\s+\/$/,
375
+ /(?:^|[;&|])\s*rm\s+-rf\s+\/\s/,
376
+ /(?:^|[;&|])\s*rm\s+-rf\s+~(?:\/|$)/,
377
+ /(?:^|[;&|])\s*rm\s+-rf\s+\$home(?:\/|$)/,
378
+ /(?:^|[;&|])\s*rm\s+-rf\s+"?\/"?(?:\s|$)/,
379
+ /(?:^|[;&|])\s*rm\s+-rf\s+"?~"?(?:\s|$)/,
380
+ /(?:^|[;&|])\s*mkfs(?:\.[^\s]+)?\b/,
381
+ /(?:^|[;&|])\s*dd\b.*\bof=\/dev\//,
382
+ ];
383
+ return catastrophicPatterns.some((pattern) => pattern.test(normalized)) ?
384
+ 'Command not allowed. This command appears catastrophically destructive (home/root/disk-level) and is blocked even in approval-gated mutate mode.'
385
+ : undefined;
386
+ }
387
+ function inspectRule(binary, capability, reason, argsPrefix) {
388
+ return {
389
+ binary,
390
+ argsPrefix,
391
+ scope: 'inspect',
392
+ risk: 'low',
393
+ capability,
394
+ reason,
395
+ };
396
+ }
397
+ function workspaceRule(binary, risk, capability, reason, argsPrefix) {
398
+ return {
399
+ binary,
400
+ argsPrefix,
401
+ scope: 'workspace',
402
+ risk,
403
+ capability,
404
+ reason,
405
+ };
406
+ }
407
+ //# sourceMappingURL=run-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-shell.js","sourceRoot":"","sources":["../../../src/tools/run-shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from '../types.js';
2
+ export declare const DEFAULT_SEARCH_EXCLUDED_DIRS: string[];
3
+ export type SearchFilesOptions = {
4
+ excludedDirs?: string[];
5
+ };
6
+ export declare function createSearchFilesTool(options?: SearchFilesOptions): ToolDefinition;
7
+ export declare const searchFilesTool: ToolDefinition;
8
+ //# sourceMappingURL=search-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-files.d.ts","sourceRoot":"","sources":["../../../src/tools/search-files.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,4BAA4B,UAAuD,CAAC;AAEjG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CA+CtF;AAED,eAAO,MAAM,eAAe,EAAE,cAAwC,CAAC"}
@@ -0,0 +1,86 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Tool: search_files
3
+ // Uses grep — the real human tool, per project philosophy.
4
+ // ---------------------------------------------------------------------------
5
+ import { execSync } from 'node:child_process';
6
+ import { resolve } from 'node:path';
7
+ export const DEFAULT_SEARCH_EXCLUDED_DIRS = ['.git', 'dist', 'node_modules', 'local', '.heddle'];
8
+ export function createSearchFilesTool(options = {}) {
9
+ const excludedDirNames = sanitizeExcludedDirs(options.excludedDirs);
10
+ return {
11
+ name: 'search_files',
12
+ description: 'Search for a text pattern in files using grep. Use this when you need to locate a specific symbol or text string, not when a likely folder or file is already obvious from the workspace structure. Prefer searching for concrete terms such as tool names, symbols, or filenames rather than copying broad question text. Relative paths are resolved from the current working directory and may also point to nearby parent or sibling folders. Returns newline-separated matches in grep-style path:line:content format, or "No matches found.". Ignores generated or state directories like .git, dist, node_modules, local, and .heddle by default, but if you explicitly target one of those directories via path then that path is searched. Example inputs: { "query": "createUser" }, { "query": "incident", "path": "../shared-notes" }',
13
+ parameters: {
14
+ type: 'object',
15
+ additionalProperties: false,
16
+ properties: {
17
+ query: {
18
+ type: 'string',
19
+ description: 'The text pattern to search for',
20
+ },
21
+ path: {
22
+ type: 'string',
23
+ description: 'Directory to search in. Defaults to "."',
24
+ },
25
+ },
26
+ required: ['query'],
27
+ },
28
+ async execute(raw) {
29
+ if (!isSearchFilesInput(raw)) {
30
+ return { ok: false, error: 'Invalid input for search_files. Required field: query. Optional field: path.' };
31
+ }
32
+ const input = raw;
33
+ const dir = resolve(input.path ?? '.');
34
+ const effectiveExcludedDirs = excludedDirNames.filter((name) => !isExplicitlyTargetingExcludedDir(dir, name));
35
+ const excludedDirs = effectiveExcludedDirs.map((name) => `--exclude-dir=${escapeShellArg(name)}`).join(' ');
36
+ try {
37
+ // -r recursive, -n line numbers, -I skip binary, --include common text files
38
+ const output = execSync(`grep -rnI ${excludedDirs} --include='*.ts' --include='*.js' --include='*.json' --include='*.md' --include='*.txt' --include='*.yaml' --include='*.yml' ${escapeShellArg(input.query)} ${escapeShellArg(dir)}`, { encoding: 'utf-8', timeout: 15_000, maxBuffer: 1024 * 1024 });
39
+ return { ok: true, output: output.trim() };
40
+ }
41
+ catch (err) {
42
+ if (err && typeof err === 'object' && 'status' in err && err.status === 1) {
43
+ return { ok: true, output: 'No matches found.' };
44
+ }
45
+ return { ok: false, error: `Search failed: ${err instanceof Error ? err.message : String(err)}` };
46
+ }
47
+ },
48
+ };
49
+ }
50
+ export const searchFilesTool = createSearchFilesTool();
51
+ function isSearchFilesInput(raw) {
52
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
53
+ return false;
54
+ }
55
+ const input = raw;
56
+ const keys = Object.keys(input);
57
+ if (keys.some((key) => key !== 'query' && key !== 'path')) {
58
+ return false;
59
+ }
60
+ if (typeof input.query !== 'string') {
61
+ return false;
62
+ }
63
+ return input.path === undefined || typeof input.path === 'string';
64
+ }
65
+ function escapeShellArg(arg) {
66
+ return `'${arg.replace(/'/g, "'\\''")}'`;
67
+ }
68
+ function sanitizeExcludedDirs(custom) {
69
+ if (!custom || custom.length === 0) {
70
+ return DEFAULT_SEARCH_EXCLUDED_DIRS;
71
+ }
72
+ const normalized = custom
73
+ .map((value) => value.trim())
74
+ .filter(Boolean)
75
+ .map((value) => value.replace(/^\.?\//, '').replace(/\/+$/, ''));
76
+ return normalized.length > 0 ? normalized : DEFAULT_SEARCH_EXCLUDED_DIRS;
77
+ }
78
+ function isExplicitlyTargetingExcludedDir(dir, excludedName) {
79
+ const normalizedExcludedName = excludedName.trim().replace(/^\.?\//, '').replace(/\/+$/, '');
80
+ if (!normalizedExcludedName) {
81
+ return false;
82
+ }
83
+ const segments = dir.split(/[/\\]+/).filter(Boolean);
84
+ return segments.includes(normalizedExcludedName);
85
+ }
86
+ //# sourceMappingURL=search-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-files.js","sourceRoot":"","sources":["../../../src/tools/search-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from '../types.js';
2
+ export type PlanItemStatus = 'pending' | 'in_progress' | 'completed';
3
+ export type PlanItem = {
4
+ step: string;
5
+ status: PlanItemStatus;
6
+ };
7
+ export declare const updatePlanTool: ToolDefinition;
8
+ //# sourceMappingURL=update-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-plan.d.ts","sourceRoot":"","sources":["../../../src/tools/update-plan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAOF,eAAO,MAAM,cAAc,EAAE,cA+C5B,CAAC"}