patchwork-os 0.2.0-beta.1 → 0.2.0-beta.10.canary.100

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 (701) hide show
  1. package/README.bridge.md +14 -14
  2. package/README.md +201 -34
  3. package/deploy/README.md +1 -1
  4. package/deploy/bootstrap-vps.sh +14 -9
  5. package/deploy/deploy-dashboard.sh +25 -1
  6. package/deploy/macos/README.md +153 -0
  7. package/deploy/macos/com.patchwork.bridge.plist.template +54 -0
  8. package/deploy/macos/com.patchwork.tunnel.plist.template +76 -0
  9. package/deploy/macos/install-mac-bridge.sh +244 -0
  10. package/deploy/macos/uninstall-mac-bridge.sh +22 -0
  11. package/dist/activityLog.d.ts +6 -0
  12. package/dist/activityLog.js +63 -26
  13. package/dist/activityLog.js.map +1 -1
  14. package/dist/adapters/claude.js +22 -16
  15. package/dist/adapters/claude.js.map +1 -1
  16. package/dist/adapters/gemini.js +15 -11
  17. package/dist/adapters/gemini.js.map +1 -1
  18. package/dist/adapters/openai.js +9 -9
  19. package/dist/adapters/openai.js.map +1 -1
  20. package/dist/ajv2020.d.ts +25 -0
  21. package/dist/ajv2020.js +33 -0
  22. package/dist/ajv2020.js.map +1 -0
  23. package/dist/analyticsAggregator.js +1 -1
  24. package/dist/analyticsAggregator.js.map +1 -1
  25. package/dist/analyticsConfig.d.ts +29 -0
  26. package/dist/analyticsConfig.js +102 -0
  27. package/dist/analyticsConfig.js.map +1 -0
  28. package/dist/analyticsPrefs.d.ts +38 -2
  29. package/dist/analyticsPrefs.js +148 -23
  30. package/dist/analyticsPrefs.js.map +1 -1
  31. package/dist/analyticsSend.d.ts +17 -1
  32. package/dist/analyticsSend.js +67 -5
  33. package/dist/analyticsSend.js.map +1 -1
  34. package/dist/approvalHttp.d.ts +14 -0
  35. package/dist/approvalHttp.js +212 -9
  36. package/dist/approvalHttp.js.map +1 -1
  37. package/dist/approvalInsights.js +13 -5
  38. package/dist/approvalInsights.js.map +1 -1
  39. package/dist/approvalQueue.d.ts +97 -3
  40. package/dist/approvalQueue.js +193 -19
  41. package/dist/approvalQueue.js.map +1 -1
  42. package/dist/approvalSignals.js +19 -11
  43. package/dist/approvalSignals.js.map +1 -1
  44. package/dist/automation.d.ts +35 -10
  45. package/dist/automation.js +133 -37
  46. package/dist/automation.js.map +1 -1
  47. package/dist/automationSuggestions.js +10 -8
  48. package/dist/automationSuggestions.js.map +1 -1
  49. package/dist/bridge.d.ts +2 -0
  50. package/dist/bridge.js +219 -35
  51. package/dist/bridge.js.map +1 -1
  52. package/dist/bridgeLockDiscovery.d.ts +27 -1
  53. package/dist/bridgeLockDiscovery.js +38 -11
  54. package/dist/bridgeLockDiscovery.js.map +1 -1
  55. package/dist/bridgeToken.js +3 -2
  56. package/dist/bridgeToken.js.map +1 -1
  57. package/dist/claudeDriver.js +23 -8
  58. package/dist/claudeDriver.js.map +1 -1
  59. package/dist/claudeOrchestrator.d.ts +1 -1
  60. package/dist/claudeOrchestrator.js +87 -44
  61. package/dist/claudeOrchestrator.js.map +1 -1
  62. package/dist/commands/analytics.d.ts +8 -0
  63. package/dist/commands/analytics.js +134 -0
  64. package/dist/commands/analytics.js.map +1 -0
  65. package/dist/commands/auditEnv.d.ts +36 -0
  66. package/dist/commands/auditEnv.js +202 -0
  67. package/dist/commands/auditEnv.js.map +1 -0
  68. package/dist/commands/connect.d.ts +47 -0
  69. package/dist/commands/connect.js +419 -0
  70. package/dist/commands/connect.js.map +1 -0
  71. package/dist/commands/dashboard.js +8 -1
  72. package/dist/commands/dashboard.js.map +1 -1
  73. package/dist/commands/doctor.d.ts +35 -0
  74. package/dist/commands/doctor.js +51 -0
  75. package/dist/commands/doctor.js.map +1 -0
  76. package/dist/commands/install.js +3 -0
  77. package/dist/commands/install.js.map +1 -1
  78. package/dist/commands/launchd.js +15 -16
  79. package/dist/commands/launchd.js.map +1 -1
  80. package/dist/commands/patchworkInit.d.ts +5 -0
  81. package/dist/commands/patchworkInit.js +89 -7
  82. package/dist/commands/patchworkInit.js.map +1 -1
  83. package/dist/commands/recipe.d.ts +151 -0
  84. package/dist/commands/recipe.js +649 -9
  85. package/dist/commands/recipe.js.map +1 -1
  86. package/dist/commands/recipeInstall.js +11 -4
  87. package/dist/commands/recipeInstall.js.map +1 -1
  88. package/dist/commands/shadowScan.d.ts +34 -0
  89. package/dist/commands/shadowScan.js +142 -0
  90. package/dist/commands/shadowScan.js.map +1 -0
  91. package/dist/commands/task.d.ts +25 -0
  92. package/dist/commands/task.js +62 -42
  93. package/dist/commands/task.js.map +1 -1
  94. package/dist/commands/tools.d.ts +20 -1
  95. package/dist/commands/tools.js +112 -3
  96. package/dist/commands/tools.js.map +1 -1
  97. package/dist/commands/tracesExport.d.ts +15 -1
  98. package/dist/commands/tracesExport.js +39 -5
  99. package/dist/commands/tracesExport.js.map +1 -1
  100. package/dist/commands/tracesImport.js +21 -4
  101. package/dist/commands/tracesImport.js.map +1 -1
  102. package/dist/commitIssueLinkLog.d.ts +16 -0
  103. package/dist/commitIssueLinkLog.js +110 -24
  104. package/dist/commitIssueLinkLog.js.map +1 -1
  105. package/dist/companions/registry.js +15 -7
  106. package/dist/companions/registry.js.map +1 -1
  107. package/dist/config.d.ts +47 -3
  108. package/dist/config.js +111 -21
  109. package/dist/config.js.map +1 -1
  110. package/dist/connectorRoutes.js +1422 -57
  111. package/dist/connectorRoutes.js.map +1 -1
  112. package/dist/connectors/airtable.d.ts +230 -0
  113. package/dist/connectors/airtable.js +700 -0
  114. package/dist/connectors/airtable.js.map +1 -0
  115. package/dist/connectors/asana.js +13 -9
  116. package/dist/connectors/asana.js.map +1 -1
  117. package/dist/connectors/baseConnector.js +25 -3
  118. package/dist/connectors/baseConnector.js.map +1 -1
  119. package/dist/connectors/caldiy.d.ts +137 -0
  120. package/dist/connectors/caldiy.js +424 -0
  121. package/dist/connectors/caldiy.js.map +1 -0
  122. package/dist/connectors/circleci.d.ts +162 -0
  123. package/dist/connectors/circleci.js +576 -0
  124. package/dist/connectors/circleci.js.map +1 -0
  125. package/dist/connectors/cloudflare.d.ts +132 -0
  126. package/dist/connectors/cloudflare.js +622 -0
  127. package/dist/connectors/cloudflare.js.map +1 -0
  128. package/dist/connectors/confluence.js +35 -0
  129. package/dist/connectors/confluence.js.map +1 -1
  130. package/dist/connectors/connectorRedirectUri.d.ts +30 -0
  131. package/dist/connectors/connectorRedirectUri.js +38 -0
  132. package/dist/connectors/connectorRedirectUri.js.map +1 -0
  133. package/dist/connectors/connectorRegistry.d.ts +60 -0
  134. package/dist/connectors/connectorRegistry.js +354 -0
  135. package/dist/connectors/connectorRegistry.js.map +1 -0
  136. package/dist/connectors/datadog.js +41 -5
  137. package/dist/connectors/datadog.js.map +1 -1
  138. package/dist/connectors/discord.js +14 -10
  139. package/dist/connectors/discord.js.map +1 -1
  140. package/dist/connectors/elasticsearch.d.ts +141 -0
  141. package/dist/connectors/elasticsearch.js +601 -0
  142. package/dist/connectors/elasticsearch.js.map +1 -0
  143. package/dist/connectors/figma.d.ts +130 -0
  144. package/dist/connectors/figma.js +387 -0
  145. package/dist/connectors/figma.js.map +1 -0
  146. package/dist/connectors/github.d.ts +17 -0
  147. package/dist/connectors/github.js +53 -2
  148. package/dist/connectors/github.js.map +1 -1
  149. package/dist/connectors/gitlab.js +12 -6
  150. package/dist/connectors/gitlab.js.map +1 -1
  151. package/dist/connectors/gmail.js +72 -21
  152. package/dist/connectors/gmail.js.map +1 -1
  153. package/dist/connectors/googleCalendar.js +8 -8
  154. package/dist/connectors/googleCalendar.js.map +1 -1
  155. package/dist/connectors/googleDocs.d.ts +103 -0
  156. package/dist/connectors/googleDocs.js +409 -0
  157. package/dist/connectors/googleDocs.js.map +1 -0
  158. package/dist/connectors/googleDrive.d.ts +12 -0
  159. package/dist/connectors/googleDrive.js +35 -8
  160. package/dist/connectors/googleDrive.js.map +1 -1
  161. package/dist/connectors/grafana.d.ts +133 -0
  162. package/dist/connectors/grafana.js +478 -0
  163. package/dist/connectors/grafana.js.map +1 -0
  164. package/dist/connectors/jira.d.ts +25 -0
  165. package/dist/connectors/jira.js +234 -3
  166. package/dist/connectors/jira.js.map +1 -1
  167. package/dist/connectors/linear.js +1 -1
  168. package/dist/connectors/linear.js.map +1 -1
  169. package/dist/connectors/mcpClient.js +37 -23
  170. package/dist/connectors/mcpClient.js.map +1 -1
  171. package/dist/connectors/mcpOAuth.js +78 -16
  172. package/dist/connectors/mcpOAuth.js.map +1 -1
  173. package/dist/connectors/monday.d.ts +217 -0
  174. package/dist/connectors/monday.js +655 -0
  175. package/dist/connectors/monday.js.map +1 -0
  176. package/dist/connectors/mongodb.d.ts +139 -0
  177. package/dist/connectors/mongodb.js +455 -0
  178. package/dist/connectors/mongodb.js.map +1 -0
  179. package/dist/connectors/notion.d.ts +1 -1
  180. package/dist/connectors/notion.js +13 -4
  181. package/dist/connectors/notion.js.map +1 -1
  182. package/dist/connectors/oauthStateStore.d.ts +20 -0
  183. package/dist/connectors/oauthStateStore.js +94 -4
  184. package/dist/connectors/oauthStateStore.js.map +1 -1
  185. package/dist/connectors/obsidian.d.ts +83 -0
  186. package/dist/connectors/obsidian.js +441 -0
  187. package/dist/connectors/obsidian.js.map +1 -0
  188. package/dist/connectors/paystack.d.ts +159 -0
  189. package/dist/connectors/paystack.js +607 -0
  190. package/dist/connectors/paystack.js.map +1 -0
  191. package/dist/connectors/pipedrive.d.ts +189 -0
  192. package/dist/connectors/pipedrive.js +559 -0
  193. package/dist/connectors/pipedrive.js.map +1 -0
  194. package/dist/connectors/postgres.d.ts +127 -0
  195. package/dist/connectors/postgres.js +512 -0
  196. package/dist/connectors/postgres.js.map +1 -0
  197. package/dist/connectors/posthog.d.ts +119 -0
  198. package/dist/connectors/posthog.js +479 -0
  199. package/dist/connectors/posthog.js.map +1 -0
  200. package/dist/connectors/redis.d.ts +140 -0
  201. package/dist/connectors/redis.js +579 -0
  202. package/dist/connectors/redis.js.map +1 -0
  203. package/dist/connectors/resend.d.ts +131 -0
  204. package/dist/connectors/resend.js +529 -0
  205. package/dist/connectors/resend.js.map +1 -0
  206. package/dist/connectors/salesforce.d.ts +136 -0
  207. package/dist/connectors/salesforce.js +603 -0
  208. package/dist/connectors/salesforce.js.map +1 -0
  209. package/dist/connectors/secrets.d.ts +51 -0
  210. package/dist/connectors/secrets.js +102 -0
  211. package/dist/connectors/secrets.js.map +1 -0
  212. package/dist/connectors/sendgrid.d.ts +102 -0
  213. package/dist/connectors/sendgrid.js +423 -0
  214. package/dist/connectors/sendgrid.js.map +1 -0
  215. package/dist/connectors/shopify.d.ts +145 -0
  216. package/dist/connectors/shopify.js +502 -0
  217. package/dist/connectors/shopify.js.map +1 -0
  218. package/dist/connectors/slack.d.ts +1 -1
  219. package/dist/connectors/slack.js +61 -9
  220. package/dist/connectors/slack.js.map +1 -1
  221. package/dist/connectors/snowflake.d.ts +119 -0
  222. package/dist/connectors/snowflake.js +633 -0
  223. package/dist/connectors/snowflake.js.map +1 -0
  224. package/dist/connectors/supabase.d.ts +92 -0
  225. package/dist/connectors/supabase.js +630 -0
  226. package/dist/connectors/supabase.js.map +1 -0
  227. package/dist/connectors/todoist.d.ts +117 -0
  228. package/dist/connectors/todoist.js +485 -0
  229. package/dist/connectors/todoist.js.map +1 -0
  230. package/dist/connectors/tokenStorage.js +56 -14
  231. package/dist/connectors/tokenStorage.js.map +1 -1
  232. package/dist/connectors/twilio.d.ts +118 -0
  233. package/dist/connectors/twilio.js +475 -0
  234. package/dist/connectors/twilio.js.map +1 -0
  235. package/dist/connectors/vercel.d.ts +110 -0
  236. package/dist/connectors/vercel.js +479 -0
  237. package/dist/connectors/vercel.js.map +1 -0
  238. package/dist/connectors/webflow.d.ts +118 -0
  239. package/dist/connectors/webflow.js +393 -0
  240. package/dist/connectors/webflow.js.map +1 -0
  241. package/dist/connectors/woocommerce.d.ts +220 -0
  242. package/dist/connectors/woocommerce.js +464 -0
  243. package/dist/connectors/woocommerce.js.map +1 -0
  244. package/dist/crypto.js +7 -2
  245. package/dist/crypto.js.map +1 -1
  246. package/dist/decisionReplay.d.ts +8 -6
  247. package/dist/decisionReplay.js +50 -17
  248. package/dist/decisionReplay.js.map +1 -1
  249. package/dist/decisionTraceLog.d.ts +28 -0
  250. package/dist/decisionTraceLog.js +156 -29
  251. package/dist/decisionTraceLog.js.map +1 -1
  252. package/dist/drivers/claude/api.js +33 -9
  253. package/dist/drivers/claude/api.js.map +1 -1
  254. package/dist/drivers/claude/envSanitizer.d.ts +0 -6
  255. package/dist/drivers/claude/envSanitizer.js +17 -2
  256. package/dist/drivers/claude/envSanitizer.js.map +1 -1
  257. package/dist/drivers/claude/streamParser.js +5 -4
  258. package/dist/drivers/claude/streamParser.js.map +1 -1
  259. package/dist/drivers/claude/subprocess.js +69 -16
  260. package/dist/drivers/claude/subprocess.js.map +1 -1
  261. package/dist/drivers/gemini/index.d.ts +22 -0
  262. package/dist/drivers/gemini/index.js +256 -129
  263. package/dist/drivers/gemini/index.js.map +1 -1
  264. package/dist/drivers/local/index.d.ts +2 -0
  265. package/dist/drivers/local/index.js +12 -0
  266. package/dist/drivers/local/index.js.map +1 -1
  267. package/dist/drivers/openai/index.js +30 -2
  268. package/dist/drivers/openai/index.js.map +1 -1
  269. package/dist/extensionClient.d.ts +37 -4
  270. package/dist/extensionClient.js +58 -16
  271. package/dist/extensionClient.js.map +1 -1
  272. package/dist/featureFlags.d.ts +91 -0
  273. package/dist/featureFlags.js +174 -3
  274. package/dist/featureFlags.js.map +1 -1
  275. package/dist/fileLock.js +21 -12
  276. package/dist/fileLock.js.map +1 -1
  277. package/dist/fileLockSync.d.ts +67 -0
  278. package/dist/fileLockSync.js +126 -0
  279. package/dist/fileLockSync.js.map +1 -0
  280. package/dist/fp/activityAnalytics.js +26 -12
  281. package/dist/fp/activityAnalytics.js.map +1 -1
  282. package/dist/fp/automationInterpreter.d.ts +15 -1
  283. package/dist/fp/automationInterpreter.js +267 -87
  284. package/dist/fp/automationInterpreter.js.map +1 -1
  285. package/dist/fp/automationProgram.d.ts +30 -0
  286. package/dist/fp/automationProgram.js.map +1 -1
  287. package/dist/fp/automationState.d.ts +24 -5
  288. package/dist/fp/automationState.js +56 -9
  289. package/dist/fp/automationState.js.map +1 -1
  290. package/dist/fp/automationUtils.js +1 -1
  291. package/dist/fp/automationUtils.js.map +1 -1
  292. package/dist/fp/commandDescription.js +7 -1
  293. package/dist/fp/commandDescription.js.map +1 -1
  294. package/dist/fp/extensionSnapshot.js +8 -2
  295. package/dist/fp/extensionSnapshot.js.map +1 -1
  296. package/dist/fp/interpreterContext.d.ts +66 -1
  297. package/dist/fp/interpreterContext.js +91 -1
  298. package/dist/fp/interpreterContext.js.map +1 -1
  299. package/dist/fp/policyParser.js +34 -2
  300. package/dist/fp/policyParser.js.map +1 -1
  301. package/dist/fsWatchWithFallback.d.ts +36 -0
  302. package/dist/fsWatchWithFallback.js +128 -0
  303. package/dist/fsWatchWithFallback.js.map +1 -0
  304. package/dist/haltPushDispatch.d.ts +33 -0
  305. package/dist/haltPushDispatch.js +103 -0
  306. package/dist/haltPushDispatch.js.map +1 -0
  307. package/dist/httpBodyValidation.d.ts +41 -0
  308. package/dist/httpBodyValidation.js +45 -0
  309. package/dist/httpBodyValidation.js.map +1 -0
  310. package/dist/inboxRoutes.d.ts +22 -0
  311. package/dist/inboxRoutes.js +61 -1
  312. package/dist/inboxRoutes.js.map +1 -1
  313. package/dist/index.js +1206 -158
  314. package/dist/index.js.map +1 -1
  315. package/dist/installGuard.js +6 -2
  316. package/dist/installGuard.js.map +1 -1
  317. package/dist/localEndpointGuard.d.ts +25 -0
  318. package/dist/localEndpointGuard.js +101 -0
  319. package/dist/localEndpointGuard.js.map +1 -0
  320. package/dist/lockfile.js +31 -4
  321. package/dist/lockfile.js.map +1 -1
  322. package/dist/oauth.d.ts +9 -0
  323. package/dist/oauth.js +33 -0
  324. package/dist/oauth.js.map +1 -1
  325. package/dist/oauthRoutes.d.ts +1 -1
  326. package/dist/oauthRoutes.js +5 -3
  327. package/dist/oauthRoutes.js.map +1 -1
  328. package/dist/orchestrator/childBridgeClient.d.ts +5 -0
  329. package/dist/orchestrator/childBridgeClient.js +28 -1
  330. package/dist/orchestrator/childBridgeClient.js.map +1 -1
  331. package/dist/orchestrator/childBridgeRegistry.js +29 -11
  332. package/dist/orchestrator/childBridgeRegistry.js.map +1 -1
  333. package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
  334. package/dist/orchestrator/orchestratorBridge.js +70 -9
  335. package/dist/orchestrator/orchestratorBridge.js.map +1 -1
  336. package/dist/patchworkConfig.d.ts +44 -1
  337. package/dist/patchworkConfig.js +28 -3
  338. package/dist/patchworkConfig.js.map +1 -1
  339. package/dist/pluginLoader.js +10 -1
  340. package/dist/pluginLoader.js.map +1 -1
  341. package/dist/pluginWatcher.js +12 -14
  342. package/dist/pluginWatcher.js.map +1 -1
  343. package/dist/preToolUseHook.js +3 -2
  344. package/dist/preToolUseHook.js.map +1 -1
  345. package/dist/processTree.d.ts +34 -0
  346. package/dist/processTree.js +105 -0
  347. package/dist/processTree.js.map +1 -0
  348. package/dist/prompts.js +3 -3
  349. package/dist/prompts.js.map +1 -1
  350. package/dist/recipeOrchestration.d.ts +9 -0
  351. package/dist/recipeOrchestration.js +341 -24
  352. package/dist/recipeOrchestration.js.map +1 -1
  353. package/dist/recipeRoutes.d.ts +58 -2
  354. package/dist/recipeRoutes.js +744 -115
  355. package/dist/recipeRoutes.js.map +1 -1
  356. package/dist/recipes/RecipeOrchestrator.d.ts +2 -0
  357. package/dist/recipes/RecipeOrchestrator.js +6 -1
  358. package/dist/recipes/RecipeOrchestrator.js.map +1 -1
  359. package/dist/recipes/agentExecutor.d.ts +25 -5
  360. package/dist/recipes/agentExecutor.js.map +1 -1
  361. package/dist/recipes/chainedRunner.d.ts +2 -0
  362. package/dist/recipes/chainedRunner.js +156 -9
  363. package/dist/recipes/chainedRunner.js.map +1 -1
  364. package/dist/recipes/compiler.js +9 -5
  365. package/dist/recipes/compiler.js.map +1 -1
  366. package/dist/recipes/connectorPreflight.d.ts +66 -0
  367. package/dist/recipes/connectorPreflight.js +169 -0
  368. package/dist/recipes/connectorPreflight.js.map +1 -0
  369. package/dist/recipes/dependencyGraph.d.ts +9 -0
  370. package/dist/recipes/dependencyGraph.js +32 -7
  371. package/dist/recipes/dependencyGraph.js.map +1 -1
  372. package/dist/recipes/githubInstallSource.d.ts +135 -0
  373. package/dist/recipes/githubInstallSource.js +236 -0
  374. package/dist/recipes/githubInstallSource.js.map +1 -0
  375. package/dist/recipes/haltCategory.d.ts +119 -0
  376. package/dist/recipes/haltCategory.js +188 -0
  377. package/dist/recipes/haltCategory.js.map +1 -0
  378. package/dist/recipes/idempotencyKey.d.ts +154 -0
  379. package/dist/recipes/idempotencyKey.js +375 -0
  380. package/dist/recipes/idempotencyKey.js.map +1 -0
  381. package/dist/recipes/installer.js +58 -3
  382. package/dist/recipes/installer.js.map +1 -1
  383. package/dist/recipes/judgeSummary.d.ts +50 -0
  384. package/dist/recipes/judgeSummary.js +47 -0
  385. package/dist/recipes/judgeSummary.js.map +1 -0
  386. package/dist/recipes/judgeVerdict.d.ts +48 -0
  387. package/dist/recipes/judgeVerdict.js +174 -0
  388. package/dist/recipes/judgeVerdict.js.map +1 -0
  389. package/dist/recipes/migrations/index.d.ts +9 -0
  390. package/dist/recipes/migrations/index.js +133 -0
  391. package/dist/recipes/migrations/index.js.map +1 -1
  392. package/dist/recipes/names.d.ts +20 -0
  393. package/dist/recipes/names.js +25 -0
  394. package/dist/recipes/names.js.map +1 -1
  395. package/dist/recipes/parser.js +116 -6
  396. package/dist/recipes/parser.js.map +1 -1
  397. package/dist/recipes/replayRun.js +1 -1
  398. package/dist/recipes/replayRun.js.map +1 -1
  399. package/dist/recipes/runBudget.d.ts +70 -0
  400. package/dist/recipes/runBudget.js +109 -0
  401. package/dist/recipes/runBudget.js.map +1 -0
  402. package/dist/recipes/scheduler.d.ts +30 -0
  403. package/dist/recipes/scheduler.js +69 -19
  404. package/dist/recipes/scheduler.js.map +1 -1
  405. package/dist/recipes/schema.d.ts +65 -2
  406. package/dist/recipes/schemaGenerator.js +119 -7
  407. package/dist/recipes/schemaGenerator.js.map +1 -1
  408. package/dist/recipes/stepObservation.js +9 -0
  409. package/dist/recipes/stepObservation.js.map +1 -1
  410. package/dist/recipes/toolRegistry.js +33 -7
  411. package/dist/recipes/toolRegistry.js.map +1 -1
  412. package/dist/recipes/tools/airtable.d.ts +15 -0
  413. package/dist/recipes/tools/airtable.js +239 -0
  414. package/dist/recipes/tools/airtable.js.map +1 -0
  415. package/dist/recipes/tools/fanOut.d.ts +20 -0
  416. package/dist/recipes/tools/fanOut.js +199 -0
  417. package/dist/recipes/tools/fanOut.js.map +1 -0
  418. package/dist/recipes/tools/file.js +5 -2
  419. package/dist/recipes/tools/file.js.map +1 -1
  420. package/dist/recipes/tools/github.d.ts +1 -1
  421. package/dist/recipes/tools/github.js +75 -1
  422. package/dist/recipes/tools/github.js.map +1 -1
  423. package/dist/recipes/tools/gmail.js +27 -5
  424. package/dist/recipes/tools/gmail.js.map +1 -1
  425. package/dist/recipes/tools/googleDrive.js +64 -0
  426. package/dist/recipes/tools/googleDrive.js.map +1 -1
  427. package/dist/recipes/tools/http.d.ts +10 -0
  428. package/dist/recipes/tools/http.js +176 -0
  429. package/dist/recipes/tools/http.js.map +1 -0
  430. package/dist/recipes/tools/index.d.ts +7 -0
  431. package/dist/recipes/tools/index.js +7 -0
  432. package/dist/recipes/tools/index.js.map +1 -1
  433. package/dist/recipes/tools/resend.d.ts +8 -0
  434. package/dist/recipes/tools/resend.js +152 -0
  435. package/dist/recipes/tools/resend.js.map +1 -0
  436. package/dist/recipes/tools/sendgrid.d.ts +9 -0
  437. package/dist/recipes/tools/sendgrid.js +174 -0
  438. package/dist/recipes/tools/sendgrid.js.map +1 -0
  439. package/dist/recipes/tools/slack.js +1 -1
  440. package/dist/recipes/tools/twilio.d.ts +11 -0
  441. package/dist/recipes/tools/twilio.js +179 -0
  442. package/dist/recipes/tools/twilio.js.map +1 -0
  443. package/dist/recipes/tools/vercel.d.ts +9 -0
  444. package/dist/recipes/tools/vercel.js +145 -0
  445. package/dist/recipes/tools/vercel.js.map +1 -0
  446. package/dist/recipes/validation.d.ts +17 -0
  447. package/dist/recipes/validation.js +141 -11
  448. package/dist/recipes/validation.js.map +1 -1
  449. package/dist/recipes/workspaceRoot.d.ts +37 -0
  450. package/dist/recipes/workspaceRoot.js +73 -0
  451. package/dist/recipes/workspaceRoot.js.map +1 -0
  452. package/dist/recipes/yamlPositions.d.ts +56 -0
  453. package/dist/recipes/yamlPositions.js +183 -0
  454. package/dist/recipes/yamlPositions.js.map +1 -0
  455. package/dist/recipes/yamlRunner.d.ts +185 -8
  456. package/dist/recipes/yamlRunner.js +967 -224
  457. package/dist/recipes/yamlRunner.js.map +1 -1
  458. package/dist/recipesHttp.d.ts +19 -3
  459. package/dist/recipesHttp.js +67 -11
  460. package/dist/recipesHttp.js.map +1 -1
  461. package/dist/resources.js +21 -13
  462. package/dist/resources.js.map +1 -1
  463. package/dist/runLog.d.ts +58 -5
  464. package/dist/runLog.js +98 -21
  465. package/dist/runLog.js.map +1 -1
  466. package/dist/sanitizeParsedJson.d.ts +39 -0
  467. package/dist/sanitizeParsedJson.js +55 -0
  468. package/dist/sanitizeParsedJson.js.map +1 -0
  469. package/dist/schemas/recipe.v1.json +887 -198
  470. package/dist/server.d.ts +160 -3
  471. package/dist/server.js +1099 -122
  472. package/dist/server.js.map +1 -1
  473. package/dist/sessionCheckpoint.d.ts +8 -0
  474. package/dist/sessionCheckpoint.js +33 -3
  475. package/dist/sessionCheckpoint.js.map +1 -1
  476. package/dist/ssrfGuard.d.ts +16 -0
  477. package/dist/ssrfGuard.js +87 -4
  478. package/dist/ssrfGuard.js.map +1 -1
  479. package/dist/streamableHttp.d.ts +9 -4
  480. package/dist/streamableHttp.js +76 -20
  481. package/dist/streamableHttp.js.map +1 -1
  482. package/dist/telemetry.js +37 -19
  483. package/dist/telemetry.js.map +1 -1
  484. package/dist/testing/shadowRun.d.ts +52 -0
  485. package/dist/testing/shadowRun.js +71 -0
  486. package/dist/testing/shadowRun.js.map +1 -0
  487. package/dist/tools/batchLsp.d.ts +3 -0
  488. package/dist/tools/bridgeDoctor.d.ts +11 -0
  489. package/dist/tools/bridgeDoctor.js +48 -2
  490. package/dist/tools/bridgeDoctor.js.map +1 -1
  491. package/dist/tools/bridgeStatus.d.ts +0 -12
  492. package/dist/tools/bridgeStatus.js +2 -28
  493. package/dist/tools/bridgeStatus.js.map +1 -1
  494. package/dist/tools/cancelClaudeTask.d.ts +1 -0
  495. package/dist/tools/clipboard.d.ts +2 -0
  496. package/dist/tools/closeTabs.d.ts +1 -0
  497. package/dist/tools/codeLens.d.ts +1 -0
  498. package/dist/tools/createIssueFromAIComment.d.ts +1 -0
  499. package/dist/tools/ctxGetTaskContext.d.ts +9 -0
  500. package/dist/tools/ctxGetTaskContext.js +50 -2
  501. package/dist/tools/ctxGetTaskContext.js.map +1 -1
  502. package/dist/tools/ctxQueryTraces.js +32 -24
  503. package/dist/tools/ctxQueryTraces.js.map +1 -1
  504. package/dist/tools/ctxSaveTrace.d.ts +1 -0
  505. package/dist/tools/debug.d.ts +4 -0
  506. package/dist/tools/decorations.d.ts +2 -0
  507. package/dist/tools/detectUnusedCode.js +9 -7
  508. package/dist/tools/detectUnusedCode.js.map +1 -1
  509. package/dist/tools/documentLinks.d.ts +1 -0
  510. package/dist/tools/editText.d.ts +1 -0
  511. package/dist/tools/editText.js +2 -1
  512. package/dist/tools/editText.js.map +1 -1
  513. package/dist/tools/enrichCommit.d.ts +1 -0
  514. package/dist/tools/enrichStackTrace.js +11 -5
  515. package/dist/tools/enrichStackTrace.js.map +1 -1
  516. package/dist/tools/explainDiagnostic.d.ts +1 -0
  517. package/dist/tools/explainSymbol.d.ts +1 -0
  518. package/dist/tools/fileOperations.d.ts +3 -0
  519. package/dist/tools/fileOperations.js +2 -1
  520. package/dist/tools/fileOperations.js.map +1 -1
  521. package/dist/tools/fileWatcher.d.ts +2 -0
  522. package/dist/tools/fileWatcher.js +8 -2
  523. package/dist/tools/fileWatcher.js.map +1 -1
  524. package/dist/tools/findFiles.d.ts +1 -0
  525. package/dist/tools/fixAllLintErrors.d.ts +1 -0
  526. package/dist/tools/fixAllLintErrors.js +10 -5
  527. package/dist/tools/fixAllLintErrors.js.map +1 -1
  528. package/dist/tools/foldingRanges.d.ts +1 -0
  529. package/dist/tools/formatDocument.d.ts +1 -0
  530. package/dist/tools/formatDocument.js +10 -5
  531. package/dist/tools/formatDocument.js.map +1 -1
  532. package/dist/tools/generateTests.d.ts +1 -0
  533. package/dist/tools/getAIComments.d.ts +1 -0
  534. package/dist/tools/getAnalyticsReport.js +5 -1
  535. package/dist/tools/getAnalyticsReport.js.map +1 -1
  536. package/dist/tools/getBufferContent.d.ts +1 -0
  537. package/dist/tools/getChangeImpact.d.ts +1 -0
  538. package/dist/tools/getChangeImpact.js +23 -14
  539. package/dist/tools/getChangeImpact.js.map +1 -1
  540. package/dist/tools/getClaudeTaskStatus.d.ts +1 -0
  541. package/dist/tools/getCodeCoverage.d.ts +1 -0
  542. package/dist/tools/getCodeCoverage.js +32 -14
  543. package/dist/tools/getCodeCoverage.js.map +1 -1
  544. package/dist/tools/getCommitsForIssue.d.ts +1 -0
  545. package/dist/tools/getDebugState.d.ts +1 -0
  546. package/dist/tools/getDiagnostics.js +32 -29
  547. package/dist/tools/getDiagnostics.js.map +1 -1
  548. package/dist/tools/getDiffFromHandoff.js +8 -2
  549. package/dist/tools/getDiffFromHandoff.js.map +1 -1
  550. package/dist/tools/getDocumentSymbols.d.ts +1 -0
  551. package/dist/tools/getGitHotspots.d.ts +1 -0
  552. package/dist/tools/getGitStatus.js +6 -1
  553. package/dist/tools/getGitStatus.js.map +1 -1
  554. package/dist/tools/getImportedSignatures.d.ts +1 -0
  555. package/dist/tools/getImportedSignatures.js +18 -14
  556. package/dist/tools/getImportedSignatures.js.map +1 -1
  557. package/dist/tools/getPRTemplate.d.ts +1 -0
  558. package/dist/tools/getProjectContext.js +23 -10
  559. package/dist/tools/getProjectContext.js.map +1 -1
  560. package/dist/tools/getSymbolHistory.d.ts +1 -0
  561. package/dist/tools/getToolCapabilities.d.ts +10 -5
  562. package/dist/tools/getToolCapabilities.js +116 -204
  563. package/dist/tools/getToolCapabilities.js.map +1 -1
  564. package/dist/tools/getTypeSignature.d.ts +1 -0
  565. package/dist/tools/getWorkspaceSettings.d.ts +1 -0
  566. package/dist/tools/gitWrite.d.ts +11 -0
  567. package/dist/tools/github/actions.d.ts +2 -0
  568. package/dist/tools/github/composite.d.ts +4 -1
  569. package/dist/tools/github/composite.js +7 -7
  570. package/dist/tools/github/composite.js.map +1 -1
  571. package/dist/tools/github/issues.d.ts +4 -0
  572. package/dist/tools/github/pr.d.ts +13 -6
  573. package/dist/tools/github/pr.js +18 -11
  574. package/dist/tools/github/pr.js.map +1 -1
  575. package/dist/tools/handoffNote.d.ts +1 -0
  576. package/dist/tools/handoffNote.js +2 -1
  577. package/dist/tools/handoffNote.js.map +1 -1
  578. package/dist/tools/headless/lspClient.js +3 -0
  579. package/dist/tools/headless/lspClient.js.map +1 -1
  580. package/dist/tools/hoverAtCursor.d.ts +1 -0
  581. package/dist/tools/httpClient.d.ts +2 -0
  582. package/dist/tools/httpClient.js +38 -71
  583. package/dist/tools/httpClient.js.map +1 -1
  584. package/dist/tools/index.js +14 -10
  585. package/dist/tools/index.js.map +1 -1
  586. package/dist/tools/inlayHints.d.ts +1 -0
  587. package/dist/tools/launchQuickTask.d.ts +1 -0
  588. package/dist/tools/listClaudeTasks.d.ts +1 -0
  589. package/dist/tools/listClaudeTasks.js +10 -8
  590. package/dist/tools/listClaudeTasks.js.map +1 -1
  591. package/dist/tools/listTerminals.d.ts +1 -0
  592. package/dist/tools/lsp.d.ts +15 -0
  593. package/dist/tools/lsp.js +17 -0
  594. package/dist/tools/lsp.js.map +1 -1
  595. package/dist/tools/navigateToSymbolByName.d.ts +1 -0
  596. package/dist/tools/openDiff.d.ts +1 -0
  597. package/dist/tools/openDiff.js +4 -1
  598. package/dist/tools/openDiff.js.map +1 -1
  599. package/dist/tools/openFile.d.ts +1 -0
  600. package/dist/tools/openFile.js +4 -1
  601. package/dist/tools/openFile.js.map +1 -1
  602. package/dist/tools/openInBrowser.js +6 -1
  603. package/dist/tools/openInBrowser.js.map +1 -1
  604. package/dist/tools/organizeImports.d.ts +1 -0
  605. package/dist/tools/organizeImports.js +5 -3
  606. package/dist/tools/organizeImports.js.map +1 -1
  607. package/dist/tools/performanceReport.js +5 -3
  608. package/dist/tools/performanceReport.js.map +1 -1
  609. package/dist/tools/planPersistence.d.ts +3 -0
  610. package/dist/tools/planPersistence.js +4 -1
  611. package/dist/tools/planPersistence.js.map +1 -1
  612. package/dist/tools/previewEdit.d.ts +1 -0
  613. package/dist/tools/previewEdit.js +31 -5
  614. package/dist/tools/previewEdit.js.map +1 -1
  615. package/dist/tools/recentTracesDigest.js +54 -11
  616. package/dist/tools/recentTracesDigest.js.map +1 -1
  617. package/dist/tools/refactorAnalyze.d.ts +1 -0
  618. package/dist/tools/refactorExtractFunction.js +4 -1
  619. package/dist/tools/refactorExtractFunction.js.map +1 -1
  620. package/dist/tools/refactorPreview.d.ts +1 -0
  621. package/dist/tools/refactorPreview.js +10 -2
  622. package/dist/tools/refactorPreview.js.map +1 -1
  623. package/dist/tools/replaceBlock.d.ts +1 -0
  624. package/dist/tools/replaceBlock.js +2 -1
  625. package/dist/tools/replaceBlock.js.map +1 -1
  626. package/dist/tools/resumeClaudeTask.d.ts +1 -0
  627. package/dist/tools/runClaudeTask.d.ts +1 -0
  628. package/dist/tools/runTests.js +15 -4
  629. package/dist/tools/runTests.js.map +1 -1
  630. package/dist/tools/screenshot.d.ts +1 -0
  631. package/dist/tools/screenshotAndAnnotate.js +6 -2
  632. package/dist/tools/screenshotAndAnnotate.js.map +1 -1
  633. package/dist/tools/searchAndReplace.d.ts +1 -0
  634. package/dist/tools/searchAndReplace.js +21 -12
  635. package/dist/tools/searchAndReplace.js.map +1 -1
  636. package/dist/tools/searchTools.d.ts +26 -0
  637. package/dist/tools/searchTools.js +62 -21
  638. package/dist/tools/searchTools.js.map +1 -1
  639. package/dist/tools/searchWorkspace.d.ts +1 -0
  640. package/dist/tools/selectionRanges.d.ts +1 -0
  641. package/dist/tools/semanticTokens.d.ts +1 -0
  642. package/dist/tools/signatureHelp.d.ts +1 -0
  643. package/dist/tools/spawnWorkspace.js +15 -7
  644. package/dist/tools/spawnWorkspace.js.map +1 -1
  645. package/dist/tools/terminal.d.ts +6 -0
  646. package/dist/tools/testRunners/pytest.js +6 -2
  647. package/dist/tools/testRunners/pytest.js.map +1 -1
  648. package/dist/tools/testRunners/vitestJest.js +3 -1
  649. package/dist/tools/testRunners/vitestJest.js.map +1 -1
  650. package/dist/tools/testTraceToSource.d.ts +1 -0
  651. package/dist/tools/transaction.d.ts +13 -1
  652. package/dist/tools/transaction.js +63 -5
  653. package/dist/tools/transaction.js.map +1 -1
  654. package/dist/tools/typeHierarchy.d.ts +1 -0
  655. package/dist/tools/utils.d.ts +33 -0
  656. package/dist/tools/utils.js +122 -18
  657. package/dist/tools/utils.js.map +1 -1
  658. package/dist/tools/vscodeCommands.d.ts +2 -0
  659. package/dist/tools/vscodeTasks.d.ts +2 -0
  660. package/dist/tools/workspaceSettings.d.ts +1 -0
  661. package/dist/transport.d.ts +3 -1
  662. package/dist/transport.js +126 -52
  663. package/dist/transport.js.map +1 -1
  664. package/dist/winShim.d.ts +34 -0
  665. package/dist/winShim.js +94 -0
  666. package/dist/winShim.js.map +1 -0
  667. package/dist/wireHaltPushDispatch.d.ts +38 -0
  668. package/dist/wireHaltPushDispatch.js +71 -0
  669. package/dist/wireHaltPushDispatch.js.map +1 -0
  670. package/dist/writeFileAtomic.d.ts +23 -0
  671. package/dist/writeFileAtomic.js +121 -0
  672. package/dist/writeFileAtomic.js.map +1 -0
  673. package/package.json +23 -7
  674. package/scripts/postinstall.mjs +42 -2
  675. package/scripts/smoke/run-all.mjs +213 -0
  676. package/scripts/start-all.mjs +572 -0
  677. package/scripts/start-all.ps1 +209 -0
  678. package/scripts/start-all.sh +73 -17
  679. package/scripts/start-orchestrator.ps1 +158 -0
  680. package/scripts/start-remote.mjs +122 -0
  681. package/templates/automation-policies/recipe-authoring.json +1 -1
  682. package/templates/automation-policies/security-first.json +1 -1
  683. package/templates/automation-policies/strict-lint.json +1 -1
  684. package/templates/automation-policies/test-driven.json +1 -1
  685. package/templates/automation-policy.example.json +1 -1
  686. package/templates/co.patchwork-os.bridge.plist +2 -2
  687. package/templates/recipes/approval-queue-ui-test.yaml +1 -1
  688. package/templates/recipes/ctx-loop-test.yaml +1 -1
  689. package/templates/recipes/fix-errors-on-save.yaml +71 -0
  690. package/templates/recipes/morning-brief.yaml +5 -2
  691. package/templates/recipes/project-health-check.yaml +4 -1
  692. package/templates/recipes/sentry-to-linear.yaml +72 -38
  693. package/templates/recipes/webhook/apple-watch-health-log.yaml +145 -0
  694. package/templates/recipes/webhook/customer-escalation.yaml +8 -9
  695. package/templates/recipes/webhook/meeting-prep.yaml +11 -5
  696. package/dist/commands/marketplace.d.ts +0 -16
  697. package/dist/commands/marketplace.js +0 -32
  698. package/dist/commands/marketplace.js.map +0 -1
  699. package/dist/recipes/legacyRecipeCompat.d.ts +0 -10
  700. package/dist/recipes/legacyRecipeCompat.js +0 -131
  701. package/dist/recipes/legacyRecipeCompat.js.map +0 -1
