patchwork-os 0.2.0-alpha.9 → 0.2.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 (618) hide show
  1. package/README.bridge.md +6 -0
  2. package/README.md +318 -35
  3. package/deploy/bootstrap-new-vps.sh +12 -12
  4. package/deploy/bootstrap-vps.sh +187 -0
  5. package/deploy/deploy-dashboard.sh +174 -0
  6. package/deploy/deploy-landing.sh +136 -0
  7. package/dist/activationMetrics.d.ts +67 -0
  8. package/dist/activationMetrics.js +255 -0
  9. package/dist/activationMetrics.js.map +1 -0
  10. package/dist/activityLog.d.ts +49 -0
  11. package/dist/activityLog.js +78 -0
  12. package/dist/activityLog.js.map +1 -1
  13. package/dist/analyticsAggregator.d.ts +5 -1
  14. package/dist/analyticsAggregator.js +15 -4
  15. package/dist/analyticsAggregator.js.map +1 -1
  16. package/dist/analyticsPrefs.d.ts +11 -0
  17. package/dist/analyticsPrefs.js +33 -0
  18. package/dist/analyticsPrefs.js.map +1 -1
  19. package/dist/approvalHttp.d.ts +49 -2
  20. package/dist/approvalHttp.js +217 -21
  21. package/dist/approvalHttp.js.map +1 -1
  22. package/dist/approvalInsights.d.ts +49 -0
  23. package/dist/approvalInsights.js +97 -0
  24. package/dist/approvalInsights.js.map +1 -0
  25. package/dist/approvalQueue.d.ts +27 -1
  26. package/dist/approvalQueue.js +123 -3
  27. package/dist/approvalQueue.js.map +1 -1
  28. package/dist/approvalSignals.d.ts +124 -0
  29. package/dist/approvalSignals.js +512 -0
  30. package/dist/approvalSignals.js.map +1 -0
  31. package/dist/automation.d.ts +57 -0
  32. package/dist/automation.js +156 -59
  33. package/dist/automation.js.map +1 -1
  34. package/dist/automationSuggestions.d.ts +79 -0
  35. package/dist/automationSuggestions.js +150 -0
  36. package/dist/automationSuggestions.js.map +1 -0
  37. package/dist/bridge.d.ts +3 -0
  38. package/dist/bridge.js +194 -153
  39. package/dist/bridge.js.map +1 -1
  40. package/dist/bridgeToken.js +57 -19
  41. package/dist/bridgeToken.js.map +1 -1
  42. package/dist/ccPermissions.d.ts +15 -0
  43. package/dist/ccPermissions.js +21 -4
  44. package/dist/ccPermissions.js.map +1 -1
  45. package/dist/claudeDriver.d.ts +0 -16
  46. package/dist/claudeDriver.js +93 -36
  47. package/dist/claudeDriver.js.map +1 -1
  48. package/dist/claudeMdPatch.d.ts +9 -3
  49. package/dist/claudeMdPatch.js +79 -13
  50. package/dist/claudeMdPatch.js.map +1 -1
  51. package/dist/claudeOrchestrator.d.ts +13 -1
  52. package/dist/claudeOrchestrator.js +16 -8
  53. package/dist/claudeOrchestrator.js.map +1 -1
  54. package/dist/commands/dashboard.js +1 -1
  55. package/dist/commands/dashboard.js.map +1 -1
  56. package/dist/commands/launchd.d.ts +2 -0
  57. package/dist/commands/launchd.js +94 -0
  58. package/dist/commands/launchd.js.map +1 -0
  59. package/dist/commands/marketplace.d.ts +15 -10
  60. package/dist/commands/marketplace.js +27 -115
  61. package/dist/commands/marketplace.js.map +1 -1
  62. package/dist/commands/patchworkInit.d.ts +8 -0
  63. package/dist/commands/patchworkInit.js +77 -11
  64. package/dist/commands/patchworkInit.js.map +1 -1
  65. package/dist/commands/recipe.d.ts +289 -0
  66. package/dist/commands/recipe.js +1359 -0
  67. package/dist/commands/recipe.js.map +1 -0
  68. package/dist/commands/recipeInstall.d.ts +150 -0
  69. package/dist/commands/recipeInstall.js +647 -0
  70. package/dist/commands/recipeInstall.js.map +1 -0
  71. package/dist/commands/tracesExport.d.ts +83 -0
  72. package/dist/commands/tracesExport.js +269 -0
  73. package/dist/commands/tracesExport.js.map +1 -0
  74. package/dist/commands/tracesImport.d.ts +56 -0
  75. package/dist/commands/tracesImport.js +161 -0
  76. package/dist/commands/tracesImport.js.map +1 -0
  77. package/dist/commitIssueLinkLog.d.ts +8 -0
  78. package/dist/commitIssueLinkLog.js +53 -1
  79. package/dist/commitIssueLinkLog.js.map +1 -1
  80. package/dist/config.d.ts +23 -2
  81. package/dist/config.js +119 -9
  82. package/dist/config.js.map +1 -1
  83. package/dist/connectorRoutes.d.ts +43 -0
  84. package/dist/connectorRoutes.js +1300 -0
  85. package/dist/connectorRoutes.js.map +1 -0
  86. package/dist/connectors/asana.d.ts +198 -0
  87. package/dist/connectors/asana.js +679 -0
  88. package/dist/connectors/asana.js.map +1 -0
  89. package/dist/connectors/baseConnector.d.ts +153 -0
  90. package/dist/connectors/baseConnector.js +336 -0
  91. package/dist/connectors/baseConnector.js.map +1 -0
  92. package/dist/connectors/confluence.d.ts +111 -0
  93. package/dist/connectors/confluence.js +406 -0
  94. package/dist/connectors/confluence.js.map +1 -0
  95. package/dist/connectors/datadog.d.ts +116 -0
  96. package/dist/connectors/datadog.js +385 -0
  97. package/dist/connectors/datadog.js.map +1 -0
  98. package/dist/connectors/discord.d.ts +150 -0
  99. package/dist/connectors/discord.js +543 -0
  100. package/dist/connectors/discord.js.map +1 -0
  101. package/dist/connectors/fixtureLibrary.d.ts +21 -0
  102. package/dist/connectors/fixtureLibrary.js +70 -0
  103. package/dist/connectors/fixtureLibrary.js.map +1 -0
  104. package/dist/connectors/fixtureRecorder.d.ts +1 -0
  105. package/dist/connectors/fixtureRecorder.js +35 -0
  106. package/dist/connectors/fixtureRecorder.js.map +1 -0
  107. package/dist/connectors/github.js +17 -18
  108. package/dist/connectors/github.js.map +1 -1
  109. package/dist/connectors/gitlab.d.ts +180 -0
  110. package/dist/connectors/gitlab.js +582 -0
  111. package/dist/connectors/gitlab.js.map +1 -0
  112. package/dist/connectors/gmail.d.ts +4 -1
  113. package/dist/connectors/gmail.js +149 -27
  114. package/dist/connectors/gmail.js.map +1 -1
  115. package/dist/connectors/googleCalendar.d.ts +4 -1
  116. package/dist/connectors/googleCalendar.js +88 -25
  117. package/dist/connectors/googleCalendar.js.map +1 -1
  118. package/dist/connectors/googleDrive.d.ts +34 -0
  119. package/dist/connectors/googleDrive.js +321 -0
  120. package/dist/connectors/googleDrive.js.map +1 -0
  121. package/dist/connectors/htmlEscape.d.ts +5 -0
  122. package/dist/connectors/htmlEscape.js +13 -0
  123. package/dist/connectors/htmlEscape.js.map +1 -0
  124. package/dist/connectors/hubspot.d.ts +112 -0
  125. package/dist/connectors/hubspot.js +408 -0
  126. package/dist/connectors/hubspot.js.map +1 -0
  127. package/dist/connectors/intercom.d.ts +102 -0
  128. package/dist/connectors/intercom.js +402 -0
  129. package/dist/connectors/intercom.js.map +1 -0
  130. package/dist/connectors/jira.d.ts +98 -0
  131. package/dist/connectors/jira.js +396 -0
  132. package/dist/connectors/jira.js.map +1 -0
  133. package/dist/connectors/linear.js +30 -19
  134. package/dist/connectors/linear.js.map +1 -1
  135. package/dist/connectors/mcpOAuth.d.ts +3 -0
  136. package/dist/connectors/mcpOAuth.js +64 -10
  137. package/dist/connectors/mcpOAuth.js.map +1 -1
  138. package/dist/connectors/mockConnector.d.ts +28 -0
  139. package/dist/connectors/mockConnector.js +81 -0
  140. package/dist/connectors/mockConnector.js.map +1 -0
  141. package/dist/connectors/notion.d.ts +143 -0
  142. package/dist/connectors/notion.js +424 -0
  143. package/dist/connectors/notion.js.map +1 -0
  144. package/dist/connectors/oauthStateStore.d.ts +31 -0
  145. package/dist/connectors/oauthStateStore.js +52 -0
  146. package/dist/connectors/oauthStateStore.js.map +1 -0
  147. package/dist/connectors/pagerduty.d.ts +160 -0
  148. package/dist/connectors/pagerduty.js +464 -0
  149. package/dist/connectors/pagerduty.js.map +1 -0
  150. package/dist/connectors/sentry.js +5 -13
  151. package/dist/connectors/sentry.js.map +1 -1
  152. package/dist/connectors/slack.d.ts +16 -1
  153. package/dist/connectors/slack.js +155 -32
  154. package/dist/connectors/slack.js.map +1 -1
  155. package/dist/connectors/stripe.d.ts +116 -0
  156. package/dist/connectors/stripe.js +379 -0
  157. package/dist/connectors/stripe.js.map +1 -0
  158. package/dist/connectors/tokenStorage.d.ts +35 -0
  159. package/dist/connectors/tokenStorage.js +484 -0
  160. package/dist/connectors/tokenStorage.js.map +1 -0
  161. package/dist/connectors/zendesk.d.ts +104 -0
  162. package/dist/connectors/zendesk.js +442 -0
  163. package/dist/connectors/zendesk.js.map +1 -0
  164. package/dist/cors.d.ts +10 -0
  165. package/dist/cors.js +29 -0
  166. package/dist/cors.js.map +1 -0
  167. package/dist/decisionReplay.d.ts +72 -0
  168. package/dist/decisionReplay.js +92 -0
  169. package/dist/decisionReplay.js.map +1 -0
  170. package/dist/decisionTraceLog.d.ts +6 -0
  171. package/dist/decisionTraceLog.js +54 -2
  172. package/dist/decisionTraceLog.js.map +1 -1
  173. package/dist/drivers/claude/subprocess.d.ts +12 -2
  174. package/dist/drivers/claude/subprocess.js +79 -6
  175. package/dist/drivers/claude/subprocess.js.map +1 -1
  176. package/dist/drivers/gemini/api.d.ts +18 -0
  177. package/dist/drivers/gemini/api.js +29 -0
  178. package/dist/drivers/gemini/api.js.map +1 -0
  179. package/dist/drivers/gemini/index.d.ts +5 -1
  180. package/dist/drivers/gemini/index.js +39 -5
  181. package/dist/drivers/gemini/index.js.map +1 -1
  182. package/dist/drivers/index.d.ts +8 -1
  183. package/dist/drivers/index.js +10 -2
  184. package/dist/drivers/index.js.map +1 -1
  185. package/dist/drivers/local/index.d.ts +26 -0
  186. package/dist/drivers/local/index.js +41 -0
  187. package/dist/drivers/local/index.js.map +1 -0
  188. package/dist/featureFlags.d.ts +79 -0
  189. package/dist/featureFlags.js +208 -0
  190. package/dist/featureFlags.js.map +1 -0
  191. package/dist/fp/automationInterpreter.js +26 -21
  192. package/dist/fp/automationInterpreter.js.map +1 -1
  193. package/dist/fp/automationProgram.d.ts +1 -1
  194. package/dist/fp/automationProgram.js.map +1 -1
  195. package/dist/fp/automationState.js +4 -1
  196. package/dist/fp/automationState.js.map +1 -1
  197. package/dist/fp/policyParser.js +21 -1
  198. package/dist/fp/policyParser.js.map +1 -1
  199. package/dist/httpErrorResponse.d.ts +36 -0
  200. package/dist/httpErrorResponse.js +46 -0
  201. package/dist/httpErrorResponse.js.map +1 -0
  202. package/dist/inboxRoutes.d.ts +22 -0
  203. package/dist/inboxRoutes.js +193 -0
  204. package/dist/inboxRoutes.js.map +1 -0
  205. package/dist/index.d.ts +1 -1
  206. package/dist/index.js +1403 -203
  207. package/dist/index.js.map +1 -1
  208. package/dist/installGuard.d.ts +25 -0
  209. package/dist/installGuard.js +48 -0
  210. package/dist/installGuard.js.map +1 -0
  211. package/dist/mcpRoutes.d.ts +37 -0
  212. package/dist/mcpRoutes.js +76 -0
  213. package/dist/mcpRoutes.js.map +1 -0
  214. package/dist/oauth.d.ts +20 -1
  215. package/dist/oauth.js +214 -39
  216. package/dist/oauth.js.map +1 -1
  217. package/dist/oauthRoutes.d.ts +32 -0
  218. package/dist/oauthRoutes.js +119 -0
  219. package/dist/oauthRoutes.js.map +1 -0
  220. package/dist/orchestrator/orchestratorBridge.js +2 -2
  221. package/dist/orchestrator/orchestratorBridge.js.map +1 -1
  222. package/dist/patchworkConfig.d.ts +29 -0
  223. package/dist/patchworkConfig.js +100 -5
  224. package/dist/patchworkConfig.js.map +1 -1
  225. package/dist/pluginLoader.d.ts +28 -0
  226. package/dist/pluginLoader.js +77 -11
  227. package/dist/pluginLoader.js.map +1 -1
  228. package/dist/pluginWatcher.js +8 -3
  229. package/dist/pluginWatcher.js.map +1 -1
  230. package/dist/preToolUseHook.d.ts +12 -0
  231. package/dist/preToolUseHook.js +30 -1
  232. package/dist/preToolUseHook.js.map +1 -1
  233. package/dist/prompts.js +4 -0
  234. package/dist/prompts.js.map +1 -1
  235. package/dist/recipeOrchestration.d.ts +121 -0
  236. package/dist/recipeOrchestration.js +965 -0
  237. package/dist/recipeOrchestration.js.map +1 -0
  238. package/dist/recipeRoutes.d.ts +185 -0
  239. package/dist/recipeRoutes.js +1369 -0
  240. package/dist/recipeRoutes.js.map +1 -0
  241. package/dist/recipes/RecipeOrchestrator.d.ts +40 -0
  242. package/dist/recipes/RecipeOrchestrator.js +51 -0
  243. package/dist/recipes/RecipeOrchestrator.js.map +1 -0
  244. package/dist/recipes/agentExecutor.d.ts +38 -0
  245. package/dist/recipes/agentExecutor.js +50 -0
  246. package/dist/recipes/agentExecutor.js.map +1 -0
  247. package/dist/recipes/chainedRunner.d.ts +191 -0
  248. package/dist/recipes/chainedRunner.js +759 -0
  249. package/dist/recipes/chainedRunner.js.map +1 -0
  250. package/dist/recipes/compiler.js +3 -3
  251. package/dist/recipes/compiler.js.map +1 -1
  252. package/dist/recipes/dependencyGraph.d.ts +39 -0
  253. package/dist/recipes/dependencyGraph.js +199 -0
  254. package/dist/recipes/dependencyGraph.js.map +1 -0
  255. package/dist/recipes/disabledMarkers.d.ts +48 -0
  256. package/dist/recipes/disabledMarkers.js +52 -0
  257. package/dist/recipes/disabledMarkers.js.map +1 -0
  258. package/dist/recipes/installer.js +3 -3
  259. package/dist/recipes/installer.js.map +1 -1
  260. package/dist/recipes/legacyRecipeCompat.d.ts +10 -0
  261. package/dist/recipes/legacyRecipeCompat.js +131 -0
  262. package/dist/recipes/legacyRecipeCompat.js.map +1 -0
  263. package/dist/recipes/manifest.d.ts +47 -0
  264. package/dist/recipes/manifest.js +156 -0
  265. package/dist/recipes/manifest.js.map +1 -0
  266. package/dist/recipes/migrationWarnings.d.ts +12 -0
  267. package/dist/recipes/migrationWarnings.js +44 -0
  268. package/dist/recipes/migrationWarnings.js.map +1 -0
  269. package/dist/recipes/migrations/index.d.ts +24 -0
  270. package/dist/recipes/migrations/index.js +55 -0
  271. package/dist/recipes/migrations/index.js.map +1 -0
  272. package/dist/recipes/migrations/types.d.ts +28 -0
  273. package/dist/recipes/migrations/types.js +2 -0
  274. package/dist/recipes/migrations/types.js.map +1 -0
  275. package/dist/recipes/migrations/v1.d.ts +11 -0
  276. package/dist/recipes/migrations/v1.js +18 -0
  277. package/dist/recipes/migrations/v1.js.map +1 -0
  278. package/dist/recipes/names.d.ts +40 -0
  279. package/dist/recipes/names.js +66 -0
  280. package/dist/recipes/names.js.map +1 -0
  281. package/dist/recipes/nestedRecipeStep.d.ts +58 -0
  282. package/dist/recipes/nestedRecipeStep.js +95 -0
  283. package/dist/recipes/nestedRecipeStep.js.map +1 -0
  284. package/dist/recipes/outputRegistry.d.ts +28 -0
  285. package/dist/recipes/outputRegistry.js +52 -0
  286. package/dist/recipes/outputRegistry.js.map +1 -0
  287. package/dist/recipes/parser.js +4 -1
  288. package/dist/recipes/parser.js.map +1 -1
  289. package/dist/recipes/replayRun.d.ts +62 -0
  290. package/dist/recipes/replayRun.js +97 -0
  291. package/dist/recipes/replayRun.js.map +1 -0
  292. package/dist/recipes/resolveRecipePath.d.ts +69 -0
  293. package/dist/recipes/resolveRecipePath.js +202 -0
  294. package/dist/recipes/resolveRecipePath.js.map +1 -0
  295. package/dist/recipes/scheduler.d.ts +23 -7
  296. package/dist/recipes/scheduler.js +225 -45
  297. package/dist/recipes/scheduler.js.map +1 -1
  298. package/dist/recipes/schema.d.ts +17 -2
  299. package/dist/recipes/schemaGenerator.d.ts +28 -0
  300. package/dist/recipes/schemaGenerator.js +565 -0
  301. package/dist/recipes/schemaGenerator.js.map +1 -0
  302. package/dist/recipes/stepObservation.d.ts +44 -0
  303. package/dist/recipes/stepObservation.js +232 -0
  304. package/dist/recipes/stepObservation.js.map +1 -0
  305. package/dist/recipes/templateEngine.d.ts +62 -0
  306. package/dist/recipes/templateEngine.js +201 -0
  307. package/dist/recipes/templateEngine.js.map +1 -0
  308. package/dist/recipes/toolRegistry.d.ts +186 -0
  309. package/dist/recipes/toolRegistry.js +309 -0
  310. package/dist/recipes/toolRegistry.js.map +1 -0
  311. package/dist/recipes/tools/asana.d.ts +16 -0
  312. package/dist/recipes/tools/asana.js +524 -0
  313. package/dist/recipes/tools/asana.js.map +1 -0
  314. package/dist/recipes/tools/calendar.d.ts +6 -0
  315. package/dist/recipes/tools/calendar.js +61 -0
  316. package/dist/recipes/tools/calendar.js.map +1 -0
  317. package/dist/recipes/tools/confluence.d.ts +6 -0
  318. package/dist/recipes/tools/confluence.js +254 -0
  319. package/dist/recipes/tools/confluence.js.map +1 -0
  320. package/dist/recipes/tools/datadog.d.ts +6 -0
  321. package/dist/recipes/tools/datadog.js +239 -0
  322. package/dist/recipes/tools/datadog.js.map +1 -0
  323. package/dist/recipes/tools/diagnostics.d.ts +6 -0
  324. package/dist/recipes/tools/diagnostics.js +36 -0
  325. package/dist/recipes/tools/diagnostics.js.map +1 -0
  326. package/dist/recipes/tools/discord.d.ts +18 -0
  327. package/dist/recipes/tools/discord.js +254 -0
  328. package/dist/recipes/tools/discord.js.map +1 -0
  329. package/dist/recipes/tools/file.d.ts +12 -0
  330. package/dist/recipes/tools/file.js +174 -0
  331. package/dist/recipes/tools/file.js.map +1 -0
  332. package/dist/recipes/tools/git.d.ts +6 -0
  333. package/dist/recipes/tools/git.js +63 -0
  334. package/dist/recipes/tools/git.js.map +1 -0
  335. package/dist/recipes/tools/github.d.ts +6 -0
  336. package/dist/recipes/tools/github.js +116 -0
  337. package/dist/recipes/tools/github.js.map +1 -0
  338. package/dist/recipes/tools/gitlab.d.ts +11 -0
  339. package/dist/recipes/tools/gitlab.js +285 -0
  340. package/dist/recipes/tools/gitlab.js.map +1 -0
  341. package/dist/recipes/tools/gmail.d.ts +6 -0
  342. package/dist/recipes/tools/gmail.js +451 -0
  343. package/dist/recipes/tools/gmail.js.map +1 -0
  344. package/dist/recipes/tools/googleDrive.d.ts +1 -0
  345. package/dist/recipes/tools/googleDrive.js +55 -0
  346. package/dist/recipes/tools/googleDrive.js.map +1 -0
  347. package/dist/recipes/tools/hubspot.d.ts +6 -0
  348. package/dist/recipes/tools/hubspot.js +232 -0
  349. package/dist/recipes/tools/hubspot.js.map +1 -0
  350. package/dist/recipes/tools/index.d.ts +30 -0
  351. package/dist/recipes/tools/index.js +33 -0
  352. package/dist/recipes/tools/index.js.map +1 -0
  353. package/dist/recipes/tools/intercom.d.ts +6 -0
  354. package/dist/recipes/tools/intercom.js +226 -0
  355. package/dist/recipes/tools/intercom.js.map +1 -0
  356. package/dist/recipes/tools/jira.d.ts +14 -0
  357. package/dist/recipes/tools/jira.js +369 -0
  358. package/dist/recipes/tools/jira.js.map +1 -0
  359. package/dist/recipes/tools/linear.d.ts +7 -0
  360. package/dist/recipes/tools/linear.js +307 -0
  361. package/dist/recipes/tools/linear.js.map +1 -0
  362. package/dist/recipes/tools/meetingNotes.d.ts +21 -0
  363. package/dist/recipes/tools/meetingNotes.js +701 -0
  364. package/dist/recipes/tools/meetingNotes.js.map +1 -0
  365. package/dist/recipes/tools/notion.d.ts +6 -0
  366. package/dist/recipes/tools/notion.js +278 -0
  367. package/dist/recipes/tools/notion.js.map +1 -0
  368. package/dist/recipes/tools/pagerduty.d.ts +15 -0
  369. package/dist/recipes/tools/pagerduty.js +451 -0
  370. package/dist/recipes/tools/pagerduty.js.map +1 -0
  371. package/dist/recipes/tools/sentry.d.ts +12 -0
  372. package/dist/recipes/tools/sentry.js +73 -0
  373. package/dist/recipes/tools/sentry.js.map +1 -0
  374. package/dist/recipes/tools/slack.d.ts +6 -0
  375. package/dist/recipes/tools/slack.js +82 -0
  376. package/dist/recipes/tools/slack.js.map +1 -0
  377. package/dist/recipes/tools/stripe.d.ts +6 -0
  378. package/dist/recipes/tools/stripe.js +265 -0
  379. package/dist/recipes/tools/stripe.js.map +1 -0
  380. package/dist/recipes/tools/zendesk.d.ts +6 -0
  381. package/dist/recipes/tools/zendesk.js +245 -0
  382. package/dist/recipes/tools/zendesk.js.map +1 -0
  383. package/dist/recipes/validation.d.ts +13 -0
  384. package/dist/recipes/validation.js +617 -0
  385. package/dist/recipes/validation.js.map +1 -0
  386. package/dist/recipes/yamlRunner.d.ts +130 -2
  387. package/dist/recipes/yamlRunner.js +1009 -402
  388. package/dist/recipes/yamlRunner.js.map +1 -1
  389. package/dist/recipesHttp.d.ts +151 -6
  390. package/dist/recipesHttp.js +999 -29
  391. package/dist/recipesHttp.js.map +1 -1
  392. package/dist/riskTier.js +7 -1
  393. package/dist/riskTier.js.map +1 -1
  394. package/dist/runLog.d.ts +100 -1
  395. package/dist/runLog.js +258 -5
  396. package/dist/runLog.js.map +1 -1
  397. package/dist/schemas/dry-run-plan.v1.json +139 -0
  398. package/dist/schemas/recipe.v1.json +684 -0
  399. package/dist/server.d.ts +127 -8
  400. package/dist/server.js +740 -933
  401. package/dist/server.js.map +1 -1
  402. package/dist/ssrfGuard.d.ts +54 -0
  403. package/dist/ssrfGuard.js +122 -0
  404. package/dist/ssrfGuard.js.map +1 -0
  405. package/dist/streamableHttp.d.ts +39 -1
  406. package/dist/streamableHttp.js +128 -17
  407. package/dist/streamableHttp.js.map +1 -1
  408. package/dist/tokenUsageTracker.d.ts +33 -0
  409. package/dist/tokenUsageTracker.js +146 -0
  410. package/dist/tokenUsageTracker.js.map +1 -0
  411. package/dist/tools/activityLog.d.ts +2 -0
  412. package/dist/tools/addLinearComment.d.ts +1 -0
  413. package/dist/tools/addLinearComment.js +4 -2
  414. package/dist/tools/addLinearComment.js.map +1 -1
  415. package/dist/tools/batchLsp.d.ts +3 -0
  416. package/dist/tools/bridgeDoctor.d.ts +1 -0
  417. package/dist/tools/bridgeDoctor.js +2 -2
  418. package/dist/tools/bridgeDoctor.js.map +1 -1
  419. package/dist/tools/bridgeStatus.d.ts +1 -0
  420. package/dist/tools/cancelClaudeTask.d.ts +2 -0
  421. package/dist/tools/cancelClaudeTask.js +1 -0
  422. package/dist/tools/cancelClaudeTask.js.map +1 -1
  423. package/dist/tools/checkDocumentDirty.d.ts +1 -0
  424. package/dist/tools/clipboard.d.ts +2 -0
  425. package/dist/tools/closeTabs.d.ts +2 -0
  426. package/dist/tools/codeLens.d.ts +1 -0
  427. package/dist/tools/contextBundle.d.ts +1 -0
  428. package/dist/tools/createIssueFromAIComment.d.ts +1 -0
  429. package/dist/tools/createLinearIssue.d.ts +1 -0
  430. package/dist/tools/ctxGetTaskContext.d.ts +1 -0
  431. package/dist/tools/ctxQueryTraces.d.ts +1 -0
  432. package/dist/tools/ctxSaveTrace.d.ts +1 -0
  433. package/dist/tools/debug.d.ts +4 -0
  434. package/dist/tools/decorations.d.ts +2 -0
  435. package/dist/tools/documentLinks.d.ts +1 -0
  436. package/dist/tools/editText.d.ts +1 -0
  437. package/dist/tools/enrichCommit.d.ts +1 -0
  438. package/dist/tools/enrichStackTrace.d.ts +1 -0
  439. package/dist/tools/explainDiagnostic.d.ts +1 -0
  440. package/dist/tools/explainSymbol.d.ts +1 -0
  441. package/dist/tools/fetchCalendarEvents.d.ts +1 -0
  442. package/dist/tools/fetchGithubIssue.d.ts +1 -0
  443. package/dist/tools/fetchGithubPR.d.ts +1 -0
  444. package/dist/tools/fetchLinearIssue.d.ts +1 -0
  445. package/dist/tools/fetchSentryIssue.d.ts +1 -0
  446. package/dist/tools/fetchSlackProfile.d.ts +1 -0
  447. package/dist/tools/fetchSlackProfile.js +4 -1
  448. package/dist/tools/fetchSlackProfile.js.map +1 -1
  449. package/dist/tools/fileOperations.d.ts +3 -0
  450. package/dist/tools/fileWatcher.d.ts +2 -0
  451. package/dist/tools/findFiles.d.ts +1 -0
  452. package/dist/tools/findRelatedTests.d.ts +1 -0
  453. package/dist/tools/fixAllLintErrors.d.ts +1 -0
  454. package/dist/tools/foldingRanges.d.ts +1 -0
  455. package/dist/tools/formatDocument.d.ts +1 -0
  456. package/dist/tools/generateTests.d.ts +1 -0
  457. package/dist/tools/getAIComments.d.ts +1 -0
  458. package/dist/tools/getAnalyticsReport.d.ts +1 -0
  459. package/dist/tools/getArchitectureContext.d.ts +1 -0
  460. package/dist/tools/getBufferContent.d.ts +1 -0
  461. package/dist/tools/getChangeImpact.d.ts +1 -0
  462. package/dist/tools/getClaudeTaskStatus.d.ts +2 -0
  463. package/dist/tools/getClaudeTaskStatus.js +1 -0
  464. package/dist/tools/getClaudeTaskStatus.js.map +1 -1
  465. package/dist/tools/getCodeCoverage.d.ts +1 -0
  466. package/dist/tools/getCommitsForIssue.d.ts +1 -0
  467. package/dist/tools/getConnectorStatus.d.ts +1 -0
  468. package/dist/tools/getCurrentSelection.d.ts +2 -0
  469. package/dist/tools/getDebugState.d.ts +1 -0
  470. package/dist/tools/getDependencyTree.d.ts +1 -0
  471. package/dist/tools/getDiagnostics.d.ts +1 -0
  472. package/dist/tools/getDiffFromHandoff.d.ts +1 -0
  473. package/dist/tools/getDocumentSymbols.d.ts +25 -0
  474. package/dist/tools/getDocumentSymbols.js +74 -8
  475. package/dist/tools/getDocumentSymbols.js.map +1 -1
  476. package/dist/tools/getFileTree.d.ts +1 -0
  477. package/dist/tools/getGitDiff.d.ts +1 -0
  478. package/dist/tools/getGitHotspots.d.ts +1 -0
  479. package/dist/tools/getGitLog.d.ts +1 -0
  480. package/dist/tools/getGitStatus.d.ts +1 -0
  481. package/dist/tools/getImportTree.d.ts +1 -0
  482. package/dist/tools/getImportedSignatures.d.ts +1 -0
  483. package/dist/tools/getOpenEditors.d.ts +1 -0
  484. package/dist/tools/getPRTemplate.d.ts +1 -0
  485. package/dist/tools/getProjectContext.d.ts +1 -0
  486. package/dist/tools/getProjectInfo.d.ts +1 -0
  487. package/dist/tools/getSecurityAdvisories.d.ts +1 -0
  488. package/dist/tools/getSecurityAdvisories.js +10 -1
  489. package/dist/tools/getSecurityAdvisories.js.map +1 -1
  490. package/dist/tools/getSessionUsage.d.ts +4 -0
  491. package/dist/tools/getSessionUsage.js +3 -0
  492. package/dist/tools/getSessionUsage.js.map +1 -1
  493. package/dist/tools/getSymbolHistory.d.ts +1 -0
  494. package/dist/tools/getToolCapabilities.d.ts +1 -0
  495. package/dist/tools/getTypeSignature.d.ts +1 -0
  496. package/dist/tools/getWorkspaceFolders.d.ts +1 -0
  497. package/dist/tools/getWorkspaceSettings.d.ts +1 -0
  498. package/dist/tools/gitHistory.d.ts +2 -0
  499. package/dist/tools/gitWrite.d.ts +11 -0
  500. package/dist/tools/github/actions.d.ts +2 -0
  501. package/dist/tools/github/actions.js +4 -2
  502. package/dist/tools/github/actions.js.map +1 -1
  503. package/dist/tools/github/composite.d.ts +342 -0
  504. package/dist/tools/github/composite.js +343 -0
  505. package/dist/tools/github/composite.js.map +1 -0
  506. package/dist/tools/github/index.d.ts +1 -0
  507. package/dist/tools/github/index.js +1 -0
  508. package/dist/tools/github/index.js.map +1 -1
  509. package/dist/tools/github/issues.d.ts +4 -0
  510. package/dist/tools/github/issues.js +8 -4
  511. package/dist/tools/github/issues.js.map +1 -1
  512. package/dist/tools/github/pr.d.ts +7 -0
  513. package/dist/tools/github/pr.js +50 -12
  514. package/dist/tools/github/pr.js.map +1 -1
  515. package/dist/tools/handoffNote.d.ts +4 -0
  516. package/dist/tools/handoffNote.js +2 -0
  517. package/dist/tools/handoffNote.js.map +1 -1
  518. package/dist/tools/hoverAtCursor.d.ts +1 -0
  519. package/dist/tools/httpClient.d.ts +2 -0
  520. package/dist/tools/index.d.ts +8 -0
  521. package/dist/tools/index.js +47 -8
  522. package/dist/tools/index.js.map +1 -1
  523. package/dist/tools/inlayHints.d.ts +1 -0
  524. package/dist/tools/launchQuickTask.d.ts +2 -0
  525. package/dist/tools/launchQuickTask.js +1 -0
  526. package/dist/tools/launchQuickTask.js.map +1 -1
  527. package/dist/tools/listClaudeTasks.d.ts +2 -0
  528. package/dist/tools/listClaudeTasks.js +1 -0
  529. package/dist/tools/listClaudeTasks.js.map +1 -1
  530. package/dist/tools/listTerminals.d.ts +1 -0
  531. package/dist/tools/lsp.d.ts +14 -0
  532. package/dist/tools/navigateToSymbolByName.d.ts +1 -0
  533. package/dist/tools/openDiff.d.ts +1 -0
  534. package/dist/tools/openFile.d.ts +1 -0
  535. package/dist/tools/openInBrowser.d.ts +1 -0
  536. package/dist/tools/organizeImports.d.ts +1 -0
  537. package/dist/tools/performanceReport.d.ts +1 -0
  538. package/dist/tools/planPersistence.d.ts +5 -0
  539. package/dist/tools/previewEdit.d.ts +1 -0
  540. package/dist/tools/refactorAnalyze.d.ts +1 -0
  541. package/dist/tools/refactorPreview.d.ts +2 -0
  542. package/dist/tools/refactorPreview.js +1 -0
  543. package/dist/tools/refactorPreview.js.map +1 -1
  544. package/dist/tools/replaceBlock.d.ts +1 -0
  545. package/dist/tools/resumeClaudeTask.d.ts +2 -0
  546. package/dist/tools/resumeClaudeTask.js +1 -0
  547. package/dist/tools/resumeClaudeTask.js.map +1 -1
  548. package/dist/tools/runClaudeTask.d.ts +2 -0
  549. package/dist/tools/runClaudeTask.js +1 -0
  550. package/dist/tools/runClaudeTask.js.map +1 -1
  551. package/dist/tools/runCommand.d.ts +1 -0
  552. package/dist/tools/runCommand.js +5 -0
  553. package/dist/tools/runCommand.js.map +1 -1
  554. package/dist/tools/runTests.d.ts +1 -0
  555. package/dist/tools/saveDocument.d.ts +1 -0
  556. package/dist/tools/screenshotAndAnnotate.d.ts +1 -0
  557. package/dist/tools/searchAndReplace.d.ts +1 -0
  558. package/dist/tools/searchTools.d.ts +1 -0
  559. package/dist/tools/searchTools.js +1 -1
  560. package/dist/tools/searchTools.js.map +1 -1
  561. package/dist/tools/searchWorkspace.d.ts +1 -0
  562. package/dist/tools/selectionRanges.d.ts +1 -0
  563. package/dist/tools/semanticTokens.d.ts +1 -0
  564. package/dist/tools/setActiveWorkspaceFolder.d.ts +1 -0
  565. package/dist/tools/signatureHelp.d.ts +1 -0
  566. package/dist/tools/slackListChannels.d.ts +1 -0
  567. package/dist/tools/slackListChannels.js.map +1 -1
  568. package/dist/tools/slackPostMessage.d.ts +1 -0
  569. package/dist/tools/slackPostMessage.js +11 -6
  570. package/dist/tools/slackPostMessage.js.map +1 -1
  571. package/dist/tools/terminal.d.ts +6 -0
  572. package/dist/tools/terminal.js +4 -0
  573. package/dist/tools/terminal.js.map +1 -1
  574. package/dist/tools/testTraceToSource.d.ts +1 -0
  575. package/dist/tools/testTraceToSource.js +2 -2
  576. package/dist/tools/testTraceToSource.js.map +1 -1
  577. package/dist/tools/transaction.d.ts +23 -0
  578. package/dist/tools/transaction.js +29 -0
  579. package/dist/tools/transaction.js.map +1 -1
  580. package/dist/tools/typeHierarchy.d.ts +1 -0
  581. package/dist/tools/updateLinearIssue.d.ts +1 -0
  582. package/dist/tools/updateLinearIssue.js +20 -6
  583. package/dist/tools/updateLinearIssue.js.map +1 -1
  584. package/dist/tools/utils.d.ts +6 -0
  585. package/dist/tools/utils.js +59 -0
  586. package/dist/tools/utils.js.map +1 -1
  587. package/dist/tools/vscodeCommands.d.ts +2 -0
  588. package/dist/tools/vscodeTasks.d.ts +2 -0
  589. package/dist/tools/workspaceSettings.d.ts +1 -0
  590. package/dist/traceEncryption.d.ts +46 -0
  591. package/dist/traceEncryption.js +124 -0
  592. package/dist/traceEncryption.js.map +1 -0
  593. package/dist/transport.d.ts +46 -1
  594. package/dist/transport.js +173 -19
  595. package/dist/transport.js.map +1 -1
  596. package/package.json +30 -8
  597. package/scripts/mcp-stdio-shim.cjs +19 -3
  598. package/scripts/start-all.sh +34 -3
  599. package/templates/automation-policies/recipe-authoring.json +25 -0
  600. package/templates/automation-policy.example.json +6 -0
  601. package/templates/co.patchwork-os.bridge.plist +34 -0
  602. package/templates/policies/README.md +72 -0
  603. package/templates/policies/conservative.json +14 -0
  604. package/templates/policies/developer.json +14 -0
  605. package/templates/policies/headless-ci.json +24 -0
  606. package/templates/policies/personal-assistant.json +15 -0
  607. package/templates/policies/regulated-industry.json +18 -0
  608. package/templates/recipes/approval-queue-ui-test.yaml +205 -0
  609. package/templates/recipes/lint-on-save.yaml +1 -2
  610. package/templates/recipes/morning-brief-slack.yaml +57 -0
  611. package/templates/recipes/morning-brief.yaml +2 -2
  612. package/templates/recipes/project-health-check.yaml +50 -0
  613. package/templates/recipes/webhook/README.md +70 -0
  614. package/templates/recipes/webhook/capture-thought.yaml +26 -0
  615. package/templates/recipes/webhook/customer-escalation.yaml +49 -0
  616. package/templates/recipes/webhook/incident-intake.yaml +46 -0
  617. package/templates/recipes/webhook/meeting-prep.yaml +48 -0
  618. package/templates/recipes/webhook/morning-brief.yaml +57 -0
