patchwork-os 0.2.0-beta.9.canary.92 → 1.1.0-beta.1

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 (739) hide show
  1. package/README.bridge.md +15 -16
  2. package/README.md +46 -458
  3. package/dist/activationMetrics.js +2 -3
  4. package/dist/activationMetrics.js.map +1 -1
  5. package/dist/activityLog.d.ts +1 -0
  6. package/dist/activityLog.js +8 -3
  7. package/dist/activityLog.js.map +1 -1
  8. package/dist/adapters/gemini.js +2 -2
  9. package/dist/adapters/gemini.js.map +1 -1
  10. package/dist/adapters/grok.js +6 -1
  11. package/dist/adapters/grok.js.map +1 -1
  12. package/dist/adapters/openai.js +4 -0
  13. package/dist/adapters/openai.js.map +1 -1
  14. package/dist/approvalHttp.d.ts +9 -0
  15. package/dist/approvalHttp.js +210 -171
  16. package/dist/approvalHttp.js.map +1 -1
  17. package/dist/approvalKpi.d.ts +102 -0
  18. package/dist/approvalKpi.js +282 -0
  19. package/dist/approvalKpi.js.map +1 -0
  20. package/dist/approvalQueue.d.ts +1 -1
  21. package/dist/approvalQueue.js.map +1 -1
  22. package/dist/automation.d.ts +45 -4
  23. package/dist/automation.js +123 -15
  24. package/dist/automation.js.map +1 -1
  25. package/dist/bridge.d.ts +10 -0
  26. package/dist/bridge.js +225 -46
  27. package/dist/bridge.js.map +1 -1
  28. package/dist/bridgeLockDiscovery.d.ts +16 -1
  29. package/dist/bridgeLockDiscovery.js +38 -4
  30. package/dist/bridgeLockDiscovery.js.map +1 -1
  31. package/dist/bridgeToolsRules.js +3 -18
  32. package/dist/bridgeToolsRules.js.map +1 -1
  33. package/dist/claudeAuthHttp.d.ts +25 -0
  34. package/dist/claudeAuthHttp.js +219 -0
  35. package/dist/claudeAuthHttp.js.map +1 -0
  36. package/dist/claudeDriver.js +4 -1
  37. package/dist/claudeDriver.js.map +1 -1
  38. package/dist/claudeOrchestrator.d.ts +15 -0
  39. package/dist/claudeOrchestrator.js +44 -0
  40. package/dist/claudeOrchestrator.js.map +1 -1
  41. package/dist/commands/connect.d.ts +47 -0
  42. package/dist/commands/connect.js +419 -0
  43. package/dist/commands/connect.js.map +1 -0
  44. package/dist/commands/install.js +3 -10
  45. package/dist/commands/install.js.map +1 -1
  46. package/dist/commands/launchd.d.ts +7 -0
  47. package/dist/commands/launchd.js +20 -2
  48. package/dist/commands/launchd.js.map +1 -1
  49. package/dist/commands/patchworkInit.d.ts +7 -0
  50. package/dist/commands/patchworkInit.js +26 -0
  51. package/dist/commands/patchworkInit.js.map +1 -1
  52. package/dist/commands/recipe.d.ts +59 -4
  53. package/dist/commands/recipe.js +206 -5
  54. package/dist/commands/recipe.js.map +1 -1
  55. package/dist/commands/recipeInstall.d.ts +9 -0
  56. package/dist/commands/recipeInstall.js +56 -3
  57. package/dist/commands/recipeInstall.js.map +1 -1
  58. package/dist/commands/task.d.ts +25 -0
  59. package/dist/commands/task.js +61 -41
  60. package/dist/commands/task.js.map +1 -1
  61. package/dist/commands/tokenEfficiency.d.ts +4 -0
  62. package/dist/commands/tokenEfficiency.js +23 -26
  63. package/dist/commands/tokenEfficiency.js.map +1 -1
  64. package/dist/commands/tracesExport.d.ts +15 -1
  65. package/dist/commands/tracesExport.js +39 -5
  66. package/dist/commands/tracesExport.js.map +1 -1
  67. package/dist/config.js +16 -0
  68. package/dist/config.js.map +1 -1
  69. package/dist/connectorRoutes.js +613 -62
  70. package/dist/connectorRoutes.js.map +1 -1
  71. package/dist/connectors/asana.js +9 -3
  72. package/dist/connectors/asana.js.map +1 -1
  73. package/dist/connectors/baseConnector.d.ts +16 -0
  74. package/dist/connectors/baseConnector.js +2 -0
  75. package/dist/connectors/baseConnector.js.map +1 -1
  76. package/dist/connectors/caldiy.js +34 -0
  77. package/dist/connectors/caldiy.js.map +1 -1
  78. package/dist/connectors/confluence.js +9 -2
  79. package/dist/connectors/confluence.js.map +1 -1
  80. package/dist/connectors/connectorActivity.d.ts +24 -0
  81. package/dist/connectors/connectorActivity.js +32 -0
  82. package/dist/connectors/connectorActivity.js.map +1 -0
  83. package/dist/connectors/connectorRedirectUri.js +22 -2
  84. package/dist/connectors/connectorRedirectUri.js.map +1 -1
  85. package/dist/connectors/connectorRegistry.d.ts +0 -3
  86. package/dist/connectors/connectorRegistry.js +8 -8
  87. package/dist/connectors/connectorRegistry.js.map +1 -1
  88. package/dist/connectors/datadog.js +8 -1
  89. package/dist/connectors/datadog.js.map +1 -1
  90. package/dist/connectors/discord.js +4 -3
  91. package/dist/connectors/discord.js.map +1 -1
  92. package/dist/connectors/elasticsearch.js +22 -0
  93. package/dist/connectors/elasticsearch.js.map +1 -1
  94. package/dist/connectors/github.d.ts +38 -0
  95. package/dist/connectors/github.js +91 -5
  96. package/dist/connectors/github.js.map +1 -1
  97. package/dist/connectors/gitlab.js +19 -16
  98. package/dist/connectors/gitlab.js.map +1 -1
  99. package/dist/connectors/gmail.d.ts +5 -0
  100. package/dist/connectors/gmail.js +53 -11
  101. package/dist/connectors/gmail.js.map +1 -1
  102. package/dist/connectors/googleCalendar.js +5 -4
  103. package/dist/connectors/googleCalendar.js.map +1 -1
  104. package/dist/connectors/googleDocs.js +7 -6
  105. package/dist/connectors/googleDocs.js.map +1 -1
  106. package/dist/connectors/googleDrive.js +15 -8
  107. package/dist/connectors/googleDrive.js.map +1 -1
  108. package/dist/connectors/grafana.js +39 -3
  109. package/dist/connectors/grafana.js.map +1 -1
  110. package/dist/connectors/jira.d.ts +1 -1
  111. package/dist/connectors/jira.js +19 -4
  112. package/dist/connectors/jira.js.map +1 -1
  113. package/dist/connectors/linear.js +2 -2
  114. package/dist/connectors/linear.js.map +1 -1
  115. package/dist/connectors/mcpClient.d.ts +29 -1
  116. package/dist/connectors/mcpClient.js +114 -44
  117. package/dist/connectors/mcpClient.js.map +1 -1
  118. package/dist/connectors/mcpOAuth.d.ts +1 -0
  119. package/dist/connectors/mcpOAuth.js +49 -4
  120. package/dist/connectors/mcpOAuth.js.map +1 -1
  121. package/dist/connectors/monday.js +5 -4
  122. package/dist/connectors/monday.js.map +1 -1
  123. package/dist/connectors/mongodb.js +32 -5
  124. package/dist/connectors/mongodb.js.map +1 -1
  125. package/dist/connectors/notion.d.ts +1 -1
  126. package/dist/connectors/notion.js +22 -6
  127. package/dist/connectors/notion.js.map +1 -1
  128. package/dist/connectors/oauthError.d.ts +17 -0
  129. package/dist/connectors/oauthError.js +50 -0
  130. package/dist/connectors/oauthError.js.map +1 -0
  131. package/dist/connectors/postgres.d.ts +7 -0
  132. package/dist/connectors/postgres.js +32 -2
  133. package/dist/connectors/postgres.js.map +1 -1
  134. package/dist/connectors/posthog.js +26 -0
  135. package/dist/connectors/posthog.js.map +1 -1
  136. package/dist/connectors/redis.d.ts +1 -0
  137. package/dist/connectors/redis.js +47 -20
  138. package/dist/connectors/redis.js.map +1 -1
  139. package/dist/connectors/salesforce.js +66 -5
  140. package/dist/connectors/salesforce.js.map +1 -1
  141. package/dist/connectors/sentry.js +2 -2
  142. package/dist/connectors/sentry.js.map +1 -1
  143. package/dist/connectors/slack.js +37 -14
  144. package/dist/connectors/slack.js.map +1 -1
  145. package/dist/connectors/snowflake.js +24 -0
  146. package/dist/connectors/snowflake.js.map +1 -1
  147. package/dist/connectors/stripe.js +9 -2
  148. package/dist/connectors/stripe.js.map +1 -1
  149. package/dist/connectors/supabase.js +34 -0
  150. package/dist/connectors/supabase.js.map +1 -1
  151. package/dist/connectors/tokenStorage.d.ts +20 -0
  152. package/dist/connectors/tokenStorage.js +196 -64
  153. package/dist/connectors/tokenStorage.js.map +1 -1
  154. package/dist/connectors/woocommerce.js +34 -0
  155. package/dist/connectors/woocommerce.js.map +1 -1
  156. package/dist/copilot/parseIntent.d.ts +58 -0
  157. package/dist/copilot/parseIntent.js +149 -0
  158. package/dist/copilot/parseIntent.js.map +1 -0
  159. package/dist/decisionReplay.d.ts +8 -6
  160. package/dist/decisionReplay.js +35 -11
  161. package/dist/decisionReplay.js.map +1 -1
  162. package/dist/decisionTraceLog.d.ts +9 -0
  163. package/dist/decisionTraceLog.js +6 -0
  164. package/dist/decisionTraceLog.js.map +1 -1
  165. package/dist/drivers/claude/api.js +49 -7
  166. package/dist/drivers/claude/api.js.map +1 -1
  167. package/dist/drivers/claude/envSanitizer.d.ts +9 -1
  168. package/dist/drivers/claude/envSanitizer.js +41 -3
  169. package/dist/drivers/claude/envSanitizer.js.map +1 -1
  170. package/dist/drivers/claude/streamParser.d.ts +13 -0
  171. package/dist/drivers/claude/streamParser.js.map +1 -1
  172. package/dist/drivers/claude/subprocess.js +131 -16
  173. package/dist/drivers/claude/subprocess.js.map +1 -1
  174. package/dist/drivers/claude/subprocessSettings.d.ts +1 -1
  175. package/dist/drivers/claude/subprocessSettings.js +18 -4
  176. package/dist/drivers/claude/subprocessSettings.js.map +1 -1
  177. package/dist/drivers/gemini/index.d.ts +13 -0
  178. package/dist/drivers/gemini/index.js +211 -67
  179. package/dist/drivers/gemini/index.js.map +1 -1
  180. package/dist/drivers/local/index.d.ts +2 -17
  181. package/dist/drivers/local/index.js +5 -92
  182. package/dist/drivers/local/index.js.map +1 -1
  183. package/dist/drivers/openai/index.js +69 -9
  184. package/dist/drivers/openai/index.js.map +1 -1
  185. package/dist/drivers/outputCap.d.ts +27 -0
  186. package/dist/drivers/outputCap.js +50 -0
  187. package/dist/drivers/outputCap.js.map +1 -0
  188. package/dist/embeddings/cosine.d.ts +23 -0
  189. package/dist/embeddings/cosine.js +59 -0
  190. package/dist/embeddings/cosine.js.map +1 -0
  191. package/dist/embeddings/index.d.ts +19 -0
  192. package/dist/embeddings/index.js +35 -0
  193. package/dist/embeddings/index.js.map +1 -0
  194. package/dist/embeddings/localEmbeddings.d.ts +29 -0
  195. package/dist/embeddings/localEmbeddings.js +103 -0
  196. package/dist/embeddings/localEmbeddings.js.map +1 -0
  197. package/dist/embeddings/localEndpoints.d.ts +24 -0
  198. package/dist/embeddings/localEndpoints.js +37 -0
  199. package/dist/embeddings/localEndpoints.js.map +1 -0
  200. package/dist/embeddings/types.d.ts +32 -0
  201. package/dist/embeddings/types.js +12 -0
  202. package/dist/embeddings/types.js.map +1 -0
  203. package/dist/featureFlags.d.ts +18 -0
  204. package/dist/featureFlags.js +32 -0
  205. package/dist/featureFlags.js.map +1 -1
  206. package/dist/fp/automationInterpreter.js +118 -39
  207. package/dist/fp/automationInterpreter.js.map +1 -1
  208. package/dist/fp/automationProgram.d.ts +10 -0
  209. package/dist/fp/automationProgram.js.map +1 -1
  210. package/dist/fp/automationState.d.ts +6 -0
  211. package/dist/fp/automationState.js +38 -0
  212. package/dist/fp/automationState.js.map +1 -1
  213. package/dist/fp/commandDescription.d.ts +6 -0
  214. package/dist/fp/commandDescription.js +18 -5
  215. package/dist/fp/commandDescription.js.map +1 -1
  216. package/dist/fp/interpreterContext.d.ts +16 -5
  217. package/dist/fp/interpreterContext.js +59 -3
  218. package/dist/fp/interpreterContext.js.map +1 -1
  219. package/dist/fp/policyParser.js +18 -8
  220. package/dist/fp/policyParser.js.map +1 -1
  221. package/dist/haltPushDispatch.d.ts +4 -0
  222. package/dist/haltPushDispatch.js +7 -22
  223. package/dist/haltPushDispatch.js.map +1 -1
  224. package/dist/inboxRoutes.js +2 -2
  225. package/dist/inboxRoutes.js.map +1 -1
  226. package/dist/index.js +672 -135
  227. package/dist/index.js.map +1 -1
  228. package/dist/installGuard.js +6 -0
  229. package/dist/installGuard.js.map +1 -1
  230. package/dist/localEndpointGuard.d.ts +25 -0
  231. package/dist/localEndpointGuard.js +101 -0
  232. package/dist/localEndpointGuard.js.map +1 -0
  233. package/dist/mcpRoutes.js +1 -1
  234. package/dist/mcpRoutes.js.map +1 -1
  235. package/dist/oauth.d.ts +13 -0
  236. package/dist/oauth.js +53 -9
  237. package/dist/oauth.js.map +1 -1
  238. package/dist/orchestrator/childBridgeClient.d.ts +7 -0
  239. package/dist/orchestrator/childBridgeClient.js +42 -1
  240. package/dist/orchestrator/childBridgeClient.js.map +1 -1
  241. package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
  242. package/dist/orchestrator/orchestratorBridge.js +75 -9
  243. package/dist/orchestrator/orchestratorBridge.js.map +1 -1
  244. package/dist/patchworkConfig.d.ts +4 -0
  245. package/dist/patchworkConfig.js +33 -4
  246. package/dist/patchworkConfig.js.map +1 -1
  247. package/dist/probe.js +39 -5
  248. package/dist/probe.js.map +1 -1
  249. package/dist/recipeOrchestration.d.ts +59 -0
  250. package/dist/recipeOrchestration.js +314 -60
  251. package/dist/recipeOrchestration.js.map +1 -1
  252. package/dist/recipeRoutes.d.ts +93 -0
  253. package/dist/recipeRoutes.js +664 -27
  254. package/dist/recipeRoutes.js.map +1 -1
  255. package/dist/recipes/RecipeOrchestrator.d.ts +14 -0
  256. package/dist/recipes/RecipeOrchestrator.js +42 -2
  257. package/dist/recipes/RecipeOrchestrator.js.map +1 -1
  258. package/dist/recipes/agentExecutor.d.ts +51 -2
  259. package/dist/recipes/agentExecutor.js +86 -13
  260. package/dist/recipes/agentExecutor.js.map +1 -1
  261. package/dist/recipes/chainedRunner.d.ts +111 -3
  262. package/dist/recipes/chainedRunner.js +440 -45
  263. package/dist/recipes/chainedRunner.js.map +1 -1
  264. package/dist/recipes/compiler.js +42 -29
  265. package/dist/recipes/compiler.js.map +1 -1
  266. package/dist/recipes/connectorPreflight.js +31 -0
  267. package/dist/recipes/connectorPreflight.js.map +1 -1
  268. package/dist/recipes/dependencyGraph.d.ts +16 -0
  269. package/dist/recipes/dependencyGraph.js +37 -2
  270. package/dist/recipes/dependencyGraph.js.map +1 -1
  271. package/dist/recipes/eventTriggerPrograms.d.ts +36 -0
  272. package/dist/recipes/eventTriggerPrograms.js +158 -0
  273. package/dist/recipes/eventTriggerPrograms.js.map +1 -0
  274. package/dist/recipes/githubInstallSource.d.ts +9 -2
  275. package/dist/recipes/githubInstallSource.js +36 -6
  276. package/dist/recipes/githubInstallSource.js.map +1 -1
  277. package/dist/recipes/haltCategory.d.ts +10 -0
  278. package/dist/recipes/haltCategory.js +11 -1
  279. package/dist/recipes/haltCategory.js.map +1 -1
  280. package/dist/recipes/idempotencyKey.d.ts +30 -3
  281. package/dist/recipes/idempotencyKey.js +89 -5
  282. package/dist/recipes/idempotencyKey.js.map +1 -1
  283. package/dist/recipes/installer.js +12 -35
  284. package/dist/recipes/installer.js.map +1 -1
  285. package/dist/recipes/judgeVerdict.d.ts +11 -1
  286. package/dist/recipes/judgeVerdict.js +47 -7
  287. package/dist/recipes/judgeVerdict.js.map +1 -1
  288. package/dist/recipes/names.d.ts +5 -0
  289. package/dist/recipes/names.js +10 -5
  290. package/dist/recipes/names.js.map +1 -1
  291. package/dist/recipes/parser.js +74 -10
  292. package/dist/recipes/parser.js.map +1 -1
  293. package/dist/recipes/pricing/costRouter.d.ts +43 -0
  294. package/dist/recipes/pricing/costRouter.js +44 -0
  295. package/dist/recipes/pricing/costRouter.js.map +1 -0
  296. package/dist/recipes/pricing/priceTable.d.ts +76 -0
  297. package/dist/recipes/pricing/priceTable.js +144 -0
  298. package/dist/recipes/pricing/priceTable.js.map +1 -0
  299. package/dist/recipes/replayRun.js +5 -2
  300. package/dist/recipes/replayRun.js.map +1 -1
  301. package/dist/recipes/resolveRecipePath.js +15 -1
  302. package/dist/recipes/resolveRecipePath.js.map +1 -1
  303. package/dist/recipes/runBudget.d.ts +93 -32
  304. package/dist/recipes/runBudget.js +213 -49
  305. package/dist/recipes/runBudget.js.map +1 -1
  306. package/dist/recipes/runRegistry.d.ts +32 -0
  307. package/dist/recipes/runRegistry.js +54 -0
  308. package/dist/recipes/runRegistry.js.map +1 -0
  309. package/dist/recipes/scheduler.js +6 -2
  310. package/dist/recipes/scheduler.js.map +1 -1
  311. package/dist/recipes/schema.d.ts +59 -6
  312. package/dist/recipes/schemaGenerator.d.ts +9 -0
  313. package/dist/recipes/schemaGenerator.js +446 -77
  314. package/dist/recipes/schemaGenerator.js.map +1 -1
  315. package/dist/recipes/simulation/aggregateRunRisk.d.ts +46 -0
  316. package/dist/recipes/simulation/aggregateRunRisk.js +120 -0
  317. package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
  318. package/dist/recipes/simulation/costProjector.d.ts +32 -0
  319. package/dist/recipes/simulation/costProjector.js +194 -0
  320. package/dist/recipes/simulation/costProjector.js.map +1 -0
  321. package/dist/recipes/simulation/sideEffects.d.ts +32 -0
  322. package/dist/recipes/simulation/sideEffects.js +62 -0
  323. package/dist/recipes/simulation/sideEffects.js.map +1 -0
  324. package/dist/recipes/simulation/simulate.d.ts +36 -0
  325. package/dist/recipes/simulation/simulate.js +264 -0
  326. package/dist/recipes/simulation/simulate.js.map +1 -0
  327. package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
  328. package/dist/recipes/simulation/simulateMockedRun.js +84 -0
  329. package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
  330. package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
  331. package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
  332. package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
  333. package/dist/recipes/simulation/types.d.ts +198 -0
  334. package/dist/recipes/simulation/types.js +30 -0
  335. package/dist/recipes/simulation/types.js.map +1 -0
  336. package/dist/recipes/stepObservation.d.ts +12 -0
  337. package/dist/recipes/stepObservation.js +21 -1
  338. package/dist/recipes/stepObservation.js.map +1 -1
  339. package/dist/recipes/toolRegistry.js +61 -24
  340. package/dist/recipes/toolRegistry.js.map +1 -1
  341. package/dist/recipes/tools/airtable.d.ts +15 -0
  342. package/dist/recipes/tools/airtable.js +240 -0
  343. package/dist/recipes/tools/airtable.js.map +1 -0
  344. package/dist/recipes/tools/caldiy.d.ts +13 -0
  345. package/dist/recipes/tools/caldiy.js +215 -0
  346. package/dist/recipes/tools/caldiy.js.map +1 -0
  347. package/dist/recipes/tools/circleci.d.ts +10 -0
  348. package/dist/recipes/tools/circleci.js +204 -0
  349. package/dist/recipes/tools/circleci.js.map +1 -0
  350. package/dist/recipes/tools/cloudflare.d.ts +13 -0
  351. package/dist/recipes/tools/cloudflare.js +211 -0
  352. package/dist/recipes/tools/cloudflare.js.map +1 -0
  353. package/dist/recipes/tools/confluence.js +11 -10
  354. package/dist/recipes/tools/confluence.js.map +1 -1
  355. package/dist/recipes/tools/datadog.js +13 -12
  356. package/dist/recipes/tools/datadog.js.map +1 -1
  357. package/dist/recipes/tools/docs.d.ts +18 -0
  358. package/dist/recipes/tools/docs.js +95 -0
  359. package/dist/recipes/tools/docs.js.map +1 -0
  360. package/dist/recipes/tools/elasticsearch.d.ts +11 -0
  361. package/dist/recipes/tools/elasticsearch.js +157 -0
  362. package/dist/recipes/tools/elasticsearch.js.map +1 -0
  363. package/dist/recipes/tools/fanOut.js +4 -4
  364. package/dist/recipes/tools/fanOut.js.map +1 -1
  365. package/dist/recipes/tools/figma.d.ts +12 -0
  366. package/dist/recipes/tools/figma.js +195 -0
  367. package/dist/recipes/tools/figma.js.map +1 -0
  368. package/dist/recipes/tools/file.js +43 -22
  369. package/dist/recipes/tools/file.js.map +1 -1
  370. package/dist/recipes/tools/github.js +162 -5
  371. package/dist/recipes/tools/github.js.map +1 -1
  372. package/dist/recipes/tools/gmail.js +45 -33
  373. package/dist/recipes/tools/gmail.js.map +1 -1
  374. package/dist/recipes/tools/grafana.d.ts +11 -0
  375. package/dist/recipes/tools/grafana.js +216 -0
  376. package/dist/recipes/tools/grafana.js.map +1 -0
  377. package/dist/recipes/tools/http.d.ts +1 -1
  378. package/dist/recipes/tools/http.js +10 -28
  379. package/dist/recipes/tools/http.js.map +1 -1
  380. package/dist/recipes/tools/hubspot.js +13 -12
  381. package/dist/recipes/tools/hubspot.js.map +1 -1
  382. package/dist/recipes/tools/index.d.ts +28 -0
  383. package/dist/recipes/tools/index.js +28 -0
  384. package/dist/recipes/tools/index.js.map +1 -1
  385. package/dist/recipes/tools/intercom.js +11 -10
  386. package/dist/recipes/tools/intercom.js.map +1 -1
  387. package/dist/recipes/tools/jira.js +13 -0
  388. package/dist/recipes/tools/jira.js.map +1 -1
  389. package/dist/recipes/tools/meetingNotes.js +2 -2
  390. package/dist/recipes/tools/monday.d.ts +22 -0
  391. package/dist/recipes/tools/monday.js +242 -0
  392. package/dist/recipes/tools/monday.js.map +1 -0
  393. package/dist/recipes/tools/mongodb.d.ts +19 -0
  394. package/dist/recipes/tools/mongodb.js +194 -0
  395. package/dist/recipes/tools/mongodb.js.map +1 -0
  396. package/dist/recipes/tools/notion.js +11 -10
  397. package/dist/recipes/tools/notion.js.map +1 -1
  398. package/dist/recipes/tools/obsidian.d.ts +15 -0
  399. package/dist/recipes/tools/obsidian.js +173 -0
  400. package/dist/recipes/tools/obsidian.js.map +1 -0
  401. package/dist/recipes/tools/outcomes.d.ts +15 -0
  402. package/dist/recipes/tools/outcomes.js +111 -0
  403. package/dist/recipes/tools/outcomes.js.map +1 -0
  404. package/dist/recipes/tools/paystack.d.ts +11 -0
  405. package/dist/recipes/tools/paystack.js +212 -0
  406. package/dist/recipes/tools/paystack.js.map +1 -0
  407. package/dist/recipes/tools/pipedrive.d.ts +16 -0
  408. package/dist/recipes/tools/pipedrive.js +234 -0
  409. package/dist/recipes/tools/pipedrive.js.map +1 -0
  410. package/dist/recipes/tools/postgres.d.ts +15 -0
  411. package/dist/recipes/tools/postgres.js +186 -0
  412. package/dist/recipes/tools/postgres.js.map +1 -0
  413. package/dist/recipes/tools/posthog.d.ts +16 -0
  414. package/dist/recipes/tools/posthog.js +219 -0
  415. package/dist/recipes/tools/posthog.js.map +1 -0
  416. package/dist/recipes/tools/redis.d.ts +9 -0
  417. package/dist/recipes/tools/redis.js +141 -0
  418. package/dist/recipes/tools/redis.js.map +1 -0
  419. package/dist/recipes/tools/resend.d.ts +8 -0
  420. package/dist/recipes/tools/resend.js +153 -0
  421. package/dist/recipes/tools/resend.js.map +1 -0
  422. package/dist/recipes/tools/salesforce.d.ts +16 -0
  423. package/dist/recipes/tools/salesforce.js +184 -0
  424. package/dist/recipes/tools/salesforce.js.map +1 -0
  425. package/dist/recipes/tools/sendgrid.d.ts +9 -0
  426. package/dist/recipes/tools/sendgrid.js +175 -0
  427. package/dist/recipes/tools/sendgrid.js.map +1 -0
  428. package/dist/recipes/tools/shopify.d.ts +16 -0
  429. package/dist/recipes/tools/shopify.js +266 -0
  430. package/dist/recipes/tools/shopify.js.map +1 -0
  431. package/dist/recipes/tools/snowflake.d.ts +16 -0
  432. package/dist/recipes/tools/snowflake.js +173 -0
  433. package/dist/recipes/tools/snowflake.js.map +1 -0
  434. package/dist/recipes/tools/stripe.js +13 -12
  435. package/dist/recipes/tools/stripe.js.map +1 -1
  436. package/dist/recipes/tools/supabase.d.ts +9 -0
  437. package/dist/recipes/tools/supabase.js +133 -0
  438. package/dist/recipes/tools/supabase.js.map +1 -0
  439. package/dist/recipes/tools/todoist.d.ts +15 -0
  440. package/dist/recipes/tools/todoist.js +228 -0
  441. package/dist/recipes/tools/todoist.js.map +1 -0
  442. package/dist/recipes/tools/twilio.d.ts +11 -0
  443. package/dist/recipes/tools/twilio.js +180 -0
  444. package/dist/recipes/tools/twilio.js.map +1 -0
  445. package/dist/recipes/tools/vercel.d.ts +9 -0
  446. package/dist/recipes/tools/vercel.js +146 -0
  447. package/dist/recipes/tools/vercel.js.map +1 -0
  448. package/dist/recipes/tools/webflow.d.ts +11 -0
  449. package/dist/recipes/tools/webflow.js +244 -0
  450. package/dist/recipes/tools/webflow.js.map +1 -0
  451. package/dist/recipes/tools/woocommerce.d.ts +18 -0
  452. package/dist/recipes/tools/woocommerce.js +260 -0
  453. package/dist/recipes/tools/woocommerce.js.map +1 -0
  454. package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
  455. package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
  456. package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
  457. package/dist/recipes/tools/zendesk.js +11 -10
  458. package/dist/recipes/tools/zendesk.js.map +1 -1
  459. package/dist/recipes/triggerVars.d.ts +15 -0
  460. package/dist/recipes/triggerVars.js +57 -0
  461. package/dist/recipes/triggerVars.js.map +1 -0
  462. package/dist/recipes/validation.d.ts +1 -1
  463. package/dist/recipes/validation.js +536 -12
  464. package/dist/recipes/validation.js.map +1 -1
  465. package/dist/recipes/yamlPositions.d.ts +1 -1
  466. package/dist/recipes/yamlPositions.js +7 -2
  467. package/dist/recipes/yamlPositions.js.map +1 -1
  468. package/dist/recipes/yamlRunner.d.ts +216 -4
  469. package/dist/recipes/yamlRunner.js +1030 -96
  470. package/dist/recipes/yamlRunner.js.map +1 -1
  471. package/dist/recipesHttp.d.ts +5 -0
  472. package/dist/recipesHttp.js +68 -6
  473. package/dist/recipesHttp.js.map +1 -1
  474. package/dist/resources.js +14 -1
  475. package/dist/resources.js.map +1 -1
  476. package/dist/riskSignals.d.ts +42 -0
  477. package/dist/riskSignals.js +197 -0
  478. package/dist/riskSignals.js.map +1 -0
  479. package/dist/riskTier.d.ts +9 -0
  480. package/dist/riskTier.js +48 -0
  481. package/dist/riskTier.js.map +1 -1
  482. package/dist/runLog.d.ts +53 -0
  483. package/dist/runLog.js +75 -16
  484. package/dist/runLog.js.map +1 -1
  485. package/dist/schemas/recipe.v1.json +360 -16
  486. package/dist/server.d.ts +60 -0
  487. package/dist/server.js +192 -31
  488. package/dist/server.js.map +1 -1
  489. package/dist/sessionCheckpoint.js +4 -1
  490. package/dist/sessionCheckpoint.js.map +1 -1
  491. package/dist/sessionDetail.d.ts +43 -0
  492. package/dist/sessionDetail.js +59 -0
  493. package/dist/sessionDetail.js.map +1 -0
  494. package/dist/settingsEnv.d.ts +47 -0
  495. package/dist/settingsEnv.js +88 -0
  496. package/dist/settingsEnv.js.map +1 -0
  497. package/dist/streamableHttp.js +44 -10
  498. package/dist/streamableHttp.js.map +1 -1
  499. package/dist/ta/backtest/abnday.d.ts +53 -0
  500. package/dist/ta/backtest/abnday.js +123 -0
  501. package/dist/ta/backtest/abnday.js.map +1 -0
  502. package/dist/ta/backtest/directional.d.ts +48 -0
  503. package/dist/ta/backtest/directional.js +103 -0
  504. package/dist/ta/backtest/directional.js.map +1 -0
  505. package/dist/ta/backtest/fundx.d.ts +67 -0
  506. package/dist/ta/backtest/fundx.js +264 -0
  507. package/dist/ta/backtest/fundx.js.map +1 -0
  508. package/dist/ta/backtest/fvg.d.ts +62 -0
  509. package/dist/ta/backtest/fvg.js +236 -0
  510. package/dist/ta/backtest/fvg.js.map +1 -0
  511. package/dist/ta/backtest/ichimoku.d.ts +41 -0
  512. package/dist/ta/backtest/ichimoku.js +146 -0
  513. package/dist/ta/backtest/ichimoku.js.map +1 -0
  514. package/dist/ta/backtest/ingest.d.ts +20 -0
  515. package/dist/ta/backtest/ingest.js +104 -0
  516. package/dist/ta/backtest/ingest.js.map +1 -0
  517. package/dist/ta/backtest/msb.d.ts +49 -0
  518. package/dist/ta/backtest/msb.js +162 -0
  519. package/dist/ta/backtest/msb.js.map +1 -0
  520. package/dist/ta/backtest/scoring.d.ts +33 -0
  521. package/dist/ta/backtest/scoring.js +82 -0
  522. package/dist/ta/backtest/scoring.js.map +1 -0
  523. package/dist/ta/backtest/summary.d.ts +20 -0
  524. package/dist/ta/backtest/summary.js +42 -0
  525. package/dist/ta/backtest/summary.js.map +1 -0
  526. package/dist/ta/backtest/tsmom.d.ts +72 -0
  527. package/dist/ta/backtest/tsmom.js +202 -0
  528. package/dist/ta/backtest/tsmom.js.map +1 -0
  529. package/dist/ta/backtest/volsq.d.ts +34 -0
  530. package/dist/ta/backtest/volsq.js +154 -0
  531. package/dist/ta/backtest/volsq.js.map +1 -0
  532. package/dist/ta/backtest/walkForward.d.ts +45 -0
  533. package/dist/ta/backtest/walkForward.js +136 -0
  534. package/dist/ta/backtest/walkForward.js.map +1 -0
  535. package/dist/ta/cycles.d.ts +15 -0
  536. package/dist/ta/cycles.js +31 -0
  537. package/dist/ta/cycles.js.map +1 -0
  538. package/dist/ta/desk/accrualEmitter.d.ts +59 -0
  539. package/dist/ta/desk/accrualEmitter.js +136 -0
  540. package/dist/ta/desk/accrualEmitter.js.map +1 -0
  541. package/dist/ta/desk/cellBacktest.d.ts +179 -0
  542. package/dist/ta/desk/cellBacktest.js +514 -0
  543. package/dist/ta/desk/cellBacktest.js.map +1 -0
  544. package/dist/ta/desk/cells/wpMaRejection.d.ts +49 -0
  545. package/dist/ta/desk/cells/wpMaRejection.js +141 -0
  546. package/dist/ta/desk/cells/wpMaRejection.js.map +1 -0
  547. package/dist/ta/desk/cells/wpVolumeClimax.d.ts +57 -0
  548. package/dist/ta/desk/cells/wpVolumeClimax.js +193 -0
  549. package/dist/ta/desk/cells/wpVolumeClimax.js.map +1 -0
  550. package/dist/ta/desk/collectors.d.ts +18 -0
  551. package/dist/ta/desk/collectors.js +450 -0
  552. package/dist/ta/desk/collectors.js.map +1 -0
  553. package/dist/ta/desk/contract.d.ts +51 -0
  554. package/dist/ta/desk/contract.js +261 -0
  555. package/dist/ta/desk/contract.js.map +1 -0
  556. package/dist/ta/desk/deskLedger.d.ts +36 -0
  557. package/dist/ta/desk/deskLedger.js +239 -0
  558. package/dist/ta/desk/deskLedger.js.map +1 -0
  559. package/dist/ta/desk/liqTape.d.ts +37 -0
  560. package/dist/ta/desk/liqTape.js +99 -0
  561. package/dist/ta/desk/liqTape.js.map +1 -0
  562. package/dist/ta/desk/post.d.ts +20 -0
  563. package/dist/ta/desk/post.js +65 -0
  564. package/dist/ta/desk/post.js.map +1 -0
  565. package/dist/ta/desk/render.d.ts +25 -0
  566. package/dist/ta/desk/render.js +398 -0
  567. package/dist/ta/desk/render.js.map +1 -0
  568. package/dist/ta/desk/surfaces.d.ts +216 -0
  569. package/dist/ta/desk/surfaces.js +472 -0
  570. package/dist/ta/desk/surfaces.js.map +1 -0
  571. package/dist/ta/desk/types.d.ts +174 -0
  572. package/dist/ta/desk/types.js +104 -0
  573. package/dist/ta/desk/types.js.map +1 -0
  574. package/dist/ta/index.d.ts +23 -0
  575. package/dist/ta/index.js +54 -0
  576. package/dist/ta/index.js.map +1 -0
  577. package/dist/ta/ledger.d.ts +44 -0
  578. package/dist/ta/ledger.js +95 -0
  579. package/dist/ta/ledger.js.map +1 -0
  580. package/dist/ta/levels.d.ts +21 -0
  581. package/dist/ta/levels.js +41 -0
  582. package/dist/ta/levels.js.map +1 -0
  583. package/dist/ta/swings.d.ts +30 -0
  584. package/dist/ta/swings.js +83 -0
  585. package/dist/ta/swings.js.map +1 -0
  586. package/dist/ta/types.d.ts +81 -0
  587. package/dist/ta/types.js +20 -0
  588. package/dist/ta/types.js.map +1 -0
  589. package/dist/telemetry.js +20 -9
  590. package/dist/telemetry.js.map +1 -1
  591. package/dist/tokenUsageTracker.d.ts +2 -1
  592. package/dist/tokenUsageTracker.js +38 -20
  593. package/dist/tokenUsageTracker.js.map +1 -1
  594. package/dist/tools/contextBundle.js +13 -9
  595. package/dist/tools/contextBundle.js.map +1 -1
  596. package/dist/tools/ctxGetTaskContext.js +8 -3
  597. package/dist/tools/ctxGetTaskContext.js.map +1 -1
  598. package/dist/tools/ctxQueryTraces.d.ts +18 -1
  599. package/dist/tools/ctxQueryTraces.js +176 -27
  600. package/dist/tools/ctxQueryTraces.js.map +1 -1
  601. package/dist/tools/enrichCommit.js +5 -2
  602. package/dist/tools/enrichCommit.js.map +1 -1
  603. package/dist/tools/getDependencyTree.js +2 -2
  604. package/dist/tools/getDependencyTree.js.map +1 -1
  605. package/dist/tools/getDiagnostics.js +3 -0
  606. package/dist/tools/getDiagnostics.js.map +1 -1
  607. package/dist/tools/getDocumentSymbols.js +5 -1
  608. package/dist/tools/getDocumentSymbols.js.map +1 -1
  609. package/dist/tools/getGitHotspots.js +12 -1
  610. package/dist/tools/getGitHotspots.js.map +1 -1
  611. package/dist/tools/getGitLog.js +5 -2
  612. package/dist/tools/getGitLog.js.map +1 -1
  613. package/dist/tools/getGitStatus.js +6 -1
  614. package/dist/tools/getGitStatus.js.map +1 -1
  615. package/dist/tools/getProjectContext.js +3 -1
  616. package/dist/tools/getProjectContext.js.map +1 -1
  617. package/dist/tools/getToolCapabilities.js +39 -4
  618. package/dist/tools/getToolCapabilities.js.map +1 -1
  619. package/dist/tools/gitWrite.js +12 -3
  620. package/dist/tools/gitWrite.js.map +1 -1
  621. package/dist/tools/github/composite.d.ts +1 -1
  622. package/dist/tools/github/composite.js +7 -7
  623. package/dist/tools/github/composite.js.map +1 -1
  624. package/dist/tools/github/pr.d.ts +6 -6
  625. package/dist/tools/github/pr.js +18 -11
  626. package/dist/tools/github/pr.js.map +1 -1
  627. package/dist/tools/httpClient.js +55 -3
  628. package/dist/tools/httpClient.js.map +1 -1
  629. package/dist/tools/index.d.ts +2 -1
  630. package/dist/tools/index.js +19 -12
  631. package/dist/tools/index.js.map +1 -1
  632. package/dist/tools/lsp.d.ts +6 -0
  633. package/dist/tools/lsp.js +81 -12
  634. package/dist/tools/lsp.js.map +1 -1
  635. package/dist/tools/previewEdit.js +16 -1
  636. package/dist/tools/previewEdit.js.map +1 -1
  637. package/dist/tools/resumeClaudeTask.js +17 -0
  638. package/dist/tools/resumeClaudeTask.js.map +1 -1
  639. package/dist/tools/searchAndReplace.js +9 -5
  640. package/dist/tools/searchAndReplace.js.map +1 -1
  641. package/dist/tools/searchTools.d.ts +26 -0
  642. package/dist/tools/searchTools.js +42 -2
  643. package/dist/tools/searchTools.js.map +1 -1
  644. package/dist/tools/terminal.js +23 -51
  645. package/dist/tools/terminal.js.map +1 -1
  646. package/dist/tools/transaction.d.ts +9 -1
  647. package/dist/tools/transaction.js +59 -4
  648. package/dist/tools/transaction.js.map +1 -1
  649. package/dist/tools/utils.d.ts +16 -0
  650. package/dist/tools/utils.js +77 -7
  651. package/dist/tools/utils.js.map +1 -1
  652. package/dist/transport.d.ts +31 -0
  653. package/dist/transport.js +117 -14
  654. package/dist/transport.js.map +1 -1
  655. package/dist/wireHaltPushDispatch.js +12 -0
  656. package/dist/wireHaltPushDispatch.js.map +1 -1
  657. package/dist/workerGateDecisionLog.d.ts +141 -0
  658. package/dist/workerGateDecisionLog.js +361 -0
  659. package/dist/workerGateDecisionLog.js.map +1 -0
  660. package/dist/workers/actionClass.d.ts +38 -0
  661. package/dist/workers/actionClass.js +155 -0
  662. package/dist/workers/actionClass.js.map +1 -0
  663. package/dist/workers/backtest.d.ts +68 -0
  664. package/dist/workers/backtest.js +113 -0
  665. package/dist/workers/backtest.js.map +1 -0
  666. package/dist/workers/contextRisk.d.ts +35 -0
  667. package/dist/workers/contextRisk.js +20 -0
  668. package/dist/workers/contextRisk.js.map +1 -0
  669. package/dist/workers/contextRiskScorer.d.ts +48 -0
  670. package/dist/workers/contextRiskScorer.js +94 -0
  671. package/dist/workers/contextRiskScorer.js.map +1 -0
  672. package/dist/workers/graduation.d.ts +61 -0
  673. package/dist/workers/graduation.js +112 -0
  674. package/dist/workers/graduation.js.map +1 -0
  675. package/dist/workers/outcomeStore.d.ts +98 -0
  676. package/dist/workers/outcomeStore.js +146 -0
  677. package/dist/workers/outcomeStore.js.map +1 -0
  678. package/dist/workers/outcomesCli.d.ts +34 -0
  679. package/dist/workers/outcomesCli.js +91 -0
  680. package/dist/workers/outcomesCli.js.map +1 -0
  681. package/dist/workers/runWorkerShadow.d.ts +90 -0
  682. package/dist/workers/runWorkerShadow.js +323 -0
  683. package/dist/workers/runWorkerShadow.js.map +1 -0
  684. package/dist/workers/shadowGate.d.ts +30 -0
  685. package/dist/workers/shadowGate.js +58 -0
  686. package/dist/workers/shadowGate.js.map +1 -0
  687. package/dist/workers/shadowObserver.d.ts +165 -0
  688. package/dist/workers/shadowObserver.js +203 -0
  689. package/dist/workers/shadowObserver.js.map +1 -0
  690. package/dist/workers/shadowReport.d.ts +16 -0
  691. package/dist/workers/shadowReport.js +61 -0
  692. package/dist/workers/shadowReport.js.map +1 -0
  693. package/dist/workers/shadowRun.d.ts +38 -0
  694. package/dist/workers/shadowRun.js +44 -0
  695. package/dist/workers/shadowRun.js.map +1 -0
  696. package/dist/workers/trustLevel.d.ts +82 -0
  697. package/dist/workers/trustLevel.js +100 -0
  698. package/dist/workers/trustLevel.js.map +1 -0
  699. package/dist/workers/worker.d.ts +49 -0
  700. package/dist/workers/worker.js +88 -0
  701. package/dist/workers/worker.js.map +1 -0
  702. package/dist/workers/workerGate.d.ts +101 -0
  703. package/dist/workers/workerGate.js +210 -0
  704. package/dist/workers/workerGate.js.map +1 -0
  705. package/dist/workers/workerLevelStore.d.ts +33 -0
  706. package/dist/workers/workerLevelStore.js +87 -0
  707. package/dist/workers/workerLevelStore.js.map +1 -0
  708. package/dist/workers/workerLoader.d.ts +7 -0
  709. package/dist/workers/workerLoader.js +31 -0
  710. package/dist/workers/workerLoader.js.map +1 -0
  711. package/dist/writeFileAtomic.js +40 -13
  712. package/dist/writeFileAtomic.js.map +1 -1
  713. package/package.json +14 -6
  714. package/scripts/mcp-stdio-shim.cjs +247 -87
  715. package/templates/CLAUDE.bridge.md +1 -1
  716. package/templates/recipes/dependency-bump.yaml +33 -0
  717. package/templates/recipes/incident-to-pr.yaml +187 -0
  718. package/templates/recipes/outcome-ingester.yaml +53 -0
  719. package/templates/recipes/release-notes.yaml +30 -0
  720. package/templates/recipes/triage-failing-tests-autofile.yaml +152 -0
  721. package/templates/recipes/triage-failing-tests.yaml +38 -0
  722. package/templates/workers/dependency-upkeep.worker.yaml +26 -0
  723. package/templates/workers/release-notes.worker.yaml +17 -0
  724. package/templates/workers/test-guardian.worker.yaml +24 -0
  725. package/deploy/README.md +0 -172
  726. package/deploy/bootstrap-new-vps.sh +0 -364
  727. package/deploy/bootstrap-vps.sh +0 -192
  728. package/deploy/claude-ide-bridge.service.template +0 -67
  729. package/deploy/claude-ide-bridge@.service +0 -31
  730. package/deploy/deploy-dashboard.sh +0 -198
  731. package/deploy/deploy-landing.sh +0 -136
  732. package/deploy/ecosystem.config.js.example +0 -36
  733. package/deploy/install-vps-service.sh +0 -240
  734. package/deploy/macos/README.md +0 -153
  735. package/deploy/macos/com.patchwork.bridge.plist.template +0 -54
  736. package/deploy/macos/com.patchwork.tunnel.plist.template +0 -76
  737. package/deploy/macos/install-mac-bridge.sh +0 -244
  738. package/deploy/macos/uninstall-mac-bridge.sh +0 -22
  739. package/deploy/nginx-claude-bridge.conf.template +0 -129
