@evalops/maestro 0.10.8 → 0.10.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1001) hide show
  1. package/README.md +3 -1
  2. package/dist/agent/action-approval.d.ts +6 -0
  3. package/dist/agent/action-approval.d.ts.map +1 -1
  4. package/dist/agent/action-approval.js.map +1 -1
  5. package/dist/agent/agent.d.ts +13 -1
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +368 -1
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/auto-compaction.d.ts +4 -4
  10. package/dist/agent/auto-compaction.d.ts.map +1 -1
  11. package/dist/agent/auto-compaction.js.map +1 -1
  12. package/dist/agent/compaction-cleanup.d.ts +2 -0
  13. package/dist/agent/compaction-cleanup.d.ts.map +1 -1
  14. package/dist/agent/compaction-cleanup.js +17 -2
  15. package/dist/agent/compaction-cleanup.js.map +1 -1
  16. package/dist/agent/compaction.d.ts +3 -1
  17. package/dist/agent/compaction.d.ts.map +1 -1
  18. package/dist/agent/compaction.js +10 -2
  19. package/dist/agent/compaction.js.map +1 -1
  20. package/dist/agent/context-manager.d.ts +4 -0
  21. package/dist/agent/context-manager.d.ts.map +1 -1
  22. package/dist/agent/context-manager.js +8 -0
  23. package/dist/agent/context-manager.js.map +1 -1
  24. package/dist/agent/context-providers.d.ts +2 -0
  25. package/dist/agent/context-providers.d.ts.map +1 -1
  26. package/dist/agent/context-providers.js +3 -2
  27. package/dist/agent/context-providers.js.map +1 -1
  28. package/dist/agent/providers/google-gemini-cli.js +17 -5
  29. package/dist/agent/providers/google.js +174 -144
  30. package/dist/agent/providers/openai-codex-responses.d.ts +4 -0
  31. package/dist/agent/providers/openai-codex-responses.d.ts.map +1 -0
  32. package/dist/agent/providers/openai-codex-responses.js +637 -0
  33. package/dist/agent/providers/openai-codex-responses.js.map +1 -0
  34. package/dist/agent/providers/openai-codex-session.d.ts +18 -0
  35. package/dist/agent/providers/openai-codex-session.d.ts.map +1 -0
  36. package/dist/agent/providers/openai-codex-session.js +53 -0
  37. package/dist/agent/providers/openai-codex-session.js.map +1 -0
  38. package/dist/agent/providers/openai-responses-sdk.d.ts.map +1 -1
  39. package/dist/agent/providers/openai-responses-sdk.js +16 -6
  40. package/dist/agent/providers/openai-responses-sdk.js.map +1 -1
  41. package/dist/agent/providers/openai-shared.d.ts +12 -5
  42. package/dist/agent/providers/openai-shared.d.ts.map +1 -1
  43. package/dist/agent/providers/openai-shared.js +291 -2
  44. package/dist/agent/providers/openai-shared.js.map +1 -1
  45. package/dist/agent/providers/openai.d.ts +1 -1
  46. package/dist/agent/providers/openai.d.ts.map +1 -1
  47. package/dist/agent/providers/openai.js +48 -20
  48. package/dist/agent/providers/openai.js.map +1 -1
  49. package/dist/agent/providers/vertex.js +7 -0
  50. package/dist/agent/tracing.d.ts +16 -5
  51. package/dist/agent/tracing.d.ts.map +1 -1
  52. package/dist/agent/tracing.js +44 -2
  53. package/dist/agent/tracing.js.map +1 -1
  54. package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
  55. package/dist/agent/transport/create-provider-stream.js +9 -0
  56. package/dist/agent/transport/create-provider-stream.js.map +1 -1
  57. package/dist/agent/transport/tool-execution-bridge.d.ts +86 -0
  58. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -0
  59. package/dist/agent/transport/tool-execution-bridge.js +665 -0
  60. package/dist/agent/transport/tool-execution-bridge.js.map +1 -0
  61. package/dist/agent/transport/tool-execution.d.ts +3 -0
  62. package/dist/agent/transport/tool-execution.d.ts.map +1 -1
  63. package/dist/agent/transport/tool-execution.js +16 -1
  64. package/dist/agent/transport/tool-execution.js.map +1 -1
  65. package/dist/agent/transport/tool-safety-pipeline.d.ts +7 -1
  66. package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
  67. package/dist/agent/transport/tool-safety-pipeline.js +207 -40
  68. package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
  69. package/dist/agent/transport/tool-update-queue.d.ts +2 -0
  70. package/dist/agent/transport/tool-update-queue.d.ts.map +1 -1
  71. package/dist/agent/transport/tool-update-queue.js.map +1 -1
  72. package/dist/agent/transport.d.ts +3 -0
  73. package/dist/agent/transport.d.ts.map +1 -1
  74. package/dist/agent/transport.js +96 -16
  75. package/dist/agent/transport.js.map +1 -1
  76. package/dist/agent/types.d.ts +50 -2
  77. package/dist/agent/types.d.ts.map +1 -1
  78. package/dist/agent/types.js.map +1 -1
  79. package/dist/approvals/platform-action-approval.d.ts +32 -0
  80. package/dist/approvals/platform-action-approval.d.ts.map +1 -0
  81. package/dist/approvals/platform-action-approval.js +210 -0
  82. package/dist/approvals/platform-action-approval.js.map +1 -0
  83. package/dist/approvals/service-client.d.ts +56 -0
  84. package/dist/approvals/service-client.d.ts.map +1 -0
  85. package/dist/approvals/service-client.js +316 -0
  86. package/dist/approvals/service-client.js.map +1 -0
  87. package/dist/audit/logger.d.ts +4 -4
  88. package/dist/bootstrap/auth-setup.d.ts +2 -2
  89. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  90. package/dist/bootstrap/auth-setup.js +4 -7
  91. package/dist/bootstrap/auth-setup.js.map +1 -1
  92. package/dist/cli/args.d.ts +2 -0
  93. package/dist/cli/args.d.ts.map +1 -1
  94. package/dist/cli/args.js +28 -0
  95. package/dist/cli/args.js.map +1 -1
  96. package/dist/cli/commands/codex.d.ts +2 -0
  97. package/dist/cli/commands/codex.d.ts.map +1 -0
  98. package/dist/cli/commands/codex.js +65 -0
  99. package/dist/cli/commands/codex.js.map +1 -0
  100. package/dist/cli/commands/config.js +1 -1
  101. package/dist/cli/commands/config.js.map +1 -1
  102. package/dist/cli/commands/evalops.d.ts +2 -0
  103. package/dist/cli/commands/evalops.d.ts.map +1 -0
  104. package/dist/cli/commands/evalops.js +69 -0
  105. package/dist/cli/commands/evalops.js.map +1 -0
  106. package/dist/cli/commands/hosted-runner.d.ts +23 -0
  107. package/dist/cli/commands/hosted-runner.d.ts.map +1 -0
  108. package/dist/cli/commands/hosted-runner.js +241 -0
  109. package/dist/cli/commands/hosted-runner.js.map +1 -0
  110. package/dist/cli/commands/memory.d.ts.map +1 -1
  111. package/dist/cli/commands/memory.js +23 -30
  112. package/dist/cli/commands/memory.js.map +1 -1
  113. package/dist/cli/commands/remote.d.ts +3 -0
  114. package/dist/cli/commands/remote.d.ts.map +1 -0
  115. package/dist/cli/commands/remote.js +631 -0
  116. package/dist/cli/commands/remote.js.map +1 -0
  117. package/dist/cli/commands/stats.d.ts +7 -0
  118. package/dist/cli/commands/stats.d.ts.map +1 -0
  119. package/dist/cli/commands/stats.js +167 -0
  120. package/dist/cli/commands/stats.js.map +1 -0
  121. package/dist/cli/headless-protocol.d.ts +16 -1
  122. package/dist/cli/headless-protocol.d.ts.map +1 -1
  123. package/dist/cli/headless-protocol.js +60 -4
  124. package/dist/cli/headless-protocol.js.map +1 -1
  125. package/dist/cli/headless.d.ts.map +1 -1
  126. package/dist/cli/headless.js +1 -0
  127. package/dist/cli/headless.js.map +1 -1
  128. package/dist/cli/help.d.ts.map +1 -1
  129. package/dist/cli/help.js +36 -1
  130. package/dist/cli/help.js.map +1 -1
  131. package/dist/cli/jsonl-writer.d.ts.map +1 -1
  132. package/dist/cli/jsonl-writer.js +19 -6
  133. package/dist/cli/jsonl-writer.js.map +1 -1
  134. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  135. package/dist/cli-tui/client-tools/client-tool-controller.js +17 -1
  136. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  137. package/dist/cli-tui/commands/access-command.js +1 -1
  138. package/dist/cli-tui/commands/access-command.js.map +1 -1
  139. package/dist/cli-tui/commands/audit-command.js +1 -1
  140. package/dist/cli-tui/commands/audit-command.js.map +1 -1
  141. package/dist/cli-tui/commands/command-catalog.d.ts +29 -0
  142. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -0
  143. package/dist/cli-tui/commands/command-catalog.js +645 -0
  144. package/dist/cli-tui/commands/command-catalog.js.map +1 -0
  145. package/dist/cli-tui/commands/command-registry-adapter.d.ts +12 -0
  146. package/dist/cli-tui/commands/command-registry-adapter.d.ts.map +1 -0
  147. package/dist/cli-tui/commands/command-registry-adapter.js +120 -0
  148. package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -0
  149. package/dist/cli-tui/commands/command-suite-catalog.d.ts +14 -0
  150. package/dist/cli-tui/commands/command-suite-catalog.d.ts.map +1 -0
  151. package/dist/cli-tui/commands/command-suite-catalog.js +147 -0
  152. package/dist/cli-tui/commands/command-suite-catalog.js.map +1 -0
  153. package/dist/cli-tui/commands/{grouped-command-handlers.d.ts → command-suite-handlers.d.ts} +27 -26
  154. package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -0
  155. package/dist/cli-tui/commands/command-suite-handlers.js +110 -0
  156. package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -0
  157. package/dist/cli-tui/commands/hotkeys-command.d.ts +1 -1
  158. package/dist/cli-tui/commands/hotkeys-command.d.ts.map +1 -1
  159. package/dist/cli-tui/commands/hotkeys-command.js +2 -2
  160. package/dist/cli-tui/commands/hotkeys-command.js.map +1 -1
  161. package/dist/cli-tui/commands/limits-command.js +1 -1
  162. package/dist/cli-tui/commands/limits-command.js.map +1 -1
  163. package/dist/cli-tui/commands/pii-command.js +1 -1
  164. package/dist/cli-tui/commands/pii-command.js.map +1 -1
  165. package/dist/cli-tui/commands/registry.d.ts +1 -1
  166. package/dist/cli-tui/commands/registry.d.ts.map +1 -1
  167. package/dist/cli-tui/commands/registry.js +29 -921
  168. package/dist/cli-tui/commands/registry.js.map +1 -1
  169. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.d.ts +2 -1
  170. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -0
  171. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.js +22 -6
  172. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -0
  173. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.d.ts +0 -1
  174. package/dist/cli-tui/commands/subcommands/config-commands.d.ts.map +1 -0
  175. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.js +2 -2
  176. package/dist/cli-tui/commands/subcommands/config-commands.js.map +1 -0
  177. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.d.ts +1 -2
  178. package/dist/cli-tui/commands/subcommands/diag-commands.d.ts.map +1 -0
  179. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.js +5 -7
  180. package/dist/cli-tui/commands/subcommands/diag-commands.js.map +1 -0
  181. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.d.ts +0 -2
  182. package/dist/cli-tui/commands/subcommands/git-commands.d.ts.map +1 -0
  183. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.js +2 -2
  184. package/dist/cli-tui/commands/subcommands/git-commands.js.map +1 -0
  185. package/dist/cli-tui/commands/{grouped → subcommands}/index.d.ts +2 -2
  186. package/dist/cli-tui/commands/subcommands/index.d.ts.map +1 -0
  187. package/dist/cli-tui/commands/{grouped → subcommands}/index.js +2 -2
  188. package/dist/cli-tui/commands/subcommands/index.js.map +1 -0
  189. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.d.ts +0 -1
  190. package/dist/cli-tui/commands/subcommands/safety-commands.d.ts.map +1 -0
  191. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.js +12 -12
  192. package/dist/cli-tui/commands/subcommands/safety-commands.js.map +1 -0
  193. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.d.ts +1 -2
  194. package/dist/cli-tui/commands/subcommands/session-commands.d.ts.map +1 -0
  195. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.js +3 -3
  196. package/dist/cli-tui/commands/subcommands/session-commands.js.map +1 -0
  197. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.d.ts +0 -1
  198. package/dist/cli-tui/commands/subcommands/tools-commands.d.ts.map +1 -0
  199. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.js +2 -2
  200. package/dist/cli-tui/commands/subcommands/tools-commands.js.map +1 -0
  201. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.d.ts +0 -1
  202. package/dist/cli-tui/commands/subcommands/ui-commands.d.ts.map +1 -0
  203. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.js +5 -5
  204. package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -0
  205. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.d.ts +1 -2
  206. package/dist/cli-tui/commands/subcommands/undo-commands.d.ts.map +1 -0
  207. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.js +6 -6
  208. package/dist/cli-tui/commands/subcommands/undo-commands.js.map +1 -0
  209. package/dist/cli-tui/commands/subcommands/usage-commands.d.ts.map +1 -0
  210. package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.js +2 -2
  211. package/dist/cli-tui/commands/subcommands/usage-commands.js.map +1 -0
  212. package/dist/cli-tui/commands/{grouped → subcommands}/utils.d.ts +15 -15
  213. package/dist/cli-tui/commands/subcommands/utils.d.ts.map +1 -0
  214. package/dist/cli-tui/commands/{grouped → subcommands}/utils.js +13 -8
  215. package/dist/cli-tui/commands/subcommands/utils.js.map +1 -0
  216. package/dist/cli-tui/commands/types.d.ts +3 -3
  217. package/dist/cli-tui/commands/types.d.ts.map +1 -1
  218. package/dist/cli-tui/commands/types.js.map +1 -1
  219. package/dist/cli-tui/editor-view.d.ts +1 -1
  220. package/dist/cli-tui/editor-view.d.ts.map +1 -1
  221. package/dist/cli-tui/editor-view.js +1 -1
  222. package/dist/cli-tui/editor-view.js.map +1 -1
  223. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts +4 -0
  224. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  225. package/dist/cli-tui/oauth/oauth-flow-controller.js +76 -5
  226. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  227. package/dist/cli-tui/run/run-controller.d.ts +2 -2
  228. package/dist/cli-tui/run/run-controller.d.ts.map +1 -1
  229. package/dist/cli-tui/run/run-controller.js +3 -2
  230. package/dist/cli-tui/run/run-controller.js.map +1 -1
  231. package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
  232. package/dist/cli-tui/run/run-shell-command.js +11 -3
  233. package/dist/cli-tui/run/run-shell-command.js.map +1 -1
  234. package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
  235. package/dist/cli-tui/run/streaming-shell-command.js +11 -3
  236. package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
  237. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  238. package/dist/cli-tui/selectors/model-selector.js +1 -0
  239. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  240. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts +8 -0
  241. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts.map +1 -1
  242. package/dist/cli-tui/tui-renderer/agent-event-bridge.js +23 -2
  243. package/dist/cli-tui/tui-renderer/agent-event-bridge.js.map +1 -1
  244. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts +3 -3
  245. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
  246. package/dist/cli-tui/tui-renderer/command-registry-options.js +12 -2
  247. package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
  248. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +32 -0
  249. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -0
  250. package/dist/cli-tui/tui-renderer/command-suite-wiring.js +108 -0
  251. package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -0
  252. package/dist/cli-tui/tui-renderer/input-controller.d.ts +2 -2
  253. package/dist/cli-tui/tui-renderer/input-controller.d.ts.map +1 -1
  254. package/dist/cli-tui/tui-renderer/input-controller.js +2 -2
  255. package/dist/cli-tui/tui-renderer/input-controller.js.map +1 -1
  256. package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
  257. package/dist/cli-tui/tui-renderer/ui-state-controller.js +1 -1
  258. package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
  259. package/dist/cli-tui/tui-renderer.d.ts +1 -3
  260. package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
  261. package/dist/cli-tui/tui-renderer.js +37 -83
  262. package/dist/cli-tui/tui-renderer.js.map +1 -1
  263. package/dist/cli-tui/utils/runtime-badges.d.ts +8 -0
  264. package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
  265. package/dist/cli-tui/utils/runtime-badges.js +58 -0
  266. package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
  267. package/dist/cli.js +41771 -22892
  268. package/dist/cli.js.map +1 -1
  269. package/dist/config/env-vars.d.ts +4 -0
  270. package/dist/config/env-vars.d.ts.map +1 -1
  271. package/dist/config/env-vars.js +4 -0
  272. package/dist/config/env-vars.js.map +1 -1
  273. package/dist/config/feature-flags.d.ts +44 -0
  274. package/dist/config/feature-flags.d.ts.map +1 -1
  275. package/dist/config/feature-flags.js +214 -0
  276. package/dist/config/feature-flags.js.map +1 -1
  277. package/dist/connectors/service-client.d.ts +98 -0
  278. package/dist/connectors/service-client.d.ts.map +1 -0
  279. package/dist/connectors/service-client.js +459 -0
  280. package/dist/connectors/service-client.js.map +1 -0
  281. package/dist/conversation/render-model.d.ts.map +1 -1
  282. package/dist/conversation/render-model.js +53 -3
  283. package/dist/conversation/render-model.js.map +1 -1
  284. package/dist/db/health.d.ts +8 -0
  285. package/dist/db/health.d.ts.map +1 -0
  286. package/dist/db/health.js +64 -0
  287. package/dist/db/health.js.map +1 -0
  288. package/dist/db/migrate.d.ts +301 -0
  289. package/dist/db/migrate.d.ts.map +1 -1
  290. package/dist/db/migrate.js +186 -0
  291. package/dist/db/migrate.js.map +1 -1
  292. package/dist/db/migrations/0000_initial.sql +308 -0
  293. package/dist/db/migrations/0001_shared_sessions.sql +18 -0
  294. package/dist/db/migrations/0002_usage_metrics.sql +28 -0
  295. package/dist/db/migrations/0003_execution_traces.sql +18 -0
  296. package/dist/db/migrations/0004_workspace_config.sql +11 -0
  297. package/dist/db/migrations/0005_revenue_attribution.sql +31 -0
  298. package/dist/db/migrations/0006_hosted_session_storage.sql +51 -0
  299. package/dist/db/migrations/0007_reconcile_legacy_audit_hash_cache.sql +24 -0
  300. package/dist/db/migrations/0008_reconcile_legacy_webhook_deliveries.sql +290 -0
  301. package/dist/db/migrations/meta/0000_snapshot.json +2438 -0
  302. package/dist/db/migrations/meta/_journal.json +69 -0
  303. package/dist/db/schema.d.ts +2232 -844
  304. package/dist/db/schema.d.ts.map +1 -1
  305. package/dist/db/schema.js +187 -1
  306. package/dist/db/schema.js.map +1 -1
  307. package/dist/export-html.d.ts.map +1 -1
  308. package/dist/export-html.js +7 -4
  309. package/dist/export-html.js.map +1 -1
  310. package/dist/headless/utility-command-manager.d.ts +2 -1
  311. package/dist/headless/utility-command-manager.d.ts.map +1 -1
  312. package/dist/headless/utility-command-manager.js +12 -6
  313. package/dist/headless/utility-command-manager.js.map +1 -1
  314. package/dist/headless/utility-file-read.d.ts +1 -0
  315. package/dist/headless/utility-file-read.d.ts.map +1 -1
  316. package/dist/headless/utility-file-read.js +5 -1
  317. package/dist/headless/utility-file-read.js.map +1 -1
  318. package/dist/headless/utility-file-search.d.ts +1 -0
  319. package/dist/headless/utility-file-search.d.ts.map +1 -1
  320. package/dist/headless/utility-file-search.js +4 -1
  321. package/dist/headless/utility-file-search.js.map +1 -1
  322. package/dist/headless/utility-file-watch-manager.d.ts +2 -1
  323. package/dist/headless/utility-file-watch-manager.d.ts.map +1 -1
  324. package/dist/headless/utility-file-watch-manager.js +6 -2
  325. package/dist/headless/utility-file-watch-manager.js.map +1 -1
  326. package/dist/headless/workspace-root.d.ts +8 -0
  327. package/dist/headless/workspace-root.d.ts.map +1 -0
  328. package/dist/headless/workspace-root.js +74 -0
  329. package/dist/headless/workspace-root.js.map +1 -0
  330. package/dist/hooks/notification-hooks.d.ts +5 -0
  331. package/dist/hooks/notification-hooks.d.ts.map +1 -1
  332. package/dist/hooks/notification-hooks.js +4 -0
  333. package/dist/hooks/notification-hooks.js.map +1 -1
  334. package/dist/lsp/diagnostic-deltas.d.ts +20 -0
  335. package/dist/lsp/diagnostic-deltas.d.ts.map +1 -0
  336. package/dist/lsp/diagnostic-deltas.js +92 -0
  337. package/dist/lsp/diagnostic-deltas.js.map +1 -0
  338. package/dist/lsp/diagnostic-repair.d.ts +48 -0
  339. package/dist/lsp/diagnostic-repair.d.ts.map +1 -0
  340. package/dist/lsp/diagnostic-repair.js +143 -0
  341. package/dist/lsp/diagnostic-repair.js.map +1 -0
  342. package/dist/main.d.ts.map +1 -1
  343. package/dist/main.js +122 -37
  344. package/dist/main.js.map +1 -1
  345. package/dist/mcp/config.d.ts +4 -2
  346. package/dist/mcp/config.d.ts.map +1 -1
  347. package/dist/mcp/config.js +58 -14
  348. package/dist/mcp/config.js.map +1 -1
  349. package/dist/mcp/index.d.ts +1 -0
  350. package/dist/mcp/index.d.ts.map +1 -1
  351. package/dist/mcp/index.js +1 -0
  352. package/dist/mcp/index.js.map +1 -1
  353. package/dist/mcp/manager.d.ts +1 -0
  354. package/dist/mcp/manager.d.ts.map +1 -1
  355. package/dist/mcp/manager.js +1 -0
  356. package/dist/mcp/manager.js.map +1 -1
  357. package/dist/mcp/platform-plugin.d.ts +3 -0
  358. package/dist/mcp/platform-plugin.d.ts.map +1 -0
  359. package/dist/mcp/platform-plugin.js +83 -0
  360. package/dist/mcp/platform-plugin.js.map +1 -0
  361. package/dist/mcp/tool-bridge.d.ts +15 -0
  362. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  363. package/dist/mcp/tool-bridge.js +194 -6
  364. package/dist/mcp/tool-bridge.js.map +1 -1
  365. package/dist/memory/platform-memory-client.d.ts +130 -0
  366. package/dist/memory/platform-memory-client.d.ts.map +1 -0
  367. package/dist/memory/platform-memory-client.js +330 -0
  368. package/dist/memory/platform-memory-client.js.map +1 -0
  369. package/dist/memory/service-client.d.ts.map +1 -1
  370. package/dist/memory/service-client.js +1 -2
  371. package/dist/memory/service-client.js.map +1 -1
  372. package/dist/models/builtin.d.ts.map +1 -1
  373. package/dist/models/builtin.js +137 -0
  374. package/dist/models/builtin.js.map +1 -1
  375. package/dist/models/config-loader.d.ts +10 -10
  376. package/dist/models/config-loader.d.ts.map +1 -1
  377. package/dist/models/config-loader.js +1 -0
  378. package/dist/models/config-loader.js.map +1 -1
  379. package/dist/models/registry.d.ts +1 -0
  380. package/dist/models/registry.d.ts.map +1 -1
  381. package/dist/models/registry.js +1 -0
  382. package/dist/models/registry.js.map +1 -1
  383. package/dist/oauth/connectors.d.ts +25 -0
  384. package/dist/oauth/connectors.d.ts.map +1 -0
  385. package/dist/oauth/connectors.js +253 -0
  386. package/dist/oauth/connectors.js.map +1 -0
  387. package/dist/oauth/device-identity.d.ts +18 -0
  388. package/dist/oauth/device-identity.d.ts.map +1 -0
  389. package/dist/oauth/device-identity.js +193 -0
  390. package/dist/oauth/device-identity.js.map +1 -0
  391. package/dist/oauth/evalops.d.ts.map +1 -1
  392. package/dist/oauth/evalops.js +73 -14
  393. package/dist/oauth/evalops.js.map +1 -1
  394. package/dist/oauth/index.d.ts +1 -1
  395. package/dist/oauth/index.d.ts.map +1 -1
  396. package/dist/oauth/index.js +31 -1
  397. package/dist/oauth/index.js.map +1 -1
  398. package/dist/oauth/openai-codex.d.ts +16 -0
  399. package/dist/oauth/openai-codex.d.ts.map +1 -0
  400. package/dist/oauth/openai-codex.js +300 -0
  401. package/dist/oauth/openai-codex.js.map +1 -0
  402. package/dist/opentelemetry.d.ts.map +1 -1
  403. package/dist/opentelemetry.js +9 -2
  404. package/dist/opentelemetry.js.map +1 -1
  405. package/dist/platform/agent-runtime-client.d.ts +279 -0
  406. package/dist/platform/agent-runtime-client.d.ts.map +1 -0
  407. package/dist/platform/agent-runtime-client.js +515 -0
  408. package/dist/platform/agent-runtime-client.js.map +1 -0
  409. package/dist/platform/cerebro-facts-client.d.ts +56 -0
  410. package/dist/platform/cerebro-facts-client.d.ts.map +1 -0
  411. package/dist/platform/cerebro-facts-client.js +297 -0
  412. package/dist/platform/cerebro-facts-client.js.map +1 -0
  413. package/dist/platform/client.d.ts +2 -1
  414. package/dist/platform/client.d.ts.map +1 -1
  415. package/dist/platform/client.js +9 -26
  416. package/dist/platform/client.js.map +1 -1
  417. package/dist/platform/core-services.d.ts +128 -0
  418. package/dist/platform/core-services.d.ts.map +1 -1
  419. package/dist/platform/core-services.js +128 -0
  420. package/dist/platform/core-services.js.map +1 -1
  421. package/dist/platform/maestro-timeline-client.d.ts +22 -0
  422. package/dist/platform/maestro-timeline-client.d.ts.map +1 -0
  423. package/dist/platform/maestro-timeline-client.js +373 -0
  424. package/dist/platform/maestro-timeline-client.js.map +1 -0
  425. package/dist/platform/tool-execution-client.d.ts +104 -0
  426. package/dist/platform/tool-execution-client.d.ts.map +1 -0
  427. package/dist/platform/tool-execution-client.js +284 -0
  428. package/dist/platform/tool-execution-client.js.map +1 -0
  429. package/dist/prompts/service-client.d.ts.map +1 -1
  430. package/dist/prompts/service-client.js +5 -2
  431. package/dist/prompts/service-client.js.map +1 -1
  432. package/dist/providers/anthropic-auth.d.ts.map +1 -1
  433. package/dist/providers/anthropic-auth.js +8 -6
  434. package/dist/providers/anthropic-auth.js.map +1 -1
  435. package/dist/providers/api-keys.d.ts +1 -0
  436. package/dist/providers/api-keys.d.ts.map +1 -1
  437. package/dist/providers/api-keys.js +5 -0
  438. package/dist/providers/api-keys.js.map +1 -1
  439. package/dist/providers/auth.d.ts +2 -1
  440. package/dist/providers/auth.d.ts.map +1 -1
  441. package/dist/providers/auth.js +26 -3
  442. package/dist/providers/auth.js.map +1 -1
  443. package/dist/remote-runner/attach-client.d.ts +41 -0
  444. package/dist/remote-runner/attach-client.d.ts.map +1 -0
  445. package/dist/remote-runner/attach-client.js +692 -0
  446. package/dist/remote-runner/attach-client.js.map +1 -0
  447. package/dist/remote-runner/client.d.ts +205 -0
  448. package/dist/remote-runner/client.d.ts.map +1 -0
  449. package/dist/remote-runner/client.js +633 -0
  450. package/dist/remote-runner/client.js.map +1 -0
  451. package/dist/safety/action-firewall.d.ts +6 -1
  452. package/dist/safety/action-firewall.d.ts.map +1 -1
  453. package/dist/safety/action-firewall.js +62 -26
  454. package/dist/safety/action-firewall.js.map +1 -1
  455. package/dist/safety/governance-service-client.d.ts +36 -0
  456. package/dist/safety/governance-service-client.d.ts.map +1 -0
  457. package/dist/safety/governance-service-client.js +279 -0
  458. package/dist/safety/governance-service-client.js.map +1 -0
  459. package/dist/safety/policy.d.ts +13 -2
  460. package/dist/safety/policy.d.ts.map +1 -1
  461. package/dist/safety/policy.js +474 -52
  462. package/dist/safety/policy.js.map +1 -1
  463. package/dist/sdk-tools.d.ts +21 -0
  464. package/dist/sdk-tools.d.ts.map +1 -1
  465. package/dist/sdk-tools.js +16 -0
  466. package/dist/sdk-tools.js.map +1 -1
  467. package/dist/server/app-context.d.ts +25 -0
  468. package/dist/server/app-context.d.ts.map +1 -1
  469. package/dist/server/app-context.js.map +1 -1
  470. package/dist/server/approval-service.d.ts +7 -8
  471. package/dist/server/approval-service.d.ts.map +1 -1
  472. package/dist/server/approval-service.js +12 -24
  473. package/dist/server/approval-service.js.map +1 -1
  474. package/dist/server/authz.d.ts +23 -2
  475. package/dist/server/authz.d.ts.map +1 -1
  476. package/dist/server/authz.js +153 -17
  477. package/dist/server/authz.js.map +1 -1
  478. package/dist/server/handlers/approvals.d.ts.map +1 -1
  479. package/dist/server/handlers/approvals.js +3 -10
  480. package/dist/server/handlers/approvals.js.map +1 -1
  481. package/dist/server/handlers/branch.d.ts.map +1 -1
  482. package/dist/server/handlers/branch.js +29 -20
  483. package/dist/server/handlers/branch.js.map +1 -1
  484. package/dist/server/handlers/bridge.d.ts.map +1 -1
  485. package/dist/server/handlers/bridge.js +3 -2
  486. package/dist/server/handlers/bridge.js.map +1 -1
  487. package/dist/server/handlers/chat-ws.d.ts.map +1 -1
  488. package/dist/server/handlers/chat-ws.js +23 -31
  489. package/dist/server/handlers/chat-ws.js.map +1 -1
  490. package/dist/server/handlers/chat.d.ts.map +1 -1
  491. package/dist/server/handlers/chat.js +105 -46
  492. package/dist/server/handlers/chat.js.map +1 -1
  493. package/dist/server/handlers/compliance.d.ts +3 -0
  494. package/dist/server/handlers/compliance.d.ts.map +1 -0
  495. package/dist/server/handlers/compliance.js +53 -0
  496. package/dist/server/handlers/compliance.js.map +1 -0
  497. package/dist/server/handlers/context.d.ts.map +1 -1
  498. package/dist/server/handlers/context.js +3 -8
  499. package/dist/server/handlers/context.js.map +1 -1
  500. package/dist/server/handlers/fleet.d.ts +4 -0
  501. package/dist/server/handlers/fleet.d.ts.map +1 -0
  502. package/dist/server/handlers/fleet.js +9 -0
  503. package/dist/server/handlers/fleet.js.map +1 -0
  504. package/dist/server/handlers/headless-sessions.d.ts +4 -0
  505. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  506. package/dist/server/handlers/headless-sessions.js +168 -3
  507. package/dist/server/handlers/headless-sessions.js.map +1 -1
  508. package/dist/server/handlers/health.d.ts +31 -2
  509. package/dist/server/handlers/health.d.ts.map +1 -1
  510. package/dist/server/handlers/health.js +82 -8
  511. package/dist/server/handlers/health.js.map +1 -1
  512. package/dist/server/handlers/hosted-runner-drain.d.ts +128 -0
  513. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -0
  514. package/dist/server/handlers/hosted-runner-drain.js +373 -0
  515. package/dist/server/handlers/hosted-runner-drain.js.map +1 -0
  516. package/dist/server/handlers/hosted-runner-identity.d.ts +17 -0
  517. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -0
  518. package/dist/server/handlers/hosted-runner-identity.js +39 -0
  519. package/dist/server/handlers/hosted-runner-identity.js.map +1 -0
  520. package/dist/server/handlers/intelligent-router.d.ts +3 -0
  521. package/dist/server/handlers/intelligent-router.d.ts.map +1 -0
  522. package/dist/server/handlers/intelligent-router.js +141 -0
  523. package/dist/server/handlers/intelligent-router.js.map +1 -0
  524. package/dist/server/handlers/models.d.ts.map +1 -1
  525. package/dist/server/handlers/models.js +14 -0
  526. package/dist/server/handlers/models.js.map +1 -1
  527. package/dist/server/handlers/pending-requests.d.ts +8 -0
  528. package/dist/server/handlers/pending-requests.d.ts.map +1 -0
  529. package/dist/server/handlers/pending-requests.js +149 -0
  530. package/dist/server/handlers/pending-requests.js.map +1 -0
  531. package/dist/server/handlers/revenue-attribution.d.ts +3 -0
  532. package/dist/server/handlers/revenue-attribution.d.ts.map +1 -0
  533. package/dist/server/handlers/revenue-attribution.js +45 -0
  534. package/dist/server/handlers/revenue-attribution.js.map +1 -0
  535. package/dist/server/handlers/runtime-app-server-ws.d.ts +10 -0
  536. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -0
  537. package/dist/server/handlers/runtime-app-server-ws.js +206 -0
  538. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -0
  539. package/dist/server/handlers/session-artifacts.js +2 -2
  540. package/dist/server/handlers/session-artifacts.js.map +1 -1
  541. package/dist/server/handlers/session-attachments.js +3 -3
  542. package/dist/server/handlers/session-attachments.js.map +1 -1
  543. package/dist/server/handlers/session-timeline.d.ts +11 -0
  544. package/dist/server/handlers/session-timeline.d.ts.map +1 -0
  545. package/dist/server/handlers/session-timeline.js +77 -0
  546. package/dist/server/handlers/session-timeline.js.map +1 -0
  547. package/dist/server/handlers/sessions.d.ts +11 -0
  548. package/dist/server/handlers/sessions.d.ts.map +1 -1
  549. package/dist/server/handlers/sessions.js +68 -100
  550. package/dist/server/handlers/sessions.js.map +1 -1
  551. package/dist/server/handlers/traces.d.ts +3 -0
  552. package/dist/server/handlers/traces.d.ts.map +1 -0
  553. package/dist/server/handlers/traces.js +60 -0
  554. package/dist/server/handlers/traces.js.map +1 -0
  555. package/dist/server/handlers/usage-analytics.d.ts +3 -0
  556. package/dist/server/handlers/usage-analytics.d.ts.map +1 -0
  557. package/dist/server/handlers/usage-analytics.js +40 -0
  558. package/dist/server/handlers/usage-analytics.js.map +1 -0
  559. package/dist/server/handlers/workspace-config.d.ts +3 -0
  560. package/dist/server/handlers/workspace-config.d.ts.map +1 -0
  561. package/dist/server/handlers/workspace-config.js +62 -0
  562. package/dist/server/handlers/workspace-config.js.map +1 -0
  563. package/dist/server/headless-in-process-host.d.ts +8 -1
  564. package/dist/server/headless-in-process-host.d.ts.map +1 -1
  565. package/dist/server/headless-in-process-host.js +6 -0
  566. package/dist/server/headless-in-process-host.js.map +1 -1
  567. package/dist/server/headless-runtime-service.d.ts +99 -1
  568. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  569. package/dist/server/headless-runtime-service.js +286 -23
  570. package/dist/server/headless-runtime-service.js.map +1 -1
  571. package/dist/server/hosted-session-manager.d.ts +103 -0
  572. package/dist/server/hosted-session-manager.d.ts.map +1 -0
  573. package/dist/server/hosted-session-manager.js +629 -0
  574. package/dist/server/hosted-session-manager.js.map +1 -0
  575. package/dist/server/pending-request-payload.d.ts +4 -0
  576. package/dist/server/pending-request-payload.d.ts.map +1 -0
  577. package/dist/server/pending-request-payload.js +107 -0
  578. package/dist/server/pending-request-payload.js.map +1 -0
  579. package/dist/server/request-context.d.ts +4 -0
  580. package/dist/server/request-context.d.ts.map +1 -1
  581. package/dist/server/request-context.js +9 -0
  582. package/dist/server/request-context.js.map +1 -1
  583. package/dist/server/routes.d.ts.map +1 -1
  584. package/dist/server/routes.js +149 -1
  585. package/dist/server/routes.js.map +1 -1
  586. package/dist/server/runtime-ws-access.d.ts +16 -0
  587. package/dist/server/runtime-ws-access.d.ts.map +1 -0
  588. package/dist/server/runtime-ws-access.js +21 -0
  589. package/dist/server/runtime-ws-access.js.map +1 -0
  590. package/dist/server/server-middlewares.d.ts +1 -1
  591. package/dist/server/server-middlewares.d.ts.map +1 -1
  592. package/dist/server/server-middlewares.js +35 -27
  593. package/dist/server/server-middlewares.js.map +1 -1
  594. package/dist/server/server-request-manager.d.ts +8 -27
  595. package/dist/server/server-request-manager.d.ts.map +1 -1
  596. package/dist/server/server-request-manager.js +7 -0
  597. package/dist/server/server-request-manager.js.map +1 -1
  598. package/dist/server/server-utils.d.ts +2 -1
  599. package/dist/server/server-utils.d.ts.map +1 -1
  600. package/dist/server/server-utils.js +11 -1
  601. package/dist/server/server-utils.js.map +1 -1
  602. package/dist/server/session-event-env.d.ts +2 -0
  603. package/dist/server/session-event-env.d.ts.map +1 -0
  604. package/dist/server/session-event-env.js +8 -0
  605. package/dist/server/session-event-env.js.map +1 -0
  606. package/dist/server/session-initialization.d.ts +25 -4
  607. package/dist/server/session-initialization.d.ts.map +1 -1
  608. package/dist/server/session-initialization.js +22 -5
  609. package/dist/server/session-initialization.js.map +1 -1
  610. package/dist/server/session-scope.d.ts +4 -0
  611. package/dist/server/session-scope.d.ts.map +1 -1
  612. package/dist/server/session-scope.js +44 -4
  613. package/dist/server/session-scope.js.map +1 -1
  614. package/dist/server/session-timeline.d.ts +13 -0
  615. package/dist/server/session-timeline.d.ts.map +1 -0
  616. package/dist/server/session-timeline.js +566 -0
  617. package/dist/server/session-timeline.js.map +1 -0
  618. package/dist/services/compliance/controls.d.ts +6 -0
  619. package/dist/services/compliance/controls.d.ts.map +1 -0
  620. package/dist/services/compliance/controls.js +113 -0
  621. package/dist/services/compliance/controls.js.map +1 -0
  622. package/dist/services/compliance/index.d.ts +6 -0
  623. package/dist/services/compliance/index.d.ts.map +1 -0
  624. package/dist/services/compliance/index.js +5 -0
  625. package/dist/services/compliance/index.js.map +1 -0
  626. package/dist/services/compliance/normalize.d.ts +23 -0
  627. package/dist/services/compliance/normalize.d.ts.map +1 -0
  628. package/dist/services/compliance/normalize.js +226 -0
  629. package/dist/services/compliance/normalize.js.map +1 -0
  630. package/dist/services/compliance/recorder.d.ts +22 -0
  631. package/dist/services/compliance/recorder.d.ts.map +1 -0
  632. package/dist/services/compliance/recorder.js +89 -0
  633. package/dist/services/compliance/recorder.js.map +1 -0
  634. package/dist/services/compliance/service.d.ts +24 -0
  635. package/dist/services/compliance/service.d.ts.map +1 -0
  636. package/dist/services/compliance/service.js +426 -0
  637. package/dist/services/compliance/service.js.map +1 -0
  638. package/dist/services/compliance/types.d.ts +185 -0
  639. package/dist/services/compliance/types.d.ts.map +1 -0
  640. package/dist/services/compliance/types.js +2 -0
  641. package/dist/services/compliance/types.js.map +1 -0
  642. package/dist/services/intelligent-router/index.d.ts +5 -0
  643. package/dist/services/intelligent-router/index.d.ts.map +1 -0
  644. package/dist/services/intelligent-router/index.js +5 -0
  645. package/dist/services/intelligent-router/index.js.map +1 -0
  646. package/dist/services/intelligent-router/normalize.d.ts +9 -0
  647. package/dist/services/intelligent-router/normalize.d.ts.map +1 -0
  648. package/dist/services/intelligent-router/normalize.js +169 -0
  649. package/dist/services/intelligent-router/normalize.js.map +1 -0
  650. package/dist/services/intelligent-router/recorder.d.ts +24 -0
  651. package/dist/services/intelligent-router/recorder.d.ts.map +1 -0
  652. package/dist/services/intelligent-router/recorder.js +98 -0
  653. package/dist/services/intelligent-router/recorder.js.map +1 -0
  654. package/dist/services/intelligent-router/service.d.ts +22 -0
  655. package/dist/services/intelligent-router/service.d.ts.map +1 -0
  656. package/dist/services/intelligent-router/service.js +328 -0
  657. package/dist/services/intelligent-router/service.js.map +1 -0
  658. package/dist/services/intelligent-router/types.d.ts +98 -0
  659. package/dist/services/intelligent-router/types.d.ts.map +1 -0
  660. package/dist/services/intelligent-router/types.js +7 -0
  661. package/dist/services/intelligent-router/types.js.map +1 -0
  662. package/dist/services/revenue-attribution/index.d.ts +4 -0
  663. package/dist/services/revenue-attribution/index.d.ts.map +1 -0
  664. package/dist/services/revenue-attribution/index.js +4 -0
  665. package/dist/services/revenue-attribution/index.js.map +1 -0
  666. package/dist/services/revenue-attribution/normalize.d.ts +13 -0
  667. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -0
  668. package/dist/services/revenue-attribution/normalize.js +155 -0
  669. package/dist/services/revenue-attribution/normalize.js.map +1 -0
  670. package/dist/services/revenue-attribution/service.d.ts +21 -0
  671. package/dist/services/revenue-attribution/service.d.ts.map +1 -0
  672. package/dist/services/revenue-attribution/service.js +248 -0
  673. package/dist/services/revenue-attribution/service.js.map +1 -0
  674. package/dist/services/revenue-attribution/types.d.ts +96 -0
  675. package/dist/services/revenue-attribution/types.d.ts.map +1 -0
  676. package/dist/services/revenue-attribution/types.js +7 -0
  677. package/dist/services/revenue-attribution/types.js.map +1 -0
  678. package/dist/services/traces/index.d.ts +5 -0
  679. package/dist/services/traces/index.d.ts.map +1 -0
  680. package/dist/services/traces/index.js +4 -0
  681. package/dist/services/traces/index.js.map +1 -0
  682. package/dist/services/traces/normalize.d.ts +20 -0
  683. package/dist/services/traces/normalize.d.ts.map +1 -0
  684. package/dist/services/traces/normalize.js +261 -0
  685. package/dist/services/traces/normalize.js.map +1 -0
  686. package/dist/services/traces/otel.d.ts +3 -0
  687. package/dist/services/traces/otel.d.ts.map +1 -0
  688. package/dist/services/traces/otel.js +173 -0
  689. package/dist/services/traces/otel.js.map +1 -0
  690. package/dist/services/traces/service.d.ts +17 -0
  691. package/dist/services/traces/service.d.ts.map +1 -0
  692. package/dist/services/traces/service.js +197 -0
  693. package/dist/services/traces/service.js.map +1 -0
  694. package/dist/services/traces/types.d.ts +130 -0
  695. package/dist/services/traces/types.d.ts.map +1 -0
  696. package/dist/services/traces/types.js +8 -0
  697. package/dist/services/traces/types.js.map +1 -0
  698. package/dist/services/usage-analytics/aggregation.d.ts +18 -0
  699. package/dist/services/usage-analytics/aggregation.d.ts.map +1 -0
  700. package/dist/services/usage-analytics/aggregation.js +130 -0
  701. package/dist/services/usage-analytics/aggregation.js.map +1 -0
  702. package/dist/services/usage-analytics/index.d.ts +5 -0
  703. package/dist/services/usage-analytics/index.d.ts.map +1 -0
  704. package/dist/services/usage-analytics/index.js +4 -0
  705. package/dist/services/usage-analytics/index.js.map +1 -0
  706. package/dist/services/usage-analytics/recorder.d.ts +16 -0
  707. package/dist/services/usage-analytics/recorder.d.ts.map +1 -0
  708. package/dist/services/usage-analytics/recorder.js +128 -0
  709. package/dist/services/usage-analytics/recorder.js.map +1 -0
  710. package/dist/services/usage-analytics/service.d.ts +15 -0
  711. package/dist/services/usage-analytics/service.d.ts.map +1 -0
  712. package/dist/services/usage-analytics/service.js +210 -0
  713. package/dist/services/usage-analytics/service.js.map +1 -0
  714. package/dist/services/usage-analytics/types.d.ts +80 -0
  715. package/dist/services/usage-analytics/types.d.ts.map +1 -0
  716. package/dist/services/usage-analytics/types.js +2 -0
  717. package/dist/services/usage-analytics/types.js.map +1 -0
  718. package/dist/services/workspace-config/index.d.ts +6 -0
  719. package/dist/services/workspace-config/index.d.ts.map +1 -0
  720. package/dist/services/workspace-config/index.js +5 -0
  721. package/dist/services/workspace-config/index.js.map +1 -0
  722. package/dist/services/workspace-config/middleware.d.ts +5 -0
  723. package/dist/services/workspace-config/middleware.d.ts.map +1 -0
  724. package/dist/services/workspace-config/middleware.js +98 -0
  725. package/dist/services/workspace-config/middleware.js.map +1 -0
  726. package/dist/services/workspace-config/normalize.d.ts +17 -0
  727. package/dist/services/workspace-config/normalize.d.ts.map +1 -0
  728. package/dist/services/workspace-config/normalize.js +148 -0
  729. package/dist/services/workspace-config/normalize.js.map +1 -0
  730. package/dist/services/workspace-config/policy.d.ts +16 -0
  731. package/dist/services/workspace-config/policy.d.ts.map +1 -0
  732. package/dist/services/workspace-config/policy.js +77 -0
  733. package/dist/services/workspace-config/policy.js.map +1 -0
  734. package/dist/services/workspace-config/service.d.ts +20 -0
  735. package/dist/services/workspace-config/service.d.ts.map +1 -0
  736. package/dist/services/workspace-config/service.js +162 -0
  737. package/dist/services/workspace-config/service.js.map +1 -0
  738. package/dist/services/workspace-config/types.d.ts +71 -0
  739. package/dist/services/workspace-config/types.d.ts.map +1 -0
  740. package/dist/services/workspace-config/types.js +2 -0
  741. package/dist/services/workspace-config/types.js.map +1 -0
  742. package/dist/session/manager.d.ts.map +1 -1
  743. package/dist/session/manager.js +10 -0
  744. package/dist/session/manager.js.map +1 -1
  745. package/dist/session/migration.d.ts.map +1 -1
  746. package/dist/session/migration.js +2 -1
  747. package/dist/session/migration.js.map +1 -1
  748. package/dist/session/session-memory.d.ts.map +1 -1
  749. package/dist/session/session-memory.js +7 -1
  750. package/dist/session/session-memory.js.map +1 -1
  751. package/dist/session/types.d.ts +1 -2
  752. package/dist/session/types.d.ts.map +1 -1
  753. package/dist/session/types.js +1 -22
  754. package/dist/session/types.js.map +1 -1
  755. package/dist/session/wire-format.d.ts +7 -0
  756. package/dist/session/wire-format.d.ts.map +1 -0
  757. package/dist/session/wire-format.generated.d.ts +95 -0
  758. package/dist/session/wire-format.generated.d.ts.map +1 -0
  759. package/dist/session/wire-format.generated.js +111 -0
  760. package/dist/session/wire-format.generated.js.map +1 -0
  761. package/dist/session/wire-format.js +145 -0
  762. package/dist/session/wire-format.js.map +1 -0
  763. package/dist/shared-memory/client.d.ts.map +1 -1
  764. package/dist/shared-memory/client.js +22 -22
  765. package/dist/shared-memory/client.js.map +1 -1
  766. package/dist/skills/artifact-metadata.d.ts +16 -0
  767. package/dist/skills/artifact-metadata.d.ts.map +1 -0
  768. package/dist/skills/artifact-metadata.js +86 -0
  769. package/dist/skills/artifact-metadata.js.map +1 -0
  770. package/dist/skills/loader.d.ts +2 -2
  771. package/dist/skills/loader.d.ts.map +1 -1
  772. package/dist/skills/loader.js +1 -0
  773. package/dist/skills/loader.js.map +1 -1
  774. package/dist/skills/service-client.d.ts +42 -0
  775. package/dist/skills/service-client.d.ts.map +1 -0
  776. package/dist/skills/service-client.js +258 -0
  777. package/dist/skills/service-client.js.map +1 -0
  778. package/dist/skills/tool.d.ts +3 -0
  779. package/dist/skills/tool.d.ts.map +1 -1
  780. package/dist/skills/tool.js +67 -5
  781. package/dist/skills/tool.js.map +1 -1
  782. package/dist/telemetry/index.d.ts +4 -0
  783. package/dist/telemetry/index.d.ts.map +1 -1
  784. package/dist/telemetry/index.js +5 -0
  785. package/dist/telemetry/index.js.map +1 -1
  786. package/dist/telemetry/maestro-event-bus.d.ts +440 -0
  787. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -0
  788. package/dist/telemetry/maestro-event-bus.js +784 -0
  789. package/dist/telemetry/maestro-event-bus.js.map +1 -0
  790. package/dist/telemetry/maestro-event-catalog.d.ts +48 -0
  791. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -0
  792. package/dist/telemetry/maestro-event-catalog.js +69 -0
  793. package/dist/telemetry/maestro-event-catalog.js.map +1 -0
  794. package/dist/telemetry/maestro-platform-replay-fixture.d.ts +24 -0
  795. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -0
  796. package/dist/telemetry/maestro-platform-replay-fixture.js +400 -0
  797. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -0
  798. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +29 -0
  799. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -0
  800. package/dist/telemetry/maestro-publisher-conformance-fixture.js +240 -0
  801. package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -0
  802. package/dist/telemetry/meter-service-client.d.ts +0 -33
  803. package/dist/telemetry/meter-service-client.d.ts.map +1 -1
  804. package/dist/telemetry/meter-service-client.js +22 -50
  805. package/dist/telemetry/meter-service-client.js.map +1 -1
  806. package/dist/telemetry/turn-tracker.d.ts.map +1 -1
  807. package/dist/telemetry/turn-tracker.js +5 -5
  808. package/dist/telemetry/turn-tracker.js.map +1 -1
  809. package/dist/telemetry/wide-events.d.ts +8 -0
  810. package/dist/telemetry/wide-events.d.ts.map +1 -1
  811. package/dist/telemetry/wide-events.js +28 -0
  812. package/dist/telemetry/wide-events.js.map +1 -1
  813. package/dist/telemetry.d.ts +1 -1
  814. package/dist/telemetry.d.ts.map +1 -1
  815. package/dist/telemetry.js +14 -4
  816. package/dist/telemetry.js.map +1 -1
  817. package/dist/timeline/redaction.d.ts +5 -0
  818. package/dist/timeline/redaction.d.ts.map +1 -0
  819. package/dist/timeline/redaction.js +119 -0
  820. package/dist/timeline/redaction.js.map +1 -0
  821. package/dist/tools/ask-user.d.ts +26 -0
  822. package/dist/tools/ask-user.d.ts.map +1 -1
  823. package/dist/tools/ask-user.js +33 -1
  824. package/dist/tools/ask-user.js.map +1 -1
  825. package/dist/tools/background/task-types.d.ts +1 -1
  826. package/dist/tools/edit.d.ts +2 -0
  827. package/dist/tools/edit.d.ts.map +1 -1
  828. package/dist/tools/edit.js +27 -7
  829. package/dist/tools/edit.js.map +1 -1
  830. package/dist/tools/index.d.ts +9 -0
  831. package/dist/tools/index.d.ts.map +1 -1
  832. package/dist/tools/pipeline.d.ts.map +1 -1
  833. package/dist/tools/pipeline.js +16 -7
  834. package/dist/tools/pipeline.js.map +1 -1
  835. package/dist/tools/write.d.ts +2 -0
  836. package/dist/tools/write.d.ts.map +1 -1
  837. package/dist/tools/write.js +24 -6
  838. package/dist/tools/write.js.map +1 -1
  839. package/dist/tracking/cost-tracker.d.ts +15 -12
  840. package/dist/tracking/cost-tracker.d.ts.map +1 -1
  841. package/dist/tracking/cost-tracker.js +29 -40
  842. package/dist/tracking/cost-tracker.js.map +1 -1
  843. package/dist/utils/checkpoint-profiler.d.ts +29 -0
  844. package/dist/utils/checkpoint-profiler.d.ts.map +1 -0
  845. package/dist/utils/checkpoint-profiler.js +118 -0
  846. package/dist/utils/checkpoint-profiler.js.map +1 -0
  847. package/dist/utils/downstream-http.d.ts +21 -0
  848. package/dist/utils/downstream-http.d.ts.map +1 -0
  849. package/dist/utils/downstream-http.js +151 -0
  850. package/dist/utils/downstream-http.js.map +1 -0
  851. package/dist/utils/downstream.d.ts +18 -0
  852. package/dist/utils/downstream.d.ts.map +1 -0
  853. package/dist/utils/downstream.js +47 -0
  854. package/dist/utils/downstream.js.map +1 -0
  855. package/dist/utils/logger.d.ts +3 -1
  856. package/dist/utils/logger.d.ts.map +1 -1
  857. package/dist/utils/logger.js +12 -1
  858. package/dist/utils/logger.js.map +1 -1
  859. package/dist/utils/oauth-http.d.ts +8 -0
  860. package/dist/utils/oauth-http.d.ts.map +1 -0
  861. package/dist/utils/oauth-http.js +41 -0
  862. package/dist/utils/oauth-http.js.map +1 -0
  863. package/dist/utils/path-utils.d.ts +2 -0
  864. package/dist/utils/path-utils.d.ts.map +1 -0
  865. package/dist/utils/path-utils.js +12 -0
  866. package/dist/utils/path-utils.js.map +1 -0
  867. package/dist/utils/path-validation.d.ts +1 -1
  868. package/dist/utils/path-validation.d.ts.map +1 -1
  869. package/dist/utils/path-validation.js +3 -3
  870. package/dist/utils/path-validation.js.map +1 -1
  871. package/dist/version.json +2 -2
  872. package/dist/web-server.d.ts +7 -1
  873. package/dist/web-server.d.ts.map +1 -1
  874. package/dist/web-server.js +117 -15
  875. package/dist/web-server.js.map +1 -1
  876. package/dist/webhooks/delivery.d.ts.map +1 -1
  877. package/dist/webhooks/delivery.js +9 -12
  878. package/dist/webhooks/delivery.js.map +1 -1
  879. package/node_modules/@bufbuild/protobuf/dist/cjs/descriptors.d.ts +12 -5
  880. package/node_modules/@bufbuild/protobuf/dist/cjs/from-binary.js +7 -7
  881. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.d.ts +1 -1
  882. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.js +1 -1
  883. package/node_modules/@bufbuild/protobuf/dist/cjs/reflect/path.d.ts +1 -1
  884. package/node_modules/@bufbuild/protobuf/dist/cjs/registry.js +24 -1
  885. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.d.ts +1 -1
  886. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.js +9 -10
  887. package/node_modules/@bufbuild/protobuf/dist/cjs/types.d.ts +1 -1
  888. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.d.ts +9 -7
  889. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.js +18 -8
  890. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.d.ts +4 -2
  891. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.js +8 -1
  892. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  893. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  894. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  895. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  896. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  897. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  898. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.js +38 -2
  899. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  900. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  901. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.d.ts +10 -0
  902. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.js +24 -0
  903. package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts +12 -5
  904. package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js +7 -7
  905. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.d.ts +1 -1
  906. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.js +2 -2
  907. package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts +1 -1
  908. package/node_modules/@bufbuild/protobuf/dist/esm/registry.js +24 -1
  909. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.d.ts +1 -1
  910. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.js +10 -11
  911. package/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts +1 -1
  912. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts +9 -7
  913. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js +18 -8
  914. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts +4 -2
  915. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js +8 -1
  916. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  917. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  918. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  919. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  920. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  921. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  922. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +37 -1
  923. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  924. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  925. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.d.ts +10 -0
  926. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js +23 -0
  927. package/node_modules/@bufbuild/protobuf/package.json +1 -1
  928. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +305 -2
  929. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
  930. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +34 -4
  931. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
  932. package/node_modules/@evalops/contracts/dist/index.d.ts +88 -0
  933. package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  934. package/node_modules/@evalops/contracts/dist/index.js +2 -0
  935. package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  936. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +77 -77
  937. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
  938. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +1 -1
  939. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
  940. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +182 -0
  941. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -0
  942. package/node_modules/@evalops/contracts/dist/runtime-app-server.js +83 -0
  943. package/node_modules/@evalops/contracts/dist/runtime-app-server.js.map +1 -0
  944. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +133 -0
  945. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -0
  946. package/node_modules/@evalops/contracts/dist/runtime-server-request.js +68 -0
  947. package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -0
  948. package/node_modules/@evalops/contracts/dist/schemas.d.ts +178 -0
  949. package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
  950. package/node_modules/@evalops/contracts/dist/schemas.js +165 -0
  951. package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
  952. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts +2 -0
  953. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts.map +1 -0
  954. package/node_modules/@evalops/contracts/dist/typebox-utils.js +5 -0
  955. package/node_modules/@evalops/contracts/dist/typebox-utils.js.map +1 -0
  956. package/node_modules/@evalops/contracts/dist/validators.d.ts +4 -1
  957. package/node_modules/@evalops/contracts/dist/validators.d.ts.map +1 -1
  958. package/node_modules/@evalops/contracts/dist/validators.js +4 -1
  959. package/node_modules/@evalops/contracts/dist/validators.js.map +1 -1
  960. package/node_modules/@evalops/contracts/package.json +1 -1
  961. package/node_modules/@evalops/tui/package.json +1 -1
  962. package/node_modules/string-width/index.js +93 -9
  963. package/node_modules/string-width/package.json +1 -1
  964. package/package.json +32 -25
  965. package/dist/cli-tui/commands/grouped/auth-commands.d.ts.map +0 -1
  966. package/dist/cli-tui/commands/grouped/auth-commands.js.map +0 -1
  967. package/dist/cli-tui/commands/grouped/config-commands.d.ts.map +0 -1
  968. package/dist/cli-tui/commands/grouped/config-commands.js.map +0 -1
  969. package/dist/cli-tui/commands/grouped/diag-commands.d.ts.map +0 -1
  970. package/dist/cli-tui/commands/grouped/diag-commands.js.map +0 -1
  971. package/dist/cli-tui/commands/grouped/git-commands.d.ts.map +0 -1
  972. package/dist/cli-tui/commands/grouped/git-commands.js.map +0 -1
  973. package/dist/cli-tui/commands/grouped/index.d.ts.map +0 -1
  974. package/dist/cli-tui/commands/grouped/index.js.map +0 -1
  975. package/dist/cli-tui/commands/grouped/safety-commands.d.ts.map +0 -1
  976. package/dist/cli-tui/commands/grouped/safety-commands.js.map +0 -1
  977. package/dist/cli-tui/commands/grouped/session-commands.d.ts.map +0 -1
  978. package/dist/cli-tui/commands/grouped/session-commands.js.map +0 -1
  979. package/dist/cli-tui/commands/grouped/tools-commands.d.ts.map +0 -1
  980. package/dist/cli-tui/commands/grouped/tools-commands.js.map +0 -1
  981. package/dist/cli-tui/commands/grouped/ui-commands.d.ts.map +0 -1
  982. package/dist/cli-tui/commands/grouped/ui-commands.js.map +0 -1
  983. package/dist/cli-tui/commands/grouped/undo-commands.d.ts.map +0 -1
  984. package/dist/cli-tui/commands/grouped/undo-commands.js.map +0 -1
  985. package/dist/cli-tui/commands/grouped/usage-commands.d.ts.map +0 -1
  986. package/dist/cli-tui/commands/grouped/usage-commands.js.map +0 -1
  987. package/dist/cli-tui/commands/grouped/utils.d.ts.map +0 -1
  988. package/dist/cli-tui/commands/grouped/utils.js.map +0 -1
  989. package/dist/cli-tui/commands/grouped-command-handlers.d.ts.map +0 -1
  990. package/dist/cli-tui/commands/grouped-command-handlers.js +0 -135
  991. package/dist/cli-tui/commands/grouped-command-handlers.js.map +0 -1
  992. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts +0 -78
  993. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts.map +0 -1
  994. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js +0 -129
  995. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js.map +0 -1
  996. package/node_modules/@evalops/memory/dist/client.d.ts +0 -94
  997. package/node_modules/@evalops/memory/dist/client.js +0 -503
  998. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.d.ts +0 -608
  999. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.js +0 -187
  1000. package/node_modules/@evalops/memory/package.json +0 -26
  1001. /package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Edit Tool - Find-and-replace text editing with fuzzy matching fallback\n *\n * This module implements a robust text editing tool that performs exact string\n * replacement with intelligent fallback to approximate matching when exact matches\n * fail. The core design philosophy is \"fail helpfully\" - when the user's search\n * text doesn't match exactly (due to whitespace differences, typos, or outdated\n * content), we provide actionable suggestions pointing to the closest matches.\n *\n * ## Architecture Overview\n *\n * 1. **Exact Matching (Primary Path)**\n * - Simple string indexOf search for O(n) performance\n * - Handles single edit, multi-edit (sequential), and replace-all modes\n * - Reports all match locations with line numbers for disambiguation\n *\n * 2. **Approximate Matching (Fallback Path)**\n * - Triggered only when exact match fails\n * - Uses two complementary strategies:\n * a) Regex-based relaxed matching (whitespace normalization)\n * b) Line-by-line Levenshtein similarity scoring\n * - Results sorted by similarity score, filtered by threshold\n *\n * 3. **Similarity Scoring**\n * - Levenshtein distance normalized to 0-1 similarity ratio\n * - Dual thresholds: 50% for single candidates, 60% for multiple\n * - Prevents noise while surfacing genuinely close matches\n *\n * ## Key Design Decisions\n *\n * - **Atomic writes**: Uses temp file + rename for crash safety\n * - **Multi-edit mode**: Applies edits sequentially for deterministic results\n * - **LSP integration**: Collects diagnostics after edits for immediate feedback\n * - **Sandbox support**: Operates through sandbox abstraction when available\n *\n * @module tools/edit\n */\n\nimport crypto from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport { collectDiagnostics } from \"../lsp/index.js\";\nimport { assertTeamMemoryContentSafe } from \"../memory/team-memory.js\";\nimport {\n\trequirePlanCheck,\n\trunValidatorsOnSuccess,\n} from \"../safety/safe-mode.js\";\nimport type { ValidatorRunResult } from \"../safety/safe-mode.js\";\nimport { formatLspDiagnostics, generateDiffString } from \"./diff-utils.js\";\nimport { createTool, expandUserPath } from \"./tool-dsl.js\";\n\nasync function writeFileAtomically(\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> {\n\tconst tempPath = `${filePath}.${crypto.randomUUID()}.tmp`;\n\tawait writeFile(tempPath, contents, \"utf-8\");\n\ttry {\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\tawait unlink(tempPath).catch(() => {});\n\t\tthrow error;\n\t}\n}\n\n/** Diff support lives in diff-utils for reuse */\n\ntype LineEnding = \"\\n\" | \"\\r\\n\" | \"\\r\";\n\ntype NormalizedDocument = {\n\toriginal: string;\n\tnormalized: string;\n\tbom: string;\n\tlineEnding: LineEnding;\n};\n\nfunction detectLineEnding(text: string): LineEnding {\n\tif (text.includes(\"\\r\\n\")) return \"\\r\\n\";\n\tif (text.includes(\"\\r\")) return \"\\r\";\n\treturn \"\\n\";\n}\n\nfunction normalizeDocument(content: string): NormalizedDocument {\n\tconst bom = content.startsWith(\"\\uFEFF\") ? \"\\uFEFF\" : \"\";\n\tconst withoutBom = bom ? content.slice(1) : content;\n\tconst lineEnding = detectLineEnding(withoutBom);\n\tconst normalized = withoutBom.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\treturn { original: content, normalized, bom, lineEnding };\n}\n\nfunction normalizeEditText(text: string | undefined): string | undefined {\n\tif (text === undefined) return undefined;\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction restoreDocumentContent(\n\tnormalized: string,\n\tdocument: NormalizedDocument,\n): string {\n\tconst restored =\n\t\tdocument.lineEnding === \"\\n\"\n\t\t\t? normalized\n\t\t\t: normalized.replace(/\\n/g, document.lineEnding);\n\treturn `${document.bom}${restored}`;\n}\n\nconst editOperationSchema = Type.Object({\n\toldText: Type.String({\n\t\tdescription: \"Exact text to find and replace\",\n\t\tminLength: 1,\n\t}),\n\tnewText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Replacement text (omit or empty string to delete)\",\n\t\t\tdefault: \"\",\n\t\t}),\n\t),\n});\n\nconst editSchema = Type.Object({\n\tpath: Type.String({\n\t\tdescription: \"Path to the file to edit (relative or absolute)\",\n\t\tminLength: 1,\n\t}),\n\toldText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Exact text to find and replace (must match exactly)\",\n\t\t\tminLength: 1,\n\t\t}),\n\t),\n\tnewText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"New text to replace the old text with\",\n\t\t\tdefault: \"\",\n\t\t}),\n\t),\n\tedits: Type.Optional(\n\t\tType.Array(editOperationSchema, {\n\t\t\tdescription:\n\t\t\t\t\"Multiple edits to apply sequentially (alternative to oldText/newText)\",\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 50,\n\t\t}),\n\t),\n\treplaceAll: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Replace all occurrences (useful for variable renaming). Cannot be used with occurrence or edits.\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\toccurrence: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription:\n\t\t\t\t\"Which occurrence of the text to replace (1-based). Cannot be used with replaceAll or edits.\",\n\t\t\tminimum: 1,\n\t\t\tdefault: 1,\n\t\t}),\n\t),\n\tdryRun: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Preview the diff without writing changes\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n});\n\ntype EditToolDetails = {\n\tdiff: string;\n\teditsApplied?: number;\n\tvalidators?: ValidatorRunResult[];\n\tmode?: \"sandbox\";\n};\n\nexport const editTool = createTool<typeof editSchema, EditToolDetails>({\n\tname: \"edit\",\n\tlabel: \"edit\",\n\tdescription: `Edit files with find-and-replace. oldText must match exactly (whitespace, indentation, newlines).\n\nParameters:\n- path: File path\n- oldText/newText: Single edit (text to find and replacement)\n- edits: Array of {oldText, newText} for multiple sequential edits (1-50)\n- replaceAll: Replace all occurrences (default: false). For single edit only.\n- occurrence: Which match (default: 1). For single edit only.\n- dryRun: Preview only (default: false)\n\nUse either oldText/newText OR edits array, not both.\n\nBest practices:\n- Read file first to verify exact formatting\n- Include context (5-10 lines) for uniqueness\n- Match indentation style (tabs vs spaces)\n- Use dryRun for complex edits\n- Use edits array for multiple related changes (atomic)\n\nIf \"not found\", read file to check actual content.`,\n\tschema: editSchema,\n\tasync run(\n\t\t{\n\t\t\tpath,\n\t\t\toldText,\n\t\t\tnewText,\n\t\t\tedits,\n\t\t\treplaceAll = false,\n\t\t\toccurrence = 1,\n\t\t\tdryRun = false,\n\t\t},\n\t\t{ signal, respond, sandbox },\n\t) {\n\t\trequirePlanCheck(\"edit\");\n\n\t\tconst absolutePath = resolvePath(expandUserPath(path));\n\t\tconst throwIfAborted = () => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t}\n\t\t};\n\n\t\t// Validate mutually exclusive parameters\n\t\tconst hasSingleEdit = oldText !== undefined;\n\t\t// newText with non-empty value alongside edits array is an error\n\t\t// (empty string is allowed as it's the default and harmless)\n\t\tconst hasExplicitNewText = newText !== undefined && newText !== \"\";\n\t\tconst hasMultiEdit = edits !== undefined && edits.length > 0;\n\n\t\tif ((hasSingleEdit || hasExplicitNewText) && hasMultiEdit) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use both oldText/newText and edits array. Use one or the other.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!hasSingleEdit && !hasMultiEdit) {\n\t\t\tthrow new Error(\"Must provide either oldText/newText or edits array.\");\n\t\t}\n\n\t\tif (hasMultiEdit && (replaceAll || occurrence !== 1)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use replaceAll or occurrence with edits array. These options only apply to single edits.\",\n\t\t\t);\n\t\t}\n\n\t\tif (replaceAll && occurrence !== 1) {\n\t\t\tthrow new Error(\"Cannot use both replaceAll and occurrence.\");\n\t\t}\n\n\t\tconst normalizedOldText = normalizeEditText(oldText);\n\t\tconst normalizedNewText = normalizeEditText(newText);\n\t\tconst normalizedEdits = edits?.map((edit) => ({\n\t\t\t...edit,\n\t\t\toldText: normalizeEditText(edit.oldText) ?? \"\",\n\t\t\tnewText: normalizeEditText(edit.newText),\n\t\t}));\n\n\t\t// Helper to apply edits to content (shared between sandbox and normal mode)\n\t\tconst applyEdits = (\n\t\t\toriginalContent: string,\n\t\t): { newContent: string; replacementCount: number } => {\n\t\t\tif (hasMultiEdit && normalizedEdits) {\n\t\t\t\tlet content = originalContent;\n\t\t\t\tlet editsApplied = 0;\n\t\t\t\tfor (const [index, edit] of normalizedEdits.entries()) {\n\t\t\t\t\tconst matches = findExactMatches(content, edit.oldText);\n\t\t\t\t\tif (matches.length === 0) {\n\t\t\t\t\t\tconst approx = findApproximateMatches(content, edit.oldText);\n\t\t\t\t\t\tconst suggestion = approx.length\n\t\t\t\t\t\t\t? `\\n\\nPossible matches:\\n${approx.slice(0, 3).map(formatMatchPreview).join(\"\\n\")}`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Edit #${index + 1}: Could not find text after ${editsApplied} prior edit(s).${suggestion}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (matches.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Edit #${index + 1}: Found ${matches.length} matches for oldText. Provide more context. Matches at lines: ${matches.map((m) => m.line).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst matchIndex = matches[0]?.index ?? 0;\n\t\t\t\t\tcontent =\n\t\t\t\t\t\tcontent.slice(0, matchIndex) +\n\t\t\t\t\t\t(edit.newText ?? \"\") +\n\t\t\t\t\t\tcontent.slice(matchIndex + edit.oldText.length);\n\t\t\t\t\teditsApplied++;\n\t\t\t\t}\n\t\t\t\treturn { newContent: content, replacementCount: editsApplied };\n\t\t\t}\n\t\t\t// Single edit mode\n\t\t\tif (!normalizedOldText || normalizedOldText.length === 0) {\n\t\t\t\tthrow new Error(\"oldText cannot be empty\");\n\t\t\t}\n\t\t\tconst exactMatches = findExactMatches(originalContent, normalizedOldText);\n\t\t\tif (exactMatches.length === 0) {\n\t\t\t\tconst approx = findApproximateMatches(\n\t\t\t\t\toriginalContent,\n\t\t\t\t\tnormalizedOldText,\n\t\t\t\t);\n\t\t\t\tconst suggestion = approx.length\n\t\t\t\t\t? `\\n\\nPossible matches:\\n${approx.slice(0, 3).map(formatMatchPreview).join(\"\\n\")}`\n\t\t\t\t\t: `\\n\\nTip: double-check whitespace/newlines via /diff ${path}`;\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not find the exact text in ${path}.${suggestion}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (replaceAll) {\n\t\t\t\tif (exactMatches.length > 10000) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Too many replacements: ${exactMatches.length} (max 10000).`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tnewContent: originalContent.replaceAll(\n\t\t\t\t\t\tnormalizedOldText,\n\t\t\t\t\t\tnormalizedNewText ?? \"\",\n\t\t\t\t\t),\n\t\t\t\t\treplacementCount: exactMatches.length,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (occurrence > exactMatches.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Only ${exactMatches.length} occurrence(s) found, but #${occurrence} requested.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst targetMatch = exactMatches[occurrence - 1]!;\n\t\t\tconst matchIndex = targetMatch.index ?? 0;\n\t\t\treturn {\n\t\t\t\tnewContent:\n\t\t\t\t\toriginalContent.slice(0, matchIndex) +\n\t\t\t\t\t(normalizedNewText ?? \"\") +\n\t\t\t\t\toriginalContent.slice(matchIndex + normalizedOldText.length),\n\t\t\t\treplacementCount: 1,\n\t\t\t};\n\t\t};\n\n\t\t// Use sandbox if available\n\t\tif (sandbox) {\n\t\t\ttry {\n\t\t\t\tconst exists = await sandbox.exists(path);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthrow new Error(`File not found in sandbox: ${path}`);\n\t\t\t\t}\n\t\t\t\tconst originalContent = await sandbox.readFile(path);\n\t\t\t\tconst document = normalizeDocument(originalContent);\n\t\t\t\tconst { newContent: normalizedNewContent, replacementCount } =\n\t\t\t\t\tapplyEdits(document.normalized);\n\t\t\t\tconst newContent = restoreDocumentContent(\n\t\t\t\t\tnormalizedNewContent,\n\t\t\t\t\tdocument,\n\t\t\t\t);\n\t\t\t\tassertTeamMemoryContentSafe(absolutePath, newContent);\n\t\t\t\tconst diff = generateDiffString(originalContent, newContent);\n\n\t\t\t\tif (!dryRun) {\n\t\t\t\t\tawait sandbox.writeFile(path, newContent);\n\t\t\t\t}\n\n\t\t\t\treturn respond\n\t\t\t\t\t.text(\n\t\t\t\t\t\tdryRun\n\t\t\t\t\t\t\t? `[DRY RUN] Would apply ${replacementCount} edit(s) to ${path} in sandbox`\n\t\t\t\t\t\t\t: `Applied ${replacementCount} edit(s) to ${path} in sandbox`,\n\t\t\t\t\t)\n\t\t\t\t\t.detail({ diff, editsApplied: replacementCount, mode: \"sandbox\" });\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof Error) throw err;\n\t\t\t\tthrow new Error(String(err));\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait access(absolutePath, constants.R_OK | constants.W_OK);\n\t\t} catch {\n\t\t\t// Provide helpful hint\n\t\t\tlet hint = \"\";\n\t\t\tif (path.includes(\"//\")) {\n\t\t\t\thint = \" Hint: path contains double slashes.\";\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`File not found: ${path}.${hint} Use 'read' to verify the path exists.`,\n\t\t\t);\n\t\t}\n\n\t\tthrowIfAborted();\n\t\tconst originalContent = await readFile(absolutePath, \"utf-8\");\n\t\tthrowIfAborted();\n\t\tconst document = normalizeDocument(originalContent);\n\t\tconst { newContent: normalizedNewContent, replacementCount } = applyEdits(\n\t\t\tdocument.normalized,\n\t\t);\n\t\tconst newContent = restoreDocumentContent(normalizedNewContent, document);\n\t\tassertTeamMemoryContentSafe(absolutePath, newContent);\n\t\tconst diff = generateDiffString(originalContent, newContent);\n\n\t\tif (dryRun) {\n\t\t\tconst modeDesc = hasMultiEdit\n\t\t\t\t? `${replacementCount} edit(s)`\n\t\t\t\t: replaceAll\n\t\t\t\t\t? \"all occurrences\"\n\t\t\t\t\t: `occurrence #${occurrence}`;\n\t\t\treturn respond\n\t\t\t\t.text(`Dry run: preview for ${path} (${modeDesc}). No changes written.`)\n\t\t\t\t.detail({\n\t\t\t\t\tdiff,\n\t\t\t\t\teditsApplied: hasMultiEdit ? replacementCount : undefined,\n\t\t\t\t});\n\t\t}\n\n\t\tawait writeFileAtomically(absolutePath, newContent);\n\t\tlet validatorSummaries: ValidatorRunResult[] | undefined;\n\t\tlet linterOutput = \"\";\n\t\ttry {\n\t\t\tconst lspDiagnostics = await collectDiagnostics();\n\t\t\tconst fileDiagnostics = lspDiagnostics[absolutePath] || [];\n\t\t\tif (fileDiagnostics.length > 0) {\n\t\t\t\tlinterOutput = formatLspDiagnostics(path, fileDiagnostics);\n\t\t\t}\n\t\t\tvalidatorSummaries = await runValidatorsOnSuccess(\n\t\t\t\t[absolutePath],\n\t\t\t\tlspDiagnostics,\n\t\t\t);\n\t\t} catch (validatorError) {\n\t\t\tawait writeFileAtomically(absolutePath, originalContent);\n\t\t\tthrow validatorError;\n\t\t}\n\n\t\tthrowIfAborted();\n\n\t\tconst resultMessage = hasMultiEdit\n\t\t\t? `Successfully applied ${replacementCount} edit(s) to ${path}.`\n\t\t\t: replaceAll\n\t\t\t\t? `Successfully replaced all ${replacementCount} occurrence(s) in ${path}.`\n\t\t\t\t: `Successfully edited ${path}.`;\n\n\t\treturn respond\n\t\t\t.text(linterOutput ? `${resultMessage}\\n${linterOutput}` : resultMessage)\n\t\t\t.detail({\n\t\t\t\tdiff,\n\t\t\t\teditsApplied: hasMultiEdit ? replacementCount : undefined,\n\t\t\t\tvalidators: validatorSummaries,\n\t\t\t});\n\t},\n});\n\ntype MatchPreview = {\n\tline: number;\n\tsnippet: string;\n\tindex?: number;\n\tsimilarity?: number;\n};\n\nfunction findExactMatches(content: string, snippet: string): MatchPreview[] {\n\tconst matches: MatchPreview[] = [];\n\tlet index = content.indexOf(snippet);\n\twhile (index !== -1) {\n\t\tmatches.push({\n\t\t\tline: getLineNumber(content, index),\n\t\t\tsnippet: getSnippet(content, index, snippet.length),\n\t\t\tindex,\n\t\t});\n\t\tindex = content.indexOf(snippet, index + snippet.length);\n\t}\n\treturn matches;\n}\n\n/**\n * Levenshtein Distance Algorithm - Measures string similarity via edit operations\n *\n * Computes the minimum number of single-character edits (insertions, deletions,\n * or substitutions) required to transform string `a` into string `b`. This is\n * the classic dynamic programming solution, optimized for space efficiency.\n *\n * ## Algorithm Explanation\n *\n * The standard DP approach uses a 2D matrix where cell [i,j] represents the\n * edit distance between a[0..i-1] and b[0..j-1]. The recurrence relation:\n *\n * dist[i][j] = min(\n * dist[i-1][j] + 1, // deletion: remove char from a\n * dist[i][j-1] + 1, // insertion: add char to a\n * dist[i-1][j-1] + cost // substitution: cost=0 if chars match, else 1\n * )\n *\n * ## Space Optimization\n *\n * Since each row only depends on the previous row, we use two 1D arrays instead\n * of a full matrix. This reduces space complexity from O(m*n) to O(min(m,n)).\n *\n * - `prev`: the previous row of the DP matrix\n * - `curr`: the current row being computed\n * - After each outer loop iteration, we swap the arrays\n *\n * ## Complexity\n *\n * - Time: O(m * n) where m = len(a), n = len(b)\n * - Space: O(n) - only two arrays of length n+1\n *\n * ## Usage in Edit Tool\n *\n * This function powers the fuzzy matching fallback. When an exact match fails,\n * we compute Levenshtein distance between the search text and candidate regions\n * in the file, then convert to a similarity ratio (see `similarity()` below).\n *\n * @param a - First string to compare\n * @param b - Second string to compare\n * @returns The edit distance (0 = identical, higher = more different)\n */\nfunction levenshtein(a: string, b: string): number {\n\t// Base cases: if either string is empty, distance is the length of the other\n\tif (a.length === 0) return b.length;\n\tif (b.length === 0) return a.length;\n\n\t// Space-optimized DP: maintain only two rows instead of full matrix.\n\t// `prev` holds the distances computed for the previous character of `a`.\n\t// Initialize with distances from empty string: 0, 1, 2, ..., b.length\n\tlet prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n\tlet curr = new Array<number>(b.length + 1);\n\n\t// Iterate through each character of string `a`\n\tfor (let i = 1; i <= a.length; i++) {\n\t\t// Distance from a[0..i-1] to empty string is i (delete all chars)\n\t\tcurr[0] = i;\n\n\t\t// Iterate through each character of string `b`\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\t// Cost is 0 if characters match, 1 if they need substitution\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\n\t\t\t// Take minimum of three possible operations:\n\t\t\tcurr[j] = Math.min(\n\t\t\t\tprev[j]! + 1, // deletion: remove a[i-1], use distance for a[0..i-2] to b[0..j-1]\n\t\t\t\tcurr[j - 1]! + 1, // insertion: insert b[j-1], use distance for a[0..i-1] to b[0..j-2]\n\t\t\t\tprev[j - 1]! + cost, // substitution: use distance for a[0..i-2] to b[0..j-2] + substitution cost\n\t\t\t);\n\t\t}\n\t\t// Swap rows: current row becomes previous for next iteration\n\t\t[prev, curr] = [curr, prev];\n\t}\n\t// After all iterations, `prev` contains the final row (due to swap)\n\treturn prev[b.length]!;\n}\n\n/**\n * Similarity Ratio - Normalizes Levenshtein distance to a 0-1 scale\n *\n * Converts the raw edit distance into an intuitive percentage where:\n * - 1.0 = identical strings (0 edits needed)\n * - 0.0 = completely different (edit distance equals max string length)\n *\n * Formula: similarity = 1 - (edit_distance / max_length)\n *\n * This normalization is crucial because raw edit distance doesn't account\n * for string length. For example, an edit distance of 5 between two 100-char\n * strings (95% similar) is very different from distance 5 between two 6-char\n * strings (17% similar).\n *\n * @param a - First string to compare\n * @param b - Second string to compare\n * @returns Similarity ratio from 0 (completely different) to 1 (identical)\n */\nfunction similarity(a: string, b: string): number {\n\tconst maxLen = Math.max(a.length, b.length);\n\t// Two empty strings are identical\n\tif (maxLen === 0) return 1;\n\t// Normalize: 0 edits = 1.0 similarity, maxLen edits = 0.0 similarity\n\treturn 1 - levenshtein(a, b) / maxLen;\n}\n\n/**\n * Similarity Thresholds for Approximate Matching\n *\n * These thresholds control which fuzzy matches are shown to the user. They're\n * intentionally different based on context to balance helpfulness vs noise.\n *\n * ## Threshold Strategy\n *\n * **Single Candidate (50%)**: When only one potential match is found, we're\n * lenient because showing something is better than nothing. Even a 50% match\n * might be the reformatted/moved code the user is looking for.\n *\n * **Multiple Candidates (60%)**: When several matches exist, we're stricter\n * to avoid overwhelming the user with noise. A higher threshold ensures only\n * genuinely relevant suggestions surface.\n *\n * ## Why These Values?\n *\n * - 50% catches significant changes (indentation, variable renames, added lines)\n * while filtering out completely unrelated code\n * - 60% for multiple matches prevents showing 3+ mediocre suggestions that\n * confuse more than they help\n * - Values chosen empirically from real-world edit failure scenarios\n */\nconst SINGLE_CANDIDATE_THRESHOLD = 0.5; // Accept single match if 50%+ similar\nconst MULTI_CANDIDATE_THRESHOLD = 0.6; // Need 60%+ to show when multiple matches\n\n/**\n * Approximate Match Finder - Multi-strategy fuzzy search for similar text\n *\n * When exact matching fails, this function attempts to find regions in the file\n * that closely resemble the search snippet. It employs two complementary strategies\n * to maximize the chances of finding the right location even when the content\n * has changed.\n *\n * ## Strategy 1: Relaxed Regex Matching\n *\n * Creates a regex that normalizes whitespace (see `buildRelaxedRegex`), then\n * finds all matches in the content. This catches cases where:\n * - Indentation changed (tabs vs spaces, different indent levels)\n * - Extra blank lines were added/removed\n * - Line wrapping changed\n *\n * ## Strategy 2: Sliding Window Line Comparison\n *\n * For multi-line snippets, slides a window of the same size through the content\n * and computes Levenshtein similarity at each position. This catches cases where:\n * - Variables were renamed\n * - Minor code changes occurred (added parameters, changed values)\n * - Content was moved but not significantly altered\n *\n * ## Deduplication\n *\n * Both strategies may find the same region; we deduplicate by line number to\n * avoid showing duplicate suggestions.\n *\n * ## Result Limits\n *\n * - Maximum 10 candidates collected (performance guard)\n * - Maximum 5 shown to user (UI clarity)\n * - Dynamic threshold based on candidate count (see threshold constants above)\n *\n * @param content - The full file content to search in\n * @param snippet - The text the user is looking for\n * @returns Array of match previews sorted by similarity, filtered by threshold\n */\nfunction findApproximateMatches(\n\tcontent: string,\n\tsnippet: string,\n): MatchPreview[] {\n\t// Strategy 1: Regex-based matching with whitespace normalization\n\tconst relaxed = buildRelaxedRegex(snippet);\n\tconst regexMatches: Array<MatchPreview & { similarity: number }> = [];\n\n\tif (relaxed) {\n\t\tlet result: RegExpExecArray | null;\n\t\t// Limit to 10 matches to prevent performance issues in large files\n\t\twhile (regexMatches.length < 10) {\n\t\t\tresult = relaxed.exec(content);\n\t\t\tif (!result) break;\n\t\t\tconst matchIndex = result.index;\n\t\t\tconst matchText = result[0];\n\t\t\t// Score each regex match by actual similarity (regex may be too permissive)\n\t\t\tconst sim = similarity(snippet.trim(), matchText.trim());\n\t\t\tregexMatches.push({\n\t\t\t\tline: getLineNumber(content, matchIndex),\n\t\t\t\tsnippet: getSnippet(content, matchIndex, matchText.length),\n\t\t\t\tsimilarity: sim,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Strategy 2: Sliding window comparison for multi-line snippets\n\t// This catches renamed variables and minor changes that regex misses\n\tconst snippetLines = snippet.trim().split(\"\\n\");\n\tif (snippetLines.length > 1) {\n\t\tconst contentLines = content.split(\"\\n\");\n\t\t// Slide a window of size |snippetLines| through the content\n\t\tfor (let i = 0; i <= contentLines.length - snippetLines.length; i++) {\n\t\t\tconst candidateLines = contentLines.slice(i, i + snippetLines.length);\n\t\t\tconst candidate = candidateLines.join(\"\\n\");\n\t\t\tconst sim = similarity(snippet.trim(), candidate.trim());\n\t\t\t// Only consider if above the minimum threshold\n\t\t\tif (sim >= SINGLE_CANDIDATE_THRESHOLD) {\n\t\t\t\t// Deduplicate: don't add if we already found this line via regex\n\t\t\t\tconst lineNum = i + 1;\n\t\t\t\tif (!regexMatches.some((m) => m.line === lineNum)) {\n\t\t\t\t\tregexMatches.push({\n\t\t\t\t\t\tline: lineNum,\n\t\t\t\t\t\t// Show first 3 lines as preview to avoid overwhelming output\n\t\t\t\t\t\tsnippet: candidateLines.slice(0, 3).join(\"\\n\").trim(),\n\t\t\t\t\t\tsimilarity: sim,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Performance guard: stop after collecting 10 candidates\n\t\t\tif (regexMatches.length >= 10) break;\n\t\t}\n\t}\n\n\t// Sort all candidates by similarity (best matches first)\n\tregexMatches.sort((a, b) => b.similarity - a.similarity);\n\n\t// Apply dynamic threshold: stricter when many candidates exist\n\t// This prevents showing 5 mediocre matches when there's one good one\n\tconst threshold =\n\t\tregexMatches.length === 1\n\t\t\t? SINGLE_CANDIDATE_THRESHOLD\n\t\t\t: MULTI_CANDIDATE_THRESHOLD;\n\n\t// Return top 5 matches above threshold, stripping internal similarity score\n\treturn regexMatches\n\t\t.filter((m) => m.similarity >= threshold)\n\t\t.slice(0, 5)\n\t\t.map(({ line, snippet, similarity }) => ({ line, snippet, similarity }));\n}\n\n/**\n * Relaxed Regex Builder - Creates whitespace-normalized pattern for fuzzy matching\n *\n * Transforms a literal search string into a regex that matches the same content\n * with flexible whitespace. This is the first strategy in approximate matching.\n *\n * ## Transformation Steps\n *\n * 1. **Trim**: Remove leading/trailing whitespace (user likely copied extra)\n * 2. **Escape metacharacters**: Treat all regex special chars as literals\n * - Characters escaped: . * + ? ^ $ { } ( ) | [ ] \\\n * 3. **Normalize whitespace**: Replace all whitespace runs with `\\s+`\n * - Matches any combination of spaces, tabs, newlines\n * - Makes indentation changes transparent\n *\n * ## Example Transformation\n *\n * Input: \"function foo( a, b ) {\"\n * Regex: \"function\\s+foo\\(\\s+a,\\s+b\\s+\\)\\s+\\{\"\n * Matches: \"function foo(a, b) {\" or \"function foo( a, b ) {\"\n *\n * ## Safety Guards\n *\n * - Empty input → null (avoid matching everything)\n * - Pattern > 500 chars → null (prevent ReDoS on very long snippets)\n * - Invalid regex → null (graceful fallback to line-by-line comparison)\n *\n * @param snippet - The text to convert into a relaxed regex\n * @returns Compiled regex with 'gi' flags, or null if construction fails\n */\nfunction buildRelaxedRegex(snippet: string): RegExp | null {\n\tconst trimmed = snippet.trim();\n\t// Empty pattern would match everything - not useful\n\tif (!trimmed) return null;\n\n\t// Step 1: Escape all regex metacharacters so they match literally\n\t// This prevents \"user.name\" from being interpreted as \"user<any-char>name\"\n\tconst escaped = trimmed\n\t\t.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\t\t// Step 2: Replace whitespace runs with flexible matcher\n\t\t// This makes the pattern match regardless of indentation style\n\t\t.replace(/\\s+/g, \"\\\\s+\");\n\n\t// Guard against ReDoS: very long patterns can cause exponential backtracking\n\tif (escaped.length > 500) return null;\n\n\ttry {\n\t\t// nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n\t\t// Flags: g = global (find all), i = case-insensitive (catches renamed vars)\n\t\treturn new RegExp(escaped, \"gi\");\n\t} catch {\n\t\t// Invalid regex (shouldn't happen after escaping, but be safe)\n\t\treturn null;\n\t}\n}\n\nfunction getLineNumber(content: string, index: number): number {\n\treturn content.slice(0, index).split(\"\\n\").length;\n}\n\nfunction getSnippet(content: string, start: number, _length: number): string {\n\tconst lines = content.split(\"\\n\");\n\tconst lineNum = getLineNumber(content, start);\n\tconst startLine = Math.max(0, lineNum - 2);\n\tconst endLine = Math.min(lines.length, lineNum + 1);\n\treturn lines.slice(startLine, endLine).join(\"\\n\").trim();\n}\n\nfunction formatMatchPreview(match: MatchPreview): string {\n\tconst simPct = match.similarity\n\t\t? ` (${Math.round(match.similarity * 100)}% similar)`\n\t\t: \"\";\n\treturn `• Line ${match.line}${simPct}: ${match.snippet}`;\n}\n"]}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Edit Tool - Find-and-replace text editing with fuzzy matching fallback\n *\n * This module implements a robust text editing tool that performs exact string\n * replacement with intelligent fallback to approximate matching when exact matches\n * fail. The core design philosophy is \"fail helpfully\" - when the user's search\n * text doesn't match exactly (due to whitespace differences, typos, or outdated\n * content), we provide actionable suggestions pointing to the closest matches.\n *\n * ## Architecture Overview\n *\n * 1. **Exact Matching (Primary Path)**\n * - Simple string indexOf search for O(n) performance\n * - Handles single edit, multi-edit (sequential), and replace-all modes\n * - Reports all match locations with line numbers for disambiguation\n *\n * 2. **Approximate Matching (Fallback Path)**\n * - Triggered only when exact match fails\n * - Uses two complementary strategies:\n * a) Regex-based relaxed matching (whitespace normalization)\n * b) Line-by-line Levenshtein similarity scoring\n * - Results sorted by similarity score, filtered by threshold\n *\n * 3. **Similarity Scoring**\n * - Levenshtein distance normalized to 0-1 similarity ratio\n * - Dual thresholds: 50% for single candidates, 60% for multiple\n * - Prevents noise while surfacing genuinely close matches\n *\n * ## Key Design Decisions\n *\n * - **Atomic writes**: Uses temp file + rename for crash safety\n * - **Multi-edit mode**: Applies edits sequentially for deterministic results\n * - **LSP integration**: Collects diagnostics after edits for immediate feedback\n * - **Sandbox support**: Operates through sandbox abstraction when available\n *\n * @module tools/edit\n */\n\nimport crypto from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n\tcaptureDiagnosticBaseline,\n\tcollectDiagnosticDelta,\n} from \"../lsp/diagnostic-deltas.js\";\nimport {\n\ttype DiagnosticDeltaToolSummary,\n\tbuildDiagnosticDeltaToolSummary,\n\tformatDiagnosticDeltaForToolOutput,\n} from \"../lsp/diagnostic-repair.js\";\nimport { assertTeamMemoryContentSafe } from \"../memory/team-memory.js\";\nimport {\n\trequirePlanCheck,\n\trunValidatorsOnSuccess,\n} from \"../safety/safe-mode.js\";\nimport type { ValidatorRunResult } from \"../safety/safe-mode.js\";\nimport { formatLspDiagnostics, generateDiffString } from \"./diff-utils.js\";\nimport { createTool, expandUserPath } from \"./tool-dsl.js\";\n\nasync function writeFileAtomically(\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> {\n\tconst tempPath = `${filePath}.${crypto.randomUUID()}.tmp`;\n\tawait writeFile(tempPath, contents, \"utf-8\");\n\ttry {\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\tawait unlink(tempPath).catch(() => {});\n\t\tthrow error;\n\t}\n}\n\n/** Diff support lives in diff-utils for reuse */\n\ntype LineEnding = \"\\n\" | \"\\r\\n\" | \"\\r\";\n\ntype NormalizedDocument = {\n\toriginal: string;\n\tnormalized: string;\n\tbom: string;\n\tlineEnding: LineEnding;\n};\n\nfunction detectLineEnding(text: string): LineEnding {\n\tif (text.includes(\"\\r\\n\")) return \"\\r\\n\";\n\tif (text.includes(\"\\r\")) return \"\\r\";\n\treturn \"\\n\";\n}\n\nfunction normalizeDocument(content: string): NormalizedDocument {\n\tconst bom = content.startsWith(\"\\uFEFF\") ? \"\\uFEFF\" : \"\";\n\tconst withoutBom = bom ? content.slice(1) : content;\n\tconst lineEnding = detectLineEnding(withoutBom);\n\tconst normalized = withoutBom.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\treturn { original: content, normalized, bom, lineEnding };\n}\n\nfunction normalizeEditText(text: string | undefined): string | undefined {\n\tif (text === undefined) return undefined;\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction restoreDocumentContent(\n\tnormalized: string,\n\tdocument: NormalizedDocument,\n): string {\n\tconst restored =\n\t\tdocument.lineEnding === \"\\n\"\n\t\t\t? normalized\n\t\t\t: normalized.replace(/\\n/g, document.lineEnding);\n\treturn `${document.bom}${restored}`;\n}\n\nconst editOperationSchema = Type.Object({\n\toldText: Type.String({\n\t\tdescription: \"Exact text to find and replace\",\n\t\tminLength: 1,\n\t}),\n\tnewText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Replacement text (omit or empty string to delete)\",\n\t\t\tdefault: \"\",\n\t\t}),\n\t),\n});\n\nconst editSchema = Type.Object({\n\tpath: Type.String({\n\t\tdescription: \"Path to the file to edit (relative or absolute)\",\n\t\tminLength: 1,\n\t}),\n\toldText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Exact text to find and replace (must match exactly)\",\n\t\t\tminLength: 1,\n\t\t}),\n\t),\n\tnewText: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"New text to replace the old text with\",\n\t\t\tdefault: \"\",\n\t\t}),\n\t),\n\tedits: Type.Optional(\n\t\tType.Array(editOperationSchema, {\n\t\t\tdescription:\n\t\t\t\t\"Multiple edits to apply sequentially (alternative to oldText/newText)\",\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 50,\n\t\t}),\n\t),\n\treplaceAll: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Replace all occurrences (useful for variable renaming). Cannot be used with occurrence or edits.\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\toccurrence: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription:\n\t\t\t\t\"Which occurrence of the text to replace (1-based). Cannot be used with replaceAll or edits.\",\n\t\t\tminimum: 1,\n\t\t\tdefault: 1,\n\t\t}),\n\t),\n\tdryRun: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Preview the diff without writing changes\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n});\n\ntype EditToolDetails = {\n\tdiff: string;\n\teditsApplied?: number;\n\tvalidators?: ValidatorRunResult[];\n\tdiagnosticDelta?: DiagnosticDeltaToolSummary;\n\tmode?: \"sandbox\";\n};\n\nexport const editTool = createTool<typeof editSchema, EditToolDetails>({\n\tname: \"edit\",\n\tlabel: \"edit\",\n\tdescription: `Edit files with find-and-replace. oldText must match exactly (whitespace, indentation, newlines).\n\nParameters:\n- path: File path\n- oldText/newText: Single edit (text to find and replacement)\n- edits: Array of {oldText, newText} for multiple sequential edits (1-50)\n- replaceAll: Replace all occurrences (default: false). For single edit only.\n- occurrence: Which match (default: 1). For single edit only.\n- dryRun: Preview only (default: false)\n\nUse either oldText/newText OR edits array, not both.\n\nBest practices:\n- Read file first to verify exact formatting\n- Include context (5-10 lines) for uniqueness\n- Match indentation style (tabs vs spaces)\n- Use dryRun for complex edits\n- Use edits array for multiple related changes (atomic)\n\nIf \"not found\", read file to check actual content.`,\n\tschema: editSchema,\n\tasync run(\n\t\t{\n\t\t\tpath,\n\t\t\toldText,\n\t\t\tnewText,\n\t\t\tedits,\n\t\t\treplaceAll = false,\n\t\t\toccurrence = 1,\n\t\t\tdryRun = false,\n\t\t},\n\t\t{ signal, respond, sandbox },\n\t) {\n\t\trequirePlanCheck(\"edit\");\n\n\t\tconst absolutePath = resolvePath(expandUserPath(path));\n\t\tconst throwIfAborted = () => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t}\n\t\t};\n\n\t\t// Validate mutually exclusive parameters\n\t\tconst hasSingleEdit = oldText !== undefined;\n\t\t// newText with non-empty value alongside edits array is an error\n\t\t// (empty string is allowed as it's the default and harmless)\n\t\tconst hasExplicitNewText = newText !== undefined && newText !== \"\";\n\t\tconst hasMultiEdit = edits !== undefined && edits.length > 0;\n\n\t\tif ((hasSingleEdit || hasExplicitNewText) && hasMultiEdit) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use both oldText/newText and edits array. Use one or the other.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!hasSingleEdit && !hasMultiEdit) {\n\t\t\tthrow new Error(\"Must provide either oldText/newText or edits array.\");\n\t\t}\n\n\t\tif (hasMultiEdit && (replaceAll || occurrence !== 1)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use replaceAll or occurrence with edits array. These options only apply to single edits.\",\n\t\t\t);\n\t\t}\n\n\t\tif (replaceAll && occurrence !== 1) {\n\t\t\tthrow new Error(\"Cannot use both replaceAll and occurrence.\");\n\t\t}\n\n\t\tconst normalizedOldText = normalizeEditText(oldText);\n\t\tconst normalizedNewText = normalizeEditText(newText);\n\t\tconst normalizedEdits = edits?.map((edit) => ({\n\t\t\t...edit,\n\t\t\toldText: normalizeEditText(edit.oldText) ?? \"\",\n\t\t\tnewText: normalizeEditText(edit.newText),\n\t\t}));\n\n\t\t// Helper to apply edits to content (shared between sandbox and normal mode)\n\t\tconst applyEdits = (\n\t\t\toriginalContent: string,\n\t\t): { newContent: string; replacementCount: number } => {\n\t\t\tif (hasMultiEdit && normalizedEdits) {\n\t\t\t\tlet content = originalContent;\n\t\t\t\tlet editsApplied = 0;\n\t\t\t\tfor (const [index, edit] of normalizedEdits.entries()) {\n\t\t\t\t\tconst matches = findExactMatches(content, edit.oldText);\n\t\t\t\t\tif (matches.length === 0) {\n\t\t\t\t\t\tconst approx = findApproximateMatches(content, edit.oldText);\n\t\t\t\t\t\tconst suggestion = approx.length\n\t\t\t\t\t\t\t? `\\n\\nPossible matches:\\n${approx.slice(0, 3).map(formatMatchPreview).join(\"\\n\")}`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Edit #${index + 1}: Could not find text after ${editsApplied} prior edit(s).${suggestion}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (matches.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Edit #${index + 1}: Found ${matches.length} matches for oldText. Provide more context. Matches at lines: ${matches.map((m) => m.line).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst matchIndex = matches[0]?.index ?? 0;\n\t\t\t\t\tcontent =\n\t\t\t\t\t\tcontent.slice(0, matchIndex) +\n\t\t\t\t\t\t(edit.newText ?? \"\") +\n\t\t\t\t\t\tcontent.slice(matchIndex + edit.oldText.length);\n\t\t\t\t\teditsApplied++;\n\t\t\t\t}\n\t\t\t\treturn { newContent: content, replacementCount: editsApplied };\n\t\t\t}\n\t\t\t// Single edit mode\n\t\t\tif (!normalizedOldText || normalizedOldText.length === 0) {\n\t\t\t\tthrow new Error(\"oldText cannot be empty\");\n\t\t\t}\n\t\t\tconst exactMatches = findExactMatches(originalContent, normalizedOldText);\n\t\t\tif (exactMatches.length === 0) {\n\t\t\t\tconst approx = findApproximateMatches(\n\t\t\t\t\toriginalContent,\n\t\t\t\t\tnormalizedOldText,\n\t\t\t\t);\n\t\t\t\tconst suggestion = approx.length\n\t\t\t\t\t? `\\n\\nPossible matches:\\n${approx.slice(0, 3).map(formatMatchPreview).join(\"\\n\")}`\n\t\t\t\t\t: `\\n\\nTip: double-check whitespace/newlines via /diff ${path}`;\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not find the exact text in ${path}.${suggestion}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (replaceAll) {\n\t\t\t\tif (exactMatches.length > 10000) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Too many replacements: ${exactMatches.length} (max 10000).`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tnewContent: originalContent.replaceAll(\n\t\t\t\t\t\tnormalizedOldText,\n\t\t\t\t\t\tnormalizedNewText ?? \"\",\n\t\t\t\t\t),\n\t\t\t\t\treplacementCount: exactMatches.length,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (occurrence > exactMatches.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Only ${exactMatches.length} occurrence(s) found, but #${occurrence} requested.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst targetMatch = exactMatches[occurrence - 1]!;\n\t\t\tconst matchIndex = targetMatch.index ?? 0;\n\t\t\treturn {\n\t\t\t\tnewContent:\n\t\t\t\t\toriginalContent.slice(0, matchIndex) +\n\t\t\t\t\t(normalizedNewText ?? \"\") +\n\t\t\t\t\toriginalContent.slice(matchIndex + normalizedOldText.length),\n\t\t\t\treplacementCount: 1,\n\t\t\t};\n\t\t};\n\n\t\t// Use sandbox if available\n\t\tif (sandbox) {\n\t\t\ttry {\n\t\t\t\tconst exists = await sandbox.exists(path);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthrow new Error(`File not found in sandbox: ${path}`);\n\t\t\t\t}\n\t\t\t\tconst originalContent = await sandbox.readFile(path);\n\t\t\t\tconst document = normalizeDocument(originalContent);\n\t\t\t\tconst { newContent: normalizedNewContent, replacementCount } =\n\t\t\t\t\tapplyEdits(document.normalized);\n\t\t\t\tconst newContent = restoreDocumentContent(\n\t\t\t\t\tnormalizedNewContent,\n\t\t\t\t\tdocument,\n\t\t\t\t);\n\t\t\t\tassertTeamMemoryContentSafe(absolutePath, newContent);\n\t\t\t\tconst diff = generateDiffString(originalContent, newContent);\n\n\t\t\t\tif (!dryRun) {\n\t\t\t\t\tawait sandbox.writeFile(path, newContent);\n\t\t\t\t}\n\n\t\t\t\treturn respond\n\t\t\t\t\t.text(\n\t\t\t\t\t\tdryRun\n\t\t\t\t\t\t\t? `[DRY RUN] Would apply ${replacementCount} edit(s) to ${path} in sandbox`\n\t\t\t\t\t\t\t: `Applied ${replacementCount} edit(s) to ${path} in sandbox`,\n\t\t\t\t\t)\n\t\t\t\t\t.detail({ diff, editsApplied: replacementCount, mode: \"sandbox\" });\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof Error) throw err;\n\t\t\t\tthrow new Error(String(err));\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait access(absolutePath, constants.R_OK | constants.W_OK);\n\t\t} catch {\n\t\t\t// Provide helpful hint\n\t\t\tlet hint = \"\";\n\t\t\tif (path.includes(\"//\")) {\n\t\t\t\thint = \" Hint: path contains double slashes.\";\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`File not found: ${path}.${hint} Use 'read' to verify the path exists.`,\n\t\t\t);\n\t\t}\n\n\t\tthrowIfAborted();\n\t\tconst originalContent = await readFile(absolutePath, \"utf-8\");\n\t\tthrowIfAborted();\n\t\tconst document = normalizeDocument(originalContent);\n\t\tconst { newContent: normalizedNewContent, replacementCount } = applyEdits(\n\t\t\tdocument.normalized,\n\t\t);\n\t\tconst newContent = restoreDocumentContent(normalizedNewContent, document);\n\t\tassertTeamMemoryContentSafe(absolutePath, newContent);\n\t\tconst diff = generateDiffString(originalContent, newContent);\n\n\t\tif (dryRun) {\n\t\t\tconst modeDesc = hasMultiEdit\n\t\t\t\t? `${replacementCount} edit(s)`\n\t\t\t\t: replaceAll\n\t\t\t\t\t? \"all occurrences\"\n\t\t\t\t\t: `occurrence #${occurrence}`;\n\t\t\treturn respond\n\t\t\t\t.text(`Dry run: preview for ${path} (${modeDesc}). No changes written.`)\n\t\t\t\t.detail({\n\t\t\t\t\tdiff,\n\t\t\t\t\teditsApplied: hasMultiEdit ? replacementCount : undefined,\n\t\t\t\t});\n\t\t}\n\n\t\tconst diagnosticBaseline = await captureDiagnosticBaseline(absolutePath);\n\t\tthrowIfAborted();\n\n\t\tawait writeFileAtomically(absolutePath, newContent);\n\t\tlet validatorSummaries: ValidatorRunResult[] | undefined;\n\t\tlet linterOutput = \"\";\n\t\tlet diagnosticDeltaSummary: DiagnosticDeltaToolSummary | undefined;\n\t\ttry {\n\t\t\tconst diagnosticDelta = await collectDiagnosticDelta(diagnosticBaseline);\n\t\t\tdiagnosticDeltaSummary = buildDiagnosticDeltaToolSummary({\n\t\t\t\tfile: absolutePath,\n\t\t\t\tdisplayPath: path,\n\t\t\t\tresult: diagnosticDelta,\n\t\t\t});\n\t\t\tconst visibleDiagnostics = diagnosticDelta.usedDelta\n\t\t\t\t? diagnosticDelta.newDiagnostics\n\t\t\t\t: diagnosticDelta.fileDiagnostics;\n\t\t\tif (visibleDiagnostics.length > 0) {\n\t\t\t\tlinterOutput = formatLspDiagnostics(path, visibleDiagnostics);\n\t\t\t}\n\t\t\tvalidatorSummaries = await runValidatorsOnSuccess(\n\t\t\t\t[absolutePath],\n\t\t\t\tdiagnosticDelta.validatorDiagnostics,\n\t\t\t);\n\t\t} catch (validatorError) {\n\t\t\tawait writeFileAtomically(absolutePath, originalContent);\n\t\t\tthrow validatorError;\n\t\t}\n\n\t\tthrowIfAborted();\n\n\t\tconst resultMessage = hasMultiEdit\n\t\t\t? `Successfully applied ${replacementCount} edit(s) to ${path}.`\n\t\t\t: replaceAll\n\t\t\t\t? `Successfully replaced all ${replacementCount} occurrence(s) in ${path}.`\n\t\t\t\t: `Successfully edited ${path}.`;\n\n\t\treturn respond\n\t\t\t.text(\n\t\t\t\t[\n\t\t\t\t\tresultMessage,\n\t\t\t\t\tlinterOutput,\n\t\t\t\t\tdiagnosticDeltaSummary\n\t\t\t\t\t\t? formatDiagnosticDeltaForToolOutput(diagnosticDeltaSummary)\n\t\t\t\t\t\t: \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t)\n\t\t\t.detail({\n\t\t\t\tdiff,\n\t\t\t\teditsApplied: hasMultiEdit ? replacementCount : undefined,\n\t\t\t\tvalidators: validatorSummaries,\n\t\t\t\tdiagnosticDelta: diagnosticDeltaSummary,\n\t\t\t});\n\t},\n});\n\ntype MatchPreview = {\n\tline: number;\n\tsnippet: string;\n\tindex?: number;\n\tsimilarity?: number;\n};\n\nfunction findExactMatches(content: string, snippet: string): MatchPreview[] {\n\tconst matches: MatchPreview[] = [];\n\tlet index = content.indexOf(snippet);\n\twhile (index !== -1) {\n\t\tmatches.push({\n\t\t\tline: getLineNumber(content, index),\n\t\t\tsnippet: getSnippet(content, index, snippet.length),\n\t\t\tindex,\n\t\t});\n\t\tindex = content.indexOf(snippet, index + snippet.length);\n\t}\n\treturn matches;\n}\n\n/**\n * Levenshtein Distance Algorithm - Measures string similarity via edit operations\n *\n * Computes the minimum number of single-character edits (insertions, deletions,\n * or substitutions) required to transform string `a` into string `b`. This is\n * the classic dynamic programming solution, optimized for space efficiency.\n *\n * ## Algorithm Explanation\n *\n * The standard DP approach uses a 2D matrix where cell [i,j] represents the\n * edit distance between a[0..i-1] and b[0..j-1]. The recurrence relation:\n *\n * dist[i][j] = min(\n * dist[i-1][j] + 1, // deletion: remove char from a\n * dist[i][j-1] + 1, // insertion: add char to a\n * dist[i-1][j-1] + cost // substitution: cost=0 if chars match, else 1\n * )\n *\n * ## Space Optimization\n *\n * Since each row only depends on the previous row, we use two 1D arrays instead\n * of a full matrix. This reduces space complexity from O(m*n) to O(min(m,n)).\n *\n * - `prev`: the previous row of the DP matrix\n * - `curr`: the current row being computed\n * - After each outer loop iteration, we swap the arrays\n *\n * ## Complexity\n *\n * - Time: O(m * n) where m = len(a), n = len(b)\n * - Space: O(n) - only two arrays of length n+1\n *\n * ## Usage in Edit Tool\n *\n * This function powers the fuzzy matching fallback. When an exact match fails,\n * we compute Levenshtein distance between the search text and candidate regions\n * in the file, then convert to a similarity ratio (see `similarity()` below).\n *\n * @param a - First string to compare\n * @param b - Second string to compare\n * @returns The edit distance (0 = identical, higher = more different)\n */\nfunction levenshtein(a: string, b: string): number {\n\t// Base cases: if either string is empty, distance is the length of the other\n\tif (a.length === 0) return b.length;\n\tif (b.length === 0) return a.length;\n\n\t// Space-optimized DP: maintain only two rows instead of full matrix.\n\t// `prev` holds the distances computed for the previous character of `a`.\n\t// Initialize with distances from empty string: 0, 1, 2, ..., b.length\n\tlet prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n\tlet curr = new Array<number>(b.length + 1);\n\n\t// Iterate through each character of string `a`\n\tfor (let i = 1; i <= a.length; i++) {\n\t\t// Distance from a[0..i-1] to empty string is i (delete all chars)\n\t\tcurr[0] = i;\n\n\t\t// Iterate through each character of string `b`\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\t// Cost is 0 if characters match, 1 if they need substitution\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\n\t\t\t// Take minimum of three possible operations:\n\t\t\tcurr[j] = Math.min(\n\t\t\t\tprev[j]! + 1, // deletion: remove a[i-1], use distance for a[0..i-2] to b[0..j-1]\n\t\t\t\tcurr[j - 1]! + 1, // insertion: insert b[j-1], use distance for a[0..i-1] to b[0..j-2]\n\t\t\t\tprev[j - 1]! + cost, // substitution: use distance for a[0..i-2] to b[0..j-2] + substitution cost\n\t\t\t);\n\t\t}\n\t\t// Swap rows: current row becomes previous for next iteration\n\t\t[prev, curr] = [curr, prev];\n\t}\n\t// After all iterations, `prev` contains the final row (due to swap)\n\treturn prev[b.length]!;\n}\n\n/**\n * Similarity Ratio - Normalizes Levenshtein distance to a 0-1 scale\n *\n * Converts the raw edit distance into an intuitive percentage where:\n * - 1.0 = identical strings (0 edits needed)\n * - 0.0 = completely different (edit distance equals max string length)\n *\n * Formula: similarity = 1 - (edit_distance / max_length)\n *\n * This normalization is crucial because raw edit distance doesn't account\n * for string length. For example, an edit distance of 5 between two 100-char\n * strings (95% similar) is very different from distance 5 between two 6-char\n * strings (17% similar).\n *\n * @param a - First string to compare\n * @param b - Second string to compare\n * @returns Similarity ratio from 0 (completely different) to 1 (identical)\n */\nfunction similarity(a: string, b: string): number {\n\tconst maxLen = Math.max(a.length, b.length);\n\t// Two empty strings are identical\n\tif (maxLen === 0) return 1;\n\t// Normalize: 0 edits = 1.0 similarity, maxLen edits = 0.0 similarity\n\treturn 1 - levenshtein(a, b) / maxLen;\n}\n\n/**\n * Similarity Thresholds for Approximate Matching\n *\n * These thresholds control which fuzzy matches are shown to the user. They're\n * intentionally different based on context to balance helpfulness vs noise.\n *\n * ## Threshold Strategy\n *\n * **Single Candidate (50%)**: When only one potential match is found, we're\n * lenient because showing something is better than nothing. Even a 50% match\n * might be the reformatted/moved code the user is looking for.\n *\n * **Multiple Candidates (60%)**: When several matches exist, we're stricter\n * to avoid overwhelming the user with noise. A higher threshold ensures only\n * genuinely relevant suggestions surface.\n *\n * ## Why These Values?\n *\n * - 50% catches significant changes (indentation, variable renames, added lines)\n * while filtering out completely unrelated code\n * - 60% for multiple matches prevents showing 3+ mediocre suggestions that\n * confuse more than they help\n * - Values chosen empirically from real-world edit failure scenarios\n */\nconst SINGLE_CANDIDATE_THRESHOLD = 0.5; // Accept single match if 50%+ similar\nconst MULTI_CANDIDATE_THRESHOLD = 0.6; // Need 60%+ to show when multiple matches\n\n/**\n * Approximate Match Finder - Multi-strategy fuzzy search for similar text\n *\n * When exact matching fails, this function attempts to find regions in the file\n * that closely resemble the search snippet. It employs two complementary strategies\n * to maximize the chances of finding the right location even when the content\n * has changed.\n *\n * ## Strategy 1: Relaxed Regex Matching\n *\n * Creates a regex that normalizes whitespace (see `buildRelaxedRegex`), then\n * finds all matches in the content. This catches cases where:\n * - Indentation changed (tabs vs spaces, different indent levels)\n * - Extra blank lines were added/removed\n * - Line wrapping changed\n *\n * ## Strategy 2: Sliding Window Line Comparison\n *\n * For multi-line snippets, slides a window of the same size through the content\n * and computes Levenshtein similarity at each position. This catches cases where:\n * - Variables were renamed\n * - Minor code changes occurred (added parameters, changed values)\n * - Content was moved but not significantly altered\n *\n * ## Deduplication\n *\n * Both strategies may find the same region; we deduplicate by line number to\n * avoid showing duplicate suggestions.\n *\n * ## Result Limits\n *\n * - Maximum 10 candidates collected (performance guard)\n * - Maximum 5 shown to user (UI clarity)\n * - Dynamic threshold based on candidate count (see threshold constants above)\n *\n * @param content - The full file content to search in\n * @param snippet - The text the user is looking for\n * @returns Array of match previews sorted by similarity, filtered by threshold\n */\nfunction findApproximateMatches(\n\tcontent: string,\n\tsnippet: string,\n): MatchPreview[] {\n\t// Strategy 1: Regex-based matching with whitespace normalization\n\tconst relaxed = buildRelaxedRegex(snippet);\n\tconst regexMatches: Array<MatchPreview & { similarity: number }> = [];\n\n\tif (relaxed) {\n\t\tlet result: RegExpExecArray | null;\n\t\t// Limit to 10 matches to prevent performance issues in large files\n\t\twhile (regexMatches.length < 10) {\n\t\t\tresult = relaxed.exec(content);\n\t\t\tif (!result) break;\n\t\t\tconst matchIndex = result.index;\n\t\t\tconst matchText = result[0];\n\t\t\t// Score each regex match by actual similarity (regex may be too permissive)\n\t\t\tconst sim = similarity(snippet.trim(), matchText.trim());\n\t\t\tregexMatches.push({\n\t\t\t\tline: getLineNumber(content, matchIndex),\n\t\t\t\tsnippet: getSnippet(content, matchIndex, matchText.length),\n\t\t\t\tsimilarity: sim,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Strategy 2: Sliding window comparison for multi-line snippets\n\t// This catches renamed variables and minor changes that regex misses\n\tconst snippetLines = snippet.trim().split(\"\\n\");\n\tif (snippetLines.length > 1) {\n\t\tconst contentLines = content.split(\"\\n\");\n\t\t// Slide a window of size |snippetLines| through the content\n\t\tfor (let i = 0; i <= contentLines.length - snippetLines.length; i++) {\n\t\t\tconst candidateLines = contentLines.slice(i, i + snippetLines.length);\n\t\t\tconst candidate = candidateLines.join(\"\\n\");\n\t\t\tconst sim = similarity(snippet.trim(), candidate.trim());\n\t\t\t// Only consider if above the minimum threshold\n\t\t\tif (sim >= SINGLE_CANDIDATE_THRESHOLD) {\n\t\t\t\t// Deduplicate: don't add if we already found this line via regex\n\t\t\t\tconst lineNum = i + 1;\n\t\t\t\tif (!regexMatches.some((m) => m.line === lineNum)) {\n\t\t\t\t\tregexMatches.push({\n\t\t\t\t\t\tline: lineNum,\n\t\t\t\t\t\t// Show first 3 lines as preview to avoid overwhelming output\n\t\t\t\t\t\tsnippet: candidateLines.slice(0, 3).join(\"\\n\").trim(),\n\t\t\t\t\t\tsimilarity: sim,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Performance guard: stop after collecting 10 candidates\n\t\t\tif (regexMatches.length >= 10) break;\n\t\t}\n\t}\n\n\t// Sort all candidates by similarity (best matches first)\n\tregexMatches.sort((a, b) => b.similarity - a.similarity);\n\n\t// Apply dynamic threshold: stricter when many candidates exist\n\t// This prevents showing 5 mediocre matches when there's one good one\n\tconst threshold =\n\t\tregexMatches.length === 1\n\t\t\t? SINGLE_CANDIDATE_THRESHOLD\n\t\t\t: MULTI_CANDIDATE_THRESHOLD;\n\n\t// Return top 5 matches above threshold, stripping internal similarity score\n\treturn regexMatches\n\t\t.filter((m) => m.similarity >= threshold)\n\t\t.slice(0, 5)\n\t\t.map(({ line, snippet, similarity }) => ({ line, snippet, similarity }));\n}\n\n/**\n * Relaxed Regex Builder - Creates whitespace-normalized pattern for fuzzy matching\n *\n * Transforms a literal search string into a regex that matches the same content\n * with flexible whitespace. This is the first strategy in approximate matching.\n *\n * ## Transformation Steps\n *\n * 1. **Trim**: Remove leading/trailing whitespace (user likely copied extra)\n * 2. **Escape metacharacters**: Treat all regex special chars as literals\n * - Characters escaped: . * + ? ^ $ { } ( ) | [ ] \\\n * 3. **Normalize whitespace**: Replace all whitespace runs with `\\s+`\n * - Matches any combination of spaces, tabs, newlines\n * - Makes indentation changes transparent\n *\n * ## Example Transformation\n *\n * Input: \"function foo( a, b ) {\"\n * Regex: \"function\\s+foo\\(\\s+a,\\s+b\\s+\\)\\s+\\{\"\n * Matches: \"function foo(a, b) {\" or \"function foo( a, b ) {\"\n *\n * ## Safety Guards\n *\n * - Empty input → null (avoid matching everything)\n * - Pattern > 500 chars → null (prevent ReDoS on very long snippets)\n * - Invalid regex → null (graceful fallback to line-by-line comparison)\n *\n * @param snippet - The text to convert into a relaxed regex\n * @returns Compiled regex with 'gi' flags, or null if construction fails\n */\nfunction buildRelaxedRegex(snippet: string): RegExp | null {\n\tconst trimmed = snippet.trim();\n\t// Empty pattern would match everything - not useful\n\tif (!trimmed) return null;\n\n\t// Step 1: Escape all regex metacharacters so they match literally\n\t// This prevents \"user.name\" from being interpreted as \"user<any-char>name\"\n\tconst escaped = trimmed\n\t\t.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\t\t// Step 2: Replace whitespace runs with flexible matcher\n\t\t// This makes the pattern match regardless of indentation style\n\t\t.replace(/\\s+/g, \"\\\\s+\");\n\n\t// Guard against ReDoS: very long patterns can cause exponential backtracking\n\tif (escaped.length > 500) return null;\n\n\ttry {\n\t\t// nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n\t\t// Flags: g = global (find all), i = case-insensitive (catches renamed vars)\n\t\treturn new RegExp(escaped, \"gi\");\n\t} catch {\n\t\t// Invalid regex (shouldn't happen after escaping, but be safe)\n\t\treturn null;\n\t}\n}\n\nfunction getLineNumber(content: string, index: number): number {\n\treturn content.slice(0, index).split(\"\\n\").length;\n}\n\nfunction getSnippet(content: string, start: number, _length: number): string {\n\tconst lines = content.split(\"\\n\");\n\tconst lineNum = getLineNumber(content, start);\n\tconst startLine = Math.max(0, lineNum - 2);\n\tconst endLine = Math.min(lines.length, lineNum + 1);\n\treturn lines.slice(startLine, endLine).join(\"\\n\").trim();\n}\n\nfunction formatMatchPreview(match: MatchPreview): string {\n\tconst simPct = match.similarity\n\t\t? ` (${Math.round(match.similarity * 100)}% similar)`\n\t\t: \"\";\n\treturn `• Line ${match.line}${simPct}: ${match.snippet}`;\n}\n"]}
