@shepai/cli 1.116.0-pr362.c0ee15c → 1.116.0-pr367.8e10c48

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 (342) hide show
  1. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  2. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.d.ts +41 -0
  4. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.d.ts.map +1 -0
  5. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.js +14 -0
  6. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.d.ts +65 -0
  7. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.js +10 -0
  9. package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js +0 -5
  11. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -3
  12. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +2 -30
  14. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/di/container.js +14 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +1 -6
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +1 -6
  20. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +1 -6
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +1 -17
  24. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +0 -12
  26. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.d.ts +36 -0
  27. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.js +148 -0
  29. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.d.ts +75 -0
  30. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.d.ts.map +1 -0
  31. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.js +372 -0
  32. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.d.ts +82 -0
  33. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.d.ts.map +1 -0
  34. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.js +192 -0
  35. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  36. package/dist/src/presentation/cli/commands/ui.command.js +15 -0
  37. package/dist/src/presentation/web/app/actions/load-webhook-status.d.ts +3 -0
  38. package/dist/src/presentation/web/app/actions/load-webhook-status.d.ts.map +1 -0
  39. package/dist/src/presentation/web/app/actions/load-webhook-status.js +19 -0
  40. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.d.ts +9 -0
  41. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.d.ts.map +1 -0
  42. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.js +27 -0
  43. package/dist/src/presentation/web/app/api/webhooks/github/route.d.ts +17 -0
  44. package/dist/src/presentation/web/app/api/webhooks/github/route.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/api/webhooks/github/route.js +70 -0
  46. package/dist/src/presentation/web/app/api/webhooks/status/route.d.ts +9 -0
  47. package/dist/src/presentation/web/app/api/webhooks/status/route.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/api/webhooks/status/route.js +26 -0
  49. package/dist/src/presentation/web/app/webhooks/page.d.ts +4 -0
  50. package/dist/src/presentation/web/app/webhooks/page.d.ts.map +1 -0
  51. package/dist/src/presentation/web/app/webhooks/page.js +9 -0
  52. package/dist/src/presentation/web/components/features/webhooks/types.d.ts +32 -0
  53. package/dist/src/presentation/web/components/features/webhooks/types.d.ts.map +1 -0
  54. package/dist/src/presentation/web/components/features/webhooks/types.js +1 -0
  55. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.d.ts +6 -0
  56. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.d.ts.map +1 -0
  57. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.js +38 -0
  58. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.d.ts +9 -0
  59. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.d.ts.map +1 -0
  60. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.js +69 -0
  61. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.d.ts +7 -0
  62. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.d.ts.map +1 -0
  63. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.js +11 -0
  64. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.d.ts +9 -0
  65. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.d.ts.map +1 -0
  66. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.js +31 -0
  67. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.d.ts +6 -0
  68. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.d.ts.map +1 -0
  69. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.js +21 -0
  70. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.d.ts +9 -0
  71. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.d.ts.map +1 -0
  72. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.js +56 -0
  73. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.d.ts +6 -0
  74. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.d.ts.map +1 -0
  75. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.js +39 -0
  76. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.d.ts +8 -0
  77. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.js +59 -0
  79. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  81. package/dist/src/presentation/web/dev-server.js +20 -0
  82. package/dist/tsconfig.build.tsbuildinfo +1 -1
  83. package/package.json +1 -1
  84. package/web/.next/BUILD_ID +1 -1
  85. package/web/.next/app-path-routes-manifest.json +5 -1
  86. package/web/.next/build-manifest.json +6 -6
  87. package/web/.next/fallback-build-manifest.json +2 -2
  88. package/web/.next/prerender-manifest.json +3 -3
  89. package/web/.next/required-server-files.js +1 -1
  90. package/web/.next/required-server-files.json +1 -1
  91. package/web/.next/routes-manifest.json +24 -0
  92. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
  93. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  94. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  97. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  98. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +26 -26
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
  105. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  106. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
  109. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  110. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  113. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  114. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
  117. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +26 -26
  118. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
  121. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  122. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
  125. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  126. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  129. package/web/.next/server/app/_global-error.html +2 -2
  130. package/web/.next/server/app/_global-error.rsc +1 -1
  131. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  132. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  137. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  138. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  139. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  141. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  142. package/web/.next/server/app/api/webhooks/deliveries/route/app-paths-manifest.json +3 -0
  143. package/web/.next/server/app/api/webhooks/deliveries/route/build-manifest.json +11 -0
  144. package/web/.next/server/app/api/webhooks/deliveries/route/server-reference-manifest.json +4 -0
  145. package/web/.next/server/app/api/webhooks/deliveries/route.js +6 -0
  146. package/web/.next/server/app/api/webhooks/deliveries/route.js.map +5 -0
  147. package/web/.next/server/app/api/webhooks/deliveries/route.js.nft.json +1 -0
  148. package/web/.next/server/app/api/webhooks/deliveries/route_client-reference-manifest.js +2 -0
  149. package/web/.next/server/app/api/webhooks/github/route/app-paths-manifest.json +3 -0
  150. package/web/.next/server/app/api/webhooks/github/route/build-manifest.json +11 -0
  151. package/web/.next/server/app/api/webhooks/github/route/server-reference-manifest.json +4 -0
  152. package/web/.next/server/app/api/webhooks/github/route.js +6 -0
  153. package/web/.next/server/app/api/webhooks/github/route.js.map +5 -0
  154. package/web/.next/server/app/api/webhooks/github/route.js.nft.json +1 -0
  155. package/web/.next/server/app/api/webhooks/github/route_client-reference-manifest.js +2 -0
  156. package/web/.next/server/app/api/webhooks/status/route/app-paths-manifest.json +3 -0
  157. package/web/.next/server/app/api/webhooks/status/route/build-manifest.json +11 -0
  158. package/web/.next/server/app/api/webhooks/status/route/server-reference-manifest.json +4 -0
  159. package/web/.next/server/app/api/webhooks/status/route.js +6 -0
  160. package/web/.next/server/app/api/webhooks/status/route.js.map +5 -0
  161. package/web/.next/server/app/api/webhooks/status/route.js.nft.json +1 -0
  162. package/web/.next/server/app/api/webhooks/status/route_client-reference-manifest.js +2 -0
  163. package/web/.next/server/app/settings/page/build-manifest.json +4 -4
  164. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  165. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  166. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/skills/page/build-manifest.json +4 -4
  168. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  169. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  170. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/tools/page/build-manifest.json +4 -4
  172. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  173. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  174. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  176. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  177. package/web/.next/server/app/version/page.js.nft.json +1 -1
  178. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app/webhooks/page/app-paths-manifest.json +3 -0
  180. package/web/.next/server/app/webhooks/page/build-manifest.json +18 -0
  181. package/web/.next/server/app/webhooks/page/next-font-manifest.json +6 -0
  182. package/web/.next/server/app/webhooks/page/react-loadable-manifest.json +1 -0
  183. package/web/.next/server/app/webhooks/page/server-reference-manifest.json +35 -0
  184. package/web/.next/server/app/webhooks/page.js +16 -0
  185. package/web/.next/server/app/webhooks/page.js.map +5 -0
  186. package/web/.next/server/app/webhooks/page.js.nft.json +1 -0
  187. package/web/.next/server/app/webhooks/page_client-reference-manifest.js +2 -0
  188. package/web/.next/server/app-paths-manifest.json +5 -1
  189. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_deliveries_route_actions_d9e34c8d.js +3 -0
  190. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_deliveries_route_actions_d9e34c8d.js.map +1 -0
  191. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_github_route_actions_1b0d0c38.js +3 -0
  192. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_github_route_actions_1b0d0c38.js.map +1 -0
  193. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_status_route_actions_1a0d86a1.js +3 -0
  194. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_status_route_actions_1a0d86a1.js.map +1 -0
  195. package/web/.next/server/chunks/[root-of-the-server]__15e5d45c._.js +3 -0
  196. package/web/.next/server/chunks/[root-of-the-server]__15e5d45c._.js.map +1 -0
  197. package/web/.next/server/chunks/[root-of-the-server]__23be381e._.js +3 -0
  198. package/web/.next/server/chunks/[root-of-the-server]__23be381e._.js.map +1 -0
  199. package/web/.next/server/chunks/[root-of-the-server]__9fc760c0._.js +3 -0
  200. package/web/.next/server/chunks/[root-of-the-server]__9fc760c0._.js.map +1 -0
  201. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  202. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  203. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_activity_22f9667f.js +3 -0
  205. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_activity_22f9667f.js.map +1 -0
  206. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
  207. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
  209. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d847b7b._.js +3 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d847b7b._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__87a7ae30._.js +3 -0
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__87a7ae30._.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__920dccd5._.js +4 -0
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__920dccd5._.js.map +1 -0
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__a42f5a88._.js +3 -0
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__a42f5a88._.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  237. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/_26b2c311._.js +3 -0
  239. package/web/.next/server/chunks/ssr/_26b2c311._.js.map +1 -0
  240. package/web/.next/server/chunks/ssr/_27dd06aa._.js +3 -0
  241. package/web/.next/server/chunks/ssr/_27dd06aa._.js.map +1 -0
  242. package/web/.next/server/chunks/ssr/_28862ed0._.js +3 -0
  243. package/web/.next/server/chunks/ssr/{_871373f7._.js.map → _28862ed0._.js.map} +1 -1
  244. package/web/.next/server/chunks/ssr/{_37f9b23b._.js → _383572e0._.js} +2 -2
  245. package/web/.next/server/chunks/ssr/_383572e0._.js.map +1 -0
  246. package/web/.next/server/chunks/ssr/_809c53f6._.js +9 -0
  247. package/web/.next/server/chunks/ssr/_809c53f6._.js.map +1 -0
  248. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  249. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/_9eea4c51._.js +3 -0
  251. package/web/.next/server/chunks/ssr/_9eea4c51._.js.map +1 -0
  252. package/web/.next/server/chunks/ssr/_a4899a76._.js +3 -0
  253. package/web/.next/server/chunks/ssr/_a4899a76._.js.map +1 -0
  254. package/web/.next/server/chunks/ssr/_b7eb93fc._.js +4 -0
  255. package/web/.next/server/chunks/ssr/_b7eb93fc._.js.map +1 -0
  256. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  257. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  258. package/web/.next/server/chunks/ssr/_e0a01382._.js +3 -0
  259. package/web/.next/server/chunks/ssr/_e0a01382._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/_f8b36e2c._.js +3 -0
  261. package/web/.next/server/chunks/ssr/_f8b36e2c._.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  263. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  264. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_webhooks_webhooks-page-client_tsx_b2662ea3._.js +3 -0
  265. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_webhooks_webhooks-page-client_tsx_b2662ea3._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/{_1bb131c4._.js → node_modules__pnpm_747b43ac._.js} +2 -2
  267. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
  275. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
  283. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +1 -1
  284. package/web/.next/server/middleware-build-manifest.js +4 -4
  285. package/web/.next/server/pages/500.html +2 -2
  286. package/web/.next/server/server-reference-manifest.js +1 -1
  287. package/web/.next/server/server-reference-manifest.json +54 -32
  288. package/web/.next/static/chunks/06b948216df083c1.js +1 -0
  289. package/web/.next/static/chunks/2bdc11361b8f2602.js +1 -0
  290. package/web/.next/static/chunks/31f35710932542ef.js +1 -0
  291. package/web/.next/static/chunks/{4e46e9e2ec8bcce2.js → 385710675a1d06c9.js} +1 -1
  292. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +1 -0
  293. package/web/.next/static/chunks/4714eb891fa4fd81.js +1 -0
  294. package/web/.next/static/chunks/{df558fa5a59ef099.js → 51ca7e4cad588da4.js} +1 -1
  295. package/web/.next/static/chunks/523340641468b5f2.js +1 -0
  296. package/web/.next/static/chunks/5f6161ceb4263319.js +1 -0
  297. package/web/.next/static/chunks/{84c9b04d5397cc46.js → 604d36c352fff6c0.js} +2 -2
  298. package/web/.next/static/chunks/{672e3da3ad26005b.js → 98e3a7cf58fc912a.js} +1 -1
  299. package/web/.next/static/chunks/9a7361e2365b2d8e.js +1 -0
  300. package/web/.next/static/chunks/9af45e885bd4ccef.js +1 -0
  301. package/web/.next/static/chunks/bbfb591f6aaa7255.css +1 -0
  302. package/web/.next/static/chunks/{8392a79c0bd9956b.js → c6dc0749ac370da4.js} +1 -1
  303. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  304. package/web/.next/static/chunks/{489412a4676a1d14.js → e510518c9ca6e844.js} +1 -1
  305. package/web/.next/static/chunks/e9621b096a69e4e8.js +11 -0
  306. package/web/.next/static/chunks/{9f61c4cc4813cbc1.js → f60771797b58531f.js} +1 -1
  307. package/web/.next/static/chunks/f644140e21b75f61.js +1 -0
  308. package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-b1685b5f87ad1d60.js} +1 -1
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +0 -3
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +0 -1
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js.map +0 -1
  313. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/_273d4632._.js +0 -3
  315. package/web/.next/server/chunks/ssr/_273d4632._.js.map +0 -1
  316. package/web/.next/server/chunks/ssr/_37f9b23b._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
  318. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
  319. package/web/.next/server/chunks/ssr/_871373f7._.js +0 -3
  320. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
  321. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  322. package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
  323. package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
  324. package/web/.next/server/chunks/ssr/_f5316e67._.js +0 -3
  325. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +0 -1
  326. package/web/.next/server/chunks/ssr/_f7926f23._.js +0 -3
  327. package/web/.next/server/chunks/ssr/_f7926f23._.js.map +0 -1
  328. package/web/.next/static/chunks/303a1217006489b9.js +0 -1
  329. package/web/.next/static/chunks/3a806cf059241bc9.js +0 -1
  330. package/web/.next/static/chunks/57b45edf86522369.css +0 -1
  331. package/web/.next/static/chunks/619af41a8d3232e5.js +0 -1
  332. package/web/.next/static/chunks/82cf0022cbfd40cb.js +0 -1
  333. package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
  334. package/web/.next/static/chunks/a1cb1cf624ae4986.js +0 -1
  335. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +0 -1
  336. package/web/.next/static/chunks/ed3a602003bcb31b.js +0 -1
  337. package/web/.next/static/chunks/ee6d0ebf271c7b4c.js +0 -11
  338. package/web/.next/static/chunks/f3ba96e4b2c8be37.js +0 -1
  339. package/web/.next/static/chunks/fcde0cbb2976b933.js +0 -1
  340. /package/web/.next/static/{d6lJHy_7WaSuAS7PMm2hW → kQ3LD6zhRbOzb0MYK2n5b}/_buildManifest.js +0 -0
  341. /package/web/.next/static/{d6lJHy_7WaSuAS7PMm2hW → kQ3LD6zhRbOzb0MYK2n5b}/_clientMiddlewareManifest.json +0 -0
  342. /package/web/.next/static/{d6lJHy_7WaSuAS7PMm2hW → kQ3LD6zhRbOzb0MYK2n5b}/_ssgManifest.js +0 -0
