@qduc/term2 0.1.3 → 0.1.5

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 (375) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +5 -0
  3. package/dist/agent.js.map +1 -1
  4. package/dist/app.d.ts.map +1 -1
  5. package/dist/app.js +2 -2
  6. package/dist/app.js.map +1 -1
  7. package/dist/app.model-command-feedback.test.d.ts +2 -0
  8. package/dist/app.model-command-feedback.test.d.ts.map +1 -0
  9. package/dist/app.model-command-feedback.test.js +19 -0
  10. package/dist/app.model-command-feedback.test.js.map +1 -0
  11. package/dist/cli.js +2 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/components/BottomArea.d.ts +2 -0
  14. package/dist/components/BottomArea.d.ts.map +1 -1
  15. package/dist/components/BottomArea.js +2 -2
  16. package/dist/components/BottomArea.js.map +1 -1
  17. package/dist/components/ChatMessage.js +1 -1
  18. package/dist/components/ChatMessage.js.map +1 -1
  19. package/dist/components/InputBox.js +1 -1
  20. package/dist/components/InputBox.js.map +1 -1
  21. package/dist/components/MarkdownRenderer.js +1 -1
  22. package/dist/components/MarkdownRenderer.js.map +1 -1
  23. package/dist/components/MentorMode.test.d.ts +2 -0
  24. package/dist/components/MentorMode.test.d.ts.map +1 -0
  25. package/dist/components/MentorMode.test.js.map +1 -0
  26. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  27. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
  28. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
  29. package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
  30. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
  31. package/dist/components/ModelSelectionMenu.js +24 -15
  32. package/dist/components/ModelSelectionMenu.js.map +1 -1
  33. package/dist/components/SettingsSelectionMenu.js +1 -1
  34. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  35. package/dist/components/SlashCommandMenu.js +2 -2
  36. package/dist/components/SlashCommandMenu.js.map +1 -1
  37. package/dist/components/StatusBar.d.ts +2 -0
  38. package/dist/components/StatusBar.d.ts.map +1 -1
  39. package/dist/components/StatusBar.js +44 -39
  40. package/dist/components/StatusBar.js.map +1 -1
  41. package/dist/components/StatusBar.test.d.ts +2 -0
  42. package/dist/components/StatusBar.test.d.ts.map +1 -0
  43. package/dist/components/StatusBar.test.js +19 -0
  44. package/dist/components/StatusBar.test.js.map +1 -0
  45. package/dist/components/TextInput.d.ts.map +1 -1
  46. package/dist/components/TextInput.js +1 -2
  47. package/dist/components/TextInput.js.map +1 -1
  48. package/dist/components/TextInput.test.js.map +1 -1
  49. package/dist/debug-schema.d.ts +2 -0
  50. package/dist/debug-schema.d.ts.map +1 -0
  51. package/dist/debug-schema.js +22 -0
  52. package/dist/debug-schema.js.map +1 -0
  53. package/dist/hooks/use-conversation.d.ts +2 -0
  54. package/dist/hooks/use-conversation.d.ts.map +1 -1
  55. package/dist/hooks/use-conversation.js +79 -493
  56. package/dist/hooks/use-conversation.js.map +1 -1
  57. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  58. package/dist/hooks/use-model-selection.js +1 -25
  59. package/dist/hooks/use-model-selection.js.map +1 -1
  60. package/dist/hooks/use-model-selection.test.d.ts +2 -0
  61. package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
  62. package/dist/hooks/use-model-selection.test.js +28 -0
  63. package/dist/hooks/use-model-selection.test.js.map +1 -0
  64. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  65. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  66. package/dist/hooks/use-path-completion.test.js +29 -0
  67. package/dist/hooks/use-path-completion.test.js.map +1 -0
  68. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  69. package/dist/hooks/use-settings-completion.js +2 -0
  70. package/dist/hooks/use-settings-completion.js.map +1 -1
  71. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  72. package/dist/hooks/use-settings-value-completion.js +1 -0
  73. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  74. package/dist/lib/editor-impl.test.d.ts +2 -0
  75. package/dist/lib/editor-impl.test.d.ts.map +1 -0
  76. package/dist/lib/editor-impl.test.js +188 -0
  77. package/dist/lib/editor-impl.test.js.map +1 -0
  78. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  79. package/dist/lib/openai-agent-client.js +12 -4
  80. package/dist/lib/openai-agent-client.js.map +1 -1
  81. package/dist/lib/openai-agent-client.public-methods.test.d.ts +2 -0
  82. package/dist/lib/openai-agent-client.public-methods.test.d.ts.map +1 -0
  83. package/dist/lib/openai-agent-client.public-methods.test.js +188 -0
  84. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -0
  85. package/dist/prompts/default.md.bak +77 -0
  86. package/dist/prompts/simple-mentor.md +0 -8
  87. package/dist/providers/github-copilot/converters.d.ts +45 -0
  88. package/dist/providers/github-copilot/converters.d.ts.map +1 -0
  89. package/dist/providers/github-copilot/converters.js +118 -0
  90. package/dist/providers/github-copilot/converters.js.map +1 -0
  91. package/dist/providers/github-copilot/converters.test.d.ts +2 -0
  92. package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
  93. package/dist/providers/github-copilot/converters.test.js +162 -0
  94. package/dist/providers/github-copilot/converters.test.js.map +1 -0
  95. package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
  96. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
  97. package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
  98. package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
  99. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
  100. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
  101. package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
  102. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
  103. package/dist/providers/github-copilot/index.d.ts +4 -0
  104. package/dist/providers/github-copilot/index.d.ts.map +1 -0
  105. package/dist/providers/github-copilot/index.js +4 -0
  106. package/dist/providers/github-copilot/index.js.map +1 -0
  107. package/dist/providers/github-copilot/model-direct.d.ts +34 -0
  108. package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
  109. package/dist/providers/github-copilot/model-direct.js +443 -0
  110. package/dist/providers/github-copilot/model-direct.js.map +1 -0
  111. package/dist/providers/github-copilot/model.d.ts +24 -0
  112. package/dist/providers/github-copilot/model.d.ts.map +1 -0
  113. package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
  114. package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
  115. package/dist/providers/github-copilot/model.delta.test.js +15 -0
  116. package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
  117. package/dist/providers/github-copilot/model.js +581 -0
  118. package/dist/providers/github-copilot/model.js.map +1 -0
  119. package/dist/providers/github-copilot/provider.d.ts +20 -0
  120. package/dist/providers/github-copilot/provider.d.ts.map +1 -0
  121. package/dist/providers/github-copilot/provider.js +30 -0
  122. package/dist/providers/github-copilot/provider.js.map +1 -0
  123. package/dist/providers/github-copilot/provider.test.d.ts +2 -0
  124. package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
  125. package/dist/providers/github-copilot/provider.test.js +52 -0
  126. package/dist/providers/github-copilot/provider.test.js.map +1 -0
  127. package/dist/providers/github-copilot/utils.d.ts +20 -0
  128. package/dist/providers/github-copilot/utils.d.ts.map +1 -0
  129. package/dist/providers/github-copilot/utils.js +142 -0
  130. package/dist/providers/github-copilot/utils.js.map +1 -0
  131. package/dist/providers/github-copilot/utils.test.d.ts +2 -0
  132. package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
  133. package/dist/providers/github-copilot/utils.test.js +21 -0
  134. package/dist/providers/github-copilot/utils.test.js.map +1 -0
  135. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  136. package/dist/providers/openrouter/converters.d.ts.map +1 -1
  137. package/dist/providers/openrouter/converters.js +64 -46
  138. package/dist/providers/openrouter/converters.js.map +1 -1
  139. package/dist/providers/openrouter/converters.test.js +13 -12
  140. package/dist/providers/openrouter/converters.test.js.map +1 -1
  141. package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
  142. package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
  143. package/dist/providers/openrouter/merge-messages.test.js +83 -0
  144. package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
  145. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  146. package/dist/providers/openrouter.history.test.d.ts +2 -0
  147. package/dist/providers/openrouter.history.test.d.ts.map +1 -0
  148. package/dist/providers/openrouter.history.test.js +533 -0
  149. package/dist/providers/openrouter.history.test.js.map +1 -0
  150. package/dist/providers/openrouter.test.js.map +1 -1
  151. package/dist/reproduce_issue.test.d.ts +2 -0
  152. package/dist/reproduce_issue.test.d.ts.map +1 -0
  153. package/dist/reproduce_issue.test.js +31 -0
  154. package/dist/reproduce_issue.test.js.map +1 -0
  155. package/dist/services/conversation-events.d.ts +3 -0
  156. package/dist/services/conversation-events.d.ts.map +1 -1
  157. package/dist/services/conversation-service.test.js +183 -149
  158. package/dist/services/conversation-session.d.ts +2 -0
  159. package/dist/services/conversation-session.d.ts.map +1 -1
  160. package/dist/services/conversation-session.js +151 -28
  161. package/dist/services/conversation-session.js.map +1 -1
  162. package/dist/services/conversation-session.usage.test.d.ts +2 -0
  163. package/dist/services/conversation-session.usage.test.d.ts.map +1 -0
  164. package/dist/services/conversation-session.usage.test.js +59 -0
  165. package/dist/services/conversation-session.usage.test.js.map +1 -0
  166. package/dist/services/settings-service.d.ts +9 -3
  167. package/dist/services/settings-service.d.ts.map +1 -1
  168. package/dist/services/settings-service.js +14 -0
  169. package/dist/services/settings-service.js.map +1 -1
  170. package/dist/test-search-tool.d.ts +2 -0
  171. package/dist/test-search-tool.d.ts.map +1 -0
  172. package/dist/test-search-tool.js +36 -0
  173. package/dist/test-search-tool.js.map +1 -0
  174. package/dist/tools/edit-healing.d.ts +24 -0
  175. package/dist/tools/edit-healing.d.ts.map +1 -0
  176. package/dist/tools/edit-healing.js +230 -0
  177. package/dist/tools/edit-healing.js.map +1 -0
  178. package/dist/tools/edit-healing.test.d.ts +2 -0
  179. package/dist/tools/edit-healing.test.d.ts.map +1 -0
  180. package/dist/tools/edit-healing.test.js +34 -0
  181. package/dist/tools/edit-healing.test.js.map +1 -0
  182. package/dist/tools/find-files.d.ts +1 -0
  183. package/dist/tools/find-files.d.ts.map +1 -1
  184. package/dist/tools/find-files.js +92 -8
  185. package/dist/tools/find-files.js.map +1 -1
  186. package/dist/tools/find-files.test.js +45 -0
  187. package/dist/tools/find-files.test.js.map +1 -1
  188. package/dist/tools/search-replace.d.ts +2 -0
  189. package/dist/tools/search-replace.d.ts.map +1 -1
  190. package/dist/tools/search-replace.js +207 -23
  191. package/dist/tools/search-replace.js.map +1 -1
  192. package/dist/tools/search-replace.test.js +223 -2
  193. package/dist/tools/search-replace.test.js.map +1 -1
  194. package/dist/tools/web-fetch.d.ts +20 -0
  195. package/dist/tools/web-fetch.d.ts.map +1 -0
  196. package/dist/tools/web-fetch.js +87 -0
  197. package/dist/tools/web-fetch.js.map +1 -0
  198. package/dist/tools/web-fetch.test.d.ts +2 -0
  199. package/dist/tools/web-fetch.test.d.ts.map +1 -0
  200. package/dist/tools/web-fetch.test.js +94 -0
  201. package/dist/tools/web-fetch.test.js.map +1 -0
  202. package/dist/utils/command-safety/index.d.ts +2 -2
  203. package/dist/utils/command-safety/index.d.ts.map +1 -1
  204. package/dist/utils/command-safety/index.js +7 -6
  205. package/dist/utils/command-safety/index.js.map +1 -1
  206. package/dist/utils/command-safety.d.ts.map +1 -1
  207. package/dist/utils/command-safety.find.test.js +19 -21
  208. package/dist/utils/command-safety.find.test.js.map +1 -1
  209. package/dist/utils/command-safety.js +364 -10
  210. package/dist/utils/command-safety.js.map +1 -1
  211. package/dist/utils/conversation-event-handler.d.ts +63 -0
  212. package/dist/utils/conversation-event-handler.d.ts.map +1 -0
  213. package/dist/utils/conversation-event-handler.js +132 -0
  214. package/dist/utils/conversation-event-handler.js.map +1 -0
  215. package/dist/utils/conversation-event-handler.test.d.ts +2 -0
  216. package/dist/utils/conversation-event-handler.test.d.ts.map +1 -0
  217. package/dist/utils/conversation-event-handler.test.js +281 -0
  218. package/dist/utils/conversation-event-handler.test.js.map +1 -0
  219. package/dist/utils/conversation-utils.d.ts +41 -0
  220. package/dist/utils/conversation-utils.d.ts.map +1 -0
  221. package/dist/utils/conversation-utils.js +109 -0
  222. package/dist/utils/conversation-utils.js.map +1 -0
  223. package/dist/utils/conversation-utils.test.d.ts +2 -0
  224. package/dist/utils/conversation-utils.test.d.ts.map +1 -0
  225. package/dist/utils/conversation-utils.test.js +190 -0
  226. package/dist/utils/conversation-utils.test.js.map +1 -0
  227. package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
  228. package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
  229. package/dist/utils/extract-command-messages.repro.test.js +31 -0
  230. package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
  231. package/dist/utils/extract-command-messages.test.js +51 -58
  232. package/dist/utils/ink-render-options.d.ts +9 -0
  233. package/dist/utils/ink-render-options.d.ts.map +1 -0
  234. package/dist/utils/ink-render-options.js +8 -0
  235. package/dist/utils/ink-render-options.js.map +1 -0
  236. package/dist/utils/message-utils.d.ts +17 -0
  237. package/dist/utils/message-utils.d.ts.map +1 -0
  238. package/dist/utils/message-utils.js +52 -0
  239. package/dist/utils/message-utils.js.map +1 -0
  240. package/dist/utils/message-utils.test.d.ts +2 -0
  241. package/dist/utils/message-utils.test.d.ts.map +1 -0
  242. package/dist/utils/message-utils.test.js +48 -0
  243. package/dist/utils/message-utils.test.js.map +1 -0
  244. package/dist/utils/token-usage.d.ts +16 -0
  245. package/dist/utils/token-usage.d.ts.map +1 -0
  246. package/dist/utils/token-usage.js +110 -0
  247. package/dist/utils/token-usage.js.map +1 -0
  248. package/dist/utils/token-usage.test.d.ts +2 -0
  249. package/dist/utils/token-usage.test.d.ts.map +1 -0
  250. package/dist/utils/token-usage.test.js +38 -0
  251. package/dist/utils/token-usage.test.js.map +1 -0
  252. package/dist/utils/trim-tool-output.d.ts +2 -0
  253. package/dist/utils/trim-tool-output.d.ts.map +1 -0
  254. package/dist/utils/trim-tool-output.js +52 -0
  255. package/dist/utils/trim-tool-output.js.map +1 -0
  256. package/package.json +10 -3
  257. package/readme.md +22 -1
  258. package/dist/agent.lite-mode.test.d.ts +0 -2
  259. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  260. package/dist/agent.lite-mode.test.js +0 -39
  261. package/dist/agent.lite-mode.test.js.map +0 -1
  262. package/dist/debug_ask_mentor.d.ts +0 -2
  263. package/dist/debug_ask_mentor.d.ts.map +0 -1
  264. package/dist/debug_ask_mentor.js +0 -73
  265. package/dist/debug_ask_mentor.js.map +0 -1
  266. package/dist/modes/companion/command-index.d.ts +0 -26
  267. package/dist/modes/companion/command-index.d.ts.map +0 -1
  268. package/dist/modes/companion/command-index.js +0 -50
  269. package/dist/modes/companion/command-index.js.map +0 -1
  270. package/dist/modes/companion/command-index.test.d.ts +0 -2
  271. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  272. package/dist/modes/companion/command-index.test.js +0 -86
  273. package/dist/modes/companion/command-index.test.js.map +0 -1
  274. package/dist/modes/companion/companion-app.d.ts +0 -12
  275. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  276. package/dist/modes/companion/companion-app.js +0 -297
  277. package/dist/modes/companion/companion-app.js.map +0 -1
  278. package/dist/modes/companion/companion-session.d.ts +0 -63
  279. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  280. package/dist/modes/companion/companion-session.js +0 -146
  281. package/dist/modes/companion/companion-session.js.map +0 -1
  282. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  283. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  284. package/dist/modes/companion/companion-session.test.js +0 -28
  285. package/dist/modes/companion/companion-session.test.js.map +0 -1
  286. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  287. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  288. package/dist/modes/companion/components/status-bar.js +0 -26
  289. package/dist/modes/companion/components/status-bar.js.map +0 -1
  290. package/dist/modes/companion/context-buffer.d.ts +0 -65
  291. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  292. package/dist/modes/companion/context-buffer.js +0 -156
  293. package/dist/modes/companion/context-buffer.js.map +0 -1
  294. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  295. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  296. package/dist/modes/companion/context-buffer.test.js +0 -154
  297. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  298. package/dist/modes/companion/event-detector.d.ts +0 -46
  299. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  300. package/dist/modes/companion/event-detector.js +0 -169
  301. package/dist/modes/companion/event-detector.js.map +0 -1
  302. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  303. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  304. package/dist/modes/companion/event-detector.test.js +0 -121
  305. package/dist/modes/companion/event-detector.test.js.map +0 -1
  306. package/dist/modes/companion/index.d.ts +0 -33
  307. package/dist/modes/companion/index.d.ts.map +0 -1
  308. package/dist/modes/companion/index.js +0 -21
  309. package/dist/modes/companion/index.js.map +0 -1
  310. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  311. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  312. package/dist/modes/companion/input-key-mapper.js +0 -31
  313. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  314. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  315. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  316. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  317. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  318. package/dist/modes/companion/input-parser.d.ts +0 -53
  319. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  320. package/dist/modes/companion/input-parser.js +0 -114
  321. package/dist/modes/companion/input-parser.js.map +0 -1
  322. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  323. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  324. package/dist/modes/companion/input-parser.test.js +0 -123
  325. package/dist/modes/companion/input-parser.test.js.map +0 -1
  326. package/dist/modes/companion/mode-manager.d.ts +0 -41
  327. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  328. package/dist/modes/companion/mode-manager.js +0 -56
  329. package/dist/modes/companion/mode-manager.js.map +0 -1
  330. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  331. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  332. package/dist/modes/companion/mode-manager.test.js +0 -65
  333. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  334. package/dist/modes/companion/output-classifier.d.ts +0 -15
  335. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  336. package/dist/modes/companion/output-classifier.js +0 -77
  337. package/dist/modes/companion/output-classifier.js.map +0 -1
  338. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  339. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  340. package/dist/modes/companion/output-classifier.test.js +0 -133
  341. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  342. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  343. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  344. package/dist/modes/companion/pty-wrapper.js +0 -143
  345. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  346. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  347. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  348. package/dist/modes/companion/safety-classifier.js +0 -140
  349. package/dist/modes/companion/safety-classifier.js.map +0 -1
  350. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  351. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  352. package/dist/modes/companion/safety-classifier.test.js +0 -151
  353. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  354. package/dist/modes/companion/summarizer.d.ts +0 -24
  355. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  356. package/dist/modes/companion/summarizer.js +0 -132
  357. package/dist/modes/companion/summarizer.js.map +0 -1
  358. package/dist/modes/companion/terminal-history.d.ts +0 -27
  359. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  360. package/dist/modes/companion/terminal-history.js +0 -142
  361. package/dist/modes/companion/terminal-history.js.map +0 -1
  362. package/dist/services/check_mock.d.ts +0 -2
  363. package/dist/services/check_mock.d.ts.map +0 -1
  364. package/dist/services/check_mock.js +0 -22
  365. package/dist/services/check_mock.js.map +0 -1
  366. package/dist/services/conversation-service.test.d.ts +0 -2
  367. package/dist/services/conversation-service.test.d.ts.map +0 -1
  368. package/dist/services/conversation-service.test.js.map +0 -1
  369. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  370. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  371. package/dist/utils/command-safety.devnull.test.js +0 -13
  372. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  373. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  374. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  375. package/dist/utils/extract-command-messages.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety.d.ts","sourceRoot":"","sources":["../../source/utils/command-safety.ts"],"names":[],"mappings":"AAuDA;;;;GAIG;AACH,oBAAY,YAAY;IACpB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,GAAG,QAAQ;CACd;AAyGD;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAyMnE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAyB9D"}
