@evalops/maestro 0.10.18 → 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 (922) 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/modes.d.ts +8 -0
  143. package/dist/cli/commands/modes.d.ts.map +1 -0
  144. package/dist/cli/commands/modes.js +151 -0
  145. package/dist/cli/commands/modes.js.map +1 -0
  146. package/dist/cli/commands/operating-plane.d.ts +14 -0
  147. package/dist/cli/commands/operating-plane.d.ts.map +1 -0
  148. package/dist/cli/commands/operating-plane.js +160 -0
  149. package/dist/cli/commands/operating-plane.js.map +1 -0
  150. package/dist/cli/commands/run.d.ts +87 -0
  151. package/dist/cli/commands/run.d.ts.map +1 -0
  152. package/dist/cli/commands/run.js +356 -0
  153. package/dist/cli/commands/run.js.map +1 -0
  154. package/dist/cli/commands/scenario.d.ts +7 -0
  155. package/dist/cli/commands/scenario.d.ts.map +1 -0
  156. package/dist/cli/commands/scenario.js +195 -0
  157. package/dist/cli/commands/scenario.js.map +1 -0
  158. package/dist/cli/commands/skill.d.ts +7 -0
  159. package/dist/cli/commands/skill.d.ts.map +1 -0
  160. package/dist/cli/commands/skill.js +286 -0
  161. package/dist/cli/commands/skill.js.map +1 -0
  162. package/dist/cli/headless-protocol.d.ts +55 -1
  163. package/dist/cli/headless-protocol.d.ts.map +1 -1
  164. package/dist/cli/headless-protocol.js +446 -7
  165. package/dist/cli/headless-protocol.js.map +1 -1
  166. package/dist/cli/headless-runtime-selection.d.ts +38 -0
  167. package/dist/cli/headless-runtime-selection.d.ts.map +1 -0
  168. package/dist/cli/headless-runtime-selection.js +48 -0
  169. package/dist/cli/headless-runtime-selection.js.map +1 -0
  170. package/dist/cli/headless.d.ts +5 -1
  171. package/dist/cli/headless.d.ts.map +1 -1
  172. package/dist/cli/headless.js +11 -1
  173. package/dist/cli/headless.js.map +1 -1
  174. package/dist/cli/help.d.ts +3 -1
  175. package/dist/cli/help.d.ts.map +1 -1
  176. package/dist/cli/help.js +135 -30
  177. package/dist/cli/help.js.map +1 -1
  178. package/dist/cli/system-prompt.d.ts +22 -4
  179. package/dist/cli/system-prompt.d.ts.map +1 -1
  180. package/dist/cli/system-prompt.js +224 -127
  181. package/dist/cli/system-prompt.js.map +1 -1
  182. package/dist/cli-tui/commands/a2a-handlers.d.ts +7 -0
  183. package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -0
  184. package/dist/cli-tui/commands/a2a-handlers.js +160 -0
  185. package/dist/cli-tui/commands/a2a-handlers.js.map +1 -0
  186. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  187. package/dist/cli-tui/commands/command-catalog.js +15 -0
  188. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  189. package/dist/cli-tui/commands/command-registry-adapter.js +10 -1
  190. package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -1
  191. package/dist/cli-tui/commands/handlers/mode-handler.d.ts.map +1 -1
  192. package/dist/cli-tui/commands/handlers/mode-handler.js +22 -10
  193. package/dist/cli-tui/commands/handlers/mode-handler.js.map +1 -1
  194. package/dist/cli-tui/commands/mcp-handlers.d.ts.map +1 -1
  195. package/dist/cli-tui/commands/mcp-handlers.js +6 -5
  196. package/dist/cli-tui/commands/mcp-handlers.js.map +1 -1
  197. package/dist/cli-tui/commands/types.d.ts +1 -0
  198. package/dist/cli-tui/commands/types.d.ts.map +1 -1
  199. package/dist/cli-tui/commands/types.js.map +1 -1
  200. package/dist/cli-tui/commands/utility-handlers.d.ts +4 -0
  201. package/dist/cli-tui/commands/utility-handlers.d.ts.map +1 -1
  202. package/dist/cli-tui/commands/utility-handlers.js +45 -6
  203. package/dist/cli-tui/commands/utility-handlers.js.map +1 -1
  204. package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
  205. package/dist/cli-tui/run/run-shell-command.js +14 -5
  206. package/dist/cli-tui/run/run-shell-command.js.map +1 -1
  207. package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
  208. package/dist/cli-tui/run/streaming-shell-command.js +14 -5
  209. package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
  210. package/dist/cli-tui/selectors/model-selector.d.ts +1 -0
  211. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  212. package/dist/cli-tui/selectors/model-selector.js +6 -2
  213. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  214. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
  215. package/dist/cli-tui/tui-renderer/command-registry-options.js +5 -0
  216. package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
  217. package/dist/cli-tui/utils/commands/review-prompt.d.ts +1 -1
  218. package/dist/cli-tui/utils/commands/review-prompt.d.ts.map +1 -1
  219. package/dist/cli-tui/utils/commands/review-prompt.js +8 -3
  220. package/dist/cli-tui/utils/commands/review-prompt.js.map +1 -1
  221. package/dist/cli-tui/utils/runtime-badges.d.ts +1 -0
  222. package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
  223. package/dist/cli-tui/utils/runtime-badges.js +7 -0
  224. package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
  225. package/dist/cli-tui/utils/text-formatting.d.ts +1 -0
  226. package/dist/cli-tui/utils/text-formatting.d.ts.map +1 -1
  227. package/dist/cli-tui/utils/text-formatting.js +5 -0
  228. package/dist/cli-tui/utils/text-formatting.js.map +1 -1
  229. package/dist/cli.js +49158 -26161
  230. package/dist/cli.js.map +1 -1
  231. package/dist/codex/app-server-client.d.ts +139 -0
  232. package/dist/codex/app-server-client.d.ts.map +1 -0
  233. package/dist/codex/app-server-client.js +352 -0
  234. package/dist/codex/app-server-client.js.map +1 -0
  235. package/dist/codex/compatibility.d.ts +48 -0
  236. package/dist/codex/compatibility.d.ts.map +1 -0
  237. package/dist/codex/compatibility.js +344 -0
  238. package/dist/codex/compatibility.js.map +1 -0
  239. package/dist/codex/subagent-dispatch-table.d.ts +66 -0
  240. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -0
  241. package/dist/codex/subagent-dispatch-table.js +127 -0
  242. package/dist/codex/subagent-dispatch-table.js.map +1 -0
  243. package/dist/codex/subagent-workgraph.d.ts +56 -0
  244. package/dist/codex/subagent-workgraph.d.ts.map +1 -0
  245. package/dist/codex/subagent-workgraph.js +89 -0
  246. package/dist/codex/subagent-workgraph.js.map +1 -0
  247. package/dist/config/constants.d.ts +3 -1
  248. package/dist/config/constants.d.ts.map +1 -1
  249. package/dist/config/constants.js +9 -0
  250. package/dist/config/constants.js.map +1 -1
  251. package/dist/config/feature-flags.d.ts +10 -1
  252. package/dist/config/feature-flags.d.ts.map +1 -1
  253. package/dist/config/feature-flags.js +17 -6
  254. package/dist/config/feature-flags.js.map +1 -1
  255. package/dist/config/index.d.ts +1 -1
  256. package/dist/config/index.d.ts.map +1 -1
  257. package/dist/config/index.js +1 -1
  258. package/dist/config/index.js.map +1 -1
  259. package/dist/config/toml-config.d.ts +32 -0
  260. package/dist/config/toml-config.d.ts.map +1 -1
  261. package/dist/config/toml-config.js +152 -43
  262. package/dist/config/toml-config.js.map +1 -1
  263. package/dist/connectors/service-client.d.ts.map +1 -1
  264. package/dist/connectors/service-client.js +4 -7
  265. package/dist/connectors/service-client.js.map +1 -1
  266. package/dist/context/manifest-types.d.ts +59 -0
  267. package/dist/context/manifest-types.d.ts.map +1 -0
  268. package/dist/context/manifest-types.js +2 -0
  269. package/dist/context/manifest-types.js.map +1 -0
  270. package/dist/context/manifest.d.ts +16 -0
  271. package/dist/context/manifest.d.ts.map +1 -0
  272. package/dist/context/manifest.js +503 -0
  273. package/dist/context/manifest.js.map +1 -0
  274. package/dist/db/schema.d.ts +10 -1
  275. package/dist/db/schema.d.ts.map +1 -1
  276. package/dist/db/schema.js.map +1 -1
  277. package/dist/evalops/env-aliases.d.ts +13 -0
  278. package/dist/evalops/env-aliases.d.ts.map +1 -0
  279. package/dist/evalops/env-aliases.js +60 -0
  280. package/dist/evalops/env-aliases.js.map +1 -0
  281. package/dist/evalops/managed-context.d.ts.map +1 -1
  282. package/dist/evalops/managed-context.js +28 -62
  283. package/dist/evalops/managed-context.js.map +1 -1
  284. package/dist/guardian/config.d.ts.map +1 -1
  285. package/dist/guardian/config.js +1 -0
  286. package/dist/guardian/config.js.map +1 -1
  287. package/dist/guardian/runner.d.ts +2 -0
  288. package/dist/guardian/runner.d.ts.map +1 -1
  289. package/dist/guardian/runner.js +105 -2
  290. package/dist/guardian/runner.js.map +1 -1
  291. package/dist/guardian/types.d.ts +1 -0
  292. package/dist/guardian/types.d.ts.map +1 -1
  293. package/dist/guardian/types.js.map +1 -1
  294. package/dist/index.d.ts +5 -1
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +5 -1
  297. package/dist/index.js.map +1 -1
  298. package/dist/main.d.ts.map +1 -1
  299. package/dist/main.js +267 -55
  300. package/dist/main.js.map +1 -1
  301. package/dist/mcp/config.d.ts.map +1 -1
  302. package/dist/mcp/config.js +89 -7
  303. package/dist/mcp/config.js.map +1 -1
  304. package/dist/mcp/manager.d.ts +5 -1
  305. package/dist/mcp/manager.d.ts.map +1 -1
  306. package/dist/mcp/manager.js +159 -4
  307. package/dist/mcp/manager.js.map +1 -1
  308. package/dist/mcp/platform-plugin.d.ts.map +1 -1
  309. package/dist/mcp/platform-plugin.js +9 -26
  310. package/dist/mcp/platform-plugin.js.map +1 -1
  311. package/dist/mcp/schema.d.ts +15 -0
  312. package/dist/mcp/schema.d.ts.map +1 -1
  313. package/dist/mcp/schema.js +24 -0
  314. package/dist/mcp/schema.js.map +1 -1
  315. package/dist/mcp/tool-bridge.d.ts +39 -10
  316. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  317. package/dist/mcp/tool-bridge.js +101 -24
  318. package/dist/mcp/tool-bridge.js.map +1 -1
  319. package/dist/mcp/types.d.ts +27 -0
  320. package/dist/mcp/types.d.ts.map +1 -1
  321. package/dist/mcp/types.js.map +1 -1
  322. package/dist/mcp/workspace-trust.d.ts +10 -0
  323. package/dist/mcp/workspace-trust.d.ts.map +1 -0
  324. package/dist/mcp/workspace-trust.js +295 -0
  325. package/dist/mcp/workspace-trust.js.map +1 -0
  326. package/dist/memory/service-client.d.ts +1 -0
  327. package/dist/memory/service-client.d.ts.map +1 -1
  328. package/dist/memory/service-client.js +194 -9
  329. package/dist/memory/service-client.js.map +1 -1
  330. package/dist/models/builtin.d.ts.map +1 -1
  331. package/dist/models/builtin.js +66 -25
  332. package/dist/models/builtin.js.map +1 -1
  333. package/dist/models/config-loader.d.ts +10 -10
  334. package/dist/models/config-loader.d.ts.map +1 -1
  335. package/dist/models/config-loader.js +2 -0
  336. package/dist/models/config-loader.js.map +1 -1
  337. package/dist/models/registry.d.ts +1 -0
  338. package/dist/models/registry.d.ts.map +1 -1
  339. package/dist/models/registry.js +1 -0
  340. package/dist/models/registry.js.map +1 -1
  341. package/dist/oauth/device-identity.d.ts.map +1 -1
  342. package/dist/oauth/device-identity.js +1 -3
  343. package/dist/oauth/device-identity.js.map +1 -1
  344. package/dist/oauth/evalops.d.ts.map +1 -1
  345. package/dist/oauth/evalops.js +2 -5
  346. package/dist/oauth/evalops.js.map +1 -1
  347. package/dist/opentelemetry.d.ts.map +1 -1
  348. package/dist/opentelemetry.js +12 -12
  349. package/dist/opentelemetry.js.map +1 -1
  350. package/dist/package-version.d.ts +2 -0
  351. package/dist/package-version.d.ts.map +1 -0
  352. package/dist/package-version.js +11 -0
  353. package/dist/package-version.js.map +1 -0
  354. package/dist/packages/constants.d.ts +3 -0
  355. package/dist/packages/constants.d.ts.map +1 -0
  356. package/dist/packages/constants.js +3 -0
  357. package/dist/packages/constants.js.map +1 -0
  358. package/dist/packages/inspection.d.ts.map +1 -1
  359. package/dist/packages/inspection.js +2 -1
  360. package/dist/packages/inspection.js.map +1 -1
  361. package/dist/packages/search.d.ts.map +1 -1
  362. package/dist/packages/search.js +1 -1
  363. package/dist/packages/search.js.map +1 -1
  364. package/dist/platform/a2a-capability-market.d.ts +21 -0
  365. package/dist/platform/a2a-capability-market.d.ts.map +1 -0
  366. package/dist/platform/a2a-capability-market.js +176 -0
  367. package/dist/platform/a2a-capability-market.js.map +1 -0
  368. package/dist/platform/a2a-client.d.ts +119 -0
  369. package/dist/platform/a2a-client.d.ts.map +1 -1
  370. package/dist/platform/a2a-client.js +413 -24
  371. package/dist/platform/a2a-client.js.map +1 -1
  372. package/dist/platform/a2a-fleet.d.ts +41 -0
  373. package/dist/platform/a2a-fleet.d.ts.map +1 -0
  374. package/dist/platform/a2a-fleet.js +109 -0
  375. package/dist/platform/a2a-fleet.js.map +1 -0
  376. package/dist/platform/a2a-maestro-peer.d.ts +20 -0
  377. package/dist/platform/a2a-maestro-peer.d.ts.map +1 -0
  378. package/dist/platform/a2a-maestro-peer.js +176 -0
  379. package/dist/platform/a2a-maestro-peer.js.map +1 -0
  380. package/dist/platform/a2a-peer-pairing.d.ts +107 -0
  381. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -0
  382. package/dist/platform/a2a-peer-pairing.js +489 -0
  383. package/dist/platform/a2a-peer-pairing.js.map +1 -0
  384. package/dist/platform/a2a-peer-registry.d.ts +68 -0
  385. package/dist/platform/a2a-peer-registry.d.ts.map +1 -0
  386. package/dist/platform/a2a-peer-registry.js +320 -0
  387. package/dist/platform/a2a-peer-registry.js.map +1 -0
  388. package/dist/platform/a2a-task-ledger.d.ts +86 -0
  389. package/dist/platform/a2a-task-ledger.d.ts.map +1 -0
  390. package/dist/platform/a2a-task-ledger.js +546 -0
  391. package/dist/platform/a2a-task-ledger.js.map +1 -0
  392. package/dist/platform/a2a-work-graph.d.ts +43 -0
  393. package/dist/platform/a2a-work-graph.d.ts.map +1 -0
  394. package/dist/platform/a2a-work-graph.js +267 -0
  395. package/dist/platform/a2a-work-graph.js.map +1 -0
  396. package/dist/platform/agent-registry-client.d.ts +327 -0
  397. package/dist/platform/agent-registry-client.d.ts.map +1 -0
  398. package/dist/platform/agent-registry-client.js +803 -0
  399. package/dist/platform/agent-registry-client.js.map +1 -0
  400. package/dist/platform/agent-runtime-client.d.ts +135 -1
  401. package/dist/platform/agent-runtime-client.d.ts.map +1 -1
  402. package/dist/platform/agent-runtime-client.js +467 -10
  403. package/dist/platform/agent-runtime-client.js.map +1 -1
  404. package/dist/platform/cerebro-facts-client.d.ts.map +1 -1
  405. package/dist/platform/cerebro-facts-client.js +4 -7
  406. package/dist/platform/cerebro-facts-client.js.map +1 -1
  407. package/dist/platform/client.d.ts.map +1 -1
  408. package/dist/platform/client.js +3 -12
  409. package/dist/platform/client.js.map +1 -1
  410. package/dist/platform/core-services.d.ts +68 -0
  411. package/dist/platform/core-services.d.ts.map +1 -1
  412. package/dist/platform/core-services.js +68 -0
  413. package/dist/platform/core-services.js.map +1 -1
  414. package/dist/platform/fermata-eval-client.d.ts +195 -0
  415. package/dist/platform/fermata-eval-client.d.ts.map +1 -0
  416. package/dist/platform/fermata-eval-client.js +146 -0
  417. package/dist/platform/fermata-eval-client.js.map +1 -0
  418. package/dist/platform/fermata-scenario-suite.d.ts +99 -0
  419. package/dist/platform/fermata-scenario-suite.d.ts.map +1 -0
  420. package/dist/platform/fermata-scenario-suite.js +459 -0
  421. package/dist/platform/fermata-scenario-suite.js.map +1 -0
  422. package/dist/platform/maestro-timeline-client.d.ts.map +1 -1
  423. package/dist/platform/maestro-timeline-client.js +5 -11
  424. package/dist/platform/maestro-timeline-client.js.map +1 -1
  425. package/dist/platform/operating-plane-client.d.ts +156 -0
  426. package/dist/platform/operating-plane-client.d.ts.map +1 -0
  427. package/dist/platform/operating-plane-client.js +131 -0
  428. package/dist/platform/operating-plane-client.js.map +1 -0
  429. package/dist/platform/operating-plane-summary.d.ts +47 -0
  430. package/dist/platform/operating-plane-summary.d.ts.map +1 -0
  431. package/dist/platform/operating-plane-summary.js +209 -0
  432. package/dist/platform/operating-plane-summary.js.map +1 -0
  433. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  434. package/dist/platform/tool-execution-client.js +4 -11
  435. package/dist/platform/tool-execution-client.js.map +1 -1
  436. package/dist/prompts/service-client.d.ts.map +1 -1
  437. package/dist/prompts/service-client.js +3 -5
  438. package/dist/prompts/service-client.js.map +1 -1
  439. package/dist/prompts/system-prompt.d.ts +3 -0
  440. package/dist/prompts/system-prompt.d.ts.map +1 -1
  441. package/dist/prompts/system-prompt.js +13 -3
  442. package/dist/prompts/system-prompt.js.map +1 -1
  443. package/dist/prompts/types.d.ts +2 -0
  444. package/dist/prompts/types.d.ts.map +1 -1
  445. package/dist/prompts/types.js.map +1 -1
  446. package/dist/providers/api-keys.d.ts +1 -1
  447. package/dist/providers/api-keys.d.ts.map +1 -1
  448. package/dist/providers/api-keys.js +2 -1
  449. package/dist/providers/api-keys.js.map +1 -1
  450. package/dist/providers/auth.d.ts.map +1 -1
  451. package/dist/providers/auth.js +48 -25
  452. package/dist/providers/auth.js.map +1 -1
  453. package/dist/remote-runner/attach-client.d.ts.map +1 -1
  454. package/dist/remote-runner/attach-client.js +1 -0
  455. package/dist/remote-runner/attach-client.js.map +1 -1
  456. package/dist/remote-runner/client.d.ts.map +1 -1
  457. package/dist/remote-runner/client.js +4 -7
  458. package/dist/remote-runner/client.js.map +1 -1
  459. package/dist/rpc/rpc-types.d.ts.map +1 -1
  460. package/dist/rpc/rpc-types.js +1 -0
  461. package/dist/rpc/rpc-types.js.map +1 -1
  462. package/dist/safety/action-firewall.d.ts.map +1 -1
  463. package/dist/safety/action-firewall.js +69 -6
  464. package/dist/safety/action-firewall.js.map +1 -1
  465. package/dist/safety/attack-patterns.d.ts.map +1 -1
  466. package/dist/safety/attack-patterns.js +31 -14
  467. package/dist/safety/attack-patterns.js.map +1 -1
  468. package/dist/safety/bash-parser.d.ts.map +1 -1
  469. package/dist/safety/bash-parser.js +4 -3
  470. package/dist/safety/bash-parser.js.map +1 -1
  471. package/dist/safety/execpolicy.d.ts +15 -3
  472. package/dist/safety/execpolicy.d.ts.map +1 -1
  473. package/dist/safety/execpolicy.js +248 -37
  474. package/dist/safety/execpolicy.js.map +1 -1
  475. package/dist/safety/governance-service-client.d.ts.map +1 -1
  476. package/dist/safety/governance-service-client.js +4 -7
  477. package/dist/safety/governance-service-client.js.map +1 -1
  478. package/dist/safety/guarded-files.d.ts +34 -0
  479. package/dist/safety/guarded-files.d.ts.map +1 -0
  480. package/dist/safety/guarded-files.js +372 -0
  481. package/dist/safety/guarded-files.js.map +1 -0
  482. package/dist/safety/loop-detector.d.ts.map +1 -1
  483. package/dist/safety/loop-detector.js +6 -1
  484. package/dist/safety/loop-detector.js.map +1 -1
  485. package/dist/safety/permission-profile.d.ts +47 -0
  486. package/dist/safety/permission-profile.d.ts.map +1 -0
  487. package/dist/safety/permission-profile.js +349 -0
  488. package/dist/safety/permission-profile.js.map +1 -0
  489. package/dist/safety/safety-middleware.d.ts +5 -1
  490. package/dist/safety/safety-middleware.d.ts.map +1 -1
  491. package/dist/safety/safety-middleware.js +3 -2
  492. package/dist/safety/safety-middleware.js.map +1 -1
  493. package/dist/safety/suspicious-patterns.d.ts.map +1 -1
  494. package/dist/safety/suspicious-patterns.js +12 -7
  495. package/dist/safety/suspicious-patterns.js.map +1 -1
  496. package/dist/safety/tool-categorization.js +1 -1
  497. package/dist/safety/tool-categorization.js.map +1 -1
  498. package/dist/safety/validators/path-policy-validator.d.ts.map +1 -1
  499. package/dist/safety/validators/path-policy-validator.js +7 -0
  500. package/dist/safety/validators/path-policy-validator.js.map +1 -1
  501. package/dist/sandbox/index.d.ts +6 -1
  502. package/dist/sandbox/index.d.ts.map +1 -1
  503. package/dist/sandbox/index.js +30 -4
  504. package/dist/sandbox/index.js.map +1 -1
  505. package/dist/sandbox/native-sandbox.d.ts +3 -0
  506. package/dist/sandbox/native-sandbox.d.ts.map +1 -1
  507. package/dist/sandbox/native-sandbox.js +139 -18
  508. package/dist/sandbox/native-sandbox.js.map +1 -1
  509. package/dist/sentry.d.ts +17 -0
  510. package/dist/sentry.d.ts.map +1 -0
  511. package/dist/sentry.js +91 -0
  512. package/dist/sentry.js.map +1 -0
  513. package/dist/server/agent-runtime-ledger.d.ts +141 -0
  514. package/dist/server/agent-runtime-ledger.d.ts.map +1 -0
  515. package/dist/server/agent-runtime-ledger.js +334 -0
  516. package/dist/server/agent-runtime-ledger.js.map +1 -0
  517. package/dist/server/agent-trajectory-inspection.d.ts +104 -0
  518. package/dist/server/agent-trajectory-inspection.d.ts.map +1 -0
  519. package/dist/server/agent-trajectory-inspection.js +168 -0
  520. package/dist/server/agent-trajectory-inspection.js.map +1 -0
  521. package/dist/server/agent-trajectory-replay.d.ts +56 -0
  522. package/dist/server/agent-trajectory-replay.d.ts.map +1 -0
  523. package/dist/server/agent-trajectory-replay.js +214 -0
  524. package/dist/server/agent-trajectory-replay.js.map +1 -0
  525. package/dist/server/agent-trajectory-scenarios.d.ts +109 -0
  526. package/dist/server/agent-trajectory-scenarios.d.ts.map +1 -0
  527. package/dist/server/agent-trajectory-scenarios.js +822 -0
  528. package/dist/server/agent-trajectory-scenarios.js.map +1 -0
  529. package/dist/server/agent-trajectory-scorers.d.ts +61 -0
  530. package/dist/server/agent-trajectory-scorers.d.ts.map +1 -0
  531. package/dist/server/agent-trajectory-scorers.js +162 -0
  532. package/dist/server/agent-trajectory-scorers.js.map +1 -0
  533. package/dist/server/agent-trajectory-validation.d.ts +7 -0
  534. package/dist/server/agent-trajectory-validation.d.ts.map +1 -0
  535. package/dist/server/agent-trajectory-validation.js +101 -0
  536. package/dist/server/agent-trajectory-validation.js.map +1 -0
  537. package/dist/server/agent-trajectory.d.ts +50 -0
  538. package/dist/server/agent-trajectory.d.ts.map +1 -0
  539. package/dist/server/agent-trajectory.js +159 -0
  540. package/dist/server/agent-trajectory.js.map +1 -0
  541. package/dist/server/app-context.d.ts +18 -0
  542. package/dist/server/app-context.d.ts.map +1 -1
  543. package/dist/server/app-context.js.map +1 -1
  544. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  545. package/dist/server/handlers/headless-sessions.js +64 -27
  546. package/dist/server/handlers/headless-sessions.js.map +1 -1
  547. package/dist/server/handlers/health.d.ts +6 -0
  548. package/dist/server/handlers/health.d.ts.map +1 -1
  549. package/dist/server/handlers/health.js +6 -0
  550. package/dist/server/handlers/health.js.map +1 -1
  551. package/dist/server/handlers/hosted-runner-drain.d.ts +69 -1
  552. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  553. package/dist/server/handlers/hosted-runner-drain.js +309 -18
  554. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  555. package/dist/server/handlers/hosted-runner-identity.d.ts +16 -0
  556. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
  557. package/dist/server/handlers/hosted-runner-identity.js +43 -0
  558. package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
  559. package/dist/server/handlers/mode.d.ts.map +1 -1
  560. package/dist/server/handlers/mode.js +3 -1
  561. package/dist/server/handlers/mode.js.map +1 -1
  562. package/dist/server/handlers/pending-requests.d.ts.map +1 -1
  563. package/dist/server/handlers/pending-requests.js +336 -51
  564. package/dist/server/handlers/pending-requests.js.map +1 -1
  565. package/dist/server/handlers/platform-a2a-push.d.ts +6 -0
  566. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -0
  567. package/dist/server/handlers/platform-a2a-push.js +136 -0
  568. package/dist/server/handlers/platform-a2a-push.js.map +1 -0
  569. package/dist/server/handlers/sessions.d.ts.map +1 -1
  570. package/dist/server/handlers/sessions.js +21 -1
  571. package/dist/server/handlers/sessions.js.map +1 -1
  572. package/dist/server/headless-runtime-service.d.ts +9 -2
  573. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  574. package/dist/server/headless-runtime-service.js +39 -0
  575. package/dist/server/headless-runtime-service.js.map +1 -1
  576. package/dist/server/hosted-agent-runtime-progress.d.ts +144 -0
  577. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -0
  578. package/dist/server/hosted-agent-runtime-progress.js +1650 -0
  579. package/dist/server/hosted-agent-runtime-progress.js.map +1 -0
  580. package/dist/server/hosted-runner-lease.d.ts +41 -0
  581. package/dist/server/hosted-runner-lease.d.ts.map +1 -0
  582. package/dist/server/hosted-runner-lease.js +140 -0
  583. package/dist/server/hosted-runner-lease.js.map +1 -0
  584. package/dist/server/hosted-session-manager.d.ts +16 -8
  585. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  586. package/dist/server/hosted-session-manager.js +98 -76
  587. package/dist/server/hosted-session-manager.js.map +1 -1
  588. package/dist/server/junit-xml.d.ts +2 -0
  589. package/dist/server/junit-xml.d.ts.map +1 -0
  590. package/dist/server/junit-xml.js +9 -0
  591. package/dist/server/junit-xml.js.map +1 -0
  592. package/dist/server/routes.d.ts.map +1 -1
  593. package/dist/server/routes.js +6 -0
  594. package/dist/server/routes.js.map +1 -1
  595. package/dist/server/scenario-recorder.d.ts +56 -0
  596. package/dist/server/scenario-recorder.d.ts.map +1 -0
  597. package/dist/server/scenario-recorder.js +109 -0
  598. package/dist/server/scenario-recorder.js.map +1 -0
  599. package/dist/server/scripted-scenario-runner.d.ts +46 -0
  600. package/dist/server/scripted-scenario-runner.d.ts.map +1 -0
  601. package/dist/server/scripted-scenario-runner.js +190 -0
  602. package/dist/server/scripted-scenario-runner.js.map +1 -0
  603. package/dist/server/server-middlewares.d.ts +6 -2
  604. package/dist/server/server-middlewares.d.ts.map +1 -1
  605. package/dist/server/server-middlewares.js +8 -2
  606. package/dist/server/server-middlewares.js.map +1 -1
  607. package/dist/server/server-request-manager.d.ts +9 -1
  608. package/dist/server/server-request-manager.d.ts.map +1 -1
  609. package/dist/server/server-request-manager.js +49 -4
  610. package/dist/server/server-request-manager.js.map +1 -1
  611. package/dist/services/intelligent-router/service.d.ts +2 -0
  612. package/dist/services/intelligent-router/service.d.ts.map +1 -1
  613. package/dist/services/intelligent-router/service.js +4 -0
  614. package/dist/services/intelligent-router/service.js.map +1 -1
  615. package/dist/services/service-authority.d.ts +25 -0
  616. package/dist/services/service-authority.d.ts.map +1 -0
  617. package/dist/services/service-authority.js +143 -0
  618. package/dist/services/service-authority.js.map +1 -0
  619. package/dist/services/workspace-config/service.d.ts +2 -0
  620. package/dist/services/workspace-config/service.d.ts.map +1 -1
  621. package/dist/services/workspace-config/service.js +4 -0
  622. package/dist/services/workspace-config/service.js.map +1 -1
  623. package/dist/session/manager.d.ts +8 -2
  624. package/dist/session/manager.d.ts.map +1 -1
  625. package/dist/session/manager.js +19 -4
  626. package/dist/session/manager.js.map +1 -1
  627. package/dist/session/session-branch.d.ts.map +1 -1
  628. package/dist/session/session-branch.js +5 -1
  629. package/dist/session/session-branch.js.map +1 -1
  630. package/dist/session/session-catalog.d.ts +7 -2
  631. package/dist/session/session-catalog.d.ts.map +1 -1
  632. package/dist/session/session-catalog.js +13 -2
  633. package/dist/session/session-catalog.js.map +1 -1
  634. package/dist/session/session-context.d.ts +6 -2
  635. package/dist/session/session-context.d.ts.map +1 -1
  636. package/dist/session/session-context.js +44 -4
  637. package/dist/session/session-context.js.map +1 -1
  638. package/dist/session/session-graph-projection.d.ts +32 -0
  639. package/dist/session/session-graph-projection.d.ts.map +1 -0
  640. package/dist/session/session-graph-projection.js +133 -0
  641. package/dist/session/session-graph-projection.js.map +1 -0
  642. package/dist/session/types.d.ts +18 -0
  643. package/dist/session/types.d.ts.map +1 -1
  644. package/dist/session/types.js +8 -0
  645. package/dist/session/types.js.map +1 -1
  646. package/dist/session/wire-format.generated.d.ts +3 -0
  647. package/dist/session/wire-format.generated.d.ts.map +1 -1
  648. package/dist/session/wire-format.generated.js +20 -0
  649. package/dist/session/wire-format.generated.js.map +1 -1
  650. package/dist/skills/eval-harness.d.ts +38 -0
  651. package/dist/skills/eval-harness.d.ts.map +1 -0
  652. package/dist/skills/eval-harness.js +112 -0
  653. package/dist/skills/eval-harness.js.map +1 -0
  654. package/dist/skills/index.d.ts +5 -1
  655. package/dist/skills/index.d.ts.map +1 -1
  656. package/dist/skills/index.js +5 -1
  657. package/dist/skills/index.js.map +1 -1
  658. package/dist/skills/linter.d.ts +36 -0
  659. package/dist/skills/linter.d.ts.map +1 -0
  660. package/dist/skills/linter.js +398 -0
  661. package/dist/skills/linter.js.map +1 -0
  662. package/dist/skills/loader.d.ts +36 -6
  663. package/dist/skills/loader.d.ts.map +1 -1
  664. package/dist/skills/loader.js +169 -86
  665. package/dist/skills/loader.js.map +1 -1
  666. package/dist/skills/package-contract.d.ts +45 -0
  667. package/dist/skills/package-contract.d.ts.map +1 -0
  668. package/dist/skills/package-contract.js +153 -0
  669. package/dist/skills/package-contract.js.map +1 -0
  670. package/dist/skills/runtime-activation.d.ts +68 -0
  671. package/dist/skills/runtime-activation.d.ts.map +1 -0
  672. package/dist/skills/runtime-activation.js +228 -0
  673. package/dist/skills/runtime-activation.js.map +1 -0
  674. package/dist/skills/service-client.d.ts.map +1 -1
  675. package/dist/skills/service-client.js +3 -4
  676. package/dist/skills/service-client.js.map +1 -1
  677. package/dist/skills/tool.d.ts.map +1 -1
  678. package/dist/skills/tool.js +2 -0
  679. package/dist/skills/tool.js.map +1 -1
  680. package/dist/skills/types.d.ts +14 -0
  681. package/dist/skills/types.d.ts.map +1 -1
  682. package/dist/skills/types.js.map +1 -1
  683. package/dist/telemetry/agent-operating-plane-context.d.ts +24 -0
  684. package/dist/telemetry/agent-operating-plane-context.d.ts.map +1 -0
  685. package/dist/telemetry/agent-operating-plane-context.js +54 -0
  686. package/dist/telemetry/agent-operating-plane-context.js.map +1 -0
  687. package/dist/telemetry/beacon.d.ts +24 -0
  688. package/dist/telemetry/beacon.d.ts.map +1 -0
  689. package/dist/telemetry/beacon.js +115 -0
  690. package/dist/telemetry/beacon.js.map +1 -0
  691. package/dist/telemetry/cli-command-aggregator.d.ts +36 -0
  692. package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -0
  693. package/dist/telemetry/cli-command-aggregator.js +251 -0
  694. package/dist/telemetry/cli-command-aggregator.js.map +1 -0
  695. package/dist/telemetry/cli-startup.d.ts +21 -0
  696. package/dist/telemetry/cli-startup.d.ts.map +1 -0
  697. package/dist/telemetry/cli-startup.js +83 -0
  698. package/dist/telemetry/cli-startup.js.map +1 -0
  699. package/dist/telemetry/disablement.d.ts +13 -0
  700. package/dist/telemetry/disablement.d.ts.map +1 -0
  701. package/dist/telemetry/disablement.js +19 -0
  702. package/dist/telemetry/disablement.js.map +1 -0
  703. package/dist/telemetry/index.d.ts +6 -2
  704. package/dist/telemetry/index.d.ts.map +1 -1
  705. package/dist/telemetry/index.js +6 -2
  706. package/dist/telemetry/index.js.map +1 -1
  707. package/dist/telemetry/maestro-event-bus.d.ts +52 -0
  708. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  709. package/dist/telemetry/maestro-event-bus.js +179 -3
  710. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  711. package/dist/telemetry/maestro-event-catalog.d.ts +3 -1
  712. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  713. package/dist/telemetry/maestro-event-catalog.js +2 -0
  714. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  715. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  716. package/dist/telemetry/maestro-platform-replay-fixture.js +74 -9
  717. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  718. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +1 -1
  719. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -1
  720. package/dist/telemetry/maestro-publisher-conformance-fixture.js +46 -11
  721. package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -1
  722. package/dist/telemetry/mcp-beacon.d.ts +20 -0
  723. package/dist/telemetry/mcp-beacon.d.ts.map +1 -0
  724. package/dist/telemetry/mcp-beacon.js +54 -0
  725. package/dist/telemetry/mcp-beacon.js.map +1 -0
  726. package/dist/telemetry/metadata-normalization.d.ts +7 -0
  727. package/dist/telemetry/metadata-normalization.d.ts.map +1 -0
  728. package/dist/telemetry/metadata-normalization.js +189 -0
  729. package/dist/telemetry/metadata-normalization.js.map +1 -0
  730. package/dist/telemetry/meter-service-client.d.ts.map +1 -1
  731. package/dist/telemetry/meter-service-client.js +5 -10
  732. package/dist/telemetry/meter-service-client.js.map +1 -1
  733. package/dist/telemetry/metrics.d.ts +123 -0
  734. package/dist/telemetry/metrics.d.ts.map +1 -0
  735. package/dist/telemetry/metrics.js +184 -0
  736. package/dist/telemetry/metrics.js.map +1 -0
  737. package/dist/telemetry/turn-tracker.d.ts +1 -0
  738. package/dist/telemetry/turn-tracker.d.ts.map +1 -1
  739. package/dist/telemetry/turn-tracker.js +22 -1
  740. package/dist/telemetry/turn-tracker.js.map +1 -1
  741. package/dist/telemetry/wide-events.d.ts +31 -1
  742. package/dist/telemetry/wide-events.d.ts.map +1 -1
  743. package/dist/telemetry/wide-events.js +229 -1
  744. package/dist/telemetry/wide-events.js.map +1 -1
  745. package/dist/telemetry.d.ts +39 -3
  746. package/dist/telemetry.d.ts.map +1 -1
  747. package/dist/telemetry.js +160 -3
  748. package/dist/telemetry.js.map +1 -1
  749. package/dist/testing/test-verification-hook.d.ts.map +1 -1
  750. package/dist/testing/test-verification-hook.js +34 -21
  751. package/dist/testing/test-verification-hook.js.map +1 -1
  752. package/dist/tools/apply-patch-parser.d.ts +26 -0
  753. package/dist/tools/apply-patch-parser.d.ts.map +1 -0
  754. package/dist/tools/apply-patch-parser.js +146 -0
  755. package/dist/tools/apply-patch-parser.js.map +1 -0
  756. package/dist/tools/apply-patch.d.ts +42 -0
  757. package/dist/tools/apply-patch.d.ts.map +1 -0
  758. package/dist/tools/apply-patch.js +648 -0
  759. package/dist/tools/apply-patch.js.map +1 -0
  760. package/dist/tools/ask-user.d.ts +1 -0
  761. package/dist/tools/ask-user.d.ts.map +1 -1
  762. package/dist/tools/background/tool-handler.d.ts +1 -0
  763. package/dist/tools/background/tool-handler.d.ts.map +1 -1
  764. package/dist/tools/bash.d.ts +1 -0
  765. package/dist/tools/bash.d.ts.map +1 -1
  766. package/dist/tools/codesearch.d.ts +1 -0
  767. package/dist/tools/codesearch.d.ts.map +1 -1
  768. package/dist/tools/conductor-client.d.ts +1 -0
  769. package/dist/tools/conductor-client.d.ts.map +1 -1
  770. package/dist/tools/conductor-client.js +63 -0
  771. package/dist/tools/conductor-client.js.map +1 -1
  772. package/dist/tools/diff.d.ts +1 -0
  773. package/dist/tools/diff.d.ts.map +1 -1
  774. package/dist/tools/edit.d.ts +1 -0
  775. package/dist/tools/edit.d.ts.map +1 -1
  776. package/dist/tools/extract-document.d.ts +1 -0
  777. package/dist/tools/extract-document.d.ts.map +1 -1
  778. package/dist/tools/find.d.ts +10 -0
  779. package/dist/tools/find.d.ts.map +1 -1
  780. package/dist/tools/find.js +236 -27
  781. package/dist/tools/find.js.map +1 -1
  782. package/dist/tools/gh.d.ts +3 -0
  783. package/dist/tools/gh.d.ts.map +1 -1
  784. package/dist/tools/index.d.ts +50 -0
  785. package/dist/tools/index.d.ts.map +1 -1
  786. package/dist/tools/index.js +4 -0
  787. package/dist/tools/index.js.map +1 -1
  788. package/dist/tools/list.d.ts +1 -0
  789. package/dist/tools/list.d.ts.map +1 -1
  790. package/dist/tools/notebook.d.ts +1 -0
  791. package/dist/tools/notebook.d.ts.map +1 -1
  792. package/dist/tools/oracle.d.ts +1 -0
  793. package/dist/tools/oracle.d.ts.map +1 -1
  794. package/dist/tools/oracle.js +17 -32
  795. package/dist/tools/oracle.js.map +1 -1
  796. package/dist/tools/parallel-execution.d.ts +13 -2
  797. package/dist/tools/parallel-execution.d.ts.map +1 -1
  798. package/dist/tools/parallel-execution.js +178 -7
  799. package/dist/tools/parallel-execution.js.map +1 -1
  800. package/dist/tools/parallel-ripgrep.d.ts +1 -0
  801. package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
  802. package/dist/tools/pipeline.d.ts +4 -0
  803. package/dist/tools/pipeline.d.ts.map +1 -1
  804. package/dist/tools/read.d.ts +1 -0
  805. package/dist/tools/read.d.ts.map +1 -1
  806. package/dist/tools/search.d.ts +1 -0
  807. package/dist/tools/search.d.ts.map +1 -1
  808. package/dist/tools/status.d.ts +1 -0
  809. package/dist/tools/status.d.ts.map +1 -1
  810. package/dist/tools/todo.d.ts +1 -0
  811. package/dist/tools/todo.d.ts.map +1 -1
  812. package/dist/tools/tool-dsl.d.ts +5 -1
  813. package/dist/tools/tool-dsl.d.ts.map +1 -1
  814. package/dist/tools/tool-dsl.js +1 -0
  815. package/dist/tools/tool-dsl.js.map +1 -1
  816. package/dist/tools/tool-result-cache.d.ts.map +1 -1
  817. package/dist/tools/tool-result-cache.js +1 -0
  818. package/dist/tools/tool-result-cache.js.map +1 -1
  819. package/dist/tools/typebox-tool.d.ts.map +1 -1
  820. package/dist/tools/typebox-tool.js +3 -0
  821. package/dist/tools/typebox-tool.js.map +1 -1
  822. package/dist/tools/webfetch.d.ts +1 -0
  823. package/dist/tools/webfetch.d.ts.map +1 -1
  824. package/dist/tools/websearch.d.ts +1 -0
  825. package/dist/tools/websearch.d.ts.map +1 -1
  826. package/dist/tools/write.d.ts +1 -0
  827. package/dist/tools/write.d.ts.map +1 -1
  828. package/dist/utils/abort-error.d.ts +2 -0
  829. package/dist/utils/abort-error.d.ts.map +1 -0
  830. package/dist/utils/abort-error.js +7 -0
  831. package/dist/utils/abort-error.js.map +1 -0
  832. package/dist/utils/downstream.d.ts.map +1 -1
  833. package/dist/utils/downstream.js +4 -0
  834. package/dist/utils/downstream.js.map +1 -1
  835. package/dist/utils/logger.d.ts +3 -0
  836. package/dist/utils/logger.d.ts.map +1 -1
  837. package/dist/utils/logger.js +14 -3
  838. package/dist/utils/logger.js.map +1 -1
  839. package/dist/utils/path-containment.d.ts +2 -0
  840. package/dist/utils/path-containment.d.ts.map +1 -0
  841. package/dist/utils/path-containment.js +14 -0
  842. package/dist/utils/path-containment.js.map +1 -0
  843. package/dist/utils/prompt-safe-text.d.ts +7 -0
  844. package/dist/utils/prompt-safe-text.d.ts.map +1 -0
  845. package/dist/utils/prompt-safe-text.js +44 -0
  846. package/dist/utils/prompt-safe-text.js.map +1 -0
  847. package/dist/version.json +2 -2
  848. package/dist/web-server.d.ts.map +1 -1
  849. package/dist/web-server.js +32 -7
  850. package/dist/web-server.js.map +1 -1
  851. package/dist/workspace/root-resolver.d.ts +4 -1
  852. package/dist/workspace/root-resolver.d.ts.map +1 -1
  853. package/dist/workspace/root-resolver.js +16 -6
  854. package/dist/workspace/root-resolver.js.map +1 -1
  855. package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts +8 -0
  856. package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts.map +1 -0
  857. package/node_modules/@evalops/contracts/dist/advisor-effort.js +35 -0
  858. package/node_modules/@evalops/contracts/dist/advisor-effort.js.map +1 -0
  859. package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts +10 -0
  860. package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts.map +1 -0
  861. package/node_modules/@evalops/contracts/dist/delegation-prompt.js +48 -0
  862. package/node_modules/@evalops/contracts/dist/delegation-prompt.js.map +1 -0
  863. package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts +20 -0
  864. package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts.map +1 -0
  865. package/node_modules/@evalops/contracts/dist/guarded-files-settings.js +147 -0
  866. package/node_modules/@evalops/contracts/dist/guarded-files-settings.js.map +1 -0
  867. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts +2 -0
  868. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts.map +1 -1
  869. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js +1 -0
  870. package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js.map +1 -1
  871. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +280 -5
  872. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
  873. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +36 -1
  874. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
  875. package/node_modules/@evalops/contracts/dist/index.d.ts +15 -1
  876. package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  877. package/node_modules/@evalops/contracts/dist/index.js +6 -0
  878. package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  879. package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +593 -0
  880. package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -0
  881. package/node_modules/@evalops/contracts/dist/maestro-app-server.js +218 -0
  882. package/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -0
  883. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +91 -0
  884. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
  885. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +92 -61
  886. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
  887. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +3 -0
  888. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -1
  889. package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts +28 -0
  890. package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts.map +1 -0
  891. package/node_modules/@evalops/contracts/dist/runtime-constraints.js +71 -0
  892. package/node_modules/@evalops/contracts/dist/runtime-constraints.js.map +1 -0
  893. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +7 -0
  894. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -1
  895. package/node_modules/@evalops/contracts/dist/runtime-server-request.js +2 -0
  896. package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -1
  897. package/node_modules/@evalops/contracts/dist/scenario.d.ts +191 -0
  898. package/node_modules/@evalops/contracts/dist/scenario.d.ts.map +1 -0
  899. package/node_modules/@evalops/contracts/dist/scenario.js +4 -0
  900. package/node_modules/@evalops/contracts/dist/scenario.js.map +1 -0
  901. package/node_modules/@evalops/contracts/dist/schemas.d.ts +17 -3
  902. package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
  903. package/node_modules/@evalops/contracts/dist/schemas.js +16 -0
  904. package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
  905. package/node_modules/@evalops/contracts/package.json +1 -1
  906. package/node_modules/@evalops/tui/package.json +1 -1
  907. package/package.json +41 -7
  908. package/skills/incident-triage/SKILL.md +40 -0
  909. package/skills/incident-triage/mcp.json +14 -0
  910. package/skills/incident-triage/reference/triage.md +20 -0
  911. package/skills/incident-triage/toolbox/incident-timeline +22 -0
  912. package/skills/incident-triage/toolbox/incident-timeline.cmd +16 -0
  913. package/skills/pr-review/SKILL.md +40 -0
  914. package/skills/pr-review/mcp.json +14 -0
  915. package/skills/pr-review/reference/rubric.md +20 -0
  916. package/skills/pr-review/toolbox/review-summary +20 -0
  917. package/skills/pr-review/toolbox/review-summary.cmd +14 -0
  918. package/skills/release-verification/SKILL.md +40 -0
  919. package/skills/release-verification/mcp.json +15 -0
  920. package/skills/release-verification/reference/checklist.md +21 -0
  921. package/skills/release-verification/toolbox/release-readiness +18 -0
  922. package/skills/release-verification/toolbox/release-readiness.cmd +12 -0
