@aria-cli/tools 1.0.9 → 1.0.10

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 (588) hide show
  1. package/package.json +8 -5
  2. package/dist-cjs/.tsbuildinfo +0 -1
  3. package/dist-cjs/ask-user-interaction.d.ts +0 -10
  4. package/dist-cjs/ask-user-interaction.js +0 -28
  5. package/dist-cjs/ask-user-interaction.js.map +0 -1
  6. package/dist-cjs/cache/web-cache.d.ts +0 -52
  7. package/dist-cjs/cache/web-cache.js +0 -71
  8. package/dist-cjs/cache/web-cache.js.map +0 -1
  9. package/dist-cjs/definitions/arion.d.ts +0 -8
  10. package/dist-cjs/definitions/arion.js +0 -108
  11. package/dist-cjs/definitions/arion.js.map +0 -1
  12. package/dist-cjs/definitions/browser/browser.d.ts +0 -2
  13. package/dist-cjs/definitions/browser/browser.js +0 -422
  14. package/dist-cjs/definitions/browser/browser.js.map +0 -1
  15. package/dist-cjs/definitions/browser/index.d.ts +0 -1
  16. package/dist-cjs/definitions/browser/index.js +0 -9
  17. package/dist-cjs/definitions/browser/index.js.map +0 -1
  18. package/dist-cjs/definitions/browser/pw-downloads.d.ts +0 -13
  19. package/dist-cjs/definitions/browser/pw-downloads.js +0 -118
  20. package/dist-cjs/definitions/browser/pw-downloads.js.map +0 -1
  21. package/dist-cjs/definitions/browser/pw-interactions.d.ts +0 -78
  22. package/dist-cjs/definitions/browser/pw-interactions.js +0 -214
  23. package/dist-cjs/definitions/browser/pw-interactions.js.map +0 -1
  24. package/dist-cjs/definitions/browser/pw-responses.d.ts +0 -28
  25. package/dist-cjs/definitions/browser/pw-responses.js +0 -85
  26. package/dist-cjs/definitions/browser/pw-responses.js.map +0 -1
  27. package/dist-cjs/definitions/browser/pw-session.d.ts +0 -65
  28. package/dist-cjs/definitions/browser/pw-session.js +0 -327
  29. package/dist-cjs/definitions/browser/pw-session.js.map +0 -1
  30. package/dist-cjs/definitions/browser/pw-shared.d.ts +0 -22
  31. package/dist-cjs/definitions/browser/pw-shared.js +0 -73
  32. package/dist-cjs/definitions/browser/pw-shared.js.map +0 -1
  33. package/dist-cjs/definitions/browser/pw-snapshot.d.ts +0 -34
  34. package/dist-cjs/definitions/browser/pw-snapshot.js +0 -308
  35. package/dist-cjs/definitions/browser/pw-snapshot.js.map +0 -1
  36. package/dist-cjs/definitions/browser/pw-state.d.ts +0 -22
  37. package/dist-cjs/definitions/browser/pw-state.js +0 -71
  38. package/dist-cjs/definitions/browser/pw-state.js.map +0 -1
  39. package/dist-cjs/definitions/browser/types.d.ts +0 -277
  40. package/dist-cjs/definitions/browser/types.js +0 -6
  41. package/dist-cjs/definitions/browser/types.js.map +0 -1
  42. package/dist-cjs/definitions/code-intelligence.d.ts +0 -8
  43. package/dist-cjs/definitions/code-intelligence.js +0 -474
  44. package/dist-cjs/definitions/code-intelligence.js.map +0 -1
  45. package/dist-cjs/definitions/core.d.ts +0 -47
  46. package/dist-cjs/definitions/core.js +0 -134
  47. package/dist-cjs/definitions/core.js.map +0 -1
  48. package/dist-cjs/definitions/delegation.d.ts +0 -11
  49. package/dist-cjs/definitions/delegation.js +0 -516
  50. package/dist-cjs/definitions/delegation.js.map +0 -1
  51. package/dist-cjs/definitions/deploy.d.ts +0 -15
  52. package/dist-cjs/definitions/deploy.js +0 -69
  53. package/dist-cjs/definitions/deploy.js.map +0 -1
  54. package/dist-cjs/definitions/filesystem.d.ts +0 -9
  55. package/dist-cjs/definitions/filesystem.js +0 -200
  56. package/dist-cjs/definitions/filesystem.js.map +0 -1
  57. package/dist-cjs/definitions/frg.d.ts +0 -3
  58. package/dist-cjs/definitions/frg.js +0 -67
  59. package/dist-cjs/definitions/frg.js.map +0 -1
  60. package/dist-cjs/definitions/index.d.ts +0 -19
  61. package/dist-cjs/definitions/index.js +0 -44
  62. package/dist-cjs/definitions/index.js.map +0 -1
  63. package/dist-cjs/definitions/memory.d.ts +0 -8
  64. package/dist-cjs/definitions/memory.js +0 -127
  65. package/dist-cjs/definitions/memory.js.map +0 -1
  66. package/dist-cjs/definitions/messaging.d.ts +0 -11
  67. package/dist-cjs/definitions/messaging.js +0 -632
  68. package/dist-cjs/definitions/messaging.js.map +0 -1
  69. package/dist-cjs/definitions/meta.d.ts +0 -11
  70. package/dist-cjs/definitions/meta.js +0 -353
  71. package/dist-cjs/definitions/meta.js.map +0 -1
  72. package/dist-cjs/definitions/network.d.ts +0 -11
  73. package/dist-cjs/definitions/network.js +0 -163
  74. package/dist-cjs/definitions/network.js.map +0 -1
  75. package/dist-cjs/definitions/outlook.d.ts +0 -2
  76. package/dist-cjs/definitions/outlook.js +0 -281
  77. package/dist-cjs/definitions/outlook.js.map +0 -1
  78. package/dist-cjs/definitions/patch/apply-patch.d.ts +0 -11
  79. package/dist-cjs/definitions/patch/apply-patch.js +0 -192
  80. package/dist-cjs/definitions/patch/apply-patch.js.map +0 -1
  81. package/dist-cjs/definitions/patch/fuzzy-match.d.ts +0 -10
  82. package/dist-cjs/definitions/patch/fuzzy-match.js +0 -173
  83. package/dist-cjs/definitions/patch/fuzzy-match.js.map +0 -1
  84. package/dist-cjs/definitions/patch/index.d.ts +0 -1
  85. package/dist-cjs/definitions/patch/index.js +0 -6
  86. package/dist-cjs/definitions/patch/index.js.map +0 -1
  87. package/dist-cjs/definitions/patch/patch-parser.d.ts +0 -50
  88. package/dist-cjs/definitions/patch/patch-parser.js +0 -216
  89. package/dist-cjs/definitions/patch/patch-parser.js.map +0 -1
  90. package/dist-cjs/definitions/patch/sandbox-paths.d.ts +0 -18
  91. package/dist-cjs/definitions/patch/sandbox-paths.js +0 -114
  92. package/dist-cjs/definitions/patch/sandbox-paths.js.map +0 -1
  93. package/dist-cjs/definitions/process/index.d.ts +0 -1
  94. package/dist-cjs/definitions/process/index.js +0 -9
  95. package/dist-cjs/definitions/process/index.js.map +0 -1
  96. package/dist-cjs/definitions/process/process-registry.d.ts +0 -67
  97. package/dist-cjs/definitions/process/process-registry.js +0 -232
  98. package/dist-cjs/definitions/process/process-registry.js.map +0 -1
  99. package/dist-cjs/definitions/process/process.d.ts +0 -9
  100. package/dist-cjs/definitions/process/process.js +0 -390
  101. package/dist-cjs/definitions/process/process.js.map +0 -1
  102. package/dist-cjs/definitions/process/pty-keys.d.ts +0 -13
  103. package/dist-cjs/definitions/process/pty-keys.js +0 -260
  104. package/dist-cjs/definitions/process/pty-keys.js.map +0 -1
  105. package/dist-cjs/definitions/process/session-slug.d.ts +0 -1
  106. package/dist-cjs/definitions/process/session-slug.js +0 -146
  107. package/dist-cjs/definitions/process/session-slug.js.map +0 -1
  108. package/dist-cjs/definitions/quip.d.ts +0 -2
  109. package/dist-cjs/definitions/quip.js +0 -199
  110. package/dist-cjs/definitions/quip.js.map +0 -1
  111. package/dist-cjs/definitions/search.d.ts +0 -9
  112. package/dist-cjs/definitions/search.js +0 -64
  113. package/dist-cjs/definitions/search.js.map +0 -1
  114. package/dist-cjs/definitions/session-history.d.ts +0 -11
  115. package/dist-cjs/definitions/session-history.js +0 -73
  116. package/dist-cjs/definitions/session-history.js.map +0 -1
  117. package/dist-cjs/definitions/shell.d.ts +0 -8
  118. package/dist-cjs/definitions/shell.js +0 -185
  119. package/dist-cjs/definitions/shell.js.map +0 -1
  120. package/dist-cjs/definitions/slack.d.ts +0 -2
  121. package/dist-cjs/definitions/slack.js +0 -184
  122. package/dist-cjs/definitions/slack.js.map +0 -1
  123. package/dist-cjs/definitions/web.d.ts +0 -8
  124. package/dist-cjs/definitions/web.js +0 -113
  125. package/dist-cjs/definitions/web.js.map +0 -1
  126. package/dist-cjs/executors/apply-patch.d.ts +0 -51
  127. package/dist-cjs/executors/apply-patch.js +0 -939
  128. package/dist-cjs/executors/apply-patch.js.map +0 -1
  129. package/dist-cjs/executors/arion.d.ts +0 -50
  130. package/dist-cjs/executors/arion.js +0 -126
  131. package/dist-cjs/executors/arion.js.map +0 -1
  132. package/dist-cjs/executors/code-intelligence.d.ts +0 -138
  133. package/dist-cjs/executors/code-intelligence.js +0 -926
  134. package/dist-cjs/executors/code-intelligence.js.map +0 -1
  135. package/dist-cjs/executors/deploy.d.ts +0 -169
  136. package/dist-cjs/executors/deploy.js +0 -870
  137. package/dist-cjs/executors/deploy.js.map +0 -1
  138. package/dist-cjs/executors/filesystem.d.ts +0 -150
  139. package/dist-cjs/executors/filesystem.js +0 -1168
  140. package/dist-cjs/executors/filesystem.js.map +0 -1
  141. package/dist-cjs/executors/frg-freshness.d.ts +0 -93
  142. package/dist-cjs/executors/frg-freshness.js +0 -628
  143. package/dist-cjs/executors/frg-freshness.js.map +0 -1
  144. package/dist-cjs/executors/frg.d.ts +0 -27
  145. package/dist-cjs/executors/frg.js +0 -335
  146. package/dist-cjs/executors/frg.js.map +0 -1
  147. package/dist-cjs/executors/index.d.ts +0 -44
  148. package/dist-cjs/executors/index.js +0 -144
  149. package/dist-cjs/executors/index.js.map +0 -1
  150. package/dist-cjs/executors/learning-meta.d.ts +0 -87
  151. package/dist-cjs/executors/learning-meta.js +0 -1166
  152. package/dist-cjs/executors/learning-meta.js.map +0 -1
  153. package/dist-cjs/executors/lsp-client.d.ts +0 -38
  154. package/dist-cjs/executors/lsp-client.js +0 -311
  155. package/dist-cjs/executors/lsp-client.js.map +0 -1
  156. package/dist-cjs/executors/memory.d.ts +0 -203
  157. package/dist-cjs/executors/memory.js +0 -797
  158. package/dist-cjs/executors/memory.js.map +0 -1
  159. package/dist-cjs/executors/meta.d.ts +0 -73
  160. package/dist-cjs/executors/meta.js +0 -227
  161. package/dist-cjs/executors/meta.js.map +0 -1
  162. package/dist-cjs/executors/process-registry.d.ts +0 -98
  163. package/dist-cjs/executors/process-registry.js +0 -470
  164. package/dist-cjs/executors/process-registry.js.map +0 -1
  165. package/dist-cjs/executors/pty-session-store.d.ts +0 -14
  166. package/dist-cjs/executors/pty-session-store.js +0 -35
  167. package/dist-cjs/executors/pty-session-store.js.map +0 -1
  168. package/dist-cjs/executors/pty.d.ts +0 -133
  169. package/dist-cjs/executors/pty.js +0 -313
  170. package/dist-cjs/executors/pty.js.map +0 -1
  171. package/dist-cjs/executors/restart.d.ts +0 -13
  172. package/dist-cjs/executors/restart.js +0 -156
  173. package/dist-cjs/executors/restart.js.map +0 -1
  174. package/dist-cjs/executors/search-freshness.d.ts +0 -50
  175. package/dist-cjs/executors/search-freshness.js +0 -235
  176. package/dist-cjs/executors/search-freshness.js.map +0 -1
  177. package/dist-cjs/executors/search-types.d.ts +0 -52
  178. package/dist-cjs/executors/search-types.js +0 -57
  179. package/dist-cjs/executors/search-types.js.map +0 -1
  180. package/dist-cjs/executors/search.d.ts +0 -11
  181. package/dist-cjs/executors/search.js +0 -103
  182. package/dist-cjs/executors/search.js.map +0 -1
  183. package/dist-cjs/executors/self-diagnose.d.ts +0 -89
  184. package/dist-cjs/executors/self-diagnose.js +0 -435
  185. package/dist-cjs/executors/self-diagnose.js.map +0 -1
  186. package/dist-cjs/executors/session-history.d.ts +0 -75
  187. package/dist-cjs/executors/session-history.js +0 -321
  188. package/dist-cjs/executors/session-history.js.map +0 -1
  189. package/dist-cjs/executors/shell-safety.d.ts +0 -27
  190. package/dist-cjs/executors/shell-safety.js +0 -479
  191. package/dist-cjs/executors/shell-safety.js.map +0 -1
  192. package/dist-cjs/executors/shell.d.ts +0 -168
  193. package/dist-cjs/executors/shell.js +0 -1002
  194. package/dist-cjs/executors/shell.js.map +0 -1
  195. package/dist-cjs/executors/utils.d.ts +0 -20
  196. package/dist-cjs/executors/utils.js +0 -74
  197. package/dist-cjs/executors/utils.js.map +0 -1
  198. package/dist-cjs/executors/web.d.ts +0 -89
  199. package/dist-cjs/executors/web.js +0 -548
  200. package/dist-cjs/executors/web.js.map +0 -1
  201. package/dist-cjs/extraction/content-extraction.d.ts +0 -48
  202. package/dist-cjs/extraction/content-extraction.js +0 -244
  203. package/dist-cjs/extraction/content-extraction.js.map +0 -1
  204. package/dist-cjs/extraction/index.d.ts +0 -4
  205. package/dist-cjs/extraction/index.js +0 -9
  206. package/dist-cjs/extraction/index.js.map +0 -1
  207. package/dist-cjs/headless-control-contract.d.ts +0 -3182
  208. package/dist-cjs/headless-control-contract.js +0 -973
  209. package/dist-cjs/headless-control-contract.js.map +0 -1
  210. package/dist-cjs/index.d.ts +0 -62
  211. package/dist-cjs/index.js +0 -438
  212. package/dist-cjs/index.js.map +0 -1
  213. package/dist-cjs/local-control-http-auth.d.ts +0 -2
  214. package/dist-cjs/local-control-http-auth.js +0 -6
  215. package/dist-cjs/local-control-http-auth.js.map +0 -1
  216. package/dist-cjs/mcp/client.d.ts +0 -68
  217. package/dist-cjs/mcp/client.js +0 -186
  218. package/dist-cjs/mcp/client.js.map +0 -1
  219. package/dist-cjs/mcp/connection.d.ts +0 -54
  220. package/dist-cjs/mcp/connection.js +0 -485
  221. package/dist-cjs/mcp/connection.js.map +0 -1
  222. package/dist-cjs/mcp/index.d.ts +0 -10
  223. package/dist-cjs/mcp/index.js +0 -31
  224. package/dist-cjs/mcp/index.js.map +0 -1
  225. package/dist-cjs/mcp/jsonrpc.d.ts +0 -36
  226. package/dist-cjs/mcp/jsonrpc.js +0 -149
  227. package/dist-cjs/mcp/jsonrpc.js.map +0 -1
  228. package/dist-cjs/mcp/types.d.ts +0 -178
  229. package/dist-cjs/mcp/types.js +0 -9
  230. package/dist-cjs/mcp/types.js.map +0 -1
  231. package/dist-cjs/network-control-adapter.d.ts +0 -4
  232. package/dist-cjs/network-control-adapter.js +0 -78
  233. package/dist-cjs/network-control-adapter.js.map +0 -1
  234. package/dist-cjs/network-runtime/address-types.d.ts +0 -201
  235. package/dist-cjs/network-runtime/address-types.js +0 -169
  236. package/dist-cjs/network-runtime/address-types.js.map +0 -1
  237. package/dist-cjs/network-runtime/db-owner-fencing.d.ts +0 -43
  238. package/dist-cjs/network-runtime/db-owner-fencing.js +0 -77
  239. package/dist-cjs/network-runtime/db-owner-fencing.js.map +0 -1
  240. package/dist-cjs/network-runtime/delivery-receipts.d.ts +0 -117
  241. package/dist-cjs/network-runtime/delivery-receipts.js +0 -277
  242. package/dist-cjs/network-runtime/delivery-receipts.js.map +0 -1
  243. package/dist-cjs/network-runtime/direct-endpoint-authority.d.ts +0 -8
  244. package/dist-cjs/network-runtime/direct-endpoint-authority.js +0 -30
  245. package/dist-cjs/network-runtime/direct-endpoint-authority.js.map +0 -1
  246. package/dist-cjs/network-runtime/index.d.ts +0 -24
  247. package/dist-cjs/network-runtime/index.js +0 -173
  248. package/dist-cjs/network-runtime/index.js.map +0 -1
  249. package/dist-cjs/network-runtime/local-control-contract.d.ts +0 -758
  250. package/dist-cjs/network-runtime/local-control-contract.js +0 -634
  251. package/dist-cjs/network-runtime/local-control-contract.js.map +0 -1
  252. package/dist-cjs/network-runtime/node-store-contract.d.ts +0 -49
  253. package/dist-cjs/network-runtime/node-store-contract.js +0 -39
  254. package/dist-cjs/network-runtime/node-store-contract.js.map +0 -1
  255. package/dist-cjs/network-runtime/pair-route-contract.d.ts +0 -100
  256. package/dist-cjs/network-runtime/pair-route-contract.js +0 -81
  257. package/dist-cjs/network-runtime/pair-route-contract.js.map +0 -1
  258. package/dist-cjs/network-runtime/peer-capabilities.d.ts +0 -10
  259. package/dist-cjs/network-runtime/peer-capabilities.js +0 -38
  260. package/dist-cjs/network-runtime/peer-capabilities.js.map +0 -1
  261. package/dist-cjs/network-runtime/peer-principal-ref.d.ts +0 -9
  262. package/dist-cjs/network-runtime/peer-principal-ref.js +0 -16
  263. package/dist-cjs/network-runtime/peer-principal-ref.js.map +0 -1
  264. package/dist-cjs/network-runtime/peer-state-machine.d.ts +0 -70
  265. package/dist-cjs/network-runtime/peer-state-machine.js +0 -130
  266. package/dist-cjs/network-runtime/peer-state-machine.js.map +0 -1
  267. package/dist-cjs/network-runtime/protocol-schemas.d.ts +0 -328
  268. package/dist-cjs/network-runtime/protocol-schemas.js +0 -213
  269. package/dist-cjs/network-runtime/protocol-schemas.js.map +0 -1
  270. package/dist-cjs/network-runtime/runtime-bootstrap-contract.d.ts +0 -81
  271. package/dist-cjs/network-runtime/runtime-bootstrap-contract.js +0 -64
  272. package/dist-cjs/network-runtime/runtime-bootstrap-contract.js.map +0 -1
  273. package/dist-cjs/outlook/desktop-session.d.ts +0 -68
  274. package/dist-cjs/outlook/desktop-session.js +0 -319
  275. package/dist-cjs/outlook/desktop-session.js.map +0 -1
  276. package/dist-cjs/package.json +0 -3
  277. package/dist-cjs/policy.d.ts +0 -43
  278. package/dist-cjs/policy.js +0 -156
  279. package/dist-cjs/policy.js.map +0 -1
  280. package/dist-cjs/providers/brave.d.ts +0 -10
  281. package/dist-cjs/providers/brave.js +0 -67
  282. package/dist-cjs/providers/brave.js.map +0 -1
  283. package/dist-cjs/providers/duckduckgo.d.ts +0 -18
  284. package/dist-cjs/providers/duckduckgo.js +0 -181
  285. package/dist-cjs/providers/duckduckgo.js.map +0 -1
  286. package/dist-cjs/providers/exa.d.ts +0 -10
  287. package/dist-cjs/providers/exa.js +0 -68
  288. package/dist-cjs/providers/exa.js.map +0 -1
  289. package/dist-cjs/providers/firecrawl.d.ts +0 -10
  290. package/dist-cjs/providers/firecrawl.js +0 -60
  291. package/dist-cjs/providers/firecrawl.js.map +0 -1
  292. package/dist-cjs/providers/index.d.ts +0 -8
  293. package/dist-cjs/providers/index.js +0 -18
  294. package/dist-cjs/providers/index.js.map +0 -1
  295. package/dist-cjs/providers/jina.d.ts +0 -10
  296. package/dist-cjs/providers/jina.js +0 -54
  297. package/dist-cjs/providers/jina.js.map +0 -1
  298. package/dist-cjs/providers/router.d.ts +0 -21
  299. package/dist-cjs/providers/router.js +0 -101
  300. package/dist-cjs/providers/router.js.map +0 -1
  301. package/dist-cjs/providers/search-provider.d.ts +0 -35
  302. package/dist-cjs/providers/search-provider.js +0 -37
  303. package/dist-cjs/providers/search-provider.js.map +0 -1
  304. package/dist-cjs/providers/tavily.d.ts +0 -10
  305. package/dist-cjs/providers/tavily.js +0 -59
  306. package/dist-cjs/providers/tavily.js.map +0 -1
  307. package/dist-cjs/quip/desktop-session.d.ts +0 -69
  308. package/dist-cjs/quip/desktop-session.js +0 -354
  309. package/dist-cjs/quip/desktop-session.js.map +0 -1
  310. package/dist-cjs/registry/index.d.ts +0 -1
  311. package/dist-cjs/registry/index.js +0 -7
  312. package/dist-cjs/registry/index.js.map +0 -1
  313. package/dist-cjs/registry/registry.d.ts +0 -156
  314. package/dist-cjs/registry/registry.js +0 -762
  315. package/dist-cjs/registry/registry.js.map +0 -1
  316. package/dist-cjs/runtime-socket-local-control-client.d.ts +0 -10
  317. package/dist-cjs/runtime-socket-local-control-client.js +0 -368
  318. package/dist-cjs/runtime-socket-local-control-client.js.map +0 -1
  319. package/dist-cjs/security/dns-normalization.d.ts +0 -6
  320. package/dist-cjs/security/dns-normalization.js +0 -23
  321. package/dist-cjs/security/dns-normalization.js.map +0 -1
  322. package/dist-cjs/security/dns-pinning.d.ts +0 -27
  323. package/dist-cjs/security/dns-pinning.js +0 -161
  324. package/dist-cjs/security/dns-pinning.js.map +0 -1
  325. package/dist-cjs/security/external-content.d.ts +0 -40
  326. package/dist-cjs/security/external-content.js +0 -96
  327. package/dist-cjs/security/external-content.js.map +0 -1
  328. package/dist-cjs/security/ssrf.d.ts +0 -40
  329. package/dist-cjs/security/ssrf.js +0 -222
  330. package/dist-cjs/security/ssrf.js.map +0 -1
  331. package/dist-cjs/slack/desktop-session.d.ts +0 -69
  332. package/dist-cjs/slack/desktop-session.js +0 -367
  333. package/dist-cjs/slack/desktop-session.js.map +0 -1
  334. package/dist-cjs/tool-factory.d.ts +0 -46
  335. package/dist-cjs/tool-factory.js +0 -51
  336. package/dist-cjs/tool-factory.js.map +0 -1
  337. package/dist-cjs/types.d.ts +0 -1192
  338. package/dist-cjs/types.js +0 -9
  339. package/dist-cjs/types.js.map +0 -1
  340. package/dist-cjs/utils/retry.d.ts +0 -11
  341. package/dist-cjs/utils/retry.js +0 -170
  342. package/dist-cjs/utils/retry.js.map +0 -1
  343. package/dist-cjs/utils/safe-parse-json.d.ts +0 -26
  344. package/dist-cjs/utils/safe-parse-json.js +0 -165
  345. package/dist-cjs/utils/safe-parse-json.js.map +0 -1
  346. package/dist-cjs/utils/url.d.ts +0 -10
  347. package/dist-cjs/utils/url.js +0 -24
  348. package/dist-cjs/utils/url.js.map +0 -1
  349. package/src/__tests__/web-fetch-download.test.ts +0 -433
  350. package/src/__tests__/web-tools.test.ts +0 -619
  351. package/src/ask-user-interaction.ts +0 -33
  352. package/src/cache/web-cache.ts +0 -110
  353. package/src/definitions/arion.ts +0 -118
  354. package/src/definitions/browser/browser.ts +0 -502
  355. package/src/definitions/browser/index.ts +0 -5
  356. package/src/definitions/browser/pw-downloads.ts +0 -142
  357. package/src/definitions/browser/pw-interactions.ts +0 -282
  358. package/src/definitions/browser/pw-responses.ts +0 -98
  359. package/src/definitions/browser/pw-session.ts +0 -405
  360. package/src/definitions/browser/pw-shared.ts +0 -85
  361. package/src/definitions/browser/pw-snapshot.ts +0 -383
  362. package/src/definitions/browser/pw-state.ts +0 -101
  363. package/src/definitions/browser/types.ts +0 -203
  364. package/src/definitions/code-intelligence.ts +0 -526
  365. package/src/definitions/core.ts +0 -118
  366. package/src/definitions/delegation.ts +0 -567
  367. package/src/definitions/deploy.ts +0 -73
  368. package/src/definitions/filesystem.ts +0 -217
  369. package/src/definitions/frg.ts +0 -67
  370. package/src/definitions/index.ts +0 -28
  371. package/src/definitions/memory.ts +0 -150
  372. package/src/definitions/messaging.ts +0 -734
  373. package/src/definitions/meta.ts +0 -392
  374. package/src/definitions/network.ts +0 -179
  375. package/src/definitions/outlook.ts +0 -318
  376. package/src/definitions/patch/apply-patch.ts +0 -235
  377. package/src/definitions/patch/fuzzy-match.ts +0 -217
  378. package/src/definitions/patch/index.ts +0 -1
  379. package/src/definitions/patch/patch-parser.ts +0 -297
  380. package/src/definitions/patch/sandbox-paths.ts +0 -129
  381. package/src/definitions/process/index.ts +0 -5
  382. package/src/definitions/process/process-registry.ts +0 -303
  383. package/src/definitions/process/process.ts +0 -456
  384. package/src/definitions/process/pty-keys.ts +0 -298
  385. package/src/definitions/process/session-slug.ts +0 -147
  386. package/src/definitions/quip.ts +0 -225
  387. package/src/definitions/search.ts +0 -67
  388. package/src/definitions/session-history.ts +0 -79
  389. package/src/definitions/shell.ts +0 -202
  390. package/src/definitions/slack.ts +0 -211
  391. package/src/definitions/web.ts +0 -119
  392. package/src/executors/apply-patch.ts +0 -1035
  393. package/src/executors/arion.ts +0 -199
  394. package/src/executors/code-intelligence.ts +0 -1179
  395. package/src/executors/deploy.ts +0 -1066
  396. package/src/executors/filesystem.ts +0 -1428
  397. package/src/executors/frg-freshness.ts +0 -743
  398. package/src/executors/frg.ts +0 -394
  399. package/src/executors/index.ts +0 -280
  400. package/src/executors/learning-meta.ts +0 -1367
  401. package/src/executors/lsp-client.ts +0 -355
  402. package/src/executors/memory.ts +0 -978
  403. package/src/executors/meta.ts +0 -293
  404. package/src/executors/process-registry.ts +0 -570
  405. package/src/executors/pty-session-store.ts +0 -43
  406. package/src/executors/pty.ts +0 -342
  407. package/src/executors/restart.ts +0 -133
  408. package/src/executors/search-freshness.ts +0 -249
  409. package/src/executors/search-types.ts +0 -98
  410. package/src/executors/search.ts +0 -89
  411. package/src/executors/self-diagnose.ts +0 -552
  412. package/src/executors/session-history.ts +0 -435
  413. package/src/executors/shell-safety.ts +0 -519
  414. package/src/executors/shell.ts +0 -1243
  415. package/src/executors/utils.ts +0 -40
  416. package/src/executors/web.ts +0 -786
  417. package/src/extraction/content-extraction.ts +0 -281
  418. package/src/extraction/index.ts +0 -5
  419. package/src/headless-control-contract.ts +0 -1149
  420. package/src/index.ts +0 -788
  421. package/src/local-control-http-auth.ts +0 -2
  422. package/src/mcp/client.ts +0 -218
  423. package/src/mcp/connection.ts +0 -568
  424. package/src/mcp/index.ts +0 -11
  425. package/src/mcp/jsonrpc.ts +0 -195
  426. package/src/mcp/types.ts +0 -199
  427. package/src/network-control-adapter.ts +0 -88
  428. package/src/network-runtime/address-types.ts +0 -218
  429. package/src/network-runtime/db-owner-fencing.ts +0 -91
  430. package/src/network-runtime/delivery-receipts.ts +0 -372
  431. package/src/network-runtime/direct-endpoint-authority.ts +0 -35
  432. package/src/network-runtime/index.ts +0 -316
  433. package/src/network-runtime/local-control-contract.ts +0 -784
  434. package/src/network-runtime/node-store-contract.ts +0 -46
  435. package/src/network-runtime/pair-route-contract.ts +0 -97
  436. package/src/network-runtime/peer-capabilities.ts +0 -48
  437. package/src/network-runtime/peer-principal-ref.ts +0 -20
  438. package/src/network-runtime/peer-state-machine.ts +0 -160
  439. package/src/network-runtime/protocol-schemas.ts +0 -265
  440. package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
  441. package/src/outlook/desktop-session.ts +0 -409
  442. package/src/policy.ts +0 -171
  443. package/src/providers/brave.ts +0 -80
  444. package/src/providers/duckduckgo.ts +0 -199
  445. package/src/providers/exa.ts +0 -85
  446. package/src/providers/firecrawl.ts +0 -77
  447. package/src/providers/index.ts +0 -8
  448. package/src/providers/jina.ts +0 -70
  449. package/src/providers/router.ts +0 -121
  450. package/src/providers/search-provider.ts +0 -74
  451. package/src/providers/tavily.ts +0 -74
  452. package/src/quip/desktop-session.ts +0 -435
  453. package/src/registry/index.ts +0 -1
  454. package/src/registry/registry.ts +0 -905
  455. package/src/runtime-socket-local-control-client.ts +0 -632
  456. package/src/security/dns-normalization.ts +0 -34
  457. package/src/security/dns-pinning.ts +0 -138
  458. package/src/security/external-content.ts +0 -129
  459. package/src/security/ssrf.ts +0 -207
  460. package/src/slack/desktop-session.ts +0 -493
  461. package/src/tool-factory.ts +0 -91
  462. package/src/types.ts +0 -1341
  463. package/src/utils/retry.ts +0 -163
  464. package/src/utils/safe-parse-json.ts +0 -176
  465. package/src/utils/url.ts +0 -20
  466. package/tests/benchmarks/registry.bench.ts +0 -57
  467. package/tests/cache/web-cache.test.ts +0 -147
  468. package/tests/critical-integration.test.ts +0 -1465
  469. package/tests/definitions/apply-patch.test.ts +0 -586
  470. package/tests/definitions/browser.test.ts +0 -495
  471. package/tests/definitions/delegation-pause-resume.test.ts +0 -758
  472. package/tests/definitions/execution.test.ts +0 -671
  473. package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
  474. package/tests/definitions/messaging.test.ts +0 -1468
  475. package/tests/definitions/outlook.test.ts +0 -30
  476. package/tests/definitions/process.test.ts +0 -469
  477. package/tests/definitions/slack.test.ts +0 -28
  478. package/tests/definitions/tool-inventory.test.ts +0 -218
  479. package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
  480. package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
  481. package/tests/executors/apply-patch.test.ts +0 -538
  482. package/tests/executors/arion.test.ts +0 -309
  483. package/tests/executors/conversation-primitives.test.ts +0 -250
  484. package/tests/executors/deploy.test.ts +0 -746
  485. package/tests/executors/filesystem-tools.test.ts +0 -357
  486. package/tests/executors/filesystem.test.ts +0 -959
  487. package/tests/executors/frg-freshness.test.ts +0 -136
  488. package/tests/executors/frg-merge.test.ts +0 -70
  489. package/tests/executors/frg-session-content.test.ts +0 -40
  490. package/tests/executors/frg.test.ts +0 -56
  491. package/tests/executors/memory-bugfixes.test.ts +0 -257
  492. package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
  493. package/tests/executors/memory.test.ts +0 -853
  494. package/tests/executors/meta-tools.test.ts +0 -411
  495. package/tests/executors/meta.test.ts +0 -683
  496. package/tests/executors/path-containment.test.ts +0 -51
  497. package/tests/executors/process-registry.test.ts +0 -505
  498. package/tests/executors/pty.test.ts +0 -664
  499. package/tests/executors/quest-security.test.ts +0 -249
  500. package/tests/executors/read-file-media.test.ts +0 -230
  501. package/tests/executors/recall-knowledge-schema.test.ts +0 -209
  502. package/tests/executors/recall-tags.test.ts +0 -278
  503. package/tests/executors/remember-null-safety.contract.test.ts +0 -41
  504. package/tests/executors/restart.test.ts +0 -67
  505. package/tests/executors/search-unified.test.ts +0 -381
  506. package/tests/executors/session-history.test.ts +0 -340
  507. package/tests/executors/session-transcript.test.ts +0 -561
  508. package/tests/executors/shell-abort.test.ts +0 -416
  509. package/tests/executors/shell-env-blocklist.test.ts +0 -648
  510. package/tests/executors/shell-env-process.test.ts +0 -245
  511. package/tests/executors/shell-process-registry.test.ts +0 -334
  512. package/tests/executors/shell-tools.test.ts +0 -393
  513. package/tests/executors/shell.test.ts +0 -690
  514. package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
  515. package/tests/executors/web-integration.test.ts +0 -633
  516. package/tests/executors/web-symlink.test.ts +0 -18
  517. package/tests/executors/web.test.ts +0 -1400
  518. package/tests/executors/write-stdin.test.ts +0 -145
  519. package/tests/extraction/content-extraction.test.ts +0 -153
  520. package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
  521. package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
  522. package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
  523. package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
  524. package/tests/helpers/async-waits.ts +0 -53
  525. package/tests/integration/headless-control-contract.integration.test.ts +0 -153
  526. package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
  527. package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
  528. package/tests/integration/quest-round-trip.test.ts +0 -303
  529. package/tests/integration/registry-executor-flow.test.ts +0 -85
  530. package/tests/integration.test.ts +0 -177
  531. package/tests/loading-tier.test.ts +0 -126
  532. package/tests/mcp/client-reconnect.test.ts +0 -267
  533. package/tests/mcp/connection.test.ts +0 -846
  534. package/tests/mcp/injectable-logger.test.ts +0 -83
  535. package/tests/mcp/jsonrpc.test.ts +0 -109
  536. package/tests/mcp/lifecycle.test.ts +0 -879
  537. package/tests/network-runtime/address-types.contract.test.ts +0 -143
  538. package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
  539. package/tests/network-runtime/local-control-contract.test.ts +0 -869
  540. package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
  541. package/tests/network-runtime/node-store-contract.test.ts +0 -11
  542. package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
  543. package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
  544. package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
  545. package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
  546. package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
  547. package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
  548. package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
  549. package/tests/parallel.test.ts +0 -71
  550. package/tests/policy.test.ts +0 -184
  551. package/tests/print-default-test-lane.ts +0 -14
  552. package/tests/print-test-lane-manifest.ts +0 -22
  553. package/tests/providers/brave.test.ts +0 -159
  554. package/tests/providers/duckduckgo.test.ts +0 -207
  555. package/tests/providers/exa.test.ts +0 -175
  556. package/tests/providers/firecrawl.test.ts +0 -168
  557. package/tests/providers/jina.test.ts +0 -144
  558. package/tests/providers/router.test.ts +0 -328
  559. package/tests/providers/tavily.test.ts +0 -165
  560. package/tests/registry/discovery.test.ts +0 -154
  561. package/tests/registry/injectable-logger.test.ts +0 -230
  562. package/tests/registry/input-validation.test.ts +0 -361
  563. package/tests/registry/interface-completeness.test.ts +0 -85
  564. package/tests/registry/mcp-integration.test.ts +0 -103
  565. package/tests/registry/mcp-read-only-hint.test.ts +0 -60
  566. package/tests/registry/memoria-discovery.test.ts +0 -390
  567. package/tests/registry/nested-validation.test.ts +0 -283
  568. package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
  569. package/tests/registry/registration-lifecycle.test.ts +0 -133
  570. package/tests/registry-validation.test.ts +0 -424
  571. package/tests/registry.test.ts +0 -460
  572. package/tests/security/dns-pinning.test.ts +0 -162
  573. package/tests/security/external-content.test.ts +0 -144
  574. package/tests/security/ssrf.test.ts +0 -118
  575. package/tests/shell-safety-integration.test.ts +0 -32
  576. package/tests/shell-safety.test.ts +0 -365
  577. package/tests/slack/desktop-session.test.ts +0 -50
  578. package/tests/test-lane-manifest.ts +0 -440
  579. package/tests/test-utils.ts +0 -27
  580. package/tests/tool-factory.test.ts +0 -188
  581. package/tests/utils/retry.test.ts +0 -231
  582. package/tests/utils/url.test.ts +0 -63
  583. package/tsconfig.cjs.json +0 -24
  584. package/tsconfig.json +0 -12
  585. package/vitest.config.ts +0 -55
  586. package/vitest.e2e.config.ts +0 -24
  587. package/vitest.integration.config.ts +0 -24
  588. package/vitest.native.config.ts +0 -24