package/dist/bridge.js CHANGED
@@ -15,6 +15,7 @@ import { ClaudeOrchestrator } from "./claudeOrchestrator.js";
15
15
  import { CommitIssueLinkLog } from "./commitIssueLinkLog.js";
16
16
  import { DecisionTraceLog } from "./decisionTraceLog.js";
17
17
  import { createDriver } from "./drivers/index.js";
18
+ import { getLocalEmbedFn } from "./embeddings/index.js";
18
19
  import { ExtensionClient } from "./extensionClient.js";
19
20
  import { lockKillSwitchEnv, watchFlags } from "./featureFlags.js";
20
21
  import { FileLock } from "./fileLock.js";
@@ -28,14 +29,16 @@ import { PluginWatcher } from "./pluginWatcher.js";
28
29
  import { isPreToolUseHookRegistered } from "./preToolUseHook.js";
29
30
  import { probeAll } from "./probe.js";
30
31
  import { RecipeOrchestration } from "./recipeOrchestration.js";
32
+ import { collectEventTriggerPrograms, shouldAutoEnableAutomation, } from "./recipes/eventTriggerPrograms.js";
31
33
  import { haltSummaryToPrometheus, summariseHalts, } from "./recipes/haltCategory.js";
32
34
  import { judgeSummaryToPrometheus, summariseJudgments, } from "./recipes/judgeSummary.js";