@@ -168,6 +168,66 @@ export function tryHandlePublicConnectorRoute(req, res, parsedUrl) {
168
168
  })();
169
169
  return true;
170
170
  }
171
+ if (parsedUrl.pathname === "/connections/google-docs/callback" &&
172
+ req.method === "GET") {
173
+ void (async () => {
174
+ try {
175
+ const { handleDocsCallback } = await import("./connectors/googleDocs.js");
176
+ const code = parsedUrl.searchParams.get("code");
177
+ const state = parsedUrl.searchParams.get("state");
178
+ const error = parsedUrl.searchParams.get("error");
179
+ const result = await handleDocsCallback(code, state, error);
180
+ res.writeHead(result.status, {
181
+ "Content-Type": result.contentType ?? "application/json",
182
+ });
183
+ res.end(result.body);
184
+ }
185
+ catch (err) {
186
+ respond500(res, err);
187
+ }
188
+ })();
189
+ return true;
190
+ }
191
+ if (parsedUrl.pathname === "/connections/monday/callback" &&
192
+ req.method === "GET") {
193
+ void (async () => {
194
+ try {
195
+ const { handleMondayCallback } = await import("./connectors/monday.js");
196
+ const code = parsedUrl.searchParams.get("code");
197
+ const state = parsedUrl.searchParams.get("state");
198
+ const error = parsedUrl.searchParams.get("error");
199
+ const result = await handleMondayCallback(code, state, error);
200
+ res.writeHead(result.status, {
201
+ "Content-Type": result.contentType ?? "application/json",
202
+ });
203
+ res.end(result.body);
204
+ }
205
+ catch (err) {
206
+ respond500(res, err);
207
+ }
208
+ })();
209
+ return true;
210
+ }
211
+ if (parsedUrl.pathname === "/connections/salesforce/callback" &&
212
+ req.method === "GET") {
213
+ void (async () => {
214
+ try {
215
+ const { handleSalesforceCallback } = await import("./connectors/salesforce.js");
216
+ const code = parsedUrl.searchParams.get("code");
217
+ const state = parsedUrl.searchParams.get("state");
218
+ const error = parsedUrl.searchParams.get("error");
219
+ const result = await handleSalesforceCallback(code, state, error);
220
+ res.writeHead(result.status, {
221
+ "Content-Type": result.contentType ?? "application/json",
222
+ });
223
+ res.end(result.body);
224
+ }
225
+ catch (err) {
226
+ respond500(res, err);
227
+ }
228
+ })();
229
+ return true;
230
+ }
171
231
  if (parsedUrl.pathname === "/connections/slack/callback" &&
172
232
  req.method === "GET") {
173
233
  void (async () => {
@@ -208,6 +268,70 @@ export function tryHandlePublicConnectorRoute(req, res, parsedUrl) {
208
268
  })();
209
269
  return true;
210
270
  }
271
+ // Discord, Asana, GitLab — OAuth authorization-code connectors whose vendor
272
+ // redirects back to these callback URLs with no Patchwork bearer token.
273
+ // They must be registered here (pre-auth) so the browser redirect doesn't
274
+ // hit the bearer-auth gate and get rejected with 401.
275
+ if (parsedUrl.pathname === "/connections/discord/callback" &&
276
+ req.method === "GET") {
277
+ void (async () => {
278
+ try {
279
+ const { handleDiscordCallback } = await import("./connectors/discord.js");
280
+ const code = parsedUrl.searchParams.get("code");
281
+ const state = parsedUrl.searchParams.get("state");
282
+ const error = parsedUrl.searchParams.get("error");
283
+ const result = await handleDiscordCallback(code, state, error);
284
+ res.writeHead(result.status, {
285
+ "Content-Type": result.contentType ?? "text/html",
286
+ });
287
+ res.end(result.body);
288
+ }
289
+ catch (err) {
290
+ respond500(res, err);
291
+ }
292
+ })();
293
+ return true;
294
+ }
295
+ if (parsedUrl.pathname === "/connections/asana/callback" &&
296
+ req.method === "GET") {
297
+ void (async () => {
298
+ try {
299
+ const { handleAsanaCallback } = await import("./connectors/asana.js");
300
+ const code = parsedUrl.searchParams.get("code");
301
+ const state = parsedUrl.searchParams.get("state");
302
+ const error = parsedUrl.searchParams.get("error");
303
+ const result = await handleAsanaCallback(code, state, error);
304
+ res.writeHead(result.status, {
305
+ "Content-Type": result.contentType ?? "text/html",
306
+ });
307
+ res.end(result.body);
308
+ }
309
+ catch (err) {
310
+ respond500(res, err);
311
+ }
312
+ })();
313
+ return true;
314
+ }
315
+ if (parsedUrl.pathname === "/connections/gitlab/callback" &&
316
+ req.method === "GET") {
317
+ void (async () => {
318
+ try {
319
+ const { handleGitLabCallback } = await import("./connectors/gitlab.js");
320
+ const code = parsedUrl.searchParams.get("code");
321
+ const state = parsedUrl.searchParams.get("state");
322
+ const error = parsedUrl.searchParams.get("error");
323
+ const result = await handleGitLabCallback(code, state, error);
324
+ res.writeHead(result.status, {
325
+ "Content-Type": result.contentType ?? "text/html",
326
+ });
327
+ res.end(result.body);
328
+ }
329
+ catch (err) {
330
+ respond500(res, err);
331
+ }
332
+ })();
333
+ return true;
334
+ }
211
335
  return false;
212
336
  }