@@ -0,0 +1,349 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { isPathWithin } from "../utils/path-containment.js";
4
+ const ACCESS_RANK = {
5
+ none: 0,
6
+ "read-only": 1,
7
+ "read-write": 2,
8
+ };
9
+ const PROFILE_DEFAULT_CWD = process.cwd();
10
+ function canonicalizePath(path) {
11
+ try {
12
+ return realpathSync(path);
13
+ }
14
+ catch {
15
+ return path;
16
+ }
17
+ }
18
+ function normalizeConcretePath(path, cwd) {
19
+ return canonicalizePath(isAbsolute(path) ? resolve(path) : resolve(cwd, path));
20
+ }
21
+ function permissionPathKey(path) {
22
+ switch (path.kind) {
23
+ case "path":
24
+ return `path:${path.path}`;
25
+ case "special":
26
+ return `special:${path.value}`;
27
+ case "glob":
28
+ return `glob:${path.pattern}`;
29
+ }
30
+ }
31
+ function entryKey(entry) {
32
+ return `${permissionPathKey(entry.path)}:${entry.access}`;
33
+ }
34
+ function normalizeEntry(entry, cwd) {
35
+ if (entry.path.kind === "glob" && entry.access !== "none") {
36
+ throw new Error("Permission profile glob entries may only be deny rules for now");
37
+ }
38
+ if (entry.path.kind !== "path") {
39
+ return entry;
40
+ }
41
+ return {
42
+ ...entry,
43
+ path: {
44
+ kind: "path",
45
+ path: normalizeConcretePath(entry.path.path, cwd),
46
+ },
47
+ };
48
+ }
49
+ function maxGlobScanDepth(left, right) {
50
+ if (left === undefined) {
51
+ return right;
52
+ }
53
+ if (right === undefined) {
54
+ return left;
55
+ }
56
+ return Math.max(left, right);
57
+ }
58
+ function resolveSpecialPath(value, cwd) {
59
+ switch (value) {
60
+ case "workspace":
61
+ return normalizeConcretePath(cwd, cwd);
62
+ case "tmp":
63
+ return normalizeConcretePath("/tmp", cwd);
64
+ case "tmpdir":
65
+ return process.env.TMPDIR
66
+ ? normalizeConcretePath(process.env.TMPDIR, cwd)
67
+ : undefined;
68
+ case "full-disk":
69
+ return "/";
70
+ }
71
+ }
72
+ function materializePath(path, cwd) {
73
+ switch (path.kind) {
74
+ case "path":
75
+ return path.path;
76
+ case "special":
77
+ return resolveSpecialPath(path.value, cwd);
78
+ case "glob":
79
+ return undefined;
80
+ }
81
+ }
82
+ function constrainAccess(requested, granted) {
83
+ return ACCESS_RANK[requested] <= ACCESS_RANK[granted] ? requested : granted;
84
+ }
85
+ function intersectConcretePathEntries(requestedEntry, requestedPath, grantedEntry, grantedPath) {
86
+ if (isPathWithin(requestedPath, grantedPath)) {
87
+ return {
88
+ path: requestedEntry.path,
89
+ access: constrainAccess(requestedEntry.access, grantedEntry.access),
90
+ };
91
+ }
92
+ if (isPathWithin(grantedPath, requestedPath)) {
93
+ return {
94
+ path: grantedEntry.path,
95
+ access: constrainAccess(requestedEntry.access, grantedEntry.access),
96
+ };
97
+ }
98
+ return undefined;
99
+ }
100
+ function intersectionEntryKey(entry, cwd) {
101
+ const concretePath = materializePath(entry.path, cwd);
102
+ return concretePath
103
+ ? `concrete:${concretePath}`
104
+ : permissionPathKey(entry.path);
105
+ }
106
+ function coalesceToMostRestrictiveEntries(entries, cwd) {
107
+ const entriesByPath = new Map();
108
+ for (const entry of entries) {
109
+ const key = intersectionEntryKey(entry, cwd);
110
+ const existing = entriesByPath.get(key);
111
+ if (!existing || ACCESS_RANK[entry.access] < ACCESS_RANK[existing.access]) {
112
+ entriesByPath.set(key, entry);
113
+ }
114
+ }
115
+ return [...entriesByPath.values()];
116
+ }
117
+ function readWriteEntries(profile) {
118
+ return (profile.fileSystem?.entries ?? []).filter((entry) => entry.access === "read-write");
119
+ }
120
+ function denyEntries(profile) {
121
+ return (profile.fileSystem?.entries ?? []).filter((entry) => entry.access === "none");
122
+ }
123
+ function entryGrantsFullDisk(entry, cwd) {
124
+ const concretePath = materializePath(entry.path, cwd);
125
+ return (concretePath !== undefined &&
126
+ normalizeConcretePath(concretePath, cwd) === "/");
127
+ }
128
+ function profileHasFullDiskWrite(profile, cwd) {
129
+ return readWriteEntries(profile).some((entry) => entryGrantsFullDisk(entry, cwd));
130
+ }
131
+ export function normalizePermissionProfile(profile, options = {}) {
132
+ const cwd = options.cwd ?? PROFILE_DEFAULT_CWD;
133
+ const entriesByKey = new Map();
134
+ for (const entry of profile.fileSystem?.entries ?? []) {
135
+ const normalized = normalizeEntry(entry, cwd);
136
+ entriesByKey.set(entryKey(normalized), normalized);
137
+ }
138
+ const entries = [...entriesByKey.values()].sort((left, right) => entryKey(left).localeCompare(entryKey(right)));
139
+ return {
140
+ ...(entries.length > 0 || profile.fileSystem?.globScanMaxDepth !== undefined
141
+ ? {
142
+ fileSystem: {
143
+ entries,
144
+ ...(profile.fileSystem?.globScanMaxDepth !== undefined
145
+ ? {
146
+ globScanMaxDepth: profile.fileSystem.globScanMaxDepth,
147
+ }
148
+ : {}),
149
+ },
150
+ }
151
+ : {}),
152
+ ...(profile.network
153
+ ? { network: { enabled: profile.network.enabled === true } }
154
+ : {}),
155
+ };
156
+ }
157
+ export function mergePermissionProfiles(base, additional, options = {}) {
158
+ const cwd = options.cwd ?? PROFILE_DEFAULT_CWD;
159
+ const normalizedBase = normalizePermissionProfile(base, { cwd });
160
+ const normalizedAdditional = normalizePermissionProfile(additional, { cwd });
161
+ return normalizePermissionProfile({
162
+ fileSystem: {
163
+ entries: [
164
+ ...(normalizedBase.fileSystem?.entries ?? []),
165
+ ...(normalizedAdditional.fileSystem?.entries ?? []),
166
+ ],
167
+ globScanMaxDepth: maxGlobScanDepth(normalizedBase.fileSystem?.globScanMaxDepth, normalizedAdditional.fileSystem?.globScanMaxDepth),
168
+ },
169
+ network: normalizedBase.network || normalizedAdditional.network
170
+ ? {
171
+ enabled: normalizedBase.network?.enabled === true ||
172
+ normalizedAdditional.network?.enabled === true,
173
+ }
174
+ : undefined,
175
+ }, { cwd });
176
+ }
177
+ export function intersectPermissionProfiles(requested, granted, options = {}) {
178
+ const cwd = options.cwd ?? PROFILE_DEFAULT_CWD;
179
+ const normalizedRequested = normalizePermissionProfile(requested, { cwd });
180
+ const normalizedGranted = normalizePermissionProfile(granted, { cwd });
181
+ const acceptedEntries = [];
182
+ for (const grantedEntry of normalizedGranted.fileSystem?.entries ?? []) {
183
+ if (grantedEntry.access === "none") {
184
+ continue;
185
+ }
186
+ const grantedPath = materializePath(grantedEntry.path, cwd);
187
+ if (!grantedPath) {
188
+ continue;
189
+ }
190
+ for (const requestedEntry of normalizedRequested.fileSystem?.entries ??
191
+ []) {
192
+ if (requestedEntry.access === "none") {
193
+ continue;
194
+ }
195
+ const requestedPath = materializePath(requestedEntry.path, cwd);
196
+ if (!requestedPath) {
197
+ continue;
198
+ }
199
+ const intersection = intersectConcretePathEntries(requestedEntry, requestedPath, grantedEntry, grantedPath);
200
+ if (intersection) {
201
+ acceptedEntries.push(intersection);
202
+ }
203
+ }
204
+ }
205
+ const deniedEntries = [
206
+ ...denyEntries(normalizedRequested),
207
+ ...denyEntries(normalizedGranted),
208
+ ];
209
+ return normalizePermissionProfile({
210
+ fileSystem: {
211
+ entries: coalesceToMostRestrictiveEntries([...acceptedEntries, ...deniedEntries], cwd),
212
+ globScanMaxDepth: maxGlobScanDepth(normalizedRequested.fileSystem?.globScanMaxDepth, normalizedGranted.fileSystem?.globScanMaxDepth),
213
+ },
214
+ network: normalizedRequested.network || normalizedGranted.network
215
+ ? {
216
+ enabled: normalizedRequested.network?.enabled === true &&
217
+ normalizedGranted.network?.enabled === true,
218
+ }
219
+ : undefined,
220
+ }, { cwd });
221
+ }
222
+ export function permissionProfileFromNativeSandboxPolicy(policy, cwd = PROFILE_DEFAULT_CWD) {
223
+ if (policy.mode === "danger-full-access") {
224
+ return normalizePermissionProfile({
225
+ fileSystem: {
226
+ entries: [
227
+ {
228
+ path: { kind: "special", value: "full-disk" },
229
+ access: "read-write",
230
+ },
231
+ ],
232
+ },
233
+ network: { enabled: policy.networkAccess !== false },
234
+ }, { cwd });
235
+ }
236
+ const entries = [];
237
+ if (policy.mode === "read-only") {
238
+ entries.push({
239
+ path: { kind: "special", value: "full-disk" },
240
+ access: "read-only",
241
+ });
242
+ }
243
+ else if (policy.mode === "workspace-write") {
244
+ entries.push({
245
+ path: { kind: "special", value: "workspace" },
246
+ access: "read-write",
247
+ });
248
+ for (const root of policy.writableRoots ?? []) {
249
+ entries.push({
250
+ path: { kind: "path", path: root },
251
+ access: "read-write",
252
+ });
253
+ }
254
+ if (!policy.excludeSlashTmp) {
255
+ entries.push({
256
+ path: { kind: "special", value: "tmp" },
257
+ access: "read-write",
258
+ });
259
+ }
260
+ if (!policy.excludeTmpdir) {
261
+ entries.push({
262
+ path: { kind: "special", value: "tmpdir" },
263
+ access: "read-write",
264
+ });
265
+ }
266
+ }
267
+ return normalizePermissionProfile({
268
+ ...(entries.length > 0 ? { fileSystem: { entries } } : {}),
269
+ network: { enabled: policy.networkAccess === true },
270
+ }, { cwd });
271
+ }
272
+ export function nativeSandboxPolicyFromPermissionProfile(profile, cwd = PROFILE_DEFAULT_CWD) {
273
+ const normalized = normalizePermissionProfile(profile, { cwd });
274
+ if (denyEntries(normalized).length > 0) {
275
+ throw new Error("Cannot convert permission profile with deny rules to native sandbox policy without widening permissions");
276
+ }
277
+ if (profileHasFullDiskWrite(normalized, cwd)) {
278
+ return {
279
+ mode: "danger-full-access",
280
+ networkAccess: normalized.network?.enabled === true,
281
+ };
282
+ }
283
+ const writeEntries = readWriteEntries(normalized);
284
+ if (writeEntries.length === 0) {
285
+ const readOnlyEntries = (normalized.fileSystem?.entries ?? []).filter((entry) => entry.access === "read-only");
286
+ const hasFullDiskRead = readOnlyEntries.some((entry) => entryGrantsFullDisk(entry, cwd));
287
+ const hasScopedReadOnly = readOnlyEntries.some((entry) => !entryGrantsFullDisk(entry, cwd));
288
+ if (hasScopedReadOnly && !hasFullDiskRead) {
289
+ throw new Error("Cannot convert scoped read-only permission profile to native read-only policy without widening read permissions");
290
+ }
291
+ return {
292
+ mode: "read-only",
293
+ networkAccess: normalized.network?.enabled === true,
294
+ };
295
+ }
296
+ const writableRoots = [];
297
+ let includesWorkspace = false;
298
+ let includesSlashTmp = false;
299
+ let includesTmpdir = false;
300
+ for (const entry of writeEntries) {
301
+ if (entry.path.kind === "special") {
302
+ switch (entry.path.value) {
303
+ case "workspace":
304
+ includesWorkspace = true;
305
+ break;
306
+ case "tmp":
307
+ includesSlashTmp = true;
308
+ break;
309
+ case "tmpdir":
310
+ includesTmpdir = true;
311
+ break;
312
+ case "full-disk":
313
+ break;
314
+ }
315
+ continue;
316
+ }
317
+ if (entry.path.kind === "path") {
318
+ if (isPathWithin(cwd, entry.path.path)) {
319
+ includesWorkspace = true;
320
+ if (!isPathWithin(entry.path.path, cwd)) {
321
+ writableRoots.push(entry.path.path);
322
+ }
323
+ }
324
+ else {
325
+ writableRoots.push(entry.path.path);
326
+ }
327
+ }
328
+ }
329
+ if (!includesWorkspace) {
330
+ throw new Error("Cannot convert permission profile to native workspace-write policy without granting workspace write");
331
+ }
332
+ return {
333
+ mode: "workspace-write",
334
+ ...(writableRoots.length > 0 ? { writableRoots } : {}),
335
+ networkAccess: normalized.network?.enabled === true,
336
+ excludeSlashTmp: !includesSlashTmp,
337
+ excludeTmpdir: !includesTmpdir,
338
+ };
339
+ }
340
+ export function buildNativeSandboxPolicy(input, cwd = PROFILE_DEFAULT_CWD) {
341
+ return nativeSandboxPolicyFromPermissionProfile(permissionProfileFromNativeSandboxPolicy({
342
+ mode: input.mode,
343
+ writableRoots: input.writableRoots,
344
+ networkAccess: input.networkAccess,
345
+ excludeTmpdir: input.excludeTmpdir,
346
+ excludeSlashTmp: input.excludeSlashTmp,
347
+ }, cwd), cwd);
348
+ }
349
+ //# sourceMappingURL=permission-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-profile.js","sourceRoot":"","sources":["../../src/safety/permission-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport type {\n\tNativeSandboxMode,\n\tNativeSandboxPolicy,\n} from \"../sandbox/native-sandbox.js\";\nimport { isPathWithin } from \"../utils/path-containment.js\";\n\nexport type FileSystemAccessMode = \"none\" | \"read-only\" | \"read-write\";\n\nexport type FileSystemPermissionPath =\n\t| { kind: \"path\"; path: string }\n\t| { kind: \"special\"; value: \"workspace\" | \"tmp\" | \"tmpdir\" | \"full-disk\" }\n\t| { kind: \"glob\"; pattern: string };\n\nexport interface FileSystemPermissionEntry {\n\tpath: FileSystemPermissionPath;\n\taccess: FileSystemAccessMode;\n}\n\nexport interface FileSystemPermissions {\n\tentries: FileSystemPermissionEntry[];\n\tglobScanMaxDepth?: number;\n}\n\nexport interface NetworkPermissions {\n\tenabled: boolean;\n}\n\nexport interface PermissionProfile {\n\tfileSystem?: FileSystemPermissions;\n\tnetwork?: NetworkPermissions;\n}\n\nexport interface NormalizePermissionProfileOptions {\n\tcwd?: string;\n}\n\nexport interface IntersectPermissionProfileOptions {\n\tcwd?: string;\n}\n\nconst ACCESS_RANK: Record<FileSystemAccessMode, number> = {\n\tnone: 0,\n\t\"read-only\": 1,\n\t\"read-write\": 2,\n};\n\nconst PROFILE_DEFAULT_CWD = process.cwd();\n\nfunction canonicalizePath(path: string): string {\n\ttry {\n\t\treturn realpathSync(path);\n\t} catch {\n\t\treturn path;\n\t}\n}\n\nfunction normalizeConcretePath(path: string, cwd: string): string {\n\treturn canonicalizePath(\n\t\tisAbsolute(path) ? resolve(path) : resolve(cwd, path),\n\t);\n}\n\nfunction permissionPathKey(path: FileSystemPermissionPath): string {\n\tswitch (path.kind) {\n\t\tcase \"path\":\n\t\t\treturn `path:${path.path}`;\n\t\tcase \"special\":\n\t\t\treturn `special:${path.value}`;\n\t\tcase \"glob\":\n\t\t\treturn `glob:${path.pattern}`;\n\t}\n}\n\nfunction entryKey(entry: FileSystemPermissionEntry): string {\n\treturn `${permissionPathKey(entry.path)}:${entry.access}`;\n}\n\nfunction normalizeEntry(\n\tentry: FileSystemPermissionEntry,\n\tcwd: string,\n): FileSystemPermissionEntry {\n\tif (entry.path.kind === \"glob\" && entry.access !== \"none\") {\n\t\tthrow new Error(\n\t\t\t\"Permission profile glob entries may only be deny rules for now\",\n\t\t);\n\t}\n\n\tif (entry.path.kind !== \"path\") {\n\t\treturn entry;\n\t}\n\n\treturn {\n\t\t...entry,\n\t\tpath: {\n\t\t\tkind: \"path\",\n\t\t\tpath: normalizeConcretePath(entry.path.path, cwd),\n\t\t},\n\t};\n}\n\nfunction maxGlobScanDepth(\n\tleft: number | undefined,\n\tright: number | undefined,\n): number | undefined {\n\tif (left === undefined) {\n\t\treturn right;\n\t}\n\tif (right === undefined) {\n\t\treturn left;\n\t}\n\treturn Math.max(left, right);\n}\n\nfunction resolveSpecialPath(\n\tvalue: Extract<FileSystemPermissionPath, { kind: \"special\" }>[\"value\"],\n\tcwd: string,\n): string | undefined {\n\tswitch (value) {\n\t\tcase \"workspace\":\n\t\t\treturn normalizeConcretePath(cwd, cwd);\n\t\tcase \"tmp\":\n\t\t\treturn normalizeConcretePath(\"/tmp\", cwd);\n\t\tcase \"tmpdir\":\n\t\t\treturn process.env.TMPDIR\n\t\t\t\t? normalizeConcretePath(process.env.TMPDIR, cwd)\n\t\t\t\t: undefined;\n\t\tcase \"full-disk\":\n\t\t\treturn \"/\";\n\t}\n}\n\nfunction materializePath(\n\tpath: FileSystemPermissionPath,\n\tcwd: string,\n): string | undefined {\n\tswitch (path.kind) {\n\t\tcase \"path\":\n\t\t\treturn path.path;\n\t\tcase \"special\":\n\t\t\treturn resolveSpecialPath(path.value, cwd);\n\t\tcase \"glob\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction constrainAccess(\n\trequested: FileSystemAccessMode,\n\tgranted: FileSystemAccessMode,\n): FileSystemAccessMode {\n\treturn ACCESS_RANK[requested] <= ACCESS_RANK[granted] ? requested : granted;\n}\n\nfunction intersectConcretePathEntries(\n\trequestedEntry: FileSystemPermissionEntry,\n\trequestedPath: string,\n\tgrantedEntry: FileSystemPermissionEntry,\n\tgrantedPath: string,\n): FileSystemPermissionEntry | undefined {\n\tif (isPathWithin(requestedPath, grantedPath)) {\n\t\treturn {\n\t\t\tpath: requestedEntry.path,\n\t\t\taccess: constrainAccess(requestedEntry.access, grantedEntry.access),\n\t\t};\n\t}\n\tif (isPathWithin(grantedPath, requestedPath)) {\n\t\treturn {\n\t\t\tpath: grantedEntry.path,\n\t\t\taccess: constrainAccess(requestedEntry.access, grantedEntry.access),\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction intersectionEntryKey(\n\tentry: FileSystemPermissionEntry,\n\tcwd: string,\n): string {\n\tconst concretePath = materializePath(entry.path, cwd);\n\treturn concretePath\n\t\t? `concrete:${concretePath}`\n\t\t: permissionPathKey(entry.path);\n}\n\nfunction coalesceToMostRestrictiveEntries(\n\tentries: FileSystemPermissionEntry[],\n\tcwd: string,\n): FileSystemPermissionEntry[] {\n\tconst entriesByPath = new Map<string, FileSystemPermissionEntry>();\n\tfor (const entry of entries) {\n\t\tconst key = intersectionEntryKey(entry, cwd);\n\t\tconst existing = entriesByPath.get(key);\n\t\tif (!existing || ACCESS_RANK[entry.access] < ACCESS_RANK[existing.access]) {\n\t\t\tentriesByPath.set(key, entry);\n\t\t}\n\t}\n\treturn [...entriesByPath.values()];\n}\n\nfunction readWriteEntries(\n\tprofile: PermissionProfile,\n): FileSystemPermissionEntry[] {\n\treturn (profile.fileSystem?.entries ?? []).filter(\n\t\t(entry) => entry.access === \"read-write\",\n\t);\n}\n\nfunction denyEntries(profile: PermissionProfile): FileSystemPermissionEntry[] {\n\treturn (profile.fileSystem?.entries ?? []).filter(\n\t\t(entry) => entry.access === \"none\",\n\t);\n}\n\nfunction entryGrantsFullDisk(\n\tentry: FileSystemPermissionEntry,\n\tcwd: string,\n): boolean {\n\tconst concretePath = materializePath(entry.path, cwd);\n\treturn (\n\t\tconcretePath !== undefined &&\n\t\tnormalizeConcretePath(concretePath, cwd) === \"/\"\n\t);\n}\n\nfunction profileHasFullDiskWrite(\n\tprofile: PermissionProfile,\n\tcwd: string,\n): boolean {\n\treturn readWriteEntries(profile).some((entry) =>\n\t\tentryGrantsFullDisk(entry, cwd),\n\t);\n}\n\nexport function normalizePermissionProfile(\n\tprofile: PermissionProfile,\n\toptions: NormalizePermissionProfileOptions = {},\n): PermissionProfile {\n\tconst cwd = options.cwd ?? PROFILE_DEFAULT_CWD;\n\tconst entriesByKey = new Map<string, FileSystemPermissionEntry>();\n\n\tfor (const entry of profile.fileSystem?.entries ?? []) {\n\t\tconst normalized = normalizeEntry(entry, cwd);\n\t\tentriesByKey.set(entryKey(normalized), normalized);\n\t}\n\n\tconst entries = [...entriesByKey.values()].sort((left, right) =>\n\t\tentryKey(left).localeCompare(entryKey(right)),\n\t);\n\n\treturn {\n\t\t...(entries.length > 0 || profile.fileSystem?.globScanMaxDepth !== undefined\n\t\t\t? {\n\t\t\t\t\tfileSystem: {\n\t\t\t\t\t\tentries,\n\t\t\t\t\t\t...(profile.fileSystem?.globScanMaxDepth !== undefined\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tglobScanMaxDepth: profile.fileSystem.globScanMaxDepth,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(profile.network\n\t\t\t? { network: { enabled: profile.network.enabled === true } }\n\t\t\t: {}),\n\t};\n}\n\nexport function mergePermissionProfiles(\n\tbase: PermissionProfile,\n\tadditional: PermissionProfile,\n\toptions: NormalizePermissionProfileOptions = {},\n): PermissionProfile {\n\tconst cwd = options.cwd ?? PROFILE_DEFAULT_CWD;\n\tconst normalizedBase = normalizePermissionProfile(base, { cwd });\n\tconst normalizedAdditional = normalizePermissionProfile(additional, { cwd });\n\n\treturn normalizePermissionProfile(\n\t\t{\n\t\t\tfileSystem: {\n\t\t\t\tentries: [\n\t\t\t\t\t...(normalizedBase.fileSystem?.entries ?? []),\n\t\t\t\t\t...(normalizedAdditional.fileSystem?.entries ?? []),\n\t\t\t\t],\n\t\t\t\tglobScanMaxDepth: maxGlobScanDepth(\n\t\t\t\t\tnormalizedBase.fileSystem?.globScanMaxDepth,\n\t\t\t\t\tnormalizedAdditional.fileSystem?.globScanMaxDepth,\n\t\t\t\t),\n\t\t\t},\n\t\t\tnetwork:\n\t\t\t\tnormalizedBase.network || normalizedAdditional.network\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tenabled:\n\t\t\t\t\t\t\t\tnormalizedBase.network?.enabled === true ||\n\t\t\t\t\t\t\t\tnormalizedAdditional.network?.enabled === true,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t},\n\t\t{ cwd },\n\t);\n}\n\nexport function intersectPermissionProfiles(\n\trequested: PermissionProfile,\n\tgranted: PermissionProfile,\n\toptions: IntersectPermissionProfileOptions = {},\n): PermissionProfile {\n\tconst cwd = options.cwd ?? PROFILE_DEFAULT_CWD;\n\tconst normalizedRequested = normalizePermissionProfile(requested, { cwd });\n\tconst normalizedGranted = normalizePermissionProfile(granted, { cwd });\n\tconst acceptedEntries: FileSystemPermissionEntry[] = [];\n\n\tfor (const grantedEntry of normalizedGranted.fileSystem?.entries ?? []) {\n\t\tif (grantedEntry.access === \"none\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst grantedPath = materializePath(grantedEntry.path, cwd);\n\t\tif (!grantedPath) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const requestedEntry of normalizedRequested.fileSystem?.entries ??\n\t\t\t[]) {\n\t\t\tif (requestedEntry.access === \"none\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst requestedPath = materializePath(requestedEntry.path, cwd);\n\t\t\tif (!requestedPath) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst intersection = intersectConcretePathEntries(\n\t\t\t\trequestedEntry,\n\t\t\t\trequestedPath,\n\t\t\t\tgrantedEntry,\n\t\t\t\tgrantedPath,\n\t\t\t);\n\t\t\tif (intersection) {\n\t\t\t\tacceptedEntries.push(intersection);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst deniedEntries = [\n\t\t...denyEntries(normalizedRequested),\n\t\t...denyEntries(normalizedGranted),\n\t];\n\n\treturn normalizePermissionProfile(\n\t\t{\n\t\t\tfileSystem: {\n\t\t\t\tentries: coalesceToMostRestrictiveEntries(\n\t\t\t\t\t[...acceptedEntries, ...deniedEntries],\n\t\t\t\t\tcwd,\n\t\t\t\t),\n\t\t\t\tglobScanMaxDepth: maxGlobScanDepth(\n\t\t\t\t\tnormalizedRequested.fileSystem?.globScanMaxDepth,\n\t\t\t\t\tnormalizedGranted.fileSystem?.globScanMaxDepth,\n\t\t\t\t),\n\t\t\t},\n\t\t\tnetwork:\n\t\t\t\tnormalizedRequested.network || normalizedGranted.network\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tenabled:\n\t\t\t\t\t\t\t\tnormalizedRequested.network?.enabled === true &&\n\t\t\t\t\t\t\t\tnormalizedGranted.network?.enabled === true,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t},\n\t\t{ cwd },\n\t);\n}\n\nexport function permissionProfileFromNativeSandboxPolicy(\n\tpolicy: NativeSandboxPolicy,\n\tcwd: string = PROFILE_DEFAULT_CWD,\n): PermissionProfile {\n\tif (policy.mode === \"danger-full-access\") {\n\t\treturn normalizePermissionProfile(\n\t\t\t{\n\t\t\t\tfileSystem: {\n\t\t\t\t\tentries: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: { kind: \"special\", value: \"full-disk\" },\n\t\t\t\t\t\t\taccess: \"read-write\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tnetwork: { enabled: policy.networkAccess !== false },\n\t\t\t},\n\t\t\t{ cwd },\n\t\t);\n\t}\n\n\tconst entries: FileSystemPermissionEntry[] = [];\n\tif (policy.mode === \"read-only\") {\n\t\tentries.push({\n\t\t\tpath: { kind: \"special\", value: \"full-disk\" },\n\t\t\taccess: \"read-only\",\n\t\t});\n\t} else if (policy.mode === \"workspace-write\") {\n\t\tentries.push({\n\t\t\tpath: { kind: \"special\", value: \"workspace\" },\n\t\t\taccess: \"read-write\",\n\t\t});\n\n\t\tfor (const root of policy.writableRoots ?? []) {\n\t\t\tentries.push({\n\t\t\t\tpath: { kind: \"path\", path: root },\n\t\t\t\taccess: \"read-write\",\n\t\t\t});\n\t\t}\n\n\t\tif (!policy.excludeSlashTmp) {\n\t\t\tentries.push({\n\t\t\t\tpath: { kind: \"special\", value: \"tmp\" },\n\t\t\t\taccess: \"read-write\",\n\t\t\t});\n\t\t}\n\n\t\tif (!policy.excludeTmpdir) {\n\t\t\tentries.push({\n\t\t\t\tpath: { kind: \"special\", value: \"tmpdir\" },\n\t\t\t\taccess: \"read-write\",\n\t\t\t});\n\t\t}\n\t}\n\n\treturn normalizePermissionProfile(\n\t\t{\n\t\t\t...(entries.length > 0 ? { fileSystem: { entries } } : {}),\n\t\t\tnetwork: { enabled: policy.networkAccess === true },\n\t\t},\n\t\t{ cwd },\n\t);\n}\n\nexport function nativeSandboxPolicyFromPermissionProfile(\n\tprofile: PermissionProfile,\n\tcwd: string = PROFILE_DEFAULT_CWD,\n): NativeSandboxPolicy {\n\tconst normalized = normalizePermissionProfile(profile, { cwd });\n\n\tif (denyEntries(normalized).length > 0) {\n\t\tthrow new Error(\n\t\t\t\"Cannot convert permission profile with deny rules to native sandbox policy without widening permissions\",\n\t\t);\n\t}\n\n\tif (profileHasFullDiskWrite(normalized, cwd)) {\n\t\treturn {\n\t\t\tmode: \"danger-full-access\",\n\t\t\tnetworkAccess: normalized.network?.enabled === true,\n\t\t};\n\t}\n\n\tconst writeEntries = readWriteEntries(normalized);\n\tif (writeEntries.length === 0) {\n\t\tconst readOnlyEntries = (normalized.fileSystem?.entries ?? []).filter(\n\t\t\t(entry) => entry.access === \"read-only\",\n\t\t);\n\t\tconst hasFullDiskRead = readOnlyEntries.some((entry) =>\n\t\t\tentryGrantsFullDisk(entry, cwd),\n\t\t);\n\t\tconst hasScopedReadOnly = readOnlyEntries.some(\n\t\t\t(entry) => !entryGrantsFullDisk(entry, cwd),\n\t\t);\n\t\tif (hasScopedReadOnly && !hasFullDiskRead) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot convert scoped read-only permission profile to native read-only policy without widening read permissions\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tmode: \"read-only\",\n\t\t\tnetworkAccess: normalized.network?.enabled === true,\n\t\t};\n\t}\n\n\tconst writableRoots: string[] = [];\n\tlet includesWorkspace = false;\n\tlet includesSlashTmp = false;\n\tlet includesTmpdir = false;\n\n\tfor (const entry of writeEntries) {\n\t\tif (entry.path.kind === \"special\") {\n\t\t\tswitch (entry.path.value) {\n\t\t\t\tcase \"workspace\":\n\t\t\t\t\tincludesWorkspace = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tmp\":\n\t\t\t\t\tincludesSlashTmp = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tmpdir\":\n\t\t\t\t\tincludesTmpdir = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"full-disk\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.path.kind === \"path\") {\n\t\t\tif (isPathWithin(cwd, entry.path.path)) {\n\t\t\t\tincludesWorkspace = true;\n\t\t\t\tif (!isPathWithin(entry.path.path, cwd)) {\n\t\t\t\t\twritableRoots.push(entry.path.path);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twritableRoots.push(entry.path.path);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!includesWorkspace) {\n\t\tthrow new Error(\n\t\t\t\"Cannot convert permission profile to native workspace-write policy without granting workspace write\",\n\t\t);\n\t}\n\n\treturn {\n\t\tmode: \"workspace-write\",\n\t\t...(writableRoots.length > 0 ? { writableRoots } : {}),\n\t\tnetworkAccess: normalized.network?.enabled === true,\n\t\texcludeSlashTmp: !includesSlashTmp,\n\t\texcludeTmpdir: !includesTmpdir,\n\t};\n}\n\nexport interface NativeSandboxPolicyInput {\n\tmode: NativeSandboxMode;\n\twritableRoots?: string[];\n\tnetworkAccess?: boolean;\n\texcludeTmpdir?: boolean;\n\texcludeSlashTmp?: boolean;\n}\n\nexport function buildNativeSandboxPolicy(\n\tinput: NativeSandboxPolicyInput,\n\tcwd: string = PROFILE_DEFAULT_CWD,\n): NativeSandboxPolicy {\n\treturn nativeSandboxPolicyFromPermissionProfile(\n\t\tpermissionProfileFromNativeSandboxPolicy(\n\t\t\t{\n\t\t\t\tmode: input.mode,\n\t\t\t\twritableRoots: input.writableRoots,\n\t\t\t\tnetworkAccess: input.networkAccess,\n\t\t\t\texcludeTmpdir: input.excludeTmpdir,\n\t\t\t\texcludeSlashTmp: input.excludeSlashTmp,\n\t\t\t},\n\t\t\tcwd,\n\t\t),\n\t\tcwd,\n\t);\n}\n"]}
@@ -72,6 +72,10 @@ export interface PreExecutionResult {
72
72
  firewallResult?: ContextFirewallResult;
73
73
  };