33
35
  import { warnAboutLegacyPermissionsSidecars } from "./recipes/migrationWarnings.js";
34
36
  import { RecipeOrchestrator } from "./recipes/RecipeOrchestrator.js";
35
- import { classifyTool } from "./riskTier.js";
37
+ import { evaluateInProcessGate } from "./riskSignals.js";
36
38
  import { RecipeRunLog } from "./runLog.js";
37
39
  import { Server } from "./server.js";
38
40
  import { SessionCheckpoint } from "./sessionCheckpoint.js";
41
+ import { buildSessionDetail } from "./sessionDetail.js";
39
42
  import { StreamableHttpHandler } from "./streamableHttp.js";
40
43
  import { initTelemetry, shutdownTelemetry } from "./telemetry.js";
41
44
  import { TokenUsageTracker } from "./tokenUsageTracker.js";
@@ -48,8 +51,9 @@ import { resolveFilePath } from "./tools/utils.js";
48
51
  import { McpTransport } from "./transport.js";
49
52
  import { PACKAGE_VERSION } from "./version.js";
50
53
  import { wireHaltPushDispatch } from "./wireHaltPushDispatch.js";
54
+ import { WorkerGateDecisionLog } from "./workerGateDecisionLog.js";
51
55
  const SHUTDOWN_TIMEOUT_MS = 5000;