213
337
  /**
@@ -550,7 +674,7 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
550
674
  void (async () => {
551
675
  try {
552
676
  const { handleSlackDisconnect } = await import("./connectors/slack.js");
553
- const result = handleSlackDisconnect();
677
+ const result = await handleSlackDisconnect();
554
678
  res.writeHead(result.status, {
555
679
  "Content-Type": result.contentType ?? "application/json",
556
680
  });
@@ -882,6 +1006,48 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
882
1006
  })();
883
1007
  return true;
884
1008
  }
1009
+ // ── Jira routes ─────────────────────────────────────────────────
1010
+ if (parsedUrl.pathname === "/connections/jira/connect" &&
1011
+ req.method === "POST") {
1012
+ void dispatchConnectorConnect(req, res, async () => {
1013
+ const m = await import("./connectors/jira.js");
1014
+ return m.handleJiraConnect;
1015
+ });
1016
+ return true;
1017
+ }
1018
+ if (parsedUrl.pathname === "/connections/jira/test" &&
1019
+ req.method === "POST") {
1020
+ void (async () => {
1021
+ try {
1022
+ const { handleJiraTest } = await import("./connectors/jira.js");
1023
+ const result = await handleJiraTest();
1024
+ res.writeHead(result.status, {
1025
+ "Content-Type": result.contentType ?? "application/json",
1026
+ });
1027
+ res.end(result.body);
1028
+ }
1029
+ catch (err) {
1030
+ respond500(res, err);
1031
+ }
1032
+ })();
1033
+ return true;
1034
+ }
1035
+ if (parsedUrl.pathname === "/connections/jira" && req.method === "DELETE") {
1036
+ void (async () => {
1037
+ try {
1038
+ const { handleJiraDisconnect } = await import("./connectors/jira.js");
1039
+ const result = handleJiraDisconnect();
1040
+ res.writeHead(result.status, {
1041
+ "Content-Type": result.contentType ?? "application/json",
1042
+ });
1043
+ res.end(result.body);
1044
+ }
1045
+ catch (err) {
1046
+ respond500(res, err);
1047
+ }
1048
+ })();
1049
+ return true;
1050
+ }
885
1051
  // ── Zendesk routes ──────────────────────────────────────────────
886
1052
  if (parsedUrl.pathname === "/connections/zendesk/connect" &&
887
1053
  req.method === "POST") {
@@ -1139,23 +1305,25 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1139
1305
  })();
1140
1306
  return true;
1141
1307
  }
1142
- // ── Google Calendar routes ──────────────────────────────────────
1143
- if (parsedUrl.pathname === "/connections/google-calendar/auth" &&
1144
- req.method === "GET") {
1308
+ // ── Postgres routes ─────────────────────────────────────────────
1309
+ if (parsedUrl.pathname === "/connections/postgres/connect" &&
1310
+ req.method === "POST") {
1311
+ void dispatchConnectorConnect(req, res, async () => {
1312
+ const m = await import("./connectors/postgres.js");
1313
+ return m.handlePostgresConnect;
1314
+ });
1315
+ return true;
1316
+ }
1317
+ if (parsedUrl.pathname === "/connections/postgres/test" &&
1318
+ req.method === "POST") {
1145
1319
  void (async () => {
1146
1320
  try {
1147
- const { handleCalendarAuthRedirect } = await import("./connectors/googleCalendar.js");
1148
- const result = handleCalendarAuthRedirect();
1149
- if (result.redirect) {
1150
- res.writeHead(302, { Location: result.redirect });
1151
- res.end();
1152
- }
1153
- else {
1154
- res.writeHead(result.status, {
1155
- "Content-Type": result.contentType ?? "application/json",
1156
- });
1157
- res.end(result.body);
1158
- }
1321
+ const { handlePostgresTest } = await import("./connectors/postgres.js");
1322
+ const result = await handlePostgresTest();
1323
+ res.writeHead(result.status, {
1324
+ "Content-Type": result.contentType ?? "application/json",
1325
+ });
1326
+ res.end(result.body);
1159
1327
  }
1160
1328
  catch (err) {
1161
1329
  respond500(res, err);
@@ -1163,15 +1331,12 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1163
1331
  })();
1164
1332
  return true;
1165
1333
  }
1166
- if (parsedUrl.pathname === "/connections/google-calendar/callback" &&
1167
- req.method === "GET") {
1334
+ if (parsedUrl.pathname === "/connections/postgres" &&
1335
+ req.method === "DELETE") {
1168
1336
  void (async () => {
1169
1337
  try {
1170
- const { handleCalendarCallback } = await import("./connectors/googleCalendar.js");
1171
- const code = parsedUrl.searchParams.get("code");
1172
- const state = parsedUrl.searchParams.get("state");
1173
- const error = parsedUrl.searchParams.get("error");
1174
- const result = await handleCalendarCallback(code, state, error);
1338
+ const { handlePostgresDisconnect } = await import("./connectors/postgres.js");
1339
+ const result = await handlePostgresDisconnect();
1175
1340
  res.writeHead(result.status, {
1176
1341
  "Content-Type": result.contentType ?? "application/json",
1177
1342
  });
@@ -1183,12 +1348,21 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1183
1348
  })();
1184
1349
  return true;
1185
1350
  }
1186
- if (parsedUrl.pathname === "/connections/google-calendar/test" &&
1351
+ // ── MongoDB routes ──────────────────────────────────────────────
1352
+ if (parsedUrl.pathname === "/connections/mongodb/connect" &&
1353
+ req.method === "POST") {
1354
+ void dispatchConnectorConnect(req, res, async () => {
1355
+ const m = await import("./connectors/mongodb.js");
1356
+ return m.handleMongoConnect;
1357
+ });
1358
+ return true;
1359
+ }
1360
+ if (parsedUrl.pathname === "/connections/mongodb/test" &&
1187
1361
  req.method === "POST") {
1188
1362
  void (async () => {
1189
1363
  try {
1190
- const { handleCalendarTest } = await import("./connectors/googleCalendar.js");
1191
- const result = await handleCalendarTest();
1364
+ const { handleMongoTest } = await import("./connectors/mongodb.js");
1365
+ const result = await handleMongoTest();
1192
1366
  res.writeHead(result.status, {
1193
1367
  "Content-Type": result.contentType ?? "application/json",
1194
1368
  });
@@ -1200,12 +1374,12 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1200
1374
  })();
1201
1375
  return true;
1202
1376
  }
1203
- if (parsedUrl.pathname === "/connections/google-calendar" &&
1377
+ if (parsedUrl.pathname === "/connections/mongodb" &&
1204
1378
  req.method === "DELETE") {
1205
1379
  void (async () => {
1206
1380
  try {
1207
- const { handleCalendarDisconnect } = await import("./connectors/googleCalendar.js");
1208
- const result = await handleCalendarDisconnect();
1381
+ const { handleMongoDisconnect } = await import("./connectors/mongodb.js");
1382
+ const result = await handleMongoDisconnect();
1209
1383
  res.writeHead(result.status, {
1210
1384
  "Content-Type": result.contentType ?? "application/json",
1211
1385
  });
@@ -1217,23 +1391,25 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1217
1391
  })();
1218
1392
  return true;
1219
1393
  }
1220
- // ── Google Drive routes ─────────────────────────────────────────
1221
- if (parsedUrl.pathname === "/connections/google-drive/auth" &&
1222
- req.method === "GET") {
1394
+ // ── Redis routes ────────────────────────────────────────────────
1395
+ if (parsedUrl.pathname === "/connections/redis/connect" &&
1396
+ req.method === "POST") {
1397
+ void dispatchConnectorConnect(req, res, async () => {
1398
+ const m = await import("./connectors/redis.js");
1399
+ return m.handleRedisConnect;
1400
+ });
1401
+ return true;
1402
+ }
1403
+ if (parsedUrl.pathname === "/connections/redis/test" &&
1404
+ req.method === "POST") {
1223
1405
  void (async () => {
1224
1406
  try {
1225
- const { handleDriveAuthRedirect } = await import("./connectors/googleDrive.js");
1226
- const result = handleDriveAuthRedirect();
1227
- if (result.redirect) {
1228
- res.writeHead(302, { Location: result.redirect });
1229
- res.end();
1230
- }
1231
- else {
1232
- res.writeHead(result.status, {
1233
- "Content-Type": result.contentType ?? "application/json",
1234
- });
1235
- res.end(result.body);
1236
- }
1407
+ const { handleRedisTest } = await import("./connectors/redis.js");
1408
+ const result = await handleRedisTest();
1409
+ res.writeHead(result.status, {
1410
+ "Content-Type": result.contentType ?? "application/json",
1411
+ });
1412
+ res.end(result.body);
1237
1413
  }
1238
1414
  catch (err) {
1239
1415
  respond500(res, err);
@@ -1241,15 +1417,11 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1241
1417
  })();
1242
1418
  return true;
1243
1419
  }
1244
- if (parsedUrl.pathname === "/connections/google-drive/callback" &&
1245
- req.method === "GET") {
1420
+ if (parsedUrl.pathname === "/connections/redis" && req.method === "DELETE") {
1246
1421
  void (async () => {
1247
1422
  try {
1248
- const { handleDriveCallback } = await import("./connectors/googleDrive.js");
1249
- const code = parsedUrl.searchParams.get("code");
1250
- const state = parsedUrl.searchParams.get("state");
1251
- const error = parsedUrl.searchParams.get("error");
1252
- const result = await handleDriveCallback(code, state, error);
1423
+ const { handleRedisDisconnect } = await import("./connectors/redis.js");
1424
+ const result = await handleRedisDisconnect();
1253
1425
  res.writeHead(result.status, {
1254
1426
  "Content-Type": result.contentType ?? "application/json",
1255
1427
  });
@@ -1261,12 +1433,21 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1261
1433
  })();
1262
1434
  return true;
1263
1435
  }
1264
- if (parsedUrl.pathname === "/connections/google-drive/test" &&
1436
+ // ── Elasticsearch routes ────────────────────────────────────────
1437
+ if (parsedUrl.pathname === "/connections/elasticsearch/connect" &&
1438
+ req.method === "POST") {
1439
+ void dispatchConnectorConnect(req, res, async () => {
1440
+ const m = await import("./connectors/elasticsearch.js");
1441
+ return m.handleElasticsearchConnect;
1442
+ });
1443
+ return true;
1444
+ }
1445
+ if (parsedUrl.pathname === "/connections/elasticsearch/test" &&
1265
1446
  req.method === "POST") {
1266
1447
  void (async () => {
1267
1448
  try {
1268
- const { handleDriveTest } = await import("./connectors/googleDrive.js");
1269
- const result = await handleDriveTest();
1449
+ const { handleElasticsearchTest } = await import("./connectors/elasticsearch.js");
1450
+ const result = await handleElasticsearchTest();
1270
1451
  res.writeHead(result.status, {
1271
1452
  "Content-Type": result.contentType ?? "application/json",
1272
1453
  });
@@ -1278,12 +1459,1196 @@ export function tryHandleConnectorRoute(req, res, parsedUrl) {
1278
1459
  })();
1279
1460
  return true;
1280
1461
  }
1281
- if (parsedUrl.pathname === "/connections/google-drive" &&
1462
+ if (parsedUrl.pathname === "/connections/elasticsearch" &&
1282
1463
  req.method === "DELETE") {
1283
1464
  void (async () => {
1284
1465
  try {
1285
- const { handleDriveDisconnect } = await import("./connectors/googleDrive.js");
1286
- const result = await handleDriveDisconnect();
1466
+ const { handleElasticsearchDisconnect } = await import("./connectors/elasticsearch.js");
1467
+ const result = await handleElasticsearchDisconnect();
1468
+ res.writeHead(result.status, {
1469
+ "Content-Type": result.contentType ?? "application/json",
1470
+ });
1471
+ res.end(result.body);
1472
+ }
1473
+ catch (err) {
1474
+ respond500(res, err);
1475
+ }
1476
+ })();
1477
+ return true;
1478
+ }
1479
+ // ── SendGrid routes ─────────────────────────────────────────────
1480
+ if (parsedUrl.pathname === "/connections/sendgrid/connect" &&
1481
+ req.method === "POST") {
1482
+ void dispatchConnectorConnect(req, res, async () => {
1483
+ const m = await import("./connectors/sendgrid.js");
1484
+ return m.handleSendGridConnect;
1485
+ });
1486
+ return true;
1487
+ }
1488
+ if (parsedUrl.pathname === "/connections/sendgrid/test" &&
1489
+ req.method === "POST") {
1490
+ void (async () => {
1491
+ try {
1492
+ const { handleSendGridTest } = await import("./connectors/sendgrid.js");
1493
+ const result = await handleSendGridTest();
1494
+ res.writeHead(result.status, {
1495
+ "Content-Type": result.contentType ?? "application/json",
1496
+ });
1497
+ res.end(result.body);
1498
+ }
1499
+ catch (err) {
1500
+ respond500(res, err);
1501
+ }
1502
+ })();
1503
+ return true;
1504
+ }
1505
+ if (parsedUrl.pathname === "/connections/sendgrid" &&
1506
+ req.method === "DELETE") {
1507
+ void (async () => {
1508
+ try {
1509
+ const { handleSendGridDisconnect } = await import("./connectors/sendgrid.js");
1510
+ const result = handleSendGridDisconnect();
1511
+ res.writeHead(result.status, {
1512
+ "Content-Type": result.contentType ?? "application/json",
1513
+ });
1514
+ res.end(result.body);
1515
+ }
1516
+ catch (err) {
1517
+ respond500(res, err);
1518
+ }
1519
+ })();
1520
+ return true;
1521
+ }
1522
+ // ── Twilio routes ───────────────────────────────────────────────
1523
+ if (parsedUrl.pathname === "/connections/twilio/connect" &&
1524
+ req.method === "POST") {
1525
+ void dispatchConnectorConnect(req, res, async () => {
1526
+ const m = await import("./connectors/twilio.js");
1527
+ return m.handleTwilioConnect;
1528
+ });
1529
+ return true;
1530
+ }
1531
+ if (parsedUrl.pathname === "/connections/twilio/test" &&
1532
+ req.method === "POST") {
1533
+ void (async () => {
1534
+ try {
1535
+ const { handleTwilioTest } = await import("./connectors/twilio.js");
1536
+ const result = await handleTwilioTest();
1537
+ res.writeHead(result.status, {
1538
+ "Content-Type": result.contentType ?? "application/json",
1539
+ });
1540
+ res.end(result.body);
1541
+ }
1542
+ catch (err) {
1543
+ respond500(res, err);
1544
+ }
1545
+ })();
1546
+ return true;
1547
+ }
1548
+ if (parsedUrl.pathname === "/connections/twilio" && req.method === "DELETE") {
1549
+ void (async () => {
1550
+ try {
1551
+ const { handleTwilioDisconnect } = await import("./connectors/twilio.js");
1552
+ const result = handleTwilioDisconnect();
1553
+ res.writeHead(result.status, {
1554
+ "Content-Type": result.contentType ?? "application/json",
1555
+ });
1556
+ res.end(result.body);
1557
+ }
1558
+ catch (err) {
1559
+ respond500(res, err);
1560
+ }
1561
+ })();
1562
+ return true;
1563
+ }
1564
+ // ── Figma routes ────────────────────────────────────────────────
1565
+ if (parsedUrl.pathname === "/connections/figma/connect" &&
1566
+ req.method === "POST") {
1567
+ void dispatchConnectorConnect(req, res, async () => {
1568
+ const m = await import("./connectors/figma.js");
1569
+ return m.handleFigmaConnect;
1570
+ });
1571
+ return true;
1572
+ }
1573
+ if (parsedUrl.pathname === "/connections/figma/test" &&
1574
+ req.method === "POST") {
1575
+ void (async () => {
1576
+ try {
1577
+ const { handleFigmaTest } = await import("./connectors/figma.js");
1578
+ const result = await handleFigmaTest();
1579
+ res.writeHead(result.status, {
1580
+ "Content-Type": result.contentType ?? "application/json",
1581
+ });
1582
+ res.end(result.body);
1583
+ }
1584
+ catch (err) {
1585
+ respond500(res, err);
1586
+ }
1587
+ })();
1588
+ return true;
1589
+ }
1590
+ if (parsedUrl.pathname === "/connections/figma" && req.method === "DELETE") {
1591
+ void (async () => {
1592
+ try {
1593
+ const { handleFigmaDisconnect } = await import("./connectors/figma.js");
1594
+ const result = handleFigmaDisconnect();
1595
+ res.writeHead(result.status, {
1596
+ "Content-Type": result.contentType ?? "application/json",
1597
+ });
1598
+ res.end(result.body);
1599
+ }
1600
+ catch (err) {
1601
+ respond500(res, err);
1602
+ }
1603
+ })();
1604
+ return true;
1605
+ }
1606
+ // ── Airtable routes ─────────────────────────────────────────────
1607
+ if (parsedUrl.pathname === "/connections/airtable/connect" &&
1608
+ req.method === "POST") {
1609
+ void dispatchConnectorConnect(req, res, async () => {
1610
+ const m = await import("./connectors/airtable.js");
1611
+ return m.handleAirtableConnect;
1612
+ });
1613
+ return true;
1614
+ }
1615
+ if (parsedUrl.pathname === "/connections/airtable/test" &&
1616
+ req.method === "POST") {
1617
+ void (async () => {
1618
+ try {
1619
+ const { handleAirtableTest } = await import("./connectors/airtable.js");
1620
+ const result = await handleAirtableTest();
1621
+ res.writeHead(result.status, {
1622
+ "Content-Type": result.contentType ?? "application/json",
1623
+ });
1624
+ res.end(result.body);
1625
+ }
1626
+ catch (err) {
1627
+ respond500(res, err);
1628
+ }
1629
+ })();
1630
+ return true;
1631
+ }
1632
+ if (parsedUrl.pathname === "/connections/airtable" &&
1633
+ req.method === "DELETE") {
1634
+ void (async () => {
1635
+ try {
1636
+ const { handleAirtableDisconnect } = await import("./connectors/airtable.js");
1637
+ const result = handleAirtableDisconnect();
1638
+ res.writeHead(result.status, {
1639
+ "Content-Type": result.contentType ?? "application/json",
1640
+ });
1641
+ res.end(result.body);
1642
+ }
1643
+ catch (err) {
1644
+ respond500(res, err);
1645
+ }
1646
+ })();
1647
+ return true;
1648
+ }
1649
+ // ── Webflow routes ──────────────────────────────────────────────
1650
+ if (parsedUrl.pathname === "/connections/webflow/connect" &&
1651
+ req.method === "POST") {
1652
+ void dispatchConnectorConnect(req, res, async () => {
1653
+ const m = await import("./connectors/webflow.js");
1654
+ return m.handleWebflowConnect;
1655
+ });
1656
+ return true;
1657
+ }
1658
+ if (parsedUrl.pathname === "/connections/webflow/test" &&
1659
+ req.method === "POST") {
1660
+ void (async () => {
1661
+ try {
1662
+ const { handleWebflowTest } = await import("./connectors/webflow.js");
1663
+ const result = await handleWebflowTest();
1664
+ res.writeHead(result.status, {
1665
+ "Content-Type": result.contentType ?? "application/json",
1666
+ });
1667
+ res.end(result.body);
1668
+ }
1669
+ catch (err) {
1670
+ respond500(res, err);
1671
+ }
1672
+ })();
1673
+ return true;
1674
+ }
1675
+ if (parsedUrl.pathname === "/connections/webflow" &&
1676
+ req.method === "DELETE") {
1677
+ void (async () => {
1678
+ try {
1679
+ const { handleWebflowDisconnect } = await import("./connectors/webflow.js");
1680
+ const result = handleWebflowDisconnect();
1681
+ res.writeHead(result.status, {
1682
+ "Content-Type": result.contentType ?? "application/json",
1683
+ });
1684
+ res.end(result.body);
1685
+ }
1686
+ catch (err) {
1687
+ respond500(res, err);
1688
+ }
1689
+ })();
1690
+ return true;
1691
+ }
1692
+ // ── Google Calendar routes ──────────────────────────────────────
1693
+ if (parsedUrl.pathname === "/connections/google-calendar/auth" &&
1694
+ req.method === "GET") {
1695
+ void (async () => {
1696
+ try {
1697
+ const { handleCalendarAuthRedirect } = await import("./connectors/googleCalendar.js");
1698
+ const result = handleCalendarAuthRedirect();
1699
+ if (result.redirect) {
1700
+ res.writeHead(302, { Location: result.redirect });
1701
+ res.end();
1702
+ }
1703
+ else {
1704
+ res.writeHead(result.status, {
1705
+ "Content-Type": result.contentType ?? "application/json",
1706
+ });
1707
+ res.end(result.body);
1708
+ }
1709
+ }
1710
+ catch (err) {
1711
+ respond500(res, err);
1712
+ }
1713
+ })();
1714
+ return true;
1715
+ }
1716
+ if (parsedUrl.pathname === "/connections/google-calendar/callback" &&
1717
+ req.method === "GET") {
1718
+ void (async () => {
1719
+ try {
1720
+ const { handleCalendarCallback } = await import("./connectors/googleCalendar.js");
1721
+ const code = parsedUrl.searchParams.get("code");
1722
+ const state = parsedUrl.searchParams.get("state");
1723
+ const error = parsedUrl.searchParams.get("error");
1724
+ const result = await handleCalendarCallback(code, state, error);
1725
+ res.writeHead(result.status, {
1726
+ "Content-Type": result.contentType ?? "application/json",
1727
+ });
1728
+ res.end(result.body);
1729
+ }
1730
+ catch (err) {
1731
+ respond500(res, err);
1732
+ }
1733
+ })();
1734
+ return true;
1735
+ }
1736
+ if (parsedUrl.pathname === "/connections/google-calendar/test" &&
1737
+ req.method === "POST") {
1738
+ void (async () => {
1739
+ try {
1740
+ const { handleCalendarTest } = await import("./connectors/googleCalendar.js");
1741
+ const result = await handleCalendarTest();
1742
+ res.writeHead(result.status, {
1743
+ "Content-Type": result.contentType ?? "application/json",
1744
+ });
1745
+ res.end(result.body);
1746
+ }
1747
+ catch (err) {
1748
+ respond500(res, err);
1749
+ }
1750
+ })();
1751
+ return true;
1752
+ }
1753
+ if (parsedUrl.pathname === "/connections/google-calendar" &&
1754
+ req.method === "DELETE") {
1755
+ void (async () => {
1756
+ try {
1757
+ const { handleCalendarDisconnect } = await import("./connectors/googleCalendar.js");
1758
+ const result = await handleCalendarDisconnect();
1759
+ res.writeHead(result.status, {
1760
+ "Content-Type": result.contentType ?? "application/json",
1761
+ });
1762
+ res.end(result.body);
1763
+ }
1764
+ catch (err) {
1765
+ respond500(res, err);
1766
+ }
1767
+ })();
1768
+ return true;
1769
+ }
1770
+ // ── Google Drive routes ─────────────────────────────────────────
1771
+ if (parsedUrl.pathname === "/connections/google-drive/auth" &&
1772
+ req.method === "GET") {
1773
+ void (async () => {
1774
+ try {
1775
+ const { handleDriveAuthRedirect } = await import("./connectors/googleDrive.js");
1776
+ const result = handleDriveAuthRedirect();
1777
+ if (result.redirect) {
1778
+ res.writeHead(302, { Location: result.redirect });
1779
+ res.end();
1780
+ }
1781
+ else {
1782
+ res.writeHead(result.status, {
1783
+ "Content-Type": result.contentType ?? "application/json",
1784
+ });
1785
+ res.end(result.body);
1786
+ }
1787
+ }
1788
+ catch (err) {
1789
+ respond500(res, err);
1790
+ }
1791
+ })();
1792
+ return true;
1793
+ }
1794
+ if (parsedUrl.pathname === "/connections/google-drive/callback" &&
1795
+ req.method === "GET") {
1796
+ void (async () => {
1797
+ try {
1798
+ const { handleDriveCallback } = await import("./connectors/googleDrive.js");
1799
+ const code = parsedUrl.searchParams.get("code");
1800
+ const state = parsedUrl.searchParams.get("state");
1801
+ const error = parsedUrl.searchParams.get("error");
1802
+ const result = await handleDriveCallback(code, state, error);
1803
+ res.writeHead(result.status, {
1804
+ "Content-Type": result.contentType ?? "application/json",
1805
+ });
1806
+ res.end(result.body);
1807
+ }
1808
+ catch (err) {
1809
+ respond500(res, err);
1810
+ }
1811
+ })();
1812
+ return true;
1813
+ }
1814
+ if (parsedUrl.pathname === "/connections/google-drive/test" &&
1815
+ req.method === "POST") {
1816
+ void (async () => {
1817
+ try {
1818
+ const { handleDriveTest } = await import("./connectors/googleDrive.js");
1819
+ const result = await handleDriveTest();
1820
+ res.writeHead(result.status, {
1821
+ "Content-Type": result.contentType ?? "application/json",
1822
+ });
1823
+ res.end(result.body);
1824
+ }
1825
+ catch (err) {
1826
+ respond500(res, err);
1827
+ }
1828
+ })();
1829
+ return true;
1830
+ }
1831
+ if (parsedUrl.pathname === "/connections/google-drive" &&
1832
+ req.method === "DELETE") {
1833
+ void (async () => {
1834
+ try {
1835
+ const { handleDriveDisconnect } = await import("./connectors/googleDrive.js");
1836
+ const result = await handleDriveDisconnect();
1837
+ res.writeHead(result.status, {
1838
+ "Content-Type": result.contentType ?? "application/json",
1839
+ });
1840
+ res.end(result.body);
1841
+ }
1842
+ catch (err) {
1843
+ respond500(res, err);
1844
+ }
1845
+ })();
1846
+ return true;
1847
+ }
1848
+ // ── Google Docs routes ──────────────────────────────────────────
1849
+ if (parsedUrl.pathname === "/connections/google-docs/auth" &&
1850
+ req.method === "GET") {
1851
+ void (async () => {
1852
+ try {
1853
+ const { handleDocsAuthRedirect } = await import("./connectors/googleDocs.js");
1854
+ const result = handleDocsAuthRedirect();
1855
+ if (result.redirect) {
1856
+ res.writeHead(302, { Location: result.redirect });
1857
+ res.end();
1858
+ }
1859
+ else {
1860
+ res.writeHead(result.status, {
1861
+ "Content-Type": result.contentType ?? "application/json",
1862
+ });
1863
+ res.end(result.body);
1864
+ }
1865
+ }
1866
+ catch (err) {
1867
+ respond500(res, err);
1868
+ }
1869
+ })();
1870
+ return true;
1871
+ }
1872
+ if (parsedUrl.pathname === "/connections/google-docs/test" &&
1873
+ req.method === "POST") {
1874
+ void (async () => {
1875
+ try {
1876
+ const { handleDocsTest } = await import("./connectors/googleDocs.js");
1877
+ const result = await handleDocsTest();
1878
+ res.writeHead(result.status, {
1879
+ "Content-Type": result.contentType ?? "application/json",
1880
+ });
1881
+ res.end(result.body);
1882
+ }
1883
+ catch (err) {
1884
+ respond500(res, err);
1885
+ }
1886
+ })();
1887
+ return true;
1888
+ }
1889
+ if (parsedUrl.pathname === "/connections/google-docs" &&
1890
+ req.method === "DELETE") {
1891
+ void (async () => {
1892
+ try {
1893
+ const { handleDocsDisconnect } = await import("./connectors/googleDocs.js");
1894
+ const result = await handleDocsDisconnect();
1895
+ res.writeHead(result.status, {
1896
+ "Content-Type": result.contentType ?? "application/json",
1897
+ });
1898
+ res.end(result.body);
1899
+ }
1900
+ catch (err) {
1901
+ respond500(res, err);
1902
+ }
1903
+ })();
1904
+ return true;
1905
+ }
1906
+ // ── Monday routes ───────────────────────────────────────────────
1907
+ if (parsedUrl.pathname === "/connections/monday/auth" &&
1908
+ req.method === "GET") {
1909
+ void (async () => {
1910
+ try {
1911
+ const { handleMondayAuthRedirect } = await import("./connectors/monday.js");
1912
+ const result = handleMondayAuthRedirect();
1913
+ if (result.redirect) {
1914
+ res.writeHead(302, { Location: result.redirect });
1915
+ res.end();
1916
+ }
1917
+ else {
1918
+ res.writeHead(result.status, {
1919
+ "Content-Type": result.contentType ?? "application/json",
1920
+ });
1921
+ res.end(result.body);
1922
+ }
1923
+ }
1924
+ catch (err) {
1925
+ respond500(res, err);
1926
+ }
1927
+ })();
1928
+ return true;
1929
+ }
1930
+ if (parsedUrl.pathname === "/connections/monday/test" &&
1931
+ req.method === "POST") {
1932
+ void (async () => {
1933
+ try {
1934
+ const { handleMondayTest } = await import("./connectors/monday.js");
1935
+ const result = await handleMondayTest();
1936
+ res.writeHead(result.status, {
1937
+ "Content-Type": result.contentType ?? "application/json",
1938
+ });
1939
+ res.end(result.body);
1940
+ }
1941
+ catch (err) {
1942
+ respond500(res, err);
1943
+ }
1944
+ })();
1945
+ return true;
1946
+ }
1947
+ if (parsedUrl.pathname === "/connections/monday" && req.method === "DELETE") {
1948
+ void (async () => {
1949
+ try {
1950
+ const { handleMondayDisconnect } = await import("./connectors/monday.js");
1951
+ const result = await handleMondayDisconnect();
1952
+ res.writeHead(result.status, {
1953
+ "Content-Type": result.contentType ?? "application/json",
1954
+ });
1955
+ res.end(result.body);
1956
+ }
1957
+ catch (err) {
1958
+ respond500(res, err);
1959
+ }
1960
+ })();
1961
+ return true;
1962
+ }
1963
+ // ── Salesforce routes ───────────────────────────────────────────
1964
+ if (parsedUrl.pathname === "/connections/salesforce/auth" &&
1965
+ req.method === "GET") {
1966
+ void (async () => {
1967
+ try {
1968
+ const { handleSalesforceAuthRedirect } = await import("./connectors/salesforce.js");
1969
+ const result = handleSalesforceAuthRedirect();
1970
+ if (result.redirect) {
1971
+ res.writeHead(302, { Location: result.redirect });
1972
+ res.end();
1973
+ }
1974
+ else {
1975
+ res.writeHead(result.status, {
1976
+ "Content-Type": result.contentType ?? "application/json",
1977
+ });
1978
+ res.end(result.body);
1979
+ }
1980
+ }
1981
+ catch (err) {
1982
+ respond500(res, err);
1983
+ }
1984
+ })();
1985
+ return true;
1986
+ }
1987
+ if (parsedUrl.pathname === "/connections/salesforce/test" &&
1988
+ req.method === "POST") {
1989
+ void (async () => {
1990
+ try {
1991
+ const { handleSalesforceTest } = await import("./connectors/salesforce.js");
1992
+ const result = await handleSalesforceTest();
1993
+ res.writeHead(result.status, {
1994
+ "Content-Type": result.contentType ?? "application/json",
1995
+ });
1996
+ res.end(result.body);
1997
+ }
1998
+ catch (err) {
1999
+ respond500(res, err);
2000
+ }
2001
+ })();
2002
+ return true;
2003
+ }
2004
+ if (parsedUrl.pathname === "/connections/salesforce" &&
2005
+ req.method === "DELETE") {
2006
+ void (async () => {
2007
+ try {
2008
+ const { handleSalesforceDisconnect } = await import("./connectors/salesforce.js");
2009
+ const result = await handleSalesforceDisconnect();
2010
+ res.writeHead(result.status, {
2011
+ "Content-Type": result.contentType ?? "application/json",
2012
+ });
2013
+ res.end(result.body);
2014
+ }
2015
+ catch (err) {
2016
+ respond500(res, err);
2017
+ }
2018
+ })();
2019
+ return true;
2020
+ }
2021
+ // ── Shopify routes ──────────────────────────────────────────────
2022
+ if (parsedUrl.pathname === "/connections/shopify/connect" &&
2023
+ req.method === "POST") {
2024
+ void dispatchConnectorConnect(req, res, async () => {
2025
+ const m = await import("./connectors/shopify.js");
2026
+ return m.handleShopifyConnect;
2027
+ });
2028
+ return true;
2029
+ }
2030
+ if (parsedUrl.pathname === "/connections/shopify/test" &&
2031
+ req.method === "POST") {
2032
+ void (async () => {
2033
+ try {
2034
+ const { handleShopifyTest } = await import("./connectors/shopify.js");
2035
+ const result = await handleShopifyTest();
2036
+ res.writeHead(result.status, {
2037
+ "Content-Type": result.contentType ?? "application/json",
2038
+ });
2039
+ res.end(result.body);
2040
+ }
2041
+ catch (err) {
2042
+ respond500(res, err);
2043
+ }
2044
+ })();
2045
+ return true;
2046
+ }
2047
+ if (parsedUrl.pathname === "/connections/shopify" &&
2048
+ req.method === "DELETE") {
2049
+ void (async () => {
2050
+ try {
2051
+ const { handleShopifyDisconnect } = await import("./connectors/shopify.js");
2052
+ const result = await handleShopifyDisconnect();
2053
+ res.writeHead(result.status, {
2054
+ "Content-Type": result.contentType ?? "application/json",
2055
+ });
2056
+ res.end(result.body);
2057
+ }
2058
+ catch (err) {
2059
+ respond500(res, err);
2060
+ }
2061
+ })();
2062
+ return true;
2063
+ }
2064
+ // ── Snowflake routes ────────────────────────────────────────────
2065
+ if (parsedUrl.pathname === "/connections/snowflake/connect" &&
2066
+ req.method === "POST") {
2067
+ void dispatchConnectorConnect(req, res, async () => {
2068
+ const m = await import("./connectors/snowflake.js");
2069
+ return m.handleSnowflakeConnect;
2070
+ });
2071
+ return true;
2072
+ }
2073
+ if (parsedUrl.pathname === "/connections/snowflake/test" &&
2074
+ req.method === "POST") {
2075
+ void (async () => {
2076
+ try {
2077
+ const { handleSnowflakeTest } = await import("./connectors/snowflake.js");
2078
+ const result = await handleSnowflakeTest();
2079
+ res.writeHead(result.status, {
2080
+ "Content-Type": result.contentType ?? "application/json",
2081
+ });
2082
+ res.end(result.body);
2083
+ }
2084
+ catch (err) {
2085
+ respond500(res, err);
2086
+ }
2087
+ })();
2088
+ return true;
2089
+ }
2090
+ if (parsedUrl.pathname === "/connections/snowflake" &&
2091
+ req.method === "DELETE") {
2092
+ void (async () => {
2093
+ try {
2094
+ const { handleSnowflakeDisconnect } = await import("./connectors/snowflake.js");
2095
+ const result = await handleSnowflakeDisconnect();
2096
+ res.writeHead(result.status, {
2097
+ "Content-Type": result.contentType ?? "application/json",
2098
+ });
2099
+ res.end(result.body);
2100
+ }
2101
+ catch (err) {
2102
+ respond500(res, err);
2103
+ }
2104
+ })();
2105
+ return true;
2106
+ }
2107
+ // ── Resend routes ───────────────────────────────────────────────
2108
+ if (parsedUrl.pathname === "/connections/resend/connect" &&
2109
+ req.method === "POST") {
2110
+ void dispatchConnectorConnect(req, res, async () => {
2111
+ const m = await import("./connectors/resend.js");
2112
+ return m.handleResendConnect;
2113
+ });
2114
+ return true;
2115
+ }
2116
+ if (parsedUrl.pathname === "/connections/resend/test" &&
2117
+ req.method === "POST") {
2118
+ void (async () => {
2119
+ try {
2120
+ const { handleResendTest } = await import("./connectors/resend.js");
2121
+ const result = await handleResendTest();
2122
+ res.writeHead(result.status, {
2123
+ "Content-Type": result.contentType ?? "application/json",
2124
+ });
2125
+ res.end(result.body);
2126
+ }
2127
+ catch (err) {
2128
+ respond500(res, err);
2129
+ }
2130
+ })();
2131
+ return true;
2132
+ }
2133
+ if (parsedUrl.pathname === "/connections/resend" && req.method === "DELETE") {
2134
+ void (async () => {
2135
+ try {
2136
+ const { handleResendDisconnect } = await import("./connectors/resend.js");
2137
+ const result = handleResendDisconnect();
2138
+ res.writeHead(result.status, {
2139
+ "Content-Type": result.contentType ?? "application/json",
2140
+ });
2141
+ res.end(result.body);
2142
+ }
2143
+ catch (err) {
2144
+ respond500(res, err);
2145
+ }
2146
+ })();
2147
+ return true;
2148
+ }
2149
+ // ── Obsidian routes ─────────────────────────────────────────────
2150
+ if (parsedUrl.pathname === "/connections/obsidian/connect" &&
2151
+ req.method === "POST") {
2152
+ void dispatchConnectorConnect(req, res, async () => {
2153
+ const m = await import("./connectors/obsidian.js");
2154
+ return m.handleObsidianConnect;
2155
+ });
2156
+ return true;
2157
+ }
2158
+ if (parsedUrl.pathname === "/connections/obsidian/test" &&
2159
+ req.method === "POST") {
2160
+ void (async () => {
2161
+ try {
2162
+ const { handleObsidianTest } = await import("./connectors/obsidian.js");
2163
+ const result = await handleObsidianTest();
2164
+ res.writeHead(result.status, {
2165
+ "Content-Type": result.contentType ?? "application/json",
2166
+ });
2167
+ res.end(result.body);
2168
+ }
2169
+ catch (err) {
2170
+ respond500(res, err);
2171
+ }
2172
+ })();
2173
+ return true;
2174
+ }
2175
+ if (parsedUrl.pathname === "/connections/obsidian" &&
2176
+ req.method === "DELETE") {
2177
+ void (async () => {
2178
+ try {
2179
+ const { handleObsidianDisconnect } = await import("./connectors/obsidian.js");
2180
+ const result = handleObsidianDisconnect();
2181
+ res.writeHead(result.status, {
2182
+ "Content-Type": result.contentType ?? "application/json",
2183
+ });
2184
+ res.end(result.body);
2185
+ }
2186
+ catch (err) {
2187
+ respond500(res, err);
2188
+ }
2189
+ })();
2190
+ return true;
2191
+ }
2192
+ // ── Todoist routes ──────────────────────────────────────────────
2193
+ if (parsedUrl.pathname === "/connections/todoist/connect" &&
2194
+ req.method === "POST") {
2195
+ void dispatchConnectorConnect(req, res, async () => {
2196
+ const m = await import("./connectors/todoist.js");
2197
+ return m.handleTodoistConnect;
2198
+ });
2199
+ return true;
2200
+ }
2201
+ if (parsedUrl.pathname === "/connections/todoist/test" &&
2202
+ req.method === "POST") {
2203
+ void (async () => {
2204
+ try {
2205
+ const { handleTodoistTest } = await import("./connectors/todoist.js");
2206
+ const result = await handleTodoistTest();
2207
+ res.writeHead(result.status, {
2208
+ "Content-Type": result.contentType ?? "application/json",
2209
+ });
2210
+ res.end(result.body);
2211
+ }
2212
+ catch (err) {
2213
+ respond500(res, err);
2214
+ }
2215
+ })();
2216
+ return true;
2217
+ }
2218
+ if (parsedUrl.pathname === "/connections/todoist" &&
2219
+ req.method === "DELETE") {
2220
+ void (async () => {
2221
+ try {
2222
+ const { handleTodoistDisconnect } = await import("./connectors/todoist.js");
2223
+ const result = handleTodoistDisconnect();
2224
+ res.writeHead(result.status, {
2225
+ "Content-Type": result.contentType ?? "application/json",
2226
+ });
2227
+ res.end(result.body);
2228
+ }
2229
+ catch (err) {
2230
+ respond500(res, err);
2231
+ }
2232
+ })();
2233
+ return true;
2234
+ }
2235
+ // ── Vercel routes ───────────────────────────────────────────────
2236
+ if (parsedUrl.pathname === "/connections/vercel/connect" &&
2237
+ req.method === "POST") {
2238
+ void dispatchConnectorConnect(req, res, async () => {
2239
+ const m = await import("./connectors/vercel.js");
2240
+ return m.handleVercelConnect;
2241
+ });
2242
+ return true;
2243
+ }
2244
+ if (parsedUrl.pathname === "/connections/vercel/test" &&
2245
+ req.method === "POST") {
2246
+ void (async () => {
2247
+ try {
2248
+ const { handleVercelTest } = await import("./connectors/vercel.js");
2249
+ const result = await handleVercelTest();
2250
+ res.writeHead(result.status, {
2251
+ "Content-Type": result.contentType ?? "application/json",
2252
+ });
2253
+ res.end(result.body);
2254
+ }
2255
+ catch (err) {
2256
+ respond500(res, err);
2257
+ }
2258
+ })();
2259
+ return true;
2260
+ }
2261
+ if (parsedUrl.pathname === "/connections/vercel" && req.method === "DELETE") {
2262
+ void (async () => {
2263
+ try {
2264
+ const { handleVercelDisconnect } = await import("./connectors/vercel.js");
2265
+ const result = handleVercelDisconnect();
2266
+ res.writeHead(result.status, {
2267
+ "Content-Type": result.contentType ?? "application/json",
2268
+ });
2269
+ res.end(result.body);
2270
+ }
2271
+ catch (err) {
2272
+ respond500(res, err);
2273
+ }
2274
+ })();
2275
+ return true;
2276
+ }
2277
+ // ── Paystack routes ─────────────────────────────────────────────
2278
+ if (parsedUrl.pathname === "/connections/paystack/connect" &&
2279
+ req.method === "POST") {
2280
+ void dispatchConnectorConnect(req, res, async () => {
2281
+ const m = await import("./connectors/paystack.js");
2282
+ return m.handlePaystackConnect;
2283
+ });
2284
+ return true;
2285
+ }
2286
+ if (parsedUrl.pathname === "/connections/paystack/test" &&
2287
+ req.method === "POST") {
2288
+ void (async () => {
2289
+ try {
2290
+ const { handlePaystackTest } = await import("./connectors/paystack.js");
2291
+ const result = await handlePaystackTest();
2292
+ res.writeHead(result.status, {
2293
+ "Content-Type": result.contentType ?? "application/json",
2294
+ });
2295
+ res.end(result.body);
2296
+ }
2297
+ catch (err) {
2298
+ respond500(res, err);
2299
+ }
2300
+ })();
2301
+ return true;
2302
+ }
2303
+ if (parsedUrl.pathname === "/connections/paystack" &&
2304
+ req.method === "DELETE") {
2305
+ void (async () => {
2306
+ try {
2307
+ const { handlePaystackDisconnect } = await import("./connectors/paystack.js");
2308
+ const result = handlePaystackDisconnect();
2309
+ res.writeHead(result.status, {
2310
+ "Content-Type": result.contentType ?? "application/json",
2311
+ });
2312
+ res.end(result.body);
2313
+ }
2314
+ catch (err) {
2315
+ respond500(res, err);
2316
+ }
2317
+ })();
2318
+ return true;
2319
+ }
2320
+ // ── Pipedrive routes ────────────────────────────────────────────
2321
+ if (parsedUrl.pathname === "/connections/pipedrive/connect" &&
2322
+ req.method === "POST") {
2323
+ void dispatchConnectorConnect(req, res, async () => {
2324
+ const m = await import("./connectors/pipedrive.js");
2325
+ return m.handlePipedriveConnect;
2326
+ });
2327
+ return true;
2328
+ }
2329
+ if (parsedUrl.pathname === "/connections/pipedrive/test" &&
2330
+ req.method === "POST") {
2331
+ void (async () => {
2332
+ try {
2333
+ const { handlePipedriveTest } = await import("./connectors/pipedrive.js");
2334
+ const result = await handlePipedriveTest();
2335
+ res.writeHead(result.status, {
2336
+ "Content-Type": result.contentType ?? "application/json",
2337
+ });
2338
+ res.end(result.body);
2339
+ }
2340
+ catch (err) {
2341
+ respond500(res, err);
2342
+ }
2343
+ })();
2344
+ return true;
2345
+ }
2346
+ if (parsedUrl.pathname === "/connections/pipedrive" &&
2347
+ req.method === "DELETE") {
2348
+ void (async () => {
2349
+ try {
2350
+ const { handlePipedriveDisconnect } = await import("./connectors/pipedrive.js");
2351
+ const result = handlePipedriveDisconnect();
2352
+ res.writeHead(result.status, {
2353
+ "Content-Type": result.contentType ?? "application/json",
2354
+ });
2355
+ res.end(result.body);
2356
+ }
2357
+ catch (err) {
2358
+ respond500(res, err);
2359
+ }
2360
+ })();
2361
+ return true;
2362
+ }
2363
+ // ── Cal.diy routes ──────────────────────────────────────────────
2364
+ if (parsedUrl.pathname === "/connections/caldiy/connect" &&
2365
+ req.method === "POST") {
2366
+ void dispatchConnectorConnect(req, res, async () => {
2367
+ const m = await import("./connectors/caldiy.js");
2368
+ return m.handleCalDiyConnect;
2369
+ });
2370
+ return true;
2371
+ }
2372
+ if (parsedUrl.pathname === "/connections/caldiy/test" &&
2373
+ req.method === "POST") {
2374
+ void (async () => {
2375
+ try {
2376
+ const { handleCalDiyTest } = await import("./connectors/caldiy.js");
2377
+ const result = await handleCalDiyTest();
2378
+ res.writeHead(result.status, {
2379
+ "Content-Type": result.contentType ?? "application/json",
2380
+ });
2381
+ res.end(result.body);
2382
+ }
2383
+ catch (err) {
2384
+ respond500(res, err);
2385
+ }
2386
+ })();
2387
+ return true;
2388
+ }
2389
+ if (parsedUrl.pathname === "/connections/caldiy" && req.method === "DELETE") {
2390
+ void (async () => {
2391
+ try {
2392
+ const { handleCalDiyDisconnect } = await import("./connectors/caldiy.js");
2393
+ const result = handleCalDiyDisconnect();
2394
+ res.writeHead(result.status, {
2395
+ "Content-Type": result.contentType ?? "application/json",
2396
+ });
2397
+ res.end(result.body);
2398
+ }
2399
+ catch (err) {
2400
+ respond500(res, err);
2401
+ }
2402
+ })();
2403
+ return true;
2404
+ }
2405
+ // ── Grafana routes ──────────────────────────────────────────────
2406
+ if (parsedUrl.pathname === "/connections/grafana/connect" &&
2407
+ req.method === "POST") {
2408
+ void dispatchConnectorConnect(req, res, async () => {
2409
+ const m = await import("./connectors/grafana.js");
2410
+ return m.handleGrafanaConnect;
2411
+ });
2412
+ return true;
2413
+ }
2414
+ if (parsedUrl.pathname === "/connections/grafana/test" &&
2415
+ req.method === "POST") {
2416
+ void (async () => {
2417
+ try {
2418
+ const { handleGrafanaTest } = await import("./connectors/grafana.js");
2419
+ const result = await handleGrafanaTest();
2420
+ res.writeHead(result.status, {
2421
+ "Content-Type": result.contentType ?? "application/json",
2422
+ });
2423
+ res.end(result.body);
2424
+ }
2425
+ catch (err) {
2426
+ respond500(res, err);
2427
+ }
2428
+ })();
2429
+ return true;
2430
+ }
2431
+ if (parsedUrl.pathname === "/connections/grafana" &&
2432
+ req.method === "DELETE") {
2433
+ void (async () => {
2434
+ try {
2435
+ const { handleGrafanaDisconnect } = await import("./connectors/grafana.js");
2436
+ const result = handleGrafanaDisconnect();
2437
+ res.writeHead(result.status, {
2438
+ "Content-Type": result.contentType ?? "application/json",
2439
+ });
2440
+ res.end(result.body);
2441
+ }
2442
+ catch (err) {
2443
+ respond500(res, err);
2444
+ }
2445
+ })();
2446
+ return true;
2447
+ }
2448
+ // ── PostHog routes ──────────────────────────────────────────────
2449
+ if (parsedUrl.pathname === "/connections/posthog/connect" &&
2450
+ req.method === "POST") {
2451
+ void dispatchConnectorConnect(req, res, async () => {
2452
+ const m = await import("./connectors/posthog.js");
2453
+ return m.handlePostHogConnect;
2454
+ });
2455
+ return true;
2456
+ }
2457
+ if (parsedUrl.pathname === "/connections/posthog/test" &&
2458
+ req.method === "POST") {
2459
+ void (async () => {
2460
+ try {
2461
+ const { handlePostHogTest } = await import("./connectors/posthog.js");
2462
+ const result = await handlePostHogTest();
2463
+ res.writeHead(result.status, {
2464
+ "Content-Type": result.contentType ?? "application/json",
2465
+ });
2466
+ res.end(result.body);
2467
+ }
2468
+ catch (err) {
2469
+ respond500(res, err);
2470
+ }
2471
+ })();
2472
+ return true;
2473
+ }
2474
+ if (parsedUrl.pathname === "/connections/posthog" &&
2475
+ req.method === "DELETE") {
2476
+ void (async () => {
2477
+ try {
2478
+ const { handlePostHogDisconnect } = await import("./connectors/posthog.js");
2479
+ const result = handlePostHogDisconnect();
2480
+ res.writeHead(result.status, {
2481
+ "Content-Type": result.contentType ?? "application/json",
2482
+ });
2483
+ res.end(result.body);
2484
+ }
2485
+ catch (err) {
2486
+ respond500(res, err);
2487
+ }
2488
+ })();
2489
+ return true;
2490
+ }
2491
+ // ── Cloudflare routes ───────────────────────────────────────────
2492
+ if (parsedUrl.pathname === "/connections/cloudflare/connect" &&
2493
+ req.method === "POST") {
2494
+ void dispatchConnectorConnect(req, res, async () => {
2495
+ const m = await import("./connectors/cloudflare.js");
2496
+ return m.handleCloudflareConnect;
2497
+ });
2498
+ return true;
2499
+ }
2500
+ if (parsedUrl.pathname === "/connections/cloudflare/test" &&
2501
+ req.method === "POST") {
2502
+ void (async () => {
2503
+ try {
2504
+ const { handleCloudflareTest } = await import("./connectors/cloudflare.js");
2505
+ const result = await handleCloudflareTest();
2506
+ res.writeHead(result.status, {
2507
+ "Content-Type": result.contentType ?? "application/json",
2508
+ });
2509
+ res.end(result.body);
2510
+ }
2511
+ catch (err) {
2512
+ respond500(res, err);
2513
+ }
2514
+ })();
2515
+ return true;
2516
+ }
2517
+ if (parsedUrl.pathname === "/connections/cloudflare" &&
2518
+ req.method === "DELETE") {
2519
+ void (async () => {
2520
+ try {
2521
+ const { handleCloudflareDisconnect } = await import("./connectors/cloudflare.js");
2522
+ const result = handleCloudflareDisconnect();
2523
+ res.writeHead(result.status, {
2524
+ "Content-Type": result.contentType ?? "application/json",
2525
+ });
2526
+ res.end(result.body);
2527
+ }
2528
+ catch (err) {
2529
+ respond500(res, err);
2530
+ }
2531
+ })();
2532
+ return true;
2533
+ }
2534
+ // ── CircleCI routes ─────────────────────────────────────────────
2535
+ if (parsedUrl.pathname === "/connections/circleci/connect" &&
2536
+ req.method === "POST") {
2537
+ void dispatchConnectorConnect(req, res, async () => {
2538
+ const m = await import("./connectors/circleci.js");
2539
+ return m.handleCircleCIConnect;
2540
+ });
2541
+ return true;
2542
+ }
2543
+ if (parsedUrl.pathname === "/connections/circleci/test" &&
2544
+ req.method === "POST") {
2545
+ void (async () => {
2546
+ try {
2547
+ const { handleCircleCITest } = await import("./connectors/circleci.js");
2548
+ const result = await handleCircleCITest();
2549
+ res.writeHead(result.status, {
2550
+ "Content-Type": result.contentType ?? "application/json",
2551
+ });
2552
+ res.end(result.body);
2553
+ }
2554
+ catch (err) {
2555
+ respond500(res, err);
2556
+ }
2557
+ })();
2558
+ return true;
2559
+ }
2560
+ if (parsedUrl.pathname === "/connections/circleci" &&
2561
+ req.method === "DELETE") {
2562
+ void (async () => {
2563
+ try {
2564
+ const { handleCircleCIDisconnect } = await import("./connectors/circleci.js");
2565
+ const result = handleCircleCIDisconnect();
2566
+ res.writeHead(result.status, {
2567
+ "Content-Type": result.contentType ?? "application/json",
2568
+ });
2569
+ res.end(result.body);
2570
+ }
2571
+ catch (err) {
2572
+ respond500(res, err);
2573
+ }
2574
+ })();
2575
+ return true;
2576
+ }
2577
+ // ── WooCommerce routes ──────────────────────────────────────────
2578
+ if (parsedUrl.pathname === "/connections/woocommerce/connect" &&
2579
+ req.method === "POST") {
2580
+ void dispatchConnectorConnect(req, res, async () => {
2581
+ const m = await import("./connectors/woocommerce.js");
2582
+ return m.handleWooCommerceConnect;
2583
+ });
2584
+ return true;
2585
+ }
2586
+ if (parsedUrl.pathname === "/connections/woocommerce/test" &&
2587
+ req.method === "POST") {
2588
+ void (async () => {
2589
+ try {
2590
+ const { handleWooCommerceTest } = await import("./connectors/woocommerce.js");
2591
+ const result = await handleWooCommerceTest();
2592
+ res.writeHead(result.status, {
2593
+ "Content-Type": result.contentType ?? "application/json",
2594
+ });
2595
+ res.end(result.body);
2596
+ }
2597
+ catch (err) {
2598
+ respond500(res, err);
2599
+ }
2600
+ })();
2601
+ return true;
2602
+ }
2603
+ if (parsedUrl.pathname === "/connections/woocommerce" &&
2604
+ req.method === "DELETE") {
2605
+ void (async () => {
2606
+ try {
2607
+ const { handleWooCommerceDisconnect } = await import("./connectors/woocommerce.js");
2608
+ const result = handleWooCommerceDisconnect();
2609
+ res.writeHead(result.status, {
2610
+ "Content-Type": result.contentType ?? "application/json",
2611
+ });
2612
+ res.end(result.body);
2613
+ }
2614
+ catch (err) {
2615
+ respond500(res, err);
2616
+ }
2617
+ })();
2618
+ return true;
2619
+ }
2620
+ // ── Supabase routes ─────────────────────────────────────────────
2621
+ if (parsedUrl.pathname === "/connections/supabase/connect" &&
2622
+ req.method === "POST") {
2623
+ void dispatchConnectorConnect(req, res, async () => {
2624
+ const m = await import("./connectors/supabase.js");
2625
+ return m.handleSupabaseConnect;
2626
+ });
2627
+ return true;
2628
+ }
2629
+ if (parsedUrl.pathname === "/connections/supabase/test" &&
2630
+ req.method === "POST") {
2631
+ void (async () => {
2632
+ try {
2633
+ const { handleSupabaseTest } = await import("./connectors/supabase.js");
2634
+ const result = await handleSupabaseTest();
2635
+ res.writeHead(result.status, {
2636
+ "Content-Type": result.contentType ?? "application/json",
2637
+ });
2638
+ res.end(result.body);
2639
+ }
2640
+ catch (err) {
2641
+ respond500(res, err);
2642
+ }
2643
+ })();
2644
+ return true;
2645
+ }
2646
+ if (parsedUrl.pathname === "/connections/supabase" &&
2647
+ req.method === "DELETE") {
2648
+ void (async () => {
2649
+ try {
2650
+ const { handleSupabaseDisconnect } = await import("./connectors/supabase.js");
2651
+ const result = handleSupabaseDisconnect();
1287
2652
  res.writeHead(result.status, {
1288
2653
  "Content-Type": result.contentType ?? "application/json",
1289
2654
  });