@@ -1,1035 +0,0 @@
1
- /**
2
- * @aria/tools - Apply Patch executor
3
- *
4
- * Parses and applies unified diff patches with:
5
- * - Path traversal protection (SECURITY-CRITICAL)
6
- * - Atomic writes (all-or-nothing application)
7
- * - Fuzzy hunk matching (offset tolerance)
8
- * - CRLF normalization
9
- */
10
-
11
- import * as crypto from "node:crypto";
12
- import * as fs from "node:fs/promises";
13
- import * as fsSync from "node:fs";
14
- import * as nodePath from "node:path";
15
- import type { ToolContext, ToolResult } from "../types.js";
16
- import { success, fail, getErrorMessage, isPathWithinBase } from "./utils.js";
17
- import { recordFrgMutation } from "./frg-freshness.js";
18
- import { recordSearchMutation } from "./search-freshness.js";
19
-
20
- // ============================================================================
21
- // Types
22
- // ============================================================================
23
-
24
- export interface ApplyPatchInput {
25
- /** Unified diff format patch content */
26
- patch: string;
27
- /** Working directory for relative paths in the patch */
28
- cwd?: string;
29
- }
30
-
31
- /** A single hunk within a file diff */
32
- interface Hunk {
33
- /** Original file start line (1-based) */
34
- oldStart: number;
35
- /** Number of lines in original */
36
- oldCount: number;
37
- /** Modified file start line (1-based) */
38
- newStart: number;
39
- /** Number of lines in modified */
40
- newCount: number;
41
- /** Lines in the hunk: each prefixed with ' ', '+', or '-' */
42
- lines: string[];
43
- }
44
-
45
- /** A diff for a single file */
46
- interface FileDiff {
47
- /** Original file path (null for new files) */
48
- oldPath: string | null;
49
- /** Modified file path (null for deleted files) */
50
- newPath: string | null;
51
- /** Hunks to apply */
52
- hunks: Hunk[];
53
- }
54
-
55
- /** What to do with a file after applying hunks */
56
- interface FileAction {
57
- /** Source path for move operations */
58
- sourcePath?: string;
59
- /** Target absolute path */
60
- resolvedPath: string;
61
- /** Action type */
62
- type: "create" | "modify" | "delete" | "move";
63
- /** New content (for create/modify) */
64
- content?: string;
65
- }
66
-
67
- function getErrnoCode(err: unknown): string | undefined {
68
- if (typeof err !== "object" || err === null) {
69
- return undefined;
70
- }
71
- const withCode = err as { code?: unknown };
72
- return typeof withCode.code === "string" ? withCode.code : undefined;
73
- }
74
-
75
- // Maximum fuzzy offset when searching for hunk context
76
- const MAX_FUZZ_OFFSET = 3;
77
- const BEGIN_PATCH = "*** Begin Patch";
78
- const END_PATCH = "*** End Patch";
79
- const ADD_FILE = "*** Add File: ";
80
- const DELETE_FILE = "*** Delete File: ";
81
- const UPDATE_FILE = "*** Update File: ";
82
- const MOVE_TO = "*** Move to: ";
83
- const END_OF_FILE = "*** End of File";
84
-
85
- // ============================================================================
86
- // Unified Diff Parser
87
- // ============================================================================
88
-
89
- /**
90
- * Parse a unified diff string into an array of file diffs.
91
- * Handles standard unified diff and git-style diffs.
92
- */
93
- export function parseUnifiedDiff(patch: string): FileDiff[] {
94
- // Normalize CRLF to LF
95
- const normalized = patch.replace(/\r\n/g, "\n");
96
- const lines = normalized.split("\n");
97
- const diffs: FileDiff[] = [];
98
- let i = 0;
99
-
100
- while (i < lines.length) {
101
- const line = lines[i]!;
102
-
103
- // Look for --- header
104
- if (line.startsWith("--- ")) {
105
- // Check for binary diff markers before this point
106
- // (we check later too, but early check is good)
107
- const nextLine = lines[i + 1];
108
- if (!nextLine || !nextLine.startsWith("+++ ")) {
109
- i++;
110
- continue;
111
- }
112
-
113
- const oldPath = parseDiffPath(line.slice(4));
114
- const newPath = parseDiffPath(nextLine.slice(4));
115
- i += 2;
116
-
117
- // Parse hunks for this file
118
- const hunks: Hunk[] = [];
119
- while (i < lines.length) {
120
- const hunkLine = lines[i]!;
121
- if (hunkLine.startsWith("@@ ")) {
122
- const hunk = parseHunkHeader(hunkLine);
123
- if (!hunk) {
124
- throw new Error(`Invalid hunk header: ${hunkLine}`);
125
- }
126
- i++;
127
-
128
- // Collect hunk lines
129
- const hunkLines: string[] = [];
130
- let oldSeen = 0;
131
- let newSeen = 0;
132
- while (i < lines.length) {
133
- const l = lines[i]!;
134
- const prefix = l[0];
135
- if (prefix === " " || prefix === "+" || prefix === "-") {
136
- hunkLines.push(l);
137
- if (prefix === " " || prefix === "-") oldSeen++;
138
- if (prefix === " " || prefix === "+") newSeen++;
139
- i++;
140
- // Unified diff hunks define old/new line counts explicitly.
141
- // Stop when we consumed the declared line counts so a following
142
- // file header ("--- ...") is not misread as hunk content.
143
- if (oldSeen >= hunk.oldCount && newSeen >= hunk.newCount) {
144
- break;
145
- }
146
- } else if (l === "\") {
147
- // Skip this marker — we handle trailing newlines via content
148
- i++;
149
- } else {
150
- break;
151
- }
152
- }
153
-
154
- if (i < lines.length) {
155
- const next = lines[i]!;
156
- const nextPrefix = next[0];
157
- const looksLikeHunkLine =
158
- nextPrefix === " " ||
159
- (nextPrefix === "+" && !next.startsWith("+++ ")) ||
160
- (nextPrefix === "-" && !next.startsWith("--- "));
161
- if (looksLikeHunkLine) {
162
- throw new Error(
163
- `Malformed hunk: expected old/new counts ${hunk.oldCount}/${hunk.newCount} but found extra hunk lines`,
164
- );
165
- }
166
- }
167
-
168
- if (oldSeen !== hunk.oldCount || newSeen !== hunk.newCount) {
169
- throw new Error(
170
- `Malformed hunk: expected old/new counts ${hunk.oldCount}/${hunk.newCount} but found ${oldSeen}/${newSeen}`,
171
- );
172
- }
173
-
174
- hunks.push({ ...hunk, lines: hunkLines });
175
- } else if (hunkLine.startsWith("--- ") || hunkLine.startsWith("diff ") || hunkLine === "") {
176
- // Start of next file diff or blank line separator
177
- break;
178
- } else {
179
- // Skip git diff metadata lines (index, mode, etc.)
180
- i++;
181
- }
182
- }
183
-
184
- if (hunks.length > 0 || oldPath === null || newPath === null) {
185
- diffs.push({ oldPath, newPath, hunks });
186
- }
187
- } else if (line.startsWith("Binary files") || line.startsWith("GIT binary patch")) {
188
- throw new Error(`Binary diffs are not supported: ${line}`);
189
- } else {
190
- i++;
191
- }
192
- }
193
-
194
- return diffs;
195
- }
196
-
197
- function buildCountedHunk(lines: string[]): Hunk {
198
- let oldCount = 0;
199
- let newCount = 0;
200
- for (const line of lines) {
201
- if (line.startsWith(" ") || line.startsWith("-")) oldCount++;
202
- if (line.startsWith(" ") || line.startsWith("+")) newCount++;
203
- }
204
- return {
205
- oldStart: 1,
206
- oldCount,
207
- newStart: 1,
208
- newCount,
209
- lines,
210
- };
211
- }
212
-
213
- function parseHeaderPath(line: string, prefix: string): string {
214
- const raw = line.slice(prefix.length).trim();
215
- if (!raw) {
216
- throw new Error(`Missing file path after header: ${prefix.trim()}`);
217
- }
218
- return raw;
219
- }
220
-
221
- function parseBeginPatchFormat(patch: string): FileDiff[] {
222
- const lines = normalizePatchText(patch).split("\n");
223
- if ((lines[0] ?? "").trim() !== BEGIN_PATCH) {
224
- throw new Error("Invalid apply_patch envelope: missing *** Begin Patch");
225
- }
226
-
227
- const diffs: FileDiff[] = [];
228
- let i = 1;
229
-
230
- while (i < lines.length) {
231
- const line = lines[i] ?? "";
232
-
233
- if (line === END_PATCH) {
234
- return diffs;
235
- }
236
- if (line.trim() === "") {
237
- i++;
238
- continue;
239
- }
240
-
241
- if (line.startsWith(ADD_FILE)) {
242
- const newPath = parseHeaderPath(line, ADD_FILE);
243
- i++;
244
- const addLines: string[] = [];
245
- while (i < lines.length) {
246
- const current = lines[i] ?? "";
247
- if (current.startsWith("*** ")) break;
248
- if (!current.startsWith("+")) {
249
- throw new Error(`Invalid add-file line (must start with '+'): ${current}`);
250
- }
251
- addLines.push(current);
252
- i++;
253
- }
254
- diffs.push({
255
- oldPath: null,
256
- newPath,
257
- hunks: [buildCountedHunk(addLines)],
258
- });
259
- continue;
260
- }
261
-
262
- if (line.startsWith(DELETE_FILE)) {
263
- const oldPath = parseHeaderPath(line, DELETE_FILE);
264
- diffs.push({ oldPath, newPath: null, hunks: [] });
265
- i++;
266
- continue;
267
- }
268
-
269
- if (line.startsWith(UPDATE_FILE)) {
270
- const oldPath = parseHeaderPath(line, UPDATE_FILE);
271
- i++;
272
-
273
- let newPath = oldPath;
274
- if ((lines[i] ?? "").startsWith(MOVE_TO)) {
275
- newPath = parseHeaderPath(lines[i]!, MOVE_TO);
276
- i++;
277
- }
278
-
279
- const hunks: Hunk[] = [];
280
- let currentHunkLines: string[] = [];
281
- while (i < lines.length) {
282
- const current = lines[i] ?? "";
283
- if (current.startsWith("*** ")) break;
284
-
285
- if (current.startsWith("@@")) {
286
- if (currentHunkLines.length > 0) {
287
- hunks.push(buildCountedHunk(currentHunkLines));
288
- currentHunkLines = [];
289
- }
290
- i++;
291
- continue;
292
- }
293
-
294
- if (current === END_OF_FILE) {
295
- i++;
296
- continue;
297
- }
298
-
299
- if (current.startsWith(" ") || current.startsWith("+") || current.startsWith("-")) {
300
- currentHunkLines.push(current);
301
- i++;
302
- continue;
303
- }
304
-
305
- throw new Error(`Invalid update-file line: ${current}`);
306
- }
307
-
308
- if (currentHunkLines.length > 0) {
309
- hunks.push(buildCountedHunk(currentHunkLines));
310
- }
311
-
312
- if (hunks.length === 0 && oldPath === newPath) {
313
- throw new Error(`Update section has no hunks: ${oldPath}`);
314
- }
315
-
316
- diffs.push({ oldPath, newPath, hunks });
317
- continue;
318
- }
319
-
320
- throw new Error(`Invalid apply_patch section header: ${line}`);
321
- }
322
-
323
- throw new Error("Invalid apply_patch envelope: missing *** End Patch");
324
- }
325
-
326
- function normalizePatchText(patch: string): string {
327
- return patch.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
328
- }
329
-
330
- function parsePatchInput(patch: string): FileDiff[] {
331
- const normalized = normalizePatchText(patch).trimStart();
332
- if (normalized.startsWith(BEGIN_PATCH)) {
333
- return parseBeginPatchFormat(normalized);
334
- }
335
- return parseUnifiedDiff(normalized);
336
- }
337
-
338
- /**
339
- * Parse a file path from a --- or +++ line.
340
- * Strips a/ or b/ git-style prefixes.
341
- * Returns null for /dev/null (new file or deleted file).
342
- */
343
- function parseDiffPath(raw: string): string | null {
344
- // Remove trailing timestamp (e.g., "2024-01-01 00:00:00.000000000 +0000")
345
- const path = raw.replace(/\t.*$/, "").trim();
346
-
347
- if (path === "/dev/null") {
348
- return null;
349
- }
350
-
351
- // Strip git-style a/ or b/ prefix
352
- if (path.startsWith("a/") || path.startsWith("b/")) {
353
- return path.slice(2);
354
- }
355
-
356
- return path;
357
- }
358
-
359
- /**
360
- * Parse a hunk header line: @@ -oldStart,oldCount +newStart,newCount @@
361
- */
362
- function parseHunkHeader(line: string): Omit<Hunk, "lines"> | null {
363
- const match = line.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
364
- if (!match) return null;
365
-
366
- return {
367
- oldStart: parseInt(match[1]!, 10),
368
- oldCount: match[2] !== undefined ? parseInt(match[2], 10) : 1,
369
- newStart: parseInt(match[3]!, 10),
370
- newCount: match[4] !== undefined ? parseInt(match[4], 10) : 1,
371
- };
372
- }
373
-
374
- // ============================================================================
375
- // Path Validation (SECURITY-CRITICAL)
376
- // ============================================================================
377
-
378
- /**
379
- * Validate all paths in a parsed diff against path traversal attacks.
380
- *
381
- * SECURITY: This is the primary defense against malicious patches that
382
- * attempt to write outside the working directory.
383
- */
384
- function validatePatchPaths(
385
- diffs: FileDiff[],
386
- cwd: string,
387
- ): { valid: true; resolved: Map<string, string> } | { valid: false; error: string } {
388
- const resolved = new Map<string, string>();
389
-
390
- for (const diff of diffs) {
391
- const paths = [diff.oldPath, diff.newPath].filter((p): p is string => p !== null);
392
-
393
- for (const rawPath of paths) {
394
- if (resolved.has(rawPath)) continue;
395
-
396
- // 1. Reject absolute paths
397
- if (nodePath.isAbsolute(rawPath)) {
398
- return {
399
- valid: false,
400
- error: `Absolute path not allowed in patch: ${rawPath}`,
401
- };
402
- }
403
-
404
- // 2. Reject paths with .. components
405
- const segments = rawPath.split(/[/\\]/);
406
- if (segments.includes("..")) {
407
- return {
408
- valid: false,
409
- error: `Path traversal (..) not allowed in patch: ${rawPath}`,
410
- };
411
- }
412
-
413
- // 3. Reject system paths (even though relative shouldn't reach these,
414
- // defense-in-depth against creative path construction)
415
- const systemPrefixes = ["/dev/", "/proc/", "/sys/", "/etc/"];
416
- for (const prefix of systemPrefixes) {
417
- if (rawPath.startsWith(prefix) || rawPath === prefix.slice(0, -1)) {
418
- return {
419
- valid: false,
420
- error: `System path not allowed in patch: ${rawPath}`,
421
- };
422
- }
423
- }
424
-
425
- // 4. Resolve relative to cwd
426
- const fullPath = nodePath.resolve(cwd, rawPath);
427
-
428
- // 5. Verify the resolved path is within cwd
429
- // Resolve symlinks on cwd to handle platforms where /tmp -> /private/tmp
430
- let realCwd = cwd;
431
- try {
432
- realCwd = fsSync.realpathSync(cwd);
433
- } catch {
434
- // Fall back to original cwd if it doesn't exist yet
435
- }
436
-
437
- // Resolve symlinks on the target path (walk up to nearest existing ancestor)
438
- let realPath = fullPath;
439
- try {
440
- realPath = fsSync.realpathSync(fullPath);
441
- } catch {
442
- // Path may not exist yet — walk up to find nearest existing ancestor
443
- let current = fullPath;
444
- let suffix = "";
445
- while (current !== nodePath.dirname(current)) {
446
- const parent = nodePath.dirname(current);
447
- suffix = suffix
448
- ? nodePath.join(nodePath.basename(current), suffix)
449
- : nodePath.basename(current);
450
- try {
451
- const realAncestor = fsSync.realpathSync(parent);
452
- realPath = nodePath.join(realAncestor, suffix);
453
- break;
454
- } catch {
455
- current = parent;
456
- }
457
- }
458
- }
459
-
460
- if (!isPathWithinBase(realPath, realCwd)) {
461
- return {
462
- valid: false,
463
- error: `Resolved path escapes working directory: ${rawPath} -> ${realPath} (cwd: ${realCwd})`,
464
- };
465
- }
466
-
467
- resolved.set(rawPath, realPath);
468
- }
469
- }
470
-
471
- return { valid: true, resolved };
472
- }
473
-
474
- // ============================================================================
475
- // Windows Drive Letter Detection
476
- // ============================================================================
477
-
478
- /**
479
- * Check if a path looks like a Windows drive letter (e.g., C:\, D:/)
480
- */
481
- function isWindowsDrivePath(p: string): boolean {
482
- return /^[a-zA-Z]:[/\\]/.test(p);
483
- }
484
-
485
- // ============================================================================
486
- // Hunk Application
487
- // ============================================================================
488
-
489
- /**
490
- * Apply hunks to file content.
491
- * Uses fuzzy matching with a configurable offset tolerance.
492
- *
493
- * Returns the modified content or an error describing what went wrong.
494
- */
495
- function applyHunks(
496
- originalContent: string,
497
- hunks: Hunk[],
498
- filePath: string,
499
- ): { ok: true; content: string } | { ok: false; error: string } {
500
- // Normalize CRLF
501
- const normalized = originalContent.replace(/\r\n/g, "\n");
502
- let lines = normalized.split("\n");
503
-
504
- // Track cumulative offset from insertions/deletions
505
- let lineOffset = 0;
506
-
507
- for (let hunkIdx = 0; hunkIdx < hunks.length; hunkIdx++) {
508
- const hunk = hunks[hunkIdx]!;
509
-
510
- // Extract context and removal lines (lines that must exist in original)
511
- const expectedLines: string[] = [];
512
- const newLines: string[] = [];
513
-
514
- for (const line of hunk.lines) {
515
- const prefix = line[0];
516
- const content = line.slice(1);
517
- if (prefix === " ") {
518
- expectedLines.push(content);
519
- newLines.push(content);
520
- } else if (prefix === "-") {
521
- expectedLines.push(content);
522
- } else if (prefix === "+") {
523
- newLines.push(content);
524
- }
525
- }
526
-
527
- // Find the position where context matches
528
- const expectedStart = hunk.oldStart - 1 + lineOffset; // Convert 1-based to 0-based
529
- let matchPos = -1;
530
-
531
- // Try exact position first, then fuzzy within tolerance
532
- for (let offset = 0; offset <= MAX_FUZZ_OFFSET; offset++) {
533
- for (const dir of [0, 1, -1]) {
534
- const tryPos = expectedStart + offset * (dir === 0 ? 0 : dir);
535
- if (dir === 0 && offset > 0) continue; // Skip duplicate 0-offset
536
-
537
- if (tryPos < 0 || tryPos + expectedLines.length > lines.length) continue;
538
-
539
- let matches = true;
540
- for (let j = 0; j < expectedLines.length; j++) {
541
- if (lines[tryPos + j] !== expectedLines[j]) {
542
- matches = false;
543
- break;
544
- }
545
- }
546
-
547
- if (matches) {
548
- matchPos = tryPos;
549
- break;
550
- }
551
- }
552
- if (matchPos >= 0) break;
553
- }
554
-
555
- if (matchPos < 0) {
556
- // Fallback: global scan for context (used by relaxed patch formats where line numbers may be approximate)
557
- const candidates: number[] = [];
558
- for (let pos = 0; pos + expectedLines.length <= lines.length; pos++) {
559
- let matches = true;
560
- for (let j = 0; j < expectedLines.length; j++) {
561
- if (lines[pos + j] !== expectedLines[j]) {
562
- matches = false;
563
- break;
564
- }
565
- }
566
- if (matches) candidates.push(pos);
567
- }
568
-
569
- if (candidates.length === 1) {
570
- matchPos = candidates[0]!;
571
- } else {
572
- // Build a helpful error message
573
- const contextPreview = expectedLines.slice(0, 3).join("\n ");
574
- const ambiguity =
575
- candidates.length > 1
576
- ? `Context matched ${candidates.length} locations; provide more surrounding lines.`
577
- : "Context not found.";
578
- return {
579
- ok: false,
580
- error:
581
- `Hunk ${hunkIdx + 1} failed to apply to ${filePath} ` +
582
- `(expected at line ${hunk.oldStart}, searched ±${MAX_FUZZ_OFFSET} lines). ` +
583
- `${ambiguity}\n ${contextPreview}`,
584
- };
585
- }
586
- }
587
-
588
- // Apply: replace the matched range with the new lines
589
- lines = [
590
- ...lines.slice(0, matchPos),
591
- ...newLines,
592
- ...lines.slice(matchPos + expectedLines.length),
593
- ];
594
-
595
- // Update offset for subsequent hunks
596
- lineOffset += newLines.length - expectedLines.length;
597
- }
598
-
599
- return { ok: true, content: lines.join("\n") };
600
- }
601
-
602
- // ============================================================================
603
- // Atomic Patch Application
604
- // ============================================================================
605
-
606
- /**
607
- * Apply all file diffs atomically.
608
- * Writes to temp files first, then renames on success.
609
- * On any failure, cleans up all temp files.
610
- */
611
- async function applyPatchAtomic(
612
- diffs: FileDiff[],
613
- resolvedPaths: Map<string, string>,
614
- ): Promise<ToolResult> {
615
- const actions: FileAction[] = [];
616
- const tempFiles: string[] = [];
617
- let totalAdded = 0;
618
- let totalRemoved = 0;
619
-
620
- try {
621
- // Phase 1: Compute all file actions (read + apply hunks)
622
- for (const diff of diffs) {
623
- const isNewFile = diff.oldPath === null;
624
- const isDeleteFile = diff.newPath === null;
625
- const sourcePath = diff.oldPath ? resolvedPaths.get(diff.oldPath) : undefined;
626
- const targetPath = diff.newPath ? resolvedPaths.get(diff.newPath) : undefined;
627
-
628
- if (isDeleteFile) {
629
- // Deletion: mark for removal
630
- if (!sourcePath) {
631
- return fail(`Patch references missing delete source path: ${diff.oldPath}`);
632
- }
633
- let sourceStat: fsSync.Stats;
634
- try {
635
- sourceStat = await fs.stat(sourcePath);
636
- } catch (err) {
637
- return fail(`Cannot delete missing path: ${sourcePath}: ${getErrorMessage(err)}`);
638
- }
639
- if (sourceStat.isDirectory()) {
640
- return fail(`Patch delete targets a directory (unsupported): ${sourcePath}`);
641
- }
642
- actions.push({ resolvedPath: sourcePath, type: "delete" });
643
-
644
- // Count removed lines
645
- for (const hunk of diff.hunks) {
646
- for (const line of hunk.lines) {
647
- if (line.startsWith("-")) totalRemoved++;
648
- }
649
- }
650
- continue;
651
- }
652
-
653
- if (isNewFile) {
654
- if (!targetPath) {
655
- return fail(`Patch references missing create target path: ${diff.newPath}`);
656
- }
657
- // New file: build content from additions
658
- const contentLines: string[] = [];
659
- for (const hunk of diff.hunks) {
660
- for (const line of hunk.lines) {
661
- if (line.startsWith("+")) {
662
- contentLines.push(line.slice(1));
663
- totalAdded++;
664
- }
665
- }
666
- }
667
- const content = contentLines.join("\n") + "\n";
668
- actions.push({ resolvedPath: targetPath, type: "create", content });
669
- } else {
670
- if (!sourcePath || !targetPath) {
671
- return fail(
672
- `Patch references missing update source/target paths: ${diff.oldPath} -> ${diff.newPath}`,
673
- );
674
- }
675
- // Modify existing file
676
- let originalContent: string;
677
- try {
678
- originalContent = await fs.readFile(sourcePath, "utf-8");
679
- } catch (err) {
680
- return fail(`Cannot read file for patching: ${sourcePath}: ${getErrorMessage(err)}`);
681
- }
682
-
683
- const result = applyHunks(originalContent, diff.hunks, diff.newPath!);
684
- if (!result.ok) {
685
- return fail(result.error);
686
- }
687
-
688
- // Count additions and removals
689
- for (const hunk of diff.hunks) {
690
- for (const line of hunk.lines) {
691
- if (line.startsWith("+")) totalAdded++;
692
- else if (line.startsWith("-")) totalRemoved++;
693
- }
694
- }
695
-
696
- actions.push({
697
- sourcePath,
698
- resolvedPath: targetPath,
699
- type: sourcePath === targetPath ? "modify" : "move",
700
- content: result.content,
701
- });
702
- }
703
- }
704
-
705
- // Phase 2: Write all changes to temp files
706
- for (const action of actions) {
707
- if (action.type === "delete") continue;
708
-
709
- const dir = nodePath.dirname(action.resolvedPath);
710
- const base = nodePath.basename(action.resolvedPath);
711
- const suffix = crypto.randomBytes(6).toString("hex");
712
- const tempPath = nodePath.join(dir, `.${base}.patch-${suffix}`);
713
-
714
- // Ensure parent directory exists (needed for new files)
715
- await fs.mkdir(dir, { recursive: true });
716
-
717
- await fs.writeFile(tempPath, action.content!, "utf-8");
718
- tempFiles.push(tempPath);
719
- }
720
-
721
- // Phase 3: Atomic rename — all temp files to final destinations
722
- // Back up targets and deletion sources for rollback on failure
723
- const targetBackups = new Map<string, string>();
724
- const sourceRemovalBackups = new Map<string, string>();
725
- const appliedTargets: string[] = [];
726
- const removedSources: string[] = [];
727
-
728
- const backupTargetIfExists = async (targetPath: string): Promise<void> => {
729
- if (targetBackups.has(targetPath)) {
730
- return;
731
- }
732
- const backupSuffix = crypto.randomBytes(6).toString("hex");
733
- const backupPath = targetPath + `.patch-backup-${backupSuffix}`;
734
- try {
735
- await fs.copyFile(targetPath, backupPath);
736
- targetBackups.set(targetPath, backupPath);
737
- } catch (err) {
738
- const code = getErrnoCode(err);
739
- if (code === "ENOENT") {
740
- return;
741
- }
742
- throw err;
743
- }
744
- };
745
-
746
- const backupSourceRemovalPath = async (sourcePath: string): Promise<void> => {
747
- if (sourceRemovalBackups.has(sourcePath)) {
748
- return;
749
- }
750
- const backupSuffix = crypto.randomBytes(6).toString("hex");
751
- const backupPath = sourcePath + `.patch-source-backup-${backupSuffix}`;
752
- await fs.copyFile(sourcePath, backupPath);
753
- sourceRemovalBackups.set(sourcePath, backupPath);
754
- };
755
-
756
- const unlinkSourcePath = async (sourcePath: string): Promise<void> => {
757
- try {
758
- await fs.unlink(sourcePath);
759
- removedSources.push(sourcePath);
760
- } catch (err) {
761
- const code = getErrnoCode(err);
762
- // If the path is already gone, desired end-state (removed) is satisfied.
763
- if (code === "ENOENT") {
764
- return;
765
- }
766
- throw err;
767
- }
768
- };
769
-
770
- try {
771
- // Backup all existing target files that may be overwritten.
772
- for (const action of actions) {
773
- if (action.type === "delete") continue;
774
- await backupTargetIfExists(action.resolvedPath);
775
- }
776
-
777
- // Backup all files that will be removed (delete + move source path).
778
- for (const action of actions) {
779
- if (action.type === "delete") {
780
- await backupSourceRemovalPath(action.resolvedPath);
781
- continue;
782
- }
783
- if (
784
- action.type === "move" &&
785
- action.sourcePath &&
786
- action.sourcePath !== action.resolvedPath
787
- ) {
788
- await backupSourceRemovalPath(action.sourcePath);
789
- }
790
- }
791
-
792
- let tempIdx = 0;
793
- for (const action of actions) {
794
- if (action.type === "delete") continue;
795
-
796
- const tempPath = tempFiles[tempIdx]!;
797
- await fs.rename(tempPath, action.resolvedPath);
798
- appliedTargets.push(action.resolvedPath);
799
- tempIdx++;
800
- }
801
-
802
- // Apply delete/move source removals as part of the same transaction.
803
- for (const action of actions) {
804
- if (action.type === "delete") {
805
- await unlinkSourcePath(action.resolvedPath);
806
- } else if (
807
- action.type === "move" &&
808
- action.sourcePath &&
809
- action.sourcePath !== action.resolvedPath
810
- ) {
811
- await unlinkSourcePath(action.sourcePath);
812
- }
813
- }
814
- } catch (renameErr) {
815
- // Rollback: restore backup-backed targets, remove newly-created targets
816
- for (let idx = appliedTargets.length - 1; idx >= 0; idx--) {
817
- const target = appliedTargets[idx]!;
818
- const backup = targetBackups.get(target);
819
- try {
820
- if (backup) {
821
- await fs.rename(backup, target);
822
- } else {
823
- await fs.unlink(target);
824
- }
825
- } catch {
826
- /* best-effort */
827
- }
828
- }
829
-
830
- // Rollback removed source paths (delete/move) in reverse order.
831
- for (let idx = removedSources.length - 1; idx >= 0; idx--) {
832
- const sourcePath = removedSources[idx]!;
833
- const backup = sourceRemovalBackups.get(sourcePath);
834
- if (!backup) continue;
835
- try {
836
- await fs.rename(backup, sourcePath);
837
- sourceRemovalBackups.delete(sourcePath);
838
- } catch {
839
- /* best-effort */
840
- }
841
- }
842
-
843
- // Clean up any remaining backup files
844
- for (const backup of targetBackups.values()) {
845
- try {
846
- await fs.unlink(backup);
847
- } catch {
848
- /* best-effort */
849
- }
850
- }
851
- for (const backup of sourceRemovalBackups.values()) {
852
- try {
853
- await fs.unlink(backup);
854
- } catch {
855
- /* best-effort */
856
- }
857
- }
858
- // Clean up any remaining temp files
859
- for (const tempPath of tempFiles) {
860
- try {
861
- await fs.unlink(tempPath);
862
- } catch {
863
- /* best-effort */
864
- }
865
- }
866
- throw renameErr; // Will be caught by outer try/catch
867
- }
868
-
869
- // Success — clean up backups
870
- for (const backup of targetBackups.values()) {
871
- try {
872
- await fs.unlink(backup);
873
- } catch {
874
- /* best-effort */
875
- }
876
- }
877
- for (const backup of sourceRemovalBackups.values()) {
878
- try {
879
- await fs.unlink(backup);
880
- } catch {
881
- /* best-effort */
882
- }
883
- }
884
-
885
- // Build summary
886
- const filesChanged = actions.length;
887
- const created = actions.filter((a) => a.type === "create").length;
888
- const modified = actions.filter((a) => a.type === "modify").length;
889
- const deleted = actions.filter((a) => a.type === "delete").length;
890
- const moved = actions.filter((a) => a.type === "move").length;
891
-
892
- const parts: string[] = [];
893
- if (created > 0) parts.push(`${created} created`);
894
- if (modified > 0) parts.push(`${modified} modified`);
895
- if (moved > 0) parts.push(`${moved} moved`);
896
- if (deleted > 0) parts.push(`${deleted} deleted`);
897
-
898
- const summary =
899
- `Patch applied: ${filesChanged} file${filesChanged !== 1 ? "s" : ""} ` +
900
- `(${parts.join(", ")}), +${totalAdded}/-${totalRemoved} lines`;
901
-
902
- for (const action of actions) {
903
- if (action.type === "delete") {
904
- recordFrgMutation(action.resolvedPath, "delete");
905
- recordSearchMutation(action.resolvedPath, "delete");
906
- } else {
907
- recordFrgMutation(action.resolvedPath, "write", action.content);
908
- recordSearchMutation(action.resolvedPath, "write", action.content);
909
- if (
910
- action.type === "move" &&
911
- action.sourcePath &&
912
- action.sourcePath !== action.resolvedPath
913
- ) {
914
- recordFrgMutation(action.sourcePath, "delete");
915
- recordSearchMutation(action.sourcePath, "delete");
916
- }
917
- }
918
- }
919
-
920
- return success(summary, {
921
- filesChanged,
922
- created,
923
- modified,
924
- moved,
925
- deleted,
926
- linesAdded: totalAdded,
927
- linesRemoved: totalRemoved,
928
- files: actions.map((a) => ({
929
- path: a.type === "move" ? `${a.sourcePath} -> ${a.resolvedPath}` : a.resolvedPath,
930
- action: a.type,
931
- })),
932
- });
933
- } catch (err) {
934
- // Cleanup: remove all temp files on failure
935
- for (const tempPath of tempFiles) {
936
- try {
937
- await fs.unlink(tempPath);
938
- } catch {
939
- // Best-effort cleanup
940
- }
941
- }
942
- return fail(`Patch application failed: ${getErrorMessage(err)}`);
943
- }
944
- }
945
-
946
- // ============================================================================
947
- // Main Executor
948
- // ============================================================================
949
-
950
- /**
951
- * Execute the apply_patch tool.
952
- *
953
- * Parses a unified diff, validates all paths for security,
954
- * and applies changes atomically.
955
- */
956
- export async function executeApplyPatch(
957
- input: ApplyPatchInput,
958
- ctx: ToolContext,
959
- ): Promise<ToolResult> {
960
- try {
961
- if (!input.patch || input.patch.trim() === "") {
962
- return fail("Patch content is empty");
963
- }
964
-
965
- // Size guard: reject patches > 1MB to prevent memory exhaustion
966
- const MAX_PATCH_SIZE = 1_048_576; // 1MB
967
- if (input.patch.length > MAX_PATCH_SIZE) {
968
- return fail(`Patch too large: ${input.patch.length} bytes (max: ${MAX_PATCH_SIZE})`);
969
- }
970
-
971
- // Determine working directory
972
- const cwd = input.cwd ? nodePath.resolve(ctx.workingDir, input.cwd) : ctx.workingDir;
973
-
974
- // SECURITY: Validate cwd is within the working directory
975
- if (input.cwd) {
976
- let realCwd: string;
977
- try {
978
- realCwd = fsSync.realpathSync(cwd);
979
- } catch {
980
- return fail(`Working directory does not exist: ${cwd}`);
981
- }
982
- let realWorkingDir: string;
983
- try {
984
- realWorkingDir = fsSync.realpathSync(ctx.workingDir);
985
- } catch {
986
- return fail(`Base working directory does not exist: ${ctx.workingDir}`);
987
- }
988
- if (!isPathWithinBase(realCwd, realWorkingDir)) {
989
- return fail(`cwd must be within the working directory: ${input.cwd}`);
990
- }
991
- }
992
-
993
- // Verify cwd exists and is a directory
994
- try {
995
- const stat = await fs.stat(cwd);
996
- if (!stat.isDirectory()) {
997
- return fail(`Working directory is not a directory: ${cwd}`);
998
- }
999
- } catch {
1000
- return fail(`Working directory does not exist: ${cwd}`);
1001
- }
1002
-
1003
- // Step 1: Parse patch input (unified diff or apply_patch envelope)
1004
- let diffs: FileDiff[];
1005
- try {
1006
- diffs = parsePatchInput(input.patch);
1007
- } catch (err) {
1008
- return fail(`Failed to parse patch: ${getErrorMessage(err)}`);
1009
- }
1010
-
1011
- if (diffs.length === 0) {
1012
- return fail("No file diffs found in patch");
1013
- }
1014
-
1015
- // Step 2: Validate paths (SECURITY-CRITICAL)
1016
- // Check for Windows drive letters in paths (cross-platform safety)
1017
- for (const diff of diffs) {
1018
- for (const p of [diff.oldPath, diff.newPath]) {
1019
- if (p !== null && isWindowsDrivePath(p)) {
1020
- return fail(`Absolute path not allowed in patch: ${p}`);
1021
- }
1022
- }
1023
- }
1024
-
1025
- const validation = validatePatchPaths(diffs, cwd);
1026
- if (!validation.valid) {
1027
- return fail(validation.error);
1028
- }
1029
-
1030
- // Step 3: Apply atomically
1031
- return await applyPatchAtomic(diffs, validation.resolved);
1032
- } catch (err) {
1033
- return fail(`apply_patch failed: ${getErrorMessage(err)}`);
1034
- }
1035
- }