@evalops/maestro 0.10.17 → 0.10.20

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 (930) hide show
  1. package/README.md +56 -1
  2. package/dist/agent/action-approval.d.ts +12 -2
  3. package/dist/agent/action-approval.d.ts.map +1 -1
  4. package/dist/agent/action-approval.js +19 -32
  5. package/dist/agent/action-approval.js.map +1 -1
  6. package/dist/agent/agent.d.ts +1 -0
  7. package/dist/agent/agent.d.ts.map +1 -1
  8. package/dist/agent/agent.js +26 -0
  9. package/dist/agent/agent.js.map +1 -1
  10. package/dist/agent/compaction.d.ts +2 -0
  11. package/dist/agent/compaction.d.ts.map +1 -1
  12. package/dist/agent/compaction.js +4 -2
  13. package/dist/agent/compaction.js.map +1 -1
  14. package/dist/agent/index.d.ts +1 -1
  15. package/dist/agent/index.d.ts.map +1 -1
  16. package/dist/agent/index.js +1 -1
  17. package/dist/agent/index.js.map +1 -1
  18. package/dist/agent/modes.d.ts +56 -4
  19. package/dist/agent/modes.d.ts.map +1 -1
  20. package/dist/agent/modes.js +163 -2
  21. package/dist/agent/modes.js.map +1 -1
  22. package/dist/agent/prompt-recovery.d.ts.map +1 -1
  23. package/dist/agent/prompt-recovery.js +1 -3
  24. package/dist/agent/prompt-recovery.js.map +1 -1
  25. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  26. package/dist/agent/providers/anthropic.js +9 -1
  27. package/dist/agent/providers/anthropic.js.map +1 -1
  28. package/dist/agent/providers/codex-app-server.d.ts +12 -0
  29. package/dist/agent/providers/codex-app-server.d.ts.map +1 -0
  30. package/dist/agent/providers/codex-app-server.js +788 -0
  31. package/dist/agent/providers/codex-app-server.js.map +1 -0
  32. package/dist/agent/providers/google-gemini-cli.js +14 -3
  33. package/dist/agent/providers/google.js +22 -3
  34. package/dist/agent/providers/scripted.d.ts +11 -0
  35. package/dist/agent/providers/scripted.d.ts.map +1 -0
  36. package/dist/agent/providers/scripted.js +399 -0
  37. package/dist/agent/providers/scripted.js.map +1 -0
  38. package/dist/agent/providers/vertex.js +14 -3
  39. package/dist/agent/scenario-source.d.ts +19 -0
  40. package/dist/agent/scenario-source.d.ts.map +1 -0
  41. package/dist/agent/scenario-source.js +112 -0
  42. package/dist/agent/scenario-source.js.map +1 -0
  43. package/dist/agent/subagent-specs.d.ts +1 -1
  44. package/dist/agent/subagent-specs.js +1 -1
  45. package/dist/agent/subagent-specs.js.map +1 -1
  46. package/dist/agent/swarm/executor.d.ts +25 -0
  47. package/dist/agent/swarm/executor.d.ts.map +1 -1
  48. package/dist/agent/swarm/executor.js +795 -20
  49. package/dist/agent/swarm/executor.js.map +1 -1
  50. package/dist/agent/swarm/runtime-events.d.ts +11 -0
  51. package/dist/agent/swarm/runtime-events.d.ts.map +1 -0
  52. package/dist/agent/swarm/runtime-events.js +26 -0
  53. package/dist/agent/swarm/runtime-events.js.map +1 -0
  54. package/dist/agent/swarm/types.d.ts +78 -0
  55. package/dist/agent/swarm/types.d.ts.map +1 -1
  56. package/dist/agent/swarm/types.js.map +1 -1
  57. package/dist/agent/tracing.d.ts +1 -1
  58. package/dist/agent/tracing.d.ts.map +1 -1
  59. package/dist/agent/tracing.js +17 -9
  60. package/dist/agent/tracing.js.map +1 -1
  61. package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
  62. package/dist/agent/transport/create-provider-stream.js +14 -0
  63. package/dist/agent/transport/create-provider-stream.js.map +1 -1
  64. package/dist/agent/transport/stable-stringify.d.ts +2 -0
  65. package/dist/agent/transport/stable-stringify.d.ts.map +1 -0
  66. package/dist/agent/transport/stable-stringify.js +14 -0
  67. package/dist/agent/transport/stable-stringify.js.map +1 -0
  68. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  69. package/dist/agent/transport/tool-execution-bridge.js +2 -15
  70. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  71. package/dist/agent/transport/tool-safety-pipeline.d.ts +5 -1
  72. package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
  73. package/dist/agent/transport/tool-safety-pipeline.js +184 -36
  74. package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
  75. package/dist/agent/transport.d.ts +8 -0
  76. package/dist/agent/transport.d.ts.map +1 -1
  77. package/dist/agent/transport.js +1613 -68
  78. package/dist/agent/transport.js.map +1 -1
  79. package/dist/agent/types.d.ts +170 -2
  80. package/dist/agent/types.d.ts.map +1 -1
  81. package/dist/agent/types.js.map +1 -1
  82. package/dist/api/enterprise-routes.d.ts.map +1 -1
  83. package/dist/api/enterprise-routes.js +34 -3
  84. package/dist/api/enterprise-routes.js.map +1 -1
  85. package/dist/app-server/in-process-client.d.ts +32 -0
  86. package/dist/app-server/in-process-client.d.ts.map +1 -0
  87. package/dist/app-server/in-process-client.js +73 -0
  88. package/dist/app-server/in-process-client.js.map +1 -0
  89. package/dist/app-server/session-api.d.ts +36 -0
  90. package/dist/app-server/session-api.d.ts.map +1 -0
  91. package/dist/app-server/session-api.js +713 -0
  92. package/dist/app-server/session-api.js.map +1 -0
  93. package/dist/approvals/platform-action-approval.d.ts +3 -1
  94. package/dist/approvals/platform-action-approval.d.ts.map +1 -1
  95. package/dist/approvals/platform-action-approval.js +16 -9
  96. package/dist/approvals/platform-action-approval.js.map +1 -1
  97. package/dist/approvals/service-client.d.ts.map +1 -1
  98. package/dist/approvals/service-client.js +7 -7
  99. package/dist/approvals/service-client.js.map +1 -1
  100. package/dist/audit/logger.d.ts +4 -4
  101. package/dist/bootstrap/agent-creation-setup.d.ts +4 -0
  102. package/dist/bootstrap/agent-creation-setup.d.ts.map +1 -1
  103. package/dist/bootstrap/agent-creation-setup.js +3 -1
  104. package/dist/bootstrap/agent-creation-setup.js.map +1 -1
  105. package/dist/bootstrap/auth-setup.js +1 -1
  106. package/dist/bootstrap/auth-setup.js.map +1 -1
  107. package/dist/bootstrap/event-subscriptions-setup.d.ts +6 -0
  108. package/dist/bootstrap/event-subscriptions-setup.d.ts.map +1 -1
  109. package/dist/bootstrap/event-subscriptions-setup.js +26 -2
  110. package/dist/bootstrap/event-subscriptions-setup.js.map +1 -1
  111. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  112. package/dist/bootstrap/model-resolution-setup.js +4 -1
  113. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  114. package/dist/bootstrap/tools-setup.d.ts +2 -1
  115. package/dist/bootstrap/tools-setup.d.ts.map +1 -1
  116. package/dist/bootstrap/tools-setup.js +5 -1
  117. package/dist/bootstrap/tools-setup.js.map +1 -1
  118. package/dist/cli/args.d.ts +9 -1
  119. package/dist/cli/args.d.ts.map +1 -1
  120. package/dist/cli/args.js +130 -5
  121. package/dist/cli/args.js.map +1 -1
  122. package/dist/cli/commands/a2a.d.ts +9 -0
  123. package/dist/cli/commands/a2a.d.ts.map +1 -0
  124. package/dist/cli/commands/a2a.js +1714 -0
  125. package/dist/cli/commands/a2a.js.map +1 -0
  126. package/dist/cli/commands/agents.d.ts +16 -2
  127. package/dist/cli/commands/agents.d.ts.map +1 -1
  128. package/dist/cli/commands/agents.js +223 -35
  129. package/dist/cli/commands/agents.js.map +1 -1
  130. package/dist/cli/commands/codex.d.ts +1 -1
  131. package/dist/cli/commands/codex.d.ts.map +1 -1
  132. package/dist/cli/commands/codex.js +145 -39
  133. package/dist/cli/commands/codex.js.map +1 -1
  134. package/dist/cli/commands/context.d.ts +10 -0
  135. package/dist/cli/commands/context.d.ts.map +1 -0
  136. package/dist/cli/commands/context.js +176 -0
  137. package/dist/cli/commands/context.js.map +1 -0
  138. package/dist/cli/commands/hosted-runner.d.ts +1 -0
  139. package/dist/cli/commands/hosted-runner.d.ts.map +1 -1
  140. package/dist/cli/commands/hosted-runner.js +9 -1
  141. package/dist/cli/commands/hosted-runner.js.map +1 -1
  142. package/dist/cli/commands/init.d.ts.map +1 -1
  143. package/dist/cli/commands/init.js +6 -0
  144. package/dist/cli/commands/init.js.map +1 -1
  145. package/dist/cli/commands/modes.d.ts +8 -0
  146. package/dist/cli/commands/modes.d.ts.map +1 -0
  147. package/dist/cli/commands/modes.js +151 -0
  148. package/dist/cli/commands/modes.js.map +1 -0
  149. package/dist/cli/commands/operating-plane.d.ts +14 -0
  150. package/dist/cli/commands/operating-plane.d.ts.map +1 -0
  151. package/dist/cli/commands/operating-plane.js +160 -0
  152. package/dist/cli/commands/operating-plane.js.map +1 -0
  153. package/dist/cli/commands/run.d.ts +87 -0
  154. package/dist/cli/commands/run.d.ts.map +1 -0
  155. package/dist/cli/commands/run.js +356 -0
  156. package/dist/cli/commands/run.js.map +1 -0
  157. package/dist/cli/commands/scenario.d.ts +7 -0
  158. package/dist/cli/commands/scenario.d.ts.map +1 -0
  159. package/dist/cli/commands/scenario.js +195 -0
  160. package/dist/cli/commands/scenario.js.map +1 -0
  161. package/dist/cli/commands/skill.d.ts +7 -0
  162. package/dist/cli/commands/skill.d.ts.map +1 -0
  163. package/dist/cli/commands/skill.js +286 -0
  164. package/dist/cli/commands/skill.js.map +1 -0
  165. package/dist/cli/headless-protocol.d.ts +55 -1
  166. package/dist/cli/headless-protocol.d.ts.map +1 -1
  167. package/dist/cli/headless-protocol.js +446 -7
  168. package/dist/cli/headless-protocol.js.map +1 -1
  169. package/dist/cli/headless-runtime-selection.d.ts +38 -0
  170. package/dist/cli/headless-runtime-selection.d.ts.map +1 -0
  171. package/dist/cli/headless-runtime-selection.js +48 -0
  172. package/dist/cli/headless-runtime-selection.js.map +1 -0
  173. package/dist/cli/headless.d.ts +5 -1
  174. package/dist/cli/headless.d.ts.map +1 -1
  175. package/dist/cli/headless.js +11 -1
  176. package/dist/cli/headless.js.map +1 -1
  177. package/dist/cli/help.d.ts +3 -1
  178. package/dist/cli/help.d.ts.map +1 -1
  179. package/dist/cli/help.js +136 -30
  180. package/dist/cli/help.js.map +1 -1
  181. package/dist/cli/system-prompt.d.ts +22 -4
  182. package/dist/cli/system-prompt.d.ts.map +1 -1
  183. package/dist/cli/system-prompt.js +224 -127
  184. package/dist/cli/system-prompt.js.map +1 -1
  185. package/dist/cli-tui/commands/a2a-handlers.d.ts +7 -0
  186. package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -0
  187. package/dist/cli-tui/commands/a2a-handlers.js +160 -0
  188. package/dist/cli-tui/commands/a2a-handlers.js.map +1 -0
  189. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  190. package/dist/cli-tui/commands/command-catalog.js +15 -0
  191. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  192. package/dist/cli-tui/commands/command-registry-adapter.js +10 -1
  193. package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -1
  194. package/dist/cli-tui/commands/handlers/mode-handler.d.ts.map +1 -1
  195. package/dist/cli-tui/commands/handlers/mode-handler.js +22 -10
  196. package/dist/cli-tui/commands/handlers/mode-handler.js.map +1 -1
  197. package/dist/cli-tui/commands/mcp-handlers.d.ts.map +1 -1
  198. package/dist/cli-tui/commands/mcp-handlers.js +6 -5
  199. package/dist/cli-tui/commands/mcp-handlers.js.map +1 -1
  200. package/dist/cli-tui/commands/types.d.ts +1 -0
  201. package/dist/cli-tui/commands/types.d.ts.map +1 -1
  202. package/dist/cli-tui/commands/types.js.map +1 -1
  203. package/dist/cli-tui/commands/utility-handlers.d.ts +4 -0
  204. package/dist/cli-tui/commands/utility-handlers.d.ts.map +1 -1
  205. package/dist/cli-tui/commands/utility-handlers.js +45 -6
  206. package/dist/cli-tui/commands/utility-handlers.js.map +1 -1
  207. package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
  208. package/dist/cli-tui/run/run-shell-command.js +14 -5
  209. package/dist/cli-tui/run/run-shell-command.js.map +1 -1
  210. package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
  211. package/dist/cli-tui/run/streaming-shell-command.js +14 -5
  212. package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
  213. package/dist/cli-tui/selectors/model-selector.d.ts +1 -0
  214. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  215. package/dist/cli-tui/selectors/model-selector.js +6 -2
  216. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  217. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
  218. package/dist/cli-tui/tui-renderer/command-registry-options.js +5 -0
  219. package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
  220. package/dist/cli-tui/utils/commands/review-prompt.d.ts +1 -1
  221. package/dist/cli-tui/utils/commands/review-prompt.d.ts.map +1 -1
  222. package/dist/cli-tui/utils/commands/review-prompt.js +8 -3
  223. package/dist/cli-tui/utils/commands/review-prompt.js.map +1 -1
  224. package/dist/cli-tui/utils/runtime-badges.d.ts +1 -0
  225. package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
  226. package/dist/cli-tui/utils/runtime-badges.js +7 -0
  227. package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
  228. package/dist/cli-tui/utils/text-formatting.d.ts +1 -0
  229. package/dist/cli-tui/utils/text-formatting.d.ts.map +1 -1
  230. package/dist/cli-tui/utils/text-formatting.js +5 -0
  231. package/dist/cli-tui/utils/text-formatting.js.map +1 -1
  232. package/dist/cli.js +49209 -26165
  233. package/dist/cli.js.map +1 -1
  234. package/dist/codex/app-server-client.d.ts +139 -0
  235. package/dist/codex/app-server-client.d.ts.map +1 -0
  236. package/dist/codex/app-server-client.js +352 -0
  237. package/dist/codex/app-server-client.js.map +1 -0
  238. package/dist/codex/compatibility.d.ts +48 -0
  239. package/dist/codex/compatibility.d.ts.map +1 -0
  240. package/dist/codex/compatibility.js +344 -0
  241. package/dist/codex/compatibility.js.map +1 -0
  242. package/dist/codex/subagent-dispatch-table.d.ts +66 -0
  243. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -0
  244. package/dist/codex/subagent-dispatch-table.js +127 -0
  245. package/dist/codex/subagent-dispatch-table.js.map +1 -0
  246. package/dist/codex/subagent-workgraph.d.ts +56 -0
  247. package/dist/codex/subagent-workgraph.d.ts.map +1 -0
  248. package/dist/codex/subagent-workgraph.js +89 -0
  249. package/dist/codex/subagent-workgraph.js.map +1 -0
  250. package/dist/config/constants.d.ts +3 -1
  251. package/dist/config/constants.d.ts.map +1 -1
  252. package/dist/config/constants.js +9 -0
  253. package/dist/config/constants.js.map +1 -1
  254. package/dist/config/feature-flags.d.ts +10 -1
  255. package/dist/config/feature-flags.d.ts.map +1 -1
  256. package/dist/config/feature-flags.js +17 -6
  257. package/dist/config/feature-flags.js.map +1 -1
  258. package/dist/config/index.d.ts +1 -1
  259. package/dist/config/index.d.ts.map +1 -1
  260. package/dist/config/index.js +1 -1
  261. package/dist/config/index.js.map +1 -1
  262. package/dist/config/toml-config.d.ts +32 -0
  263. package/dist/config/toml-config.d.ts.map +1 -1
  264. package/dist/config/toml-config.js +152 -43
  265. package/dist/config/toml-config.js.map +1 -1
  266. package/dist/connectors/service-client.d.ts.map +1 -1
  267. package/dist/connectors/service-client.js +4 -7
  268. package/dist/connectors/service-client.js.map +1 -1
  269. package/dist/context/manifest-types.d.ts +59 -0
  270. package/dist/context/manifest-types.d.ts.map +1 -0
  271. package/dist/context/manifest-types.js +2 -0
  272. package/dist/context/manifest-types.js.map +1 -0
  273. package/dist/context/manifest.d.ts +16 -0
  274. package/dist/context/manifest.d.ts.map +1 -0
  275. package/dist/context/manifest.js +503 -0
  276. package/dist/context/manifest.js.map +1 -0
  277. package/dist/db/schema.d.ts +10 -1
  278. package/dist/db/schema.d.ts.map +1 -1
  279. package/dist/db/schema.js.map +1 -1
  280. package/dist/evalops/agent-bootstrap.d.ts +1 -0
  281. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  282. package/dist/evalops/agent-bootstrap.js +41 -1
  283. package/dist/evalops/agent-bootstrap.js.map +1 -1
  284. package/dist/evalops/env-aliases.d.ts +13 -0
  285. package/dist/evalops/env-aliases.d.ts.map +1 -0
  286. package/dist/evalops/env-aliases.js +60 -0
  287. package/dist/evalops/env-aliases.js.map +1 -0
  288. package/dist/evalops/managed-context.d.ts.map +1 -1
  289. package/dist/evalops/managed-context.js +28 -62
  290. package/dist/evalops/managed-context.js.map +1 -1
  291. package/dist/guardian/config.d.ts.map +1 -1
  292. package/dist/guardian/config.js +1 -0
  293. package/dist/guardian/config.js.map +1 -1
  294. package/dist/guardian/runner.d.ts +2 -0
  295. package/dist/guardian/runner.d.ts.map +1 -1
  296. package/dist/guardian/runner.js +105 -2
  297. package/dist/guardian/runner.js.map +1 -1
  298. package/dist/guardian/types.d.ts +1 -0
  299. package/dist/guardian/types.d.ts.map +1 -1
  300. package/dist/guardian/types.js.map +1 -1
  301. package/dist/index.d.ts +6 -1
  302. package/dist/index.d.ts.map +1 -1
  303. package/dist/index.js +6 -1
  304. package/dist/index.js.map +1 -1
  305. package/dist/main.d.ts.map +1 -1
  306. package/dist/main.js +267 -55
  307. package/dist/main.js.map +1 -1
  308. package/dist/mcp/config.d.ts.map +1 -1
  309. package/dist/mcp/config.js +89 -7
  310. package/dist/mcp/config.js.map +1 -1
  311. package/dist/mcp/manager.d.ts +5 -1
  312. package/dist/mcp/manager.d.ts.map +1 -1
  313. package/dist/mcp/manager.js +159 -4
  314. package/dist/mcp/manager.js.map +1 -1
  315. package/dist/mcp/platform-plugin.d.ts.map +1 -1
  316. package/dist/mcp/platform-plugin.js +9 -26
  317. package/dist/mcp/platform-plugin.js.map +1 -1
  318. package/dist/mcp/schema.d.ts +15 -0
  319. package/dist/mcp/schema.d.ts.map +1 -1
  320. package/dist/mcp/schema.js +24 -0
  321. package/dist/mcp/schema.js.map +1 -1
  322. package/dist/mcp/tool-bridge.d.ts +39 -10
  323. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  324. package/dist/mcp/tool-bridge.js +101 -24
  325. package/dist/mcp/tool-bridge.js.map +1 -1
  326. package/dist/mcp/types.d.ts +27 -0
  327. package/dist/mcp/types.d.ts.map +1 -1
  328. package/dist/mcp/types.js.map +1 -1
  329. package/dist/mcp/workspace-trust.d.ts +10 -0
  330. package/dist/mcp/workspace-trust.d.ts.map +1 -0
  331. package/dist/mcp/workspace-trust.js +295 -0
  332. package/dist/mcp/workspace-trust.js.map +1 -0
  333. package/dist/memory/service-client.d.ts +1 -0
  334. package/dist/memory/service-client.d.ts.map +1 -1
  335. package/dist/memory/service-client.js +194 -9
  336. package/dist/memory/service-client.js.map +1 -1
  337. package/dist/models/builtin.d.ts.map +1 -1
  338. package/dist/models/builtin.js +66 -25
  339. package/dist/models/builtin.js.map +1 -1
  340. package/dist/models/config-loader.d.ts +10 -10
  341. package/dist/models/config-loader.d.ts.map +1 -1
  342. package/dist/models/config-loader.js +2 -0
  343. package/dist/models/config-loader.js.map +1 -1
  344. package/dist/models/registry.d.ts +1 -0
  345. package/dist/models/registry.d.ts.map +1 -1
  346. package/dist/models/registry.js +1 -0
  347. package/dist/models/registry.js.map +1 -1
  348. package/dist/oauth/device-identity.d.ts.map +1 -1
  349. package/dist/oauth/device-identity.js +1 -3
  350. package/dist/oauth/device-identity.js.map +1 -1
  351. package/dist/oauth/evalops.d.ts.map +1 -1
  352. package/dist/oauth/evalops.js +2 -5
  353. package/dist/oauth/evalops.js.map +1 -1
  354. package/dist/opentelemetry.d.ts.map +1 -1
  355. package/dist/opentelemetry.js +12 -12
  356. package/dist/opentelemetry.js.map +1 -1
  357. package/dist/package-version.d.ts +2 -0
  358. package/dist/package-version.d.ts.map +1 -0
  359. package/dist/package-version.js +11 -0
  360. package/dist/package-version.js.map +1 -0
  361. package/dist/packages/constants.d.ts +3 -0
  362. package/dist/packages/constants.d.ts.map +1 -0
  363. package/dist/packages/constants.js +3 -0
  364. package/dist/packages/constants.js.map +1 -0
  365. package/dist/packages/inspection.d.ts.map +1 -1
  366. package/dist/packages/inspection.js +2 -1
  367. package/dist/packages/inspection.js.map +1 -1
  368. package/dist/packages/search.d.ts.map +1 -1
  369. package/dist/packages/search.js +1 -1
  370. package/dist/packages/search.js.map +1 -1
  371. package/dist/platform/a2a-capability-market.d.ts +21 -0
  372. package/dist/platform/a2a-capability-market.d.ts.map +1 -0
  373. package/dist/platform/a2a-capability-market.js +176 -0
  374. package/dist/platform/a2a-capability-market.js.map +1 -0
  375. package/dist/platform/a2a-client.d.ts +217 -0
  376. package/dist/platform/a2a-client.d.ts.map +1 -0
  377. package/dist/platform/a2a-client.js +589 -0
  378. package/dist/platform/a2a-client.js.map +1 -0
  379. package/dist/platform/a2a-fleet.d.ts +41 -0
  380. package/dist/platform/a2a-fleet.d.ts.map +1 -0
  381. package/dist/platform/a2a-fleet.js +109 -0
  382. package/dist/platform/a2a-fleet.js.map +1 -0
  383. package/dist/platform/a2a-maestro-peer.d.ts +20 -0
  384. package/dist/platform/a2a-maestro-peer.d.ts.map +1 -0
  385. package/dist/platform/a2a-maestro-peer.js +176 -0
  386. package/dist/platform/a2a-maestro-peer.js.map +1 -0
  387. package/dist/platform/a2a-peer-pairing.d.ts +107 -0
  388. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -0
  389. package/dist/platform/a2a-peer-pairing.js +489 -0
  390. package/dist/platform/a2a-peer-pairing.js.map +1 -0
  391. package/dist/platform/a2a-peer-registry.d.ts +68 -0
  392. package/dist/platform/a2a-peer-registry.d.ts.map +1 -0
  393. package/dist/platform/a2a-peer-registry.js +320 -0
  394. package/dist/platform/a2a-peer-registry.js.map +1 -0
  395. package/dist/platform/a2a-task-ledger.d.ts +86 -0
  396. package/dist/platform/a2a-task-ledger.d.ts.map +1 -0
  397. package/dist/platform/a2a-task-ledger.js +546 -0
  398. package/dist/platform/a2a-task-ledger.js.map +1 -0
  399. package/dist/platform/a2a-work-graph.d.ts +43 -0
  400. package/dist/platform/a2a-work-graph.d.ts.map +1 -0
  401. package/dist/platform/a2a-work-graph.js +267 -0
  402. package/dist/platform/a2a-work-graph.js.map +1 -0
  403. package/dist/platform/agent-registry-client.d.ts +327 -0
  404. package/dist/platform/agent-registry-client.d.ts.map +1 -0
  405. package/dist/platform/agent-registry-client.js +803 -0
  406. package/dist/platform/agent-registry-client.js.map +1 -0
  407. package/dist/platform/agent-runtime-client.d.ts +135 -1
  408. package/dist/platform/agent-runtime-client.d.ts.map +1 -1
  409. package/dist/platform/agent-runtime-client.js +467 -10
  410. package/dist/platform/agent-runtime-client.js.map +1 -1
  411. package/dist/platform/cerebro-facts-client.d.ts.map +1 -1
  412. package/dist/platform/cerebro-facts-client.js +4 -7
  413. package/dist/platform/cerebro-facts-client.js.map +1 -1
  414. package/dist/platform/client.d.ts +2 -0
  415. package/dist/platform/client.d.ts.map +1 -1
  416. package/dist/platform/client.js +7 -14
  417. package/dist/platform/client.js.map +1 -1
  418. package/dist/platform/core-services.d.ts +68 -0
  419. package/dist/platform/core-services.d.ts.map +1 -1
  420. package/dist/platform/core-services.js +68 -0
  421. package/dist/platform/core-services.js.map +1 -1
  422. package/dist/platform/fermata-eval-client.d.ts +195 -0
  423. package/dist/platform/fermata-eval-client.d.ts.map +1 -0
  424. package/dist/platform/fermata-eval-client.js +146 -0
  425. package/dist/platform/fermata-eval-client.js.map +1 -0
  426. package/dist/platform/fermata-scenario-suite.d.ts +99 -0
  427. package/dist/platform/fermata-scenario-suite.d.ts.map +1 -0
  428. package/dist/platform/fermata-scenario-suite.js +459 -0
  429. package/dist/platform/fermata-scenario-suite.js.map +1 -0
  430. package/dist/platform/maestro-timeline-client.d.ts.map +1 -1
  431. package/dist/platform/maestro-timeline-client.js +5 -11
  432. package/dist/platform/maestro-timeline-client.js.map +1 -1
  433. package/dist/platform/operating-plane-client.d.ts +156 -0
  434. package/dist/platform/operating-plane-client.d.ts.map +1 -0
  435. package/dist/platform/operating-plane-client.js +131 -0
  436. package/dist/platform/operating-plane-client.js.map +1 -0
  437. package/dist/platform/operating-plane-summary.d.ts +47 -0
  438. package/dist/platform/operating-plane-summary.d.ts.map +1 -0
  439. package/dist/platform/operating-plane-summary.js +209 -0
  440. package/dist/platform/operating-plane-summary.js.map +1 -0
  441. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  442. package/dist/platform/tool-execution-client.js +4 -11
  443. package/dist/platform/tool-execution-client.js.map +1 -1
  444. package/dist/prompts/service-client.d.ts.map +1 -1
  445. package/dist/prompts/service-client.js +3 -5
  446. package/dist/prompts/service-client.js.map +1 -1
  447. package/dist/prompts/system-prompt.d.ts +3 -0
  448. package/dist/prompts/system-prompt.d.ts.map +1 -1
  449. package/dist/prompts/system-prompt.js +13 -3
  450. package/dist/prompts/system-prompt.js.map +1 -1
  451. package/dist/prompts/types.d.ts +2 -0
  452. package/dist/prompts/types.d.ts.map +1 -1
  453. package/dist/prompts/types.js.map +1 -1
  454. package/dist/providers/api-keys.d.ts +1 -1
  455. package/dist/providers/api-keys.d.ts.map +1 -1
  456. package/dist/providers/api-keys.js +2 -1
  457. package/dist/providers/api-keys.js.map +1 -1
  458. package/dist/providers/auth.d.ts.map +1 -1
  459. package/dist/providers/auth.js +48 -25
  460. package/dist/providers/auth.js.map +1 -1
  461. package/dist/remote-runner/attach-client.d.ts.map +1 -1
  462. package/dist/remote-runner/attach-client.js +1 -0
  463. package/dist/remote-runner/attach-client.js.map +1 -1
  464. package/dist/remote-runner/client.d.ts.map +1 -1
  465. package/dist/remote-runner/client.js +4 -7
  466. package/dist/remote-runner/client.js.map +1 -1
  467. package/dist/rpc/rpc-types.d.ts.map +1 -1
  468. package/dist/rpc/rpc-types.js +1 -0
  469. package/dist/rpc/rpc-types.js.map +1 -1
  470. package/dist/safety/action-firewall.d.ts.map +1 -1
  471. package/dist/safety/action-firewall.js +69 -6
  472. package/dist/safety/action-firewall.js.map +1 -1
  473. package/dist/safety/attack-patterns.d.ts.map +1 -1
  474. package/dist/safety/attack-patterns.js +31 -14
  475. package/dist/safety/attack-patterns.js.map +1 -1
  476. package/dist/safety/bash-parser.d.ts.map +1 -1
  477. package/dist/safety/bash-parser.js +4 -3
  478. package/dist/safety/bash-parser.js.map +1 -1
  479. package/dist/safety/execpolicy.d.ts +15 -3
  480. package/dist/safety/execpolicy.d.ts.map +1 -1
  481. package/dist/safety/execpolicy.js +248 -37
  482. package/dist/safety/execpolicy.js.map +1 -1
  483. package/dist/safety/governance-service-client.d.ts.map +1 -1
  484. package/dist/safety/governance-service-client.js +4 -7
  485. package/dist/safety/governance-service-client.js.map +1 -1
  486. package/dist/safety/guarded-files.d.ts +34 -0
  487. package/dist/safety/guarded-files.d.ts.map +1 -0
  488. package/dist/safety/guarded-files.js +372 -0
  489. package/dist/safety/guarded-files.js.map +1 -0
  490. package/dist/safety/loop-detector.d.ts.map +1 -1
  491. package/dist/safety/loop-detector.js +6 -1
  492. package/dist/safety/loop-detector.js.map +1 -1
  493. package/dist/safety/permission-profile.d.ts +47 -0
  494. package/dist/safety/permission-profile.d.ts.map +1 -0
  495. package/dist/safety/permission-profile.js +349 -0
  496. package/dist/safety/permission-profile.js.map +1 -0
  497. package/dist/safety/safety-middleware.d.ts +5 -1
  498. package/dist/safety/safety-middleware.d.ts.map +1 -1
  499. package/dist/safety/safety-middleware.js +3 -2
  500. package/dist/safety/safety-middleware.js.map +1 -1
  501. package/dist/safety/suspicious-patterns.d.ts.map +1 -1
  502. package/dist/safety/suspicious-patterns.js +12 -7
  503. package/dist/safety/suspicious-patterns.js.map +1 -1
  504. package/dist/safety/tool-categorization.js +1 -1
  505. package/dist/safety/tool-categorization.js.map +1 -1
  506. package/dist/safety/validators/path-policy-validator.d.ts.map +1 -1
  507. package/dist/safety/validators/path-policy-validator.js +7 -0
  508. package/dist/safety/validators/path-policy-validator.js.map +1 -1
  509. package/dist/sandbox/index.d.ts +6 -1
  510. package/dist/sandbox/index.d.ts.map +1 -1
  511. package/dist/sandbox/index.js +30 -4
  512. package/dist/sandbox/index.js.map +1 -1
  513. package/dist/sandbox/native-sandbox.d.ts +3 -0
  514. package/dist/sandbox/native-sandbox.d.ts.map +1 -1
  515. package/dist/sandbox/native-sandbox.js +139 -18
  516. package/dist/sandbox/native-sandbox.js.map +1 -1
  517. package/dist/sentry.d.ts +17 -0
  518. package/dist/sentry.d.ts.map +1 -0
  519. package/dist/sentry.js +91 -0
  520. package/dist/sentry.js.map +1 -0
  521. package/dist/server/agent-runtime-ledger.d.ts +141 -0
  522. package/dist/server/agent-runtime-ledger.d.ts.map +1 -0
  523. package/dist/server/agent-runtime-ledger.js +334 -0
  524. package/dist/server/agent-runtime-ledger.js.map +1 -0
  525. package/dist/server/agent-trajectory-inspection.d.ts +104 -0
  526. package/dist/server/agent-trajectory-inspection.d.ts.map +1 -0
  527. package/dist/server/agent-trajectory-inspection.js +168 -0
  528. package/dist/server/agent-trajectory-inspection.js.map +1 -0
  529. package/dist/server/agent-trajectory-replay.d.ts +56 -0
  530. package/dist/server/agent-trajectory-replay.d.ts.map +1 -0
  531. package/dist/server/agent-trajectory-replay.js +214 -0
  532. package/dist/server/agent-trajectory-replay.js.map +1 -0
  533. package/dist/server/agent-trajectory-scenarios.d.ts +109 -0
  534. package/dist/server/agent-trajectory-scenarios.d.ts.map +1 -0
  535. package/dist/server/agent-trajectory-scenarios.js +822 -0
  536. package/dist/server/agent-trajectory-scenarios.js.map +1 -0
  537. package/dist/server/agent-trajectory-scorers.d.ts +61 -0
  538. package/dist/server/agent-trajectory-scorers.d.ts.map +1 -0
  539. package/dist/server/agent-trajectory-scorers.js +162 -0
  540. package/dist/server/agent-trajectory-scorers.js.map +1 -0
  541. package/dist/server/agent-trajectory-validation.d.ts +7 -0
  542. package/dist/server/agent-trajectory-validation.d.ts.map +1 -0
  543. package/dist/server/agent-trajectory-validation.js +101 -0
  544. package/dist/server/agent-trajectory-validation.js.map +1 -0
  545. package/dist/server/agent-trajectory.d.ts +50 -0
  546. package/dist/server/agent-trajectory.d.ts.map +1 -0
  547. package/dist/server/agent-trajectory.js +159 -0
  548. package/dist/server/agent-trajectory.js.map +1 -0
  549. package/dist/server/app-context.d.ts +18 -0
  550. package/dist/server/app-context.d.ts.map +1 -1
  551. package/dist/server/app-context.js.map +1 -1
  552. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  553. package/dist/server/handlers/headless-sessions.js +64 -27
  554. package/dist/server/handlers/headless-sessions.js.map +1 -1
  555. package/dist/server/handlers/health.d.ts +6 -0
  556. package/dist/server/handlers/health.d.ts.map +1 -1
  557. package/dist/server/handlers/health.js +6 -0
  558. package/dist/server/handlers/health.js.map +1 -1
  559. package/dist/server/handlers/hosted-runner-drain.d.ts +69 -1
  560. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  561. package/dist/server/handlers/hosted-runner-drain.js +309 -18
  562. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  563. package/dist/server/handlers/hosted-runner-identity.d.ts +16 -0
  564. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
  565. package/dist/server/handlers/hosted-runner-identity.js +43 -0
  566. package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
  567. package/dist/server/handlers/mode.d.ts.map +1 -1
  568. package/dist/server/handlers/mode.js +3 -1
  569. package/dist/server/handlers/mode.js.map +1 -1
  570. package/dist/server/handlers/pending-requests.d.ts.map +1 -1
  571. package/dist/server/handlers/pending-requests.js +336 -51
  572. package/dist/server/handlers/pending-requests.js.map +1 -1
  573. package/dist/server/handlers/platform-a2a-push.d.ts +6 -0
  574. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -0
  575. package/dist/server/handlers/platform-a2a-push.js +136 -0
  576. package/dist/server/handlers/platform-a2a-push.js.map +1 -0
  577. package/dist/server/handlers/sessions.d.ts.map +1 -1
  578. package/dist/server/handlers/sessions.js +21 -1
  579. package/dist/server/handlers/sessions.js.map +1 -1
  580. package/dist/server/headless-runtime-service.d.ts +9 -2
  581. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  582. package/dist/server/headless-runtime-service.js +39 -0
  583. package/dist/server/headless-runtime-service.js.map +1 -1
  584. package/dist/server/hosted-agent-runtime-progress.d.ts +144 -0
  585. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -0
  586. package/dist/server/hosted-agent-runtime-progress.js +1650 -0
  587. package/dist/server/hosted-agent-runtime-progress.js.map +1 -0
  588. package/dist/server/hosted-runner-lease.d.ts +41 -0
  589. package/dist/server/hosted-runner-lease.d.ts.map +1 -0
  590. package/dist/server/hosted-runner-lease.js +140 -0
  591. package/dist/server/hosted-runner-lease.js.map +1 -0
  592. package/dist/server/hosted-session-manager.d.ts +16 -8
  593. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  594. package/dist/server/hosted-session-manager.js +98 -76
  595. package/dist/server/hosted-session-manager.js.map +1 -1
  596. package/dist/server/junit-xml.d.ts +2 -0
  597. package/dist/server/junit-xml.d.ts.map +1 -0
  598. package/dist/server/junit-xml.js +9 -0
  599. package/dist/server/junit-xml.js.map +1 -0
  600. package/dist/server/routes.d.ts.map +1 -1
  601. package/dist/server/routes.js +6 -0
  602. package/dist/server/routes.js.map +1 -1
  603. package/dist/server/scenario-recorder.d.ts +56 -0
  604. package/dist/server/scenario-recorder.d.ts.map +1 -0
  605. package/dist/server/scenario-recorder.js +109 -0
  606. package/dist/server/scenario-recorder.js.map +1 -0
  607. package/dist/server/scripted-scenario-runner.d.ts +46 -0
  608. package/dist/server/scripted-scenario-runner.d.ts.map +1 -0
  609. package/dist/server/scripted-scenario-runner.js +190 -0
  610. package/dist/server/scripted-scenario-runner.js.map +1 -0
  611. package/dist/server/server-middlewares.d.ts +6 -2
  612. package/dist/server/server-middlewares.d.ts.map +1 -1
  613. package/dist/server/server-middlewares.js +8 -2
  614. package/dist/server/server-middlewares.js.map +1 -1
  615. package/dist/server/server-request-manager.d.ts +9 -1
  616. package/dist/server/server-request-manager.d.ts.map +1 -1
  617. package/dist/server/server-request-manager.js +49 -4
  618. package/dist/server/server-request-manager.js.map +1 -1
  619. package/dist/services/intelligent-router/service.d.ts +2 -0
  620. package/dist/services/intelligent-router/service.d.ts.map +1 -1
  621. package/dist/services/intelligent-router/service.js +4 -0
  622. package/dist/services/intelligent-router/service.js.map +1 -1
  623. package/dist/services/service-authority.d.ts +25 -0
  624. package/dist/services/service-authority.d.ts.map +1 -0
  625. package/dist/services/service-authority.js +143 -0
  626. package/dist/services/service-authority.js.map +1 -0
  627. package/dist/services/workspace-config/service.d.ts +2 -0
  628. package/dist/services/workspace-config/service.d.ts.map +1 -1
  629. package/dist/services/workspace-config/service.js +4 -0
  630. package/dist/services/workspace-config/service.js.map +1 -1
  631. package/dist/session/manager.d.ts +8 -2
  632. package/dist/session/manager.d.ts.map +1 -1
  633. package/dist/session/manager.js +19 -4
  634. package/dist/session/manager.js.map +1 -1
  635. package/dist/session/session-branch.d.ts.map +1 -1
  636. package/dist/session/session-branch.js +5 -1
  637. package/dist/session/session-branch.js.map +1 -1
  638. package/dist/session/session-catalog.d.ts +7 -2
  639. package/dist/session/session-catalog.d.ts.map +1 -1
  640. package/dist/session/session-catalog.js +13 -2
  641. package/dist/session/session-catalog.js.map +1 -1
  642. package/dist/session/session-context.d.ts +6 -2
  643. package/dist/session/session-context.d.ts.map +1 -1
  644. package/dist/session/session-context.js +44 -4
  645. package/dist/session/session-context.js.map +1 -1
  646. package/dist/session/session-graph-projection.d.ts +32 -0
  647. package/dist/session/session-graph-projection.d.ts.map +1 -0
  648. package/dist/session/session-graph-projection.js +133 -0
  649. package/dist/session/session-graph-projection.js.map +1 -0
  650. package/dist/session/types.d.ts +18 -0
  651. package/dist/session/types.d.ts.map +1 -1
  652. package/dist/session/types.js +8 -0
  653. package/dist/session/types.js.map +1 -1
  654. package/dist/session/wire-format.generated.d.ts +3 -0
  655. package/dist/session/wire-format.generated.d.ts.map +1 -1
  656. package/dist/session/wire-format.generated.js +20 -0
  657. package/dist/session/wire-format.generated.js.map +1 -1
  658. package/dist/skills/eval-harness.d.ts +38 -0
  659. package/dist/skills/eval-harness.d.ts.map +1 -0
  660. package/dist/skills/eval-harness.js +112 -0
  661. package/dist/skills/eval-harness.js.map +1 -0
  662. package/dist/skills/index.d.ts +5 -1
  663. package/dist/skills/index.d.ts.map +1 -1
  664. package/dist/skills/index.js +5 -1
  665. package/dist/skills/index.js.map +1 -1
  666. package/dist/skills/linter.d.ts +36 -0
  667. package/dist/skills/linter.d.ts.map +1 -0
  668. package/dist/skills/linter.js +398 -0
  669. package/dist/skills/linter.js.map +1 -0
  670. package/dist/skills/loader.d.ts +36 -6
  671. package/dist/skills/loader.d.ts.map +1 -1
  672. package/dist/skills/loader.js +169 -86
  673. package/dist/skills/loader.js.map +1 -1
  674. package/dist/skills/package-contract.d.ts +45 -0
  675. package/dist/skills/package-contract.d.ts.map +1 -0
  676. package/dist/skills/package-contract.js +153 -0
  677. package/dist/skills/package-contract.js.map +1 -0
  678. package/dist/skills/runtime-activation.d.ts +68 -0
  679. package/dist/skills/runtime-activation.d.ts.map +1 -0
  680. package/dist/skills/runtime-activation.js +228 -0
  681. package/dist/skills/runtime-activation.js.map +1 -0
  682. package/dist/skills/service-client.d.ts.map +1 -1
  683. package/dist/skills/service-client.js +3 -4
  684. package/dist/skills/service-client.js.map +1 -1
  685. package/dist/skills/tool.d.ts.map +1 -1
  686. package/dist/skills/tool.js +2 -0
  687. package/dist/skills/tool.js.map +1 -1
  688. package/dist/skills/types.d.ts +14 -0
  689. package/dist/skills/types.d.ts.map +1 -1
  690. package/dist/skills/types.js.map +1 -1
  691. package/dist/telemetry/agent-operating-plane-context.d.ts +24 -0
  692. package/dist/telemetry/agent-operating-plane-context.d.ts.map +1 -0
  693. package/dist/telemetry/agent-operating-plane-context.js +54 -0
  694. package/dist/telemetry/agent-operating-plane-context.js.map +1 -0
  695. package/dist/telemetry/beacon.d.ts +24 -0
  696. package/dist/telemetry/beacon.d.ts.map +1 -0
  697. package/dist/telemetry/beacon.js +115 -0
  698. package/dist/telemetry/beacon.js.map +1 -0
  699. package/dist/telemetry/cli-command-aggregator.d.ts +36 -0
  700. package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -0
  701. package/dist/telemetry/cli-command-aggregator.js +251 -0
  702. package/dist/telemetry/cli-command-aggregator.js.map +1 -0
  703. package/dist/telemetry/cli-startup.d.ts +21 -0
  704. package/dist/telemetry/cli-startup.d.ts.map +1 -0
  705. package/dist/telemetry/cli-startup.js +83 -0
  706. package/dist/telemetry/cli-startup.js.map +1 -0
  707. package/dist/telemetry/disablement.d.ts +13 -0
  708. package/dist/telemetry/disablement.d.ts.map +1 -0
  709. package/dist/telemetry/disablement.js +19 -0
  710. package/dist/telemetry/disablement.js.map +1 -0
  711. package/dist/telemetry/index.d.ts +6 -2
  712. package/dist/telemetry/index.d.ts.map +1 -1
  713. package/dist/telemetry/index.js +6 -2
  714. package/dist/telemetry/index.js.map +1 -1
  715. package/dist/telemetry/maestro-event-bus.d.ts +52 -0
  716. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  717. package/dist/telemetry/maestro-event-bus.js +179 -3
  718. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  719. package/dist/telemetry/maestro-event-catalog.d.ts +3 -1
  720. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  721. package/dist/telemetry/maestro-event-catalog.js +2 -0
  722. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  723. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  724. package/dist/telemetry/maestro-platform-replay-fixture.js +74 -9
  725. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  726. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +1 -1
  727. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -1
  728. package/dist/telemetry/maestro-publisher-conformance-fixture.js +46 -11
  729. package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -1
  730. package/dist/telemetry/mcp-beacon.d.ts +20 -0
  731. package/dist/telemetry/mcp-beacon.d.ts.map +1 -0
  732. package/dist/telemetry/mcp-beacon.js +54 -0
  733. package/dist/telemetry/mcp-beacon.js.map +1 -0
  734. package/dist/telemetry/metadata-normalization.d.ts +7 -0
  735. package/dist/telemetry/metadata-normalization.d.ts.map +1 -0
  736. package/dist/telemetry/metadata-normalization.js +189 -0
  737. package/dist/telemetry/metadata-normalization.js.map +1 -0
  738. package/dist/telemetry/meter-service-client.d.ts.map +1 -1
  739. package/dist/telemetry/meter-service-client.js +5 -10
  740. package/dist/telemetry/meter-service-client.js.map +1 -1
  741. package/dist/telemetry/metrics.d.ts +123 -0
  742. package/dist/telemetry/metrics.d.ts.map +1 -0
  743. package/dist/telemetry/metrics.js +184 -0
  744. package/dist/telemetry/metrics.js.map +1 -0
  745. package/dist/telemetry/turn-tracker.d.ts +1 -0
  746. package/dist/telemetry/turn-tracker.d.ts.map +1 -1
  747. package/dist/telemetry/turn-tracker.js +22 -1
  748. package/dist/telemetry/turn-tracker.js.map +1 -1
  749. package/dist/telemetry/wide-events.d.ts +31 -1
  750. package/dist/telemetry/wide-events.d.ts.map +1 -1
  751. package/dist/telemetry/wide-events.js +229 -1
  752. package/dist/telemetry/wide-events.js.map +1 -1
  753. package/dist/telemetry.d.ts +39 -3
  754. package/dist/telemetry.d.ts.map +1 -1
  755. package/dist/telemetry.js +160 -3
  756. package/dist/telemetry.js.map +1 -1
  757. package/dist/testing/test-verification-hook.d.ts.map +1 -1
  758. package/dist/testing/test-verification-hook.js +34 -21
  759. package/dist/testing/test-verification-hook.js.map +1 -1
  760. package/dist/tools/apply-patch-parser.d.ts +26 -0
  761. package/dist/tools/apply-patch-parser.d.ts.map +1 -0
  762. package/dist/tools/apply-patch-parser.js +146 -0
  763. package/dist/tools/apply-patch-parser.js.map +1 -0
  764. package/dist/tools/apply-patch.d.ts +42 -0
  765. package/dist/tools/apply-patch.d.ts.map +1 -0
  766. package/dist/tools/apply-patch.js +648 -0
  767. package/dist/tools/apply-patch.js.map +1 -0
  768. package/dist/tools/ask-user.d.ts +1 -0
  769. package/dist/tools/ask-user.d.ts.map +1 -1
  770. package/dist/tools/background/tool-handler.d.ts +1 -0
  771. package/dist/tools/background/tool-handler.d.ts.map +1 -1
  772. package/dist/tools/bash.d.ts +1 -0
  773. package/dist/tools/bash.d.ts.map +1 -1
  774. package/dist/tools/codesearch.d.ts +1 -0
  775. package/dist/tools/codesearch.d.ts.map +1 -1
  776. package/dist/tools/conductor-client.d.ts +1 -0
  777. package/dist/tools/conductor-client.d.ts.map +1 -1
  778. package/dist/tools/conductor-client.js +63 -0
  779. package/dist/tools/conductor-client.js.map +1 -1
  780. package/dist/tools/diff.d.ts +1 -0
  781. package/dist/tools/diff.d.ts.map +1 -1
  782. package/dist/tools/edit.d.ts +1 -0
  783. package/dist/tools/edit.d.ts.map +1 -1
  784. package/dist/tools/extract-document.d.ts +1 -0
  785. package/dist/tools/extract-document.d.ts.map +1 -1
  786. package/dist/tools/find.d.ts +10 -0
  787. package/dist/tools/find.d.ts.map +1 -1
  788. package/dist/tools/find.js +236 -27
  789. package/dist/tools/find.js.map +1 -1
  790. package/dist/tools/gh.d.ts +3 -0
  791. package/dist/tools/gh.d.ts.map +1 -1
  792. package/dist/tools/index.d.ts +50 -0
  793. package/dist/tools/index.d.ts.map +1 -1
  794. package/dist/tools/index.js +4 -0
  795. package/dist/tools/index.js.map +1 -1
  796. package/dist/tools/list.d.ts +1 -0
  797. package/dist/tools/list.d.ts.map +1 -1
  798. package/dist/tools/notebook.d.ts +1 -0
  799. package/dist/tools/notebook.d.ts.map +1 -1
  800. package/dist/tools/oracle.d.ts +1 -0
  801. package/dist/tools/oracle.d.ts.map +1 -1
  802. package/dist/tools/oracle.js +17 -32
  803. package/dist/tools/oracle.js.map +1 -1
  804. package/dist/tools/parallel-execution.d.ts +13 -2
  805. package/dist/tools/parallel-execution.d.ts.map +1 -1
  806. package/dist/tools/parallel-execution.js +178 -7
  807. package/dist/tools/parallel-execution.js.map +1 -1
  808. package/dist/tools/parallel-ripgrep.d.ts +1 -0
  809. package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
  810. package/dist/tools/pipeline.d.ts +4 -0
  811. package/dist/tools/pipeline.d.ts.map +1 -1
  812. package/dist/tools/read.d.ts +1 -0
  813. package/dist/tools/read.d.ts.map +1 -1
  814. package/dist/tools/search.d.ts +1 -0
  815. package/dist/tools/search.d.ts.map +1 -1
  816. package/dist/tools/status.d.ts +1 -0
  817. package/dist/tools/status.d.ts.map +1 -1
  818. package/dist/tools/todo.d.ts +1 -0
  819. package/dist/tools/todo.d.ts.map +1 -1
  820. package/dist/tools/tool-dsl.d.ts +5 -1
  821. package/dist/tools/tool-dsl.d.ts.map +1 -1
  822. package/dist/tools/tool-dsl.js +1 -0
  823. package/dist/tools/tool-dsl.js.map +1 -1
  824. package/dist/tools/tool-result-cache.d.ts.map +1 -1
  825. package/dist/tools/tool-result-cache.js +1 -0
  826. package/dist/tools/tool-result-cache.js.map +1 -1
  827. package/dist/tools/typebox-tool.d.ts.map +1 -1
  828. package/dist/tools/typebox-tool.js +3 -0
  829. package/dist/tools/typebox-tool.js.map +1 -1
  830. package/dist/tools/webfetch.d.ts +1 -0
  831. package/dist/tools/webfetch.d.ts.map +1 -1
  832. package/dist/tools/websearch.d.ts +1 -0
  833. package/dist/tools/websearch.d.ts.map +1 -1
  834. package/dist/tools/write.d.ts +1 -0
  835. package/dist/tools/write.d.ts.map +1 -1
  836. package/dist/utils/abort-error.d.ts +2 -0
  837. package/dist/utils/abort-error.d.ts.map +1 -0
  838. package/dist/utils/abort-error.js +7 -0
  839. package/dist/utils/abort-error.js.map +1 -0
  840. package/dist/utils/downstream.d.ts.map +1 -1
  841. package/dist/utils/downstream.js +4 -0
  842. package/dist/utils/downstream.js.map +1 -1
  843. package/dist/utils/logger.d.ts +3 -0
  844. package/dist/utils/logger.d.ts.map +1 -1
  845. package/dist/utils/logger.js +14 -3
  846. package/dist/utils/logger.js.map +1 -1
  847. package/dist/utils/path-containment.d.ts +2 -0
  848. package/dist/utils/path-containment.d.ts.map +1 -0
  849. package/dist/utils/path-containment.js +14 -0
  850. package/dist/utils/path-containment.js.map +1 -0
  851. package/dist/utils/prompt-safe-text.d.ts +7 -0
  852. package/dist/utils/prompt-safe-text.d.ts.map +1 -0
  853. package/dist/utils/prompt-safe-text.js +44 -0
  854. package/dist/utils/prompt-safe-text.js.map +1 -0
  855. package/dist/version.json +2 -2
  856. package/dist/web-server.d.ts.map +1 -1
  857. package/dist/web-server.js +32 -7
  858. package/dist/web-server.js.map +1 -1
  859. package/dist/workspace/root-resolver.d.ts +4 -1
  860. package/dist/workspace/root-resolver.d.ts.map +1 -1
  861. package/dist/workspace/root-resolver.js +16 -6
  862. package/dist/workspace/root-resolver.js.map +1 -1
  863. package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts +8 -0
  864. package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts.map +1 -0
  865. package/node_modules/@evalops/contracts/dist/advisor-effort.js +35 -0
  866. package/node_modules/@evalops/contracts/dist/advisor-effort.js.map +1 -0
  867. package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts +10 -0
  868. package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts.map +1 -0
  869. package/node_modules/@evalops/contracts/dist/delegation-prompt.js +48 -0
  870. package/node_modules/@evalops/contracts/dist/delegation-prompt.js.map +1 -0
  871. package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts +20 -0
  872. package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts.map +1 -0
  873. package/node_modules/@evalops/contracts/dist/guarded-files-settings.js +147 -0
  874. package/node_modules/@evalops/contracts/dist/guarded-files-settings.js.map +1 -0
  875. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts +2 -0
  876. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts.map +1 -1
  877. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js +1 -0
  878. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js.map +1 -1
  879. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +280 -5
  880. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
  881. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +36 -1
  882. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
  883. package/node_modules/@evalops/contracts/dist/index.d.ts +15 -1
  884. package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  885. package/node_modules/@evalops/contracts/dist/index.js +6 -0
  886. package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  887. package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +593 -0
  888. package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -0
  889. package/node_modules/@evalops/contracts/dist/maestro-app-server.js +218 -0
  890. package/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -0
  891. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +91 -0
  892. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
  893. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +92 -61
  894. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
  895. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +3 -0
  896. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -1
  897. package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts +28 -0
  898. package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts.map +1 -0
  899. package/node_modules/@evalops/contracts/dist/runtime-constraints.js +71 -0
  900. package/node_modules/@evalops/contracts/dist/runtime-constraints.js.map +1 -0
  901. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +7 -0
  902. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -1
  903. package/node_modules/@evalops/contracts/dist/runtime-server-request.js +2 -0
  904. package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -1
  905. package/node_modules/@evalops/contracts/dist/scenario.d.ts +191 -0
  906. package/node_modules/@evalops/contracts/dist/scenario.d.ts.map +1 -0
  907. package/node_modules/@evalops/contracts/dist/scenario.js +4 -0
  908. package/node_modules/@evalops/contracts/dist/scenario.js.map +1 -0
  909. package/node_modules/@evalops/contracts/dist/schemas.d.ts +17 -3
  910. package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
  911. package/node_modules/@evalops/contracts/dist/schemas.js +16 -0
  912. package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
  913. package/node_modules/@evalops/contracts/package.json +1 -1
  914. package/node_modules/@evalops/tui/package.json +1 -1
  915. package/package.json +41 -7
  916. package/skills/incident-triage/SKILL.md +40 -0
  917. package/skills/incident-triage/mcp.json +14 -0
  918. package/skills/incident-triage/reference/triage.md +20 -0
  919. package/skills/incident-triage/toolbox/incident-timeline +22 -0
  920. package/skills/incident-triage/toolbox/incident-timeline.cmd +16 -0
  921. package/skills/pr-review/SKILL.md +40 -0
  922. package/skills/pr-review/mcp.json +14 -0
  923. package/skills/pr-review/reference/rubric.md +20 -0
  924. package/skills/pr-review/toolbox/review-summary +20 -0
  925. package/skills/pr-review/toolbox/review-summary.cmd +14 -0
  926. package/skills/release-verification/SKILL.md +40 -0
  927. package/skills/release-verification/mcp.json +15 -0
  928. package/skills/release-verification/reference/checklist.md +21 -0
  929. package/skills/release-verification/toolbox/release-readiness +18 -0
  930. package/skills/release-verification/toolbox/release-readiness.cmd +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"suspicious-patterns.js","sourceRoot":"","sources":["../../src/safety/suspicious-patterns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Suspicious sequence patterns for the tool sequence analyzer\n *\n * Contains the pattern definitions that detect potentially malicious\n * tool call sequences.\n *\n * @module safety/suspicious-patterns\n */\n\nimport type { SequencePattern } from \"./sequence-analyzer-types.js\";\nimport { containsSensitivePath, getToolTags } from \"./tool-categorization.js\";\n\n/**\n * Suspicious sequence patterns\n */\nexport const SUSPICIOUS_PATTERNS: SequencePattern[] = [\n\t{\n\t\tid: \"read-then-egress\",\n\t\tdescription: \"Sensitive file read followed by network egress\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"egress\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent sensitive reads\n\t\t\tconst sensitiveReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 60000 && r.tags.has(\"read\") && containsSensitivePath(r.args)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (sensitiveReads.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Network egress detected after reading sensitive files: ${sensitiveReads.map((r) => r.tool).join(\", \")}`,\n\t\t\t\t\tmatchingRecords: sensitiveReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"rapid-auth-failures\",\n\t\tdescription: \"Multiple authentication attempts in short time\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 30000, // 30 seconds\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"auth\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count recent auth operations\n\t\t\tconst recentAuthOps = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 30000 && r.tags.has(\"auth\");\n\t\t\t});\n\n\t\t\tif (recentAuthOps.length >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Multiple authentication operations detected (${recentAuthOps.length + 1} in 30s)`,\n\t\t\t\t\tmatchingRecords: recentAuthOps,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"system-path-escalation\",\n\t\tdescription: \"Normal operations followed by system path modifications\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (_records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\n\t\t\t// Check if current operation targets system paths\n\t\t\tconst systemPaths = [\n\t\t\t\t\"/etc/\",\n\t\t\t\t\"/usr/\",\n\t\t\t\t\"/var/\",\n\t\t\t\t\"/boot/\",\n\t\t\t\t\"/sys/\",\n\t\t\t\t\"/proc/\",\n\t\t\t\t\"/dev/\",\n\t\t\t\t\"C:\\\\Windows\",\n\t\t\t\t\"C:\\\\Program Files\",\n\t\t\t];\n\n\t\t\tconst targetPath = (currentArgs.path ||\n\t\t\t\tcurrentArgs.file_path ||\n\t\t\t\tcurrentArgs.target) as string | undefined;\n\n\t\t\tif (\n\t\t\t\ttargetPath &&\n\t\t\t\t(currentTags.has(\"write\") || currentTags.has(\"delete\")) &&\n\t\t\t\tsystemPaths.some((sp) => targetPath.startsWith(sp))\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Modification of system path detected: ${targetPath}`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"reconnaissance-pattern\",\n\t\tdescription: \"Systematic reading of configuration/credential files\",\n\t\tseverity: \"medium\",\n\t\taction: \"log\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"read\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count reads to sensitive-looking paths\n\t\t\tconst sensitivePathReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 120000 && r.tags.has(\"read\") && containsSensitivePath(r.args)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// If current read is also to sensitive path and we have many recent ones\n\t\t\tif (\n\t\t\t\tcontainsSensitivePath(currentArgs) &&\n\t\t\t\tsensitivePathReads.length >= 3\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Reconnaissance pattern detected: ${sensitivePathReads.length + 1} reads of sensitive paths`,\n\t\t\t\t\tmatchingRecords: sensitivePathReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"git-push-without-review\",\n\t\tdescription: \"Git push without apparent review or testing\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 300000, // 5 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tconst isGitPush =\n\t\t\t\tnormalizedTool === \"bash\" &&\n\t\t\t\ttypeof currentArgs.command === \"string\" &&\n\t\t\t\t/git\\s+push/.test(currentArgs.command);\n\n\t\t\tif (!isGitPush) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent test runs or review operations\n\t\t\tconst recentTests = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 300000) return false;\n\n\t\t\t\t// Check if it looks like a test or review\n\t\t\t\tconst cmd = (r.args.command as string) || \"\";\n\t\t\t\treturn (\n\t\t\t\t\t/test|spec|lint|check|review|verify/.test(cmd.toLowerCase()) ||\n\t\t\t\t\t/npm\\s+test|bun\\s+test|pytest|jest|vitest/.test(cmd)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (recentTests.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Git push detected without apparent testing or review\",\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"rapid-file-deletions\",\n\t\tdescription: \"Multiple file deletions in rapid succession\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 30000, // 30 seconds\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"delete\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\tconst recentDeletes = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 30000 && r.tags.has(\"delete\");\n\t\t\t});\n\n\t\t\tif (recentDeletes.length >= 5) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Rapid file deletions detected (${recentDeletes.length + 1} in 30s)`,\n\t\t\t\t\tmatchingRecords: recentDeletes,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"exec-after-download\",\n\t\tdescription: \"Execution shortly after downloading content\",\n\t\tseverity: \"critical\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"exec\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent downloads/fetches\n\t\t\tconst recentDownloads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 60000 && (r.tags.has(\"egress\") || r.tool.includes(\"fetch\"))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// Check if current command might be executing downloaded content\n\t\t\tconst command = (currentArgs.command as string) || \"\";\n\t\t\tconst suspiciousPatterns = [\n\t\t\t\t/curl.*\\|.*sh/,\n\t\t\t\t/wget.*\\|.*sh/,\n\t\t\t\t/bash\\s+\\/tmp/,\n\t\t\t\t/sh\\s+\\/tmp/,\n\t\t\t\t/python.*\\/tmp/,\n\t\t\t\t/node.*\\/tmp/,\n\t\t\t];\n\n\t\t\tconst isSuspiciousExec = suspiciousPatterns.some((p) => p.test(command));\n\n\t\t\tif (recentDownloads.length > 0 && isSuspiciousExec) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Execution of potentially downloaded content detected\",\n\t\t\t\t\tmatchingRecords: recentDownloads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"data-staging\",\n\t\tdescription: \"Multiple file reads followed by write to temporary location\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"write\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Check if writing to temp/staging location\n\t\t\tconst targetPath = (currentArgs.path ||\n\t\t\t\tcurrentArgs.file_path ||\n\t\t\t\tcurrentArgs.target) as string | undefined;\n\t\t\tconst tempPatterns = [\n\t\t\t\t/\\/tmp\\//,\n\t\t\t\t/\\/var\\/tmp\\//,\n\t\t\t\t/\\/temp\\//,\n\t\t\t\t/\\.tmp$/,\n\t\t\t\t/staging/i,\n\t\t\t\t/upload/i,\n\t\t\t];\n\t\t\tconst isWriteToTemp =\n\t\t\t\ttargetPath && tempPatterns.some((p) => p.test(targetPath));\n\n\t\t\tif (!isWriteToTemp) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for multiple recent reads\n\t\t\tconst recentReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 120000 && r.tags.has(\"read\");\n\t\t\t});\n\n\t\t\tif (recentReads.length >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Data staging detected: ${recentReads.length} reads followed by write to ${targetPath}`,\n\t\t\t\t\tmatchingRecords: recentReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"privilege-escalation-attempt\",\n\t\tdescription: \"Privilege escalation command after reading configuration\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tif (normalizedTool !== \"bash\") {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\tconst command = (currentArgs.command as string) || \"\";\n\t\t\tconst escalationPatterns = [\n\t\t\t\t/sudo\\s/,\n\t\t\t\t/chmod\\s+[0-7]*[7][0-7]*/, // chmod with execute bit\n\t\t\t\t/chown\\s/,\n\t\t\t\t/chgrp\\s/,\n\t\t\t\t/setuid/,\n\t\t\t\t/setgid/,\n\t\t\t\t/visudo/,\n\t\t\t\t/passwd/,\n\t\t\t\t/usermod/,\n\t\t\t\t/groupadd/,\n\t\t\t\t/useradd/,\n\t\t\t];\n\n\t\t\tconst isEscalationCommand = escalationPatterns.some((p) =>\n\t\t\t\tp.test(command),\n\t\t\t);\n\n\t\t\tif (!isEscalationCommand) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent config/credential reads\n\t\t\tconst configReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 120000) return false;\n\n\t\t\t\tconst pathArg = (r.args.path || r.args.file_path) as string | undefined;\n\t\t\t\tconst configPatterns = [\n\t\t\t\t\t/\\/etc\\//,\n\t\t\t\t\t/\\.conf$/,\n\t\t\t\t\t/\\.cfg$/,\n\t\t\t\t\t/config/i,\n\t\t\t\t\t/\\.env/,\n\t\t\t\t\t/credentials/i,\n\t\t\t\t];\n\t\t\t\treturn (\n\t\t\t\t\tr.tags.has(\"read\") &&\n\t\t\t\t\tpathArg &&\n\t\t\t\t\tconfigPatterns.some((p) => p.test(pathArg))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (configReads.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Privilege escalation attempt after reading config: ${command.slice(0, 50)}`,\n\t\t\t\t\tmatchingRecords: configReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"env-exfiltration\",\n\t\tdescription: \"Environment variable access followed by network call\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"egress\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent env reads or commands that access env vars\n\t\t\tconst envAccess = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 60000) return false;\n\n\t\t\t\t// Check if command reads env vars\n\t\t\t\tconst command = (r.args.command as string) || \"\";\n\t\t\t\tconst envPatterns = [\n\t\t\t\t\t/\\$\\{?\\w+\\}?/, // Shell variable access\n\t\t\t\t\t/env\\s/, // env command\n\t\t\t\t\t/printenv/, // printenv command\n\t\t\t\t\t/export\\s/, // export (might show vars)\n\t\t\t\t\t/process\\.env/, // Node.js env access\n\t\t\t\t\t/os\\.environ/, // Python env access\n\t\t\t\t\t/ENV\\[/, // Ruby env access\n\t\t\t\t];\n\n\t\t\t\tconst pathArg = (r.args.path || r.args.file_path) as string | undefined;\n\t\t\t\tconst isEnvFile = pathArg && /\\.env/.test(pathArg);\n\n\t\t\t\treturn (\n\t\t\t\t\tr.tags.has(\"sensitive\") ||\n\t\t\t\t\tisEnvFile ||\n\t\t\t\t\tenvPatterns.some((p) => p.test(command))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (envAccess.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Network egress detected after environment variable access\",\n\t\t\t\t\tmatchingRecords: envAccess,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"systematic-exploration\",\n\t\tdescription: \"Systematic directory listing and reading pattern\",\n\t\tseverity: \"medium\",\n\t\taction: \"log\",\n\t\twindowMs: 180000, // 3 minutes\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tconst isListOrRead =\n\t\t\t\tnormalizedTool.includes(\"glob\") ||\n\t\t\t\tnormalizedTool.includes(\"ls\") ||\n\t\t\t\tnormalizedTool.includes(\"read\") ||\n\t\t\t\tnormalizedTool.includes(\"list\");\n\n\t\t\tif (!isListOrRead) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count alternating list/read operations\n\t\t\tconst recentOps = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 180000;\n\t\t\t});\n\n\t\t\t// Look for list -> read -> list -> read pattern\n\t\t\tlet listCount = 0;\n\t\t\tlet readCount = 0;\n\t\t\tlet alternations = 0;\n\t\t\tlet lastWasRead = false;\n\n\t\t\tfor (const r of recentOps) {\n\t\t\t\tconst isRead = r.tags.has(\"read\");\n\t\t\t\tconst isList =\n\t\t\t\t\tr.tool.toLowerCase().includes(\"glob\") ||\n\t\t\t\t\tr.tool.toLowerCase().includes(\"ls\") ||\n\t\t\t\t\tr.tool.toLowerCase().includes(\"list\");\n\n\t\t\t\tif (isRead) {\n\t\t\t\t\treadCount++;\n\t\t\t\t\tif (!lastWasRead && listCount > 0) alternations++;\n\t\t\t\t\tlastWasRead = true;\n\t\t\t\t} else if (isList) {\n\t\t\t\t\tlistCount++;\n\t\t\t\t\tlastWasRead = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (alternations >= 3 && listCount >= 2 && readCount >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Systematic exploration pattern: ${listCount} listings, ${readCount} reads, ${alternations} alternations`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"mass-modification\",\n\t\tdescription: \"Large number of file modifications in short period\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"write\") && !currentTags.has(\"edit\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count recent modifications\n\t\t\tconst recentMods = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 60000 && (r.tags.has(\"write\") || r.tags.has(\"edit\"));\n\t\t\t});\n\n\t\t\t// Different thresholds for edit vs write\n\t\t\tconst threshold = 10;\n\t\t\tif (recentMods.length >= threshold) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Mass file modification detected (${recentMods.length + 1} modifications in 1 minute)`,\n\t\t\t\t\tmatchingRecords: recentMods,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n];\n"]}
1
+ {"version":3,"file":"suspicious-patterns.js","sourceRoot":"","sources":["../../src/safety/suspicious-patterns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Suspicious sequence patterns for the tool sequence analyzer\n *\n * Contains the pattern definitions that detect potentially malicious\n * tool call sequences.\n *\n * @module safety/suspicious-patterns\n */\n\nimport { parseApplyPatchPaths } from \"../tools/apply-patch-parser.js\";\nimport type { SequencePattern } from \"./sequence-analyzer-types.js\";\nimport { containsSensitivePath, getToolTags } from \"./tool-categorization.js\";\n\n/**\n * Suspicious sequence patterns\n */\nexport const SUSPICIOUS_PATTERNS: SequencePattern[] = [\n\t{\n\t\tid: \"read-then-egress\",\n\t\tdescription: \"Sensitive file read followed by network egress\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"egress\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent sensitive reads\n\t\t\tconst sensitiveReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 60000 && r.tags.has(\"read\") && containsSensitivePath(r.args)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (sensitiveReads.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Network egress detected after reading sensitive files: ${sensitiveReads.map((r) => r.tool).join(\", \")}`,\n\t\t\t\t\tmatchingRecords: sensitiveReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"rapid-auth-failures\",\n\t\tdescription: \"Multiple authentication attempts in short time\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 30000, // 30 seconds\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"auth\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count recent auth operations\n\t\t\tconst recentAuthOps = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 30000 && r.tags.has(\"auth\");\n\t\t\t});\n\n\t\t\tif (recentAuthOps.length >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Multiple authentication operations detected (${recentAuthOps.length + 1} in 30s)`,\n\t\t\t\t\tmatchingRecords: recentAuthOps,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"system-path-escalation\",\n\t\tdescription: \"Normal operations followed by system path modifications\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (_records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\n\t\t\t// Check if current operation targets system paths\n\t\t\tconst systemPaths = [\n\t\t\t\t\"/etc/\",\n\t\t\t\t\"/usr/\",\n\t\t\t\t\"/var/\",\n\t\t\t\t\"/boot/\",\n\t\t\t\t\"/sys/\",\n\t\t\t\t\"/proc/\",\n\t\t\t\t\"/dev/\",\n\t\t\t\t\"C:\\\\Windows\",\n\t\t\t\t\"C:\\\\Program Files\",\n\t\t\t];\n\n\t\t\tconst targetPaths =\n\t\t\t\tcurrentTool.toLowerCase() === \"apply_patch\" &&\n\t\t\t\ttypeof currentArgs.patch === \"string\"\n\t\t\t\t\t? parseApplyPatchPaths(currentArgs.patch)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t(currentArgs.path ||\n\t\t\t\t\t\t\t\tcurrentArgs.file_path ||\n\t\t\t\t\t\t\t\tcurrentArgs.target) as string | undefined,\n\t\t\t\t\t\t].filter((path): path is string => typeof path === \"string\");\n\n\t\t\tif (\n\t\t\t\t(currentTags.has(\"write\") || currentTags.has(\"delete\")) &&\n\t\t\t\ttargetPaths.some((targetPath) =>\n\t\t\t\t\tsystemPaths.some((sp) => targetPath.startsWith(sp)),\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Modification of system path detected: ${targetPaths.join(\", \")}`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"reconnaissance-pattern\",\n\t\tdescription: \"Systematic reading of configuration/credential files\",\n\t\tseverity: \"medium\",\n\t\taction: \"log\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"read\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count reads to sensitive-looking paths\n\t\t\tconst sensitivePathReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 120000 && r.tags.has(\"read\") && containsSensitivePath(r.args)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// If current read is also to sensitive path and we have many recent ones\n\t\t\tif (\n\t\t\t\tcontainsSensitivePath(currentArgs) &&\n\t\t\t\tsensitivePathReads.length >= 3\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Reconnaissance pattern detected: ${sensitivePathReads.length + 1} reads of sensitive paths`,\n\t\t\t\t\tmatchingRecords: sensitivePathReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"git-push-without-review\",\n\t\tdescription: \"Git push without apparent review or testing\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 300000, // 5 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tconst isGitPush =\n\t\t\t\tnormalizedTool === \"bash\" &&\n\t\t\t\ttypeof currentArgs.command === \"string\" &&\n\t\t\t\t/git\\s+push/.test(currentArgs.command);\n\n\t\t\tif (!isGitPush) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent test runs or review operations\n\t\t\tconst recentTests = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 300000) return false;\n\n\t\t\t\t// Check if it looks like a test or review\n\t\t\t\tconst cmd = (r.args.command as string) || \"\";\n\t\t\t\treturn (\n\t\t\t\t\t/test|spec|lint|check|review|verify/.test(cmd.toLowerCase()) ||\n\t\t\t\t\t/npm\\s+test|bun\\s+test|pytest|jest|vitest/.test(cmd)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (recentTests.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Git push detected without apparent testing or review\",\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"rapid-file-deletions\",\n\t\tdescription: \"Multiple file deletions in rapid succession\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 30000, // 30 seconds\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"delete\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\tconst recentDeletes = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 30000 && r.tags.has(\"delete\");\n\t\t\t});\n\n\t\t\tif (recentDeletes.length >= 5) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Rapid file deletions detected (${recentDeletes.length + 1} in 30s)`,\n\t\t\t\t\tmatchingRecords: recentDeletes,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"exec-after-download\",\n\t\tdescription: \"Execution shortly after downloading content\",\n\t\tseverity: \"critical\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"exec\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent downloads/fetches\n\t\t\tconst recentDownloads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn (\n\t\t\t\t\tageMs < 60000 && (r.tags.has(\"egress\") || r.tool.includes(\"fetch\"))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// Check if current command might be executing downloaded content\n\t\t\tconst command = (currentArgs.command as string) || \"\";\n\t\t\tconst suspiciousPatterns = [\n\t\t\t\t/curl.*\\|.*sh/,\n\t\t\t\t/wget.*\\|.*sh/,\n\t\t\t\t/bash\\s+\\/tmp/,\n\t\t\t\t/sh\\s+\\/tmp/,\n\t\t\t\t/python.*\\/tmp/,\n\t\t\t\t/node.*\\/tmp/,\n\t\t\t];\n\n\t\t\tconst isSuspiciousExec = suspiciousPatterns.some((p) => p.test(command));\n\n\t\t\tif (recentDownloads.length > 0 && isSuspiciousExec) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Execution of potentially downloaded content detected\",\n\t\t\t\t\tmatchingRecords: recentDownloads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"data-staging\",\n\t\tdescription: \"Multiple file reads followed by write to temporary location\",\n\t\tseverity: \"medium\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"write\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Check if writing to temp/staging location\n\t\t\tconst targetPath = (currentArgs.path ||\n\t\t\t\tcurrentArgs.file_path ||\n\t\t\t\tcurrentArgs.target) as string | undefined;\n\t\t\tconst tempPatterns = [\n\t\t\t\t/\\/tmp\\//,\n\t\t\t\t/\\/var\\/tmp\\//,\n\t\t\t\t/\\/temp\\//,\n\t\t\t\t/\\.tmp$/,\n\t\t\t\t/staging/i,\n\t\t\t\t/upload/i,\n\t\t\t];\n\t\t\tconst isWriteToTemp =\n\t\t\t\ttargetPath && tempPatterns.some((p) => p.test(targetPath));\n\n\t\t\tif (!isWriteToTemp) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for multiple recent reads\n\t\t\tconst recentReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 120000 && r.tags.has(\"read\");\n\t\t\t});\n\n\t\t\tif (recentReads.length >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Data staging detected: ${recentReads.length} reads followed by write to ${targetPath}`,\n\t\t\t\t\tmatchingRecords: recentReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"privilege-escalation-attempt\",\n\t\tdescription: \"Privilege escalation command after reading configuration\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 120000, // 2 minutes\n\t\tdetect: (records, currentTool, currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tif (normalizedTool !== \"bash\") {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\tconst command = (currentArgs.command as string) || \"\";\n\t\t\tconst escalationPatterns = [\n\t\t\t\t/sudo\\s/,\n\t\t\t\t/chmod\\s+[0-7]*[7][0-7]*/, // chmod with execute bit\n\t\t\t\t/chown\\s/,\n\t\t\t\t/chgrp\\s/,\n\t\t\t\t/setuid/,\n\t\t\t\t/setgid/,\n\t\t\t\t/visudo/,\n\t\t\t\t/passwd/,\n\t\t\t\t/usermod/,\n\t\t\t\t/groupadd/,\n\t\t\t\t/useradd/,\n\t\t\t];\n\n\t\t\tconst isEscalationCommand = escalationPatterns.some((p) =>\n\t\t\t\tp.test(command),\n\t\t\t);\n\n\t\t\tif (!isEscalationCommand) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent config/credential reads\n\t\t\tconst configReads = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 120000) return false;\n\n\t\t\t\tconst pathArg = (r.args.path || r.args.file_path) as string | undefined;\n\t\t\t\tconst configPatterns = [\n\t\t\t\t\t/\\/etc\\//,\n\t\t\t\t\t/\\.conf$/,\n\t\t\t\t\t/\\.cfg$/,\n\t\t\t\t\t/config/i,\n\t\t\t\t\t/\\.env/,\n\t\t\t\t\t/credentials/i,\n\t\t\t\t];\n\t\t\t\treturn (\n\t\t\t\t\tr.tags.has(\"read\") &&\n\t\t\t\t\tpathArg &&\n\t\t\t\t\tconfigPatterns.some((p) => p.test(pathArg))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (configReads.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Privilege escalation attempt after reading config: ${command.slice(0, 50)}`,\n\t\t\t\t\tmatchingRecords: configReads,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"env-exfiltration\",\n\t\tdescription: \"Environment variable access followed by network call\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"egress\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Look for recent env reads or commands that access env vars\n\t\t\tconst envAccess = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\tif (ageMs > 60000) return false;\n\n\t\t\t\t// Check if command reads env vars\n\t\t\t\tconst command = (r.args.command as string) || \"\";\n\t\t\t\tconst envPatterns = [\n\t\t\t\t\t/\\$\\{?\\w+\\}?/, // Shell variable access\n\t\t\t\t\t/env\\s/, // env command\n\t\t\t\t\t/printenv/, // printenv command\n\t\t\t\t\t/export\\s/, // export (might show vars)\n\t\t\t\t\t/process\\.env/, // Node.js env access\n\t\t\t\t\t/os\\.environ/, // Python env access\n\t\t\t\t\t/ENV\\[/, // Ruby env access\n\t\t\t\t];\n\n\t\t\t\tconst pathArg = (r.args.path || r.args.file_path) as string | undefined;\n\t\t\t\tconst isEnvFile = pathArg && /\\.env/.test(pathArg);\n\n\t\t\t\treturn (\n\t\t\t\t\tr.tags.has(\"sensitive\") ||\n\t\t\t\t\tisEnvFile ||\n\t\t\t\t\tenvPatterns.some((p) => p.test(command))\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (envAccess.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: \"Network egress detected after environment variable access\",\n\t\t\t\t\tmatchingRecords: envAccess,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"systematic-exploration\",\n\t\tdescription: \"Systematic directory listing and reading pattern\",\n\t\tseverity: \"medium\",\n\t\taction: \"log\",\n\t\twindowMs: 180000, // 3 minutes\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst normalizedTool = currentTool.toLowerCase();\n\t\t\tconst isListOrRead =\n\t\t\t\tnormalizedTool.includes(\"glob\") ||\n\t\t\t\tnormalizedTool.includes(\"ls\") ||\n\t\t\t\tnormalizedTool.includes(\"read\") ||\n\t\t\t\tnormalizedTool.includes(\"list\");\n\n\t\t\tif (!isListOrRead) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count alternating list/read operations\n\t\t\tconst recentOps = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 180000;\n\t\t\t});\n\n\t\t\t// Look for list -> read -> list -> read pattern\n\t\t\tlet listCount = 0;\n\t\t\tlet readCount = 0;\n\t\t\tlet alternations = 0;\n\t\t\tlet lastWasRead = false;\n\n\t\t\tfor (const r of recentOps) {\n\t\t\t\tconst isRead = r.tags.has(\"read\");\n\t\t\t\tconst isList =\n\t\t\t\t\tr.tool.toLowerCase().includes(\"glob\") ||\n\t\t\t\t\tr.tool.toLowerCase().includes(\"ls\") ||\n\t\t\t\t\tr.tool.toLowerCase().includes(\"list\");\n\n\t\t\t\tif (isRead) {\n\t\t\t\t\treadCount++;\n\t\t\t\t\tif (!lastWasRead && listCount > 0) alternations++;\n\t\t\t\t\tlastWasRead = true;\n\t\t\t\t} else if (isList) {\n\t\t\t\t\tlistCount++;\n\t\t\t\t\tlastWasRead = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (alternations >= 3 && listCount >= 2 && readCount >= 3) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Systematic exploration pattern: ${listCount} listings, ${readCount} reads, ${alternations} alternations`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n\t{\n\t\tid: \"mass-modification\",\n\t\tdescription: \"Large number of file modifications in short period\",\n\t\tseverity: \"high\",\n\t\taction: \"require_approval\",\n\t\twindowMs: 60000, // 1 minute\n\t\tdetect: (records, currentTool, _currentArgs) => {\n\t\t\tconst currentTags = getToolTags(currentTool);\n\t\t\tif (!currentTags.has(\"write\") && !currentTags.has(\"edit\")) {\n\t\t\t\treturn { matched: false };\n\t\t\t}\n\n\t\t\t// Count recent modifications\n\t\t\tconst recentMods = records.filter((r) => {\n\t\t\t\tconst ageMs = Date.now() - r.timestamp;\n\t\t\t\treturn ageMs < 60000 && (r.tags.has(\"write\") || r.tags.has(\"edit\"));\n\t\t\t});\n\n\t\t\t// Different thresholds for edit vs write\n\t\t\tconst threshold = 10;\n\t\t\tif (recentMods.length >= threshold) {\n\t\t\t\treturn {\n\t\t\t\t\tmatched: true,\n\t\t\t\t\treason: `Mass file modification detected (${recentMods.length + 1} modifications in 1 minute)`,\n\t\t\t\t\tmatchingRecords: recentMods,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { matched: false };\n\t\t},\n\t},\n];\n"]}
@@ -12,7 +12,7 @@ export const TOOL_TAGS = {
12
12
  // Read operations
13
13
  read: ["read", "file_read", "cat", "head", "tail", "grep"],
14
14
  // Write operations
15
- write: ["write", "edit", "file_write", "touch", "mkdir"],
15
+ write: ["write", "edit", "apply_patch", "file_write", "touch", "mkdir"],
16
16
  // Delete operations
17
17
  delete: ["delete_file", "rm", "rmdir", "unlink"],
18
18
  // Network egress
@@ -1 +1 @@
1
- {"version":3,"file":"tool-categorization.js","sourceRoot":"","sources":["../../src/safety/tool-categorization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tool categorization utilities for the sequence analyzer\n *\n * Provides tag-based classification of tools and sensitive path detection.\n *\n * @module safety/tool-categorization\n */\n\n/**\n * Tool tags for categorization\n */\nexport const TOOL_TAGS: Record<string, string[]> = {\n\t// Read operations\n\tread: [\"read\", \"file_read\", \"cat\", \"head\", \"tail\", \"grep\"],\n\t// Write operations\n\twrite: [\"write\", \"edit\", \"file_write\", \"touch\", \"mkdir\"],\n\t// Delete operations\n\tdelete: [\"delete_file\", \"rm\", \"rmdir\", \"unlink\"],\n\t// Network egress\n\tegress: [\n\t\t\"web_fetch\",\n\t\t\"webfetch\",\n\t\t\"fetch\",\n\t\t\"http_request\",\n\t\t\"curl\",\n\t\t\"wget\",\n\t\t\"send_email\",\n\t\t\"send_message\",\n\t],\n\t// Execution\n\texec: [\"bash\", \"exec\", \"run\", \"spawn\", \"shell\"],\n\t// System paths\n\tsystem: [\"sudo\", \"chmod\", \"chown\", \"chroot\"],\n\t// Sensitive data access\n\tsensitive: [\"read_env\", \"read_secrets\", \"read_config\", \"get_credentials\"],\n\t// Git operations\n\tgit: [\"git\", \"gh\", \"git_push\", \"git_commit\"],\n\t// Authentication\n\tauth: [\"login\", \"authenticate\", \"verify_token\", \"check_password\"],\n};\n\n/**\n * Check if tool name matches a pattern using word-boundary logic\n * This handles cases like:\n * - \"read\" matches \"read\" (exact)\n * - \"file_read\" matches \"read\" (ends with pattern)\n * - \"read_file\" matches \"read\" (starts with pattern)\n * - \"my_read_file\" matches \"read\" (pattern in middle at word boundary)\n * But avoids false positives like:\n * - \"reader\" should NOT match \"read\" (pattern is substring, not word)\n */\nexport function matchesToolPattern(toolName: string, pattern: string): boolean {\n\t// Exact match\n\tif (toolName === pattern) {\n\t\treturn true;\n\t}\n\n\t// Word-boundary match using regex\n\t// Match pattern at start, end, or surrounded by word separators (_, -)\n\tconst escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\tconst wordBoundaryRegex = new RegExp(`(?:^|[_-])${escaped}(?:[_-]|$)`, \"i\");\n\n\treturn wordBoundaryRegex.test(toolName);\n}\n\n/**\n * Get tags for a tool based on its name\n */\nexport function getToolTags(toolName: string): Set<string> {\n\tconst tags = new Set<string>();\n\n\tconst normalizedName = toolName.toLowerCase();\n\n\tfor (const [tag, patterns] of Object.entries(TOOL_TAGS)) {\n\t\tif (patterns.some((p) => matchesToolPattern(normalizedName, p))) {\n\t\t\ttags.add(tag);\n\t\t}\n\t}\n\n\t// Special cases based on tool naming conventions\n\tif (normalizedName.includes(\"mcp_\")) {\n\t\t// MCP tools might need specific handling\n\t\tif (normalizedName.includes(\"send\") || normalizedName.includes(\"post\")) {\n\t\t\ttags.add(\"egress\");\n\t\t}\n\t\tif (normalizedName.includes(\"read\") || normalizedName.includes(\"get\")) {\n\t\t\ttags.add(\"read\");\n\t\t}\n\t}\n\n\treturn tags;\n}\n\n/**\n * Check if args contain paths to sensitive locations\n */\nexport function containsSensitivePath(args: Record<string, unknown>): boolean {\n\tconst sensitivePatterns = [\n\t\t/\\/etc\\//,\n\t\t/\\/var\\/log\\//,\n\t\t/\\.ssh\\//,\n\t\t/\\.aws\\//,\n\t\t/\\.env/,\n\t\t/credentials/i,\n\t\t/secrets?/i,\n\t\t/password/i,\n\t\t/token/i,\n\t\t/private[_-]?key/i,\n\t];\n\n\tconst checkValue = (value: unknown): boolean => {\n\t\tif (typeof value === \"string\") {\n\t\t\treturn sensitivePatterns.some((p) => p.test(value));\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.some(checkValue);\n\t\t}\n\t\tif (value && typeof value === \"object\") {\n\t\t\treturn Object.values(value).some(checkValue);\n\t\t}\n\t\treturn false;\n\t};\n\n\treturn checkValue(args);\n}\n"]}
1
+ {"version":3,"file":"tool-categorization.js","sourceRoot":"","sources":["../../src/safety/tool-categorization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tool categorization utilities for the sequence analyzer\n *\n * Provides tag-based classification of tools and sensitive path detection.\n *\n * @module safety/tool-categorization\n */\n\n/**\n * Tool tags for categorization\n */\nexport const TOOL_TAGS: Record<string, string[]> = {\n\t// Read operations\n\tread: [\"read\", \"file_read\", \"cat\", \"head\", \"tail\", \"grep\"],\n\t// Write operations\n\twrite: [\"write\", \"edit\", \"apply_patch\", \"file_write\", \"touch\", \"mkdir\"],\n\t// Delete operations\n\tdelete: [\"delete_file\", \"rm\", \"rmdir\", \"unlink\"],\n\t// Network egress\n\tegress: [\n\t\t\"web_fetch\",\n\t\t\"webfetch\",\n\t\t\"fetch\",\n\t\t\"http_request\",\n\t\t\"curl\",\n\t\t\"wget\",\n\t\t\"send_email\",\n\t\t\"send_message\",\n\t],\n\t// Execution\n\texec: [\"bash\", \"exec\", \"run\", \"spawn\", \"shell\"],\n\t// System paths\n\tsystem: [\"sudo\", \"chmod\", \"chown\", \"chroot\"],\n\t// Sensitive data access\n\tsensitive: [\"read_env\", \"read_secrets\", \"read_config\", \"get_credentials\"],\n\t// Git operations\n\tgit: [\"git\", \"gh\", \"git_push\", \"git_commit\"],\n\t// Authentication\n\tauth: [\"login\", \"authenticate\", \"verify_token\", \"check_password\"],\n};\n\n/**\n * Check if tool name matches a pattern using word-boundary logic\n * This handles cases like:\n * - \"read\" matches \"read\" (exact)\n * - \"file_read\" matches \"read\" (ends with pattern)\n * - \"read_file\" matches \"read\" (starts with pattern)\n * - \"my_read_file\" matches \"read\" (pattern in middle at word boundary)\n * But avoids false positives like:\n * - \"reader\" should NOT match \"read\" (pattern is substring, not word)\n */\nexport function matchesToolPattern(toolName: string, pattern: string): boolean {\n\t// Exact match\n\tif (toolName === pattern) {\n\t\treturn true;\n\t}\n\n\t// Word-boundary match using regex\n\t// Match pattern at start, end, or surrounded by word separators (_, -)\n\tconst escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\tconst wordBoundaryRegex = new RegExp(`(?:^|[_-])${escaped}(?:[_-]|$)`, \"i\");\n\n\treturn wordBoundaryRegex.test(toolName);\n}\n\n/**\n * Get tags for a tool based on its name\n */\nexport function getToolTags(toolName: string): Set<string> {\n\tconst tags = new Set<string>();\n\n\tconst normalizedName = toolName.toLowerCase();\n\n\tfor (const [tag, patterns] of Object.entries(TOOL_TAGS)) {\n\t\tif (patterns.some((p) => matchesToolPattern(normalizedName, p))) {\n\t\t\ttags.add(tag);\n\t\t}\n\t}\n\n\t// Special cases based on tool naming conventions\n\tif (normalizedName.includes(\"mcp_\")) {\n\t\t// MCP tools might need specific handling\n\t\tif (normalizedName.includes(\"send\") || normalizedName.includes(\"post\")) {\n\t\t\ttags.add(\"egress\");\n\t\t}\n\t\tif (normalizedName.includes(\"read\") || normalizedName.includes(\"get\")) {\n\t\t\ttags.add(\"read\");\n\t\t}\n\t}\n\n\treturn tags;\n}\n\n/**\n * Check if args contain paths to sensitive locations\n */\nexport function containsSensitivePath(args: Record<string, unknown>): boolean {\n\tconst sensitivePatterns = [\n\t\t/\\/etc\\//,\n\t\t/\\/var\\/log\\//,\n\t\t/\\.ssh\\//,\n\t\t/\\.aws\\//,\n\t\t/\\.env/,\n\t\t/credentials/i,\n\t\t/secrets?/i,\n\t\t/password/i,\n\t\t/token/i,\n\t\t/private[_-]?key/i,\n\t];\n\n\tconst checkValue = (value: unknown): boolean => {\n\t\tif (typeof value === \"string\") {\n\t\t\treturn sensitivePatterns.some((p) => p.test(value));\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.some(checkValue);\n\t\t}\n\t\tif (value && typeof value === \"object\") {\n\t\t\treturn Object.values(value).some(checkValue);\n\t\t}\n\t\treturn false;\n\t};\n\n\treturn checkValue(args);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"path-policy-validator.d.ts","sourceRoot":"","sources":["../../../src/safety/validators/path-policy-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAiDrD;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,MAAM,EAAE,CAoFV;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAChD;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBvC"}
1
+ {"version":3,"file":"path-policy-validator.d.ts","sourceRoot":"","sources":["../../../src/safety/validators/path-policy-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAG5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAiDrD;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,MAAM,EAAE,CA2FV;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAChD;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBvC"}
@@ -1,3 +1,4 @@
1
+ import { parseApplyPatchPaths } from "../../tools/apply-patch-parser.js";
1
2
  import { matchesPathPattern } from "../../utils/path-matcher.js";
2
3
  const PATH_KEYS = [
3
4
  "path",
@@ -45,6 +46,12 @@ export function extractPolicyFilePaths(context) {
45
46
  if (!args)
46
47
  return [];
47
48
  const paths = [];
49
+ if (context.toolName === "apply_patch") {
50
+ const patch = getStringArg(context, "patch");
51
+ if (patch) {
52
+ paths.push(...parseApplyPatchPaths(patch));
53
+ }
54
+ }
48
55
  for (const key of PATH_KEYS) {
49
56
  const value = args[key];
50
57
  if (typeof value === "string" && value.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"path-policy-validator.js","sourceRoot":"","sources":["../../../src/safety/validators/path-policy-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionApprovalContext } from \"../../agent/action-approval.js\";\nimport { matchesPathPattern } from \"../../utils/path-matcher.js\";\nimport type { EnterprisePolicy } from \"../policy.js\";\n\nconst PATH_KEYS = [\n\t\"path\",\n\t\"file_path\",\n\t\"filePath\",\n\t\"file\",\n\t\"files\",\n\t\"directory\",\n\t\"dir\",\n\t\"target\",\n\t\"source\",\n\t\"destination\",\n\t\"cwd\",\n\t\"output\",\n\t\"input\",\n\t\"src\",\n\t\"dest\",\n\t\"config\",\n\t\"workspace\",\n\t\"folder\",\n\t\"target_file\",\n\t\"target_directory\",\n];\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction getCommandArg(context: ActionApprovalContext): string | null {\n\treturn getStringArg(context, \"command\");\n}\n\n/**\n * Extract file paths from tool arguments.\n */\nexport function extractPolicyFilePaths(\n\tcontext: ActionApprovalContext,\n): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\n\tconst paths: string[] = [];\n\n\tfor (const key of PATH_KEYS) {\n\t\tconst value = args[key];\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\tpaths.push(value);\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const item of value) {\n\t\t\t\tif (typeof item === \"string\" && item.length > 0) {\n\t\t\t\t\tpaths.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (context.toolName === \"bash\" || context.toolName === \"background_tasks\") {\n\t\tconst command = getCommandArg(context);\n\t\tif (command) {\n\t\t\tconst fileCommands =\n\t\t\t\t/(?:cd|cat|rm|mv|cp|mkdir|touch|nano|vim|vi|less|more|head|tail|chmod|chown|strings|hexdump|dd|tee|ln|readlink|stat|file|wc|grep|sed|awk|sort|uniq|diff|patch|tar|gzip|gunzip|zip|unzip|find|rsync|scp)\\s+((?:[^\\s;&|<>`$()]|\\\\.)+(?:\\s+(?:[^\\s;&|<>`$()]|\\\\.)+)*)/gi;\n\n\t\t\tconst matches = command.matchAll(fileCommands);\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst argsStr = match[1];\n\t\t\t\tif (!argsStr) continue;\n\t\t\t\tconst argParts = argsStr.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\tfor (const arg of argParts) {\n\t\t\t\t\tconst cleaned = arg.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tcleaned &&\n\t\t\t\t\t\t!cleaned.startsWith(\"-\") &&\n\t\t\t\t\t\tcleaned.length > 0 &&\n\t\t\t\t\t\t!/^[<>|&;]/.test(cleaned)\n\t\t\t\t\t) {\n\t\t\t\t\t\tpaths.push(cleaned);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst redirectPattern = /[<>]{1,2}\\s*([^\\s<>|&;]+)/g;\n\t\t\tconst redirectMatches = command.matchAll(redirectPattern);\n\t\t\tfor (const match of redirectMatches) {\n\t\t\t\tconst rawPath = match[1];\n\t\t\t\tif (!rawPath) continue;\n\t\t\t\tconst path = rawPath.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\tif (path && path.length > 0) {\n\t\t\t\t\tpaths.push(path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst cmdSubPattern = /(?:\\$\\(|<\\()([^)]+)\\)|`([^`]+)`/g;\n\t\t\tconst cmdSubMatches = command.matchAll(cmdSubPattern);\n\t\t\tfor (const match of cmdSubMatches) {\n\t\t\t\tconst innerCmd = match[1] || match[2];\n\t\t\t\tif (innerCmd) {\n\t\t\t\t\tconst innerMatches = innerCmd.matchAll(fileCommands);\n\t\t\t\t\tfor (const innerMatch of innerMatches) {\n\t\t\t\t\t\tconst innerArgsStr = innerMatch[1];\n\t\t\t\t\t\tif (!innerArgsStr) continue;\n\t\t\t\t\t\tconst innerArgParts =\n\t\t\t\t\t\t\tinnerArgsStr.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\t\t\tfor (const arg of innerArgParts) {\n\t\t\t\t\t\t\tconst cleaned = arg.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcleaned &&\n\t\t\t\t\t\t\t\t!cleaned.startsWith(\"-\") &&\n\t\t\t\t\t\t\t\tcleaned.length > 0 &&\n\t\t\t\t\t\t\t\t!/^[<>|&;]/.test(cleaned)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tpaths.push(cleaned);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn paths;\n}\n\nexport function checkPathPolicy(\n\tpaths: string[],\n\tpathPolicy: NonNullable<EnterprisePolicy[\"paths\"]>,\n): { allowed: boolean; reason?: string } {\n\tfor (const filePath of paths) {\n\t\tif (\n\t\t\tpathPolicy.blocked?.length &&\n\t\t\tmatchesPathPattern(filePath, pathPolicy.blocked)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: `Path \"${filePath}\" is blocked by enterprise policy.`,\n\t\t\t};\n\t\t}\n\t\tif (pathPolicy.allowed) {\n\t\t\tif (\n\t\t\t\tpathPolicy.allowed.length === 0 ||\n\t\t\t\t!matchesPathPattern(filePath, pathPolicy.allowed)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Path \"${filePath}\" is not in the allowed paths list.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { allowed: true };\n}\n"]}
1
+ {"version":3,"file":"path-policy-validator.js","sourceRoot":"","sources":["../../../src/safety/validators/path-policy-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionApprovalContext } from \"../../agent/action-approval.js\";\nimport { parseApplyPatchPaths } from \"../../tools/apply-patch-parser.js\";\nimport { matchesPathPattern } from \"../../utils/path-matcher.js\";\nimport type { EnterprisePolicy } from \"../policy.js\";\n\nconst PATH_KEYS = [\n\t\"path\",\n\t\"file_path\",\n\t\"filePath\",\n\t\"file\",\n\t\"files\",\n\t\"directory\",\n\t\"dir\",\n\t\"target\",\n\t\"source\",\n\t\"destination\",\n\t\"cwd\",\n\t\"output\",\n\t\"input\",\n\t\"src\",\n\t\"dest\",\n\t\"config\",\n\t\"workspace\",\n\t\"folder\",\n\t\"target_file\",\n\t\"target_directory\",\n];\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction getCommandArg(context: ActionApprovalContext): string | null {\n\treturn getStringArg(context, \"command\");\n}\n\n/**\n * Extract file paths from tool arguments.\n */\nexport function extractPolicyFilePaths(\n\tcontext: ActionApprovalContext,\n): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\n\tconst paths: string[] = [];\n\n\tif (context.toolName === \"apply_patch\") {\n\t\tconst patch = getStringArg(context, \"patch\");\n\t\tif (patch) {\n\t\t\tpaths.push(...parseApplyPatchPaths(patch));\n\t\t}\n\t}\n\n\tfor (const key of PATH_KEYS) {\n\t\tconst value = args[key];\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\tpaths.push(value);\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const item of value) {\n\t\t\t\tif (typeof item === \"string\" && item.length > 0) {\n\t\t\t\t\tpaths.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (context.toolName === \"bash\" || context.toolName === \"background_tasks\") {\n\t\tconst command = getCommandArg(context);\n\t\tif (command) {\n\t\t\tconst fileCommands =\n\t\t\t\t/(?:cd|cat|rm|mv|cp|mkdir|touch|nano|vim|vi|less|more|head|tail|chmod|chown|strings|hexdump|dd|tee|ln|readlink|stat|file|wc|grep|sed|awk|sort|uniq|diff|patch|tar|gzip|gunzip|zip|unzip|find|rsync|scp)\\s+((?:[^\\s;&|<>`$()]|\\\\.)+(?:\\s+(?:[^\\s;&|<>`$()]|\\\\.)+)*)/gi;\n\n\t\t\tconst matches = command.matchAll(fileCommands);\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst argsStr = match[1];\n\t\t\t\tif (!argsStr) continue;\n\t\t\t\tconst argParts = argsStr.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\tfor (const arg of argParts) {\n\t\t\t\t\tconst cleaned = arg.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tcleaned &&\n\t\t\t\t\t\t!cleaned.startsWith(\"-\") &&\n\t\t\t\t\t\tcleaned.length > 0 &&\n\t\t\t\t\t\t!/^[<>|&;]/.test(cleaned)\n\t\t\t\t\t) {\n\t\t\t\t\t\tpaths.push(cleaned);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst redirectPattern = /[<>]{1,2}\\s*([^\\s<>|&;]+)/g;\n\t\t\tconst redirectMatches = command.matchAll(redirectPattern);\n\t\t\tfor (const match of redirectMatches) {\n\t\t\t\tconst rawPath = match[1];\n\t\t\t\tif (!rawPath) continue;\n\t\t\t\tconst path = rawPath.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\tif (path && path.length > 0) {\n\t\t\t\t\tpaths.push(path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst cmdSubPattern = /(?:\\$\\(|<\\()([^)]+)\\)|`([^`]+)`/g;\n\t\t\tconst cmdSubMatches = command.matchAll(cmdSubPattern);\n\t\t\tfor (const match of cmdSubMatches) {\n\t\t\t\tconst innerCmd = match[1] || match[2];\n\t\t\t\tif (innerCmd) {\n\t\t\t\t\tconst innerMatches = innerCmd.matchAll(fileCommands);\n\t\t\t\t\tfor (const innerMatch of innerMatches) {\n\t\t\t\t\t\tconst innerArgsStr = innerMatch[1];\n\t\t\t\t\t\tif (!innerArgsStr) continue;\n\t\t\t\t\t\tconst innerArgParts =\n\t\t\t\t\t\t\tinnerArgsStr.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\t\t\tfor (const arg of innerArgParts) {\n\t\t\t\t\t\t\tconst cleaned = arg.replace(/^[\"']|[\"']$/g, \"\");\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcleaned &&\n\t\t\t\t\t\t\t\t!cleaned.startsWith(\"-\") &&\n\t\t\t\t\t\t\t\tcleaned.length > 0 &&\n\t\t\t\t\t\t\t\t!/^[<>|&;]/.test(cleaned)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tpaths.push(cleaned);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn paths;\n}\n\nexport function checkPathPolicy(\n\tpaths: string[],\n\tpathPolicy: NonNullable<EnterprisePolicy[\"paths\"]>,\n): { allowed: boolean; reason?: string } {\n\tfor (const filePath of paths) {\n\t\tif (\n\t\t\tpathPolicy.blocked?.length &&\n\t\t\tmatchesPathPattern(filePath, pathPolicy.blocked)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: `Path \"${filePath}\" is blocked by enterprise policy.`,\n\t\t\t};\n\t\t}\n\t\tif (pathPolicy.allowed) {\n\t\t\tif (\n\t\t\t\tpathPolicy.allowed.length === 0 ||\n\t\t\t\t!matchesPathPattern(filePath, pathPolicy.allowed)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Path \"${filePath}\" is not in the allowed paths list.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { allowed: true };\n}\n"]}
@@ -5,7 +5,8 @@ export type { Sandbox, ExecResult } from "./types.js";
5
5
  export { DockerSandbox, type DockerSandboxConfig } from "./docker-sandbox.js";
6
6
  export { LocalSandbox } from "./local-sandbox.js";
7
7
  export { NativeSandbox, isNativeSandboxAvailable, getNativeSandboxType, createNativeSandbox, type NativeSandboxPolicy, type NativeSandboxMode, } from "./native-sandbox.js";
8
- export type SandboxMode = "docker" | "local" | "native" | "none";
8
+ export type SandboxBackendMode = "docker" | "local" | "native" | "none";
9
+ export type SandboxMode = SandboxBackendMode | NativeSandboxMode;
9
10
  export interface NativeSandboxConfig {
10
11
  /** Sandbox policy mode */
11
12
  policy?: NativeSandboxMode;
@@ -13,6 +14,10 @@ export interface NativeSandboxConfig {
13
14
  writableRoots?: string[];
14
15
  /** Allow network access */
15
16
  networkAccess?: boolean;
17
+ /** Exclude TMPDIR from writable roots */
18
+ excludeTmpdir?: boolean;
19
+ /** Exclude /tmp from writable roots */
20
+ excludeSlashTmp?: boolean;
16
21
  }
17
22
  export interface SandboxConfig {
18
23
  mode: SandboxMode;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAEN,KAAK,iBAAiB,EAKtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IACnC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAgBxE;AAkBD,MAAM,WAAW,oBAAoB;IACpC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,mCAAmC;IACnC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CAClC,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CA+G9B;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,OAAO,EAAE,OAAO,GAAG,SAAS,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAEN,KAAK,iBAAiB,EAKtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IACnC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAgBxE;AAqCD,MAAM,WAAW,oBAAoB;IACpC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,mCAAmC;IACnC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CAClC,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAwI9B;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,OAAO,EAAE,OAAO,GAAG,SAAS,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import { buildNativeSandboxPolicy } from "../safety/permission-profile.js";
3
4
  import { DockerSandbox } from "./docker-sandbox.js";
4
5
  import { LocalSandbox } from "./local-sandbox.js";
5
6
  import { createNativeSandbox, getNativeSandboxType, isNativeSandboxAvailable, } from "./native-sandbox.js";
@@ -42,6 +43,17 @@ async function isDockerAvailable() {
42
43
  return false;
43
44
  }
44
45
  }
46
+ function isNativeSandboxMode(mode) {
47
+ return (mode === "read-only" ||
48
+ mode === "workspace-write" ||
49
+ mode === "danger-full-access");
50
+ }
51
+ function resolveSandboxMode(mode) {
52
+ if (isNativeSandboxMode(mode)) {
53
+ return { backendMode: "native", nativePolicy: mode };
54
+ }
55
+ return { backendMode: mode };
56
+ }
45
57
  /**
46
58
  * Creates a sandbox instance based on the specified mode.
47
59
  *
@@ -84,8 +96,9 @@ export async function createSandbox(options = {}) {
84
96
  nativeConfig = config.native ?? nativeConfig;
85
97
  }
86
98
  }
99
+ const { backendMode, nativePolicy } = resolveSandboxMode(mode);
87
100
  // Handle each mode
88
- switch (mode) {
101
+ switch (backendMode) {
89
102
  case "none":
90
103
  return undefined;
91
104
  case "local":
@@ -94,19 +107,29 @@ export async function createSandbox(options = {}) {
94
107
  }
95
108
  return new LocalSandbox();
96
109
  case "native": {
110
+ const requestedPolicy = nativePolicy ?? nativeConfig?.policy ?? "workspace-write";
111
+ if (requestedPolicy === "danger-full-access") {
112
+ return undefined;
113
+ }
114
+ const policyModeRequested = nativePolicy !== undefined;
97
115
  // Check native sandbox availability
98
116
  if (!isNativeSandboxAvailable()) {
99
117
  const sandboxType = getNativeSandboxType();
100
118
  console.warn(`[sandbox] Native sandbox (${sandboxType}) not available on this platform.`);
119
+ if (policyModeRequested) {
120
+ throw new Error(`Native sandbox policy mode "${nativePolicy}" requires native sandbox support; refusing to fall back to local execution.`);
121
+ }
101
122
  const fallback = isWebServer ? "none" : "local";
102
123
  console.warn(`[sandbox] Falling back to ${fallback} sandbox.`);
103
124
  return isWebServer ? undefined : new LocalSandbox();
104
125
  }
105
- const policy = {
106
- mode: nativeConfig?.policy ?? "workspace-write",
126
+ const policy = buildNativeSandboxPolicy({
127
+ mode: requestedPolicy,
107
128
  writableRoots: nativeConfig?.writableRoots,
108
129
  networkAccess: nativeConfig?.networkAccess ?? true,
109
- };
130
+ excludeTmpdir: nativeConfig?.excludeTmpdir,
131
+ excludeSlashTmp: nativeConfig?.excludeSlashTmp,
132
+ }, cwd);
110
133
  const sandbox = createNativeSandbox(policy, cwd);
111
134
  try {
112
135
  await sandbox.initialize();
@@ -114,6 +137,9 @@ export async function createSandbox(options = {}) {
114
137
  }
115
138
  catch (error) {
116
139
  console.warn("[sandbox] Failed to initialize native sandbox:", error instanceof Error ? error.message : String(error));
140
+ if (policyModeRequested) {
141
+ throw new Error(`Native sandbox policy mode "${nativePolicy}" failed to initialize; refusing to fall back to local execution.`, { cause: error });
142
+ }
117
143
  const fallback = isWebServer ? "none" : "local";
118
144
  console.warn(`[sandbox] Falling back to ${fallback} sandbox.`);
119
145
  return isWebServer ? undefined : new LocalSandbox();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DockerSandbox, type DockerSandboxConfig } from \"./docker-sandbox.js\";\nimport { LocalSandbox } from \"./local-sandbox.js\";\nimport {\n\tNativeSandbox,\n\ttype NativeSandboxMode,\n\ttype NativeSandboxPolicy,\n\tcreateNativeSandbox,\n\tgetNativeSandboxType,\n\tisNativeSandboxAvailable,\n} from \"./native-sandbox.js\";\nimport type { Sandbox } from \"./types.js\";\n\nexport type { Sandbox, ExecResult } from \"./types.js\";\nexport { DockerSandbox, type DockerSandboxConfig } from \"./docker-sandbox.js\";\nexport { LocalSandbox } from \"./local-sandbox.js\";\nexport {\n\tNativeSandbox,\n\tisNativeSandboxAvailable,\n\tgetNativeSandboxType,\n\tcreateNativeSandbox,\n\ttype NativeSandboxPolicy,\n\ttype NativeSandboxMode,\n} from \"./native-sandbox.js\";\n\nexport type SandboxMode = \"docker\" | \"local\" | \"native\" | \"none\";\n\nexport interface NativeSandboxConfig {\n\t/** Sandbox policy mode */\n\tpolicy?: NativeSandboxMode;\n\t/** Additional writable directories */\n\twritableRoots?: string[];\n\t/** Allow network access */\n\tnetworkAccess?: boolean;\n}\n\nexport interface SandboxConfig {\n\tmode: SandboxMode;\n\tdocker?: DockerSandboxConfig;\n\tnative?: NativeSandboxConfig;\n}\n\n/**\n * Loads sandbox configuration from .maestro/sandbox.json if present.\n * Returns undefined if no config file exists.\n */\nexport function loadSandboxConfig(cwd: string): SandboxConfig | undefined {\n\tconst configPath = join(cwd, \".maestro\", \"sandbox.json\");\n\tif (!existsSync(configPath)) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(configPath, \"utf-8\");\n\t\treturn JSON.parse(content) as SandboxConfig;\n\t} catch (error) {\n\t\tconsole.warn(\"[sandbox] Failed to load sandbox config\", {\n\t\t\tconfigPath,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Checks if Docker is available on the system.\n */\nasync function isDockerAvailable(): Promise<boolean> {\n\tconst { exec } = await import(\"node:child_process\");\n\tconst { promisify } = await import(\"node:util\");\n\tconst execAsync = promisify(exec);\n\n\ttry {\n\t\tawait execAsync(\"docker info\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport interface CreateSandboxOptions {\n\t/** Explicit mode override */\n\tmode?: SandboxMode;\n\t/** Working directory for config lookup */\n\tcwd?: string;\n\t/** Docker-specific configuration */\n\tdocker?: DockerSandboxConfig;\n\t/** Native sandbox configuration */\n\tnative?: NativeSandboxConfig;\n}\n\n/**\n * Creates a sandbox instance based on the specified mode.\n *\n * @param options - Configuration options for sandbox creation\n * @returns A Sandbox instance (Docker or Local) or undefined for \"none\" mode\n *\n * @example\n * ```typescript\n * // Auto-detect based on config file\n * const sandbox = await createSandbox();\n *\n * // Force Docker mode\n * const dockerSandbox = await createSandbox({ mode: \"docker\" });\n *\n * // No sandbox\n * const noSandbox = await createSandbox({ mode: \"none\" });\n * ```\n */\nexport async function createSandbox(\n\toptions: CreateSandboxOptions = {},\n): Promise<Sandbox | undefined> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst isWebServer = process.env.MAESTRO_WEB_SERVER === \"1\";\n\n\t// Priority: explicit mode > env var > config file > auto-detect\n\tlet mode: SandboxMode = options.mode ?? \"none\";\n\tlet dockerConfig = options.docker;\n\tlet nativeConfig = options.native;\n\n\t// Check environment variable (handle \"undefined\" string from process.env assignment)\n\tconst envModeRaw = process.env.MAESTRO_SANDBOX_MODE;\n\tconst envMode =\n\t\tenvModeRaw && envModeRaw !== \"undefined\"\n\t\t\t? (envModeRaw as SandboxMode)\n\t\t\t: undefined;\n\tif (!options.mode && envMode) {\n\t\tmode = envMode;\n\t}\n\n\t// Check config file if no explicit mode\n\tif (!options.mode && !envMode) {\n\t\tconst config = loadSandboxConfig(cwd);\n\t\tif (config) {\n\t\t\tmode = config.mode;\n\t\t\tdockerConfig = config.docker ?? dockerConfig;\n\t\t\tnativeConfig = config.native ?? nativeConfig;\n\t\t}\n\t}\n\n\t// Handle each mode\n\tswitch (mode) {\n\t\tcase \"none\":\n\t\t\treturn undefined;\n\n\t\tcase \"local\":\n\t\t\tif (isWebServer) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Local sandbox is disabled in web-server mode. Use Docker sandbox or MAESTRO_SANDBOX_MODE=none.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn new LocalSandbox();\n\n\t\tcase \"native\": {\n\t\t\t// Check native sandbox availability\n\t\t\tif (!isNativeSandboxAvailable()) {\n\t\t\t\tconst sandboxType = getNativeSandboxType();\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[sandbox] Native sandbox (${sandboxType}) not available on this platform.`,\n\t\t\t\t);\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\n\t\t\tconst policy: NativeSandboxPolicy = {\n\t\t\t\tmode: nativeConfig?.policy ?? \"workspace-write\",\n\t\t\t\twritableRoots: nativeConfig?.writableRoots,\n\t\t\t\tnetworkAccess: nativeConfig?.networkAccess ?? true,\n\t\t\t};\n\n\t\t\tconst sandbox = createNativeSandbox(policy, cwd);\n\n\t\t\ttry {\n\t\t\t\tawait sandbox.initialize();\n\t\t\t\treturn sandbox;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[sandbox] Failed to initialize native sandbox:\",\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t);\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\t\t}\n\n\t\tcase \"docker\": {\n\t\t\t// Check Docker availability\n\t\t\tconst dockerAvailable = await isDockerAvailable();\n\t\t\tif (!dockerAvailable) {\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[sandbox] Docker not available. Falling back to ${fallback} sandbox.`,\n\t\t\t\t);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\n\t\t\tconst sandbox = new DockerSandbox({\n\t\t\t\timage: dockerConfig?.image ?? \"node:20-slim\",\n\t\t\t\tworkspaceMount: dockerConfig?.workspaceMount ?? \"/workspace\",\n\t\t\t});\n\n\t\t\t// Initialize the container\n\t\t\ttry {\n\t\t\t\tawait sandbox.initialize();\n\t\t\t\treturn sandbox;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[sandbox] Failed to initialize Docker sandbox:\",\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t);\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\t\t}\n\n\t\tdefault:\n\t\t\tconsole.warn(`[sandbox] Unknown sandbox mode: ${mode}. Using none.`);\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Cleans up a sandbox instance, stopping containers if needed.\n */\nexport async function disposeSandbox(\n\tsandbox: Sandbox | undefined,\n): Promise<void> {\n\tif (sandbox) {\n\t\tawait sandbox.dispose();\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { buildNativeSandboxPolicy } from \"../safety/permission-profile.js\";\nimport { DockerSandbox, type DockerSandboxConfig } from \"./docker-sandbox.js\";\nimport { LocalSandbox } from \"./local-sandbox.js\";\nimport {\n\tNativeSandbox,\n\ttype NativeSandboxMode,\n\ttype NativeSandboxPolicy,\n\tcreateNativeSandbox,\n\tgetNativeSandboxType,\n\tisNativeSandboxAvailable,\n} from \"./native-sandbox.js\";\nimport type { Sandbox } from \"./types.js\";\n\nexport type { Sandbox, ExecResult } from \"./types.js\";\nexport { DockerSandbox, type DockerSandboxConfig } from \"./docker-sandbox.js\";\nexport { LocalSandbox } from \"./local-sandbox.js\";\nexport {\n\tNativeSandbox,\n\tisNativeSandboxAvailable,\n\tgetNativeSandboxType,\n\tcreateNativeSandbox,\n\ttype NativeSandboxPolicy,\n\ttype NativeSandboxMode,\n} from \"./native-sandbox.js\";\n\nexport type SandboxBackendMode = \"docker\" | \"local\" | \"native\" | \"none\";\nexport type SandboxMode = SandboxBackendMode | NativeSandboxMode;\n\nexport interface NativeSandboxConfig {\n\t/** Sandbox policy mode */\n\tpolicy?: NativeSandboxMode;\n\t/** Additional writable directories */\n\twritableRoots?: string[];\n\t/** Allow network access */\n\tnetworkAccess?: boolean;\n\t/** Exclude TMPDIR from writable roots */\n\texcludeTmpdir?: boolean;\n\t/** Exclude /tmp from writable roots */\n\texcludeSlashTmp?: boolean;\n}\n\nexport interface SandboxConfig {\n\tmode: SandboxMode;\n\tdocker?: DockerSandboxConfig;\n\tnative?: NativeSandboxConfig;\n}\n\n/**\n * Loads sandbox configuration from .maestro/sandbox.json if present.\n * Returns undefined if no config file exists.\n */\nexport function loadSandboxConfig(cwd: string): SandboxConfig | undefined {\n\tconst configPath = join(cwd, \".maestro\", \"sandbox.json\");\n\tif (!existsSync(configPath)) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(configPath, \"utf-8\");\n\t\treturn JSON.parse(content) as SandboxConfig;\n\t} catch (error) {\n\t\tconsole.warn(\"[sandbox] Failed to load sandbox config\", {\n\t\t\tconfigPath,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Checks if Docker is available on the system.\n */\nasync function isDockerAvailable(): Promise<boolean> {\n\tconst { exec } = await import(\"node:child_process\");\n\tconst { promisify } = await import(\"node:util\");\n\tconst execAsync = promisify(exec);\n\n\ttry {\n\t\tawait execAsync(\"docker info\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isNativeSandboxMode(mode: string): mode is NativeSandboxMode {\n\treturn (\n\t\tmode === \"read-only\" ||\n\t\tmode === \"workspace-write\" ||\n\t\tmode === \"danger-full-access\"\n\t);\n}\n\nfunction resolveSandboxMode(mode: SandboxMode): {\n\tbackendMode: SandboxBackendMode;\n\tnativePolicy?: NativeSandboxMode;\n} {\n\tif (isNativeSandboxMode(mode)) {\n\t\treturn { backendMode: \"native\", nativePolicy: mode };\n\t}\n\n\treturn { backendMode: mode };\n}\n\nexport interface CreateSandboxOptions {\n\t/** Explicit mode override */\n\tmode?: SandboxMode;\n\t/** Working directory for config lookup */\n\tcwd?: string;\n\t/** Docker-specific configuration */\n\tdocker?: DockerSandboxConfig;\n\t/** Native sandbox configuration */\n\tnative?: NativeSandboxConfig;\n}\n\n/**\n * Creates a sandbox instance based on the specified mode.\n *\n * @param options - Configuration options for sandbox creation\n * @returns A Sandbox instance (Docker or Local) or undefined for \"none\" mode\n *\n * @example\n * ```typescript\n * // Auto-detect based on config file\n * const sandbox = await createSandbox();\n *\n * // Force Docker mode\n * const dockerSandbox = await createSandbox({ mode: \"docker\" });\n *\n * // No sandbox\n * const noSandbox = await createSandbox({ mode: \"none\" });\n * ```\n */\nexport async function createSandbox(\n\toptions: CreateSandboxOptions = {},\n): Promise<Sandbox | undefined> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst isWebServer = process.env.MAESTRO_WEB_SERVER === \"1\";\n\n\t// Priority: explicit mode > env var > config file > auto-detect\n\tlet mode: SandboxMode = options.mode ?? \"none\";\n\tlet dockerConfig = options.docker;\n\tlet nativeConfig = options.native;\n\n\t// Check environment variable (handle \"undefined\" string from process.env assignment)\n\tconst envModeRaw = process.env.MAESTRO_SANDBOX_MODE;\n\tconst envMode =\n\t\tenvModeRaw && envModeRaw !== \"undefined\"\n\t\t\t? (envModeRaw as SandboxMode)\n\t\t\t: undefined;\n\tif (!options.mode && envMode) {\n\t\tmode = envMode;\n\t}\n\n\t// Check config file if no explicit mode\n\tif (!options.mode && !envMode) {\n\t\tconst config = loadSandboxConfig(cwd);\n\t\tif (config) {\n\t\t\tmode = config.mode;\n\t\t\tdockerConfig = config.docker ?? dockerConfig;\n\t\t\tnativeConfig = config.native ?? nativeConfig;\n\t\t}\n\t}\n\n\tconst { backendMode, nativePolicy } = resolveSandboxMode(mode);\n\n\t// Handle each mode\n\tswitch (backendMode) {\n\t\tcase \"none\":\n\t\t\treturn undefined;\n\n\t\tcase \"local\":\n\t\t\tif (isWebServer) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Local sandbox is disabled in web-server mode. Use Docker sandbox or MAESTRO_SANDBOX_MODE=none.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn new LocalSandbox();\n\n\t\tcase \"native\": {\n\t\t\tconst requestedPolicy =\n\t\t\t\tnativePolicy ?? nativeConfig?.policy ?? \"workspace-write\";\n\t\t\tif (requestedPolicy === \"danger-full-access\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst policyModeRequested = nativePolicy !== undefined;\n\t\t\t// Check native sandbox availability\n\t\t\tif (!isNativeSandboxAvailable()) {\n\t\t\t\tconst sandboxType = getNativeSandboxType();\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[sandbox] Native sandbox (${sandboxType}) not available on this platform.`,\n\t\t\t\t);\n\t\t\t\tif (policyModeRequested) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Native sandbox policy mode \"${nativePolicy}\" requires native sandbox support; refusing to fall back to local execution.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\n\t\t\tconst policy: NativeSandboxPolicy = buildNativeSandboxPolicy(\n\t\t\t\t{\n\t\t\t\t\tmode: requestedPolicy,\n\t\t\t\t\twritableRoots: nativeConfig?.writableRoots,\n\t\t\t\t\tnetworkAccess: nativeConfig?.networkAccess ?? true,\n\t\t\t\t\texcludeTmpdir: nativeConfig?.excludeTmpdir,\n\t\t\t\t\texcludeSlashTmp: nativeConfig?.excludeSlashTmp,\n\t\t\t\t},\n\t\t\t\tcwd,\n\t\t\t);\n\n\t\t\tconst sandbox = createNativeSandbox(policy, cwd);\n\n\t\t\ttry {\n\t\t\t\tawait sandbox.initialize();\n\t\t\t\treturn sandbox;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[sandbox] Failed to initialize native sandbox:\",\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t);\n\t\t\t\tif (policyModeRequested) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Native sandbox policy mode \"${nativePolicy}\" failed to initialize; refusing to fall back to local execution.`,\n\t\t\t\t\t\t{ cause: error },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\t\t}\n\n\t\tcase \"docker\": {\n\t\t\t// Check Docker availability\n\t\t\tconst dockerAvailable = await isDockerAvailable();\n\t\t\tif (!dockerAvailable) {\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[sandbox] Docker not available. Falling back to ${fallback} sandbox.`,\n\t\t\t\t);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\n\t\t\tconst sandbox = new DockerSandbox({\n\t\t\t\timage: dockerConfig?.image ?? \"node:20-slim\",\n\t\t\t\tworkspaceMount: dockerConfig?.workspaceMount ?? \"/workspace\",\n\t\t\t});\n\n\t\t\t// Initialize the container\n\t\t\ttry {\n\t\t\t\tawait sandbox.initialize();\n\t\t\t\treturn sandbox;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[sandbox] Failed to initialize Docker sandbox:\",\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t);\n\t\t\t\tconst fallback = isWebServer ? \"none\" : \"local\";\n\t\t\t\tconsole.warn(`[sandbox] Falling back to ${fallback} sandbox.`);\n\t\t\t\treturn isWebServer ? undefined : new LocalSandbox();\n\t\t\t}\n\t\t}\n\n\t\tdefault:\n\t\t\tconsole.warn(`[sandbox] Unknown sandbox mode: ${mode}. Using none.`);\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Cleans up a sandbox instance, stopping containers if needed.\n */\nexport async function disposeSandbox(\n\tsandbox: Sandbox | undefined,\n): Promise<void> {\n\tif (sandbox) {\n\t\tawait sandbox.dispose();\n\t}\n}\n"]}
@@ -62,6 +62,9 @@ export declare class NativeSandbox implements Sandbox {
62
62
  delete(path: string, recursive?: boolean): Promise<void>;
63
63
  dispose(): Promise<void>;
64
64
  private resolvePath;
65
+ private resolveWorkingDir;
66
+ private assertExecutionCwd;
67
+ private assertWritablePath;
65
68
  private getSandboxType;
66
69
  }
67
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"native-sandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/native-sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,iBAAiB,GAC1B,WAAW,GACX,iBAAiB,GACjB,oBAAoB,CAAC;AAExB,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,iBAAiB,CAAC;IACxB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B;AA4QD,qBAAa,aAAc,YAAW,OAAO;IAC5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,eAAe,CAAgC;gBAE3C,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM;IAK9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;;OAGG;IACG,IAAI,CACT,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,UAAU,CAAC;IAyEtB;;OAEG;IACG,YAAY,CACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,UAAU,CAAC;IAgEtB;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7C;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7D;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK3C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;CAKtB;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAclD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,GAAG,UAAU,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,MAAM,GACT,aAAa,CAEf"}
1
+ {"version":3,"file":"native-sandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/native-sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,oBAAoB,CAAC;AAkB5B,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,iBAAiB,GAC1B,WAAW,GACX,iBAAiB,GACjB,oBAAoB,CAAC;AAExB,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,iBAAiB,CAAC;IACxB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B;AAkWD,qBAAa,aAAc,YAAW,OAAO;IAC5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,eAAe,CAAgC;gBAE3C,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM;IAK9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;;OAGG;IACG,IAAI,CACT,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,UAAU,CAAC;IA0EtB;;OAEG;IACG,YAAY,CACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,UAAU,CAAC;IAkEtB;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7C;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7D;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK3C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,kBAAkB;IA8C1B,OAAO,CAAC,cAAc;CAKtB;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAQlD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,GAAG,UAAU,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,MAAM,GACT,aAAa,CAEf"}