@@ -215,6 +215,11 @@ export declare const codingTools: (Readonly<{
215
215
  options: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
216
216
  label: import("@sinclair/typebox").TString;
217
217
  description: import("@sinclair/typebox").TString;
218
+ preview: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
219
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"markdown">, import("@sinclair/typebox").TLiteral<"text">, import("@sinclair/typebox").TLiteral<"diff">]>;
220
+ title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
221
+ body: import("@sinclair/typebox").TString;
222
+ }>>;
218
223
  }>>;
219
224
  multiSelect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
220
225
  }>>;
@@ -409,11 +414,13 @@ export declare const codingTools: (Readonly<{
409
414
  diff: string;
410
415
  editsApplied?: number;
411
416
  validators?: import("../safety/safe-mode.js").ValidatorRunResult[];
417
+ diagnosticDelta?: import("../lsp/diagnostic-repair.js").DiagnosticDeltaToolSummary;
412
418
  mode?: "sandbox";
413
419
  }> | undefined) => Promise<import("../agent/types.js").AgentToolResult<{
414
420
  diff: string;
415
421
  editsApplied?: number;
416
422
  validators?: import("../safety/safe-mode.js").ValidatorRunResult[];
423
+ diagnosticDelta?: import("../lsp/diagnostic-repair.js").DiagnosticDeltaToolSummary;
417
424
  mode?: "sandbox";
418
425
  }>>;
