@shepai/cli 1.116.3-pr375.ea5b2a2 → 1.117.0-pr367.ca5b6ac

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 (477) hide show
  1. package/apis/json-schema/AnalyzeRepoTimeouts.yaml +10 -0
  2. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  3. package/apis/json-schema/StageTimeouts.yaml +35 -0
  4. package/apis/json-schema/WorkflowConfig.yaml +6 -0
  5. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.d.ts +41 -0
  8. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/ports/output/services/tunnel-service.interface.js +14 -0
  10. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.d.ts +65 -0
  11. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/ports/output/services/webhook-service.interface.js +10 -0
  13. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +17 -8
  15. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  16. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  17. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts +1 -3
  18. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  19. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -4
  20. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts +25 -0
  21. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -0
  22. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +116 -0
  23. package/dist/packages/core/src/domain/generated/output.d.ts +47 -0
  24. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  25. package/dist/packages/core/src/domain/generated/output.js +1 -0
  26. package/dist/packages/core/src/domain/lifecycle-gates.d.ts +3 -0
  27. package/dist/packages/core/src/domain/lifecycle-gates.d.ts.map +1 -1
  28. package/dist/packages/core/src/domain/lifecycle-gates.js +3 -0
  29. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/di/container.js +19 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +7 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +44 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts +22 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.js +53 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +15 -6
  39. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +15 -0
  41. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.js +15 -0
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -1
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +42 -3
  46. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.d.ts +55 -0
  47. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.d.ts.map +1 -0
  48. package/dist/packages/core/src/infrastructure/services/tunnel/cloudflare-tunnel.service.js +203 -0
  49. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.d.ts +75 -0
  50. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.d.ts.map +1 -0
  51. package/dist/packages/core/src/infrastructure/services/webhook/github-webhook.service.js +372 -0
  52. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.d.ts +82 -0
  53. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.d.ts.map +1 -0
  54. package/dist/packages/core/src/infrastructure/services/webhook/webhook-manager.service.js +206 -0
  55. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/feat/index.js +2 -0
  57. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/feat/ls.command.js +3 -0
  59. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/feat/new.command.js +9 -1
  61. package/dist/src/presentation/cli/commands/feat/start.command.d.ts +12 -0
  62. package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -0
  63. package/dist/src/presentation/cli/commands/feat/start.command.js +43 -0
  64. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  65. package/dist/src/presentation/cli/commands/ui.command.js +15 -0
  66. package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -1
  67. package/dist/src/presentation/web/app/actions/approve-feature.js +0 -9
  68. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
  69. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  70. package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
  71. package/dist/src/presentation/web/app/actions/load-webhook-status.d.ts +3 -0
  72. package/dist/src/presentation/web/app/actions/load-webhook-status.d.ts.map +1 -0
  73. package/dist/src/presentation/web/app/actions/load-webhook-status.js +19 -0
  74. package/dist/src/presentation/web/app/actions/reject-feature.d.ts.map +1 -1
  75. package/dist/src/presentation/web/app/actions/reject-feature.js +0 -9
  76. package/dist/src/presentation/web/app/actions/start-feature.d.ts +5 -0
  77. package/dist/src/presentation/web/app/actions/start-feature.d.ts.map +1 -0
  78. package/dist/src/presentation/web/app/actions/start-feature.js +16 -0
  79. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  80. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  81. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.d.ts +9 -0
  82. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.d.ts.map +1 -0
  83. package/dist/src/presentation/web/app/api/webhooks/deliveries/route.js +27 -0
  84. package/dist/src/presentation/web/app/api/webhooks/github/route.d.ts +17 -0
  85. package/dist/src/presentation/web/app/api/webhooks/github/route.d.ts.map +1 -0
  86. package/dist/src/presentation/web/app/api/webhooks/github/route.js +70 -0
  87. package/dist/src/presentation/web/app/api/webhooks/status/route.d.ts +9 -0
  88. package/dist/src/presentation/web/app/api/webhooks/status/route.d.ts.map +1 -0
  89. package/dist/src/presentation/web/app/api/webhooks/status/route.js +26 -0
  90. package/dist/src/presentation/web/app/webhooks/page.d.ts +4 -0
  91. package/dist/src/presentation/web/app/webhooks/page.d.ts.map +1 -0
  92. package/dist/src/presentation/web/app/webhooks/page.js +9 -0
  93. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  94. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +1 -1
  95. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +20 -1
  97. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  98. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  99. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +6 -2
  100. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
  102. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -2
  103. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  104. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +13 -1
  105. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +12 -3
  107. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +2 -0
  108. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  109. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +36 -2
  110. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  111. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -1
  112. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  113. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  114. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +23 -0
  115. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  116. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +75 -2
  117. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +1 -0
  118. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  119. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +23 -0
  120. package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts +11 -0
  121. package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts.map +1 -0
  122. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +63 -0
  123. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts +10 -0
  124. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts.map +1 -0
  125. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.js +24 -0
  126. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  127. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +97 -2
  128. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  129. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +22 -0
  130. package/dist/src/presentation/web/components/features/webhooks/types.d.ts +32 -0
  131. package/dist/src/presentation/web/components/features/webhooks/types.d.ts.map +1 -0
  132. package/dist/src/presentation/web/components/features/webhooks/types.js +1 -0
  133. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.d.ts +6 -0
  134. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.d.ts.map +1 -0
  135. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.js +38 -0
  136. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.d.ts +9 -0
  137. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.d.ts.map +1 -0
  138. package/dist/src/presentation/web/components/features/webhooks/webhook-delivery-table.stories.js +69 -0
  139. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.d.ts +7 -0
  140. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.d.ts.map +1 -0
  141. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.js +11 -0
  142. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.d.ts +9 -0
  143. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.d.ts.map +1 -0
  144. package/dist/src/presentation/web/components/features/webhooks/webhook-repo-list.stories.js +31 -0
  145. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.d.ts +6 -0
  146. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.d.ts.map +1 -0
  147. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.js +21 -0
  148. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.d.ts +9 -0
  149. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.d.ts.map +1 -0
  150. package/dist/src/presentation/web/components/features/webhooks/webhook-status-cards.stories.js +56 -0
  151. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.d.ts +6 -0
  152. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.d.ts.map +1 -0
  153. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.js +39 -0
  154. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.d.ts +8 -0
  155. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.d.ts.map +1 -0
  156. package/dist/src/presentation/web/components/features/webhooks/webhooks-page-client.stories.js +59 -0
  157. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  158. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  159. package/dist/src/presentation/web/components/ui/slider.d.ts +5 -0
  160. package/dist/src/presentation/web/components/ui/slider.d.ts.map +1 -0
  161. package/dist/src/presentation/web/components/ui/slider.js +10 -0
  162. package/dist/src/presentation/web/components/ui/slider.stories.d.ts +7 -0
  163. package/dist/src/presentation/web/components/ui/slider.stories.d.ts.map +1 -0
  164. package/dist/src/presentation/web/components/ui/slider.stories.js +15 -0
  165. package/dist/src/presentation/web/dev-server.js +20 -0
  166. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  167. package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
  168. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  169. package/dist/src/presentation/web/hooks/use-graph-state.js +1 -0
  170. package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
  171. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  172. package/dist/src/presentation/web/lib/derive-graph.js +5 -0
  173. package/dist/tsconfig.build.tsbuildinfo +1 -1
  174. package/package.json +3 -1
  175. package/web/.next/BUILD_ID +1 -1
  176. package/web/.next/app-path-routes-manifest.json +5 -1
  177. package/web/.next/build-manifest.json +6 -6
  178. package/web/.next/fallback-build-manifest.json +2 -2
  179. package/web/.next/prerender-manifest.json +3 -3
  180. package/web/.next/required-server-files.js +2 -2
  181. package/web/.next/required-server-files.json +2 -2
  182. package/web/.next/routes-manifest.json +24 -0
  183. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
  184. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +55 -40
  185. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  186. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  189. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +67 -52
  190. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  191. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  192. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  193. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
  194. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +67 -52
  195. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  196. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  197. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
  199. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +51 -36
  200. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  201. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  202. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  203. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
  204. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +55 -40
  205. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  206. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  207. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  208. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  209. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +67 -52
  210. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  211. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  212. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  213. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
  214. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +67 -52
  215. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  216. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  217. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  218. package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
  219. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +51 -36
  220. package/web/.next/server/app/(dashboard)/page.js +1 -1
  221. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  222. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  223. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
  224. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +51 -36
  225. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  226. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  227. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  228. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  229. package/web/.next/server/app/_global-error.html +2 -2
  230. package/web/.next/server/app/_global-error.rsc +1 -1
  231. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  232. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  233. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  234. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  235. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  236. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  237. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  238. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  239. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  240. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  241. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  242. package/web/.next/server/app/api/webhooks/deliveries/route/app-paths-manifest.json +3 -0
  243. package/web/.next/server/app/api/webhooks/deliveries/route/build-manifest.json +11 -0
  244. package/web/.next/server/app/api/webhooks/deliveries/route/server-reference-manifest.json +4 -0
  245. package/web/.next/server/app/api/webhooks/deliveries/route.js +6 -0
  246. package/web/.next/server/app/api/webhooks/deliveries/route.js.map +5 -0
  247. package/web/.next/server/app/api/webhooks/deliveries/route.js.nft.json +1 -0
  248. package/web/.next/server/app/api/webhooks/deliveries/route_client-reference-manifest.js +2 -0
  249. package/web/.next/server/app/api/webhooks/github/route/app-paths-manifest.json +3 -0
  250. package/web/.next/server/app/api/webhooks/github/route/build-manifest.json +11 -0
  251. package/web/.next/server/app/api/webhooks/github/route/server-reference-manifest.json +4 -0
  252. package/web/.next/server/app/api/webhooks/github/route.js +6 -0
  253. package/web/.next/server/app/api/webhooks/github/route.js.map +5 -0
  254. package/web/.next/server/app/api/webhooks/github/route.js.nft.json +1 -0
  255. package/web/.next/server/app/api/webhooks/github/route_client-reference-manifest.js +2 -0
  256. package/web/.next/server/app/api/webhooks/status/route/app-paths-manifest.json +3 -0
  257. package/web/.next/server/app/api/webhooks/status/route/build-manifest.json +11 -0
  258. package/web/.next/server/app/api/webhooks/status/route/server-reference-manifest.json +4 -0
  259. package/web/.next/server/app/api/webhooks/status/route.js +6 -0
  260. package/web/.next/server/app/api/webhooks/status/route.js.map +5 -0
  261. package/web/.next/server/app/api/webhooks/status/route.js.nft.json +1 -0
  262. package/web/.next/server/app/api/webhooks/status/route_client-reference-manifest.js +2 -0
  263. package/web/.next/server/app/settings/page/build-manifest.json +4 -4
  264. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  265. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  266. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  267. package/web/.next/server/app/skills/page/build-manifest.json +4 -4
  268. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  269. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  270. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  271. package/web/.next/server/app/tools/page/build-manifest.json +4 -4
  272. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  273. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  274. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  275. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  276. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  277. package/web/.next/server/app/version/page.js.nft.json +1 -1
  278. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  279. package/web/.next/server/app/webhooks/page/app-paths-manifest.json +3 -0
  280. package/web/.next/server/app/webhooks/page/build-manifest.json +18 -0
  281. package/web/.next/server/app/webhooks/page/next-font-manifest.json +6 -0
  282. package/web/.next/server/app/webhooks/page/react-loadable-manifest.json +1 -0
  283. package/web/.next/server/app/webhooks/page/server-reference-manifest.json +35 -0
  284. package/web/.next/server/app/webhooks/page.js +16 -0
  285. package/web/.next/server/app/webhooks/page.js.map +5 -0
  286. package/web/.next/server/app/webhooks/page.js.nft.json +1 -0
  287. package/web/.next/server/app/webhooks/page_client-reference-manifest.js +2 -0
  288. package/web/.next/server/app-paths-manifest.json +5 -1
  289. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  290. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  291. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  292. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  293. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_deliveries_route_actions_d9e34c8d.js +3 -0
  294. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_deliveries_route_actions_d9e34c8d.js.map +1 -0
  295. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_github_route_actions_1b0d0c38.js +3 -0
  296. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_github_route_actions_1b0d0c38.js.map +1 -0
  297. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_status_route_actions_1a0d86a1.js +3 -0
  298. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_webhooks_status_route_actions_1a0d86a1.js.map +1 -0
  299. package/web/.next/server/chunks/[root-of-the-server]__15e5d45c._.js +3 -0
  300. package/web/.next/server/chunks/[root-of-the-server]__15e5d45c._.js.map +1 -0
  301. package/web/.next/server/chunks/[root-of-the-server]__23be381e._.js +3 -0
  302. package/web/.next/server/chunks/[root-of-the-server]__23be381e._.js.map +1 -0
  303. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
  304. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
  305. package/web/.next/server/chunks/[root-of-the-server]__9fc760c0._.js +3 -0
  306. package/web/.next/server/chunks/[root-of-the-server]__9fc760c0._.js.map +1 -0
  307. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  308. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  309. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  311. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_activity_22f9667f.js +3 -0
  313. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_activity_22f9667f.js.map +1 -0
  314. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +3 -0
  315. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -0
  316. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +3 -0
  317. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -0
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js +3 -0
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js.map +1 -0
  323. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  324. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  325. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js +3 -0
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js.map +1 -0
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d847b7b._.js +3 -0
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d847b7b._.js.map +1 -0
  329. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  330. package/web/.next/server/chunks/ssr/[root-of-the-server]__87a7ae30._.js +3 -0
  331. package/web/.next/server/chunks/ssr/[root-of-the-server]__87a7ae30._.js.map +1 -0
  332. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  333. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  334. package/web/.next/server/chunks/ssr/[root-of-the-server]__920dccd5._.js +4 -0
  335. package/web/.next/server/chunks/ssr/[root-of-the-server]__920dccd5._.js.map +1 -0
  336. package/web/.next/server/chunks/ssr/[root-of-the-server]__a42f5a88._.js +3 -0
  337. package/web/.next/server/chunks/ssr/[root-of-the-server]__a42f5a88._.js.map +1 -0
  338. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js +3 -0
  339. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js.map +1 -0
  340. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  341. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  342. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js +3 -0
  343. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js.map +1 -0
  344. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  345. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  346. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  347. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  348. package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
  349. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  350. package/web/.next/server/chunks/ssr/_26b2c311._.js +3 -0
  351. package/web/.next/server/chunks/ssr/_26b2c311._.js.map +1 -0
  352. package/web/.next/server/chunks/ssr/{_f2f36bf9._.js → _719ef347._.js} +2 -2
  353. package/web/.next/server/chunks/ssr/_719ef347._.js.map +1 -0
  354. package/web/.next/server/chunks/ssr/_809c53f6._.js +9 -0
  355. package/web/.next/server/chunks/ssr/_809c53f6._.js.map +1 -0
  356. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  357. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  358. package/web/.next/server/chunks/ssr/_98047ffd._.js +3 -0
  359. package/web/.next/server/chunks/ssr/_98047ffd._.js.map +1 -0
  360. package/web/.next/server/chunks/ssr/_9eea4c51._.js +3 -0
  361. package/web/.next/server/chunks/ssr/_9eea4c51._.js.map +1 -0
  362. package/web/.next/server/chunks/ssr/_a4899a76._.js +3 -0
  363. package/web/.next/server/chunks/ssr/_a4899a76._.js.map +1 -0
  364. package/web/.next/server/chunks/ssr/_b715515b._.js +3 -0
  365. package/web/.next/server/chunks/ssr/{_86617fb9._.js.map → _b715515b._.js.map} +1 -1
  366. package/web/.next/server/chunks/ssr/_b7eb93fc._.js +4 -0
  367. package/web/.next/server/chunks/ssr/_b7eb93fc._.js.map +1 -0
  368. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  369. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  370. package/web/.next/server/chunks/ssr/_e0a01382._.js +3 -0
  371. package/web/.next/server/chunks/ssr/_e0a01382._.js.map +1 -0
  372. package/web/.next/server/chunks/ssr/_f8b36e2c._.js +3 -0
  373. package/web/.next/server/chunks/ssr/_f8b36e2c._.js.map +1 -0
  374. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  375. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  376. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_webhooks_webhooks-page-client_tsx_b2662ea3._.js +3 -0
  377. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_webhooks_webhooks-page-client_tsx_b2662ea3._.js.map +1 -0
  378. package/web/.next/server/chunks/ssr/{_1bb131c4._.js → node_modules__pnpm_747b43ac._.js} +2 -2
  379. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +1 -0
  380. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +5 -0
  381. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -0
  382. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +3 -0
  383. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -0
  384. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  385. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  386. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  387. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  388. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  389. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  390. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  391. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  392. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  393. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  394. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  395. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  396. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +5 -0
  397. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -0
  398. package/web/.next/server/middleware-build-manifest.js +4 -4
  399. package/web/.next/server/pages/500.html +2 -2
  400. package/web/.next/server/server-reference-manifest.js +1 -1
  401. package/web/.next/server/server-reference-manifest.json +323 -230
  402. package/web/.next/static/chunks/06b948216df083c1.js +1 -0
  403. package/web/.next/static/chunks/{763f6ecc4593dc10.js → 2ac228556e3d1db4.js} +1 -1
  404. package/web/.next/static/chunks/31f35710932542ef.js +1 -0
  405. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +1 -0
  406. package/web/.next/static/chunks/4714eb891fa4fd81.js +1 -0
  407. package/web/.next/static/chunks/57094e1cbd326d6c.css +1 -0
  408. package/web/.next/static/chunks/{5225e7b93df59de9.js → 5856c588eb7f21fd.js} +1 -1
  409. package/web/.next/static/chunks/5f6161ceb4263319.js +1 -0
  410. package/web/.next/static/chunks/81f470d21748eafd.js +2 -0
  411. package/web/.next/static/chunks/829305a6e02eff1f.js +1 -0
  412. package/web/.next/static/chunks/97aaeeee72be634b.js +1 -0
  413. package/web/.next/static/chunks/{672e3da3ad26005b.js → 98e3a7cf58fc912a.js} +1 -1
  414. package/web/.next/static/chunks/9a7361e2365b2d8e.js +1 -0
  415. package/web/.next/static/chunks/9af45e885bd4ccef.js +1 -0
  416. package/web/.next/static/chunks/{f32b896b3ceae18d.js → ab8b8f80cbc8366f.js} +2 -2
  417. package/web/.next/static/chunks/c3c3f2c9eb309920.js +1 -0
  418. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  419. package/web/.next/static/chunks/cb2824954c3975b0.js +1 -0
  420. package/web/.next/static/chunks/{053b644519f721f1.js → d3db43fcdbbd9b68.js} +1 -1
  421. package/web/.next/static/chunks/e9621b096a69e4e8.js +11 -0
  422. package/web/.next/static/chunks/fb99c57e6d28a274.js +1 -0
  423. package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-b1685b5f87ad1d60.js} +1 -1
  424. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +0 -3
  425. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +0 -1
  426. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +0 -3
  427. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +0 -1
  428. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +0 -3
  429. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +0 -1
  430. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +0 -3
  431. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +0 -1
  432. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +0 -3
  433. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +0 -1
  434. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  435. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js.map +0 -1
  436. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +0 -3
  437. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +0 -1
  438. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +0 -3
  439. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +0 -1
  440. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  441. package/web/.next/server/chunks/ssr/_273d4632._.js +0 -3
  442. package/web/.next/server/chunks/ssr/_273d4632._.js.map +0 -1
  443. package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
  444. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
  445. package/web/.next/server/chunks/ssr/_86617fb9._.js +0 -3
  446. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
  447. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  448. package/web/.next/server/chunks/ssr/_b5d0b00e._.js +0 -3
  449. package/web/.next/server/chunks/ssr/_b5d0b00e._.js.map +0 -1
  450. package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
  451. package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
  452. package/web/.next/server/chunks/ssr/_f2f36bf9._.js.map +0 -1
  453. package/web/.next/server/chunks/ssr/_f5316e67._.js +0 -3
  454. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +0 -1
  455. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +0 -3
  456. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +0 -1
  457. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +0 -5
  458. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +0 -1
  459. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +0 -5
  460. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +0 -1
  461. package/web/.next/static/chunks/121a2e602cb9df92.js +0 -11
  462. package/web/.next/static/chunks/303a1217006489b9.js +0 -1
  463. package/web/.next/static/chunks/3a806cf059241bc9.js +0 -1
  464. package/web/.next/static/chunks/57b45edf86522369.css +0 -1
  465. package/web/.next/static/chunks/619af41a8d3232e5.js +0 -1
  466. package/web/.next/static/chunks/6770c61692fe5605.js +0 -1
  467. package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
  468. package/web/.next/static/chunks/8c3ff8561102a386.js +0 -1
  469. package/web/.next/static/chunks/a1b3371ef3ffd58b.js +0 -2
  470. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +0 -1
  471. package/web/.next/static/chunks/bec349a77c5c5796.js +0 -1
  472. package/web/.next/static/chunks/e85bcc69a4ceb89e.js +0 -1
  473. package/web/.next/static/chunks/ed3a602003bcb31b.js +0 -1
  474. package/web/.next/static/chunks/fcde0cbb2976b933.js +0 -1
  475. /package/web/.next/static/{Ci7i00ReHDH8Xv9NQW3By → T6bpRqj4p37ell4NNYIUl}/_buildManifest.js +0 -0
  476. /package/web/.next/static/{Ci7i00ReHDH8Xv9NQW3By → T6bpRqj4p37ell4NNYIUl}/_clientMiddlewareManifest.json +0 -0
  477. /package/web/.next/static/{Ci7i00ReHDH8Xv9NQW3By → T6bpRqj4p37ell4NNYIUl}/_ssgManifest.js +0 -0