@@ -17,4 +17,6 @@ export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
17
17
  export type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult, LaunchIdeSuccess, LaunchIdeFailed, } from './ide-launcher-service.interface.js';
18
18
  export type { IDaemonService, DaemonState } from './daemon-service.interface.js';
19
19
  export type { IDeploymentService, DeploymentStatus } from './deployment-service.interface.js';
20
+ export type { ITunnelService, TunnelUrlChangeHandler } from './tunnel-service.interface.js';
21
+ export type { IWebhookService, WebhookEvent, WebhookValidationResult, } from './webhook-service.interface.js';
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,YAAY,EACV,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Tunnel Service Interface
3
+ *
4
+ * Output port for managing a reverse tunnel that exposes local endpoints
5
+ * to the public internet. Used to receive webhooks from external services
6
+ * (e.g., GitHub) when running locally.
7
+ *
8
+ * Implementations must:
9
+ * - Start a tunnel process pointing at a local port
10
+ * - Expose only a specific URL path (e.g., /api/webhooks)
11
+ * - Detect when the public URL changes (tunnel reconnection)
12
+ * - Support graceful shutdown
13
+ */
14
+ export type TunnelUrlChangeHandler = (newUrl: string) => void | Promise<void>;
15
+ export interface ITunnelService {
16
+ /**
17
+ * Start the tunnel, exposing a local port to the internet.
18
+ *
19
+ * @param localPort - Local port to tunnel traffic to
20
+ * @returns The public URL assigned by the tunnel provider
21
+ */
22
+ start(localPort: number): Promise<string>;
23
+ /**
24
+ * Stop the tunnel and clean up the child process.
25
+ */
26
+ stop(): Promise<void>;
27
+ /**
28
+ * Get the current public URL, or null if the tunnel is not running.
29
+ */
30
+ getPublicUrl(): string | null;
31
+ /**
32
+ * Register a callback that fires when the tunnel URL changes
33
+ * (e.g., after a reconnection assigns a new random subdomain).
34
+ */
35
+ onUrlChange(handler: TunnelUrlChangeHandler): void;
36
+ /**
37
+ * Whether the tunnel process is currently running.
38
+ */
39
+ isRunning(): boolean;
40
+ }
41
+ //# sourceMappingURL=tunnel-service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/tunnel-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAEnD;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC;CACtB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tunnel Service Interface
3
+ *
4
+ * Output port for managing a reverse tunnel that exposes local endpoints
5
+ * to the public internet. Used to receive webhooks from external services
6
+ * (e.g., GitHub) when running locally.
7
+ *
8
+ * Implementations must:
9
+ * - Start a tunnel process pointing at a local port
10
+ * - Expose only a specific URL path (e.g., /api/webhooks)
11
+ * - Detect when the public URL changes (tunnel reconnection)
12
+ * - Support graceful shutdown
13
+ */
14
+ export {};
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Webhook Service Interface
3
+ *
4
+ * Output port for managing webhook registrations with external services
5
+ * (e.g., GitHub) and processing incoming webhook events.
6
+ *
7
+ * Works alongside the polling-based PrSyncWatcher to provide near-instant
8
+ * event delivery when a tunnel is available, with polling as fallback.
9
+ */
10
+ /**
11
+ * Parsed webhook event from an external service.
12
+ */
13
+ export interface WebhookEvent {
14
+ /** Source service (e.g., 'github') */
15
+ source: string;
16
+ /** Event type (e.g., 'pull_request', 'check_suite') */
17
+ eventType: string;
18
+ /** Delivery ID for deduplication */
19
+ deliveryId: string;
20
+ /** Full event payload */
21
+ payload: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Result of webhook signature validation.
25
+ */
26
+ export interface WebhookValidationResult {
27
+ valid: boolean;
28
+ error?: string;
29
+ }
30
+ export interface IWebhookService {
31
+ /**
32
+ * Register webhooks for all tracked repositories.
33
+ *
34
+ * @param publicUrl - The public tunnel URL where webhooks will be received
35
+ */
36
+ registerWebhooks(publicUrl: string): Promise<void>;
37
+ /**
38
+ * Update the webhook URL for all registered webhooks.
39
+ * Called when the tunnel reconnects with a new URL.
40
+ *
41
+ * @param newUrl - The new public tunnel URL
42
+ */
43
+ updateWebhookUrl(newUrl: string): Promise<void>;
44
+ /**
45
+ * Remove all registered webhooks (cleanup on shutdown).
46
+ */
47
+ removeWebhooks(): Promise<void>;
48
+ /**
49
+ * Validate an incoming webhook request signature.
50
+ *
51
+ * @param payload - Raw request body
52
+ * @param signature - Signature header value
53
+ * @param secret - The webhook secret used for HMAC
54
+ * @returns Validation result
55
+ */
56
+ validateSignature(payload: string, signature: string, secret: string): WebhookValidationResult;
57
+ /**
58
+ * Process an incoming webhook event.
59
+ * Routes the event to the appropriate handler (e.g., PR status update).
60
+ *
61
+ * @param event - The parsed webhook event
62
+ */
63
+ handleEvent(event: WebhookEvent): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=webhook-service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/webhook-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;;;;;;OAOG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAE/F;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Webhook Service Interface
3
+ *
4
+ * Output port for managing webhook registrations with external services
5
+ * (e.g., GitHub) and processing incoming webhook events.
6
+ *
7
+ * Works alongside the polling-based PrSyncWatcher to provide near-instant
8
+ * event delivery when a tunnel is available, with polling as fallback.
9
+ */
10
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,qBACa,6BAA6B;IAER,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EACpC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDhD"}
1
+ {"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,qBACa,6BAA6B;IAER,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EACpC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4ChD"}
@@ -22,7 +22,6 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
22
22
  return function (target, key) { decorator(target, key, paramIndex); }
23
23
  };
24
24
  import { injectable, inject } from 'tsyringe';
25
- import { SdlcLifecycle } from '../../../domain/generated/output.js';
26
25
  let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
27
26
  featureRepo;
28
27
  worktreeService;
@@ -36,10 +35,6 @@ let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
36
35
  const feature = await this.featureRepo.findById(featureId);
37
36
  if (!feature)
38
37
  return;
39
- // Idempotency guard: skip cleanup if already in Deleting lifecycle
40
- // (another code path — e.g. DeleteFeatureUseCase — already handles cleanup)
41
- if (feature.lifecycle === SdlcLifecycle.Deleting)
42
- return;
43
38
  // Step 1: Unlink the git worktree (directory contents are preserved on disk)
44
39
  const worktreePath = feature.worktreePath ??
45
40
  this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
@@ -23,7 +23,6 @@ import type { IAgentRunRepository } from '../../../ports/output/agents/agent-run
23
23
  import type { ISpecInitializerService } from '../../../ports/output/services/spec-initializer.interface.js';
24
24
  import type { IRepositoryRepository } from '../../../ports/output/repositories/repository-repository.interface.js';
25
25
  import type { IGitPrService } from '../../../ports/output/services/git-pr-service.interface.js';
26
- import type { IAgentValidator } from '../../../ports/output/agents/agent-validator.interface.js';
27
26
  import { AttachmentStorageService } from '../../../../infrastructure/services/attachment-storage.service.js';
28
27
  import { MetadataGenerator } from './metadata-generator.js';
29
28
  import { SlugResolver } from './slug-resolver.js';
@@ -39,8 +38,7 @@ export declare class CreateFeatureUseCase {
39
38
  private readonly repositoryRepo;
40
39
  private readonly gitPrService;
41
40
  private readonly attachmentStorage;
42
- private readonly agentValidator;
43
- constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, agentProcess: IFeatureAgentProcessService, runRepository: IAgentRunRepository, specInitializer: ISpecInitializerService, metadataGenerator: MetadataGenerator, slugResolver: SlugResolver, repositoryRepo: IRepositoryRepository, gitPrService: IGitPrService, attachmentStorage: AttachmentStorageService, agentValidator: IAgentValidator);
41
+ constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, agentProcess: IFeatureAgentProcessService, runRepository: IAgentRunRepository, specInitializer: ISpecInitializerService, metadataGenerator: MetadataGenerator, slugResolver: SlugResolver, repositoryRepo: IRepositoryRepository, gitPrService: IGitPrService, attachmentStorage: AttachmentStorageService);
44
42
  /**
45
43
  * Full synchronous execution: creates record, initializes worktree/spec, spawns agent.
46
44
  * Used by the CLI which shows a spinner and needs everything done before returning.
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC;AAGjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBApBd,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB,EAE3C,cAAc,EAAE,eAAe;IAGlD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAgI1D"}
1
+ {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAlBjB,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB;IAG9D;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAoG1D"}
@@ -46,8 +46,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
46
46
  repositoryRepo;
47
47
  gitPrService;
48
48
  attachmentStorage;
49
- agentValidator;
50
- constructor(featureRepo, worktreeService, agentProcess, runRepository, specInitializer, metadataGenerator, slugResolver, repositoryRepo, gitPrService, attachmentStorage, agentValidator) {
49
+ constructor(featureRepo, worktreeService, agentProcess, runRepository, specInitializer, metadataGenerator, slugResolver, repositoryRepo, gitPrService, attachmentStorage) {
51
50
  this.featureRepo = featureRepo;
52
51
  this.worktreeService = worktreeService;
53
52
  this.agentProcess = agentProcess;
@@ -58,7 +57,6 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
58
57
  this.repositoryRepo = repositoryRepo;
59
58
  this.gitPrService = gitPrService;
60
59
  this.attachmentStorage = attachmentStorage;
61
- this.agentValidator = agentValidator;
62
60
  }
63
61
  /**
64
62
  * Full synchronous execution: creates record, initializes worktree/spec, spawns agent.
@@ -243,31 +241,6 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
243
241
  await this.featureRepo.update(updatedFeature);
244
242
  // Spawn agent if not blocked
245
243
  if (shouldSpawn) {
246
- // Validate that the configured agent is available before spawning
247
- // a background worker — prevents the feature from getting stuck
248
- // with a silent failure in the detached worker process.
249
- // Skip validation when using mock executor (E2E tests, CI without real agents).
250
- const settings = getSettings();
251
- const effectiveAgentType = input.agentType ?? settings.agent.type;
252
- const isMockExecutor = process.env.SHEP_MOCK_EXECUTOR === '1';
253
- const validation = isMockExecutor
254
- ? { available: true }
255
- : await this.agentValidator.isAvailable(effectiveAgentType);
256
- if (!validation.available) {
257
- // Mark the agent run as failed so the UI shows the error
258
- await this.runRepository.updateStatus(feature.agentRunId, AgentRunStatus.failed, {
259
- error: `Agent "${effectiveAgentType}" is not available: ${validation.error}`,
260
- completedAt: new Date(),
261
- updatedAt: new Date(),
262
- });
263
- // Update feature lifecycle to Started so it doesn't appear as actively running
264
- await this.featureRepo.update({
265
- ...updatedFeature,
266
- lifecycle: SdlcLifecycle.Started,
267
- updatedAt: new Date(),
268
- });
269
- throw new Error(`Agent "${effectiveAgentType}" is not available. ${validation.error ?? 'Please install it and try again.'}`);
270
- }
271
244
  const agentRun = await this.runRepository.findById(feature.agentRunId);
272
245
  this.agentProcess.spawn(feature.id, feature.agentRunId, effectiveRepoPath, specDir, worktreePath, {
273
246
  ...(input.approvalGates ? { approvalGates: input.approvalGates } : {}),
@@ -294,8 +267,7 @@ CreateFeatureUseCase = __decorate([
294
267
  __param(7, inject('IRepositoryRepository')),
295
268
  __param(8, inject('IGitPrService')),
296
269
  __param(9, inject(AttachmentStorageService)),
297
- __param(10, inject('IAgentValidator')),
298
270
  __metadata("design:paramtypes", [Object, Object, Object, Object, Object, MetadataGenerator,
299
- SlugResolver, Object, Object, AttachmentStorageService, Object])
271
+ SlugResolver, Object, Object, AttachmentStorageService])
300
272
  ], CreateFeatureUseCase);
301
273
  export { CreateFeatureUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA+TrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAuHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA6UrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -27,6 +27,8 @@ import { JsonDrivenIdeLauncherService } from '../services/ide-launchers/json-dri
27
27
  import { DaemonPidService } from '../services/daemon/daemon-pid.service.js';
28
28
  import { DeploymentService } from '../services/deployment/deployment.service.js';
29
29
  import { AttachmentStorageService } from '../services/attachment-storage.service.js';
30
+ import { CloudflareTunnelService } from '../services/tunnel/cloudflare-tunnel.service.js';
31
+ import { GitHubWebhookService } from '../services/webhook/github-webhook.service.js';
30
32
  import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
31
33
  import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
32
34
  import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
@@ -169,6 +171,18 @@ export async function initializeContainer() {
169
171
  container.register('AttachmentStorageService', { useToken: AttachmentStorageService });
170
172
  const deploymentService = new DeploymentService();
171
173
  container.registerInstance('IDeploymentService', deploymentService);
174
+ // Register tunnel and webhook services
175
+ container.register('ITunnelService', {
176
+ useFactory: () => new CloudflareTunnelService(),
177
+ });
178
+ container.register('IWebhookService', {
179
+ useFactory: (c) => {
180
+ const featureRepo = c.resolve('IFeatureRepository');
181
+ const gitPrService = c.resolve('IGitPrService');
182
+ const notifService = c.resolve('INotificationService');
183
+ return new GitHubWebhookService(featureRepo, gitPrService, notifService, execFn);
184
+ },
185
+ });
172
186
  // Register agent infrastructure
173
187
  container.register('IAgentRunRepository', {
174
188
  useFactory: (c) => {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2HtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
1
+ {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
@@ -107,12 +107,7 @@ export class ClaudeCodeExecutorService {
107
107
  this.log(`Process error event: ${error.message}`);
108
108
  if (timeoutId)
109
109
  clearTimeout(timeoutId);
110
- if (error.code === 'ENOENT') {
111
- reject(new Error('Claude Code CLI ("claude") not found. Please install it: https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview'));
112
- }
113
- else {
114
- reject(error);
115
- }
110
+ reject(error);
116
111
  });
117
112
  proc.on('close', (code) => {
118
113
  // Flush remaining buffer
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
1
+ {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
@@ -123,12 +123,7 @@ export class CursorExecutorService {
123
123
  this.log(`Process error event: ${error.message}`);
124
124
  if (timeoutId)
125
125
  clearTimeout(timeoutId);
126
- if (error.code === 'ENOENT') {
127
- reject(new Error('Cursor agent CLI not found. Please install Cursor and ensure the "cursor" command is available on PATH.'));
128
- }
129
- else {
130
- reject(error);
131
- }
126
+ reject(error);
132
127
  });
133
128
  proc.on('close', (code) => {
134
129
  if (lineBuffer.trim())
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,cAAc;IAO3D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAP9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAGJ,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,WAAW,YAAA;IAG3C,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8FtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAsG3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI3C;IAEF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,iBAAiB;CAiB1B"}
1
+ {"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,cAAc;IAO3D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAP9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAGJ,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,WAAW,YAAA;IAG3C,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsFtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAsG3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI3C;IAEF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,iBAAiB;CAiB1B"}
@@ -67,12 +67,7 @@ export class GeminiCliExecutorService {
67
67
  this.log(`Process error event: ${error.message}`);
68
68
  if (timeoutId)
69
69
  clearTimeout(timeoutId);
70
- if (error.code === 'ENOENT') {
71
- reject(new Error('Gemini CLI ("gemini") not found. Please install it: https://github.com/google-gemini/gemini-cli'));
72
- }
73
- else {
74
- reject(error);
75
- }
70
+ reject(error);
76
71
  });
77
72
  proc.on('close', (code) => {
78
73
  this.log(`Process closed with code ${code}, stdout=${stdout.length} chars`);
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwE1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmR/D"}
1
+ {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwE1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgQ/D"}
@@ -16,7 +16,7 @@ import { initializeContainer, container } from '../../../di/container.js';
16
16
  import { createFeatureAgentGraph } from './feature-agent-graph.js';
17
17
  import { createFastFeatureAgentGraph } from './fast-feature-agent-graph.js';
18
18
  import { createCheckpointer } from '../common/checkpointer.js';
19
- import { AgentRunStatus, SdlcLifecycle } from '../../../../domain/generated/output.js';
19
+ import { AgentRunStatus } from '../../../../domain/generated/output.js';
20
20
  import { initializeSettings } from '../../../services/settings.service.js';
21
21
  import { InitializeSettingsUseCase } from '../../../../application/use-cases/settings/initialize-settings.use-case.js';
22
22
  import { setHeartbeatContext } from './heartbeat.js';
@@ -336,22 +336,6 @@ export async function runWorker(args) {
336
336
  completedAt: failedAt,
337
337
  updatedAt: failedAt,
338
338
  });
339
- // Reset the feature lifecycle to Started so it doesn't appear stuck
340
- // in a running phase (e.g., Requirements, Implementation) when the agent has failed.
341
- try {
342
- const feature = await featureRepository.findById(args.featureId);
343
- if (feature && feature.lifecycle !== SdlcLifecycle.Maintain) {
344
- await featureRepository.update({
345
- ...feature,
346
- lifecycle: SdlcLifecycle.Started,
347
- updatedAt: failedAt,
348
- });
349
- log('Feature lifecycle reset to Started');
350
- }
351
- }
352
- catch (resetErr) {
353
- log(`Failed to reset feature lifecycle: ${resetErr instanceof Error ? resetErr.message : String(resetErr)}`);
354
- }
355
339
  await recordLifecycleEvent('run:failed');
356
340
  log('Run marked as failed');
357
341
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW;IAWrC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IA6ClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAkM5B,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAC5B,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
1
+ {"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW;IAWrC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IA6ClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAoL5B,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAC5B,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
@@ -250,18 +250,6 @@ export class PrSyncWatcherService {
250
250
  console.log(`${TAG} PR #${pr.number} status changed: ${tracked.prStatus} -> ${newPrStatus} for "${feature.name}"`);
251
251
  feature.pr = { ...pr, status: newPrStatus };
252
252
  if (newPrStatus === PrStatus.Merged) {
253
- // Re-fetch to avoid racing with the merge node which may have already
254
- // transitioned this feature to Maintain and performed cleanup.
255
- const freshFeature = await this.featureRepo.findById(feature.id);
256
- if (freshFeature?.lifecycle === SdlcLifecycle.Maintain) {
257
- // eslint-disable-next-line no-console
258
- console.log(`${TAG} Feature "${feature.name}" already in Maintain — skipping duplicate transition`);
259
- tracked.prStatus = newPrStatus;
260
- // Still update the PR status on the record so it reflects Merged
261
- feature.pr = { ...(freshFeature.pr ?? pr), status: PrStatus.Merged };
262
- await this.featureRepo.update({ ...freshFeature, pr: feature.pr, updatedAt: new Date() });
263
- return;
264
- }
265
253
  feature.lifecycle = SdlcLifecycle.Maintain;
266
254
  await this.completeAgentRun(feature);
267
255
  this.emitNotification(NotificationEventType.PrMerged, feature.id, feature.agentRunId ?? '', feature.name, `PR #${pr.number} merged for ${feature.name}`, NotificationSeverity.Success);
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Cloudflare Tunnel Service
3
+ *
4
+ * Manages a `cloudflared` quick-tunnel process that exposes a local port
5
+ * to the public internet via a random *.trycloudflare.com subdomain.
6
+ *
7
+ * Key behaviors:
8
+ * - Spawns `cloudflared tunnel --url http://localhost:<port>`
9
+ * - Parses the assigned public URL from process stderr
10
+ * - Detects URL changes on reconnection and notifies listeners
11
+ * - Gracefully kills the process on stop()
12
+ *
13
+ * The tunnel exposes the full local port but only the webhook API route
14
+ * should be registered with external services. Path-level filtering
15
+ * happens at the webhook route handler, not the tunnel layer.
16
+ */
17
+ import { spawn } from 'node:child_process';
18
+ import type { ITunnelService, TunnelUrlChangeHandler } from '../../../application/ports/output/services/tunnel-service.interface.js';
19
+ export interface CloudflareTunnelDeps {
20
+ spawnProcess: typeof spawn;
21
+ }
22
+ export declare class CloudflareTunnelService implements ITunnelService {
23
+ private process;
24
+ private publicUrl;
25
+ private readonly urlChangeHandlers;
26
+ private readonly deps;
27
+ constructor(deps?: Partial<CloudflareTunnelDeps>);
28
+ start(localPort: number): Promise<string>;
29
+ stop(): Promise<void>;
30
+ getPublicUrl(): string | null;
31
+ onUrlChange(handler: TunnelUrlChangeHandler): void;
32
+ isRunning(): boolean;
33
+ private killProcess;
34
+ private notifyUrlChange;
35
+ }
36
+ //# sourceMappingURL=cloudflare-tunnel.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-tunnel.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACvB,MAAM,wEAAwE,CAAC;AAOhF,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,KAAK,CAAC;CAC5B;AAMD,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,IAAI,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAI9C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkFzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAIlD,SAAS,IAAI,OAAO;IAIpB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,eAAe;CAgBxB"}