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
@@ -34,6 +34,25 @@ import { readBodyWithCap, respond413 } from "./recipeRoutes.js";
34
34
  * used to have.
35
35
  */
36
36
  const CONNECTOR_BODY_CAP = 16 * 1024;
37
+ /**
38
+ * Short-lived in-memory cache for `GET /connections` (audit http-routes-5).
39
+ *
40
+ * `handleConnectionsList()` iterates every registered connector and calls
41
+ * each `getStatus()`, which performs keychain reads / disk I/O. With 45+
42
+ * connectors that is 45+ synchronous probes per request. The dashboard
43
+ * polls this endpoint on every page load and on a timer, serializing dozens
44
+ * of keychain probes on the event loop. A 5 s TTL collapses bursts of polls
45
+ * into a single probe pass while staying fresh enough that a
46
+ * just-completed connect/disconnect is reflected almost immediately —
47
+ * and any mutating `/connections/*` request (POST/DELETE, OAuth callback)
48
+ * eagerly invalidates the cache so changes never wait out the TTL.
49
+ */
50
+ const CONNECTIONS_CACHE_TTL_MS = 5_000;
51
+ let connectionsCache = null;
52
+ /** Drop the cached `GET /connections` payload — call after any mutation. */
53
+ function invalidateConnectionsCache() {
54
+ connectionsCache = null;
55
+ }
37
56
  /**
38
57
  * Read the request body with a cap, dispatch to the connector's
39
58
  * `handle<Vendor>Connect(body)` function, and write the result. Replaces
@@ -68,6 +87,12 @@ async function dispatchConnectorConnect(req, res, loadHandler) {
68
87
  * before the bearer-auth gate. Returns true if the route was dispatched.
69
88
  */
