@cat-factory/server 0.6.0

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 (338) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agents/CompositeAgentExecutor.d.ts +39 -0
  3. package/dist/agents/CompositeAgentExecutor.d.ts.map +1 -0
  4. package/dist/agents/CompositeAgentExecutor.js +169 -0
  5. package/dist/agents/CompositeAgentExecutor.js.map +1 -0
  6. package/dist/agents/ContainerAgentExecutor.d.ts +235 -0
  7. package/dist/agents/ContainerAgentExecutor.d.ts.map +1 -0
  8. package/dist/agents/ContainerAgentExecutor.js +825 -0
  9. package/dist/agents/ContainerAgentExecutor.js.map +1 -0
  10. package/dist/agents/ContainerRepoBootstrapper.d.ts +78 -0
  11. package/dist/agents/ContainerRepoBootstrapper.d.ts.map +1 -0
  12. package/dist/agents/ContainerRepoBootstrapper.js +279 -0
  13. package/dist/agents/ContainerRepoBootstrapper.js.map +1 -0
  14. package/dist/agents/ModelRouter.d.ts +69 -0
  15. package/dist/agents/ModelRouter.d.ts.map +1 -0
  16. package/dist/agents/ModelRouter.js +84 -0
  17. package/dist/agents/ModelRouter.js.map +1 -0
  18. package/dist/agents/RunnerJobClient.d.ts +41 -0
  19. package/dist/agents/RunnerJobClient.d.ts.map +1 -0
  20. package/dist/agents/RunnerJobClient.js +43 -0
  21. package/dist/agents/RunnerJobClient.js.map +1 -0
  22. package/dist/agents/modelProviderResolver.d.ts +33 -0
  23. package/dist/agents/modelProviderResolver.d.ts.map +1 -0
  24. package/dist/agents/modelProviderResolver.js +48 -0
  25. package/dist/agents/modelProviderResolver.js.map +1 -0
  26. package/dist/agents/providerCapabilities.d.ts +22 -0
  27. package/dist/agents/providerCapabilities.d.ts.map +1 -0
  28. package/dist/agents/providerCapabilities.js +43 -0
  29. package/dist/agents/providerCapabilities.js.map +1 -0
  30. package/dist/agents/resolveRepoTarget.d.ts +33 -0
  31. package/dist/agents/resolveRepoTarget.d.ts.map +1 -0
  32. package/dist/agents/resolveRepoTarget.js +81 -0
  33. package/dist/agents/resolveRepoTarget.js.map +1 -0
  34. package/dist/app.d.ts +12 -0
  35. package/dist/app.d.ts.map +1 -0
  36. package/dist/app.js +102 -0
  37. package/dist/app.js.map +1 -0
  38. package/dist/auth/GitHubOAuth.d.ts +39 -0
  39. package/dist/auth/GitHubOAuth.d.ts.map +1 -0
  40. package/dist/auth/GitHubOAuth.js +90 -0
  41. package/dist/auth/GitHubOAuth.js.map +1 -0
  42. package/dist/auth/GoogleOAuth.d.ts +35 -0
  43. package/dist/auth/GoogleOAuth.d.ts.map +1 -0
  44. package/dist/auth/GoogleOAuth.js +66 -0
  45. package/dist/auth/GoogleOAuth.js.map +1 -0
  46. package/dist/auth/middleware.d.ts +15 -0
  47. package/dist/auth/middleware.d.ts.map +1 -0
  48. package/dist/auth/middleware.js +63 -0
  49. package/dist/auth/middleware.js.map +1 -0
  50. package/dist/auth/signing.d.ts +50 -0
  51. package/dist/auth/signing.d.ts.map +1 -0
  52. package/dist/auth/signing.js +96 -0
  53. package/dist/auth/signing.js.map +1 -0
  54. package/dist/auth/wsTicket.d.ts +34 -0
  55. package/dist/auth/wsTicket.d.ts.map +1 -0
  56. package/dist/auth/wsTicket.js +50 -0
  57. package/dist/auth/wsTicket.js.map +1 -0
  58. package/dist/config/types.d.ts +294 -0
  59. package/dist/config/types.d.ts.map +1 -0
  60. package/dist/config/types.js +2 -0
  61. package/dist/config/types.js.map +1 -0
  62. package/dist/config/url-safety.d.ts +8 -0
  63. package/dist/config/url-safety.d.ts.map +1 -0
  64. package/dist/config/url-safety.js +11 -0
  65. package/dist/config/url-safety.js.map +1 -0
  66. package/dist/containers/ContainerSessionService.d.ts +67 -0
  67. package/dist/containers/ContainerSessionService.d.ts.map +1 -0
  68. package/dist/containers/ContainerSessionService.js +44 -0
  69. package/dist/containers/ContainerSessionService.js.map +1 -0
  70. package/dist/crypto/WebCryptoPasswordHasher.d.ts +9 -0
  71. package/dist/crypto/WebCryptoPasswordHasher.d.ts.map +1 -0
  72. package/dist/crypto/WebCryptoPasswordHasher.js +67 -0
  73. package/dist/crypto/WebCryptoPasswordHasher.js.map +1 -0
  74. package/dist/crypto/WebCryptoPersonalSecretCipher.d.ts +6 -0
  75. package/dist/crypto/WebCryptoPersonalSecretCipher.d.ts.map +1 -0
  76. package/dist/crypto/WebCryptoPersonalSecretCipher.js +57 -0
  77. package/dist/crypto/WebCryptoPersonalSecretCipher.js.map +1 -0
  78. package/dist/crypto/WebCryptoSecretCipher.d.ts +23 -0
  79. package/dist/crypto/WebCryptoSecretCipher.d.ts.map +1 -0
  80. package/dist/crypto/WebCryptoSecretCipher.js +60 -0
  81. package/dist/crypto/WebCryptoSecretCipher.js.map +1 -0
  82. package/dist/crypto/encoding.d.ts +14 -0
  83. package/dist/crypto/encoding.d.ts.map +1 -0
  84. package/dist/crypto/encoding.js +58 -0
  85. package/dist/crypto/encoding.js.map +1 -0
  86. package/dist/events/FanOutEventPublisher.d.ts +32 -0
  87. package/dist/events/FanOutEventPublisher.d.ts.map +1 -0
  88. package/dist/events/FanOutEventPublisher.js +76 -0
  89. package/dist/events/FanOutEventPublisher.js.map +1 -0
  90. package/dist/events/InAppNotificationChannel.d.ts +20 -0
  91. package/dist/events/InAppNotificationChannel.d.ts.map +1 -0
  92. package/dist/events/InAppNotificationChannel.js +23 -0
  93. package/dist/events/InAppNotificationChannel.js.map +1 -0
  94. package/dist/github/FetchGitHubClient.d.ts +72 -0
  95. package/dist/github/FetchGitHubClient.d.ts.map +1 -0
  96. package/dist/github/FetchGitHubClient.js +485 -0
  97. package/dist/github/FetchGitHubClient.js.map +1 -0
  98. package/dist/github/FetchGitHubProvisioningClient.d.ts +13 -0
  99. package/dist/github/FetchGitHubProvisioningClient.d.ts.map +1 -0
  100. package/dist/github/FetchGitHubProvisioningClient.js +59 -0
  101. package/dist/github/FetchGitHubProvisioningClient.js.map +1 -0
  102. package/dist/github/GitHubAppAuth.d.ts +30 -0
  103. package/dist/github/GitHubAppAuth.d.ts.map +1 -0
  104. package/dist/github/GitHubAppAuth.js +95 -0
  105. package/dist/github/GitHubAppAuth.js.map +1 -0
  106. package/dist/github/GitHubAppRegistry.d.ts +57 -0
  107. package/dist/github/GitHubAppRegistry.d.ts.map +1 -0
  108. package/dist/github/GitHubAppRegistry.js +51 -0
  109. package/dist/github/GitHubAppRegistry.js.map +1 -0
  110. package/dist/github/GitHubCiStatusProvider.d.ts +21 -0
  111. package/dist/github/GitHubCiStatusProvider.d.ts.map +1 -0
  112. package/dist/github/GitHubCiStatusProvider.js +39 -0
  113. package/dist/github/GitHubCiStatusProvider.js.map +1 -0
  114. package/dist/github/GitHubMergeabilityProvider.d.ts +26 -0
  115. package/dist/github/GitHubMergeabilityProvider.d.ts.map +1 -0
  116. package/dist/github/GitHubMergeabilityProvider.js +38 -0
  117. package/dist/github/GitHubMergeabilityProvider.js.map +1 -0
  118. package/dist/github/GitHubPullRequestMerger.d.ts +23 -0
  119. package/dist/github/GitHubPullRequestMerger.d.ts.map +1 -0
  120. package/dist/github/GitHubPullRequestMerger.js +38 -0
  121. package/dist/github/GitHubPullRequestMerger.js.map +1 -0
  122. package/dist/github/WebCryptoWebhookVerifier.d.ts +9 -0
  123. package/dist/github/WebCryptoWebhookVerifier.d.ts.map +1 -0
  124. package/dist/github/WebCryptoWebhookVerifier.js +40 -0
  125. package/dist/github/WebCryptoWebhookVerifier.js.map +1 -0
  126. package/dist/github/ensureWorkBranch.d.ts +26 -0
  127. package/dist/github/ensureWorkBranch.d.ts.map +1 -0
  128. package/dist/github/ensureWorkBranch.js +97 -0
  129. package/dist/github/ensureWorkBranch.js.map +1 -0
  130. package/dist/github/state.d.ts +19 -0
  131. package/dist/github/state.d.ts.map +1 -0
  132. package/dist/github/state.js +55 -0
  133. package/dist/github/state.js.map +1 -0
  134. package/dist/http/authGate.d.ts +21 -0
  135. package/dist/http/authGate.d.ts.map +1 -0
  136. package/dist/http/authGate.js +77 -0
  137. package/dist/http/authGate.js.map +1 -0
  138. package/dist/http/cors.d.ts +13 -0
  139. package/dist/http/cors.d.ts.map +1 -0
  140. package/dist/http/cors.js +30 -0
  141. package/dist/http/cors.js.map +1 -0
  142. package/dist/http/env.d.ts +68 -0
  143. package/dist/http/env.d.ts.map +1 -0
  144. package/dist/http/env.js +2 -0
  145. package/dist/http/env.js.map +1 -0
  146. package/dist/http/errorHandler.d.ts +4 -0
  147. package/dist/http/errorHandler.d.ts.map +1 -0
  148. package/dist/http/errorHandler.js +33 -0
  149. package/dist/http/errorHandler.js.map +1 -0
  150. package/dist/http/params.d.ts +8 -0
  151. package/dist/http/params.d.ts.map +1 -0
  152. package/dist/http/params.js +13 -0
  153. package/dist/http/params.js.map +1 -0
  154. package/dist/http/validation.d.ts +12 -0
  155. package/dist/http/validation.d.ts.map +1 -0
  156. package/dist/http/validation.js +21 -0
  157. package/dist/http/validation.js.map +1 -0
  158. package/dist/index.d.ts +46 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +63 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/modules/accounts/AccountController.d.ts +10 -0
  163. package/dist/modules/accounts/AccountController.d.ts.map +1 -0
  164. package/dist/modules/accounts/AccountController.js +197 -0
  165. package/dist/modules/accounts/AccountController.js.map +1 -0
  166. package/dist/modules/agentRuns/AgentRunController.d.ts +10 -0
  167. package/dist/modules/agentRuns/AgentRunController.d.ts.map +1 -0
  168. package/dist/modules/agentRuns/AgentRunController.js +65 -0
  169. package/dist/modules/agentRuns/AgentRunController.js.map +1 -0
  170. package/dist/modules/auth/AuthController.d.ts +12 -0
  171. package/dist/modules/auth/AuthController.d.ts.map +1 -0
  172. package/dist/modules/auth/AuthController.js +457 -0
  173. package/dist/modules/auth/AuthController.js.map +1 -0
  174. package/dist/modules/board/BoardController.d.ts +8 -0
  175. package/dist/modules/board/BoardController.d.ts.map +1 -0
  176. package/dist/modules/board/BoardController.js +89 -0
  177. package/dist/modules/board/BoardController.js.map +1 -0
  178. package/dist/modules/boardScan/BoardScanController.d.ts +10 -0
  179. package/dist/modules/boardScan/BoardScanController.d.ts.map +1 -0
  180. package/dist/modules/boardScan/BoardScanController.js +53 -0
  181. package/dist/modules/boardScan/BoardScanController.js.map +1 -0
  182. package/dist/modules/bootstrap/BootstrapController.d.ts +10 -0
  183. package/dist/modules/bootstrap/BootstrapController.d.ts.map +1 -0
  184. package/dist/modules/bootstrap/BootstrapController.js +75 -0
  185. package/dist/modules/bootstrap/BootstrapController.js.map +1 -0
  186. package/dist/modules/clarity/ClarityReviewController.d.ts +11 -0
  187. package/dist/modules/clarity/ClarityReviewController.d.ts.map +1 -0
  188. package/dist/modules/clarity/ClarityReviewController.js +97 -0
  189. package/dist/modules/clarity/ClarityReviewController.js.map +1 -0
  190. package/dist/modules/consensus/ConsensusController.d.ts +12 -0
  191. package/dist/modules/consensus/ConsensusController.d.ts.map +1 -0
  192. package/dist/modules/consensus/ConsensusController.js +23 -0
  193. package/dist/modules/consensus/ConsensusController.js.map +1 -0
  194. package/dist/modules/documents/DocumentSourceController.d.ts +10 -0
  195. package/dist/modules/documents/DocumentSourceController.d.ts.map +1 -0
  196. package/dist/modules/documents/DocumentSourceController.js +116 -0
  197. package/dist/modules/documents/DocumentSourceController.js.map +1 -0
  198. package/dist/modules/environments/EnvironmentController.d.ts +10 -0
  199. package/dist/modules/environments/EnvironmentController.d.ts.map +1 -0
  200. package/dist/modules/environments/EnvironmentController.js +95 -0
  201. package/dist/modules/environments/EnvironmentController.js.map +1 -0
  202. package/dist/modules/events/EventsController.d.ts +26 -0
  203. package/dist/modules/events/EventsController.d.ts.map +1 -0
  204. package/dist/modules/events/EventsController.js +56 -0
  205. package/dist/modules/events/EventsController.js.map +1 -0
  206. package/dist/modules/execution/ExecutionController.d.ts +10 -0
  207. package/dist/modules/execution/ExecutionController.d.ts.map +1 -0
  208. package/dist/modules/execution/ExecutionController.js +156 -0
  209. package/dist/modules/execution/ExecutionController.js.map +1 -0
  210. package/dist/modules/fragmentLibrary/FragmentLibraryController.d.ts +14 -0
  211. package/dist/modules/fragmentLibrary/FragmentLibraryController.d.ts.map +1 -0
  212. package/dist/modules/fragmentLibrary/FragmentLibraryController.js +128 -0
  213. package/dist/modules/fragmentLibrary/FragmentLibraryController.js.map +1 -0
  214. package/dist/modules/github/GitHubController.d.ts +12 -0
  215. package/dist/modules/github/GitHubController.d.ts.map +1 -0
  216. package/dist/modules/github/GitHubController.js +234 -0
  217. package/dist/modules/github/GitHubController.js.map +1 -0
  218. package/dist/modules/github/GitHubWebhookController.d.ts +13 -0
  219. package/dist/modules/github/GitHubWebhookController.d.ts.map +1 -0
  220. package/dist/modules/github/GitHubWebhookController.js +74 -0
  221. package/dist/modules/github/GitHubWebhookController.js.map +1 -0
  222. package/dist/modules/llmProxy/LlmProxyController.d.ts +18 -0
  223. package/dist/modules/llmProxy/LlmProxyController.d.ts.map +1 -0
  224. package/dist/modules/llmProxy/LlmProxyController.js +567 -0
  225. package/dist/modules/llmProxy/LlmProxyController.js.map +1 -0
  226. package/dist/modules/localModels/LocalModelEndpointController.d.ts +4 -0
  227. package/dist/modules/localModels/LocalModelEndpointController.d.ts.map +1 -0
  228. package/dist/modules/localModels/LocalModelEndpointController.js +58 -0
  229. package/dist/modules/localModels/LocalModelEndpointController.js.map +1 -0
  230. package/dist/modules/merge/MergePresetController.d.ts +9 -0
  231. package/dist/modules/merge/MergePresetController.d.ts.map +1 -0
  232. package/dist/modules/merge/MergePresetController.js +46 -0
  233. package/dist/modules/merge/MergePresetController.js.map +1 -0
  234. package/dist/modules/modelDefaults/ModelDefaultsController.d.ts +9 -0
  235. package/dist/modules/modelDefaults/ModelDefaultsController.d.ts.map +1 -0
  236. package/dist/modules/modelDefaults/ModelDefaultsController.js +32 -0
  237. package/dist/modules/modelDefaults/ModelDefaultsController.js.map +1 -0
  238. package/dist/modules/models/ModelController.d.ts +11 -0
  239. package/dist/modules/models/ModelController.d.ts.map +1 -0
  240. package/dist/modules/models/ModelController.js +38 -0
  241. package/dist/modules/models/ModelController.js.map +1 -0
  242. package/dist/modules/notifications/NotificationController.d.ts +13 -0
  243. package/dist/modules/notifications/NotificationController.d.ts.map +1 -0
  244. package/dist/modules/notifications/NotificationController.js +67 -0
  245. package/dist/modules/notifications/NotificationController.js.map +1 -0
  246. package/dist/modules/pipelines/PipelineController.d.ts +5 -0
  247. package/dist/modules/pipelines/PipelineController.d.ts.map +1 -0
  248. package/dist/modules/pipelines/PipelineController.js +46 -0
  249. package/dist/modules/pipelines/PipelineController.js.map +1 -0
  250. package/dist/modules/promptFragments/PromptFragmentController.d.ts +11 -0
  251. package/dist/modules/promptFragments/PromptFragmentController.d.ts.map +1 -0
  252. package/dist/modules/promptFragments/PromptFragmentController.js +18 -0
  253. package/dist/modules/promptFragments/PromptFragmentController.js.map +1 -0
  254. package/dist/modules/providers/ApiKeyController.d.ts +13 -0
  255. package/dist/modules/providers/ApiKeyController.d.ts.map +1 -0
  256. package/dist/modules/providers/ApiKeyController.js +98 -0
  257. package/dist/modules/providers/ApiKeyController.js.map +1 -0
  258. package/dist/modules/providers/PersonalSubscriptionController.d.ts +4 -0
  259. package/dist/modules/providers/PersonalSubscriptionController.d.ts.map +1 -0
  260. package/dist/modules/providers/PersonalSubscriptionController.js +48 -0
  261. package/dist/modules/providers/PersonalSubscriptionController.js.map +1 -0
  262. package/dist/modules/providers/VendorCredentialController.d.ts +4 -0
  263. package/dist/modules/providers/VendorCredentialController.d.ts.map +1 -0
  264. package/dist/modules/providers/VendorCredentialController.js +55 -0
  265. package/dist/modules/providers/VendorCredentialController.js.map +1 -0
  266. package/dist/modules/providers/personalCredentialGate.d.ts +34 -0
  267. package/dist/modules/providers/personalCredentialGate.d.ts.map +1 -0
  268. package/dist/modules/providers/personalCredentialGate.js +106 -0
  269. package/dist/modules/providers/personalCredentialGate.js.map +1 -0
  270. package/dist/modules/recurring/RecurringPipelineController.d.ts +8 -0
  271. package/dist/modules/recurring/RecurringPipelineController.d.ts.map +1 -0
  272. package/dist/modules/recurring/RecurringPipelineController.js +58 -0
  273. package/dist/modules/recurring/RecurringPipelineController.js.map +1 -0
  274. package/dist/modules/recurring/TrackerSettingsController.d.ts +8 -0
  275. package/dist/modules/recurring/TrackerSettingsController.d.ts.map +1 -0
  276. package/dist/modules/recurring/TrackerSettingsController.js +30 -0
  277. package/dist/modules/recurring/TrackerSettingsController.js.map +1 -0
  278. package/dist/modules/releaseHealth/ReleaseHealthController.d.ts +9 -0
  279. package/dist/modules/releaseHealth/ReleaseHealthController.d.ts.map +1 -0
  280. package/dist/modules/releaseHealth/ReleaseHealthController.js +58 -0
  281. package/dist/modules/releaseHealth/ReleaseHealthController.js.map +1 -0
  282. package/dist/modules/requirements/RequirementReviewController.d.ts +12 -0
  283. package/dist/modules/requirements/RequirementReviewController.d.ts.map +1 -0
  284. package/dist/modules/requirements/RequirementReviewController.js +107 -0
  285. package/dist/modules/requirements/RequirementReviewController.js.map +1 -0
  286. package/dist/modules/runners/RunnerPoolController.d.ts +10 -0
  287. package/dist/modules/runners/RunnerPoolController.d.ts.map +1 -0
  288. package/dist/modules/runners/RunnerPoolController.js +52 -0
  289. package/dist/modules/runners/RunnerPoolController.js.map +1 -0
  290. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.d.ts +9 -0
  291. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.d.ts.map +1 -0
  292. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js +32 -0
  293. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js.map +1 -0
  294. package/dist/modules/services/ServiceMountController.d.ts +11 -0
  295. package/dist/modules/services/ServiceMountController.d.ts.map +1 -0
  296. package/dist/modules/services/ServiceMountController.js +64 -0
  297. package/dist/modules/services/ServiceMountController.js.map +1 -0
  298. package/dist/modules/settings/WorkspaceSettingsController.d.ts +9 -0
  299. package/dist/modules/settings/WorkspaceSettingsController.d.ts.map +1 -0
  300. package/dist/modules/settings/WorkspaceSettingsController.js +32 -0
  301. package/dist/modules/settings/WorkspaceSettingsController.js.map +1 -0
  302. package/dist/modules/slack/SlackController.d.ts +17 -0
  303. package/dist/modules/slack/SlackController.d.ts.map +1 -0
  304. package/dist/modules/slack/SlackController.js +135 -0
  305. package/dist/modules/slack/SlackController.js.map +1 -0
  306. package/dist/modules/tasks/TaskSourceController.d.ts +9 -0
  307. package/dist/modules/tasks/TaskSourceController.d.ts.map +1 -0
  308. package/dist/modules/tasks/TaskSourceController.js +103 -0
  309. package/dist/modules/tasks/TaskSourceController.js.map +1 -0
  310. package/dist/modules/webSearch/WebSearchProxyController.d.ts +4 -0
  311. package/dist/modules/webSearch/WebSearchProxyController.d.ts.map +1 -0
  312. package/dist/modules/webSearch/WebSearchProxyController.js +78 -0
  313. package/dist/modules/webSearch/WebSearchProxyController.js.map +1 -0
  314. package/dist/modules/webSearch/upstreams.d.ts +50 -0
  315. package/dist/modules/webSearch/upstreams.d.ts.map +1 -0
  316. package/dist/modules/webSearch/upstreams.js +107 -0
  317. package/dist/modules/webSearch/upstreams.js.map +1 -0
  318. package/dist/modules/workspaces/WorkspaceController.d.ts +5 -0
  319. package/dist/modules/workspaces/WorkspaceController.d.ts.map +1 -0
  320. package/dist/modules/workspaces/WorkspaceController.js +167 -0
  321. package/dist/modules/workspaces/WorkspaceController.js.map +1 -0
  322. package/dist/observability/logger.d.ts +9 -0
  323. package/dist/observability/logger.d.ts.map +1 -0
  324. package/dist/observability/logger.js +39 -0
  325. package/dist/observability/logger.js.map +1 -0
  326. package/dist/persistence/mappers.d.ts +101 -0
  327. package/dist/persistence/mappers.d.ts.map +1 -0
  328. package/dist/persistence/mappers.js +260 -0
  329. package/dist/persistence/mappers.js.map +1 -0
  330. package/dist/runtime/escalateNotifications.d.ts +12 -0
  331. package/dist/runtime/escalateNotifications.d.ts.map +1 -0
  332. package/dist/runtime/escalateNotifications.js +25 -0
  333. package/dist/runtime/escalateNotifications.js.map +1 -0
  334. package/dist/runtime/gateways.d.ts +159 -0
  335. package/dist/runtime/gateways.d.ts.map +1 -0
  336. package/dist/runtime/gateways.js +2 -0
  337. package/dist/runtime/gateways.js.map +1 -0
  338. package/package.json +44 -0