419
426
  }> | Readonly<{
@@ -541,6 +548,7 @@ export declare const codingTools: (Readonly<{
541
548
  diff?: string;
542
549
  backupPath?: string;
543
550
  validators?: import("../safety/safe-mode.js").ValidatorRunResult[];
551
+ diagnosticDelta?: import("../lsp/diagnostic-repair.js").DiagnosticDeltaToolSummary;
544
552
  mode?: "sandbox";
545
553
  }> | undefined) => Promise<import("../agent/types.js").AgentToolResult<{
546
554
  previousExists?: boolean;
@@ -548,6 +556,7 @@ export declare const codingTools: (Readonly<{
548
556
  diff?: string;
549
557
  backupPath?: string;
550
558
  validators?: import("../safety/safe-mode.js").ValidatorRunResult[];
559
+ diagnosticDelta?: import("../lsp/diagnostic-repair.js").DiagnosticDeltaToolSummary;
551
560
  mode?: "sandbox";
552
561
  }>>;
553
562
  }> | Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/tools/pipeline.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAsLD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IAC1C,KAAK,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;EAmErC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAkElC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDnC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDlC,CAAC"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/tools/pipeline.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAuMD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IAC1C,KAAK,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;EAmErC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAkElC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDnC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDlC,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { Type } from "@sinclair/typebox";
3
+ import { fetchDownstream } from "../utils/downstream-http.js";
3
4
  import { createTool } from "./tool-dsl.js";
5
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
6
+ const DEFAULT_MAX_ATTEMPTS = 2;
4
7
  function getPipelineConfig() {
5
8
  const apiUrl = process.env.PIPELINE_API_URL?.trim();
6
9
  const token = process.env.PIPELINE_SERVICE_TOKEN?.trim();
@@ -9,19 +12,20 @@ function getPipelineConfig() {
9
12
  }
10
13
  return {
11
14
  apiUrl: apiUrl.replace(/\/+$/, ""),
15
+ maxAttempts: parsePositiveInt(process.env.PIPELINE_API_MAX_ATTEMPTS, DEFAULT_MAX_ATTEMPTS),
16
+ timeoutMs: parsePositiveInt(process.env.PIPELINE_API_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS),
12
17
  token,
13
18
  };
14
19
  }
20
+ function parsePositiveInt(value, fallback) {
21
+ const parsed = Number.parseInt(value ?? "", 10);
22
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
23
+ }
15
24
  function createMissingConfigError() {
16
25
  return new Error("Pipeline CRM is not configured. Set PIPELINE_API_URL and PIPELINE_SERVICE_TOKEN.");
17
26
  }
18
- function buildRequestSignal(signal) {
19
- return signal
20
- ? AbortSignal.any([signal, AbortSignal.timeout(30_000)])
21
- : AbortSignal.timeout(30_000);
22
- }
23
27
  async function pipelineFetch(config, method, path, options = {}) {
24
- const response = await fetch(`${config.apiUrl}${path}`, {
28
+ const response = await fetchDownstream(`${config.apiUrl}${path}`, {
25
29
  method,
26
30
  headers: {
27
31
  Authorization: `Bearer ${config.token}`,
@@ -29,7 +33,12 @@ async function pipelineFetch(config, method, path, options = {}) {
29
33
  ...options.headers,
30
34
  },
31
35
  body: options.body === undefined ? undefined : JSON.stringify(options.body),
32
- signal: buildRequestSignal(options.signal),
36
+ signal: options.signal,
37
+ }, {
38
+ serviceName: "Pipeline API",
39
+ failureMode: "required",
40
+ timeoutMs: config.timeoutMs,
41
+ maxAttempts: config.maxAttempts,
33
42
  });
34
43
  if (!response.ok) {
35
44
  const body = await response.text();
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/tools/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Type } from \"@sinclair/typebox\";\nimport { createTool } from \"./tool-dsl.js\";\n\ninterface PipelineConfig {\n\tapiUrl: string;\n\ttoken: string;\n}\n\ninterface PipelineContact {\n\tid: string;\n\tfirst_name?: string;\n\tlast_name?: string;\n\temail?: string;\n\ttitle?: string;\n\tcompany_id?: string;\n\tstage?: string;\n\tseniority?: string;\n\tlinkedin_url?: string;\n\ttags?: string[];\n}\n\ninterface PipelineDeal {\n\tid: string;\n\ttitle?: string;\n\tstage?: string;\n\tvalue?: number;\n\tcurrency?: string;\n\tprobability?: number;\n\texpected_close?: string;\n\tcontact_id?: string;\n\tcompany_id?: string;\n}\n\nexport interface PipelineActivity {\n\tid: string;\n\towner_type?: string;\n\towner_id?: string;\n\tactivity_type?: string;\n\tchannel?: string;\n\tdirection?: string;\n\tsubject?: string;\n\tbody?: string;\n\toutcome?: string;\n\toccurred_at?: string;\n}\n\nexport interface PipelineSignal {\n\tid?: string;\n\towner_type?: string;\n\towner_id?: string;\n\tsignal_type?: string;\n\tsource?: string;\n\tstrength?: number;\n\tdata?: unknown;\n}\n\ninterface PipelineListResponse<T> {\n\titems: T[];\n}\n\nfunction getPipelineConfig(): PipelineConfig | null {\n\tconst apiUrl = process.env.PIPELINE_API_URL?.trim();\n\tconst token = process.env.PIPELINE_SERVICE_TOKEN?.trim();\n\tif (!apiUrl || !token) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tapiUrl: apiUrl.replace(/\\/+$/, \"\"),\n\t\ttoken,\n\t};\n}\n\nfunction createMissingConfigError(): Error {\n\treturn new Error(\n\t\t\"Pipeline CRM is not configured. Set PIPELINE_API_URL and PIPELINE_SERVICE_TOKEN.\",\n\t);\n}\n\nfunction buildRequestSignal(signal?: AbortSignal): AbortSignal {\n\treturn signal\n\t\t? AbortSignal.any([signal, AbortSignal.timeout(30_000)])\n\t\t: AbortSignal.timeout(30_000);\n}\n\nasync function pipelineFetch<T>(\n\tconfig: PipelineConfig,\n\tmethod: string,\n\tpath: string,\n\toptions: {\n\t\tsignal?: AbortSignal;\n\t\tbody?: unknown;\n\t\theaders?: Record<string, string>;\n\t} = {},\n): Promise<T> {\n\tconst response = await fetch(`${config.apiUrl}${path}`, {\n\t\tmethod,\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${config.token}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t...options.headers,\n\t\t},\n\t\tbody: options.body === undefined ? undefined : JSON.stringify(options.body),\n\t\tsignal: buildRequestSignal(options.signal),\n\t});\n\n\tif (!response.ok) {\n\t\tconst body = await response.text();\n\t\tthrow new Error(\n\t\t\t`Pipeline API ${method} ${path} returned ${response.status}: ${body || \"Unknown error\"}`,\n\t\t);\n\t}\n\n\treturn (await response.json()) as T;\n}\n\nfunction idempotencyHeaders(): Record<string, string> {\n\treturn { \"Idempotency-Key\": randomUUID() };\n}\n\nfunction mergeSignalData(summary?: string, data?: unknown): unknown {\n\tif (!summary) {\n\t\treturn data;\n\t}\n\tif (data === undefined) {\n\t\treturn { summary };\n\t}\n\tif (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n\t\treturn { summary, ...(data as Record<string, unknown>) };\n\t}\n\treturn { summary, value: data };\n}\n\nfunction formatContactName(contact: PipelineContact): string {\n\tconst parts = [contact.first_name, contact.last_name]\n\t\t.map((value) => value?.trim())\n\t\t.filter((value): value is string => Boolean(value));\n\tif (parts.length > 0) {\n\t\treturn parts.join(\" \");\n\t}\n\treturn contact.email?.trim() || contact.id;\n}\n\nfunction formatQuerySummary(\n\tlabel: string,\n\tparts: Array<string | undefined>,\n): string | null {\n\tconst first = parts\n\t\t.map((value) => value?.trim())\n\t\t.find((value): value is string => Boolean(value));\n\treturn first ? `${label} \"${first}\"` : label;\n}\n\nconst pipelineSearchContactsSchema = Type.Object({\n\tquery: Type.Optional(\n\t\tType.String({ description: \"Free-text contact query (maps to name)\" }),\n\t),\n\tname: Type.Optional(\n\t\tType.String({ description: \"Name to search for (partial match)\" }),\n\t),\n\temail: Type.Optional(\n\t\tType.String({ description: \"Email to search for (partial match)\" }),\n\t),\n\tstage: Type.Optional(Type.String({ description: \"Pipeline stage filter\" })),\n\tcompanyId: Type.Optional(\n\t\tType.String({ description: \"Filter by company UUID\" }),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum results to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 100,\n\t\t\tdefault: 10,\n\t\t}),\n\t),\n});\n\nconst pipelineSearchDealsSchema = Type.Object({\n\tstage: Type.Optional(Type.String({ description: \"Deal stage filter\" })),\n\tcontactId: Type.Optional(\n\t\tType.String({ description: \"Filter by contact UUID\" }),\n\t),\n\tcompanyId: Type.Optional(\n\t\tType.String({ description: \"Filter by company UUID\" }),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum results to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 100,\n\t\t\tdefault: 10,\n\t\t}),\n\t),\n});\n\nconst pipelineCreateSignalSchema = Type.Object({\n\townerType: Type.String({\n\t\tdescription: \"Signal owner type, typically contact or company\",\n\t}),\n\townerId: Type.String({ description: \"Signal owner UUID\" }),\n\tsignalType: Type.String({ description: \"Signal type\" }),\n\tsource: Type.String({ description: \"Signal source\" }),\n\tstrength: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Signal strength from 0-100\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 100,\n\t\t}),\n\t),\n\tsummary: Type.Optional(\n\t\tType.String({ description: \"Human-readable signal summary\" }),\n\t),\n\tdata: Type.Optional(Type.Any({ description: \"Arbitrary signal payload\" })),\n});\n\nconst pipelineLogActivitySchema = Type.Object({\n\townerType: Type.String({\n\t\tdescription: \"Activity owner type, such as contact, company, or deal\",\n\t}),\n\townerId: Type.String({ description: \"Activity owner UUID\" }),\n\tactivityType: Type.String({ description: \"Activity type identifier\" }),\n\tchannel: Type.String({ description: \"Activity channel\" }),\n\tdirection: Type.Optional(\n\t\tType.String({ description: \"Direction, defaults to outbound\" }),\n\t),\n\tsubject: Type.Optional(\n\t\tType.String({ description: \"Activity subject or topic\" }),\n\t),\n\tbody: Type.Optional(Type.String({ description: \"Activity body or notes\" })),\n\toutcome: Type.Optional(\n\t\tType.String({ description: \"Optional activity outcome\" }),\n\t),\n\toccurredAt: Type.Optional(\n\t\tType.String({ description: \"Occurred-at timestamp (ISO-8601)\" }),\n\t),\n});\n\nexport interface PipelineSearchContactsDetails {\n\tcontacts: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\temail?: string;\n\t\ttitle?: string;\n\t\tcompanyId?: string;\n\t\tstage?: string;\n\t\tseniority?: string;\n\t\tlinkedinUrl?: string;\n\t\ttags?: string[];\n\t}>;\n\tcount: number;\n}\n\nexport interface PipelineSearchDealsDetails {\n\tdeals: Array<{\n\t\tid: string;\n\t\ttitle: string;\n\t\tstage?: string;\n\t\tvalue?: number;\n\t\tcurrency?: string;\n\t\tprobability?: number;\n\t\texpectedClose?: string;\n\t\tcontactId?: string;\n\t\tcompanyId?: string;\n\t}>;\n\tcount: number;\n}\n\nexport const pipelineSearchContactsTool = createTool<\n\ttypeof pipelineSearchContactsSchema,\n\tPipelineSearchContactsDetails\n>({\n\tname: \"pipeline_search_contacts\",\n\tlabel: \"pipeline contacts\",\n\tdescription:\n\t\t\"Search Pipeline CRM contacts using the internal evalops Pipeline service.\",\n\tschema: pipelineSearchContactsSchema,\n\tgetDisplayName: () => \"Pipeline Contacts\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Search Pipeline contacts for\", [\n\t\t\tparams.name,\n\t\t\tparams.query,\n\t\t\tparams.email,\n\t\t\tparams.stage,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Searching Pipeline contacts\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst query = new URLSearchParams();\n\t\tconst name = params.name ?? params.query;\n\t\tif (name) query.set(\"name\", name);\n\t\tif (params.email) query.set(\"email\", params.email);\n\t\tif (params.stage) query.set(\"stage\", params.stage);\n\t\tif (params.companyId) query.set(\"company_id\", params.companyId);\n\t\tquery.set(\"limit\", String(params.limit ?? 10));\n\n\t\tconst result = await pipelineFetch<PipelineListResponse<PipelineContact>>(\n\t\t\tconfig,\n\t\t\t\"GET\",\n\t\t\t`/api/v1/contacts?${query.toString()}`,\n\t\t\t{ signal },\n\t\t);\n\n\t\tconst contacts = result.items.map((contact) => ({\n\t\t\tid: contact.id,\n\t\t\tname: formatContactName(contact),\n\t\t\temail: contact.email,\n\t\t\ttitle: contact.title,\n\t\t\tcompanyId: contact.company_id,\n\t\t\tstage: contact.stage,\n\t\t\tseniority: contact.seniority,\n\t\t\tlinkedinUrl: contact.linkedin_url,\n\t\t\ttags: contact.tags,\n\t\t}));\n\n\t\trespond.text(\n\t\t\t`Found ${contacts.length} Pipeline contact${contacts.length === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t\tfor (const contact of contacts.slice(0, 10)) {\n\t\t\tconst segments = [\n\t\t\t\tcontact.name,\n\t\t\t\tcontact.email,\n\t\t\t\tcontact.title,\n\t\t\t\tcontact.stage,\n\t\t\t].filter((value): value is string => Boolean(value));\n\t\t\trespond.text(`- ${segments.join(\" • \")}`);\n\t\t}\n\t\trespond.detail({ contacts, count: contacts.length });\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineSearchDealsTool = createTool<\n\ttypeof pipelineSearchDealsSchema,\n\tPipelineSearchDealsDetails\n>({\n\tname: \"pipeline_search_deals\",\n\tlabel: \"pipeline deals\",\n\tdescription:\n\t\t\"Search Pipeline CRM deals using the internal evalops Pipeline service.\",\n\tschema: pipelineSearchDealsSchema,\n\tgetDisplayName: () => \"Pipeline Deals\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Search Pipeline deals for\", [\n\t\t\tparams.companyId,\n\t\t\tparams.contactId,\n\t\t\tparams.stage,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Searching Pipeline deals\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst query = new URLSearchParams();\n\t\tif (params.stage) query.set(\"stage\", params.stage);\n\t\tif (params.contactId) query.set(\"contact_id\", params.contactId);\n\t\tif (params.companyId) query.set(\"company_id\", params.companyId);\n\t\tquery.set(\"limit\", String(params.limit ?? 10));\n\n\t\tconst result = await pipelineFetch<PipelineListResponse<PipelineDeal>>(\n\t\t\tconfig,\n\t\t\t\"GET\",\n\t\t\t`/api/v1/deals?${query.toString()}`,\n\t\t\t{ signal },\n\t\t);\n\n\t\tconst deals = result.items.map((deal) => ({\n\t\t\tid: deal.id,\n\t\t\ttitle: deal.title?.trim() || deal.id,\n\t\t\tstage: deal.stage,\n\t\t\tvalue: deal.value,\n\t\t\tcurrency: deal.currency,\n\t\t\tprobability: deal.probability,\n\t\t\texpectedClose: deal.expected_close,\n\t\t\tcontactId: deal.contact_id,\n\t\t\tcompanyId: deal.company_id,\n\t\t}));\n\n\t\trespond.text(\n\t\t\t`Found ${deals.length} Pipeline deal${deals.length === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t\tfor (const deal of deals.slice(0, 10)) {\n\t\t\tconst segments = [\n\t\t\t\tdeal.title,\n\t\t\t\tdeal.stage,\n\t\t\t\tdeal.value !== undefined\n\t\t\t\t\t? `${deal.currency ?? \"USD\"} ${deal.value}`\n\t\t\t\t\t: undefined,\n\t\t\t\tdeal.expectedClose,\n\t\t\t].filter((value): value is string => Boolean(value));\n\t\t\trespond.text(`- ${segments.join(\" • \")}`);\n\t\t}\n\t\trespond.detail({ deals, count: deals.length });\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineCreateSignalTool = createTool<\n\ttypeof pipelineCreateSignalSchema,\n\tPipelineSignal\n>({\n\tname: \"pipeline_create_signal\",\n\tlabel: \"pipeline signal\",\n\tdescription:\n\t\t\"Create a signal in Pipeline CRM using the internal evalops Pipeline service.\",\n\tschema: pipelineCreateSignalSchema,\n\tgetDisplayName: () => \"Pipeline Signal\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Create Pipeline signal\", [\n\t\t\tparams.summary,\n\t\t\tparams.signalType,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Creating Pipeline signal\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst payload = {\n\t\t\towner_type: params.ownerType,\n\t\t\towner_id: params.ownerId,\n\t\t\tsignal_type: params.signalType,\n\t\t\tsource: params.source,\n\t\t\t...(params.strength !== undefined ? { strength: params.strength } : {}),\n\t\t\t...(params.summary !== undefined || params.data !== undefined\n\t\t\t\t? { data: mergeSignalData(params.summary, params.data) }\n\t\t\t\t: {}),\n\t\t};\n\n\t\tconst result = await pipelineFetch<PipelineSignal>(\n\t\t\tconfig,\n\t\t\t\"POST\",\n\t\t\t\"/api/v1/signals\",\n\t\t\t{\n\t\t\t\tsignal,\n\t\t\t\tbody: payload,\n\t\t\t\theaders: idempotencyHeaders(),\n\t\t\t},\n\t\t);\n\n\t\trespond.text(\n\t\t\t`Created Pipeline signal${result.id ? ` ${result.id}` : \"\"} for ${params.ownerType} ${params.ownerId}.`,\n\t\t);\n\t\trespond.detail(result);\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineLogActivityTool = createTool<\n\ttypeof pipelineLogActivitySchema,\n\tPipelineActivity\n>({\n\tname: \"pipeline_log_activity\",\n\tlabel: \"pipeline activity\",\n\tdescription:\n\t\t\"Log an activity in Pipeline CRM using the internal evalops Pipeline service.\",\n\tschema: pipelineLogActivitySchema,\n\tgetDisplayName: () => \"Pipeline Activity\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Log Pipeline activity\", [\n\t\t\tparams.subject,\n\t\t\tparams.activityType,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Logging Pipeline activity\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst payload = {\n\t\t\towner_type: params.ownerType,\n\t\t\towner_id: params.ownerId,\n\t\t\tactivity_type: params.activityType,\n\t\t\tchannel: params.channel,\n\t\t\tdirection: params.direction ?? \"outbound\",\n\t\t\t...(params.subject ? { subject: params.subject } : {}),\n\t\t\t...(params.body ? { body: params.body } : {}),\n\t\t\t...(params.outcome ? { outcome: params.outcome } : {}),\n\t\t\t...(params.occurredAt ? { occurred_at: params.occurredAt } : {}),\n\t\t};\n\n\t\tconst result = await pipelineFetch<PipelineActivity>(\n\t\t\tconfig,\n\t\t\t\"POST\",\n\t\t\t\"/api/v1/activities\",\n\t\t\t{\n\t\t\t\tsignal,\n\t\t\t\tbody: payload,\n\t\t\t\theaders: idempotencyHeaders(),\n\t\t\t},\n\t\t);\n\n\t\trespond.text(\n\t\t\t`Logged Pipeline activity${result.id ? ` ${result.id}` : \"\"} for ${params.ownerType} ${params.ownerId}.`,\n\t\t);\n\t\trespond.detail(result);\n\t\treturn respond;\n\t},\n});\n"]}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/tools/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Type } from \"@sinclair/typebox\";\nimport { fetchDownstream } from \"../utils/downstream-http.js\";\nimport { createTool } from \"./tool-dsl.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_ATTEMPTS = 2;\n\ninterface PipelineConfig {\n\tapiUrl: string;\n\ttoken: string;\n\ttimeoutMs: number;\n\tmaxAttempts: number;\n}\n\ninterface PipelineContact {\n\tid: string;\n\tfirst_name?: string;\n\tlast_name?: string;\n\temail?: string;\n\ttitle?: string;\n\tcompany_id?: string;\n\tstage?: string;\n\tseniority?: string;\n\tlinkedin_url?: string;\n\ttags?: string[];\n}\n\ninterface PipelineDeal {\n\tid: string;\n\ttitle?: string;\n\tstage?: string;\n\tvalue?: number;\n\tcurrency?: string;\n\tprobability?: number;\n\texpected_close?: string;\n\tcontact_id?: string;\n\tcompany_id?: string;\n}\n\nexport interface PipelineActivity {\n\tid: string;\n\towner_type?: string;\n\towner_id?: string;\n\tactivity_type?: string;\n\tchannel?: string;\n\tdirection?: string;\n\tsubject?: string;\n\tbody?: string;\n\toutcome?: string;\n\toccurred_at?: string;\n}\n\nexport interface PipelineSignal {\n\tid?: string;\n\towner_type?: string;\n\towner_id?: string;\n\tsignal_type?: string;\n\tsource?: string;\n\tstrength?: number;\n\tdata?: unknown;\n}\n\ninterface PipelineListResponse<T> {\n\titems: T[];\n}\n\nfunction getPipelineConfig(): PipelineConfig | null {\n\tconst apiUrl = process.env.PIPELINE_API_URL?.trim();\n\tconst token = process.env.PIPELINE_SERVICE_TOKEN?.trim();\n\tif (!apiUrl || !token) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tapiUrl: apiUrl.replace(/\\/+$/, \"\"),\n\t\tmaxAttempts: parsePositiveInt(\n\t\t\tprocess.env.PIPELINE_API_MAX_ATTEMPTS,\n\t\t\tDEFAULT_MAX_ATTEMPTS,\n\t\t),\n\t\ttimeoutMs: parsePositiveInt(\n\t\t\tprocess.env.PIPELINE_API_TIMEOUT_MS,\n\t\t\tDEFAULT_REQUEST_TIMEOUT_MS,\n\t\t),\n\t\ttoken,\n\t};\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n\tconst parsed = Number.parseInt(value ?? \"\", 10);\n\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction createMissingConfigError(): Error {\n\treturn new Error(\n\t\t\"Pipeline CRM is not configured. Set PIPELINE_API_URL and PIPELINE_SERVICE_TOKEN.\",\n\t);\n}\n\nasync function pipelineFetch<T>(\n\tconfig: PipelineConfig,\n\tmethod: string,\n\tpath: string,\n\toptions: {\n\t\tsignal?: AbortSignal;\n\t\tbody?: unknown;\n\t\theaders?: Record<string, string>;\n\t} = {},\n): Promise<T> {\n\tconst response = await fetchDownstream(\n\t\t`${config.apiUrl}${path}`,\n\t\t{\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${config.token}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...options.headers,\n\t\t\t},\n\t\t\tbody:\n\t\t\t\toptions.body === undefined ? undefined : JSON.stringify(options.body),\n\t\t\tsignal: options.signal,\n\t\t},\n\t\t{\n\t\t\tserviceName: \"Pipeline API\",\n\t\t\tfailureMode: \"required\",\n\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\tmaxAttempts: config.maxAttempts,\n\t\t},\n\t);\n\n\tif (!response.ok) {\n\t\tconst body = await response.text();\n\t\tthrow new Error(\n\t\t\t`Pipeline API ${method} ${path} returned ${response.status}: ${body || \"Unknown error\"}`,\n\t\t);\n\t}\n\n\treturn (await response.json()) as T;\n}\n\nfunction idempotencyHeaders(): Record<string, string> {\n\treturn { \"Idempotency-Key\": randomUUID() };\n}\n\nfunction mergeSignalData(summary?: string, data?: unknown): unknown {\n\tif (!summary) {\n\t\treturn data;\n\t}\n\tif (data === undefined) {\n\t\treturn { summary };\n\t}\n\tif (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n\t\treturn { summary, ...(data as Record<string, unknown>) };\n\t}\n\treturn { summary, value: data };\n}\n\nfunction formatContactName(contact: PipelineContact): string {\n\tconst parts = [contact.first_name, contact.last_name]\n\t\t.map((value) => value?.trim())\n\t\t.filter((value): value is string => Boolean(value));\n\tif (parts.length > 0) {\n\t\treturn parts.join(\" \");\n\t}\n\treturn contact.email?.trim() || contact.id;\n}\n\nfunction formatQuerySummary(\n\tlabel: string,\n\tparts: Array<string | undefined>,\n): string | null {\n\tconst first = parts\n\t\t.map((value) => value?.trim())\n\t\t.find((value): value is string => Boolean(value));\n\treturn first ? `${label} \"${first}\"` : label;\n}\n\nconst pipelineSearchContactsSchema = Type.Object({\n\tquery: Type.Optional(\n\t\tType.String({ description: \"Free-text contact query (maps to name)\" }),\n\t),\n\tname: Type.Optional(\n\t\tType.String({ description: \"Name to search for (partial match)\" }),\n\t),\n\temail: Type.Optional(\n\t\tType.String({ description: \"Email to search for (partial match)\" }),\n\t),\n\tstage: Type.Optional(Type.String({ description: \"Pipeline stage filter\" })),\n\tcompanyId: Type.Optional(\n\t\tType.String({ description: \"Filter by company UUID\" }),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum results to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 100,\n\t\t\tdefault: 10,\n\t\t}),\n\t),\n});\n\nconst pipelineSearchDealsSchema = Type.Object({\n\tstage: Type.Optional(Type.String({ description: \"Deal stage filter\" })),\n\tcontactId: Type.Optional(\n\t\tType.String({ description: \"Filter by contact UUID\" }),\n\t),\n\tcompanyId: Type.Optional(\n\t\tType.String({ description: \"Filter by company UUID\" }),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum results to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 100,\n\t\t\tdefault: 10,\n\t\t}),\n\t),\n});\n\nconst pipelineCreateSignalSchema = Type.Object({\n\townerType: Type.String({\n\t\tdescription: \"Signal owner type, typically contact or company\",\n\t}),\n\townerId: Type.String({ description: \"Signal owner UUID\" }),\n\tsignalType: Type.String({ description: \"Signal type\" }),\n\tsource: Type.String({ description: \"Signal source\" }),\n\tstrength: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Signal strength from 0-100\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 100,\n\t\t}),\n\t),\n\tsummary: Type.Optional(\n\t\tType.String({ description: \"Human-readable signal summary\" }),\n\t),\n\tdata: Type.Optional(Type.Any({ description: \"Arbitrary signal payload\" })),\n});\n\nconst pipelineLogActivitySchema = Type.Object({\n\townerType: Type.String({\n\t\tdescription: \"Activity owner type, such as contact, company, or deal\",\n\t}),\n\townerId: Type.String({ description: \"Activity owner UUID\" }),\n\tactivityType: Type.String({ description: \"Activity type identifier\" }),\n\tchannel: Type.String({ description: \"Activity channel\" }),\n\tdirection: Type.Optional(\n\t\tType.String({ description: \"Direction, defaults to outbound\" }),\n\t),\n\tsubject: Type.Optional(\n\t\tType.String({ description: \"Activity subject or topic\" }),\n\t),\n\tbody: Type.Optional(Type.String({ description: \"Activity body or notes\" })),\n\toutcome: Type.Optional(\n\t\tType.String({ description: \"Optional activity outcome\" }),\n\t),\n\toccurredAt: Type.Optional(\n\t\tType.String({ description: \"Occurred-at timestamp (ISO-8601)\" }),\n\t),\n});\n\nexport interface PipelineSearchContactsDetails {\n\tcontacts: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\temail?: string;\n\t\ttitle?: string;\n\t\tcompanyId?: string;\n\t\tstage?: string;\n\t\tseniority?: string;\n\t\tlinkedinUrl?: string;\n\t\ttags?: string[];\n\t}>;\n\tcount: number;\n}\n\nexport interface PipelineSearchDealsDetails {\n\tdeals: Array<{\n\t\tid: string;\n\t\ttitle: string;\n\t\tstage?: string;\n\t\tvalue?: number;\n\t\tcurrency?: string;\n\t\tprobability?: number;\n\t\texpectedClose?: string;\n\t\tcontactId?: string;\n\t\tcompanyId?: string;\n\t}>;\n\tcount: number;\n}\n\nexport const pipelineSearchContactsTool = createTool<\n\ttypeof pipelineSearchContactsSchema,\n\tPipelineSearchContactsDetails\n>({\n\tname: \"pipeline_search_contacts\",\n\tlabel: \"pipeline contacts\",\n\tdescription:\n\t\t\"Search Pipeline CRM contacts using the internal evalops Pipeline service.\",\n\tschema: pipelineSearchContactsSchema,\n\tgetDisplayName: () => \"Pipeline Contacts\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Search Pipeline contacts for\", [\n\t\t\tparams.name,\n\t\t\tparams.query,\n\t\t\tparams.email,\n\t\t\tparams.stage,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Searching Pipeline contacts\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst query = new URLSearchParams();\n\t\tconst name = params.name ?? params.query;\n\t\tif (name) query.set(\"name\", name);\n\t\tif (params.email) query.set(\"email\", params.email);\n\t\tif (params.stage) query.set(\"stage\", params.stage);\n\t\tif (params.companyId) query.set(\"company_id\", params.companyId);\n\t\tquery.set(\"limit\", String(params.limit ?? 10));\n\n\t\tconst result = await pipelineFetch<PipelineListResponse<PipelineContact>>(\n\t\t\tconfig,\n\t\t\t\"GET\",\n\t\t\t`/api/v1/contacts?${query.toString()}`,\n\t\t\t{ signal },\n\t\t);\n\n\t\tconst contacts = result.items.map((contact) => ({\n\t\t\tid: contact.id,\n\t\t\tname: formatContactName(contact),\n\t\t\temail: contact.email,\n\t\t\ttitle: contact.title,\n\t\t\tcompanyId: contact.company_id,\n\t\t\tstage: contact.stage,\n\t\t\tseniority: contact.seniority,\n\t\t\tlinkedinUrl: contact.linkedin_url,\n\t\t\ttags: contact.tags,\n\t\t}));\n\n\t\trespond.text(\n\t\t\t`Found ${contacts.length} Pipeline contact${contacts.length === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t\tfor (const contact of contacts.slice(0, 10)) {\n\t\t\tconst segments = [\n\t\t\t\tcontact.name,\n\t\t\t\tcontact.email,\n\t\t\t\tcontact.title,\n\t\t\t\tcontact.stage,\n\t\t\t].filter((value): value is string => Boolean(value));\n\t\t\trespond.text(`- ${segments.join(\" • \")}`);\n\t\t}\n\t\trespond.detail({ contacts, count: contacts.length });\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineSearchDealsTool = createTool<\n\ttypeof pipelineSearchDealsSchema,\n\tPipelineSearchDealsDetails\n>({\n\tname: \"pipeline_search_deals\",\n\tlabel: \"pipeline deals\",\n\tdescription:\n\t\t\"Search Pipeline CRM deals using the internal evalops Pipeline service.\",\n\tschema: pipelineSearchDealsSchema,\n\tgetDisplayName: () => \"Pipeline Deals\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Search Pipeline deals for\", [\n\t\t\tparams.companyId,\n\t\t\tparams.contactId,\n\t\t\tparams.stage,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Searching Pipeline deals\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst query = new URLSearchParams();\n\t\tif (params.stage) query.set(\"stage\", params.stage);\n\t\tif (params.contactId) query.set(\"contact_id\", params.contactId);\n\t\tif (params.companyId) query.set(\"company_id\", params.companyId);\n\t\tquery.set(\"limit\", String(params.limit ?? 10));\n\n\t\tconst result = await pipelineFetch<PipelineListResponse<PipelineDeal>>(\n\t\t\tconfig,\n\t\t\t\"GET\",\n\t\t\t`/api/v1/deals?${query.toString()}`,\n\t\t\t{ signal },\n\t\t);\n\n\t\tconst deals = result.items.map((deal) => ({\n\t\t\tid: deal.id,\n\t\t\ttitle: deal.title?.trim() || deal.id,\n\t\t\tstage: deal.stage,\n\t\t\tvalue: deal.value,\n\t\t\tcurrency: deal.currency,\n\t\t\tprobability: deal.probability,\n\t\t\texpectedClose: deal.expected_close,\n\t\t\tcontactId: deal.contact_id,\n\t\t\tcompanyId: deal.company_id,\n\t\t}));\n\n\t\trespond.text(\n\t\t\t`Found ${deals.length} Pipeline deal${deals.length === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t\tfor (const deal of deals.slice(0, 10)) {\n\t\t\tconst segments = [\n\t\t\t\tdeal.title,\n\t\t\t\tdeal.stage,\n\t\t\t\tdeal.value !== undefined\n\t\t\t\t\t? `${deal.currency ?? \"USD\"} ${deal.value}`\n\t\t\t\t\t: undefined,\n\t\t\t\tdeal.expectedClose,\n\t\t\t].filter((value): value is string => Boolean(value));\n\t\t\trespond.text(`- ${segments.join(\" • \")}`);\n\t\t}\n\t\trespond.detail({ deals, count: deals.length });\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineCreateSignalTool = createTool<\n\ttypeof pipelineCreateSignalSchema,\n\tPipelineSignal\n>({\n\tname: \"pipeline_create_signal\",\n\tlabel: \"pipeline signal\",\n\tdescription:\n\t\t\"Create a signal in Pipeline CRM using the internal evalops Pipeline service.\",\n\tschema: pipelineCreateSignalSchema,\n\tgetDisplayName: () => \"Pipeline Signal\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Create Pipeline signal\", [\n\t\t\tparams.summary,\n\t\t\tparams.signalType,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Creating Pipeline signal\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst payload = {\n\t\t\towner_type: params.ownerType,\n\t\t\towner_id: params.ownerId,\n\t\t\tsignal_type: params.signalType,\n\t\t\tsource: params.source,\n\t\t\t...(params.strength !== undefined ? { strength: params.strength } : {}),\n\t\t\t...(params.summary !== undefined || params.data !== undefined\n\t\t\t\t? { data: mergeSignalData(params.summary, params.data) }\n\t\t\t\t: {}),\n\t\t};\n\n\t\tconst result = await pipelineFetch<PipelineSignal>(\n\t\t\tconfig,\n\t\t\t\"POST\",\n\t\t\t\"/api/v1/signals\",\n\t\t\t{\n\t\t\t\tsignal,\n\t\t\t\tbody: payload,\n\t\t\t\theaders: idempotencyHeaders(),\n\t\t\t},\n\t\t);\n\n\t\trespond.text(\n\t\t\t`Created Pipeline signal${result.id ? ` ${result.id}` : \"\"} for ${params.ownerType} ${params.ownerId}.`,\n\t\t);\n\t\trespond.detail(result);\n\t\treturn respond;\n\t},\n});\n\nexport const pipelineLogActivityTool = createTool<\n\ttypeof pipelineLogActivitySchema,\n\tPipelineActivity\n>({\n\tname: \"pipeline_log_activity\",\n\tlabel: \"pipeline activity\",\n\tdescription:\n\t\t\"Log an activity in Pipeline CRM using the internal evalops Pipeline service.\",\n\tschema: pipelineLogActivitySchema,\n\tgetDisplayName: () => \"Pipeline Activity\",\n\tgetToolUseSummary(params) {\n\t\treturn formatQuerySummary(\"Log Pipeline activity\", [\n\t\t\tparams.subject,\n\t\t\tparams.activityType,\n\t\t]);\n\t},\n\tgetActivityDescription: () => \"Logging Pipeline activity\",\n\tasync run(params, { respond, signal }) {\n\t\tconst config = getPipelineConfig();\n\t\tif (!config) {\n\t\t\tthrow createMissingConfigError();\n\t\t}\n\n\t\tconst payload = {\n\t\t\towner_type: params.ownerType,\n\t\t\towner_id: params.ownerId,\n\t\t\tactivity_type: params.activityType,\n\t\t\tchannel: params.channel,\n\t\t\tdirection: params.direction ?? \"outbound\",\n\t\t\t...(params.subject ? { subject: params.subject } : {}),\n\t\t\t...(params.body ? { body: params.body } : {}),\n\t\t\t...(params.outcome ? { outcome: params.outcome } : {}),\n\t\t\t...(params.occurredAt ? { occurred_at: params.occurredAt } : {}),\n\t\t};\n\n\t\tconst result = await pipelineFetch<PipelineActivity>(\n\t\t\tconfig,\n\t\t\t\"POST\",\n\t\t\t\"/api/v1/activities\",\n\t\t\t{\n\t\t\t\tsignal,\n\t\t\t\tbody: payload,\n\t\t\t\theaders: idempotencyHeaders(),\n\t\t\t},\n\t\t);\n\n\t\trespond.text(\n\t\t\t`Logged Pipeline activity${result.id ? ` ${result.id}` : \"\"} for ${params.ownerType} ${params.ownerId}.`,\n\t\t);\n\t\trespond.detail(result);\n\t\treturn respond;\n\t},\n});\n"]}
@@ -50,6 +50,7 @@
50
50
  *
51
51
  * @module tools/write
52
52
  */
53
+ import { type DiagnosticDeltaToolSummary } from "../lsp/diagnostic-repair.js";
53
54
  import type { ValidatorRunResult } from "../safety/safe-mode.js";
54
55
  type WriteToolDetails = {
55
56
  previousExists?: boolean;
@@ -57,6 +58,7 @@ type WriteToolDetails = {
57
58
  diff?: string;
58
59
  backupPath?: string;
59
60
  validators?: ValidatorRunResult[];
61
+ diagnosticDelta?: DiagnosticDeltaToolSummary;
60
62
  mode?: "sandbox";
61
63
  };
62
64
  export declare const writeTool: Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAmBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAyBjE,KAAK,gBAAgB,GAAG;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;EA2JpB,CAAC"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAiBH,OAAO,EACN,KAAK,0BAA0B,EAG/B,MAAM,6BAA6B,CAAC;AAMrC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAyBjE,KAAK,gBAAgB,GAAG;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,IAAI,CAAC,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;EA+KpB,CAAC"}
@@ -54,7 +54,8 @@ import { constants } from "node:fs";
54
54
  import { access, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
55
55
  import { dirname, resolve as resolvePath } from "node:path";
56
56
  import { Type } from "@sinclair/typebox";
57
- import { collectDiagnostics } from "../lsp/index.js";
57
+ import { captureDiagnosticBaseline, collectDiagnosticDelta, } from "../lsp/diagnostic-deltas.js";
58
+ import { buildDiagnosticDeltaToolSummary, formatDiagnosticDeltaForToolOutput, } from "../lsp/diagnostic-repair.js";
58
59
  import { assertTeamMemoryContentSafe } from "../memory/team-memory.js";
59
60
  import { requirePlanCheck, runValidatorsOnSuccess, } from "../safety/safe-mode.js";
60
61
  import { formatLspDiagnostics, generateDiffString } from "./diff-utils.js";
@@ -133,6 +134,8 @@ export const writeTool = createTool({
133
134
  previousExists = false;
134
135
  }
135
136
  ensureNotAborted();
137
+ const diagnosticBaseline = await captureDiagnosticBaseline(absolutePath);
138
+ ensureNotAborted();
136
139
  let movedToBackup = false;
137
140
  if (previousExists && backup && previousContent !== null) {
138
141
  backupPath = `${absolutePath}.bak`;
@@ -165,13 +168,21 @@ export const writeTool = createTool({
165
168
  : undefined;
166
169
  let validatorSummaries;
167
170
  let linterOutput = "";
171
+ let diagnosticDeltaSummary;
168
172
  try {
169
- const lspDiagnostics = await collectDiagnostics();
170
- const fileDiagnostics = lspDiagnostics[absolutePath] || [];
171
- if (fileDiagnostics.length > 0) {
172
- linterOutput = formatLspDiagnostics(path, fileDiagnostics);
173
+ const diagnosticDelta = await collectDiagnosticDelta(diagnosticBaseline);
174
+ diagnosticDeltaSummary = buildDiagnosticDeltaToolSummary({
175
+ file: absolutePath,
176
+ displayPath: path,
177
+ result: diagnosticDelta,
178
+ });
179
+ const visibleDiagnostics = diagnosticDelta.usedDelta
180
+ ? diagnosticDelta.newDiagnostics
181
+ : diagnosticDelta.fileDiagnostics;
182
+ if (visibleDiagnostics.length > 0) {
183
+ linterOutput = formatLspDiagnostics(path, visibleDiagnostics);
173
184
  }
174
- validatorSummaries = await runValidatorsOnSuccess([absolutePath], lspDiagnostics);
185
+ validatorSummaries = await runValidatorsOnSuccess([absolutePath], diagnosticDelta.validatorDiagnostics);
175
186
  }
176
187
  catch (validatorError) {
177
188
  if (movedToBackup && backupPath) {
@@ -202,12 +213,19 @@ export const writeTool = createTool({
202
213
  if (linterOutput) {
203
214
  summaryLines.push(linterOutput);
204
215
  }
216
+ if (diagnosticDeltaSummary) {
217
+ const diagnosticDeltaOutput = formatDiagnosticDeltaForToolOutput(diagnosticDeltaSummary);
218
+ if (diagnosticDeltaOutput) {
219
+ summaryLines.push(diagnosticDeltaOutput);
220
+ }
221
+ }
205
222
  return respond.text(summaryLines.join("\n")).detail({
206
223
  previousExists,
207
224
  bytesWritten: Buffer.byteLength(content, "utf-8"),
208
225
  diff,
209
226
  backupPath,
210
227
  validators: validatorSummaries,
228
+ diagnosticDelta: diagnosticDeltaSummary,
211
229
  });
212
230
  },
213
231
  });