70
89
  export function tryHandlePublicConnectorRoute(req, res, parsedUrl) {
90
+ // Completing an OAuth callback flips a connector from disconnected →
91
+ // connected, so drop the cached `GET /connections` payload (http-routes-5).
92
+ if (parsedUrl.pathname.startsWith("/connections/") &&
93
+ parsedUrl.pathname.endsWith("/callback")) {
94
+ invalidateConnectionsCache();
95
+ }
71
96
  if (parsedUrl.pathname === "/connections/github/callback" &&
72
97
  req.method === "GET") {
73
98
  void (async () => {
@@ -344,12 +369,33 @@ export function tryHandlePublicConnectorRoute(req, res, parsedUrl) {
344
369
  * function returns synchronously as soon as the route is recognized.
345
370
  */
346
371
  export function tryHandleConnectorRoute(req, res, parsedUrl) {
372
+ // Any mutating `/connections/*` request (connect / disconnect / test) can
373
+ // change a connector's reported status, so eagerly drop the cached list
374
+ // (audit http-routes-5). The GET path below is the only reader.
375
+ if (req.method !== "GET" &&
376
+ (parsedUrl.pathname === "/connections" ||
377
+ parsedUrl.pathname.startsWith("/connections/"))) {
378
+ invalidateConnectionsCache();
379
+ }
347
380
  // ── Gmail / Connections endpoints ───────────────────────────────────────
348
381
  if (parsedUrl.pathname === "/connections" && req.method === "GET") {
349
382
  void (async () => {
350
383
  try {
351
- const { handleConnectionsList } = await import("./connectors/gmail.js");
352
- const result = await handleConnectionsList();
384
+ const now = Date.now();
385
+ let result;
386
+ if (connectionsCache &&
387
+ now - connectionsCache.ts < CONNECTIONS_CACHE_TTL_MS) {
388
+ result = connectionsCache.result;
389
+ }
390
+ else {
391
+ const { handleConnectionsList } = await import("./connectors/gmail.js");
392
+ result = await handleConnectionsList();
393
+ // Only cache successful list responses; transient errors should
394
+ // be re-probed on the next request rather than pinned for the TTL.
395
+ if (result.status === 200) {
396
+ connectionsCache = { ts: now, result };
397
+ }
398
+ }
353
399
  res.writeHead(result.status, {
354
400
  "Content-Type": result.contentType ?? "application/json",
355
401
  });
@@ -498,26 +544,9 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
498
544
  })();
499
545
  return true;
500
546
  }
501
- if (parsedUrl.pathname === "/connections/sentry/callback" &&
502
- req.method === "GET") {
503
- void (async () => {
504
- try {
505
- const { handleSentryCallback } = await import("./connectors/sentry.js");
506
- const code = parsedUrl.searchParams.get("code");
507
- const state = parsedUrl.searchParams.get("state");
508
- const error = parsedUrl.searchParams.get("error");
509
- const result = await handleSentryCallback(code, state, error);
510
- res.writeHead(result.status, {
511
- "Content-Type": result.contentType ?? "application/json",
512
- });
513
- res.end(result.body);
514
- }
515
- catch (err) {
516
- respond500(res, err);
517
- }
518
- })();
519
- return true;
520
- }
547
+ // OAuth callback for Sentry is registered in tryHandlePublicConnectorRoute
548
+ // (pre-auth) — the IdP redirect arrives without a bearer token. Do NOT
549
+ // re-register it here behind the auth gate (audit http-routes-3).
521
550
  if (parsedUrl.pathname === "/connections/sentry/test" &&
522
551
  req.method === "POST") {
523
552
  void (async () => {
@@ -711,26 +740,9 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
711
740
  })();
712
741
  return true;
713
742
  }
714
- if (parsedUrl.pathname === "/connections/discord/callback" &&
715
- req.method === "GET") {
716
- void (async () => {
717
- try {
718
- const { handleDiscordCallback } = await import("./connectors/discord.js");
719
- const code = parsedUrl.searchParams.get("code");
720
- const state = parsedUrl.searchParams.get("state");
721
- const error = parsedUrl.searchParams.get("error");
722
- const result = await handleDiscordCallback(code, state, error);
723
- res.writeHead(result.status, {
724
- "Content-Type": result.contentType ?? "text/html",
725
- });
726
- res.end(result.body);
727
- }
728
- catch (err) {
729
- respond500(res, err);
730
- }
731
- })();
732
- return true;
733
- }
743
+ // OAuth callback for Discord is registered in tryHandlePublicConnectorRoute
744
+ // (pre-auth) — the IdP redirect arrives without a bearer token. Do NOT
745
+ // re-register it here behind the auth gate (audit http-routes-3).
734
746
  if (parsedUrl.pathname === "/connections/discord/test" &&
735
747
  req.method === "POST") {
736
748
  void (async () => {
@@ -868,26 +880,9 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
868
880
  })();
869
881
  return true;
870
882
  }
871
- if (parsedUrl.pathname === "/connections/gitlab/callback" &&
872
- req.method === "GET") {
873
- void (async () => {
874
- try {
875
- const { handleGitLabCallback } = await import("./connectors/gitlab.js");
876
- const code = parsedUrl.searchParams.get("code");
877
- const state = parsedUrl.searchParams.get("state");
878
- const error = parsedUrl.searchParams.get("error");
879
- const result = await handleGitLabCallback(code, state, error);
880
- res.writeHead(result.status, {
881
- "Content-Type": result.contentType ?? "text/html",
882
- });
883
- res.end(result.body);
884
- }
885
- catch (err) {
886
- respond500(res, err);
887
- }
888
- })();
889
- return true;
890
- }
883
+ // OAuth callback for GitLab is registered in tryHandlePublicConnectorRoute
884
+ // (pre-auth) — the IdP redirect arrives without a bearer token. Do NOT
885
+ // re-register it here behind the auth gate (audit http-routes-3).
891
886
  if (parsedUrl.pathname === "/connections/gitlab/test" &&
892
887
  req.method === "POST") {
893
888
  void (async () => {
@@ -2104,6 +2099,562 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
2104
2099
  })();
2105
2100
  return true;
2106
2101
  }
2102
+ // ── Resend routes ───────────────────────────────────────────────
2103
+ if (parsedUrl.pathname === "/connections/resend/connect" &&
2104
+ req.method === "POST") {
2105
+ void dispatchConnectorConnect(req, res, async () => {
2106
+ const m = await import("./connectors/resend.js");
2107
+ return m.handleResendConnect;
2108
+ });
2109
+ return true;
2110
+ }
2111
+ if (parsedUrl.pathname === "/connections/resend/test" &&
2112
+ req.method === "POST") {
2113
+ void (async () => {
2114
+ try {
2115
+ const { handleResendTest } = await import("./connectors/resend.js");
2116
+ const result = await handleResendTest();
2117
+ res.writeHead(result.status, {
2118
+ "Content-Type": result.contentType ?? "application/json",
2119
+ });
2120
+ res.end(result.body);
2121
+ }
2122
+ catch (err) {
2123
+ respond500(res, err);
2124
+ }
2125
+ })();
2126
+ return true;
2127
+ }
2128
+ if (parsedUrl.pathname === "/connections/resend" && req.method === "DELETE") {
2129
+ void (async () => {
2130
+ try {
2131
+ const { handleResendDisconnect } = await import("./connectors/resend.js");
2132
+ const result = handleResendDisconnect();
2133
+ res.writeHead(result.status, {
2134
+ "Content-Type": result.contentType ?? "application/json",
2135
+ });
2136
+ res.end(result.body);
2137
+ }
2138
+ catch (err) {
2139
+ respond500(res, err);
2140
+ }
2141
+ })();
2142
+ return true;
2143
+ }
2144
+ // ── Obsidian routes ─────────────────────────────────────────────
2145
+ if (parsedUrl.pathname === "/connections/obsidian/connect" &&
2146
+ req.method === "POST") {
2147
+ void dispatchConnectorConnect(req, res, async () => {
2148
+ const m = await import("./connectors/obsidian.js");
2149
+ return m.handleObsidianConnect;
2150
+ });
2151
+ return true;
2152
+ }
2153
+ if (parsedUrl.pathname === "/connections/obsidian/test" &&
2154
+ req.method === "POST") {
2155
+ void (async () => {
2156
+ try {
2157
+ const { handleObsidianTest } = await import("./connectors/obsidian.js");
2158
+ const result = await handleObsidianTest();
2159
+ res.writeHead(result.status, {
2160
+ "Content-Type": result.contentType ?? "application/json",
2161
+ });
2162
+ res.end(result.body);
2163
+ }
2164
+ catch (err) {
2165
+ respond500(res, err);
2166
+ }
2167
+ })();
2168
+ return true;
2169
+ }
2170
+ if (parsedUrl.pathname === "/connections/obsidian" &&
2171
+ req.method === "DELETE") {
2172
+ void (async () => {
2173
+ try {
2174
+ const { handleObsidianDisconnect } = await import("./connectors/obsidian.js");
2175
+ const result = handleObsidianDisconnect();
2176
+ res.writeHead(result.status, {
2177
+ "Content-Type": result.contentType ?? "application/json",
2178
+ });
2179
+ res.end(result.body);
2180
+ }
2181
+ catch (err) {
2182
+ respond500(res, err);
2183
+ }
2184
+ })();
2185
+ return true;
2186
+ }
2187
+ // ── Todoist routes ──────────────────────────────────────────────
2188
+ if (parsedUrl.pathname === "/connections/todoist/connect" &&
2189
+ req.method === "POST") {
2190
+ void dispatchConnectorConnect(req, res, async () => {
2191
+ const m = await import("./connectors/todoist.js");
2192
+ return m.handleTodoistConnect;
2193
+ });
2194
+ return true;
2195
+ }
2196
+ if (parsedUrl.pathname === "/connections/todoist/test" &&
2197
+ req.method === "POST") {
2198
+ void (async () => {
2199
+ try {
2200
+ const { handleTodoistTest } = await import("./connectors/todoist.js");
2201
+ const result = await handleTodoistTest();
2202
+ res.writeHead(result.status, {
2203
+ "Content-Type": result.contentType ?? "application/json",
2204
+ });
2205
+ res.end(result.body);
2206
+ }
2207
+ catch (err) {
2208
+ respond500(res, err);
2209
+ }
2210
+ })();
2211
+ return true;
2212
+ }
2213
+ if (parsedUrl.pathname === "/connections/todoist" &&
2214
+ req.method === "DELETE") {
2215
+ void (async () => {
2216
+ try {
2217
+ const { handleTodoistDisconnect } = await import("./connectors/todoist.js");
2218
+ const result = handleTodoistDisconnect();
2219
+ res.writeHead(result.status, {
2220
+ "Content-Type": result.contentType ?? "application/json",
2221
+ });
2222
+ res.end(result.body);
2223
+ }
2224
+ catch (err) {
2225
+ respond500(res, err);
2226
+ }
2227
+ })();
2228
+ return true;
2229
+ }
2230
+ // ── Vercel routes ───────────────────────────────────────────────
2231
+ if (parsedUrl.pathname === "/connections/vercel/connect" &&
2232
+ req.method === "POST") {
2233
+ void dispatchConnectorConnect(req, res, async () => {
2234
+ const m = await import("./connectors/vercel.js");
2235
+ return m.handleVercelConnect;
2236
+ });
2237
+ return true;
2238
+ }
2239
+ if (parsedUrl.pathname === "/connections/vercel/test" &&
2240
+ req.method === "POST") {
2241
+ void (async () => {
2242
+ try {
2243
+ const { handleVercelTest } = await import("./connectors/vercel.js");
2244
+ const result = await handleVercelTest();
2245
+ res.writeHead(result.status, {
2246
+ "Content-Type": result.contentType ?? "application/json",
2247
+ });
2248
+ res.end(result.body);
2249
+ }
2250
+ catch (err) {
2251
+ respond500(res, err);
2252
+ }
2253
+ })();
2254
+ return true;
2255
+ }
2256
+ if (parsedUrl.pathname === "/connections/vercel" && req.method === "DELETE") {
2257
+ void (async () => {
2258
+ try {
2259
+ const { handleVercelDisconnect } = await import("./connectors/vercel.js");
2260
+ const result = handleVercelDisconnect();
2261
+ res.writeHead(result.status, {
2262
+ "Content-Type": result.contentType ?? "application/json",
2263
+ });
2264
+ res.end(result.body);
2265
+ }
2266
+ catch (err) {
2267
+ respond500(res, err);
2268
+ }
2269
+ })();
2270
+ return true;
2271
+ }
2272
+ // ── Paystack routes ─────────────────────────────────────────────
2273
+ if (parsedUrl.pathname === "/connections/paystack/connect" &&
2274
+ req.method === "POST") {
2275
+ void dispatchConnectorConnect(req, res, async () => {
2276
+ const m = await import("./connectors/paystack.js");
2277
+ return m.handlePaystackConnect;
2278
+ });
2279
+ return true;
2280
+ }
2281
+ if (parsedUrl.pathname === "/connections/paystack/test" &&
2282
+ req.method === "POST") {
2283
+ void (async () => {
2284
+ try {
2285
+ const { handlePaystackTest } = await import("./connectors/paystack.js");
2286
+ const result = await handlePaystackTest();
2287
+ res.writeHead(result.status, {
2288
+ "Content-Type": result.contentType ?? "application/json",
2289
+ });
2290
+ res.end(result.body);
2291
+ }
2292
+ catch (err) {
2293
+ respond500(res, err);
2294
+ }
2295
+ })();
2296
+ return true;
2297
+ }
2298
+ if (parsedUrl.pathname === "/connections/paystack" &&
2299
+ req.method === "DELETE") {
2300
+ void (async () => {
2301
+ try {
2302
+ const { handlePaystackDisconnect } = await import("./connectors/paystack.js");
2303
+ const result = handlePaystackDisconnect();
2304
+ res.writeHead(result.status, {
2305
+ "Content-Type": result.contentType ?? "application/json",
2306
+ });
2307
+ res.end(result.body);
2308
+ }
2309
+ catch (err) {
2310
+ respond500(res, err);
2311
+ }
2312
+ })();
2313
+ return true;
2314
+ }
2315
+ // ── Pipedrive routes ────────────────────────────────────────────
2316
+ if (parsedUrl.pathname === "/connections/pipedrive/connect" &&
2317
+ req.method === "POST") {
2318
+ void dispatchConnectorConnect(req, res, async () => {
2319
+ const m = await import("./connectors/pipedrive.js");
2320
+ return m.handlePipedriveConnect;
2321
+ });
2322
+ return true;
2323
+ }
2324
+ if (parsedUrl.pathname === "/connections/pipedrive/test" &&
2325
+ req.method === "POST") {
2326
+ void (async () => {
2327
+ try {
2328
+ const { handlePipedriveTest } = await import("./connectors/pipedrive.js");
2329
+ const result = await handlePipedriveTest();
2330
+ res.writeHead(result.status, {
2331
+ "Content-Type": result.contentType ?? "application/json",
2332
+ });
2333
+ res.end(result.body);
2334
+ }
2335
+ catch (err) {
2336
+ respond500(res, err);
2337
+ }
2338
+ })();
2339
+ return true;
2340
+ }
2341
+ if (parsedUrl.pathname === "/connections/pipedrive" &&
2342
+ req.method === "DELETE") {
2343
+ void (async () => {
2344
+ try {
2345
+ const { handlePipedriveDisconnect } = await import("./connectors/pipedrive.js");
2346
+ const result = handlePipedriveDisconnect();
2347
+ res.writeHead(result.status, {
2348
+ "Content-Type": result.contentType ?? "application/json",
2349
+ });
2350
+ res.end(result.body);
2351
+ }
2352
+ catch (err) {
2353
+ respond500(res, err);
2354
+ }
2355
+ })();
2356
+ return true;
2357
+ }
2358
+ // ── Cal.diy routes ──────────────────────────────────────────────
2359
+ if (parsedUrl.pathname === "/connections/caldiy/connect" &&
2360
+ req.method === "POST") {
2361
+ void dispatchConnectorConnect(req, res, async () => {
2362
+ const m = await import("./connectors/caldiy.js");
2363
+ return m.handleCalDiyConnect;
2364
+ });
2365
+ return true;
2366
+ }
2367
+ if (parsedUrl.pathname === "/connections/caldiy/test" &&
2368
+ req.method === "POST") {
2369
+ void (async () => {
2370
+ try {
2371
+ const { handleCalDiyTest } = await import("./connectors/caldiy.js");
2372
+ const result = await handleCalDiyTest();
2373
+ res.writeHead(result.status, {
2374
+ "Content-Type": result.contentType ?? "application/json",
2375
+ });
2376
+ res.end(result.body);
2377
+ }
2378
+ catch (err) {
2379
+ respond500(res, err);
2380
+ }
2381
+ })();
2382
+ return true;
2383
+ }
2384
+ if (parsedUrl.pathname === "/connections/caldiy" && req.method === "DELETE") {
2385
+ void (async () => {
2386
+ try {
2387
+ const { handleCalDiyDisconnect } = await import("./connectors/caldiy.js");
2388
+ const result = handleCalDiyDisconnect();
2389
+ res.writeHead(result.status, {
2390
+ "Content-Type": result.contentType ?? "application/json",
2391
+ });
2392
+ res.end(result.body);
2393
+ }
2394
+ catch (err) {
2395
+ respond500(res, err);
2396
+ }
2397
+ })();
2398
+ return true;
2399
+ }
2400
+ // ── Grafana routes ──────────────────────────────────────────────
2401
+ if (parsedUrl.pathname === "/connections/grafana/connect" &&
2402
+ req.method === "POST") {
2403
+ void dispatchConnectorConnect(req, res, async () => {
2404
+ const m = await import("./connectors/grafana.js");
2405
+ return m.handleGrafanaConnect;
2406
+ });
2407
+ return true;
2408
+ }
2409
+ if (parsedUrl.pathname === "/connections/grafana/test" &&
2410
+ req.method === "POST") {
2411
+ void (async () => {
2412
+ try {
2413
+ const { handleGrafanaTest } = await import("./connectors/grafana.js");
2414
+ const result = await handleGrafanaTest();
2415
+ res.writeHead(result.status, {
2416
+ "Content-Type": result.contentType ?? "application/json",
2417
+ });
2418
+ res.end(result.body);
2419
+ }
2420
+ catch (err) {
2421
+ respond500(res, err);
2422
+ }
2423
+ })();
2424
+ return true;
2425
+ }
2426
+ if (parsedUrl.pathname === "/connections/grafana" &&
2427
+ req.method === "DELETE") {
2428
+ void (async () => {
2429
+ try {
2430
+ const { handleGrafanaDisconnect } = await import("./connectors/grafana.js");
2431
+ const result = handleGrafanaDisconnect();
2432
+ res.writeHead(result.status, {
2433
+ "Content-Type": result.contentType ?? "application/json",
2434
+ });
2435
+ res.end(result.body);
2436
+ }
2437
+ catch (err) {
2438
+ respond500(res, err);
2439
+ }
2440
+ })();
2441
+ return true;
2442
+ }
2443
+ // ── PostHog routes ──────────────────────────────────────────────
2444
+ if (parsedUrl.pathname === "/connections/posthog/connect" &&
2445
+ req.method === "POST") {
2446
+ void dispatchConnectorConnect(req, res, async () => {
2447
+ const m = await import("./connectors/posthog.js");
2448
+ return m.handlePostHogConnect;
2449
+ });
2450
+ return true;
2451
+ }
2452
+ if (parsedUrl.pathname === "/connections/posthog/test" &&
2453
+ req.method === "POST") {
2454
+ void (async () => {
2455
+ try {
2456
+ const { handlePostHogTest } = await import("./connectors/posthog.js");
2457
+ const result = await handlePostHogTest();
2458
+ res.writeHead(result.status, {
2459
+ "Content-Type": result.contentType ?? "application/json",
2460
+ });
2461
+ res.end(result.body);
2462
+ }
2463
+ catch (err) {
2464
+ respond500(res, err);
2465
+ }
2466
+ })();
2467
+ return true;
2468
+ }
2469
+ if (parsedUrl.pathname === "/connections/posthog" &&
2470
+ req.method === "DELETE") {
2471
+ void (async () => {
2472
+ try {
2473
+ const { handlePostHogDisconnect } = await import("./connectors/posthog.js");
2474
+ const result = handlePostHogDisconnect();
2475
+ res.writeHead(result.status, {
2476
+ "Content-Type": result.contentType ?? "application/json",
2477
+ });
2478
+ res.end(result.body);
2479
+ }
2480
+ catch (err) {
2481
+ respond500(res, err);
2482
+ }
2483
+ })();
2484
+ return true;
2485
+ }
2486
+ // ── Cloudflare routes ───────────────────────────────────────────
2487
+ if (parsedUrl.pathname === "/connections/cloudflare/connect" &&
2488
+ req.method === "POST") {
2489
+ void dispatchConnectorConnect(req, res, async () => {
2490
+ const m = await import("./connectors/cloudflare.js");
2491
+ return m.handleCloudflareConnect;
2492
+ });
2493
+ return true;
2494
+ }
2495
+ if (parsedUrl.pathname === "/connections/cloudflare/test" &&
2496
+ req.method === "POST") {
2497
+ void (async () => {
2498
+ try {
2499
+ const { handleCloudflareTest } = await import("./connectors/cloudflare.js");
2500
+ const result = await handleCloudflareTest();
2501
+ res.writeHead(result.status, {
2502
+ "Content-Type": result.contentType ?? "application/json",
2503
+ });
2504
+ res.end(result.body);
2505
+ }
2506
+ catch (err) {
2507
+ respond500(res, err);
2508
+ }
2509
+ })();
2510
+ return true;
2511
+ }
2512
+ if (parsedUrl.pathname === "/connections/cloudflare" &&
2513
+ req.method === "DELETE") {
2514
+ void (async () => {
2515
+ try {
2516
+ const { handleCloudflareDisconnect } = await import("./connectors/cloudflare.js");
2517
+ const result = handleCloudflareDisconnect();
2518
+ res.writeHead(result.status, {
2519
+ "Content-Type": result.contentType ?? "application/json",
2520
+ });
2521
+ res.end(result.body);
2522
+ }
2523
+ catch (err) {
2524
+ respond500(res, err);
2525
+ }
2526
+ })();
2527
+ return true;
2528
+ }
2529
+ // ── CircleCI routes ─────────────────────────────────────────────
2530
+ if (parsedUrl.pathname === "/connections/circleci/connect" &&
2531
+ req.method === "POST") {
2532
+ void dispatchConnectorConnect(req, res, async () => {
2533
+ const m = await import("./connectors/circleci.js");
2534
+ return m.handleCircleCIConnect;
2535
+ });
2536
+ return true;
2537
+ }
2538
+ if (parsedUrl.pathname === "/connections/circleci/test" &&
2539
+ req.method === "POST") {
2540
+ void (async () => {
2541
+ try {
2542
+ const { handleCircleCITest } = await import("./connectors/circleci.js");
2543
+ const result = await handleCircleCITest();
2544
+ res.writeHead(result.status, {
2545
+ "Content-Type": result.contentType ?? "application/json",
2546
+ });
2547
+ res.end(result.body);
2548
+ }
2549
+ catch (err) {
2550
+ respond500(res, err);
2551
+ }
2552
+ })();
2553
+ return true;
2554
+ }
2555
+ if (parsedUrl.pathname === "/connections/circleci" &&
2556
+ req.method === "DELETE") {
2557
+ void (async () => {
2558
+ try {
2559
+ const { handleCircleCIDisconnect } = await import("./connectors/circleci.js");
2560
+ const result = handleCircleCIDisconnect();
2561
+ res.writeHead(result.status, {
2562
+ "Content-Type": result.contentType ?? "application/json",
2563
+ });
2564
+ res.end(result.body);
2565
+ }
2566
+ catch (err) {
2567
+ respond500(res, err);
2568
+ }
2569
+ })();
2570
+ return true;
2571
+ }
2572
+ // ── WooCommerce routes ──────────────────────────────────────────
2573
+ if (parsedUrl.pathname === "/connections/woocommerce/connect" &&
2574
+ req.method === "POST") {
2575
+ void dispatchConnectorConnect(req, res, async () => {
2576
+ const m = await import("./connectors/woocommerce.js");
2577
+ return m.handleWooCommerceConnect;
2578
+ });
2579
+ return true;
2580
+ }
2581
+ if (parsedUrl.pathname === "/connections/woocommerce/test" &&
2582
+ req.method === "POST") {
2583
+ void (async () => {
2584
+ try {
2585
+ const { handleWooCommerceTest } = await import("./connectors/woocommerce.js");
2586
+ const result = await handleWooCommerceTest();
2587
+ res.writeHead(result.status, {
2588
+ "Content-Type": result.contentType ?? "application/json",
2589
+ });
2590
+ res.end(result.body);
2591
+ }
2592
+ catch (err) {
2593
+ respond500(res, err);
2594
+ }
2595
+ })();
2596
+ return true;
2597
+ }
2598
+ if (parsedUrl.pathname === "/connections/woocommerce" &&
2599
+ req.method === "DELETE") {
2600
+ void (async () => {
2601
+ try {
2602
+ const { handleWooCommerceDisconnect } = await import("./connectors/woocommerce.js");
2603
+ const result = handleWooCommerceDisconnect();
2604
+ res.writeHead(result.status, {
2605
+ "Content-Type": result.contentType ?? "application/json",
2606
+ });
2607
+ res.end(result.body);
2608
+ }
2609
+ catch (err) {
2610
+ respond500(res, err);
2611
+ }
2612
+ })();
2613
+ return true;
2614
+ }
2615
+ // ── Supabase routes ─────────────────────────────────────────────
2616
+ if (parsedUrl.pathname === "/connections/supabase/connect" &&
2617
+ req.method === "POST") {
2618
+ void dispatchConnectorConnect(req, res, async () => {
2619
+ const m = await import("./connectors/supabase.js");
2620
+ return m.handleSupabaseConnect;
2621
+ });
2622
+ return true;
2623
+ }
2624
+ if (parsedUrl.pathname === "/connections/supabase/test" &&
2625
+ req.method === "POST") {
2626
+ void (async () => {
2627
+ try {
2628
+ const { handleSupabaseTest } = await import("./connectors/supabase.js");
2629
+ const result = await handleSupabaseTest();
2630
+ res.writeHead(result.status, {
2631
+ "Content-Type": result.contentType ?? "application/json",
2632
+ });
2633
+ res.end(result.body);
2634
+ }
2635
+ catch (err) {
2636
+ respond500(res, err);
2637
+ }
2638
+ })();
2639
+ return true;
2640
+ }
2641
+ if (parsedUrl.pathname === "/connections/supabase" &&
2642
+ req.method === "DELETE") {
2643
+ void (async () => {
2644
+ try {
2645
+ const { handleSupabaseDisconnect } = await import("./connectors/supabase.js");
2646
+ const result = handleSupabaseDisconnect();
2647
+ res.writeHead(result.status, {
2648
+ "Content-Type": result.contentType ?? "application/json",
2649
+ });
2650
+ res.end(result.body);
2651
+ }
2652
+ catch (err) {
2653
+ respond500(res, err);
2654
+ }
2655
+ })();
2656
+ return true;
2657
+ }
2107
2658
  return false;
2108
2659
  }
2109
2660
  //# sourceMappingURL=connectorRoutes.js.map