74
74
  }
75
+ export interface PreExecutionOptions {
76
+ /** Skip only loop detection for a transport-managed duplicate; firewall and sequence checks still run. */
77
+ skipLoopDetection?: boolean;
78
+ }
75
79
  /**
76
80
  * Configuration for SafetyMiddleware
77
81
  */
@@ -106,7 +110,7 @@ export declare class SafetyMiddleware {
106
110
  * Call this before executing a tool. Returns whether execution should proceed
107
111
  * and provides sanitized arguments for logging.
108
112
  */
109
- preExecution(toolName: string, args: Record<string, unknown>): PreExecutionResult;
113
+ preExecution(toolName: string, args: Record<string, unknown>, options?: PreExecutionOptions): PreExecutionResult;
110
114
  /**
111
115
  * Record tool execution outcome
112
116
  *
@@ -1 +1 @@
1
- {"version":3,"file":"safety-middleware.d.ts","sourceRoot":"","sources":["../../src/safety/safety-middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safety-middleware.d.ts","sourceRoot":"","sources":["../../src/safety/safety-middleware.ts"],"names":[],"mappings":"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"}
@@ -93,7 +93,7 @@ export class SafetyMiddleware {
93
93
  * Call this before executing a tool. Returns whether execution should proceed
94
94
  * and provides sanitized arguments for logging.
95
95
  */
96
- preExecution(toolName, args) {
96
+ preExecution(toolName, args, options) {
97
97
  const details = {};
98
98
  // 1. Context Firewall - sanitize and check for high-severity content
99
99
  let sanitizedArgs = args;
@@ -137,7 +137,8 @@ export class SafetyMiddleware {
137
137
  }
138
138
  }
139
139
  // 2. Loop Detection - check for repetitive patterns
140
- if (this.config.enableLoopDetection) {
140
+ if (this.config.enableLoopDetection &&
141
+ options?.skipLoopDetection !== true) {
141
142
  const loopResult = this.loopDetector.check(toolName, args);
142
143
  details.loopResult = loopResult;
143
144
  if (loopResult.detected) {
@@ -1 +1 @@
1
- {"version":3,"file":"safety-middleware.js","sourceRoot":"","sources":["../../src/safety/safety-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Safety Middleware - Unified Security Layer for Tool Execution\n *\n * This module consolidates all security checks into a single middleware layer\n * that integrates with the agent transport. It provides:\n *\n * 1. **Loop Detection**: Enhanced pattern detection (exact, similar, cyclic, frequency)\n * 2. **Sequence Analysis**: Behavioral threat detection (exfiltration, reconnaissance, etc.)\n * 3. **Context Firewall**: Argument sanitization before logging/storage\n *\n * ## Integration Points\n *\n * ```\n * Tool Call → preExecution() → [Firewall] → [Execute] → postExecution()\n * ↓ ↓\n * Loop check Record outcome\n * Sequence check Update state\n * Sanitize args\n * ```\n *\n * ## Usage\n *\n * ```typescript\n * const middleware = new SafetyMiddleware();\n *\n * // Before execution\n * const check = middleware.preExecution(toolName, args);\n * if (check.blocked) {\n * // Handle block/approval requirement\n * }\n *\n * // After execution\n * middleware.postExecution(toolName, args, success);\n *\n * // For audit logging\n * const sanitized = middleware.sanitizeForLogging(args);\n * ```\n *\n * @module safety/safety-middleware\n */\n\nimport {\n\ttrackContextFirewall,\n\ttrackLoopDetection,\n\ttrackSequencePattern,\n\ttrackToolApprovalRequired,\n\ttrackToolBlocked,\n} from \"../telemetry/security-events.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\ttype ContextFirewallOptions,\n\ttype ContextFirewallResult,\n\tDEFAULT_BLOCKING_CONFIG,\n\tcheckContextFirewall,\n\tsanitizePayload,\n\tvaultCredentialsInPayload,\n} from \"./context-firewall.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport {\n\ttype LoopDetectionResult,\n\tLoopDetector,\n\ttype LoopDetectorConfig,\n} from \"./loop-detector.js\";\nimport {\n\ttype SequenceAnalysisResult,\n\tToolSequenceAnalyzer,\n} from \"./tool-sequence-analyzer.js\";\n\n/**\n * Configuration for ToolSequenceAnalyzer\n */\ninterface ToolSequenceAnalyzerConfig {\n\tmaxRecords?: number;\n\tmaxAgeMs?: number;\n}\n\nconst logger = createLogger(\"safety:middleware\");\n\n/**\n * Result of pre-execution safety check\n */\nexport interface PreExecutionResult {\n\t/** Whether tool execution should proceed */\n\tallowed: boolean;\n\t/** Whether user approval is required */\n\trequiresApproval: boolean;\n\t/** Reason for block or approval requirement */\n\treason?: string;\n\t/** Suggestion for resolving the issue */\n\tsuggestion?: string;\n\t/** Which check triggered (loop, sequence, firewall) */\n\ttriggeredBy?: \"loop\" | \"sequence\" | \"firewall\";\n\t/** Sanitized arguments safe for logging */\n\tsanitizedArgs: Record<string, unknown>;\n\t/** Detection details */\n\tdetails?: {\n\t\tloopResult?: LoopDetectionResult;\n\t\tsequenceResult?: SequenceAnalysisResult;\n\t\tfirewallResult?: ContextFirewallResult;\n\t};\n}\n\n/**\n * Configuration for SafetyMiddleware\n */\nexport interface SafetyMiddlewareConfig {\n\t/** Loop detector configuration */\n\tloopDetector?: LoopDetectorConfig;\n\t/** Sequence analyzer configuration */\n\tsequenceAnalyzer?: ToolSequenceAnalyzerConfig;\n\t/** Context firewall options including blocking configuration */\n\tcontextFirewall?: ContextFirewallOptions;\n\t/** Whether to enable loop detection (default: true) */\n\tenableLoopDetection?: boolean;\n\t/** Whether to enable sequence analysis (default: true) */\n\tenableSequenceAnalysis?: boolean;\n\t/** Whether to enable context firewall (default: true) */\n\tenableContextFirewall?: boolean;\n}\n\n/**\n * Safety Middleware class\n *\n * Provides a unified interface for all security checks in the tool execution pipeline.\n */\nexport class SafetyMiddleware {\n\tprivate loopDetector: LoopDetector;\n\tprivate sequenceAnalyzer: ToolSequenceAnalyzer;\n\tprivate credentialStore: CredentialStore;\n\tprivate config: Required<\n\t\tOmit<\n\t\t\tSafetyMiddlewareConfig,\n\t\t\t\"loopDetector\" | \"sequenceAnalyzer\" | \"contextFirewall\"\n\t\t>\n\t> & {\n\t\tcontextFirewall: ContextFirewallOptions;\n\t};\n\n\tconstructor(config?: SafetyMiddlewareConfig) {\n\t\tthis.credentialStore = new CredentialStore();\n\t\tthis.loopDetector = new LoopDetector({\n\t\t\t// Default: more lenient than standalone for integration\n\t\t\tmaxIdenticalCalls: config?.loopDetector?.maxIdenticalCalls ?? 5,\n\t\t\tmaxSimilarCalls: config?.loopDetector?.maxSimilarCalls ?? 10,\n\t\t\tmaxCallsPerMinute: config?.loopDetector?.maxCallsPerMinute ?? 120,\n\t\t\tautoPause: config?.loopDetector?.autoPause ?? false, // Don't auto-pause, let transport handle\n\t\t\t...config?.loopDetector,\n\t\t});\n\n\t\tthis.sequenceAnalyzer = new ToolSequenceAnalyzer({\n\t\t\tmaxRecords: config?.sequenceAnalyzer?.maxRecords ?? 100,\n\t\t\tmaxAgeMs: config?.sequenceAnalyzer?.maxAgeMs ?? 300000, // 5 minutes\n\t\t\t...config?.sequenceAnalyzer,\n\t\t});\n\n\t\tthis.config = {\n\t\t\tenableLoopDetection: config?.enableLoopDetection ?? true,\n\t\t\tenableSequenceAnalysis: config?.enableSequenceAnalysis ?? true,\n\t\t\tenableContextFirewall: config?.enableContextFirewall ?? true,\n\t\t\tcontextFirewall: {\n\t\t\t\tredactSecrets: true,\n\t\t\t\tmaxStringLength: 1000,\n\t\t\t\tremoveControlChars: true,\n\t\t\t\ttruncateLargeBlobs: true,\n\t\t\t\t...config?.contextFirewall,\n\t\t\t\t// Enable credential vaulting - stores credentials securely and replaces with refs\n\t\t\t\tvaultCredentials: config?.contextFirewall?.vaultCredentials ?? false,\n\t\t\t\tcredentialStore: this.credentialStore,\n\t\t\t\t// Enable blocking by default with sensible thresholds\n\t\t\t\tblocking: {\n\t\t\t\t\t...DEFAULT_BLOCKING_CONFIG,\n\t\t\t\t\t...config?.contextFirewall?.blocking,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Run all pre-execution safety checks\n\t *\n\t * Call this before executing a tool. Returns whether execution should proceed\n\t * and provides sanitized arguments for logging.\n\t */\n\tpreExecution(\n\t\ttoolName: string,\n\t\targs: Record<string, unknown>,\n\t): PreExecutionResult {\n\t\tconst details: PreExecutionResult[\"details\"] = {};\n\n\t\t// 1. Context Firewall - sanitize and check for high-severity content\n\t\tlet sanitizedArgs = args;\n\t\tif (this.config.enableContextFirewall) {\n\t\t\tconst firewallResult = checkContextFirewall(\n\t\t\t\targs,\n\t\t\t\tthis.config.contextFirewall,\n\t\t\t);\n\t\t\tdetails.firewallResult = firewallResult;\n\t\t\tsanitizedArgs = firewallResult.sanitizedPayload as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\t// Track findings even when not blocking\n\t\t\tif (firewallResult.findings.length > 0) {\n\t\t\t\ttrackContextFirewall({\n\t\t\t\t\tfindingTypes: [\n\t\t\t\t\t\t...new Set(firewallResult.findings.map((f) => f.type)),\n\t\t\t\t\t],\n\t\t\t\t\tfindingCount: firewallResult.findings.length,\n\t\t\t\t\tblocked: firewallResult.blocked ?? false,\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (firewallResult.blocked) {\n\t\t\t\tlogger.warn(\"Context firewall blocked tool execution\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t\tfindingsCount: firewallResult.findings.length,\n\t\t\t\t});\n\n\t\t\t\ttrackToolBlocked({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason ?? \"Sensitive content detected\",\n\t\t\t\t\tsource: \"firewall\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: false,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t\tsuggestion: \"Remove sensitive content from tool arguments\",\n\t\t\t\t\ttriggeredBy: \"firewall\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// 2. Loop Detection - check for repetitive patterns\n\t\tif (this.config.enableLoopDetection) {\n\t\t\tconst loopResult = this.loopDetector.check(toolName, args);\n\t\t\tdetails.loopResult = loopResult;\n\n\t\t\tif (loopResult.detected) {\n\t\t\t\tlogger.info(\"Loop pattern detected\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\ttype: loopResult.type,\n\t\t\t\t\trepetitions: loopResult.repetitions,\n\t\t\t\t});\n\n\t\t\t\ttrackLoopDetection({\n\t\t\t\t\tloopType: loopResult.type ?? \"exact\",\n\t\t\t\t\trepetitions: loopResult.repetitions ?? 0,\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: loopResult.action ?? \"warn\",\n\t\t\t\t\treason: loopResult.reason,\n\t\t\t\t});\n\n\t\t\t\tif (loopResult.action === \"pause\" || loopResult.action === \"halt\") {\n\t\t\t\t\ttrackToolBlocked({\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\treason: loopResult.reason ?? \"Loop detected\",\n\t\t\t\t\t\tsource: \"loop\",\n\t\t\t\t\t\tseverity: loopResult.action === \"halt\" ? \"high\" : \"medium\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\trequiresApproval: loopResult.action === \"pause\",\n\t\t\t\t\t\treason: loopResult.reason,\n\t\t\t\t\t\tsuggestion: loopResult.suggestion,\n\t\t\t\t\t\ttriggeredBy: \"loop\",\n\t\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\t\tdetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// For \"warn\" action, log but continue\n\t\t\t}\n\t\t}\n\n\t\t// 3. Sequence Analysis - check for suspicious behavioral patterns\n\t\tif (this.config.enableSequenceAnalysis) {\n\t\t\tconst sequenceResult = this.sequenceAnalyzer.checkTool(toolName, args);\n\t\t\tdetails.sequenceResult = sequenceResult;\n\n\t\t\tif (sequenceResult.action === \"require_approval\") {\n\t\t\t\tlogger.warn(\"Suspicious tool sequence detected\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\tpatternId: sequenceResult.patternId,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackSequencePattern({\n\t\t\t\t\tpatternId: sequenceResult.patternId ?? \"unknown\",\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: \"require_approval\",\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackToolApprovalRequired({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: sequenceResult.reason ?? \"Suspicious sequence detected\",\n\t\t\t\t\tsource: \"sequence\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: true,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t\ttriggeredBy: \"sequence\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (sequenceResult.action === \"block\") {\n\t\t\t\ttrackSequencePattern({\n\t\t\t\t\tpatternId: sequenceResult.patternId ?? \"unknown\",\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: \"block\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackToolBlocked({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: sequenceResult.reason ?? \"Blocked by sequence analysis\",\n\t\t\t\t\tsource: \"sequence\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: false,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t\ttriggeredBy: \"sequence\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tallowed: true,\n\t\t\trequiresApproval: false,\n\t\t\tsanitizedArgs,\n\t\t\tdetails,\n\t\t};\n\t}\n\n\t/**\n\t * Record tool execution outcome\n\t *\n\t * Call this after tool execution completes (success or failure).\n\t * Updates internal state for pattern detection.\n\t */\n\tpostExecution(\n\t\ttoolName: string,\n\t\targs: Record<string, unknown>,\n\t\tsuccess: boolean,\n\t\tapproved = true,\n\t): void {\n\t\t// Record in loop detector\n\t\tif (this.config.enableLoopDetection) {\n\t\t\tthis.loopDetector.record(toolName, args);\n\t\t}\n\n\t\t// Record in sequence analyzer\n\t\tif (this.config.enableSequenceAnalysis) {\n\t\t\tthis.sequenceAnalyzer.recordTool(toolName, args, approved, success);\n\t\t}\n\t}\n\n\t/**\n\t * Sanitize arguments for logging/storage\n\t *\n\t * Use this to get a safe version of tool arguments for audit logs.\n\t */\n\tsanitizeForLogging(args: Record<string, unknown>): Record<string, unknown> {\n\t\tif (!this.config.enableContextFirewall) {\n\t\t\treturn args;\n\t\t}\n\t\treturn sanitizePayload(args, this.config.contextFirewall) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t}\n\n\t/**\n\t * Prepare arguments for execution when credential vaulting is enabled.\n\t *\n\t * Replaces detected credentials with vault references without mutating\n\t * other argument content.\n\t */\n\tprepareExecutionArgs<T>(args: T): T {\n\t\tif (\n\t\t\t!this.config.enableContextFirewall ||\n\t\t\t!this.config.contextFirewall.vaultCredentials\n\t\t) {\n\t\t\treturn args;\n\t\t}\n\n\t\treturn vaultCredentialsInPayload(args, this.credentialStore) as T;\n\t}\n\n\t/**\n\t * Resume from paused state (loop detection)\n\t */\n\tresumeLoopDetection(): void {\n\t\tthis.loopDetector.resume();\n\t}\n\n\t/**\n\t * Check if loop detector is paused\n\t */\n\tisLoopDetectorPaused(): boolean {\n\t\treturn this.loopDetector.isPausedState();\n\t}\n\n\t/**\n\t * Get loop detector pause reason\n\t */\n\tgetLoopPauseReason(): string | undefined {\n\t\treturn this.loopDetector.getPauseReason();\n\t}\n\n\t/**\n\t * Reset all internal state\n\t */\n\treset(): void {\n\t\tthis.loopDetector.reset();\n\t\tthis.sequenceAnalyzer.clear();\n\t\tthis.clearCredentials();\n\t}\n\n\t/**\n\t * Get statistics about safety checks\n\t */\n\tgetStats(): {\n\t\tloopDetector: ReturnType<LoopDetector[\"getStats\"]>;\n\t\tsequenceAnalyzer: ReturnType<ToolSequenceAnalyzer[\"getSummary\"]>;\n\t} {\n\t\treturn {\n\t\t\tloopDetector: this.loopDetector.getStats(),\n\t\t\tsequenceAnalyzer: this.sequenceAnalyzer.getSummary(),\n\t\t};\n\t}\n\n\t/**\n\t * Resolve credential references in tool arguments before execution\n\t *\n\t * When vaultCredentials is enabled, credentials detected during sanitization\n\t * are stored securely and replaced with references like `{{CRED:api_key:abc123}}`.\n\t * This method resolves those references back to their original values so tools\n\t * can actually use the credentials.\n\t *\n\t * @param args - Tool arguments that may contain credential references\n\t * @returns New object with credential references resolved to actual values\n\t */\n\tresolveCredentials<T>(args: T): T {\n\t\treturn this.credentialStore.resolveInObject(args);\n\t}\n\n\t/**\n\t * Get credential store statistics (for diagnostics)\n\t */\n\tgetCredentialStats(): ReturnType<CredentialStore[\"getStats\"]> {\n\t\treturn this.credentialStore.getStats();\n\t}\n\n\t/**\n\t * Clear stored credentials (for session reset)\n\t */\n\tclearCredentials(): void {\n\t\tthis.credentialStore.clear();\n\t}\n}\n\n/**\n * Default safety middleware instance\n */\nexport const defaultSafetyMiddleware = new SafetyMiddleware();\n\n/**\n * Create a safety middleware with custom configuration\n */\nexport function createSafetyMiddleware(\n\tconfig?: SafetyMiddlewareConfig,\n): SafetyMiddleware {\n\treturn new SafetyMiddleware(config);\n}\n"]}
1
+ {"version":3,"file":"safety-middleware.js","sourceRoot":"","sources":["../../src/safety/safety-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Safety Middleware - Unified Security Layer for Tool Execution\n *\n * This module consolidates all security checks into a single middleware layer\n * that integrates with the agent transport. It provides:\n *\n * 1. **Loop Detection**: Enhanced pattern detection (exact, similar, cyclic, frequency)\n * 2. **Sequence Analysis**: Behavioral threat detection (exfiltration, reconnaissance, etc.)\n * 3. **Context Firewall**: Argument sanitization before logging/storage\n *\n * ## Integration Points\n *\n * ```\n * Tool Call → preExecution() → [Firewall] → [Execute] → postExecution()\n * ↓ ↓\n * Loop check Record outcome\n * Sequence check Update state\n * Sanitize args\n * ```\n *\n * ## Usage\n *\n * ```typescript\n * const middleware = new SafetyMiddleware();\n *\n * // Before execution\n * const check = middleware.preExecution(toolName, args);\n * if (check.blocked) {\n * // Handle block/approval requirement\n * }\n *\n * // After execution\n * middleware.postExecution(toolName, args, success);\n *\n * // For audit logging\n * const sanitized = middleware.sanitizeForLogging(args);\n * ```\n *\n * @module safety/safety-middleware\n */\n\nimport {\n\ttrackContextFirewall,\n\ttrackLoopDetection,\n\ttrackSequencePattern,\n\ttrackToolApprovalRequired,\n\ttrackToolBlocked,\n} from \"../telemetry/security-events.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\ttype ContextFirewallOptions,\n\ttype ContextFirewallResult,\n\tDEFAULT_BLOCKING_CONFIG,\n\tcheckContextFirewall,\n\tsanitizePayload,\n\tvaultCredentialsInPayload,\n} from \"./context-firewall.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport {\n\ttype LoopDetectionResult,\n\tLoopDetector,\n\ttype LoopDetectorConfig,\n} from \"./loop-detector.js\";\nimport {\n\ttype SequenceAnalysisResult,\n\tToolSequenceAnalyzer,\n} from \"./tool-sequence-analyzer.js\";\n\n/**\n * Configuration for ToolSequenceAnalyzer\n */\ninterface ToolSequenceAnalyzerConfig {\n\tmaxRecords?: number;\n\tmaxAgeMs?: number;\n}\n\nconst logger = createLogger(\"safety:middleware\");\n\n/**\n * Result of pre-execution safety check\n */\nexport interface PreExecutionResult {\n\t/** Whether tool execution should proceed */\n\tallowed: boolean;\n\t/** Whether user approval is required */\n\trequiresApproval: boolean;\n\t/** Reason for block or approval requirement */\n\treason?: string;\n\t/** Suggestion for resolving the issue */\n\tsuggestion?: string;\n\t/** Which check triggered (loop, sequence, firewall) */\n\ttriggeredBy?: \"loop\" | \"sequence\" | \"firewall\";\n\t/** Sanitized arguments safe for logging */\n\tsanitizedArgs: Record<string, unknown>;\n\t/** Detection details */\n\tdetails?: {\n\t\tloopResult?: LoopDetectionResult;\n\t\tsequenceResult?: SequenceAnalysisResult;\n\t\tfirewallResult?: ContextFirewallResult;\n\t};\n}\n\nexport interface PreExecutionOptions {\n\t/** Skip only loop detection for a transport-managed duplicate; firewall and sequence checks still run. */\n\tskipLoopDetection?: boolean;\n}\n\n/**\n * Configuration for SafetyMiddleware\n */\nexport interface SafetyMiddlewareConfig {\n\t/** Loop detector configuration */\n\tloopDetector?: LoopDetectorConfig;\n\t/** Sequence analyzer configuration */\n\tsequenceAnalyzer?: ToolSequenceAnalyzerConfig;\n\t/** Context firewall options including blocking configuration */\n\tcontextFirewall?: ContextFirewallOptions;\n\t/** Whether to enable loop detection (default: true) */\n\tenableLoopDetection?: boolean;\n\t/** Whether to enable sequence analysis (default: true) */\n\tenableSequenceAnalysis?: boolean;\n\t/** Whether to enable context firewall (default: true) */\n\tenableContextFirewall?: boolean;\n}\n\n/**\n * Safety Middleware class\n *\n * Provides a unified interface for all security checks in the tool execution pipeline.\n */\nexport class SafetyMiddleware {\n\tprivate loopDetector: LoopDetector;\n\tprivate sequenceAnalyzer: ToolSequenceAnalyzer;\n\tprivate credentialStore: CredentialStore;\n\tprivate config: Required<\n\t\tOmit<\n\t\t\tSafetyMiddlewareConfig,\n\t\t\t\"loopDetector\" | \"sequenceAnalyzer\" | \"contextFirewall\"\n\t\t>\n\t> & {\n\t\tcontextFirewall: ContextFirewallOptions;\n\t};\n\n\tconstructor(config?: SafetyMiddlewareConfig) {\n\t\tthis.credentialStore = new CredentialStore();\n\t\tthis.loopDetector = new LoopDetector({\n\t\t\t// Default: more lenient than standalone for integration\n\t\t\tmaxIdenticalCalls: config?.loopDetector?.maxIdenticalCalls ?? 5,\n\t\t\tmaxSimilarCalls: config?.loopDetector?.maxSimilarCalls ?? 10,\n\t\t\tmaxCallsPerMinute: config?.loopDetector?.maxCallsPerMinute ?? 120,\n\t\t\tautoPause: config?.loopDetector?.autoPause ?? false, // Don't auto-pause, let transport handle\n\t\t\t...config?.loopDetector,\n\t\t});\n\n\t\tthis.sequenceAnalyzer = new ToolSequenceAnalyzer({\n\t\t\tmaxRecords: config?.sequenceAnalyzer?.maxRecords ?? 100,\n\t\t\tmaxAgeMs: config?.sequenceAnalyzer?.maxAgeMs ?? 300000, // 5 minutes\n\t\t\t...config?.sequenceAnalyzer,\n\t\t});\n\n\t\tthis.config = {\n\t\t\tenableLoopDetection: config?.enableLoopDetection ?? true,\n\t\t\tenableSequenceAnalysis: config?.enableSequenceAnalysis ?? true,\n\t\t\tenableContextFirewall: config?.enableContextFirewall ?? true,\n\t\t\tcontextFirewall: {\n\t\t\t\tredactSecrets: true,\n\t\t\t\tmaxStringLength: 1000,\n\t\t\t\tremoveControlChars: true,\n\t\t\t\ttruncateLargeBlobs: true,\n\t\t\t\t...config?.contextFirewall,\n\t\t\t\t// Enable credential vaulting - stores credentials securely and replaces with refs\n\t\t\t\tvaultCredentials: config?.contextFirewall?.vaultCredentials ?? false,\n\t\t\t\tcredentialStore: this.credentialStore,\n\t\t\t\t// Enable blocking by default with sensible thresholds\n\t\t\t\tblocking: {\n\t\t\t\t\t...DEFAULT_BLOCKING_CONFIG,\n\t\t\t\t\t...config?.contextFirewall?.blocking,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Run all pre-execution safety checks\n\t *\n\t * Call this before executing a tool. Returns whether execution should proceed\n\t * and provides sanitized arguments for logging.\n\t */\n\tpreExecution(\n\t\ttoolName: string,\n\t\targs: Record<string, unknown>,\n\t\toptions?: PreExecutionOptions,\n\t): PreExecutionResult {\n\t\tconst details: PreExecutionResult[\"details\"] = {};\n\n\t\t// 1. Context Firewall - sanitize and check for high-severity content\n\t\tlet sanitizedArgs = args;\n\t\tif (this.config.enableContextFirewall) {\n\t\t\tconst firewallResult = checkContextFirewall(\n\t\t\t\targs,\n\t\t\t\tthis.config.contextFirewall,\n\t\t\t);\n\t\t\tdetails.firewallResult = firewallResult;\n\t\t\tsanitizedArgs = firewallResult.sanitizedPayload as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\t// Track findings even when not blocking\n\t\t\tif (firewallResult.findings.length > 0) {\n\t\t\t\ttrackContextFirewall({\n\t\t\t\t\tfindingTypes: [\n\t\t\t\t\t\t...new Set(firewallResult.findings.map((f) => f.type)),\n\t\t\t\t\t],\n\t\t\t\t\tfindingCount: firewallResult.findings.length,\n\t\t\t\t\tblocked: firewallResult.blocked ?? false,\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (firewallResult.blocked) {\n\t\t\t\tlogger.warn(\"Context firewall blocked tool execution\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t\tfindingsCount: firewallResult.findings.length,\n\t\t\t\t});\n\n\t\t\t\ttrackToolBlocked({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: firewallResult.blockReason ?? \"Sensitive content detected\",\n\t\t\t\t\tsource: \"firewall\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: false,\n\t\t\t\t\treason: firewallResult.blockReason,\n\t\t\t\t\tsuggestion: \"Remove sensitive content from tool arguments\",\n\t\t\t\t\ttriggeredBy: \"firewall\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// 2. Loop Detection - check for repetitive patterns\n\t\tif (\n\t\t\tthis.config.enableLoopDetection &&\n\t\t\toptions?.skipLoopDetection !== true\n\t\t) {\n\t\t\tconst loopResult = this.loopDetector.check(toolName, args);\n\t\t\tdetails.loopResult = loopResult;\n\n\t\t\tif (loopResult.detected) {\n\t\t\t\tlogger.info(\"Loop pattern detected\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\ttype: loopResult.type,\n\t\t\t\t\trepetitions: loopResult.repetitions,\n\t\t\t\t});\n\n\t\t\t\ttrackLoopDetection({\n\t\t\t\t\tloopType: loopResult.type ?? \"exact\",\n\t\t\t\t\trepetitions: loopResult.repetitions ?? 0,\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: loopResult.action ?? \"warn\",\n\t\t\t\t\treason: loopResult.reason,\n\t\t\t\t});\n\n\t\t\t\tif (loopResult.action === \"pause\" || loopResult.action === \"halt\") {\n\t\t\t\t\ttrackToolBlocked({\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\treason: loopResult.reason ?? \"Loop detected\",\n\t\t\t\t\t\tsource: \"loop\",\n\t\t\t\t\t\tseverity: loopResult.action === \"halt\" ? \"high\" : \"medium\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\trequiresApproval: loopResult.action === \"pause\",\n\t\t\t\t\t\treason: loopResult.reason,\n\t\t\t\t\t\tsuggestion: loopResult.suggestion,\n\t\t\t\t\t\ttriggeredBy: \"loop\",\n\t\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\t\tdetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// For \"warn\" action, log but continue\n\t\t\t}\n\t\t}\n\n\t\t// 3. Sequence Analysis - check for suspicious behavioral patterns\n\t\tif (this.config.enableSequenceAnalysis) {\n\t\t\tconst sequenceResult = this.sequenceAnalyzer.checkTool(toolName, args);\n\t\t\tdetails.sequenceResult = sequenceResult;\n\n\t\t\tif (sequenceResult.action === \"require_approval\") {\n\t\t\t\tlogger.warn(\"Suspicious tool sequence detected\", {\n\t\t\t\t\ttoolName,\n\t\t\t\t\tpatternId: sequenceResult.patternId,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackSequencePattern({\n\t\t\t\t\tpatternId: sequenceResult.patternId ?? \"unknown\",\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: \"require_approval\",\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackToolApprovalRequired({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: sequenceResult.reason ?? \"Suspicious sequence detected\",\n\t\t\t\t\tsource: \"sequence\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: true,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t\ttriggeredBy: \"sequence\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (sequenceResult.action === \"block\") {\n\t\t\t\ttrackSequencePattern({\n\t\t\t\t\tpatternId: sequenceResult.patternId ?? \"unknown\",\n\t\t\t\t\ttoolName,\n\t\t\t\t\taction: \"block\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t});\n\n\t\t\t\ttrackToolBlocked({\n\t\t\t\t\ttoolName,\n\t\t\t\t\treason: sequenceResult.reason ?? \"Blocked by sequence analysis\",\n\t\t\t\t\tsource: \"sequence\",\n\t\t\t\t\tseverity: \"high\",\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: false,\n\t\t\t\t\treason: sequenceResult.reason,\n\t\t\t\t\ttriggeredBy: \"sequence\",\n\t\t\t\t\tsanitizedArgs,\n\t\t\t\t\tdetails,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tallowed: true,\n\t\t\trequiresApproval: false,\n\t\t\tsanitizedArgs,\n\t\t\tdetails,\n\t\t};\n\t}\n\n\t/**\n\t * Record tool execution outcome\n\t *\n\t * Call this after tool execution completes (success or failure).\n\t * Updates internal state for pattern detection.\n\t */\n\tpostExecution(\n\t\ttoolName: string,\n\t\targs: Record<string, unknown>,\n\t\tsuccess: boolean,\n\t\tapproved = true,\n\t): void {\n\t\t// Record in loop detector\n\t\tif (this.config.enableLoopDetection) {\n\t\t\tthis.loopDetector.record(toolName, args);\n\t\t}\n\n\t\t// Record in sequence analyzer\n\t\tif (this.config.enableSequenceAnalysis) {\n\t\t\tthis.sequenceAnalyzer.recordTool(toolName, args, approved, success);\n\t\t}\n\t}\n\n\t/**\n\t * Sanitize arguments for logging/storage\n\t *\n\t * Use this to get a safe version of tool arguments for audit logs.\n\t */\n\tsanitizeForLogging(args: Record<string, unknown>): Record<string, unknown> {\n\t\tif (!this.config.enableContextFirewall) {\n\t\t\treturn args;\n\t\t}\n\t\treturn sanitizePayload(args, this.config.contextFirewall) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t}\n\n\t/**\n\t * Prepare arguments for execution when credential vaulting is enabled.\n\t *\n\t * Replaces detected credentials with vault references without mutating\n\t * other argument content.\n\t */\n\tprepareExecutionArgs<T>(args: T): T {\n\t\tif (\n\t\t\t!this.config.enableContextFirewall ||\n\t\t\t!this.config.contextFirewall.vaultCredentials\n\t\t) {\n\t\t\treturn args;\n\t\t}\n\n\t\treturn vaultCredentialsInPayload(args, this.credentialStore) as T;\n\t}\n\n\t/**\n\t * Resume from paused state (loop detection)\n\t */\n\tresumeLoopDetection(): void {\n\t\tthis.loopDetector.resume();\n\t}\n\n\t/**\n\t * Check if loop detector is paused\n\t */\n\tisLoopDetectorPaused(): boolean {\n\t\treturn this.loopDetector.isPausedState();\n\t}\n\n\t/**\n\t * Get loop detector pause reason\n\t */\n\tgetLoopPauseReason(): string | undefined {\n\t\treturn this.loopDetector.getPauseReason();\n\t}\n\n\t/**\n\t * Reset all internal state\n\t */\n\treset(): void {\n\t\tthis.loopDetector.reset();\n\t\tthis.sequenceAnalyzer.clear();\n\t\tthis.clearCredentials();\n\t}\n\n\t/**\n\t * Get statistics about safety checks\n\t */\n\tgetStats(): {\n\t\tloopDetector: ReturnType<LoopDetector[\"getStats\"]>;\n\t\tsequenceAnalyzer: ReturnType<ToolSequenceAnalyzer[\"getSummary\"]>;\n\t} {\n\t\treturn {\n\t\t\tloopDetector: this.loopDetector.getStats(),\n\t\t\tsequenceAnalyzer: this.sequenceAnalyzer.getSummary(),\n\t\t};\n\t}\n\n\t/**\n\t * Resolve credential references in tool arguments before execution\n\t *\n\t * When vaultCredentials is enabled, credentials detected during sanitization\n\t * are stored securely and replaced with references like `{{CRED:api_key:abc123}}`.\n\t * This method resolves those references back to their original values so tools\n\t * can actually use the credentials.\n\t *\n\t * @param args - Tool arguments that may contain credential references\n\t * @returns New object with credential references resolved to actual values\n\t */\n\tresolveCredentials<T>(args: T): T {\n\t\treturn this.credentialStore.resolveInObject(args);\n\t}\n\n\t/**\n\t * Get credential store statistics (for diagnostics)\n\t */\n\tgetCredentialStats(): ReturnType<CredentialStore[\"getStats\"]> {\n\t\treturn this.credentialStore.getStats();\n\t}\n\n\t/**\n\t * Clear stored credentials (for session reset)\n\t */\n\tclearCredentials(): void {\n\t\tthis.credentialStore.clear();\n\t}\n}\n\n/**\n * Default safety middleware instance\n */\nexport const defaultSafetyMiddleware = new SafetyMiddleware();\n\n/**\n * Create a safety middleware with custom configuration\n */\nexport function createSafetyMiddleware(\n\tconfig?: SafetyMiddlewareConfig,\n): SafetyMiddleware {\n\treturn new SafetyMiddleware(config);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"suspicious-patterns.d.ts","sourceRoot":"","sources":["../../src/safety/suspicious-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAqfhD,CAAC"}
1
+ {"version":3,"file":"suspicious-patterns.d.ts","sourceRoot":"","sources":["../../src/safety/suspicious-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAAe,EA4fhD,CAAC"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @module safety/suspicious-patterns
8
8
  */
9
+ import { parseApplyPatchPaths } from "../tools/apply-patch-parser.js";
9
10
  import { containsSensitivePath, getToolTags } from "./tool-categorization.js";
10
11
  /**
11
12
  * Suspicious sequence patterns
@@ -83,15 +84,19 @@ export const SUSPICIOUS_PATTERNS = [
83
84
  "C:\\Windows",
84
85
  "C:\\Program Files",
85
86
  ];
86
- const targetPath = (currentArgs.path ||
87
- currentArgs.file_path ||
88
- currentArgs.target);
89
- if (targetPath &&
90
- (currentTags.has("write") || currentTags.has("delete")) &&
91
- systemPaths.some((sp) => targetPath.startsWith(sp))) {
87
+ const targetPaths = currentTool.toLowerCase() === "apply_patch" &&
88
+ typeof currentArgs.patch === "string"
89
+ ? parseApplyPatchPaths(currentArgs.patch)
90
+ : [
91
+ (currentArgs.path ||
92
+ currentArgs.file_path ||
93
+ currentArgs.target),
94
+ ].filter((path) => typeof path === "string");
95
+ if ((currentTags.has("write") || currentTags.has("delete")) &&
96
+ targetPaths.some((targetPath) => systemPaths.some((sp) => targetPath.startsWith(sp)))) {
92
97
  return {
93
98
  matched: true,
94
- reason: `Modification of system path detected: ${targetPath}`,
99
+ reason: `Modification of system path detected: ${targetPaths.join(", ")}`,
95
100
  };
96
101
  }
97
102
  return { matched: false };