@@ -0,0 +1,234 @@
1
+ import { commentSchema, commitFilesSchema, createBranchSchema, createRepoRequestSchema, linkReposSchema, mergePullRequestSchema, openPullRequestSchema, resyncRequestSchema, setRepoMonorepoSchema, } from '@cat-factory/contracts';
2
+ import { Hono } from 'hono';
3
+ import * as v from 'valibot';
4
+ import { StateSigner } from '../../github/state.js';
5
+ import { param } from '../../http/params.js';
6
+ import { jsonBody } from '../../http/validation.js';
7
+ const connectSchema = v.object({ installationId: v.number() });
8
+ /** Resolve the GitHub module or send a 503, returning null when unconfigured. */
9
+ function requireGitHub(c) {
10
+ return c.get('container').github ?? null;
11
+ }
12
+ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'GitHub integration is not configured' } }, 503);
13
+ /**
14
+ * Workspace-scoped GitHub endpoints: connection management, projection reads
15
+ * (served from the local DB — fast and rate-limit-free), resync triggers, and repo
16
+ * writes. Mounted under `/workspaces/:workspaceId`. Runtime-neutral: the async resync
17
+ * paths (full backfill, single-repo resync) are delegated to the facade's GitHub
18
+ * gateways, which schedule out of band (Cloudflare Workflow/Queue or pg-boss) or
19
+ * report that the caller should run them inline.
20
+ */
21
+ export function githubController() {
22
+ const app = new Hono();
23
+ // ---- connection ---------------------------------------------------------
24
+ // The URL the frontend should redirect to so a workspace owner can install
25
+ // the App; carries an HMAC-signed `state` binding the install to this workspace.
26
+ app.get('/github/install-url', async (c) => {
27
+ const github = requireGitHub(c);
28
+ if (!github)
29
+ return unavailable(c);
30
+ const config = c.get('container').config.github;
31
+ const signer = new StateSigner(config.webhookSecret);
32
+ // Bind the install to this workspace AND the signed-in user, with a short
33
+ // expiry. (The per-workspace authorization middleware has already confirmed
34
+ // the caller owns :workspaceId before this handler runs.)
35
+ const state = await signer.sign({
36
+ workspaceId: param(c, 'workspaceId'),
37
+ userId: c.get('user')?.id ?? null,
38
+ exp: Date.now() + 10 * 60 * 1000,
39
+ });
40
+ const url = `https://github.com/apps/${config.appSlug}/installations/new?state=${encodeURIComponent(state)}`;
41
+ return c.json({ url });
42
+ });
43
+ app.get('/github/connection', async (c) => {
44
+ const github = requireGitHub(c);
45
+ if (!github)
46
+ return unavailable(c);
47
+ const connection = await github.installationService.getConnection(param(c, 'workspaceId'));
48
+ return c.json({ connection });
49
+ });
50
+ // Discover the App's installations so the UI can offer a pick instead of a
51
+ // manually typed installation id (the caller already owns :workspaceId).
52
+ app.get('/github/installations', async (c) => {
53
+ const github = requireGitHub(c);
54
+ if (!github)
55
+ return unavailable(c);
56
+ const installations = await github.installationService.listAvailableInstallations(param(c, 'workspaceId'));
57
+ return c.json({ installations });
58
+ });
59
+ // Programmatic bind (the browser flow uses /github/setup/callback instead).
60
+ // Used by the "discover & link" picker and connect-by-id. Binds the installation
61
+ // to the workspace's account; repos are then linked explicitly (see below), so
62
+ // there is no whole-installation backfill on connect.
63
+ app.post('/github/connect', jsonBody(connectSchema), async (c) => {
64
+ const github = requireGitHub(c);
65
+ if (!github)
66
+ return unavailable(c);
67
+ const workspaceId = param(c, 'workspaceId');
68
+ const { installationId } = c.req.valid('json');
69
+ const connection = await github.installationService.connect(workspaceId, installationId);
70
+ return c.json(connection, 201);
71
+ });
72
+ // The repos the connected installation can access, annotated with whether this
73
+ // workspace links each. Drives the per-workspace repo picker.
74
+ app.get('/github/available-repos', async (c) => {
75
+ const github = requireGitHub(c);
76
+ if (!github)
77
+ return unavailable(c);
78
+ return c.json(await github.syncService.listAvailableRepos(param(c, 'workspaceId')));
79
+ });
80
+ // Set the exact set of repos this workspace links. Projects the selection,
81
+ // tombstones the rest, and deep-syncs the linked repos.
82
+ app.put('/github/repos', jsonBody(linkReposSchema), async (c) => {
83
+ const github = requireGitHub(c);
84
+ if (!github)
85
+ return unavailable(c);
86
+ const repos = await github.syncService.setLinkedRepos(param(c, 'workspaceId'), c.req.valid('json').repoGithubIds);
87
+ return c.json(repos);
88
+ });
89
+ // Flag (or unflag) a linked repo as a monorepo: the board then lets several service
90
+ // frames target the same repo, each pinned to a subdirectory (the picker below).
91
+ app.patch('/github/repos/:repoGithubId', jsonBody(setRepoMonorepoSchema), async (c) => {
92
+ const github = requireGitHub(c);
93
+ if (!github)
94
+ return unavailable(c);
95
+ const repo = await github.syncService.setRepoMonorepo(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), c.req.valid('json').isMonorepo);
96
+ return c.json(repo);
97
+ });
98
+ // Browse one level of a (monorepo) repo's tree so the service picker can pin a
99
+ // service to a subdirectory. `path` ('' = root) is the directory to list.
100
+ app.get('/github/repos/:repoGithubId/tree', async (c) => {
101
+ const github = requireGitHub(c);
102
+ if (!github)
103
+ return unavailable(c);
104
+ return c.json(await github.syncService.listRepoDirectory(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), c.req.query('path') ?? ''));
105
+ });
106
+ app.delete('/github/connection', async (c) => {
107
+ const github = requireGitHub(c);
108
+ if (!github)
109
+ return unavailable(c);
110
+ await github.installationService.disconnect(param(c, 'workspaceId'));
111
+ return c.body(null, 204);
112
+ });
113
+ // ---- resync -------------------------------------------------------------
114
+ app.post('/github/resync', jsonBody(resyncRequestSchema), async (c) => {
115
+ const github = requireGitHub(c);
116
+ if (!github)
117
+ return unavailable(c);
118
+ const workspaceId = param(c, 'workspaceId');
119
+ const { repoGithubId, full } = c.req.valid('json');
120
+ const { gateways } = c.get('container');
121
+ if (full) {
122
+ const installation = await github.installationService.requireInstallation(workspaceId);
123
+ const scheduled = await gateways.githubBackfill.scheduleBackfill(installation.installationId);
124
+ if (scheduled)
125
+ return c.json({ status: 'backfill_started' }, 202);
126
+ await github.syncService.backfillInstallation(installation.installationId);
127
+ return c.json({ status: 'backfilled' });
128
+ }
129
+ // Incremental: a single repo (optionally out of band) or the whole workspace.
130
+ if (repoGithubId !== undefined) {
131
+ const queued = await gateways.githubWebhook.queueRepoResync(workspaceId, repoGithubId);
132
+ if (queued)
133
+ return c.json({ status: 'queued' }, 202);
134
+ await github.syncService.syncRepoById(workspaceId, repoGithubId);
135
+ return c.json({ status: 'synced' });
136
+ }
137
+ await github.syncService.resyncWorkspace(workspaceId);
138
+ return c.json({ status: 'synced' });
139
+ });
140
+ // ---- projection reads ---------------------------------------------------
141
+ app.get('/github/repos', async (c) => {
142
+ const github = requireGitHub(c);
143
+ if (!github)
144
+ return unavailable(c);
145
+ return c.json(await github.service.listRepos(param(c, 'workspaceId')));
146
+ });
147
+ app.get('/github/repos/:repoGithubId/branches', async (c) => {
148
+ const github = requireGitHub(c);
149
+ if (!github)
150
+ return unavailable(c);
151
+ return c.json(await github.service.listBranches(param(c, 'workspaceId'), Number(param(c, 'repoGithubId'))));
152
+ });
153
+ app.get('/github/pulls', async (c) => {
154
+ const github = requireGitHub(c);
155
+ if (!github)
156
+ return unavailable(c);
157
+ return c.json(await github.service.listPullRequests(param(c, 'workspaceId')));
158
+ });
159
+ app.get('/github/issues', async (c) => {
160
+ const github = requireGitHub(c);
161
+ if (!github)
162
+ return unavailable(c);
163
+ return c.json(await github.service.listIssues(param(c, 'workspaceId')));
164
+ });
165
+ // ---- writes -------------------------------------------------------------
166
+ // Programmatically create a repository under the connected account (privileged
167
+ // App tier, ADR 0005). 503 when no privileged App is configured; 409 when the
168
+ // account isn't actually privileged, so the caller can fall back.
169
+ app.post('/github/repos', jsonBody(createRepoRequestSchema), async (c) => {
170
+ const github = requireGitHub(c);
171
+ if (!github)
172
+ return unavailable(c);
173
+ if (!github.provisioningService) {
174
+ return c.json({ error: { code: 'unavailable', message: 'Direct repo creation is not configured' } }, 503);
175
+ }
176
+ const workspaceId = param(c, 'workspaceId');
177
+ const { name, private: isPrivate, description } = c.req.valid('json');
178
+ // Owner = the connected installation's account (throws 409 when unconnected).
179
+ const installation = await github.installationService.requireInstallation(workspaceId);
180
+ const result = await github.provisioningService.provision(installation.installationId, {
181
+ org: installation.accountLogin,
182
+ name,
183
+ private: isPrivate,
184
+ description,
185
+ });
186
+ if (result.status === 'delegated') {
187
+ return c.json({
188
+ error: {
189
+ code: 'not_privileged',
190
+ message: `cat-factory can't create repositories under ${installation.accountLogin} (${result.reason}).`,
191
+ },
192
+ }, 409);
193
+ }
194
+ return c.json(result.repo, 201);
195
+ });
196
+ app.post('/github/repos/:repoGithubId/branches', jsonBody(createBranchSchema), async (c) => {
197
+ const github = requireGitHub(c);
198
+ if (!github)
199
+ return unavailable(c);
200
+ const body = c.req.valid('json');
201
+ const branch = await github.service.createBranch(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), body.name, body.fromSha);
202
+ return c.json(branch, 201);
203
+ });
204
+ app.post('/github/repos/:repoGithubId/commits', jsonBody(commitFilesSchema), async (c) => {
205
+ const github = requireGitHub(c);
206
+ if (!github)
207
+ return unavailable(c);
208
+ const result = await github.service.commitFiles(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), c.req.valid('json'));
209
+ return c.json(result, 201);
210
+ });
211
+ app.post('/github/repos/:repoGithubId/pulls', jsonBody(openPullRequestSchema), async (c) => {
212
+ const github = requireGitHub(c);
213
+ if (!github)
214
+ return unavailable(c);
215
+ const pr = await github.service.openPullRequest(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), c.req.valid('json'));
216
+ return c.json(pr, 201);
217
+ });
218
+ app.put('/github/repos/:repoGithubId/pulls/:number/merge', jsonBody(mergePullRequestSchema), async (c) => {
219
+ const github = requireGitHub(c);
220
+ if (!github)
221
+ return unavailable(c);
222
+ await github.service.mergePullRequest(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), Number(param(c, 'number')), c.req.valid('json'));
223
+ return c.body(null, 204);
224
+ });
225
+ app.post('/github/repos/:repoGithubId/issues/:number/comments', jsonBody(commentSchema), async (c) => {
226
+ const github = requireGitHub(c);
227
+ if (!github)
228
+ return unavailable(c);
229
+ await github.service.comment(param(c, 'workspaceId'), Number(param(c, 'repoGithubId')), Number(param(c, 'number')), c.req.valid('json').body);
230
+ return c.body(null, 204);
231
+ });
232
+ return app;
233
+ }
234
+ //# sourceMappingURL=GitHubController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubController.js","sourceRoot":"","sources":["../../../src/modules/github/GitHubController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../../http/env.js';
3
+ /**
4
+ * Public GitHub-facing endpoints (NOT under /workspaces, since GitHub calls
5
+ * them): the webhook receiver and the App setup callback. Mounted at `/github`.
6
+ *
7
+ * The webhook receiver verifies the HMAC signature over the *raw* body before
8
+ * anything else, acks fast by handing the delivery to the facade's webhook-ingest
9
+ * gateway for async projection (falling back to inline handling when no async
10
+ * consumer is wired, e.g. local dev), and never blocks GitHub on projection work.
11
+ */
12
+ export declare function githubWebhookController(): Hono<AppEnv>;
13
+ //# sourceMappingURL=GitHubWebhookController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubWebhookController.d.ts","sourceRoot":"","sources":["../../../src/modules/github/GitHubWebhookController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAAC,MAAM,CAAC,CAuEtD"}
@@ -0,0 +1,74 @@
1
+ import { Hono } from 'hono';
2
+ import { StateSigner } from '../../github/state.js';
3
+ /**
4
+ * Public GitHub-facing endpoints (NOT under /workspaces, since GitHub calls
5
+ * them): the webhook receiver and the App setup callback. Mounted at `/github`.
6
+ *
7
+ * The webhook receiver verifies the HMAC signature over the *raw* body before
8
+ * anything else, acks fast by handing the delivery to the facade's webhook-ingest
9
+ * gateway for async projection (falling back to inline handling when no async
10
+ * consumer is wired, e.g. local dev), and never blocks GitHub on projection work.
11
+ */
12
+ export function githubWebhookController() {
13
+ const app = new Hono();
14
+ app.post('/webhooks', async (c) => {
15
+ const github = c.get('container').github;
16
+ if (!github)
17
+ return c.json({ error: { code: 'unavailable', message: 'GitHub not configured' } }, 503);
18
+ // Verify against the raw bytes before parsing.
19
+ const raw = await c.req.arrayBuffer();
20
+ const ok = await github.webhookVerifier.verify(raw, c.req.header('x-hub-signature-256') ?? null);
21
+ if (!ok) {
22
+ return c.json({ error: { code: 'unauthorized', message: 'Invalid signature' } }, 401);
23
+ }
24
+ const eventName = c.req.header('x-github-event') ?? '';
25
+ let payload;
26
+ try {
27
+ payload = JSON.parse(new TextDecoder().decode(raw));
28
+ }
29
+ catch {
30
+ return c.json({ error: { code: 'validation', message: 'Invalid JSON body' } }, 400);
31
+ }
32
+ // Hand off for async projection; if no async consumer is wired, apply inline so
33
+ // local/dev still works.
34
+ const queued = await c
35
+ .get('container')
36
+ .gateways.githubWebhook.enqueueWebhook(eventName, payload);
37
+ if (!queued)
38
+ await github.webhookService.handle(eventName, payload);
39
+ return c.body(null, 202);
40
+ });
41
+ // GitHub redirects here after an installation. On a fresh install we carry the
42
+ // HMAC-signed `state` (the workspace id we issued) that binds the installation
43
+ // to that workspace. But GitHub also redirects here for STATELESS actions —
44
+ // notably a repo-access change saved straight from the App's installation
45
+ // settings page (`setup_action=update`), which carries no `state`. We can't
46
+ // bind a NEW installation without a signed workspace id, but if it's already
47
+ // bound we recover the workspace and treat the redirect as a resync — so newly
48
+ // granted repos get picked up instead of dead-ending on "invalid state".
49
+ app.get('/setup/callback', async (c) => {
50
+ const container = c.get('container');
51
+ const github = container.github;
52
+ if (!github)
53
+ return c.json({ error: { code: 'unavailable', message: 'GitHub not configured' } }, 503);
54
+ const installationId = Number(c.req.query('installation_id'));
55
+ if (!Number.isFinite(installationId)) {
56
+ return c.json({ error: { code: 'validation', message: 'Missing installation_id' } }, 400);
57
+ }
58
+ const signer = new StateSigner(container.config.github.webhookSecret);
59
+ const state = await signer.verify(c.req.query('state') ?? null);
60
+ // No (valid) state → only proceed if this installation is already bound;
61
+ // binding a brand-new installation still requires a signed state.
62
+ const workspaceId = state?.workspaceId ?? (await github.installationService.resolveBoundWorkspace(installationId));
63
+ if (!workspaceId) {
64
+ return c.json({ error: { code: 'unauthorized', message: 'Invalid or expired state' } }, 401);
65
+ }
66
+ await github.installationService.connect(workspaceId, installationId);
67
+ // Repos are linked explicitly per workspace after connecting, so there is no
68
+ // whole-installation backfill here — the user picks which repos this board
69
+ // tracks, which projects and syncs just those.
70
+ return c.redirect(container.config.github.setupRedirectUrl);
71
+ });
72
+ return app;
73
+ }
74
+ //# sourceMappingURL=GitHubWebhookController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubWebhookController.js","sourceRoot":"","sources":["../../../src/modules/github/GitHubWebhookController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../../http/env.js';
3
+ /**
4
+ * The output-token ceiling for a workers-ai container call: Pi's asked value floored to
5
+ * {@link PI_MIN_OUTPUT_TOKENS}, then capped so input + output fits the model's context
6
+ * window (when the catalog declares one). A small-window model rejects the WHOLE request
7
+ * (Workers AI error 8007 → HTTP 502) when the output request alone fills the window, so we
8
+ * reserve room for the prompt: estimate its input-token cost from the serialized
9
+ * prompt + tool definitions (`inputChars`) and hold that back. The cap only NARROWS the
10
+ * floor; an unknown window or ample room leaves it untouched. Pure + exported for testing.
11
+ */
12
+ export declare function workersAiOutputCeiling(args: {
13
+ asked: number;
14
+ contextWindow: number | undefined;
15
+ inputChars: number;
16
+ }): number;
17
+ export declare function llmProxyController(): Hono<AppEnv>;
18
+ //# sourceMappingURL=LlmProxyController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LlmProxyController.d.ts","sourceRoot":"","sources":["../../../src/modules/llmProxy/LlmProxyController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAK3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AA+C/C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,MAAM,CAQT;AAwBD,wBAAgB,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,CAybjD"}