@@ -54,6 +54,9 @@ function formatStatus(feature, run) {
54
54
  if (feature.lifecycle === 'Blocked') {
55
55
  return `${colors.warning(symbols.dotEmpty)} ${colors.warning('Blocked')}`;
56
56
  }
57
+ if (feature.lifecycle === 'Pending') {
58
+ return `${colors.muted(symbols.dotEmpty)} ${colors.muted('Pending')}`;
59
+ }
57
60
  if (!run) {
58
61
  return `${colors.muted(symbols.dotEmpty)} ${colors.muted(feature.lifecycle)}`;
59
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAwI1C"}
1
+ {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmJ1C"}
@@ -55,6 +55,7 @@ export function createNewCommand() {
55
55
  .option('--allow-merge', 'Auto-approve merge phase')
56
56
  .option('--allow-all', 'Run fully autonomous (no approval pauses)')
57
57
  .option('--parent <fid>', 'Parent feature ID (full or partial prefix)')
58
+ .option('--pending', 'Create feature without starting the agent')
58
59
  .option('--fast', 'Skip SDLC phases and implement directly from your prompt')
59
60
  .option('--model <model>', 'LLM model identifier for this run (e.g. claude-opus-4-6)')
60
61
  .option('--attach <path>', 'Attach a file (repeatable)', collect, [])
@@ -113,6 +114,7 @@ export function createNewCommand() {
113
114
  push,
114
115
  openPr,
115
116
  ...(parentId !== undefined && { parentId }),
117
+ ...(options.pending && { pending: true }),
116
118
  ...(options.fast && { fast: true }),
117
119
  ...(options.model !== undefined && { model: options.model }),
118
120
  ...(attachmentPaths.length > 0 && { attachmentPaths }),
@@ -129,6 +131,9 @@ export function createNewCommand() {
129
131
  if (feature.lifecycle === SdlcLifecycle.Blocked) {
130
132
  messages.info(`Feature created in Blocked state — waiting for parent to reach Implementation`);
131
133
  }
134
+ if (feature.lifecycle === SdlcLifecycle.Pending) {
135
+ messages.info(`Feature created in Pending state — run ${colors.accent(`shep feat start ${feature.id.slice(0, 8)}`)} to begin`);
136
+ }
132
137
  console.log(` ${colors.muted('ID:')} ${colors.accent(feature.id)}`);
133
138
  console.log(` ${colors.muted('Name:')} ${feature.name}`);
134
139
  console.log(` ${colors.muted('Branch:')} ${colors.accent(feature.branch)}`);
@@ -138,7 +143,10 @@ export function createNewCommand() {
138
143
  console.log(` ${colors.muted('Spec:')} ${feature.specPath}`);
139
144
  }
140
145
  if (feature.agentRunId) {
141
- console.log(` ${colors.muted('Agent:')} ${colors.success('spawned')} (run ${feature.agentRunId.slice(0, 8)})`);
146
+ const agentStatus = feature.lifecycle === SdlcLifecycle.Pending
147
+ ? colors.muted('pending')
148
+ : colors.success('spawned');
149
+ console.log(` ${colors.muted('Agent:')} ${agentStatus} (run ${feature.agentRunId.slice(0, 8)})`);
142
150
  }
143
151
  if (push || openPr) {
144
152
  const pushHint = openPr ? 'push + PR' : 'push only';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Feature Start Command
3
+ *
4
+ * Starts a pending feature by transitioning it to its active lifecycle
5
+ * and spawning the agent.
6
+ *
7
+ * Usage:
8
+ * shep feat start <id>
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function createStartCommand(): Command;
12
+ //# sourceMappingURL=start.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/start.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CAgC5C"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Feature Start Command
3
+ *
4
+ * Starts a pending feature by transitioning it to its active lifecycle
5
+ * and spawning the agent.
6
+ *
7
+ * Usage:
8
+ * shep feat start <id>
9
+ */
10
+ import { Command } from 'commander';
11
+ import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
12
+ import { StartFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/start-feature.use-case.js';
13
+ import { colors, messages, spinner } from '../../ui/index.js';
14
+ export function createStartCommand() {
15
+ return new Command('start')
16
+ .description('Start a pending feature (spawn the agent)')
17
+ .argument('<id>', 'Feature ID (or prefix)')
18
+ .action(async (id) => {
19
+ try {
20
+ const useCase = container.resolve(StartFeatureUseCase);
21
+ const { feature, agentRun } = await spinner('Starting feature', () => useCase.execute(id));
22
+ messages.newline();
23
+ if (feature.lifecycle === 'Blocked') {
24
+ messages.warning(`Feature transitioned to Blocked — parent has not reached Implementation`);
25
+ }
26
+ else {
27
+ messages.success('Feature started');
28
+ }
29
+ console.log(` ${colors.muted('Feature:')} ${feature.name}`);
30
+ console.log(` ${colors.muted('Branch:')} ${colors.accent(feature.branch)}`);
31
+ console.log(` ${colors.muted('Status:')} ${feature.lifecycle}`);
32
+ if (feature.lifecycle !== 'Blocked') {
33
+ console.log(` ${colors.muted('Agent:')} ${colors.success('spawned')} (run ${agentRun.id.slice(0, 8)})`);
34
+ }
35
+ messages.newline();
36
+ }
37
+ catch (error) {
38
+ const err = error instanceof Error ? error : new Error(String(error));
39
+ messages.error('Failed to start feature', err);
40
+ process.exitCode = 1;
41
+ }
42
+ });
43
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAgC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA0FzC"}
1
+ {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAuC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAwGzC"}
@@ -23,6 +23,7 @@ import { initializeNotificationWatcher, getNotificationWatcher, } from '../../..
23
23
  import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
24
24
  import { getExistingConnection } from '../../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
25
25
  import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
26
+ import { initializeWebhookManager, getWebhookManager, hasWebhookManager, } from '../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
26
27
  import { colors, fmt, messages } from '../ui/index.js';
27
28
  function parsePort(value) {
28
29
  const port = parseInt(value, 10);
@@ -70,6 +71,17 @@ Examples:
70
71
  const db = getExistingConnection();
71
72
  initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db);
72
73
  getPrSyncWatcher().start();
74
+ // Start webhook system (optional — falls back to polling if cloudflared is not available)
75
+ try {
76
+ const tunnelService = container.resolve('ITunnelService');
77
+ const webhookService = container.resolve('IWebhookService');
78
+ initializeWebhookManager(tunnelService, webhookService);
79
+ // Start is async and non-blocking — failures are logged, not thrown
80
+ void getWebhookManager().start(port);
81
+ }
82
+ catch {
83
+ // Webhook system is optional; polling continues to work
84
+ }
73
85
  const url = `http://localhost:${port}`;
74
86
  messages.success(`Server ready at ${fmt.code(url)}`);
75
87
  messages.info('Press Ctrl+C to stop');
@@ -91,6 +103,9 @@ Examples:
91
103
  // Force exit after 5s if graceful shutdown stalls
92
104
  const forceExit = setTimeout(() => process.exit(0), 5000);
93
105
  forceExit.unref();
106
+ if (hasWebhookManager()) {
107
+ await getWebhookManager().stop();
108
+ }
94
109
  getPrSyncWatcher().stop();
95
110
  getNotificationWatcher().stop();
96
111
  await service.stop();
@@ -1 +1 @@
1
- {"version":3,"file":"approve-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/approve-feature.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAK/E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsChD"}
1
+ {"version":3,"file":"approve-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/approve-feature.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BhD"}
@@ -1,7 +1,5 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- import { AgentRunStatus } from '../../../../../packages/core/src/domain/generated/output.js';
4
- const ERROR_STATUSES = new Set([AgentRunStatus.failed, AgentRunStatus.interrupted]);
5
3
  export async function approveFeature(featureId, payload) {
6
4
  if (!featureId.trim()) {
7
5
  return { approved: false, error: 'Feature id is required' };
@@ -15,13 +13,6 @@ export async function approveFeature(featureId, payload) {
15
13
  if (!feature.agentRunId) {
16
14
  return { approved: false, error: 'Feature has no agent run' };
17
15
  }
18
- const runRepo = resolve('IAgentRunRepository');
19
- const run = await runRepo.findById(feature.agentRunId);
20
- if (run && ERROR_STATUSES.has(run.status)) {
21
- const resumeUseCase = resolve('ResumeFeatureUseCase');
22
- await resumeUseCase.execute(featureId, { promptPrefix: 'User approved. Please continue.' });
23
- return { approved: true };
24
- }
25
16
  const approveUseCase = resolve('ApproveAgentRunUseCase');
26
17
  const result = await approveUseCase.execute(feature.agentRunId, payload);
27
18
  if (!result.approved) {
@@ -18,6 +18,8 @@ interface CreateFeatureInput {
18
18
  parentId?: string;
19
19
  /** When true, skip SDLC phases and implement directly from the prompt. */
20
20
  fast?: boolean;
21
+ /** When true, create the feature in pending state (no agent spawned). */
22
+ pending?: boolean;
21
23
  /** Optional agent type override for this feature run */
22
24
  agentType?: string;
23
25
  /** Optional model identifier for this feature run */
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4EhD"}
1
+ {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+EhD"}
@@ -2,7 +2,7 @@
2
2
  import { resolve } from '../../lib/server-container.js';
3
3
  import { composeUserInput } from './compose-user-input.js';
4
4
  export async function createFeature(input) {
5
- const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, agentType, model, } = input;
5
+ const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, agentType, model, } = input;
6
6
  if (!description?.trim()) {
7
7
  return { error: 'description is required' };
8
8
  }
@@ -27,6 +27,7 @@ export async function createFeature(input) {
27
27
  ...(parentId ? { parentId } : {}),
28
28
  description,
29
29
  ...(fast ? { fast } : {}),
30
+ ...(pending ? { pending } : {}),
30
31
  ...(agentType ? { agentType } : {}),
31
32
  ...(model ? { model } : {}),
32
33
  });
@@ -41,6 +42,7 @@ export async function createFeature(input) {
41
42
  openPr: openPr ?? false,
42
43
  ...(parentId ? { parentId } : {}),
43
44
  ...(fast ? { fast } : {}),
45
+ ...(pending ? { pending } : {}),
44
46
  ...(agentType ? { agentType } : {}),
45
47
  ...(model ? { model } : {}),
46
48
  ...(sessionId ? { sessionId } : {}),
@@ -0,0 +1,3 @@
1
+ import type { WebhookSystemStatus } from '../../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
2
+ export declare function loadWebhookStatus(): Promise<WebhookSystemStatus>;
3
+ //# sourceMappingURL=load-webhook-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-webhook-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/load-webhook-status.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sEAAsE,CAAC;AAEhH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAiBtE"}
@@ -0,0 +1,19 @@
1
+ 'use server';
2
+ import { hasWebhookManager, getWebhookManager, } from '../../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
3
+ export async function loadWebhookStatus() {
4
+ if (!hasWebhookManager()) {
5
+ return {
6
+ running: false,
7
+ tunnel: { connected: false, publicUrl: null },
8
+ webhooks: {
9
+ registered: [],
10
+ totalDeliveries: 0,
11
+ successCount: 0,
12
+ errorCount: 0,
13
+ ignoredCount: 0,
14
+ },
15
+ startedAt: null,
16
+ };
17
+ }
18
+ return getWebhookManager().getStatus();
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"reject-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/reject-feature.ts"],"names":[],"mappings":"AAWA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC;IACT,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA8CD"}
1
+ {"version":3,"file":"reject-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/reject-feature.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC;IACT,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAqCD"}
@@ -1,7 +1,5 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- import { AgentRunStatus } from '../../../../../packages/core/src/domain/generated/output.js';
4
- const ERROR_STATUSES = new Set([AgentRunStatus.failed, AgentRunStatus.interrupted]);
5
3
  export async function rejectFeature(featureId, feedback, attachments) {
6
4
  if (!featureId.trim()) {
7
5
  return { rejected: false, error: 'Feature id is required' };
@@ -18,13 +16,6 @@ export async function rejectFeature(featureId, feedback, attachments) {
18
16
  if (!feature.agentRunId) {
19
17
  return { rejected: false, error: 'Feature has no agent run' };
20
18
  }
21
- const runRepo = resolve('IAgentRunRepository');
22
- const run = await runRepo.findById(feature.agentRunId);
23
- if (run && ERROR_STATUSES.has(run.status)) {
24
- const resumeUseCase = resolve('ResumeFeatureUseCase');
25
- await resumeUseCase.execute(featureId, { promptPrefix: feedback });
26
- return { rejected: true, iteration: 1 };
27
- }
28
19
  const rejectUseCase = resolve('RejectAgentRunUseCase');
29
20
  const result = await rejectUseCase.execute(feature.agentRunId, feedback, attachments);
30
21
  if (!result.rejected) {
@@ -0,0 +1,5 @@
1
+ export declare function startFeature(featureId: string): Promise<{
2
+ started: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=start-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/start-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function startFeature(featureId) {
4
+ if (!featureId.trim()) {
5
+ return { started: false, error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('StartFeatureUseCase');
9
+ await useCase.execute(featureId);
10
+ return { started: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to start feature';
14
+ return { started: false, error: message };
15
+ }
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAsEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
@@ -34,6 +34,7 @@ const LIFECYCLE_TO_NODE = {
34
34
  [SdlcLifecycle.Review]: 'merge',
35
35
  [SdlcLifecycle.Maintain]: 'maintain',
36
36
  [SdlcLifecycle.Blocked]: 'blocked',
37
+ [SdlcLifecycle.Pending]: 'pending',
37
38
  [SdlcLifecycle.Deleting]: 'blocked',
38
39
  };
39
40
  const STATUS_TO_EVENT = {
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Webhook Delivery History: GET /api/webhooks/deliveries
3
+ *
4
+ * Returns recent webhook delivery records with optional filtering.
5
+ * Query params: ?status=success|error|ignored&eventType=pull_request&limit=50
6
+ */
7
+ export declare const dynamic = "force-dynamic";
8
+ export declare function GET(request: Request): Promise<Response>;
9
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/webhooks/deliveries/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB7D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Webhook Delivery History: GET /api/webhooks/deliveries
3
+ *
4
+ * Returns recent webhook delivery records with optional filtering.
5
+ * Query params: ?status=success|error|ignored&eventType=pull_request&limit=50
6
+ */
7
+ import { hasWebhookManager, getWebhookManager, } from '../../../../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
8
+ export const dynamic = 'force-dynamic';
9
+ export async function GET(request) {
10
+ if (!hasWebhookManager()) {
11
+ return Response.json({ deliveries: [] });
12
+ }
13
+ const url = new URL(request.url);
14
+ const statusFilter = url.searchParams.get('status');
15
+ const eventTypeFilter = url.searchParams.get('eventType');
16
+ const limitParam = url.searchParams.get('limit');
17
+ const limit = limitParam ? Math.min(parseInt(limitParam, 10) || 50, 200) : 50;
18
+ const manager = getWebhookManager();
19
+ let deliveries = [...manager.getDeliveryHistory()];
20
+ if (statusFilter) {
21
+ deliveries = deliveries.filter((d) => d.status === statusFilter);
22
+ }
23
+ if (eventTypeFilter) {
24
+ deliveries = deliveries.filter((d) => d.eventType === eventTypeFilter);
25
+ }
26
+ return Response.json({ deliveries: deliveries.slice(0, limit) });
27
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GitHub Webhook Receiver: POST /api/webhooks/github
3
+ *
4
+ * Receives webhook events from GitHub, validates the HMAC-SHA256 signature,
5
+ * and routes the event to the GitHubWebhookService for processing.
6
+ *
7
+ * This endpoint is exposed via a Cloudflare Tunnel so GitHub can reach it.
8
+ * Only POST requests are accepted; all other methods return 405.
9
+ */
10
+ export declare const dynamic = "force-dynamic";
11
+ export declare function POST(request: Request): Promise<Response>;
12
+ /**
13
+ * Health check: GET /api/webhooks/github
14
+ * Returns whether the webhook system is active.
15
+ */
16
+ export declare function GET(): Promise<Response>;
17
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/webhooks/github/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsD9D;AAED;;;GAGG;AACH,wBAAsB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAS7C"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * GitHub Webhook Receiver: POST /api/webhooks/github
3
+ *
4
+ * Receives webhook events from GitHub, validates the HMAC-SHA256 signature,
5
+ * and routes the event to the GitHubWebhookService for processing.
6
+ *
7
+ * This endpoint is exposed via a Cloudflare Tunnel so GitHub can reach it.
8
+ * Only POST requests are accepted; all other methods return 405.
9
+ */
10
+ import { resolve } from '../../../../lib/server-container.js';
11
+ import { hasWebhookManager } from '../../../../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
12
+ export const dynamic = 'force-dynamic';
13
+ export async function POST(request) {
14
+ // Verify webhook system is running
15
+ if (!hasWebhookManager()) {
16
+ return Response.json({ error: 'Webhook system not initialized' }, { status: 503 });
17
+ }
18
+ // Read raw body for signature validation
19
+ const rawBody = await request.text();
20
+ if (!rawBody) {
21
+ return Response.json({ error: 'Empty request body' }, { status: 400 });
22
+ }
23
+ // Get the webhook service from DI container
24
+ let webhookService;
25
+ try {
26
+ webhookService = resolve('IWebhookService');
27
+ }
28
+ catch {
29
+ return Response.json({ error: 'Webhook service not available' }, { status: 503 });
30
+ }
31
+ // Validate GitHub signature
32
+ const signature = request.headers.get('x-hub-signature-256') ?? '';
33
+ const validation = webhookService.validateSignature(rawBody, signature, webhookService.getSecret());
34
+ if (!validation.valid) {
35
+ // eslint-disable-next-line no-console
36
+ console.warn(`[WebhookRoute] Invalid signature: ${validation.error}`);
37
+ return Response.json({ error: `Invalid signature: ${validation.error}` }, { status: 401 });
38
+ }
39
+ // Parse the event
40
+ const eventType = request.headers.get('x-github-event') ?? 'unknown';
41
+ const deliveryId = request.headers.get('x-github-delivery') ?? 'unknown';
42
+ let payload;
43
+ try {
44
+ payload = JSON.parse(rawBody);
45
+ }
46
+ catch {
47
+ return Response.json({ error: 'Invalid JSON payload' }, { status: 400 });
48
+ }
49
+ // Process the event asynchronously (respond immediately to GitHub)
50
+ void webhookService.handleEvent({
51
+ source: 'github',
52
+ eventType,
53
+ deliveryId,
54
+ payload,
55
+ });
56
+ return Response.json({ received: true, deliveryId });
57
+ }
58
+ /**
59
+ * Health check: GET /api/webhooks/github
60
+ * Returns whether the webhook system is active.
61
+ */
62
+ export async function GET() {
63
+ const active = hasWebhookManager();
64
+ return Response.json({
65
+ active,
66
+ message: active
67
+ ? 'Webhook receiver is active'
68
+ : 'Webhook system not initialized (cloudflared may not be installed)',
69
+ });
70
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Webhook System Status: GET /api/webhooks/status
3
+ *
4
+ * Returns the full webhook system status including tunnel state,
5
+ * registered webhooks, and delivery statistics.
6
+ */
7
+ export declare const dynamic = "force-dynamic";
8
+ export declare function GET(): Promise<Response>;
9
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/webhooks/status/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAkB7C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Webhook System Status: GET /api/webhooks/status
3
+ *
4
+ * Returns the full webhook system status including tunnel state,
5
+ * registered webhooks, and delivery statistics.
6
+ */
7
+ import { hasWebhookManager, getWebhookManager, } from '../../../../../../../packages/core/src/infrastructure/services/webhook/webhook-manager.service.js';
8
+ export const dynamic = 'force-dynamic';
9
+ export async function GET() {
10
+ if (!hasWebhookManager()) {
11
+ return Response.json({
12
+ running: false,
13
+ tunnel: { connected: false, publicUrl: null },
14
+ webhooks: {
15
+ registered: [],
16
+ totalDeliveries: 0,
17
+ successCount: 0,
18
+ errorCount: 0,
19
+ ignoredCount: 0,
20
+ },
21
+ startedAt: null,
22
+ });
23
+ }
24
+ const manager = getWebhookManager();
25
+ return Response.json(manager.getStatus());
26
+ }
@@ -0,0 +1,4 @@
1
+ /** Skip static pre-rendering since we need runtime webhook manager. */
2
+ export declare const dynamic = "force-dynamic";
3
+ export default function WebhooksPage(): Promise<import("react/jsx-runtime").JSX.Element>;
4
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/webhooks/page.tsx"],"names":[],"mappings":"AAGA,uEAAuE;AACvE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,YAAY,qDAQzC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { loadWebhookStatus } from '../actions/load-webhook-status.js';
3
+ import { WebhooksPageClient } from '../../components/features/webhooks/webhooks-page-client.js';
4
+ /** Skip static pre-rendering since we need runtime webhook manager. */
5
+ export const dynamic = 'force-dynamic';
6
+ export default async function WebhooksPage() {
7
+ const status = await loadWebhookStatus();
8
+ return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(WebhooksPageClient, { initialStatus: status }) }));
9
+ }
@@ -15,7 +15,7 @@ const drawerVariants = cva('', {
15
15
  variants: {
16
16
  size: {
17
17
  sm: 'w-96',
18
- md: 'w-xl',
18
+ md: 'w-2xl',
19
19
  },
20
20
  },
21
21
  defaultVariants: {
@@ -32,7 +32,7 @@ export const SmallSize = {
32
32
  };
33
33
  /** Medium size with content-rich review-style content. */
34
34
  export const MediumSize = {
35
- render: () => (_jsx(DrawerTrigger, { size: "md", children: _jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Review Content" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "This drawer uses size=\"md\" (w-xl / 576px) for content-rich review panels that need more horizontal space for diff summaries, tables, and code blocks." }), _jsx("div", { className: "bg-muted rounded-md p-3", children: _jsx("pre", { className: "text-xs", children: `+ Added authentication middleware\n- Removed legacy session handler\n Updated user model schema` }) })] }) })),
35
+ render: () => (_jsx(DrawerTrigger, { size: "md", children: _jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Review Content" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "This drawer uses size=\"md\" (w-2xl / 672px) for content-rich review panels that need more horizontal space for diff summaries, tables, and code blocks." }), _jsx("div", { className: "bg-muted rounded-md p-3", children: _jsx("pre", { className: "text-xs", children: `+ Added authentication middleware\n- Removed legacy session handler\n Updated user model schema` }) })] }) })),
36
36
  };
37
37
  /** Modal drawer with overlay. */
38
38
  export const Modal = {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA8iB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA+jB1F"}
@@ -6,6 +6,7 @@ import { toast } from 'sonner';
6
6
  import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from 'lucide-react';
7
7
  import { approveFeature } from '../../../app/actions/approve-feature.js';
8
8
  import { resumeFeature } from '../../../app/actions/resume-feature.js';
9
+ import { startFeature } from '../../../app/actions/start-feature.js';
9
10
  import { rejectFeature } from '../../../app/actions/reject-feature.js';
10
11
  import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
11
12
  import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
@@ -281,6 +282,20 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
281
282
  return { ...prev, node: { ...prev.node, state: 'running' } };
282
283
  });
283
284
  }, []);
285
+ const handleStart = useCallback(async (featureId) => {
286
+ const result = await startFeature(featureId);
287
+ if (result.error) {
288
+ toast.error(result.error);
289
+ return;
290
+ }
291
+ toast.success('Feature started');
292
+ // Optimistically update the drawer view
293
+ setView((prev) => {
294
+ if (prev.type !== 'feature')
295
+ return prev;
296
+ return { ...prev, node: { ...prev.node, state: 'running' } };
297
+ });
298
+ }, []);
284
299
  // ── Hooks (always called unconditionally per Rules of Hooks) ──────────
285
300
  const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
286
301
  ? {
@@ -322,7 +337,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
322
337
  // ── Body ──────────────────────────────────────────────────────────────
323
338
  let body = null;
324
339
  if (view.type === 'feature' && featureNode) {
325
- const enrichedNode = featureNode.state === 'error' ? { ...featureNode, onRetry: handleRetry } : featureNode;
340
+ const enrichedNode = {
341
+ ...featureNode,
342
+ ...(featureNode.state === 'error' && { onRetry: handleRetry }),
343
+ ...(featureNode.state === 'pending' && { onStart: handleStart }),
344
+ };
326
345
  body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
327
346
  }
328
347
  return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
@@ -36,6 +36,8 @@ export interface FeatureCreatePayload {
36
36
  parentId?: string;
37
37
  /** When true, skip SDLC phases and implement directly from the prompt. */
38
38
  fast: boolean;
39
+ /** When true, create the feature in pending state (no agent spawned). */
40
+ pending?: boolean;
39
41
  /** Optional agent type override for this feature run */
40
42
  agentType?: string;
41
43
  /** Optional model override for this feature run */