52
- let globalHandlersRegistered = false;
56
+ let activeSignalHandlers = null;
53
57
  /** Collect the union of openedFiles across all sessions in a checkpoint. */
54
58
  export function extractRestoredFiles(checkpoint, workspace) {
55
59
  const all = new Set();
@@ -126,6 +130,7 @@ export class Bridge {
126
130
  recipeOrchestrator = null;
127
131
  commitIssueLinkLog = null;
128
132
  decisionTraceLog = null;
133
+ workerGateDecisionLog = null;
129
134
  /** Pre-computed digest of recent decisions, refreshed on each session connect. */
130
135
  recentTracesDigest = [];
131
136
  httpMcpHandler = null;
@@ -149,6 +154,10 @@ export class Bridge {
149
154
  this.server = new Server(this.authToken, this.logger, config.corsOrigins, undefined, config.trustedProxies);
150
155
  this.server.bridgeConfigPath = config.configFilePath ?? undefined;
151
156
  this.server.webhookSecret = config.webhookSecret ?? null;
157
+ // Audit 2026-06-08 (server-3): workspace-relative routes (decision replay,
158
+ // CC permission attribution, approval routing) must use the configured
159
+ // workspace, not the bridge process's cwd.
160
+ this.server.workspace = config.workspace;
152
161
  if (config.issuerUrl) {
153
162
  this.oauthServer = new OAuthServerImpl(this.authToken, config.issuerUrl, {
154
163
  configDir,
@@ -289,20 +298,24 @@ export class Bridge {
289
298
  catch {
290
299
  // Best-effort warning — never block startup on a hook check failure.
291
300
  }
292
- transport.setApprovalGate(async ({ toolName, params, sessionId }) => {
293
- const tier = classifyTool(toolName);
294
- if (this.server.approvalGate === "off")
295
- return "bypass";
296
- if (this.server.approvalGate !== "all" && tier !== "high")
301
+ transport.setApprovalGate(async ({ toolName, params, sessionId, onPending }) => {
302
+ const gate = evaluateInProcessGate({
303
+ toolName,
304
+ params,
305
+ gate: this.server.approvalGate,
306
+ workspace: this.config.workspace,
307
+ });
308
+ if (gate.decision === "bypass")
297
309
  return "bypass";
298
310
  const queue = getApprovalQueue();
299
- const { promise } = queue.request({
311
+ const { promise, callId } = queue.request({
300
312
  toolName,
301
313
  params,
302
- tier,
314
+ tier: gate.tier,
303
315
  sessionId: sessionId ?? undefined,
304
- riskSignals: [],
316
+ riskSignals: gate.riskSignals,
305
317
  });
318
+ onPending?.(callId);
306
319
  return promise;
307
320
  });
308
321
  }
@@ -375,7 +388,7 @@ export class Bridge {
375
388
  }), (generatedAt) => {
376
389
  this._lastContextCachedAt = generatedAt;
377
390
  this._emitLiveState();
378
- }, () => this.extensionDisconnectCount, this.commitIssueLinkLog ?? undefined, this.recipeRunLog ?? undefined, this.decisionTraceLog ?? undefined);
391
+ }, () => this.extensionDisconnectCount, this.commitIssueLinkLog ?? undefined, this.recipeRunLog ?? undefined, this.decisionTraceLog ?? undefined, this.workerGateDecisionLog ?? undefined);
379
392
  transport.attach(ws);
380
393
  this.sessions.set(sessionId, session);
381
394
  this.logger.info(`Claude Code connected (session ${sessionId.slice(0, 8)}) — ${this.sessions.size} active session${this.sessions.size === 1 ? "" : "s"}`);
@@ -558,7 +571,7 @@ export class Bridge {
558
571
  errors += e;
559
572
  warnings += w;
560
573
  if (e > 0)
561
- errorFiles.push(file.split("/").pop() ?? file);
574
+ errorFiles.push(path.basename(file) || file);
562
575
  }
563
576
  lines.push(`Diagnostics: ${errors} errors, ${warnings} warnings`);
564
577
  if (errorFiles.length > 0) {
@@ -735,6 +748,30 @@ export class Bridge {
735
748
  getAuthToken() {
736
749
  return this.authToken;
737
750
  }
751
+ /**
752
+ * Compile installed recipe triggers (file_watch / git_hook) and register them
753
+ * into the live AutomationHooks so they actually fire on the corresponding
754
+ * events. Without this, such recipes are parsed + installed but decorative
755
+ * (see docs/dogfood/recipe-dogfood-2026-05-01/C-triggers.md). Idempotent and
756
+ * fail-soft: safe to call at startup and on every recipe hot-reload; a no-op
757
+ * when automation is disabled.
758
+ */
759
+ registerRecipeTriggerPrograms() {
760
+ if (!this.automationHooks)
761
+ return;
762
+ try {
763
+ const recipesDir = path.join(os.homedir(), ".patchwork", "recipes");
764
+ const collected = collectEventTriggerPrograms(recipesDir, {
765
+ logger: this.logger,
766
+ });
767
+ this.automationHooks.registerRecipePrograms(collected.programs);
768
+ const n = collected.programs.length;
769
+ this.logger.info(`[bridge] Recipe triggers registered · ${n} event-driven recipe${n === 1 ? "" : "s"}${collected.recipeNames.length ? ` (${collected.recipeNames.join(", ")})` : ""}`);
770
+ }
771
+ catch (err) {
772
+ this.logger.warn?.(`[bridge] recipe trigger registration failed: ${err instanceof Error ? err.message : String(err)}`);
773
+ }
774
+ }
738
775
  async start() {
739
776
  // 0. Initialize OpenTelemetry (no-op when OTEL_EXPORTER_OTLP_ENDPOINT is unset)
740
777
  initTelemetry();
@@ -772,6 +809,29 @@ export class Bridge {
772
809
  this.logger.info(`Probed tools: ${probeList()}`);
773
810
  this.logger.info(`Available linters: ${probeList(["tsc", "eslint", "pyright", "ruff", "cargo", "go", "biome"])}`);
774
811
  this.logger.info(`Available test runners: ${probeList(["vitest", "jest", "pytest", "cargo", "go"])}`);
812
+ // Initialize Patchwork enrichment + decision-trace logs.
813
+ //
814
+ // These back the ctx tools (ctxQueryTraces / ctxGetTaskContext /
815
+ // ctxSaveTrace / getCommitsForIssue) which are advertised as standard
816
+ // full-mode tools regardless of orchestration. They MUST be created even
817
+ // on the default `driver: "none"` bridge — otherwise the decision-trace
818
+ // WRITE path and the enrichment reverse-lookup silently disappear and
819
+ // ctxSaveTrace returns tool-not-found.
820
+ const patchworkDir = path.join(os.homedir(), ".patchwork");
821
+ this.commitIssueLinkLog = new CommitIssueLinkLog({
822
+ dir: patchworkDir,
823
+ logger: this.logger,
824
+ });
825
+ this.decisionTraceLog = new DecisionTraceLog({
826
+ dir: patchworkDir,
827
+ logger: this.logger,
828
+ });
829
+ // Decision Record store — every worker-gate decision + inputs (replayable
830
+ // audit trail). Always available so the gate's decisions are never discarded.
831
+ this.workerGateDecisionLog = new WorkerGateDecisionLog({
832
+ dir: patchworkDir,
833
+ logger: this.logger,
834
+ });
775
835
  // 2. Initialize Claude driver and orchestrator (if configured)
776
836
  if (this.config.driver !== "none") {
777
837
  const driver = createDriver(this.config.driver, {
@@ -788,16 +848,6 @@ export class Bridge {
788
848
  }
789
849
  : undefined,
790
850
  }, (msg) => this.logger.info(msg));
791
- // Patchwork: enrichment link log is useful regardless of orchestrator.
792
- const patchworkDir = path.join(os.homedir(), ".patchwork");
793
- this.commitIssueLinkLog = new CommitIssueLinkLog({
794
- dir: patchworkDir,
795
- logger: this.logger,
796
- });
797
- this.decisionTraceLog = new DecisionTraceLog({
798
- dir: patchworkDir,
799
- logger: this.logger,
800
- });
801
851
  if (driver) {
802
852
  // Recipe run-history needs the orchestrator to produce anything.
803
853
  this.recipeRunLog = new RecipeRunLog({
@@ -862,6 +912,7 @@ export class Bridge {
862
912
  recipeOrchestrator: this.recipeOrchestrator,
863
913
  recipeRunLog: this.recipeRunLog,
864
914
  activityLog: this.activityLog,
915
+ workerGateDecisionLog: this.workerGateDecisionLog,
865
916
  workdir: this.config.workspace,
866
917
  logger: this.logger,
867
918
  });
@@ -891,6 +942,10 @@ export class Bridge {
891
942
  catch (err) {
892
943
  this.logger.warn?.(`[patchwork] scheduler restart failed: ${err instanceof Error ? err.message : String(err)}`);
893
944
  }
945
+ // Re-sync recipe-derived event triggers (file_watch / git_hook) on
946
+ // every install / save / delete. registerRecipePrograms() replaces the
947
+ // prior recipe set, so this is idempotent.
948
+ this.registerRecipeTriggerPrograms();
894
949
  };
895
950
  }
896
951
  }
@@ -902,8 +957,64 @@ export class Bridge {
902
957
  throw new Error("--automation requires --automation-policy <path>");
903
958
  }
904
959
  const policy = loadPolicy(this.config.automationPolicyPath);
905
- this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks);
960
+ this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks, this.recipeOrchestration
961
+ ? (opts) =>
962
+ // biome-ignore lint/style/noNonNullAssertion: guarded by outer ternary
963
+ this.recipeOrchestration.fireYamlRecipe({
964
+ filePath: path.join(os.homedir(), ".patchwork", "recipes", `${opts.recipeName}.yaml`),
965
+ name: opts.recipeName,
966
+ taskIdPrefix: `automation-recipe-${opts.recipeName}`,
967
+ triggerSourceSuffix: `automation:${opts.triggerSource}`,
968
+ logLabel: `automation "${opts.recipeName}"`,
969
+ seedContext: Object.fromEntries(Object.entries(opts.eventData)),
970
+ }).then((r) => {
971
+ if (!r.ok)
972
+ throw new Error(r.error ?? "recipe fire failed");
973
+ return r.taskId ?? "";
974
+ })
975
+ : undefined);
906
976
  this.logger.info(`[bridge] Automation enabled (policy: ${this.config.automationPolicyPath})`);
977
+ // Wire installed recipe triggers (file_watch / git_hook) into the live
978
+ // interpreter — they compile to hooks the bridge already fires, but were
979
+ // never registered until now (decorative). See C-triggers.md.
980
+ this.registerRecipeTriggerPrograms();
981
+ }
982
+ else if (this.orchestrator) {
983
+ // Auto-enable (no --automation policy): when installed recipes declare
984
+ // event triggers AND a subprocess driver is active, stand up a policy-less
985
+ // AutomationHooks so those triggers actually fire. The `this.orchestrator`
986
+ // guard is the safety floor — we never spawn tasks unless the operator
987
+ // already enabled a driver. Pass --automation --automation-policy to add
988
+ // policy-file hooks on top of the recipe triggers.
989
+ const recipesDir = path.join(os.homedir(), ".patchwork", "recipes");
990
+ const collected = collectEventTriggerPrograms(recipesDir, {
991
+ logger: this.logger,
992
+ });
993
+ if (shouldAutoEnableAutomation({
994
+ automationEnabled: this.config.automationEnabled,
995
+ hasDriver: true,
996
+ eventProgramCount: collected.programs.length,
997
+ })) {
998
+ this.automationHooks = new AutomationHooks({}, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks, this.recipeOrchestration
999
+ ? (opts) =>
1000
+ // biome-ignore lint/style/noNonNullAssertion: guarded by outer ternary
1001
+ this.recipeOrchestration.fireYamlRecipe({
1002
+ filePath: path.join(os.homedir(), ".patchwork", "recipes", `${opts.recipeName}.yaml`),
1003
+ name: opts.recipeName,
1004
+ taskIdPrefix: `automation-recipe-${opts.recipeName}`,
1005
+ triggerSourceSuffix: `automation:${opts.triggerSource}`,
1006
+ logLabel: `automation "${opts.recipeName}"`,
1007
+ seedContext: Object.fromEntries(Object.entries(opts.eventData)),
1008
+ }).then((r) => {
1009
+ if (!r.ok)
1010
+ throw new Error(r.error ?? "recipe fire failed");
1011
+ return r.taskId ?? "";
1012
+ })
1013
+ : undefined);
1014
+ this.automationHooks.registerRecipePrograms(collected.programs);
1015
+ const n = collected.programs.length;
1016
+ this.logger.info(`[bridge] Automation auto-enabled for ${n} event-driven recipe${n === 1 ? "" : "s"} (${collected.recipeNames.join(", ")}) — no --automation policy; pass --automation --automation-policy to add policy hooks`);
1017
+ }
907
1018
  }
908
1019
  // 3. Wire up /health endpoint data and /metrics
909
1020
  this.server.healthDataFn = () => {
@@ -1035,20 +1146,42 @@ export class Bridge {
1035
1146
  nearby: nearby,
1036
1147
  };
1037
1148
  };
1149
+ // Build the traces tool + embeddings provider ONCE at startup. The
1150
+ // dashboard polls /traces every few seconds; re-constructing the tool and
1151
+ // re-allocating the embeddings provider on every request was pure waste
1152
+ // (audit sem-4). The log references and embed fn are stable for the
1153
+ // bridge's lifetime.
1154
+ const tracesTool = createCtxQueryTracesTool({
1155
+ activityLog: this.activityLog,
1156
+ commitIssueLinkLog: this.commitIssueLinkLog,
1157
+ recipeRunLog: this.recipeRunLog,
1158
+ decisionTraceLog: this.decisionTraceLog,
1159
+ workerGateDecisionLog: this.workerGateDecisionLog,
1160
+ embedFn: getLocalEmbedFn(),
1161
+ });
1162
+ // POST /traces/decision — HTTP twin of the ctxSaveTrace MCP tool, same
1163
+ // DecisionTraceLog.record() writer/validation. null when the bridge has
1164
+ // no decisionTraceLog configured (route responds 503 in that case).
1165
+ this.server.saveDecisionTraceFn = this.decisionTraceLog
1166
+ ? (input) => this.decisionTraceLog.record({
1167
+ ref: input.ref,
1168
+ problem: input.problem,
1169
+ solution: input.solution,
1170
+ workspace: input.workspace ?? this.config.workspace,
1171
+ ...(input.tags && { tags: input.tags }),
1172
+ ...(input.sessionId && { sessionId: input.sessionId }),
1173
+ ...(input.source && { source: input.source }),
1174
+ })
1175
+ : null;
1038
1176
  this.server.tracesFn = async (query) => {
1039
- const tool = createCtxQueryTracesTool({
1040
- activityLog: this.activityLog,
1041
- commitIssueLinkLog: this.commitIssueLinkLog,
1042
- recipeRunLog: this.recipeRunLog,
1043
- decisionTraceLog: this.decisionTraceLog,
1044
- });
1045
- const result = await tool.handler({
1177
+ const result = await tracesTool.handler({
1046
1178
  ...(query.traceType && { traceType: query.traceType }),
1047
1179
  ...(query.key && { key: query.key }),
1048
1180
  ...(query.q && { q: query.q }),
1049
1181
  ...(query.tag && { tag: query.tag }),
1050
1182
  ...(query.since !== undefined && { since: query.since }),
1051
1183
  ...(query.limit !== undefined && { limit: query.limit }),
1184
+ ...(query.semantic && { semantic: true }),
1052
1185
  });
1053
1186
  const structured = result
1054
1187
  .structuredContent;
@@ -1069,13 +1202,20 @@ export class Bridge {
1069
1202
  this.server.analyticsFn = async (windowHours) => {
1070
1203
  const wh = typeof windowHours === "number" && windowHours >= 1 ? windowHours : 24;
1071
1204
  const cutoff = Date.now() - wh * 3_600 * 1_000;
1072
- const statsMap = this.activityLog.stats();
1205
+ // Respect the requested window for tool counts (was all-time `stats()`).
1206
+ const statsMap = this.activityLog.windowedStats(wh * 3_600 * 1_000);
1207
+ // Per-tool latency percentiles. `percentiles()` is computed over the
1208
+ // bounded duration-sample buffer (not windowed) and omits any tool with
1209
+ // <2 samples — default those to 0 so the dashboard ToolStat shape is
1210
+ // always satisfied.
1211
+ const pctMap = this.activityLog.percentiles();
1073
1212
  const topTools = Object.entries(statsMap)
1074
1213
  .map(([tool, s]) => ({
1075
1214
  tool,
1076
1215
  calls: s.count,
1077
1216
  errors: s.errors,
1078
- avgMs: s.avgDurationMs,
1217
+ p50Ms: pctMap[tool]?.p50 ?? 0,
1218
+ p95Ms: pctMap[tool]?.p95 ?? 0,
1079
1219
  }))
1080
1220
  .sort((a, b) => b.calls - a.calls)
1081
1221
  .slice(0, 10);
@@ -1104,6 +1244,8 @@ export class Bridge {
1104
1244
  t.doneAt !== undefined && {
1105
1245
  durationMs: t.doneAt - t.startedAt,
1106
1246
  }),
1247
+ ...(t.startedAt !== undefined && { startedAt: t.startedAt }),
1248
+ ...(t.doneAt !== undefined && { completedAt: t.doneAt }),
1107
1249
  createdAt: new Date(t.createdAt).toISOString(),
1108
1250
  ...(t.output !== undefined && {
1109
1251
  output: t.output.slice(0, 2000),
@@ -1170,6 +1312,13 @@ export class Bridge {
1170
1312
  }
1171
1313
  return out;
1172
1314
  };
1315
+ // Wire `/sessions/:id` for the dashboard's session-detail page. Audit
1316
+ // 2026-06-08 HIGH (server-1): sessionDetailFn was declared in server.ts but
1317
+ // never assigned, so GET /sessions/:id returned 404 forever and the page
1318
+ // was permanently blank. The dashboard navigates with the 8-char prefix
1319
+ // sessionsFn emits (`s.id.slice(0,8)`), so resolve that (or a full id) to
1320
+ // the active session, then slice the per-session activity from the log.
1321
+ this.server.sessionDetailFn = (id) => buildSessionDetail(id, this.sessions.values(), this.activityLog, getApprovalQueue().list());
1173
1322
  this.server.restartCheckFn = () => {
1174
1323
  let totalSessions = 0;
1175
1324
  let totalInFlight = 0;
@@ -1290,6 +1439,12 @@ export class Bridge {
1290
1439
  this.server.statusFn = () => {
1291
1440
  let sessionsInGrace = 0;
1292
1441
  const sessionList = [];
1442
+ // Rate-limit state isn't a single bridge-wide value (each session has
1443
+ // its own token bucket, or a shared one for HTTP session cycling — see
1444
+ // McpTransport.setSharedToolRateLimitBucket) but the dashboard vitals
1445
+ // pane isn't session-scoped, so surface the most-constrained session's
1446
+ // remaining budget as a single aggregate rather than an arbitrary one.
1447
+ let toolRateLimit = null;
1293
1448
  for (const s of this.sessions.values()) {
1294
1449
  if (s.graceTimer)
1295
1450
  sessionsInGrace++;
@@ -1300,11 +1455,17 @@ export class Bridge {
1300
1455
  openedFiles: s.openedFiles.size,
1301
1456
  terminalPrefix: s.terminalPrefix,
1302
1457
  });
1458
+ const state = s.transport.getToolRateLimitState();
1459
+ if (state &&
1460
+ (!toolRateLimit || state.remaining < toolRateLimit.remaining)) {
1461
+ toolRateLimit = state;
1462
+ }
1303
1463
  }
1304
1464
  return {
1305
1465
  claudeCode: this.sessions.size > 0,
1306
1466
  activeSessions: this.sessions.size,
1307
1467
  sessionsInGrace,
1468
+ toolRateLimit,
1308
1469
  gracePeriodMs: this.config.gracePeriodMs,
1309
1470
  lastConnectAt: this.lastConnectAt,
1310
1471
  lastDisconnectAt: this.lastDisconnectAt,
@@ -1449,6 +1610,9 @@ export class Bridge {
1449
1610
  ...(this.decisionTraceLog && {
1450
1611
  decisionTraceLog: this.decisionTraceLog,
1451
1612
  }),
1613
+ ...(this.workerGateDecisionLog && {
1614
+ workerGateDecisionLog: this.workerGateDecisionLog,
1615
+ }),
1452
1616
  });
1453
1617
  this.server.httpMcpHandler = (req, res) => this.httpMcpHandler?.handle(req, res) ?? Promise.resolve();
1454
1618
  // 3. Check for stale lock files
@@ -1535,9 +1699,6 @@ export class Bridge {
1535
1699
  await shutdownTelemetry();
1536
1700
  process.exit(exitCode);
1537
1701
  };
1538
- // All process-level signal handlers are guarded by globalHandlersRegistered so
1539
- // that repeated start() calls (e.g. in tests or --watch restarts) don't
1540
- // accumulate process.once listeners and trigger MaxListenersExceededWarning.
1541
1702
  // Wire server callbacks so /restart and /shutdown invoke the bridge's
1542
1703
  // shutdown sequence directly. This is the only path that works on
1543
1704
  // Windows, where `process.kill(pid, 'SIGTERM')` is TerminateProcess
@@ -1548,12 +1709,24 @@ export class Bridge {
1548
1709
  this.server.shutdownFn = () => {
1549
1710
  void shutdown("SIGTERM", 0);
1550
1711
  };
1551
- if (!globalHandlersRegistered) {
1552
- globalHandlersRegistered = true;
1553
- process.once("SIGINT", () => shutdown("SIGINT", 130));
1554
- process.once("SIGTERM", () => shutdown("SIGTERM", 143));
1555
- process.once("SIGHUP", () => shutdown("SIGHUP", 143));
1556
- process.on("unhandledRejection", (reason) => {
1712
+ // core-infra-4: take ownership of the process signal handlers. Detach any
1713
+ // previously-registered set (from an earlier bridge in this process) first
1714
+ // so we never accumulate listeners (MaxListenersExceededWarning) AND the
1715
+ // most-recently-started bridge — whose `shutdown` closure references this
1716
+ // bridge's sessions/logger — is the one that actually runs on teardown.
1717
+ if (activeSignalHandlers) {
1718
+ const prev = activeSignalHandlers;
1719
+ process.removeListener("SIGINT", prev.sigint);
1720
+ process.removeListener("SIGTERM", prev.sigterm);
1721
+ process.removeListener("SIGHUP", prev.sighup);
1722
+ process.removeListener("unhandledRejection", prev.unhandledRejection);
1723
+ process.removeListener("uncaughtException", prev.uncaughtException);
1724
+ }
1725
+ const handlers = {
1726
+ sigint: () => void shutdown("SIGINT", 130),
1727
+ sigterm: () => void shutdown("SIGTERM", 143),
1728
+ sighup: () => void shutdown("SIGHUP", 143),
1729
+ unhandledRejection: (reason) => {
1557
1730
  for (const [sid, session] of this.sessions) {
1558
1731
  const stats = session.transport.getStats();
1559
1732
  if (stats.inFlightTools.length > 0) {
@@ -1561,8 +1734,8 @@ export class Bridge {
1561
1734
  }
1562
1735
  }
1563
1736
  this.logger.error(`Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)}`);
1564
- });
1565
- process.once("uncaughtException", (err) => {
1737
+ },
1738
+ uncaughtException: (err) => {
1566
1739
  for (const [sid, session] of this.sessions) {
1567
1740
  const stats = session.transport.getStats();
1568
1741
  if (stats.inFlightTools.length > 0) {
@@ -1570,9 +1743,15 @@ export class Bridge {
1570
1743
  }
1571
1744
  }
1572
1745
  this.logger.error(`Uncaught exception: ${err.stack ?? err.message}`);
1573
- shutdown("uncaughtException", 1);
1574
- });
1575
- }
1746
+ void shutdown("uncaughtException", 1);
1747
+ },
1748
+ };
1749
+ process.on("SIGINT", handlers.sigint);
1750
+ process.on("SIGTERM", handlers.sigterm);
1751
+ process.on("SIGHUP", handlers.sighup);
1752
+ process.on("unhandledRejection", handlers.unhandledRejection);
1753
+ process.on("uncaughtException", handlers.uncaughtException);
1754
+ activeSignalHandlers = handlers;
1576
1755
  // Startup banner to stderr (not stdout) to avoid capture by parent processes
1577
1756
  this.logger.info("claude-ide-bridge ready");
1578
1757
  this.logger.info(` Port: ${port}`);