apex-code 0.0.1-alpha.8 → 0.0.4

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 (634) hide show
  1. package/CHANGELOG.md +231 -0
  2. package/README.md +9 -8
  3. package/dist/cli/args.d.ts +26 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +72 -10
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts.map +1 -1
  8. package/dist/cli/file-processor.js +2 -1
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/cli/mcp-command.d.ts +9 -0
  11. package/dist/cli/mcp-command.d.ts.map +1 -0
  12. package/dist/cli/mcp-command.js +53 -0
  13. package/dist/cli/mcp-command.js.map +1 -0
  14. package/dist/cli/project-trust.d.ts.map +1 -1
  15. package/dist/cli/project-trust.js +3 -1
  16. package/dist/cli/project-trust.js.map +1 -1
  17. package/dist/cli/startup-ui.d.ts.map +1 -1
  18. package/dist/cli/startup-ui.js +2 -1
  19. package/dist/cli/startup-ui.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +94 -5
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config.d.ts +3 -2
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +45 -18
  26. package/dist/config.js.map +1 -1
  27. package/dist/core/agent-session-services.d.ts +3 -0
  28. package/dist/core/agent-session-services.d.ts.map +1 -1
  29. package/dist/core/agent-session-services.js +1 -0
  30. package/dist/core/agent-session-services.js.map +1 -1
  31. package/dist/core/agent-session.d.ts +183 -15
  32. package/dist/core/agent-session.d.ts.map +1 -1
  33. package/dist/core/agent-session.js +728 -117
  34. package/dist/core/agent-session.js.map +1 -1
  35. package/dist/core/auth-storage.d.ts.map +1 -1
  36. package/dist/core/auth-storage.js +6 -7
  37. package/dist/core/auth-storage.js.map +1 -1
  38. package/dist/core/bash-executor.d.ts.map +1 -1
  39. package/dist/core/bash-executor.js +7 -0
  40. package/dist/core/bash-executor.js.map +1 -1
  41. package/dist/core/checkpoints/git-checkpoints.d.ts +39 -0
  42. package/dist/core/checkpoints/git-checkpoints.d.ts.map +1 -0
  43. package/dist/core/checkpoints/git-checkpoints.js +251 -0
  44. package/dist/core/checkpoints/git-checkpoints.js.map +1 -0
  45. package/dist/core/checkpoints/session-checkpoints.d.ts +23 -0
  46. package/dist/core/checkpoints/session-checkpoints.d.ts.map +1 -0
  47. package/dist/core/checkpoints/session-checkpoints.js +36 -0
  48. package/dist/core/checkpoints/session-checkpoints.js.map +1 -0
  49. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  50. package/dist/core/compaction/branch-summarization.js +7 -3
  51. package/dist/core/compaction/branch-summarization.js.map +1 -1
  52. package/dist/core/compaction/compaction.d.ts +9 -3
  53. package/dist/core/compaction/compaction.d.ts.map +1 -1
  54. package/dist/core/compaction/compaction.js +59 -36
  55. package/dist/core/compaction/compaction.js.map +1 -1
  56. package/dist/core/defaults.d.ts +1 -0
  57. package/dist/core/defaults.d.ts.map +1 -1
  58. package/dist/core/defaults.js +9 -0
  59. package/dist/core/defaults.js.map +1 -1
  60. package/dist/core/delegation/runtime.d.ts +6 -5
  61. package/dist/core/delegation/runtime.d.ts.map +1 -1
  62. package/dist/core/delegation/runtime.js +4 -3
  63. package/dist/core/delegation/runtime.js.map +1 -1
  64. package/dist/core/durable-state/sqlite.d.ts.map +1 -1
  65. package/dist/core/durable-state/sqlite.js +26 -2
  66. package/dist/core/durable-state/sqlite.js.map +1 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +5 -2
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/extensions/index.d.ts +2 -2
  71. package/dist/core/extensions/index.d.ts.map +1 -1
  72. package/dist/core/extensions/index.js +1 -1
  73. package/dist/core/extensions/index.js.map +1 -1
  74. package/dist/core/extensions/loader.d.ts.map +1 -1
  75. package/dist/core/extensions/loader.js +123 -50
  76. package/dist/core/extensions/loader.js.map +1 -1
  77. package/dist/core/extensions/runner.d.ts +5 -0
  78. package/dist/core/extensions/runner.d.ts.map +1 -1
  79. package/dist/core/extensions/runner.js +45 -1
  80. package/dist/core/extensions/runner.js.map +1 -1
  81. package/dist/core/extensions/source-runtime.d.ts +14 -0
  82. package/dist/core/extensions/source-runtime.d.ts.map +1 -0
  83. package/dist/core/extensions/source-runtime.js +56 -0
  84. package/dist/core/extensions/source-runtime.js.map +1 -0
  85. package/dist/core/extensions/types.d.ts +60 -11
  86. package/dist/core/extensions/types.d.ts.map +1 -1
  87. package/dist/core/extensions/types.js +3 -0
  88. package/dist/core/extensions/types.js.map +1 -1
  89. package/dist/core/footer-data-provider.d.ts +1 -1
  90. package/dist/core/footer-data-provider.d.ts.map +1 -1
  91. package/dist/core/footer-data-provider.js +1 -1
  92. package/dist/core/footer-data-provider.js.map +1 -1
  93. package/dist/core/formatter-lifecycle.d.ts +69 -0
  94. package/dist/core/formatter-lifecycle.d.ts.map +1 -0
  95. package/dist/core/formatter-lifecycle.js +360 -0
  96. package/dist/core/formatter-lifecycle.js.map +1 -0
  97. package/dist/core/hooks/command-handler.d.ts +19 -0
  98. package/dist/core/hooks/command-handler.d.ts.map +1 -0
  99. package/dist/core/hooks/command-handler.js +112 -0
  100. package/dist/core/hooks/command-handler.js.map +1 -0
  101. package/dist/core/hooks/http-handler.d.ts +10 -0
  102. package/dist/core/hooks/http-handler.d.ts.map +1 -0
  103. package/dist/core/hooks/http-handler.js +36 -0
  104. package/dist/core/hooks/http-handler.js.map +1 -0
  105. package/dist/core/hooks/loader.d.ts +29 -0
  106. package/dist/core/hooks/loader.d.ts.map +1 -0
  107. package/dist/core/hooks/loader.js +139 -0
  108. package/dist/core/hooks/loader.js.map +1 -0
  109. package/dist/core/hooks/runtime.d.ts +13 -0
  110. package/dist/core/hooks/runtime.d.ts.map +1 -0
  111. package/dist/core/hooks/runtime.js +63 -0
  112. package/dist/core/hooks/runtime.js.map +1 -0
  113. package/dist/core/hooks/types.d.ts +83 -0
  114. package/dist/core/hooks/types.d.ts.map +1 -0
  115. package/dist/core/hooks/types.js +24 -0
  116. package/dist/core/hooks/types.js.map +1 -0
  117. package/dist/core/keybindings.d.ts +20 -19
  118. package/dist/core/keybindings.d.ts.map +1 -1
  119. package/dist/core/keybindings.js +26 -5
  120. package/dist/core/keybindings.js.map +1 -1
  121. package/dist/core/mcp/config.d.ts +16 -0
  122. package/dist/core/mcp/config.d.ts.map +1 -0
  123. package/dist/core/mcp/config.js +166 -0
  124. package/dist/core/mcp/config.js.map +1 -0
  125. package/dist/core/mcp/connector.d.ts +35 -0
  126. package/dist/core/mcp/connector.d.ts.map +1 -0
  127. package/dist/core/mcp/connector.js +105 -0
  128. package/dist/core/mcp/connector.js.map +1 -0
  129. package/dist/core/mcp/contract.d.ts +19 -0
  130. package/dist/core/mcp/contract.d.ts.map +1 -0
  131. package/dist/core/mcp/contract.js +89 -0
  132. package/dist/core/mcp/contract.js.map +1 -0
  133. package/dist/core/mcp/mcp-tool.d.ts +32 -0
  134. package/dist/core/mcp/mcp-tool.d.ts.map +1 -0
  135. package/dist/core/mcp/mcp-tool.js +171 -0
  136. package/dist/core/mcp/mcp-tool.js.map +1 -0
  137. package/dist/core/mcp/metadata-cache.d.ts +29 -0
  138. package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
  139. package/dist/core/mcp/metadata-cache.js +99 -0
  140. package/dist/core/mcp/metadata-cache.js.map +1 -0
  141. package/dist/core/mcp/oauth/authorize.d.ts +21 -0
  142. package/dist/core/mcp/oauth/authorize.d.ts.map +1 -0
  143. package/dist/core/mcp/oauth/authorize.js +32 -0
  144. package/dist/core/mcp/oauth/authorize.js.map +1 -0
  145. package/dist/core/mcp/oauth/discover.d.ts +27 -0
  146. package/dist/core/mcp/oauth/discover.d.ts.map +1 -0
  147. package/dist/core/mcp/oauth/discover.js +116 -0
  148. package/dist/core/mcp/oauth/discover.js.map +1 -0
  149. package/dist/core/mcp/oauth/flow.d.ts +31 -0
  150. package/dist/core/mcp/oauth/flow.d.ts.map +1 -0
  151. package/dist/core/mcp/oauth/flow.js +175 -0
  152. package/dist/core/mcp/oauth/flow.js.map +1 -0
  153. package/dist/core/mcp/oauth/mcp-token.d.ts +51 -0
  154. package/dist/core/mcp/oauth/mcp-token.d.ts.map +1 -0
  155. package/dist/core/mcp/oauth/mcp-token.js +129 -0
  156. package/dist/core/mcp/oauth/mcp-token.js.map +1 -0
  157. package/dist/core/mcp/oauth/pkce.d.ts +12 -0
  158. package/dist/core/mcp/oauth/pkce.d.ts.map +1 -0
  159. package/dist/core/mcp/oauth/pkce.js +11 -0
  160. package/dist/core/mcp/oauth/pkce.js.map +1 -0
  161. package/dist/core/mcp/oauth/register.d.ts +16 -0
  162. package/dist/core/mcp/oauth/register.d.ts.map +1 -0
  163. package/dist/core/mcp/oauth/register.js +42 -0
  164. package/dist/core/mcp/oauth/register.js.map +1 -0
  165. package/dist/core/mcp/oauth/token-client.d.ts +33 -0
  166. package/dist/core/mcp/oauth/token-client.d.ts.map +1 -0
  167. package/dist/core/mcp/oauth/token-client.js +65 -0
  168. package/dist/core/mcp/oauth/token-client.js.map +1 -0
  169. package/dist/core/mcp/runtime.d.ts +20 -0
  170. package/dist/core/mcp/runtime.d.ts.map +1 -0
  171. package/dist/core/mcp/runtime.js +37 -0
  172. package/dist/core/mcp/runtime.js.map +1 -0
  173. package/dist/core/mcp/schema.d.ts +22 -0
  174. package/dist/core/mcp/schema.d.ts.map +1 -0
  175. package/dist/core/mcp/schema.js +20 -0
  176. package/dist/core/mcp/schema.js.map +1 -0
  177. package/dist/core/mcp/server-manager.d.ts +43 -0
  178. package/dist/core/mcp/server-manager.d.ts.map +1 -0
  179. package/dist/core/mcp/server-manager.js +142 -0
  180. package/dist/core/mcp/server-manager.js.map +1 -0
  181. package/dist/core/mcp/types.d.ts +100 -0
  182. package/dist/core/mcp/types.d.ts.map +1 -0
  183. package/dist/core/mcp/types.js +8 -0
  184. package/dist/core/mcp/types.js.map +1 -0
  185. package/dist/core/model-config.d.ts +5 -0
  186. package/dist/core/model-config.d.ts.map +1 -1
  187. package/dist/core/model-config.js +3 -1
  188. package/dist/core/model-config.js.map +1 -1
  189. package/dist/core/model-resolver.d.ts +1 -0
  190. package/dist/core/model-resolver.d.ts.map +1 -1
  191. package/dist/core/model-resolver.js +14 -8
  192. package/dist/core/model-resolver.js.map +1 -1
  193. package/dist/core/models-store.d.ts.map +1 -1
  194. package/dist/core/models-store.js +2 -1
  195. package/dist/core/models-store.js.map +1 -1
  196. package/dist/core/package-manager.d.ts.map +1 -1
  197. package/dist/core/package-manager.js +22 -14
  198. package/dist/core/package-manager.js.map +1 -1
  199. package/dist/core/permissions/gate.d.ts.map +1 -1
  200. package/dist/core/permissions/gate.js +45 -4
  201. package/dist/core/permissions/gate.js.map +1 -1
  202. package/dist/core/permissions/operations.d.ts +20 -0
  203. package/dist/core/permissions/operations.d.ts.map +1 -0
  204. package/dist/core/permissions/operations.js +9 -0
  205. package/dist/core/permissions/operations.js.map +1 -0
  206. package/dist/core/permissions/policy-command.d.ts +42 -0
  207. package/dist/core/permissions/policy-command.d.ts.map +1 -0
  208. package/dist/core/permissions/policy-command.js +44 -0
  209. package/dist/core/permissions/policy-command.js.map +1 -0
  210. package/dist/core/permissions/responder.d.ts +49 -2
  211. package/dist/core/permissions/responder.d.ts.map +1 -1
  212. package/dist/core/permissions/responder.js +20 -8
  213. package/dist/core/permissions/responder.js.map +1 -1
  214. package/dist/core/permissions/rules.d.ts.map +1 -1
  215. package/dist/core/permissions/rules.js +11 -1
  216. package/dist/core/permissions/rules.js.map +1 -1
  217. package/dist/core/permissions/store.d.ts +18 -0
  218. package/dist/core/permissions/store.d.ts.map +1 -1
  219. package/dist/core/permissions/store.js +89 -8
  220. package/dist/core/permissions/store.js.map +1 -1
  221. package/dist/core/pi-manifest.d.ts.map +1 -1
  222. package/dist/core/pi-manifest.js +2 -1
  223. package/dist/core/pi-manifest.js.map +1 -1
  224. package/dist/core/policy-executor.d.ts +47 -0
  225. package/dist/core/policy-executor.d.ts.map +1 -0
  226. package/dist/core/policy-executor.js +228 -0
  227. package/dist/core/policy-executor.js.map +1 -0
  228. package/dist/core/policy-loader.d.ts +72 -0
  229. package/dist/core/policy-loader.d.ts.map +1 -0
  230. package/dist/core/policy-loader.js +195 -0
  231. package/dist/core/policy-loader.js.map +1 -0
  232. package/dist/core/project-trust.d.ts +1 -1
  233. package/dist/core/project-trust.d.ts.map +1 -1
  234. package/dist/core/project-trust.js.map +1 -1
  235. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  236. package/dist/core/remote-catalog-provider.js +2 -1
  237. package/dist/core/remote-catalog-provider.js.map +1 -1
  238. package/dist/core/resource-loader.d.ts.map +1 -1
  239. package/dist/core/resource-loader.js +3 -2
  240. package/dist/core/resource-loader.js.map +1 -1
  241. package/dist/core/sandbox/bwrap-arguments.d.ts +41 -0
  242. package/dist/core/sandbox/bwrap-arguments.d.ts.map +1 -0
  243. package/dist/core/sandbox/bwrap-arguments.js +136 -0
  244. package/dist/core/sandbox/bwrap-arguments.js.map +1 -0
  245. package/dist/core/sandbox/child-entry.d.ts.map +1 -1
  246. package/dist/core/sandbox/child-entry.js +3 -1
  247. package/dist/core/sandbox/child-entry.js.map +1 -1
  248. package/dist/core/sandbox/cli-launch.d.ts +84 -4
  249. package/dist/core/sandbox/cli-launch.d.ts.map +1 -1
  250. package/dist/core/sandbox/cli-launch.js +115 -16
  251. package/dist/core/sandbox/cli-launch.js.map +1 -1
  252. package/dist/core/sandbox/cli-supervisor.d.ts +2 -0
  253. package/dist/core/sandbox/cli-supervisor.d.ts.map +1 -1
  254. package/dist/core/sandbox/cli-supervisor.js +50 -2
  255. package/dist/core/sandbox/cli-supervisor.js.map +1 -1
  256. package/dist/core/sandbox/full-access.d.ts +28 -0
  257. package/dist/core/sandbox/full-access.d.ts.map +1 -0
  258. package/dist/core/sandbox/full-access.js +63 -0
  259. package/dist/core/sandbox/full-access.js.map +1 -0
  260. package/dist/core/sandbox/git-identity.d.ts +57 -0
  261. package/dist/core/sandbox/git-identity.d.ts.map +1 -0
  262. package/dist/core/sandbox/git-identity.js +78 -0
  263. package/dist/core/sandbox/git-identity.js.map +1 -0
  264. package/dist/core/sandbox/host-approval.d.ts +42 -0
  265. package/dist/core/sandbox/host-approval.d.ts.map +1 -0
  266. package/dist/core/sandbox/host-approval.js +99 -0
  267. package/dist/core/sandbox/host-approval.js.map +1 -0
  268. package/dist/core/sandbox/linux-backend.d.ts +14 -0
  269. package/dist/core/sandbox/linux-backend.d.ts.map +1 -1
  270. package/dist/core/sandbox/linux-backend.js +158 -80
  271. package/dist/core/sandbox/linux-backend.js.map +1 -1
  272. package/dist/core/sandbox/macos-backend.d.ts +5 -0
  273. package/dist/core/sandbox/macos-backend.d.ts.map +1 -1
  274. package/dist/core/sandbox/macos-backend.js +164 -5
  275. package/dist/core/sandbox/macos-backend.js.map +1 -1
  276. package/dist/core/sandbox/network-proxy.d.ts +19 -0
  277. package/dist/core/sandbox/network-proxy.d.ts.map +1 -1
  278. package/dist/core/sandbox/network-proxy.js +93 -19
  279. package/dist/core/sandbox/network-proxy.js.map +1 -1
  280. package/dist/core/sandbox/policy.d.ts +8 -0
  281. package/dist/core/sandbox/policy.d.ts.map +1 -1
  282. package/dist/core/sandbox/policy.js +29 -12
  283. package/dist/core/sandbox/policy.js.map +1 -1
  284. package/dist/core/sandbox/profiles.d.ts +25 -0
  285. package/dist/core/sandbox/profiles.d.ts.map +1 -0
  286. package/dist/core/sandbox/profiles.js +23 -0
  287. package/dist/core/sandbox/profiles.js.map +1 -0
  288. package/dist/core/sandbox/rpc/command-client.d.ts +28 -0
  289. package/dist/core/sandbox/rpc/command-client.d.ts.map +1 -0
  290. package/dist/core/sandbox/rpc/command-client.js +86 -0
  291. package/dist/core/sandbox/rpc/command-client.js.map +1 -0
  292. package/dist/core/sandbox/rpc/command-proxy.d.ts +48 -0
  293. package/dist/core/sandbox/rpc/command-proxy.d.ts.map +1 -0
  294. package/dist/core/sandbox/rpc/command-proxy.js +120 -0
  295. package/dist/core/sandbox/rpc/command-proxy.js.map +1 -0
  296. package/dist/core/sandbox/rpc/credential-proxy.d.ts.map +1 -1
  297. package/dist/core/sandbox/rpc/credential-proxy.js +2 -96
  298. package/dist/core/sandbox/rpc/credential-proxy.js.map +1 -1
  299. package/dist/core/sandbox/rpc/framing.d.ts +35 -0
  300. package/dist/core/sandbox/rpc/framing.d.ts.map +1 -0
  301. package/dist/core/sandbox/rpc/framing.js +114 -0
  302. package/dist/core/sandbox/rpc/framing.js.map +1 -0
  303. package/dist/core/sandbox/rpc/git-credential-helper.d.ts +47 -0
  304. package/dist/core/sandbox/rpc/git-credential-helper.d.ts.map +1 -0
  305. package/dist/core/sandbox/rpc/git-credential-helper.js +222 -0
  306. package/dist/core/sandbox/rpc/git-credential-helper.js.map +1 -0
  307. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts +66 -0
  308. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts.map +1 -0
  309. package/dist/core/sandbox/rpc/git-credential-proxy.js +209 -0
  310. package/dist/core/sandbox/rpc/git-credential-proxy.js.map +1 -0
  311. package/dist/core/sandbox/supervisor-temp.d.ts +18 -0
  312. package/dist/core/sandbox/supervisor-temp.d.ts.map +1 -0
  313. package/dist/core/sandbox/supervisor-temp.js +21 -0
  314. package/dist/core/sandbox/supervisor-temp.js.map +1 -0
  315. package/dist/core/sandbox/supervisor.d.ts +12 -1
  316. package/dist/core/sandbox/supervisor.d.ts.map +1 -1
  317. package/dist/core/sandbox/supervisor.js +15 -1
  318. package/dist/core/sandbox/supervisor.js.map +1 -1
  319. package/dist/core/sandbox/terminal-handoff.d.ts +68 -0
  320. package/dist/core/sandbox/terminal-handoff.d.ts.map +1 -0
  321. package/dist/core/sandbox/terminal-handoff.js +221 -0
  322. package/dist/core/sandbox/terminal-handoff.js.map +1 -0
  323. package/dist/core/sandbox/terminal-size.d.ts +13 -0
  324. package/dist/core/sandbox/terminal-size.d.ts.map +1 -1
  325. package/dist/core/sandbox/terminal-size.js +23 -2
  326. package/dist/core/sandbox/terminal-size.js.map +1 -1
  327. package/dist/core/sdk.d.ts +24 -2
  328. package/dist/core/sdk.d.ts.map +1 -1
  329. package/dist/core/sdk.js +63 -4
  330. package/dist/core/sdk.js.map +1 -1
  331. package/dist/core/session-export.d.ts +4 -0
  332. package/dist/core/session-export.d.ts.map +1 -0
  333. package/dist/core/session-export.js +32 -0
  334. package/dist/core/session-export.js.map +1 -0
  335. package/dist/core/session-manager.d.ts +13 -1
  336. package/dist/core/session-manager.d.ts.map +1 -1
  337. package/dist/core/session-manager.js +34 -6
  338. package/dist/core/session-manager.js.map +1 -1
  339. package/dist/core/settings-diagnostics.d.ts +9 -0
  340. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  341. package/dist/core/settings-diagnostics.js +21 -0
  342. package/dist/core/settings-diagnostics.js.map +1 -0
  343. package/dist/core/settings-manager.d.ts +172 -1
  344. package/dist/core/settings-manager.d.ts.map +1 -1
  345. package/dist/core/settings-manager.js +160 -11
  346. package/dist/core/settings-manager.js.map +1 -1
  347. package/dist/core/skills.d.ts.map +1 -1
  348. package/dist/core/skills.js +51 -33
  349. package/dist/core/skills.js.map +1 -1
  350. package/dist/core/slash-commands.d.ts.map +1 -1
  351. package/dist/core/slash-commands.js +4 -1
  352. package/dist/core/slash-commands.js.map +1 -1
  353. package/dist/core/system-prompt.d.ts.map +1 -1
  354. package/dist/core/system-prompt.js +8 -2
  355. package/dist/core/system-prompt.js.map +1 -1
  356. package/dist/core/tools/background-shell.d.ts +39 -0
  357. package/dist/core/tools/background-shell.d.ts.map +1 -0
  358. package/dist/core/tools/background-shell.js +81 -0
  359. package/dist/core/tools/background-shell.js.map +1 -0
  360. package/dist/core/tools/bash-command-segments.d.ts.map +1 -1
  361. package/dist/core/tools/bash-command-segments.js +2 -0
  362. package/dist/core/tools/bash-command-segments.js.map +1 -1
  363. package/dist/core/tools/bash.d.ts +44 -16
  364. package/dist/core/tools/bash.d.ts.map +1 -1
  365. package/dist/core/tools/bash.js +264 -32
  366. package/dist/core/tools/bash.js.map +1 -1
  367. package/dist/core/tools/contract-snapshot.d.ts +58 -0
  368. package/dist/core/tools/contract-snapshot.d.ts.map +1 -0
  369. package/dist/core/tools/contract-snapshot.js +51 -0
  370. package/dist/core/tools/contract-snapshot.js.map +1 -0
  371. package/dist/core/tools/contract.d.ts +53 -5
  372. package/dist/core/tools/contract.d.ts.map +1 -1
  373. package/dist/core/tools/contract.js +22 -2
  374. package/dist/core/tools/contract.js.map +1 -1
  375. package/dist/core/tools/delegate.d.ts +6 -4
  376. package/dist/core/tools/delegate.d.ts.map +1 -1
  377. package/dist/core/tools/delegate.js +21 -11
  378. package/dist/core/tools/delegate.js.map +1 -1
  379. package/dist/core/tools/edit-diff.d.ts +48 -5
  380. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  381. package/dist/core/tools/edit-diff.js +217 -8
  382. package/dist/core/tools/edit-diff.js.map +1 -1
  383. package/dist/core/tools/edit.d.ts +8 -0
  384. package/dist/core/tools/edit.d.ts.map +1 -1
  385. package/dist/core/tools/edit.js +72 -10
  386. package/dist/core/tools/edit.js.map +1 -1
  387. package/dist/core/tools/find.d.ts.map +1 -1
  388. package/dist/core/tools/find.js +5 -2
  389. package/dist/core/tools/find.js.map +1 -1
  390. package/dist/core/tools/grep.d.ts.map +1 -1
  391. package/dist/core/tools/grep.js +5 -2
  392. package/dist/core/tools/grep.js.map +1 -1
  393. package/dist/core/tools/index.d.ts +14 -2
  394. package/dist/core/tools/index.d.ts.map +1 -1
  395. package/dist/core/tools/index.js +12 -0
  396. package/dist/core/tools/index.js.map +1 -1
  397. package/dist/core/tools/ls.d.ts.map +1 -1
  398. package/dist/core/tools/ls.js +5 -2
  399. package/dist/core/tools/ls.js.map +1 -1
  400. package/dist/core/tools/lsp.d.ts +19 -1
  401. package/dist/core/tools/lsp.d.ts.map +1 -1
  402. package/dist/core/tools/lsp.js +163 -10
  403. package/dist/core/tools/lsp.js.map +1 -1
  404. package/dist/core/tools/path-permission.d.ts +3 -0
  405. package/dist/core/tools/path-permission.d.ts.map +1 -1
  406. package/dist/core/tools/path-permission.js +16 -4
  407. package/dist/core/tools/path-permission.js.map +1 -1
  408. package/dist/core/tools/path-utils.d.ts +27 -2
  409. package/dist/core/tools/path-utils.d.ts.map +1 -1
  410. package/dist/core/tools/path-utils.js +221 -4
  411. package/dist/core/tools/path-utils.js.map +1 -1
  412. package/dist/core/tools/powershell.d.ts +16 -0
  413. package/dist/core/tools/powershell.d.ts.map +1 -0
  414. package/dist/core/tools/powershell.js +39 -0
  415. package/dist/core/tools/powershell.js.map +1 -0
  416. package/dist/core/tools/read.d.ts.map +1 -1
  417. package/dist/core/tools/read.js +20 -11
  418. package/dist/core/tools/read.js.map +1 -1
  419. package/dist/core/tools/test.d.ts +54 -9
  420. package/dist/core/tools/test.d.ts.map +1 -1
  421. package/dist/core/tools/test.js +239 -19
  422. package/dist/core/tools/test.js.map +1 -1
  423. package/dist/core/tools/write.d.ts +7 -0
  424. package/dist/core/tools/write.d.ts.map +1 -1
  425. package/dist/core/tools/write.js +64 -9
  426. package/dist/core/tools/write.js.map +1 -1
  427. package/dist/core/trust-manager.d.ts.map +1 -1
  428. package/dist/core/trust-manager.js +2 -1
  429. package/dist/core/trust-manager.js.map +1 -1
  430. package/dist/core/verification-lifecycle.d.ts +77 -0
  431. package/dist/core/verification-lifecycle.d.ts.map +1 -0
  432. package/dist/core/verification-lifecycle.js +146 -0
  433. package/dist/core/verification-lifecycle.js.map +1 -0
  434. package/dist/core/workspace/artifacts.d.ts +45 -0
  435. package/dist/core/workspace/artifacts.d.ts.map +1 -0
  436. package/dist/core/workspace/artifacts.js +165 -0
  437. package/dist/core/workspace/artifacts.js.map +1 -0
  438. package/dist/core/workspace/comparison.d.ts +27 -0
  439. package/dist/core/workspace/comparison.d.ts.map +1 -0
  440. package/dist/core/workspace/comparison.js +94 -0
  441. package/dist/core/workspace/comparison.js.map +1 -0
  442. package/dist/core/workspace/git-observer.d.ts +48 -0
  443. package/dist/core/workspace/git-observer.d.ts.map +1 -0
  444. package/dist/core/workspace/git-observer.js +346 -0
  445. package/dist/core/workspace/git-observer.js.map +1 -0
  446. package/dist/core/workspace/projection.d.ts +3 -0
  447. package/dist/core/workspace/projection.d.ts.map +1 -0
  448. package/dist/core/workspace/projection.js +56 -0
  449. package/dist/core/workspace/projection.js.map +1 -0
  450. package/dist/core/workspace/state.d.ts +133 -0
  451. package/dist/core/workspace/state.d.ts.map +1 -0
  452. package/dist/core/workspace/state.js +96 -0
  453. package/dist/core/workspace/state.js.map +1 -0
  454. package/dist/extensions/llama/client.d.ts +6 -0
  455. package/dist/extensions/llama/client.d.ts.map +1 -1
  456. package/dist/extensions/llama/client.js +7 -0
  457. package/dist/extensions/llama/client.js.map +1 -1
  458. package/dist/extensions/llama/index.d.ts.map +1 -1
  459. package/dist/extensions/llama/index.js +2 -0
  460. package/dist/extensions/llama/index.js.map +1 -1
  461. package/dist/extensions/llama/provider.d.ts +3 -1
  462. package/dist/extensions/llama/provider.d.ts.map +1 -1
  463. package/dist/extensions/llama/provider.js +29 -4
  464. package/dist/extensions/llama/provider.js.map +1 -1
  465. package/dist/index.d.ts +8 -5
  466. package/dist/index.d.ts.map +1 -1
  467. package/dist/index.js +7 -4
  468. package/dist/index.js.map +1 -1
  469. package/dist/main.d.ts +6 -0
  470. package/dist/main.d.ts.map +1 -1
  471. package/dist/main.js +58 -23
  472. package/dist/main.js.map +1 -1
  473. package/dist/migrations.d.ts.map +1 -1
  474. package/dist/migrations.js +4 -3
  475. package/dist/migrations.js.map +1 -1
  476. package/dist/modes/acp/server.d.ts +55 -0
  477. package/dist/modes/acp/server.d.ts.map +1 -0
  478. package/dist/modes/acp/server.js +244 -0
  479. package/dist/modes/acp/server.js.map +1 -0
  480. package/dist/modes/acp/translate.d.ts +37 -0
  481. package/dist/modes/acp/translate.d.ts.map +1 -0
  482. package/dist/modes/acp/translate.js +50 -0
  483. package/dist/modes/acp/translate.js.map +1 -0
  484. package/dist/modes/index.d.ts +1 -0
  485. package/dist/modes/index.d.ts.map +1 -1
  486. package/dist/modes/index.js +1 -0
  487. package/dist/modes/index.js.map +1 -1
  488. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  489. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/assistant-message.js +182 -23
  491. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  492. package/dist/modes/interactive/components/bash-execution.d.ts +7 -0
  493. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  494. package/dist/modes/interactive/components/bash-execution.js +20 -0
  495. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  496. package/dist/modes/interactive/components/custom-editor.d.ts +9 -4
  497. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  498. package/dist/modes/interactive/components/custom-editor.js +20 -9
  499. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  500. package/dist/modes/interactive/components/extension-selector.d.ts +7 -1
  501. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/extension-selector.js +7 -3
  503. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  504. package/dist/modes/interactive/components/footer.d.ts +19 -0
  505. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/footer.js +70 -10
  507. package/dist/modes/interactive/components/footer.js.map +1 -1
  508. package/dist/modes/interactive/components/model-selector.d.ts +10 -3
  509. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/model-selector.js +56 -14
  511. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  512. package/dist/modes/interactive/components/permission-preview.d.ts +15 -0
  513. package/dist/modes/interactive/components/permission-preview.d.ts.map +1 -0
  514. package/dist/modes/interactive/components/permission-preview.js +33 -0
  515. package/dist/modes/interactive/components/permission-preview.js.map +1 -0
  516. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  517. package/dist/modes/interactive/components/session-selector.js +2 -2
  518. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  519. package/dist/modes/interactive/components/settings-selector.d.ts +9 -2
  520. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/settings-selector.js +128 -56
  522. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  523. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  524. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  525. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  526. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  527. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  528. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  530. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  531. package/dist/modes/interactive/components/tool-execution.d.ts +23 -1
  532. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/tool-execution.js +64 -10
  534. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  535. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  536. package/dist/modes/interactive/external-editor.js +2 -1
  537. package/dist/modes/interactive/external-editor.js.map +1 -1
  538. package/dist/modes/interactive/interactive-mode.d.ts +45 -0
  539. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  540. package/dist/modes/interactive/interactive-mode.js +395 -43
  541. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  542. package/dist/modes/interactive/theme/theme.d.ts +12 -0
  543. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  544. package/dist/modes/interactive/theme/theme.js +20 -9
  545. package/dist/modes/interactive/theme/theme.js.map +1 -1
  546. package/dist/modes/json-event.d.ts +16 -13
  547. package/dist/modes/json-event.d.ts.map +1 -1
  548. package/dist/modes/json-event.js +20 -6
  549. package/dist/modes/json-event.js.map +1 -1
  550. package/dist/modes/print-mode.d.ts.map +1 -1
  551. package/dist/modes/print-mode.js +27 -12
  552. package/dist/modes/print-mode.js.map +1 -1
  553. package/dist/modes/rpc/rpc-client.d.ts +7 -0
  554. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  555. package/dist/modes/rpc/rpc-client.js +7 -0
  556. package/dist/modes/rpc/rpc-client.js.map +1 -1
  557. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  558. package/dist/modes/rpc/rpc-mode.js +3 -0
  559. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  560. package/dist/modes/rpc/rpc-types.d.ts +12 -0
  561. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  562. package/dist/modes/rpc/rpc-types.js.map +1 -1
  563. package/dist/package-manager-cli.d.ts +1 -0
  564. package/dist/package-manager-cli.d.ts.map +1 -1
  565. package/dist/package-manager-cli.js +196 -10
  566. package/dist/package-manager-cli.js.map +1 -1
  567. package/dist/utils/frontmatter.d.ts.map +1 -1
  568. package/dist/utils/frontmatter.js +2 -1
  569. package/dist/utils/frontmatter.js.map +1 -1
  570. package/dist/utils/management-http.d.ts +5 -3
  571. package/dist/utils/management-http.d.ts.map +1 -1
  572. package/dist/utils/management-http.js +14 -10
  573. package/dist/utils/management-http.js.map +1 -1
  574. package/dist/utils/shell.d.ts +3 -0
  575. package/dist/utils/shell.d.ts.map +1 -1
  576. package/dist/utils/shell.js +23 -9
  577. package/dist/utils/shell.js.map +1 -1
  578. package/dist/utils/syntax-highlight.d.ts +1 -0
  579. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  580. package/dist/utils/syntax-highlight.js +60 -1
  581. package/dist/utils/syntax-highlight.js.map +1 -1
  582. package/dist/utils/text.d.ts +8 -0
  583. package/dist/utils/text.d.ts.map +1 -0
  584. package/dist/utils/text.js +9 -0
  585. package/dist/utils/text.js.map +1 -0
  586. package/dist/utils/version-check.d.ts.map +1 -1
  587. package/dist/utils/version-check.js +6 -4
  588. package/dist/utils/version-check.js.map +1 -1
  589. package/docs/compaction.md +19 -0
  590. package/docs/custom-provider.md +12 -9
  591. package/docs/environment-variables.md +1 -1
  592. package/docs/extensions.md +35 -7
  593. package/docs/json.md +7 -2
  594. package/docs/keybindings.md +9 -9
  595. package/docs/llama-cpp.md +2 -0
  596. package/docs/models.md +8 -2
  597. package/docs/packages.md +2 -2
  598. package/docs/quickstart.md +1 -1
  599. package/docs/rpc.md +32 -3
  600. package/docs/sdk.md +32 -2
  601. package/docs/settings.md +23 -7
  602. package/docs/skills.md +4 -3
  603. package/docs/terminal-setup.md +23 -7
  604. package/docs/usage.md +10 -5
  605. package/docs/windows.md +24 -2
  606. package/examples/extensions/border-status-editor.ts +1 -1
  607. package/examples/extensions/built-in-tool-renderer.ts +8 -4
  608. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  609. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  610. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  611. package/examples/extensions/git-checkpoint.ts +24 -36
  612. package/examples/extensions/gondolin/package-lock.json +2 -2
  613. package/examples/extensions/gondolin/package.json +1 -1
  614. package/examples/extensions/minimal-mode.ts +2 -2
  615. package/examples/extensions/notify.ts +3 -1
  616. package/examples/extensions/permission-gate.ts +1 -1
  617. package/examples/extensions/plan-mode/index.ts +1 -1
  618. package/examples/extensions/rpc-demo.ts +1 -1
  619. package/examples/extensions/sandbox/package-lock.json +2 -2
  620. package/examples/extensions/sandbox/package.json +1 -1
  621. package/examples/extensions/subagent/README.md +1 -1
  622. package/examples/extensions/subagent/index.ts +6 -1
  623. package/examples/extensions/titlebar-spinner.ts +1 -1
  624. package/examples/extensions/with-deps/package-lock.json +2 -2
  625. package/examples/extensions/with-deps/package.json +1 -1
  626. package/examples/rpc-extension-ui.ts +1 -1
  627. package/examples/sdk/06-extensions.ts +1 -1
  628. package/examples/sdk/README.md +1 -1
  629. package/npm-shrinkwrap.json +439 -405
  630. package/package.json +17 -17
  631. package/dist/server/create-harness.d.ts +0 -26
  632. package/dist/server/create-harness.d.ts.map +0 -1
  633. package/dist/server/create-harness.js +0 -107
  634. package/dist/server/create-harness.js.map +0 -1