@@ -0,0 +1,1300 @@
1
+ /**
2
+ * Connector route dispatcher — extracted from src/server.ts.
3
+ *
4
+ * Owns every `/connections/*` HTTP endpoint (auth start / OAuth callback /
5
+ * test ping / disconnect / connect-with-body) for the 18 supported
6
+ * connectors.
7
+ *
8
+ * Two entrypoints — the split exists because OAuth callbacks must run
9
+ * BEFORE the bearer-auth gate (they're browser redirects from the vendor
10
+ * with no Patchwork token), while CRUD routes must run AFTER it:
11
+ *
12
+ * - `tryHandlePublicConnectorRoute` — `/connections/<vendor>/callback`
13
+ * routes. Server.ts calls this BEFORE bearer-auth.
14
+ * - `tryHandleConnectorRoute` — auth/test/disconnect/connect routes.
15
+ * Server.ts calls this AFTER bearer-auth.
16
+ *
17
+ * Mechanical lift — no behavior change:
18
+ * - Handler bodies are byte-identical to the original blocks save for
19
+ * wrapping a few non-IIFE call sites in `void (async()=>{...})()` so
20
+ * both functions can return boolean synchronously rather than
21
+ * Promise<boolean>. The microtask delay this introduces is invisible
22
+ * to clients — the parent request handler `return`s on a true result
23
+ * either way, and `res.end()` has always been async.
24
+ * - Pre-extraction grep confirmed zero `this.` references in either
25
+ * block, so no dependency injection was needed.
26
+ */
27
+ import { respond500 } from "./httpErrorResponse.js";
28
+ import { readBodyWithCap, respond413 } from "./recipeRoutes.js";
29
+ /**
30
+ * Token-paste connector body cap. The legitimate payload is a small JSON
31
+ * envelope (`{token: "...", workspace?: "..."}`) — cap at 16 KB so an
32
+ * authenticated caller can't burn bridge heap streaming a multi-GB body
33
+ * into the unbounded `req.on("data", ...)` handlers each connector route
34
+ * used to have.
35
+ */
36
+ const CONNECTOR_BODY_CAP = 16 * 1024;
37
+ /**
38
+ * Read the request body with a cap, dispatch to the connector's
39
+ * `handle<Vendor>Connect(body)` function, and write the result. Replaces
40
+ * the 8 near-identical inline blocks that previously each had an
41
+ * unbounded `req.on("data", ...)` accumulation.
42
+ *
43
+ * `loadHandler` is a closure that returns the handler — kept this shape
44
+ * so each call site preserves the lazy `await import()` of the connector
45
+ * module (only loaded on first call, not at bridge startup).
46
+ */
47
+ async function dispatchConnectorConnect(req, res, loadHandler) {
48
+ const read = await readBodyWithCap(req, CONNECTOR_BODY_CAP);
49
+ if (!read.ok) {
50
+ respond413(res, CONNECTOR_BODY_CAP);
51
+ return;
52
+ }
53
+ try {
54
+ const handler = await loadHandler();
55
+ const result = await handler(read.body);
56
+ res.writeHead(result.status, {
57
+ "Content-Type": result.contentType ?? "application/json",
58
+ });
59
+ res.end(result.body);
60
+ }
61
+ catch (err) {
62
+ respond500(res, err);
63
+ }
64
+ }
65
+ /**
66
+ * Try to handle a `/connections/<vendor>/callback` route. These are
67
+ * unauthenticated browser redirects from the OAuth vendor and MUST run
68
+ * before the bearer-auth gate. Returns true if the route was dispatched.
69
+ */
70
+ export function tryHandlePublicConnectorRoute(req, res, parsedUrl) {
71
+ if (parsedUrl.pathname === "/connections/github/callback" &&
72
+ req.method === "GET") {
73
+ void (async () => {
74
+ try {
75
+ const { handleGithubCallback } = await import("./connectors/github.js");
76
+ const code = parsedUrl.searchParams.get("code");
77
+ const state = parsedUrl.searchParams.get("state");
78
+ const error = parsedUrl.searchParams.get("error");
79
+ const result = await handleGithubCallback(code, state, error);
80
+ res.writeHead(result.status, {
81
+ "Content-Type": result.contentType ?? "application/json",
82
+ });
83
+ res.end(result.body);
84
+ }
85
+ catch (err) {
86
+ respond500(res, err);
87
+ }
88
+ })();
89
+ return true;
90
+ }
91
+ if (parsedUrl.pathname === "/connections/linear/callback" &&
92
+ req.method === "GET") {
93
+ void (async () => {
94
+ try {
95
+ const { handleLinearCallback } = await import("./connectors/linear.js");
96
+ const code = parsedUrl.searchParams.get("code");
97
+ const state = parsedUrl.searchParams.get("state");
98
+ const error = parsedUrl.searchParams.get("error");
99
+ const result = await handleLinearCallback(code, state, error);
100
+ res.writeHead(result.status, {
101
+ "Content-Type": result.contentType ?? "application/json",
102
+ });
103
+ res.end(result.body);
104
+ }
105
+ catch (err) {
106
+ respond500(res, err);
107
+ }
108
+ })();
109
+ return true;
110
+ }
111
+ if (parsedUrl.pathname === "/connections/sentry/callback" &&
112
+ req.method === "GET") {
113
+ void (async () => {
114
+ try {
115
+ const { handleSentryCallback } = await import("./connectors/sentry.js");
116
+ const code = parsedUrl.searchParams.get("code");
117
+ const state = parsedUrl.searchParams.get("state");
118
+ const error = parsedUrl.searchParams.get("error");
119
+ const result = await handleSentryCallback(code, state, error);
120
+ res.writeHead(result.status, {
121
+ "Content-Type": result.contentType ?? "application/json",
122
+ });
123
+ res.end(result.body);
124
+ }
125
+ catch (err) {
126
+ respond500(res, err);
127
+ }
128
+ })();
129
+ return true;
130
+ }
131
+ if (parsedUrl.pathname === "/connections/google-calendar/callback" &&
132
+ req.method === "GET") {
133
+ void (async () => {
134
+ try {
135
+ const { handleCalendarCallback } = await import("./connectors/googleCalendar.js");
136
+ const code = parsedUrl.searchParams.get("code");
137
+ const state = parsedUrl.searchParams.get("state");
138
+ const error = parsedUrl.searchParams.get("error");
139
+ const result = await handleCalendarCallback(code, state, error);
140
+ res.writeHead(result.status, {
141
+ "Content-Type": result.contentType ?? "application/json",
142
+ });
143
+ res.end(result.body);
144
+ }
145
+ catch (err) {
146
+ respond500(res, err);
147
+ }
148
+ })();
149
+ return true;
150
+ }
151
+ if (parsedUrl.pathname === "/connections/google-drive/callback" &&
152
+ req.method === "GET") {
153
+ void (async () => {
154
+ try {
155
+ const { handleDriveCallback } = await import("./connectors/googleDrive.js");
156
+ const code = parsedUrl.searchParams.get("code");
157
+ const state = parsedUrl.searchParams.get("state");
158
+ const error = parsedUrl.searchParams.get("error");
159
+ const result = await handleDriveCallback(code, state, error);
160
+ res.writeHead(result.status, {
161
+ "Content-Type": result.contentType ?? "application/json",
162
+ });
163
+ res.end(result.body);
164
+ }
165
+ catch (err) {
166
+ respond500(res, err);
167
+ }
168
+ })();
169
+ return true;
170
+ }
171
+ if (parsedUrl.pathname === "/connections/slack/callback" &&
172
+ req.method === "GET") {
173
+ void (async () => {
174
+ try {
175
+ const { handleSlackCallback } = await import("./connectors/slack.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 handleSlackCallback(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/gmail/callback" &&
192
+ req.method === "GET") {
193
+ void (async () => {
194
+ try {
195
+ const { handleGmailCallback } = await import("./connectors/gmail.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 handleGmailCallback(code, state, error);
200
+ res.writeHead(result.status, {
201
+ "Content-Type": result.contentType ?? "text/html",
202
+ });
203
+ res.end(result.body);
204
+ }
205
+ catch (err) {
206
+ respond500(res, err);
207
+ }
208
+ })();
209
+ return true;
210
+ }
211
+ return false;
212
+ }
213
+ /**
214
+ * Try to handle a `/connections/*` route (auth start / test / disconnect /
215
+ * connect-with-body). Returns true if the route was dispatched (caller
216
+ * should `return` from the request handler), false if no route matched
217
+ * (caller should fall through to other route checks).
218
+ *
219
+ * The actual response is written asynchronously inside an IIFE; this
220
+ * function returns synchronously as soon as the route is recognized.
221
+ */
222
+ export function tryHandleConnectorRoute(req, res, parsedUrl) {
223
+ // ── Gmail / Connections endpoints ───────────────────────────────────────
224
+ if (parsedUrl.pathname === "/connections" && req.method === "GET") {
225
+ void (async () => {
226
+ try {
227
+ const { handleConnectionsList } = await import("./connectors/gmail.js");
228
+ const result = await handleConnectionsList();
229
+ res.writeHead(result.status, {
230
+ "Content-Type": result.contentType ?? "application/json",
231
+ });
232
+ res.end(result.body);
233
+ }
234
+ catch (err) {
235
+ respond500(res, err);
236
+ }
237
+ })();
238
+ return true;
239
+ }
240
+ if (parsedUrl.pathname === "/connections/gmail/auth" &&
241
+ req.method === "GET") {
242
+ void (async () => {
243
+ try {
244
+ const { handleGmailAuthRedirect } = await import("./connectors/gmail.js");
245
+ const result = handleGmailAuthRedirect();
246
+ if (result.redirect) {
247
+ res.writeHead(302, { Location: result.redirect });
248
+ res.end();
249
+ }
250
+ else {
251
+ res.writeHead(result.status, {
252
+ "Content-Type": result.contentType ?? "application/json",
253
+ });
254
+ res.end(result.body);
255
+ }
256
+ }
257
+ catch (err) {
258
+ respond500(res, err);
259
+ }
260
+ })();
261
+ return true;
262
+ }
263
+ if (parsedUrl.pathname === "/connections/gmail" && req.method === "DELETE") {
264
+ void (async () => {
265
+ try {
266
+ const { handleGmailDisconnect } = await import("./connectors/gmail.js");
267
+ const result = await handleGmailDisconnect();
268
+ res.writeHead(result.status, {
269
+ "Content-Type": result.contentType ?? "application/json",
270
+ });
271
+ res.end(result.body);
272
+ }
273
+ catch (err) {
274
+ respond500(res, err);
275
+ }
276
+ })();
277
+ return true;
278
+ }
279
+ if (parsedUrl.pathname === "/connections/gmail/test" &&
280
+ req.method === "POST") {
281
+ void (async () => {
282
+ try {
283
+ const { handleGmailTest } = await import("./connectors/gmail.js");
284
+ const result = await handleGmailTest();
285
+ res.writeHead(result.status, {
286
+ "Content-Type": result.contentType ?? "application/json",
287
+ });
288
+ res.end(result.body);
289
+ }
290
+ catch (err) {
291
+ respond500(res, err);
292
+ }
293
+ })();
294
+ return true;
295
+ }
296
+ // ── GitHub MCP connector routes ─────────────────────────────────────
297
+ if (parsedUrl.pathname === "/connections/github/auth" &&
298
+ req.method === "GET") {
299
+ void (async () => {
300
+ try {
301
+ const { handleGithubAuthorize } = await import("./connectors/github.js");
302
+ const result = await handleGithubAuthorize();
303
+ if (result.redirect) {
304
+ res.writeHead(302, { Location: result.redirect });
305
+ res.end();
306
+ }
307
+ else {
308
+ res.writeHead(result.status, {
309
+ "Content-Type": result.contentType ?? "application/json",
310
+ });
311
+ res.end(result.body);
312
+ }
313
+ }
314
+ catch (err) {
315
+ respond500(res, err);
316
+ }
317
+ })();
318
+ return true;
319
+ }
320
+ if (parsedUrl.pathname === "/connections/github/test" &&
321
+ req.method === "POST") {
322
+ void (async () => {
323
+ try {
324
+ const { handleGithubTest } = await import("./connectors/github.js");
325
+ const result = await handleGithubTest();
326
+ res.writeHead(result.status, {
327
+ "Content-Type": result.contentType ?? "application/json",
328
+ });
329
+ res.end(result.body);
330
+ }
331
+ catch (err) {
332
+ respond500(res, err);
333
+ }
334
+ })();
335
+ return true;
336
+ }
337
+ if (parsedUrl.pathname === "/connections/github" && req.method === "DELETE") {
338
+ void (async () => {
339
+ try {
340
+ const { handleGithubDisconnect } = await import("./connectors/github.js");
341
+ const result = await handleGithubDisconnect();
342
+ res.writeHead(result.status, {
343
+ "Content-Type": result.contentType ?? "application/json",
344
+ });
345
+ res.end(result.body);
346
+ }
347
+ catch (err) {
348
+ respond500(res, err);
349
+ }
350
+ })();
351
+ return true;
352
+ }
353
+ // ── Sentry MCP connector routes ─────────────────────────────────────
354
+ if (parsedUrl.pathname === "/connections/sentry/auth" &&
355
+ req.method === "GET") {
356
+ void (async () => {
357
+ try {
358
+ const { handleSentryAuthorize } = await import("./connectors/sentry.js");
359
+ const result = await handleSentryAuthorize();
360
+ if (result.redirect) {
361
+ res.writeHead(302, { Location: result.redirect });
362
+ res.end();
363
+ }
364
+ else {
365
+ res.writeHead(result.status, {
366
+ "Content-Type": result.contentType ?? "application/json",
367
+ });
368
+ res.end(result.body);
369
+ }
370
+ }
371
+ catch (err) {
372
+ respond500(res, err);
373
+ }
374
+ })();
375
+ return true;
376
+ }
377
+ if (parsedUrl.pathname === "/connections/sentry/callback" &&
378
+ req.method === "GET") {
379
+ void (async () => {
380
+ try {
381
+ const { handleSentryCallback } = await import("./connectors/sentry.js");
382
+ const code = parsedUrl.searchParams.get("code");
383
+ const state = parsedUrl.searchParams.get("state");
384
+ const error = parsedUrl.searchParams.get("error");
385
+ const result = await handleSentryCallback(code, state, error);
386
+ res.writeHead(result.status, {
387
+ "Content-Type": result.contentType ?? "application/json",
388
+ });
389
+ res.end(result.body);
390
+ }
391
+ catch (err) {
392
+ respond500(res, err);
393
+ }
394
+ })();
395
+ return true;
396
+ }
397
+ if (parsedUrl.pathname === "/connections/sentry/test" &&
398
+ req.method === "POST") {
399
+ void (async () => {
400
+ try {
401
+ const { handleSentryTest } = await import("./connectors/sentry.js");
402
+ const result = await handleSentryTest();
403
+ res.writeHead(result.status, {
404
+ "Content-Type": result.contentType ?? "application/json",
405
+ });
406
+ res.end(result.body);
407
+ }
408
+ catch (err) {
409
+ respond500(res, err);
410
+ }
411
+ })();
412
+ return true;
413
+ }
414
+ if (parsedUrl.pathname === "/connections/sentry" && req.method === "DELETE") {
415
+ void (async () => {
416
+ try {
417
+ const { handleSentryDisconnect } = await import("./connectors/sentry.js");
418
+ const result = await handleSentryDisconnect();
419
+ res.writeHead(result.status, {
420
+ "Content-Type": result.contentType ?? "application/json",
421
+ });
422
+ res.end(result.body);
423
+ }
424
+ catch (err) {
425
+ respond500(res, err);
426
+ }
427
+ })();
428
+ return true;
429
+ }
430
+ // ── Linear MCP connector routes ─────────────────────────────────────
431
+ if (parsedUrl.pathname === "/connections/linear/auth" &&
432
+ req.method === "GET") {
433
+ void (async () => {
434
+ try {
435
+ const { handleLinearAuthorize } = await import("./connectors/linear.js");
436
+ const result = await handleLinearAuthorize();
437
+ if (result.redirect) {
438
+ res.writeHead(302, { Location: result.redirect });
439
+ res.end();
440
+ }
441
+ else {
442
+ res.writeHead(result.status, {
443
+ "Content-Type": result.contentType ?? "application/json",
444
+ });
445
+ res.end(result.body);
446
+ }
447
+ }
448
+ catch (err) {
449
+ respond500(res, err);
450
+ }
451
+ })();
452
+ return true;
453
+ }
454
+ if (parsedUrl.pathname === "/connections/linear/callback" &&
455
+ req.method === "GET") {
456
+ void (async () => {
457
+ try {
458
+ const { handleLinearCallback } = await import("./connectors/linear.js");
459
+ const code = parsedUrl.searchParams.get("code");
460
+ const state = parsedUrl.searchParams.get("state");
461
+ const error = parsedUrl.searchParams.get("error");
462
+ const result = await handleLinearCallback(code, state, error);
463
+ res.writeHead(result.status, {
464
+ "Content-Type": result.contentType ?? "application/json",
465
+ });
466
+ res.end(result.body);
467
+ }
468
+ catch (err) {
469
+ respond500(res, err);
470
+ }
471
+ })();
472
+ return true;
473
+ }
474
+ if (parsedUrl.pathname === "/connections/linear/test" &&
475
+ req.method === "POST") {
476
+ void (async () => {
477
+ try {
478
+ const { handleLinearTest } = await import("./connectors/linear.js");
479
+ const result = await handleLinearTest();
480
+ res.writeHead(result.status, {
481
+ "Content-Type": result.contentType ?? "application/json",
482
+ });
483
+ res.end(result.body);
484
+ }
485
+ catch (err) {
486
+ respond500(res, err);
487
+ }
488
+ })();
489
+ return true;
490
+ }
491
+ if (parsedUrl.pathname === "/connections/linear" && req.method === "DELETE") {
492
+ void (async () => {
493
+ try {
494
+ const { handleLinearDisconnect } = await import("./connectors/linear.js");
495
+ const result = await handleLinearDisconnect();
496
+ res.writeHead(result.status, {
497
+ "Content-Type": result.contentType ?? "application/json",
498
+ });
499
+ res.end(result.body);
500
+ }
501
+ catch (err) {
502
+ respond500(res, err);
503
+ }
504
+ })();
505
+ return true;
506
+ }
507
+ // ── Slack connector routes ──────────────────────────────────────
508
+ if ((parsedUrl.pathname === "/connections/slack/auth" ||
509
+ parsedUrl.pathname === "/connections/slack/authorize") &&
510
+ req.method === "GET") {
511
+ void (async () => {
512
+ try {
513
+ const { handleSlackAuthorize } = await import("./connectors/slack.js");
514
+ const result = handleSlackAuthorize();
515
+ if (result.redirect) {
516
+ res.writeHead(302, { Location: result.redirect });
517
+ res.end();
518
+ }
519
+ else {
520
+ res.writeHead(result.status, {
521
+ "Content-Type": result.contentType ?? "application/json",
522
+ });
523
+ res.end(result.body);
524
+ }
525
+ }
526
+ catch (err) {
527
+ respond500(res, err);
528
+ }
529
+ })();
530
+ return true;
531
+ }
532
+ if (parsedUrl.pathname === "/connections/slack/test" &&
533
+ req.method === "POST") {
534
+ void (async () => {
535
+ try {
536
+ const { handleSlackTest } = await import("./connectors/slack.js");
537
+ const result = await handleSlackTest();
538
+ res.writeHead(result.status, {
539
+ "Content-Type": result.contentType ?? "application/json",
540
+ });
541
+ res.end(result.body);
542
+ }
543
+ catch (err) {
544
+ respond500(res, err);
545
+ }
546
+ })();
547
+ return true;
548
+ }
549
+ if (parsedUrl.pathname === "/connections/slack" && req.method === "DELETE") {
550
+ void (async () => {
551
+ try {
552
+ const { handleSlackDisconnect } = await import("./connectors/slack.js");
553
+ const result = handleSlackDisconnect();
554
+ res.writeHead(result.status, {
555
+ "Content-Type": result.contentType ?? "application/json",
556
+ });
557
+ res.end(result.body);
558
+ }
559
+ catch (err) {
560
+ respond500(res, err);
561
+ }
562
+ })();
563
+ return true;
564
+ }
565
+ // ── Discord connector routes ───────────────────────────────────
566
+ if ((parsedUrl.pathname === "/connections/discord/auth" ||
567
+ parsedUrl.pathname === "/connections/discord/authorize") &&
568
+ req.method === "GET") {
569
+ void (async () => {
570
+ try {
571
+ const { handleDiscordAuthorize } = await import("./connectors/discord.js");
572
+ const result = handleDiscordAuthorize();
573
+ if (result.redirect) {
574
+ res.writeHead(302, { Location: result.redirect });
575
+ res.end();
576
+ }
577
+ else {
578
+ res.writeHead(result.status, {
579
+ "Content-Type": result.contentType ?? "application/json",
580
+ });
581
+ res.end(result.body);
582
+ }
583
+ }
584
+ catch (err) {
585
+ respond500(res, err);
586
+ }
587
+ })();
588
+ return true;
589
+ }
590
+ if (parsedUrl.pathname === "/connections/discord/callback" &&
591
+ req.method === "GET") {
592
+ void (async () => {
593
+ try {
594
+ const { handleDiscordCallback } = await import("./connectors/discord.js");
595
+ const code = parsedUrl.searchParams.get("code");
596
+ const state = parsedUrl.searchParams.get("state");
597
+ const error = parsedUrl.searchParams.get("error");
598
+ const result = await handleDiscordCallback(code, state, error);
599
+ res.writeHead(result.status, {
600
+ "Content-Type": result.contentType ?? "text/html",
601
+ });
602
+ res.end(result.body);
603
+ }
604
+ catch (err) {
605
+ respond500(res, err);
606
+ }
607
+ })();
608
+ return true;
609
+ }
610
+ if (parsedUrl.pathname === "/connections/discord/test" &&
611
+ req.method === "POST") {
612
+ void (async () => {
613
+ try {
614
+ const { handleDiscordTest } = await import("./connectors/discord.js");
615
+ const result = await handleDiscordTest();
616
+ res.writeHead(result.status, {
617
+ "Content-Type": result.contentType ?? "application/json",
618
+ });
619
+ res.end(result.body);
620
+ }
621
+ catch (err) {
622
+ respond500(res, err);
623
+ }
624
+ })();
625
+ return true;
626
+ }
627
+ if (parsedUrl.pathname === "/connections/discord" &&
628
+ req.method === "DELETE") {
629
+ void (async () => {
630
+ try {
631
+ const { handleDiscordDisconnect } = await import("./connectors/discord.js");
632
+ const result = await handleDiscordDisconnect();
633
+ res.writeHead(result.status, {
634
+ "Content-Type": result.contentType ?? "application/json",
635
+ });
636
+ res.end(result.body);
637
+ }
638
+ catch (err) {
639
+ respond500(res, err);
640
+ }
641
+ })();
642
+ return true;
643
+ }
644
+ // ── Asana connector routes ─────────────────────────────────────
645
+ if ((parsedUrl.pathname === "/connections/asana/auth" ||
646
+ parsedUrl.pathname === "/connections/asana/authorize") &&
647
+ req.method === "GET") {
648
+ void (async () => {
649
+ try {
650
+ const { handleAsanaAuthorize } = await import("./connectors/asana.js");
651
+ const result = handleAsanaAuthorize();
652
+ if (result.redirect) {
653
+ res.writeHead(302, { Location: result.redirect });
654
+ res.end();
655
+ }
656
+ else {
657
+ res.writeHead(result.status, {
658
+ "Content-Type": result.contentType ?? "application/json",
659
+ });
660
+ res.end(result.body);
661
+ }
662
+ }
663
+ catch (err) {
664
+ respond500(res, err);
665
+ }
666
+ })();
667
+ return true;
668
+ }
669
+ if (parsedUrl.pathname === "/connections/asana/callback" &&
670
+ req.method === "GET") {
671
+ void (async () => {
672
+ try {
673
+ const { handleAsanaCallback } = await import("./connectors/asana.js");
674
+ const code = parsedUrl.searchParams.get("code");
675
+ const state = parsedUrl.searchParams.get("state");
676
+ const error = parsedUrl.searchParams.get("error");
677
+ const result = await handleAsanaCallback(code, state, error);
678
+ res.writeHead(result.status, {
679
+ "Content-Type": result.contentType ?? "text/html",
680
+ });
681
+ res.end(result.body);
682
+ }
683
+ catch (err) {
684
+ respond500(res, err);
685
+ }
686
+ })();
687
+ return true;
688
+ }
689
+ if (parsedUrl.pathname === "/connections/asana/test" &&
690
+ req.method === "POST") {
691
+ void (async () => {
692
+ try {
693
+ const { handleAsanaTest } = await import("./connectors/asana.js");
694
+ const result = await handleAsanaTest();
695
+ res.writeHead(result.status, {
696
+ "Content-Type": result.contentType ?? "application/json",
697
+ });
698
+ res.end(result.body);
699
+ }
700
+ catch (err) {
701
+ respond500(res, err);
702
+ }
703
+ })();
704
+ return true;
705
+ }
706
+ if (parsedUrl.pathname === "/connections/asana" && req.method === "DELETE") {
707
+ void (async () => {
708
+ try {
709
+ const { handleAsanaDisconnect } = await import("./connectors/asana.js");
710
+ const result = await handleAsanaDisconnect();
711
+ res.writeHead(result.status, {
712
+ "Content-Type": result.contentType ?? "application/json",
713
+ });
714
+ res.end(result.body);
715
+ }
716
+ catch (err) {
717
+ respond500(res, err);
718
+ }
719
+ })();
720
+ return true;
721
+ }
722
+ // ── GitLab connector routes ────────────────────────────────────
723
+ if ((parsedUrl.pathname === "/connections/gitlab/auth" ||
724
+ parsedUrl.pathname === "/connections/gitlab/authorize") &&
725
+ req.method === "GET") {
726
+ void (async () => {
727
+ try {
728
+ const { handleGitLabAuthorize } = await import("./connectors/gitlab.js");
729
+ const result = handleGitLabAuthorize();
730
+ if (result.redirect) {
731
+ res.writeHead(302, { Location: result.redirect });
732
+ res.end();
733
+ }
734
+ else {
735
+ res.writeHead(result.status, {
736
+ "Content-Type": result.contentType ?? "application/json",
737
+ });
738
+ res.end(result.body);
739
+ }
740
+ }
741
+ catch (err) {
742
+ respond500(res, err);
743
+ }
744
+ })();
745
+ return true;
746
+ }
747
+ if (parsedUrl.pathname === "/connections/gitlab/callback" &&
748
+ req.method === "GET") {
749
+ void (async () => {
750
+ try {
751
+ const { handleGitLabCallback } = await import("./connectors/gitlab.js");
752
+ const code = parsedUrl.searchParams.get("code");
753
+ const state = parsedUrl.searchParams.get("state");
754
+ const error = parsedUrl.searchParams.get("error");
755
+ const result = await handleGitLabCallback(code, state, error);
756
+ res.writeHead(result.status, {
757
+ "Content-Type": result.contentType ?? "text/html",
758
+ });
759
+ res.end(result.body);
760
+ }
761
+ catch (err) {
762
+ respond500(res, err);
763
+ }
764
+ })();
765
+ return true;
766
+ }
767
+ if (parsedUrl.pathname === "/connections/gitlab/test" &&
768
+ req.method === "POST") {
769
+ void (async () => {
770
+ try {
771
+ const { handleGitLabTest } = await import("./connectors/gitlab.js");
772
+ const result = await handleGitLabTest();
773
+ res.writeHead(result.status, {
774
+ "Content-Type": result.contentType ?? "application/json",
775
+ });
776
+ res.end(result.body);
777
+ }
778
+ catch (err) {
779
+ respond500(res, err);
780
+ }
781
+ })();
782
+ return true;
783
+ }
784
+ if (parsedUrl.pathname === "/connections/gitlab" && req.method === "DELETE") {
785
+ void (async () => {
786
+ try {
787
+ const { handleGitLabDisconnect } = await import("./connectors/gitlab.js");
788
+ const result = await handleGitLabDisconnect();
789
+ res.writeHead(result.status, {
790
+ "Content-Type": result.contentType ?? "application/json",
791
+ });
792
+ res.end(result.body);
793
+ }
794
+ catch (err) {
795
+ respond500(res, err);
796
+ }
797
+ })();
798
+ return true;
799
+ }
800
+ // ── Notion routes ──────────────────────────────────────────────
801
+ if (parsedUrl.pathname === "/connections/notion/connect" &&
802
+ req.method === "POST") {
803
+ void dispatchConnectorConnect(req, res, async () => {
804
+ const m = await import("./connectors/notion.js");
805
+ return m.handleNotionConnect;
806
+ });
807
+ return true;
808
+ }
809
+ if (parsedUrl.pathname === "/connections/notion/test" &&
810
+ req.method === "POST") {
811
+ void (async () => {
812
+ try {
813
+ const { handleNotionTest } = await import("./connectors/notion.js");
814
+ const result = await handleNotionTest();
815
+ res.writeHead(result.status, {
816
+ "Content-Type": result.contentType ?? "application/json",
817
+ });
818
+ res.end(result.body);
819
+ }
820
+ catch (err) {
821
+ respond500(res, err);
822
+ }
823
+ })();
824
+ return true;
825
+ }
826
+ if (parsedUrl.pathname === "/connections/notion" && req.method === "DELETE") {
827
+ void (async () => {
828
+ try {
829
+ const { handleNotionDisconnect } = await import("./connectors/notion.js");
830
+ const result = handleNotionDisconnect();
831
+ res.writeHead(result.status, {
832
+ "Content-Type": result.contentType ?? "application/json",
833
+ });
834
+ res.end(result.body);
835
+ }
836
+ catch (err) {
837
+ respond500(res, err);
838
+ }
839
+ })();
840
+ return true;
841
+ }
842
+ // ── Confluence routes ───────────────────────────────────────────
843
+ if (parsedUrl.pathname === "/connections/confluence/connect" &&
844
+ req.method === "POST") {
845
+ void dispatchConnectorConnect(req, res, async () => {
846
+ const m = await import("./connectors/confluence.js");
847
+ return m.handleConfluenceConnect;
848
+ });
849
+ return true;
850
+ }
851
+ if (parsedUrl.pathname === "/connections/confluence/test" &&
852
+ req.method === "POST") {
853
+ void (async () => {
854
+ try {
855
+ const { handleConfluenceTest } = await import("./connectors/confluence.js");
856
+ const result = await handleConfluenceTest();
857
+ res.writeHead(result.status, {
858
+ "Content-Type": result.contentType ?? "application/json",
859
+ });
860
+ res.end(result.body);
861
+ }
862
+ catch (err) {
863
+ respond500(res, err);
864
+ }
865
+ })();
866
+ return true;
867
+ }
868
+ if (parsedUrl.pathname === "/connections/confluence" &&
869
+ req.method === "DELETE") {
870
+ void (async () => {
871
+ try {
872
+ const { handleConfluenceDisconnect } = await import("./connectors/confluence.js");
873
+ const result = handleConfluenceDisconnect();
874
+ res.writeHead(result.status, {
875
+ "Content-Type": result.contentType ?? "application/json",
876
+ });
877
+ res.end(result.body);
878
+ }
879
+ catch (err) {
880
+ respond500(res, err);
881
+ }
882
+ })();
883
+ return true;
884
+ }
885
+ // ── Zendesk routes ──────────────────────────────────────────────
886
+ if (parsedUrl.pathname === "/connections/zendesk/connect" &&
887
+ req.method === "POST") {
888
+ void dispatchConnectorConnect(req, res, async () => {
889
+ const m = await import("./connectors/zendesk.js");
890
+ return m.handleZendeskConnect;
891
+ });
892
+ return true;
893
+ }
894
+ if (parsedUrl.pathname === "/connections/zendesk/test" &&
895
+ req.method === "POST") {
896
+ void (async () => {
897
+ try {
898
+ const { handleZendeskTest } = await import("./connectors/zendesk.js");
899
+ const result = await handleZendeskTest();
900
+ res.writeHead(result.status, {
901
+ "Content-Type": result.contentType ?? "application/json",
902
+ });
903
+ res.end(result.body);
904
+ }
905
+ catch (err) {
906
+ respond500(res, err);
907
+ }
908
+ })();
909
+ return true;
910
+ }
911
+ if (parsedUrl.pathname === "/connections/zendesk" &&
912
+ req.method === "DELETE") {
913
+ void (async () => {
914
+ try {
915
+ const { handleZendeskDisconnect } = await import("./connectors/zendesk.js");
916
+ const result = handleZendeskDisconnect();
917
+ res.writeHead(result.status, {
918
+ "Content-Type": result.contentType ?? "application/json",
919
+ });
920
+ res.end(result.body);
921
+ }
922
+ catch (err) {
923
+ respond500(res, err);
924
+ }
925
+ })();
926
+ return true;
927
+ }
928
+ // ── Intercom routes ─────────────────────────────────────────────
929
+ if (parsedUrl.pathname === "/connections/intercom/connect" &&
930
+ req.method === "POST") {
931
+ void dispatchConnectorConnect(req, res, async () => {
932
+ const m = await import("./connectors/intercom.js");
933
+ return m.handleIntercomConnect;
934
+ });
935
+ return true;
936
+ }
937
+ if (parsedUrl.pathname === "/connections/intercom/test" &&
938
+ req.method === "POST") {
939
+ void (async () => {
940
+ try {
941
+ const { handleIntercomTest } = await import("./connectors/intercom.js");
942
+ const result = await handleIntercomTest();
943
+ res.writeHead(result.status, {
944
+ "Content-Type": result.contentType ?? "application/json",
945
+ });
946
+ res.end(result.body);
947
+ }
948
+ catch (err) {
949
+ respond500(res, err);
950
+ }
951
+ })();
952
+ return true;
953
+ }
954
+ if (parsedUrl.pathname === "/connections/intercom" &&
955
+ req.method === "DELETE") {
956
+ void (async () => {
957
+ try {
958
+ const { handleIntercomDisconnect } = await import("./connectors/intercom.js");
959
+ const result = handleIntercomDisconnect();
960
+ res.writeHead(result.status, {
961
+ "Content-Type": result.contentType ?? "application/json",
962
+ });
963
+ res.end(result.body);
964
+ }
965
+ catch (err) {
966
+ respond500(res, err);
967
+ }
968
+ })();
969
+ return true;
970
+ }
971
+ // ── HubSpot routes ─────────────────────────────────────────────
972
+ if (parsedUrl.pathname === "/connections/hubspot/connect" &&
973
+ req.method === "POST") {
974
+ void dispatchConnectorConnect(req, res, async () => {
975
+ const m = await import("./connectors/hubspot.js");
976
+ return m.handleHubSpotConnect;
977
+ });
978
+ return true;
979
+ }
980
+ if (parsedUrl.pathname === "/connections/hubspot/test" &&
981
+ req.method === "POST") {
982
+ void (async () => {
983
+ try {
984
+ const { handleHubSpotTest } = await import("./connectors/hubspot.js");
985
+ const result = await handleHubSpotTest();
986
+ res.writeHead(result.status, {
987
+ "Content-Type": result.contentType ?? "application/json",
988
+ });
989
+ res.end(result.body);
990
+ }
991
+ catch (err) {
992
+ respond500(res, err);
993
+ }
994
+ })();
995
+ return true;
996
+ }
997
+ if (parsedUrl.pathname === "/connections/hubspot" &&
998
+ req.method === "DELETE") {
999
+ void (async () => {
1000
+ try {
1001
+ const { handleHubSpotDisconnect } = await import("./connectors/hubspot.js");
1002
+ const result = handleHubSpotDisconnect();
1003
+ res.writeHead(result.status, {
1004
+ "Content-Type": result.contentType ?? "application/json",
1005
+ });
1006
+ res.end(result.body);
1007
+ }
1008
+ catch (err) {
1009
+ respond500(res, err);
1010
+ }
1011
+ })();
1012
+ return true;
1013
+ }
1014
+ // ── Datadog routes ─────────────────────────────────────────────
1015
+ if (parsedUrl.pathname === "/connections/datadog/connect" &&
1016
+ req.method === "POST") {
1017
+ void dispatchConnectorConnect(req, res, async () => {
1018
+ const m = await import("./connectors/datadog.js");
1019
+ return m.handleDatadogConnect;
1020
+ });
1021
+ return true;
1022
+ }
1023
+ if (parsedUrl.pathname === "/connections/datadog/test" &&
1024
+ req.method === "POST") {
1025
+ void (async () => {
1026
+ try {
1027
+ const { handleDatadogTest } = await import("./connectors/datadog.js");
1028
+ const result = await handleDatadogTest();
1029
+ res.writeHead(result.status, {
1030
+ "Content-Type": result.contentType ?? "application/json",
1031
+ });
1032
+ res.end(result.body);
1033
+ }
1034
+ catch (err) {
1035
+ respond500(res, err);
1036
+ }
1037
+ })();
1038
+ return true;
1039
+ }
1040
+ if (parsedUrl.pathname === "/connections/datadog" &&
1041
+ req.method === "DELETE") {
1042
+ void (async () => {
1043
+ try {
1044
+ const { handleDatadogDisconnect } = await import("./connectors/datadog.js");
1045
+ const result = handleDatadogDisconnect();
1046
+ res.writeHead(result.status, {
1047
+ "Content-Type": result.contentType ?? "application/json",
1048
+ });
1049
+ res.end(result.body);
1050
+ }
1051
+ catch (err) {
1052
+ respond500(res, err);
1053
+ }
1054
+ })();
1055
+ return true;
1056
+ }
1057
+ // ── PagerDuty routes ───────────────────────────────────────────
1058
+ if (parsedUrl.pathname === "/connections/pagerduty/connect" &&
1059
+ req.method === "POST") {
1060
+ void dispatchConnectorConnect(req, res, async () => {
1061
+ const m = await import("./connectors/pagerduty.js");
1062
+ return m.handlePagerDutyConnect;
1063
+ });
1064
+ return true;
1065
+ }
1066
+ if (parsedUrl.pathname === "/connections/pagerduty/test" &&
1067
+ req.method === "POST") {
1068
+ void (async () => {
1069
+ try {
1070
+ const { handlePagerDutyTest } = await import("./connectors/pagerduty.js");
1071
+ const result = await handlePagerDutyTest();
1072
+ res.writeHead(result.status, {
1073
+ "Content-Type": result.contentType ?? "application/json",
1074
+ });
1075
+ res.end(result.body);
1076
+ }
1077
+ catch (err) {
1078
+ respond500(res, err);
1079
+ }
1080
+ })();
1081
+ return true;
1082
+ }
1083
+ if (parsedUrl.pathname === "/connections/pagerduty" &&
1084
+ req.method === "DELETE") {
1085
+ void (async () => {
1086
+ try {
1087
+ const { handlePagerDutyDisconnect } = await import("./connectors/pagerduty.js");
1088
+ const result = handlePagerDutyDisconnect();
1089
+ res.writeHead(result.status, {
1090
+ "Content-Type": result.contentType ?? "application/json",
1091
+ });
1092
+ res.end(result.body);
1093
+ }
1094
+ catch (err) {
1095
+ respond500(res, err);
1096
+ }
1097
+ })();
1098
+ return true;
1099
+ }
1100
+ // ── Stripe routes ───────────────────────────────────────────────
1101
+ if (parsedUrl.pathname === "/connections/stripe/connect" &&
1102
+ req.method === "POST") {
1103
+ void dispatchConnectorConnect(req, res, async () => {
1104
+ const m = await import("./connectors/stripe.js");
1105
+ return m.handleStripeConnect;
1106
+ });
1107
+ return true;
1108
+ }
1109
+ if (parsedUrl.pathname === "/connections/stripe/test" &&
1110
+ req.method === "POST") {
1111
+ void (async () => {
1112
+ try {
1113
+ const { handleStripeTest } = await import("./connectors/stripe.js");
1114
+ const result = await handleStripeTest();
1115
+ res.writeHead(result.status, {
1116
+ "Content-Type": result.contentType ?? "application/json",
1117
+ });
1118
+ res.end(result.body);
1119
+ }
1120
+ catch (err) {
1121
+ respond500(res, err);
1122
+ }
1123
+ })();
1124
+ return true;
1125
+ }
1126
+ if (parsedUrl.pathname === "/connections/stripe" && req.method === "DELETE") {
1127
+ void (async () => {
1128
+ try {
1129
+ const { handleStripeDisconnect } = await import("./connectors/stripe.js");
1130
+ const result = handleStripeDisconnect();
1131
+ res.writeHead(result.status, {
1132
+ "Content-Type": result.contentType ?? "application/json",
1133
+ });
1134
+ res.end(result.body);
1135
+ }
1136
+ catch (err) {
1137
+ respond500(res, err);
1138
+ }
1139
+ })();
1140
+ return true;
1141
+ }
1142
+ // ── Google Calendar routes ──────────────────────────────────────
1143
+ if (parsedUrl.pathname === "/connections/google-calendar/auth" &&
1144
+ req.method === "GET") {
1145
+ void (async () => {
1146
+ 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
+ }
1159
+ }
1160
+ catch (err) {
1161
+ respond500(res, err);
1162
+ }
1163
+ })();
1164
+ return true;
1165
+ }
1166
+ if (parsedUrl.pathname === "/connections/google-calendar/callback" &&
1167
+ req.method === "GET") {
1168
+ void (async () => {
1169
+ 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);
1175
+ res.writeHead(result.status, {
1176
+ "Content-Type": result.contentType ?? "application/json",
1177
+ });
1178
+ res.end(result.body);
1179
+ }
1180
+ catch (err) {
1181
+ respond500(res, err);
1182
+ }
1183
+ })();
1184
+ return true;
1185
+ }
1186
+ if (parsedUrl.pathname === "/connections/google-calendar/test" &&
1187
+ req.method === "POST") {
1188
+ void (async () => {
1189
+ try {
1190
+ const { handleCalendarTest } = await import("./connectors/googleCalendar.js");
1191
+ const result = await handleCalendarTest();
1192
+ res.writeHead(result.status, {
1193
+ "Content-Type": result.contentType ?? "application/json",
1194
+ });
1195
+ res.end(result.body);
1196
+ }
1197
+ catch (err) {
1198
+ respond500(res, err);
1199
+ }
1200
+ })();
1201
+ return true;
1202
+ }
1203
+ if (parsedUrl.pathname === "/connections/google-calendar" &&
1204
+ req.method === "DELETE") {
1205
+ void (async () => {
1206
+ try {
1207
+ const { handleCalendarDisconnect } = await import("./connectors/googleCalendar.js");
1208
+ const result = await handleCalendarDisconnect();
1209
+ res.writeHead(result.status, {
1210
+ "Content-Type": result.contentType ?? "application/json",
1211
+ });
1212
+ res.end(result.body);
1213
+ }
1214
+ catch (err) {
1215
+ respond500(res, err);
1216
+ }
1217
+ })();
1218
+ return true;
1219
+ }
1220
+ // ── Google Drive routes ─────────────────────────────────────────
1221
+ if (parsedUrl.pathname === "/connections/google-drive/auth" &&
1222
+ req.method === "GET") {
1223
+ void (async () => {
1224
+ 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
+ }
1237
+ }
1238
+ catch (err) {
1239
+ respond500(res, err);
1240
+ }
1241
+ })();
1242
+ return true;
1243
+ }
1244
+ if (parsedUrl.pathname === "/connections/google-drive/callback" &&
1245
+ req.method === "GET") {
1246
+ void (async () => {
1247
+ 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);
1253
+ res.writeHead(result.status, {
1254
+ "Content-Type": result.contentType ?? "application/json",
1255
+ });
1256
+ res.end(result.body);
1257
+ }
1258
+ catch (err) {
1259
+ respond500(res, err);
1260
+ }
1261
+ })();
1262
+ return true;
1263
+ }
1264
+ if (parsedUrl.pathname === "/connections/google-drive/test" &&
1265
+ req.method === "POST") {
1266
+ void (async () => {
1267
+ try {
1268
+ const { handleDriveTest } = await import("./connectors/googleDrive.js");
1269
+ const result = await handleDriveTest();
1270
+ res.writeHead(result.status, {
1271
+ "Content-Type": result.contentType ?? "application/json",
1272
+ });
1273
+ res.end(result.body);
1274
+ }
1275
+ catch (err) {
1276
+ respond500(res, err);
1277
+ }
1278
+ })();
1279
+ return true;
1280
+ }
1281
+ if (parsedUrl.pathname === "/connections/google-drive" &&
1282
+ req.method === "DELETE") {
1283
+ void (async () => {
1284
+ try {
1285
+ const { handleDriveDisconnect } = await import("./connectors/googleDrive.js");
1286
+ const result = await handleDriveDisconnect();
1287
+ res.writeHead(result.status, {
1288
+ "Content-Type": result.contentType ?? "application/json",
1289
+ });
1290
+ res.end(result.body);
1291
+ }
1292
+ catch (err) {
1293
+ respond500(res, err);
1294
+ }
1295
+ })();
1296
+ return true;
1297
+ }
1298
+ return false;
1299
+ }
1300
+ //# sourceMappingURL=connectorRoutes.js.map