1
+ {"version":3,"file":"command-safety.d.ts","sourceRoot":"","sources":["../../source/utils/command-safety.ts"],"names":[],"mappings":"AAwDA;;;;GAIG;AACH,oBAAY,YAAY;IACpB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,GAAG,QAAQ;CACd;AAgZD;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CA4UnE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAyB9D"}
@@ -134,7 +134,7 @@ test('find - delete flag (RED)', t => {
134
134
  'find ./temp -delete',
135
135
  ];
136
136
  for (const cmd of commands) {
137
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
137
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
138
138
  }
139
139
  });
140
140
  test('find - exec with destructive commands (RED)', t => {
@@ -147,7 +147,7 @@ test('find - exec with destructive commands (RED)', t => {
147
147
  'find . -exec mv {} /tmp \\;',
148
148
  ];
149
149
  for (const cmd of commands) {
150
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
150
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
151
151
  }
152
152
  });
153
153
  test('find - exec with shell commands (RED)', t => {
@@ -158,7 +158,7 @@ test('find - exec with shell commands (RED)', t => {
158
158
  'find . -exec zsh -c "test" {} \\;',
159
159
  ];
160
160
  for (const cmd of commands) {
161
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
161
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
162
162
  }
163
163
  });
164
164
  test('find - exec with shell metacharacters (RED)', t => {
@@ -169,13 +169,13 @@ test('find - exec with shell metacharacters (RED)', t => {
169
169
  'find . -exec test `whoami` \\;',
170
170
  ];
171
171
  for (const cmd of commands) {
172
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
172
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
173
173
  }
174
174
  });
175
175
  test('find - malformed exec (no terminator) (RED)', t => {
176
176
  const commands = ['find . -exec rm {}', 'find . -exec cat'];
177
177
  for (const cmd of commands) {
178
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error for malformed exec`);
178
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED error for malformed exec`);
179
179
  }
180
180
  });
181
181
  test('find - execdir variants (RED)', t => {
@@ -186,7 +186,7 @@ test('find - execdir variants (RED)', t => {
186
186
  'find . -okdir chmod 777 {} \\;',
187
187
  ];
188
188
  for (const cmd of commands) {
189
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
189
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
190
190
  }
191
191
  });
192
192
  // ============================================================================
@@ -194,12 +194,12 @@ test('find - execdir variants (RED)', t => {
194
194
  // ============================================================================
195
195
  test('find - multiple exec flags (RED if any dangerous)', t => {
196
196
  // First safe, second dangerous
197
- t.throws(() => validateCommandSafety('find . -exec echo {} \\; -exec rm {} \\;'), { message: /RED \(forbidden\)/ }, 'Should be RED if any exec is dangerous');
197
+ t.true(validateCommandSafety('find . -exec echo {} \\; -exec rm {} \\;'), 'Should return true if any exec is dangerous');
198
198
  });
199
199
  test('find - exec with plus terminator (RED if dangerous)', t => {
200
200
  const commands = ['find . -exec rm {} +', 'find . -exec rm {} \\+'];
201
201
  for (const cmd of commands) {
202
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
202
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
203
203
  }
204
204
  });
205
205
  test('find - exec with plus terminator (YELLOW if safe)', t => {
@@ -229,7 +229,7 @@ test('find - escaped semicolons (RED if dangerous)', t => {
229
229
  'find . -exec rm {} \\;',
230
230
  ];
231
231
  for (const cmd of commands) {
232
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
232
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
233
233
  }
234
234
  });
235
235
  test('find - directory traversal in paths (RED)', t => {
@@ -238,7 +238,7 @@ test('find - directory traversal in paths (RED)', t => {
238
238
  'find ../../.ssh -type f',
239
239
  ];
240
240
  for (const cmd of commands) {
241
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
241
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
242
242
  }
243
243
  });
244
244
  test('find - home directory searches (RED)', t => {
@@ -248,20 +248,18 @@ test('find - home directory searches (RED)', t => {
248
248
  'find $HOME/.env',
249
249
  ];
250
250
  for (const cmd of commands) {
251
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
251
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
252
252
  }
253
253
  });
254
254
  test('find - empty exec command (RED)', t => {
255
- t.throws(() => validateCommandSafety('find . -exec \\;'), { message: /RED \(forbidden\)/ }, 'Empty exec command should be RED');
255
+ t.true(validateCommandSafety('find . -exec \\;'), 'Empty exec command should return true');
256
256
  });
257
257
  test('find - boolean operators maintain safety classification', t => {
258
258
  // Safe OR safe = GREEN
259
259
  const safe = classifyCommand('find . -name "*.txt" -o -name "*.md"');
260
260
  t.is(safe, SafetyStatus.GREEN);
261
261
  // Safe AND dangerous = RED
262
- t.throws(() => validateCommandSafety('find . -name "*.txt" -delete'), {
263
- message: /RED \(forbidden\)/,
264
- });
262
+ t.true(validateCommandSafety('find . -name "*.txt" -delete'));
265
263
  // NOT operation doesn't change classification
266
264
  const notSafe = classifyCommand('find . ! -name "*.txt"');
267
265
  t.is(notSafe, SafetyStatus.GREEN);
@@ -277,7 +275,7 @@ test('find - interpreter bypasses (RED)', t => {
277
275
  'find . -exec node -e "require(\\"child_process\\").execSync(\\"rm *\\")" {} \\;',
278
276
  ];
279
277
  for (const cmd of commands) {
280
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
278
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
281
279
  }
282
280
  });
283
281
  test('find - meta-executor bypasses (RED)', t => {
@@ -288,7 +286,7 @@ test('find - meta-executor bypasses (RED)', t => {
288
286
  'find . -exec timeout 10 rm {} \\;',
289
287
  ];
290
288
  for (const cmd of commands) {
291
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
289
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
292
290
  }
293
291
  });
294
292
  test('find - more destructive commands (RED)', t => {
@@ -300,11 +298,11 @@ test('find - more destructive commands (RED)', t => {
300
298
  'find . -exec rsync -a {} /backup \\;',
301
299
  ];
302
300
  for (const cmd of commands) {
303
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
301
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
304
302
  }
305
303
  });
306
304
  test('find - executing found files directly (RED)', t => {
307
- t.throws(() => validateCommandSafety('find / -perm -4000 -exec {} \\;'), { message: /RED \(forbidden\)/ }, 'Executing found SUID binaries should be RED');
305
+ t.true(validateCommandSafety('find / -perm -4000 -exec {} \\;'), 'Executing found SUID binaries should return true for RED command');
308
306
  });
309
307
  test('find - inode-based bypass (YELLOW)', t => {
310
308
  const result = classifyCommand('find / -inum 12345');
@@ -325,7 +323,7 @@ test('find - expanded home directory patterns (RED)', t => {
325
323
  'find $USER -name "*.txt"',
326
324
  ];
327
325
  for (const cmd of commands) {
328
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
326
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
329
327
  }
330
328
  });
331
329
  test('find - sensitive dotfiles expanded list (RED)', t => {
@@ -336,7 +334,7 @@ test('find - sensitive dotfiles expanded list (RED)', t => {
336
334
  'find ~/.bash_history',
337
335
  ];
338
336
  for (const cmd of commands) {
339
- t.throws(() => validateCommandSafety(cmd), { message: /RED \(forbidden\)/ }, `"${cmd}" should throw RED error`);
337
+ t.true(validateCommandSafety(cmd), `"${cmd}" should return true for RED command`);
340
338
  }
341
339
  });
342
340
  //# sourceMappingURL=command-safety.find.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety.find.test.js","sourceRoot":"","sources":["../../source/utils/command-safety.find.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-safety.find.test.js","sourceRoot":"","sources":["../../source/utils/command-safety.find.test.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ const ALLOWED_COMMANDS = new Set([
13
13
  'head',
14
14
  'tail',
15
15
  'sed',
16
+ 'find',
16
17
  ]);
17
18
  const BLOCKED_COMMANDS = new Set([
18
19
  // Filesystem
@@ -82,21 +83,274 @@ function extractWordText(word) {
82
83
  }
83
84
  return undefined;
84
85
  }
85
- // 2. PATH ANALYSIS HELPER
86
+ // 2. FIND COMMAND HELPERS
87
+ /**
88
+ * Check if a find command has dangerous execution flags (-exec, -execdir, -ok, -okdir, -delete)
89
+ */
90
+ function hasFindDangerousExecution(args) {
91
+ for (let i = 0; i < args.length; i++) {
92
+ const argText = extractWordText(args[i]);
93
+ if (!argText)
94
+ continue;
95
+ // Check for -delete flag
96
+ if (argText === '-delete') {
97
+ return { dangerous: true, reason: 'find -delete (destructive)' };
98
+ }
99
+ // Check for execution flags
100
+ const execFlags = ['-exec', '-execdir', '-ok', '-okdir'];
101
+ if (!execFlags.includes(argText))
102
+ continue;
103
+ // Found an exec flag - analyze the command it executes
104
+ // Find the terminator (; or +)
105
+ let terminatorIndex = -1;
106
+ for (let j = i + 1; j < args.length; j++) {
107
+ const term = extractWordText(args[j]);
108
+ if (term === ';' ||
109
+ term === '+' ||
110
+ term === '\\;' ||
111
+ term === '\\+') {
112
+ terminatorIndex = j;
113
+ break;
114
+ }
115
+ }
116
+ if (terminatorIndex === -1) {
117
+ // Malformed -exec (no terminator)
118
+ return {
119
+ dangerous: true,
120
+ reason: `find ${argText} without terminator`,
121
+ };
122
+ }
123
+ // Extract the command between exec flag and terminator
124
+ const execArgs = args.slice(i + 1, terminatorIndex);
125
+ // Check for redirects (which indicate shell operations)
126
+ const hasRedirect = execArgs.some((a) => a?.type === 'Redirect');
127
+ if (hasRedirect) {
128
+ return {
129
+ dangerous: true,
130
+ reason: `find ${argText} with shell redirection`,
131
+ };
132
+ }
133
+ const execCommand = execArgs
134
+ .map(a => extractWordText(a))
135
+ .filter(Boolean);
136
+ if (execCommand.length === 0) {
137
+ return {
138
+ dangerous: true,
139
+ reason: `find ${argText} with empty command`,
140
+ };
141
+ }
142
+ const cmdName = execCommand[0];
143
+ if (!cmdName) {
144
+ return {
145
+ dangerous: true,
146
+ reason: `find ${argText} with undefined command`,
147
+ };
148
+ }
149
+ // Check if {} is the command itself (executing found files)
150
+ if (cmdName === '{}') {
151
+ return {
152
+ dangerous: true,
153
+ reason: `find ${argText} {} (executes found files directly)`,
154
+ };
155
+ }
156
+ // Check for destructive commands
157
+ const destructiveCmds = [
158
+ 'rm',
159
+ 'shred',
160
+ 'chmod',
161
+ 'chown',
162
+ 'mv',
163
+ 'dd',
164
+ 'mkfs',
165
+ 'truncate',
166
+ 'tee',
167
+ 'cp',
168
+ 'ln',
169
+ 'install',
170
+ 'rsync',
171
+ ];
172
+ if (destructiveCmds.includes(cmdName)) {
173
+ return {
174
+ dangerous: true,
175
+ reason: `find ${argText} ${cmdName} (destructive)`,
176
+ };
177
+ }
178
+ // Check for dangerous interpreters and meta-executors
179
+ // These can all invoke arbitrary commands or scripts
180
+ const dangerousInterpreters = [
181
+ // Shells
182
+ 'sh',
183
+ 'bash',
184
+ 'zsh',
185
+ 'ksh',
186
+ 'dash',
187
+ 'fish',
188
+ 'tcsh',
189
+ 'csh',
190
+ // Script interpreters
191
+ 'perl',
192
+ 'python',
193
+ 'python2',
194
+ 'python3',
195
+ 'ruby',
196
+ 'node',
197
+ 'nodejs',
198
+ 'php',
199
+ 'lua',
200
+ // Meta-executors that can run commands
201
+ 'env',
202
+ 'xargs',
203
+ 'parallel',
204
+ 'nohup',
205
+ 'nice',
206
+ 'ionice',
207
+ 'timeout',
208
+ 'stdbuf',
209
+ 'script',
210
+ 'expect',
211
+ // Text processors that can execute
212
+ 'awk',
213
+ 'gawk',
214
+ 'mawk',
215
+ 'nawk',
216
+ 'sed',
217
+ 'ed',
218
+ // Editors that can run shell commands
219
+ 'vim',
220
+ 'nvim',
221
+ 'emacs',
222
+ ];
223
+ // Handle both bare names and full paths like /usr/bin/python
224
+ const isDangerousInterpreter = dangerousInterpreters.some(interp => cmdName === interp || cmdName.endsWith(`/${interp}`));
225
+ if (isDangerousInterpreter) {
226
+ return {
227
+ dangerous: true,
228
+ reason: `find ${argText} ${cmdName} (can execute commands)`,
229
+ };
230
+ }
231
+ // Check for shell metacharacters in command
232
+ const fullExecCmd = execCommand.join(' ');
233
+ if (/[|&;$`<>]/.test(fullExecCmd)) {
234
+ return {
235
+ dangerous: true,
236
+ reason: `find ${argText} with shell metacharacters`,
237
+ };
238
+ }
239
+ }
240
+ return { dangerous: false };
241
+ }
242
+ /**
243
+ * Check for suspicious find flags that warrant YELLOW classification
244
+ */
245
+ function hasFindSuspiciousFlags(args) {
246
+ for (const arg of args) {
247
+ const argText = extractWordText(arg);
248
+ if (!argText)
249
+ continue;
250
+ // File output flags
251
+ if (['-fprint', '-fprint0', '-fprintf', '-fls'].some(flag => argText.startsWith(flag))) {
252
+ return {
253
+ suspicious: true,
254
+ reason: `find ${argText} (file output)`,
255
+ };
256
+ }
257
+ // Symlink following
258
+ if (['-L', '-follow', '-H'].includes(argText)) {
259
+ return {
260
+ suspicious: true,
261
+ reason: `find ${argText} (symlink following)`,
262
+ };
263
+ }
264
+ // SUID/SGID permission searches
265
+ if (argText === '-perm') {
266
+ // Check the next argument for dangerous permission patterns
267
+ const nextIdx = args.indexOf(arg) + 1;
268
+ if (nextIdx < args.length) {
269
+ const permValue = extractWordText(args[nextIdx]);
270
+ if (permValue) {
271
+ // Numeric SUID/SGID patterns (e.g., -4000, /6000)
272
+ const hasNumericSuid = /[-\/]?[2467]000/.test(permValue);
273
+ // Symbolic SUID/SGID patterns (e.g., -u+s, /g+s, +s)
274
+ const hasSymbolicSuid = /[ug]?\+s/.test(permValue);
275
+ if (hasNumericSuid || hasSymbolicSuid) {
276
+ return {
277
+ suspicious: true,
278
+ reason: `find -perm ${permValue} (SUID/SGID search)`,
279
+ };
280
+ }
281
+ }
282
+ }
283
+ }
284
+ // Inode-based searches (can bypass path restrictions)
285
+ if (argText === '-inum') {
286
+ return {
287
+ suspicious: true,
288
+ reason: 'find -inum (inode-based access bypasses path checks)',
289
+ };
290
+ }
291
+ // Read-only exec (still suspicious, requires approval)
292
+ if (['-exec', '-execdir', '-ok', '-okdir'].includes(argText)) {
293
+ // If we reach here, hasFindDangerousExecution already passed (not RED)
294
+ // but any -exec usage should still be YELLOW
295
+ return {
296
+ suspicious: true,
297
+ reason: `find ${argText} (command execution)`,
298
+ };
299
+ }
300
+ }
301
+ return { suspicious: false };
302
+ }
303
+ // 3. PATH ANALYSIS HELPER
86
304
  function analyzePathRisk(inputPath) {
87
305
  const candidate = inputPath?.trim();
88
306
  if (!candidate)
89
307
  return SafetyStatus.GREEN;
90
- // RED: Explicit home-dotfiles (.ssh, .env, etc.) even before expansion
91
- if (candidate.startsWith('~') ||
92
- candidate.startsWith('$HOME') ||
93
- candidate.startsWith('${HOME}')) {
94
- const sliced = candidate.replace(/^~/, '').replace(/^\$\{?HOME\}?/, '');
95
- // Check for dotfiles after home prefix
308
+ // RED: Home directory and sensitive paths
309
+ // Check for various home directory representations
310
+ const homePatterns = [
311
+ /^~/, // Tilde
312
+ /^\$HOME/, // $HOME variable
313
+ /^\$\{HOME\}/, // ${HOME} variable
314
+ /^\$USER/, // $USER variable
315
+ /^\$LOGNAME/, // $LOGNAME variable
316
+ /^\$XDG_/, // XDG variables
317
+ /^\/home\//, // Linux home directories
318
+ /^\/Users\//, // macOS home directories
319
+ /^\/root($|\/)/, // Root's home
320
+ ];
321
+ const isHomeRelated = homePatterns.some(pattern => pattern.test(candidate));
322
+ if (isHomeRelated) {
323
+ // Extract the path after home prefix for further analysis
324
+ const sliced = candidate
325
+ .replace(/^~/, '')
326
+ .replace(/^\$\{?HOME\}?/, '')
327
+ .replace(/^\$\{?USER\}?/, '')
328
+ .replace(/^\$\{?LOGNAME\}?/, '')
329
+ .replace(/^\/home\/[^/]+/, '')
330
+ .replace(/^\/Users\/[^/]+/, '')
331
+ .replace(/^\/root/, '');
332
+ // Plain home directory access without any suffix is RED
333
+ if (sliced === '' || sliced === '/') {
334
+ loggingService.security('Path risk: home directory access', {
335
+ path: candidate,
336
+ });
337
+ return SafetyStatus.RED;
338
+ }
339
+ // Check for sensitive dotfiles and directories
340
+ const sensitivePaths = [
341
+ '/.ssh',
342
+ '/.gnupg',
343
+ '/.aws',
344
+ '/.kube',
345
+ '/.env',
346
+ '/.git',
347
+ '/.config',
348
+ '/.bash_history',
349
+ '/.zsh_history',
350
+ ];
96
351
  if (/^\/\.\w+/.test(sliced) ||
97
- sliced.includes('/.ssh') ||
98
- sliced.includes('/.env')) {
99
- loggingService.security('Path risk: home dotfile', {
352
+ sensitivePaths.some(sensitive => sliced.includes(sensitive))) {
353
+ loggingService.security('Path risk: home dotfile or config', {
100
354
  path: candidate,
101
355
  });
102
356
  return SafetyStatus.RED;
@@ -200,6 +454,106 @@ export function classifyCommand(commandString) {
200
454
  }
201
455
  }
202
456
  const cmdName = typeof name === 'string' ? name : undefined;
457
+ // Special handling for find command
458
+ if (cmdName === 'find' && node.suffix) {
459
+ // Check for dangerous find operations first (RED)
460
+ const dangerResult = hasFindDangerousExecution(node.suffix);
461
+ if (dangerResult.dangerous) {
462
+ upgradeStatus(SafetyStatus.RED, dangerResult.reason || 'find with dangerous flags');
463
+ }
464
+ // Check for suspicious find flags (YELLOW)
465
+ if (!dangerResult.dangerous) {
466
+ const suspiciousResult = hasFindSuspiciousFlags(node.suffix);
467
+ if (suspiciousResult.suspicious) {
468
+ upgradeStatus(SafetyStatus.YELLOW, suspiciousResult.reason ||
469
+ 'find with suspicious flags');
470
+ }
471
+ }
472
+ // Check path arguments for find
473
+ if (!dangerResult.dangerous) {
474
+ // Track if previous arg was a pattern flag like -name, -regex
475
+ let previousArgWasPatternFlag = false;
476
+ for (const arg of node.suffix) {
477
+ if (arg?.type === 'Redirect')
478
+ continue;
479
+ const argText = extractWordText(arg);
480
+ if (!argText)
481
+ continue;
482
+ // Track pattern flags
483
+ if ([
484
+ '-name',
485
+ '-iname',
486
+ '-path',
487
+ '-ipath',
488
+ '-regex',
489
+ '-iregex',
490
+ ].includes(argText)) {
491
+ previousArgWasPatternFlag = true;
492
+ continue;
493
+ }
494
+ // Skip flags
495
+ if (argText.startsWith('-')) {
496
+ previousArgWasPatternFlag = false;
497
+ continue;
498
+ }
499
+ // Skip pattern arguments (the values after -name, -regex, etc.)
500
+ if (previousArgWasPatternFlag) {
501
+ previousArgWasPatternFlag = false;
502
+ continue;
503
+ }
504
+ // Skip glob patterns (contain wildcards)
505
+ if (/[*?[\]]/.test(argText))
506
+ continue;
507
+ // Skip safe relative paths (. and ./)
508
+ if (argText === '.' || argText === './')
509
+ continue;
510
+ // Skip patterns with backslashes (regex patterns)
511
+ if (argText.includes('\\'))
512
+ continue;
513
+ // Root traversal detection (DoS + information disclosure)
514
+ if (argText === '/' || argText === '//') {
515
+ upgradeStatus(SafetyStatus.YELLOW, 'find / (root traversal - resource intensive)');
516
+ continue;
517
+ }
518
+ // For find, analyzing paths is more lenient:
519
+ // - System paths like /etc are YELLOW (not RED)
520
+ // - Home directories and dotfiles are still RED
521
+ const pathStatus = analyzePathRisk(argText);
522
+ if (pathStatus === SafetyStatus.RED) {
523
+ // Keep RED for home directories, dotfiles, and traversal
524
+ // Downgrade system paths to YELLOW
525
+ const homeRelatedPatterns = [
526
+ /^~/, // Tilde
527
+ /^\$/, // Variables like $HOME, $USER
528
+ /^\/home\//, // Linux home
529
+ /^\/Users\//, // macOS home
530
+ /^\/root/, // Root's home
531
+ /\/\.ssh/, // SSH keys
532
+ /\/\.env/, // Environment files
533
+ /\/\.git/, // Git config
534
+ /\/\.aws/, // AWS credentials
535
+ /\/\.kube/, // Kubernetes config
536
+ /\/\.gnupg/, // GPG keys
537
+ /\.\./, // Directory traversal
538
+ ];
539
+ const isHomeRelated = homeRelatedPatterns.some(pattern => pattern.test(argText));
540
+ if (isHomeRelated) {
541
+ upgradeStatus(SafetyStatus.RED, `find dangerous path: ${argText}`);
542
+ }
543
+ else {
544
+ // System paths like /etc get downgraded to YELLOW
545
+ upgradeStatus(SafetyStatus.YELLOW, `find system path: ${argText}`);
546
+ }
547
+ }
548
+ else if (pathStatus === SafetyStatus.YELLOW) {
549
+ upgradeStatus(pathStatus, `find path argument ${argText}`);
550
+ }
551
+ }
552
+ }
553
+ // Done with find-specific handling
554
+ // Don't process suffix generically
555
+ return;
556
+ }
203
557
  if (node.suffix) {
204
558
  let hasOutputRedirect = false;
205
559
  let hasInPlaceEdit = false;