@@ -11,7 +11,10 @@ import { waitForChildProcess } from "../../utils/child-process.js";
11
11
  import { getShellConfig, getShellEnv, killProcessTree, trackDetachedChildPid, untrackDetachedChildPid, } from "../../utils/shell.js";
12
12
  import { setApexEnvironment } from "../environment.js";
13
13
  import { getExperimentalToolSampling } from "../experimental.js";
14
+ import { escalationRootFor, extractRefusedPath, looksLikeSandboxRefusal, requestCommandEscalation, } from "../sandbox/rpc/command-client.js";
15
+ import { createBackgroundShellRegistry } from "./background-shell.js";
14
16
  import { classifyBashCommand } from "./bash-command-segments.js";
17
+ import { toolUnion } from "./contract.js";
15
18
  import { OutputAccumulator } from "./output-accumulator.js";
16
19
  import { getTextOutput, invalidArgText, str } from "./render-utils.js";
17
20
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
@@ -30,10 +33,26 @@ function resolveTimeoutMs(timeout) {
30
33
  }
31
34
  return timeoutMs;
32
35
  }
33
- const bashSchema = Type.Object({
34
- command: Type.String({ description: "Bash command to execute" }),
36
+ const bashSchemaProperties = {
37
+ command: Type.String({ description: "Shell command to execute" }),
35
38
  timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional, no default timeout)" })),
36
- });
39
+ background: Type.Optional(Type.Boolean({
40
+ description: "Run in the background and return a handle immediately. Retrieve with { handle }; kill with { handle, kill: true }.",
41
+ })),
42
+ handle: Type.String({
43
+ description: "Handle from a background launch. Supply it alone to retrieve output and status; add kill: true to terminate.",
44
+ }),
45
+ kill: Type.Literal(true, { description: "Set to true with a background handle to terminate its command." }),
46
+ };
47
+ const bashSchema = toolUnion([
48
+ Type.Object({
49
+ command: Type.String(),
50
+ timeout: Type.Optional(Type.Number()),
51
+ background: Type.Optional(Type.Boolean()),
52
+ }),
53
+ Type.Object({ handle: Type.String() }),
54
+ Type.Object({ handle: Type.String(), kill: Type.Literal(true) }),
55
+ ], bashSchemaProperties);
37
56
  export const bashToolSystemPromptContribution = {
38
57
  snippet: "Execute bash commands (ls, grep, find, etc.)",
39
58
  guidelines: ["You can inspect PI_* environment variables for current model and session details."],
@@ -48,9 +67,13 @@ function normalizeSegment(text) {
48
67
  * matches `git commit` and `git commit -m x`, but not `git commitment` (word
49
68
  * boundary enforced) and not an unrelated segment in the same chained command.
50
69
  */
70
+ function hasGrammarSensitiveStructure(value) {
71
+ return /["'\\\t\n#]/.test(value);
72
+ }
51
73
  function segmentMatchesRule(segment, ruleContent) {
52
- const normalizedSegment = normalizeSegment(segment);
53
- const normalizedRule = normalizeSegment(ruleContent);
74
+ const sensitive = hasGrammarSensitiveStructure(segment) || hasGrammarSensitiveStructure(ruleContent);
75
+ const normalizedSegment = sensitive ? segment : normalizeSegment(segment);
76
+ const normalizedRule = sensitive ? ruleContent : normalizeSegment(ruleContent);
54
77
  if (normalizedRule.endsWith(":*")) {
55
78
  const prefix = normalizedRule.slice(0, -2).trim();
56
79
  if (!prefix)
@@ -71,45 +94,78 @@ function segmentMatchesRule(segment, ruleContent) {
71
94
  * one would either over-authorize (if loose) or be indistinguishable from an exact
72
95
  * match (if not) — `null` correctly forces `ask` for "always allow this" on a chain.
73
96
  */
97
+ /**
98
+ * Reserved rule content for retrieve/kill calls on background handles. These
99
+ * perform no new execution -- the command they operate on was already gated at
100
+ * launch -- so `defaultBehaviorFor` allows them when no rule matches, while a
101
+ * `Bash(background-handle)` rule (allow *or* deny) still governs them
102
+ * explicitly.
103
+ */
104
+ const BACKGROUND_HANDLE_RULE = "background-handle";
74
105
  export function createBashPermissionSpec() {
75
106
  return {
76
107
  defaultBehavior: "ask",
108
+ defaultBehaviorFor(params) {
109
+ return "command" in params ? undefined : "allow";
110
+ },
77
111
  matches(ruleContent, params) {
112
+ if (!("command" in params))
113
+ return ruleContent === BACKGROUND_HANDLE_RULE;
78
114
  const classification = classifyBashCommand(params.command);
79
- if (classification.type !== "segments")
80
- return false;
81
- return classification.segments.every((segment) => segmentMatchesRule(segment, ruleContent));
115
+ return (classification.type === "segments" &&
116
+ classification.segments.every((segment) => segmentMatchesRule(segment, ruleContent)));
117
+ },
118
+ matchesDeny(ruleContent, params) {
119
+ if (!("command" in params))
120
+ return ruleContent === BACKGROUND_HANDLE_RULE;
121
+ const classification = classifyBashCommand(params.command);
122
+ return (classification.type === "segments" &&
123
+ classification.segments.some((segment) => segmentMatchesRule(segment, ruleContent)));
124
+ },
125
+ isUnknown(params) {
126
+ return "command" in params && classifyBashCommand(params.command).type !== "segments";
82
127
  },
83
128
  describe(ruleContent) {
129
+ if (ruleContent === BACKGROUND_HANDLE_RULE) {
130
+ return "Retrieve or kill background shell commands";
131
+ }
84
132
  return `Run bash commands matching "${ruleContent}"`;
85
133
  },
134
+ previewCall(params) {
135
+ // The command string is the entire effect being authorized. There is
136
+ // nothing to read and nothing to summarise: showing it exactly, including
137
+ // whitespace the rule grammar treats as significant, is the preview.
138
+ if (!("command" in params)) {
139
+ return { kind: "summary", lines: ["Retrieve or kill a background shell command"] };
140
+ }
141
+ return { kind: "summary", lines: [String(params.command)] };
142
+ },
86
143
  ruleForCall(params) {
144
+ if (!("command" in params)) {
145
+ return BACKGROUND_HANDLE_RULE;
146
+ }
87
147
  const classification = classifyBashCommand(params.command);
88
148
  if (classification.type !== "segments" || classification.segments.length !== 1)
89
149
  return null;
90
- return normalizeSegment(classification.segments[0]);
150
+ const segment = classification.segments[0];
151
+ return hasGrammarSensitiveStructure(segment) ? segment : normalizeSegment(segment);
91
152
  },
92
153
  };
93
154
  }
94
- /**
95
- * Create bash operations using pi's built-in local shell execution backend.
96
- *
97
- * This is useful for extensions that intercept user_bash and still want pi's
98
- * standard local shell behavior while wrapping or rewriting commands.
99
- */
100
- export function createLocalBashOperations(options) {
155
+ /** Shared process execution used by the built-in shell tools. */
156
+ export function createLocalShellOperations(shellName, resolveShellConfig) {
101
157
  return {
102
158
  exec: async (command, cwd, { onData, signal, timeout, env }) => {
103
159
  const timeoutMs = resolveTimeoutMs(timeout);
104
160
  if (signal?.aborted) {
105
161
  throw new Error("aborted");
106
162
  }
107
- const shellConfig = getShellConfig(options?.shellPath);
163
+ const shellConfig = resolveShellConfig();
108
164
  try {
109
165
  await fsAccess(cwd, constants.F_OK);
110
166
  }
111
167
  catch {
112
- throw new Error(`Working directory does not exist: ${cwd}\nCannot execute bash commands.`);
168
+ throw new Error(`Working directory does not exist: ${cwd}\nCannot execute ${shellName} commands.`);
113
169
  }
114
170
  const commandFromStdin = shellConfig.commandTransport === "stdin";
115
171
  const child = spawn(shellConfig.shell, commandFromStdin ? shellConfig.args : [...shellConfig.args, command], {
@@ -174,8 +230,47 @@ export function createLocalBashOperations(options) {
174
230
  signal.removeEventListener("abort", onAbort);
175
231
  }
176
232
  },
233
+ spawnBackground: async (command, cwd, { onData, env }) => {
234
+ const shellConfig = resolveShellConfig();
235
+ try {
236
+ await fsAccess(cwd, constants.F_OK);
237
+ }
238
+ catch {
239
+ throw new Error(`Working directory does not exist: ${cwd}\nCannot execute ${shellName} commands.`);
240
+ }
241
+ const commandFromStdin = shellConfig.commandTransport === "stdin";
242
+ const child = spawn(shellConfig.shell, commandFromStdin ? shellConfig.args : [...shellConfig.args, command], {
243
+ cwd,
244
+ detached: process.platform !== "win32",
245
+ env: env ?? getShellEnv(),
246
+ stdio: [commandFromStdin ? "pipe" : "ignore", "pipe", "pipe"],
247
+ windowsHide: true,
248
+ });
249
+ if (commandFromStdin) {
250
+ child.stdin?.on("error", () => { });
251
+ child.stdin?.end(command);
252
+ }
253
+ if (child.pid)
254
+ trackDetachedChildPid(child.pid);
255
+ child.stdout?.on("data", onData);
256
+ child.stderr?.on("data", onData);
257
+ const exited = waitForChildProcess(child).finally(() => {
258
+ if (child.pid)
259
+ untrackDetachedChildPid(child.pid);
260
+ });
261
+ return { pid: child.pid, exited };
262
+ },
177
263
  };
178
264
  }
265
+ /**
266
+ * Create bash operations using pi's built-in local shell execution backend.
267
+ *
268
+ * This is useful for extensions that intercept user_bash and still want pi's
269
+ * standard local shell behavior while wrapping or rewriting commands.
270
+ */
271
+ export function createLocalBashOperations(options) {
272
+ return createLocalShellOperations("bash", () => getShellConfig(options?.shellPath));
273
+ }
179
274
  function resolveSpawnContext(command, cwd, spawnHook, exposeSessionEnvironment, ctx) {
180
275
  const env = { ...getShellEnv() };
181
276
  setApexEnvironment("APEX_CODE_SESSION_ID", undefined, env);
@@ -211,12 +306,17 @@ class BashResultRenderComponent extends Container {
211
306
  function formatDuration(ms) {
212
307
  return `${(ms / 1000).toFixed(1)}s`;
213
308
  }
214
- function formatBashCall(args) {
309
+ function formatShellCall(args, prompt) {
215
310
  const command = str(args?.command);
311
+ const handle = str(args?.handle);
312
+ if (!command && handle) {
313
+ const suffix = args?.kill === true ? " · kill" : "";
314
+ return theme.fg("toolTitle", theme.bold(`${prompt} ${handle}${suffix}`));
315
+ }
216
316
  const timeout = args?.timeout;
217
317
  const timeoutSuffix = timeout ? theme.fg("muted", ` (timeout ${timeout}s)`) : "";
218
318
  const commandDisplay = command === null ? invalidArgText(theme) : command ? command : theme.fg("toolOutput", "...");
219
- return theme.fg("toolTitle", theme.bold(`$ ${commandDisplay}`)) + timeoutSuffix;
319
+ return theme.fg("toolTitle", theme.bold(`${prompt} ${commandDisplay}`)) + timeoutSuffix;
220
320
  }
221
321
  function rebuildBashResultRenderComponent(component, result, options, showImages, startedAt, endedAt) {
222
322
  const state = component.state;
@@ -283,17 +383,63 @@ function rebuildBashResultRenderComponent(component, result, options, showImages
283
383
  component.addChild(new Text(`\n${theme.fg("muted", `${label} ${formatDuration(endTime - startedAt)}`)}`, 0, 0));
284
384
  }
285
385
  }
286
- export function createBashToolDefinition(cwd, options) {
386
+ export function createShellToolDefinition(cwd, config, options) {
287
387
  const ops = options?.operations ?? createLocalBashOperations({ shellPath: options?.shellPath });
288
388
  const commandPrefix = options?.commandPrefix;
289
389
  const exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;
290
390
  const spawnHook = options?.spawnHook;
391
+ const registry = options?.backgroundRegistry ?? createBackgroundShellRegistry();
392
+ // Background handle calls (retrieve and kill) never touch the foreground
393
+ // execution path, so the post-hoc escalation offer below is unreachable from
394
+ // them by construction; the refusal note in `executeHandleCall` tells the
395
+ // model a foreground rerun gets the offer (spec, Non-goals).
396
+ const unknownHandleError = (handle) => {
397
+ const known = registry.handles();
398
+ return new ToolExecutionError(`Unknown background handle: ${handle}.${known.length > 0 ? ` Known handles: ${known.join(", ")}` : " No background commands have been launched."}`, undefined);
399
+ };
400
+ const executeHandleCall = async (handleInput) => {
401
+ if ("kill" in handleInput && handleInput.kill) {
402
+ const status = registry.kill(handleInput.handle);
403
+ if (!status)
404
+ throw unknownHandleError(handleInput.handle);
405
+ const state = status.running ? "kill signal sent" : `already exited (code ${status.exitCode})`;
406
+ return {
407
+ content: [{ type: "text", text: `[background] ${handleInput.handle}: ${state}` }],
408
+ details: undefined,
409
+ };
410
+ }
411
+ const retrieved = await registry.retrieve(handleInput.handle);
412
+ if (!retrieved)
413
+ throw unknownHandleError(handleInput.handle);
414
+ const { status, snapshot } = retrieved;
415
+ const elapsed = ((Date.now() - status.startedAt) / 1000).toFixed(1);
416
+ const header = status.running
417
+ ? `[background] ${handleInput.handle}: running ${elapsed}s`
418
+ : `[background] ${handleInput.handle}: ${status.killed ? "killed" : "exited"} (code ${status.exitCode}) after ${elapsed}s`;
419
+ let text = `${header}\n\n${snapshot.content || "(no output)"}`;
420
+ const truncation = snapshot.truncation;
421
+ if (truncation.truncated && snapshot.fullOutputPath) {
422
+ const startLine = truncation.totalLines - truncation.outputLines + 1;
423
+ text += `\n\n[Showing lines ${startLine}-${truncation.totalLines} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`;
424
+ }
425
+ if (!status.running && looksLikeSandboxRefusal(snapshot.content)) {
426
+ text += `\n\n[Sandbox refusal: background runs are not offered escalation. Rerun this command in the foreground to get the escalation offer.]`;
427
+ }
428
+ return {
429
+ content: [{ type: "text", text }],
430
+ details: {
431
+ truncation: truncation.truncated ? truncation : undefined,
432
+ fullOutputPath: snapshot.fullOutputPath,
433
+ execution: { cwd, exitCode: status.exitCode ?? null },
434
+ },
435
+ };
436
+ };
291
437
  return {
292
- name: "bash",
293
- label: "bash",
294
- description: `Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,
295
- promptSnippet: bashToolSystemPromptContribution.snippet,
296
- promptGuidelines: exposeSessionEnvironment ? [...bashToolSystemPromptContribution.guidelines] : undefined,
438
+ name: config.name,
439
+ label: config.label,
440
+ description: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,
441
+ promptSnippet: config.promptSnippet,
442
+ promptGuidelines: exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,
297
443
  parameters: bashSchema,
298
444
  contract: {
299
445
  capabilities: new Set(["exec"]),
@@ -303,17 +449,48 @@ export function createBashToolDefinition(cwd, options) {
303
449
  emits: new Set(["command"]),
304
450
  capture: (params, result) => {
305
451
  const execution = result.details?.execution;
306
- return execution
307
- ? [{ kind: "command", command: params.command, ...execution }]
308
- : [{ kind: "command", command: params.command }];
452
+ // Retrieve and kill calls carry a handle; resolve it back to the
453
+ // command that produced the output so the record shows what ran.
454
+ const command = "command" in params ? params.command : (registry.commandFor(params.handle) ?? params.handle);
455
+ return execution ? [{ kind: "command", command, ...execution }] : [{ kind: "command", command }];
309
456
  },
310
457
  },
311
458
  },
312
459
  constrainedSampling: getExperimentalToolSampling(),
313
- async execute(_toolCallId, { command, timeout }, signal, onUpdate, ctx) {
460
+ async execute(_toolCallId, input, signal, onUpdate, ctx) {
461
+ if ("handle" in input) {
462
+ return await executeHandleCall(input);
463
+ }
464
+ const { command, timeout, background } = input;
314
465
  const resolvedCommand = commandPrefix ? `${commandPrefix}\n${command}` : command;
315
466
  const spawnContext = resolveSpawnContext(resolvedCommand, cwd, spawnHook, exposeSessionEnvironment, ctx);
316
- const output = new OutputAccumulator({ tempFilePrefix: "apex-code-bash" });
467
+ if (background) {
468
+ const spawnBg = ops.spawnBackground;
469
+ if (!spawnBg) {
470
+ throw new ToolExecutionError("This shell backend does not support background execution. Run the command in the foreground instead.", undefined);
471
+ }
472
+ const output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });
473
+ const launched = await spawnBg(spawnContext.command, spawnContext.cwd, {
474
+ env: spawnContext.env,
475
+ onData: (data) => output.append(data),
476
+ });
477
+ const handle = registry.launch({
478
+ command: spawnContext.command,
479
+ pid: launched.pid,
480
+ output,
481
+ exited: launched.exited,
482
+ });
483
+ return {
484
+ content: [
485
+ {
486
+ type: "text",
487
+ text: `[background] launched with handle ${handle}\nRetrieve its output: { "handle": "${handle}" }\nKill it: { "handle": "${handle}", "kill": true }`,
488
+ },
489
+ ],
490
+ details: { execution: { cwd: spawnContext.cwd, exitCode: null } },
491
+ };
492
+ }
493
+ const output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });
317
494
  let acceptingOutput = true;
318
495
  let updateTimer;
319
496
  let updateDirty = false;
@@ -432,6 +609,24 @@ export function createBashToolDefinition(cwd, options) {
432
609
  const { text: outputText, details } = formatOutput(snapshot);
433
610
  const resultDetails = { ...details, execution };
434
611
  if (exitCode !== 0 && exitCode !== null) {
612
+ // The OS boundary refuses a write in the kernel, so by the time this runs
613
+ // the syscall has already failed and nothing inside this namespace can
614
+ // widen it. Offering the command to the supervisor is the only remaining
615
+ // move, and it is the supervisor that shows the human the exact command
616
+ // and root before anything runs -- so a wrong guess at the path is
617
+ // refused by someone reading it, never granted quietly.
618
+ const escalated = await escalateRefusedCommand(command, outputText);
619
+ if (escalated) {
620
+ // The reported exit code has to be the escalated run's, not the
621
+ // refused one's. Leaving the original would have the details say the
622
+ // command failed while the content says it succeeded, and anything
623
+ // reading the facts rather than the text would disagree with the
624
+ // model about what happened.
625
+ return {
626
+ content: [{ type: "text", text: escalated.text }],
627
+ details: { ...resultDetails, execution: { ...execution, exitCode: 0 } },
628
+ };
629
+ }
435
630
  throw new ToolExecutionError(appendStatus(outputText, `Command exited with code ${exitCode}`), {
436
631
  execution,
437
632
  });
@@ -449,7 +644,7 @@ export function createBashToolDefinition(cwd, options) {
449
644
  state.endedAt = undefined;
450
645
  }
451
646
  const text = context.lastComponent ?? new Text("", 0, 0);
452
- text.setText(formatBashCall(args));
647
+ text.setText(formatShellCall(args, config.prompt));
453
648
  return text;
454
649
  },
455
650
  renderResult(result, options, _theme, context) {
@@ -471,6 +666,18 @@ export function createBashToolDefinition(cwd, options) {
471
666
  },
472
667
  };
473
668
  }
669
+ const bashToolConfig = {
670
+ name: "bash",
671
+ label: "bash",
672
+ shellName: "bash",
673
+ prompt: "$",
674
+ promptSnippet: bashToolSystemPromptContribution.snippet,
675
+ promptGuidelines: bashToolSystemPromptContribution.guidelines,
676
+ tempFilePrefix: "apex-code-bash",
677
+ };
678
+ export function createBashToolDefinition(cwd, options) {
679
+ return createShellToolDefinition(cwd, bashToolConfig, options);
680
+ }
474
681
  export function createBashTool(cwd, options) {
475
682
  const definition = createBashToolDefinition(cwd, options);
476
683
  const tool = wrapToolDefinition(definition);
@@ -480,4 +687,29 @@ export function createBashTool(cwd, options) {
480
687
  });
481
688
  return tool;
482
689
  }
690
+ /**
691
+ * Offer a command the sandbox refused to the supervisor, once.
692
+ *
693
+ * Returns the escalated output when a human approved it and it ran, and undefined for
694
+ * every other outcome -- no channel, no recognisable refusal, no path in the message, a
695
+ * refused prompt -- because the caller's behaviour is the same in all of them: report
696
+ * what originally happened.
697
+ */
698
+ async function escalateRefusedCommand(command, output) {
699
+ if (!looksLikeSandboxRefusal(output))
700
+ return undefined;
701
+ const refusedPath = extractRefusedPath(output);
702
+ if (!refusedPath)
703
+ return undefined;
704
+ const outcome = await requestCommandEscalation({ command, writableRoot: escalationRootFor(refusedPath) });
705
+ if (!outcome || outcome.code !== 0)
706
+ return undefined;
707
+ const combined = [outcome.stdout, outcome.stderr]
708
+ .filter((part) => part.length > 0)
709
+ .join("\n")
710
+ .trim();
711
+ // A silent success still has to say something, or the model reads an empty result as
712
+ // the command having had no effect.
713
+ return { text: combined.length > 0 ? combined : "Command ran with approved escalated access." };
714
+ }
483
715
  //# sourceMappingURL=bash.js.map