@shepai/cli 1.136.0-pr440.bb6800a → 1.136.0-pr441.5eaafd1

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 (552) hide show
  1. package/apis/json-schema/Feature.yaml +0 -3
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/NotificationEventConfig.yaml +15 -0
  4. package/apis/json-schema/NotificationEventType.yaml +3 -0
  5. package/apis/json-schema/ScheduledWorkflow.yaml +46 -0
  6. package/apis/json-schema/SdlcLifecycle.yaml +0 -1
  7. package/apis/json-schema/WorkflowExecution.yaml +38 -0
  8. package/apis/json-schema/WorkflowExecutionStatus.yaml +10 -0
  9. package/apis/json-schema/WorkflowTriggerType.yaml +7 -0
  10. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +0 -2
  11. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts +2 -0
  13. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/ports/output/repositories/workflow-execution-repository.interface.d.ts +66 -0
  15. package/dist/packages/core/src/application/ports/output/repositories/workflow-execution-repository.interface.d.ts.map +1 -0
  16. package/dist/packages/core/src/application/ports/output/repositories/workflow-execution-repository.interface.js +11 -0
  17. package/dist/packages/core/src/application/ports/output/repositories/workflow-repository.interface.d.ts +81 -0
  18. package/dist/packages/core/src/application/ports/output/repositories/workflow-repository.interface.d.ts.map +1 -0
  19. package/dist/packages/core/src/application/ports/output/repositories/workflow-repository.interface.js +11 -0
  20. package/dist/packages/core/src/application/ports/output/services/clock.interface.d.ts +28 -0
  21. package/dist/packages/core/src/application/ports/output/services/clock.interface.d.ts.map +1 -0
  22. package/dist/packages/core/src/application/ports/output/services/clock.interface.js +13 -0
  23. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  24. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  25. package/dist/packages/core/src/application/use-cases/workflows/create-workflow.use-case.d.ts +28 -0
  26. package/dist/packages/core/src/application/use-cases/workflows/create-workflow.use-case.d.ts.map +1 -0
  27. package/dist/packages/core/src/application/use-cases/workflows/create-workflow.use-case.js +72 -0
  28. package/dist/packages/core/src/application/use-cases/workflows/cron-helpers.d.ts +27 -0
  29. package/dist/packages/core/src/application/use-cases/workflows/cron-helpers.d.ts.map +1 -0
  30. package/dist/packages/core/src/application/use-cases/workflows/cron-helpers.js +43 -0
  31. package/dist/packages/core/src/application/use-cases/workflows/delete-workflow.use-case.d.ts +18 -0
  32. package/dist/packages/core/src/application/use-cases/workflows/delete-workflow.use-case.d.ts.map +1 -0
  33. package/dist/packages/core/src/application/use-cases/workflows/delete-workflow.use-case.js +64 -0
  34. package/dist/packages/core/src/application/use-cases/workflows/get-workflow-history.use-case.d.ts +16 -0
  35. package/dist/packages/core/src/application/use-cases/workflows/get-workflow-history.use-case.d.ts.map +1 -0
  36. package/dist/packages/core/src/application/use-cases/workflows/get-workflow-history.use-case.js +46 -0
  37. package/dist/packages/core/src/application/use-cases/workflows/get-workflow.use-case.d.ts +13 -0
  38. package/dist/packages/core/src/application/use-cases/workflows/get-workflow.use-case.d.ts.map +1 -0
  39. package/dist/packages/core/src/application/use-cases/workflows/get-workflow.use-case.js +42 -0
  40. package/dist/packages/core/src/application/use-cases/workflows/list-workflows.use-case.d.ts +13 -0
  41. package/dist/packages/core/src/application/use-cases/workflows/list-workflows.use-case.d.ts.map +1 -0
  42. package/dist/packages/core/src/application/use-cases/workflows/list-workflows.use-case.js +33 -0
  43. package/dist/packages/core/src/application/use-cases/workflows/run-workflow.use-case.d.ts +19 -0
  44. package/dist/packages/core/src/application/use-cases/workflows/run-workflow.use-case.d.ts.map +1 -0
  45. package/dist/packages/core/src/application/use-cases/workflows/run-workflow.use-case.js +62 -0
  46. package/dist/packages/core/src/application/use-cases/workflows/schedule-workflow.use-case.d.ts +22 -0
  47. package/dist/packages/core/src/application/use-cases/workflows/schedule-workflow.use-case.d.ts.map +1 -0
  48. package/dist/packages/core/src/application/use-cases/workflows/schedule-workflow.use-case.js +73 -0
  49. package/dist/packages/core/src/application/use-cases/workflows/templates/branch-rebase.template.d.ts +9 -0
  50. package/dist/packages/core/src/application/use-cases/workflows/templates/branch-rebase.template.d.ts.map +1 -0
  51. package/dist/packages/core/src/application/use-cases/workflows/templates/branch-rebase.template.js +27 -0
  52. package/dist/packages/core/src/application/use-cases/workflows/templates/issue-triage.template.d.ts +11 -0
  53. package/dist/packages/core/src/application/use-cases/workflows/templates/issue-triage.template.d.ts.map +1 -0
  54. package/dist/packages/core/src/application/use-cases/workflows/templates/issue-triage.template.js +27 -0
  55. package/dist/packages/core/src/application/use-cases/workflows/toggle-workflow.use-case.d.ts +16 -0
  56. package/dist/packages/core/src/application/use-cases/workflows/toggle-workflow.use-case.d.ts.map +1 -0
  57. package/dist/packages/core/src/application/use-cases/workflows/toggle-workflow.use-case.js +60 -0
  58. package/dist/packages/core/src/application/use-cases/workflows/update-workflow.use-case.d.ts +25 -0
  59. package/dist/packages/core/src/application/use-cases/workflows/update-workflow.use-case.d.ts.map +1 -0
  60. package/dist/packages/core/src/application/use-cases/workflows/update-workflow.use-case.js +83 -0
  61. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  62. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +4 -0
  63. package/dist/packages/core/src/domain/generated/output.d.ts +115 -7
  64. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  65. package/dist/packages/core/src/domain/generated/output.js +16 -1
  66. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  67. package/dist/packages/core/src/infrastructure/di/container.js +66 -10
  68. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +0 -1
  69. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  70. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +0 -6
  71. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -0
  72. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  73. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +8 -0
  74. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow-execution.mapper.d.ts +46 -0
  75. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow-execution.mapper.d.ts.map +1 -0
  76. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow-execution.mapper.js +57 -0
  77. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow.mapper.d.ts +51 -0
  78. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow.mapper.d.ts.map +1 -0
  79. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/workflow.mapper.js +71 -0
  80. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-workflow-notification-events.d.ts +12 -0
  81. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-workflow-notification-events.d.ts.map +1 -0
  82. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-workflow-notification-events.js +22 -0
  83. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-scheduled-workflows.d.ts +14 -0
  84. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-scheduled-workflows.d.ts.map +1 -0
  85. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-scheduled-workflows.js +65 -0
  86. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-feature-flag-scheduled-workflows.d.ts +11 -0
  87. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-feature-flag-scheduled-workflows.d.ts.map +1 -0
  88. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-feature-flag-scheduled-workflows.js +17 -0
  89. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  90. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +2 -7
  91. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow-execution.repository.d.ts +24 -0
  92. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow-execution.repository.d.ts.map +1 -0
  93. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow-execution.repository.js +92 -0
  94. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow.repository.d.ts +26 -0
  95. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow.repository.d.ts.map +1 -0
  96. package/dist/packages/core/src/infrastructure/repositories/sqlite-workflow.repository.js +117 -0
  97. package/dist/packages/core/src/infrastructure/services/clock.d.ts +11 -0
  98. package/dist/packages/core/src/infrastructure/services/clock.d.ts.map +1 -0
  99. package/dist/packages/core/src/infrastructure/services/clock.js +22 -0
  100. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -1
  101. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +3 -0
  102. package/dist/packages/core/src/infrastructure/services/workflow-scheduler/workflow-scheduler.service.d.ts +69 -0
  103. package/dist/packages/core/src/infrastructure/services/workflow-scheduler/workflow-scheduler.service.d.ts.map +1 -0
  104. package/dist/packages/core/src/infrastructure/services/workflow-scheduler/workflow-scheduler.service.js +270 -0
  105. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  106. package/dist/src/presentation/cli/commands/_serve.command.js +14 -0
  107. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  108. package/dist/src/presentation/cli/commands/feat/index.js +1 -5
  109. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  110. package/dist/src/presentation/cli/commands/feat/ls.command.js +0 -5
  111. package/dist/src/presentation/cli/commands/workflow/create.command.d.ts +13 -0
  112. package/dist/src/presentation/cli/commands/workflow/create.command.d.ts.map +1 -0
  113. package/dist/src/presentation/cli/commands/workflow/create.command.js +83 -0
  114. package/dist/src/presentation/cli/commands/workflow/delete.command.d.ts +13 -0
  115. package/dist/src/presentation/cli/commands/workflow/delete.command.d.ts.map +1 -0
  116. package/dist/src/presentation/cli/commands/workflow/delete.command.js +50 -0
  117. package/dist/src/presentation/cli/commands/workflow/disable.command.d.ts +11 -0
  118. package/dist/src/presentation/cli/commands/workflow/disable.command.d.ts.map +1 -0
  119. package/dist/src/presentation/cli/commands/workflow/disable.command.js +32 -0
  120. package/dist/src/presentation/cli/commands/workflow/enable.command.d.ts +11 -0
  121. package/dist/src/presentation/cli/commands/workflow/enable.command.d.ts.map +1 -0
  122. package/dist/src/presentation/cli/commands/workflow/enable.command.js +35 -0
  123. package/dist/src/presentation/cli/commands/workflow/format-helpers.d.ts +35 -0
  124. package/dist/src/presentation/cli/commands/workflow/format-helpers.d.ts.map +1 -0
  125. package/dist/src/presentation/cli/commands/workflow/format-helpers.js +89 -0
  126. package/dist/src/presentation/cli/commands/workflow/history.command.d.ts +12 -0
  127. package/dist/src/presentation/cli/commands/workflow/history.command.d.ts.map +1 -0
  128. package/dist/src/presentation/cli/commands/workflow/history.command.js +46 -0
  129. package/dist/src/presentation/cli/commands/workflow/index.d.ts +26 -0
  130. package/dist/src/presentation/cli/commands/workflow/index.d.ts.map +1 -0
  131. package/dist/src/presentation/cli/commands/workflow/index.js +48 -0
  132. package/dist/src/presentation/cli/commands/workflow/list.command.d.ts +11 -0
  133. package/dist/src/presentation/cli/commands/workflow/list.command.d.ts.map +1 -0
  134. package/dist/src/presentation/cli/commands/workflow/list.command.js +52 -0
  135. package/dist/src/presentation/cli/commands/workflow/run.command.d.ts +11 -0
  136. package/dist/src/presentation/cli/commands/workflow/run.command.d.ts.map +1 -0
  137. package/dist/src/presentation/cli/commands/workflow/run.command.js +37 -0
  138. package/dist/src/presentation/cli/commands/workflow/schedule.command.d.ts +13 -0
  139. package/dist/src/presentation/cli/commands/workflow/schedule.command.d.ts.map +1 -0
  140. package/dist/src/presentation/cli/commands/workflow/schedule.command.js +76 -0
  141. package/dist/src/presentation/cli/commands/workflow/show.command.d.ts +11 -0
  142. package/dist/src/presentation/cli/commands/workflow/show.command.d.ts.map +1 -0
  143. package/dist/src/presentation/cli/commands/workflow/show.command.js +93 -0
  144. package/dist/src/presentation/cli/commands/workflow/update.command.d.ts +13 -0
  145. package/dist/src/presentation/cli/commands/workflow/update.command.d.ts.map +1 -0
  146. package/dist/src/presentation/cli/commands/workflow/update.command.js +67 -0
  147. package/dist/src/presentation/cli/index.js +2 -0
  148. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  149. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +1 -6
  150. package/dist/src/presentation/web/app/actions/get-workflow-history.d.ts +7 -0
  151. package/dist/src/presentation/web/app/actions/get-workflow-history.d.ts.map +1 -0
  152. package/dist/src/presentation/web/app/actions/get-workflow-history.js +17 -0
  153. package/dist/src/presentation/web/app/actions/list-workflows.d.ts +7 -0
  154. package/dist/src/presentation/web/app/actions/list-workflows.d.ts.map +1 -0
  155. package/dist/src/presentation/web/app/actions/list-workflows.js +17 -0
  156. package/dist/src/presentation/web/app/actions/toggle-workflow.d.ts +8 -0
  157. package/dist/src/presentation/web/app/actions/toggle-workflow.d.ts.map +1 -0
  158. package/dist/src/presentation/web/app/actions/toggle-workflow.js +19 -0
  159. package/dist/src/presentation/web/app/actions/trigger-workflow.d.ts +8 -0
  160. package/dist/src/presentation/web/app/actions/trigger-workflow.d.ts.map +1 -0
  161. package/dist/src/presentation/web/app/actions/trigger-workflow.js +19 -0
  162. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  163. package/dist/src/presentation/web/app/api/agent-events/route.js +0 -1
  164. package/dist/src/presentation/web/app/workflows/page.d.ts +4 -0
  165. package/dist/src/presentation/web/app/workflows/page.d.ts.map +1 -0
  166. package/dist/src/presentation/web/app/workflows/page.js +18 -0
  167. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  168. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +4 -6
  169. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -3
  170. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  171. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +1 -11
  172. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  173. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -16
  174. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +0 -5
  175. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  176. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -75
  177. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  178. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +4 -13
  179. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +0 -6
  180. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  181. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +0 -70
  182. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +0 -6
  183. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  184. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -43
  185. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  186. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  187. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  188. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  189. package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
  190. package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +6 -1
  191. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.d.ts.map +1 -1
  192. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +6 -0
  193. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  194. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +19 -2
  195. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  196. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  197. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.d.ts +7 -0
  198. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.d.ts.map +1 -0
  199. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.js +84 -0
  200. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.stories.d.ts +11 -0
  201. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.stories.d.ts.map +1 -0
  202. package/dist/src/presentation/web/components/features/workflows/workflow-execution-history.stories.js +104 -0
  203. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.d.ts +8 -0
  204. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.d.ts.map +1 -0
  205. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.js +68 -0
  206. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.stories.d.ts +11 -0
  207. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.stories.d.ts.map +1 -0
  208. package/dist/src/presentation/web/components/features/workflows/workflow-list-item.stories.js +89 -0
  209. package/dist/src/presentation/web/components/features/workflows/workflow-list.d.ts +8 -0
  210. package/dist/src/presentation/web/components/features/workflows/workflow-list.d.ts.map +1 -0
  211. package/dist/src/presentation/web/components/features/workflows/workflow-list.js +10 -0
  212. package/dist/src/presentation/web/components/features/workflows/workflow-list.stories.d.ts +11 -0
  213. package/dist/src/presentation/web/components/features/workflows/workflow-list.stories.d.ts.map +1 -0
  214. package/dist/src/presentation/web/components/features/workflows/workflow-list.stories.js +90 -0
  215. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.d.ts +6 -0
  216. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.d.ts.map +1 -0
  217. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.js +14 -0
  218. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.stories.d.ts +10 -0
  219. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.stories.d.ts.map +1 -0
  220. package/dist/src/presentation/web/components/features/workflows/workflows-page-client.stories.js +70 -0
  221. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  222. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  223. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  224. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  225. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  226. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  227. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  228. package/dist/src/presentation/web/hooks/sidebar-features-context.js +0 -1
  229. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
  230. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  231. package/dist/src/presentation/web/hooks/use-graph-state.js +2 -17
  232. package/dist/src/presentation/web/lib/derive-graph.d.ts +0 -4
  233. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  234. package/dist/src/presentation/web/lib/derive-graph.js +0 -12
  235. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  236. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  237. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  238. package/dist/tsconfig.build.tsbuildinfo +1 -1
  239. package/package.json +2 -1
  240. package/web/.next/BUILD_ID +1 -1
  241. package/web/.next/app-path-routes-manifest.json +2 -1
  242. package/web/.next/build-manifest.json +2 -2
  243. package/web/.next/fallback-build-manifest.json +2 -2
  244. package/web/.next/prerender-manifest.json +3 -3
  245. package/web/.next/required-server-files.js +1 -1
  246. package/web/.next/required-server-files.json +1 -1
  247. package/web/.next/routes-manifest.json +6 -0
  248. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +50 -80
  249. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  250. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  251. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  252. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +50 -80
  253. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  254. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  255. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  256. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  257. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  258. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  259. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  260. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +62 -92
  261. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  262. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  263. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  264. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  265. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  266. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  267. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  268. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +50 -80
  269. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  270. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  271. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  272. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  273. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  274. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  275. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  276. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +62 -92
  277. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  278. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  279. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  280. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +46 -76
  281. package/web/.next/server/app/(dashboard)/page.js +3 -3
  282. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  283. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  284. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  285. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  286. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  287. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  288. package/web/.next/server/app/_global-error.html +2 -2
  289. package/web/.next/server/app/_global-error.rsc +1 -1
  290. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  291. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  292. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  293. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  294. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  295. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  296. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  297. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  298. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  299. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  300. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  301. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  302. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  303. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  304. package/web/.next/server/app/settings/page.js +2 -2
  305. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  306. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  307. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  308. package/web/.next/server/app/skills/page.js +1 -1
  309. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  310. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  311. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  312. package/web/.next/server/app/tools/page.js +1 -1
  313. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  314. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  315. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  316. package/web/.next/server/app/version/page.js.nft.json +1 -1
  317. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  318. package/web/.next/server/app/workflows/page/app-paths-manifest.json +3 -0
  319. package/web/.next/server/app/workflows/page/build-manifest.json +18 -0
  320. package/web/.next/server/app/workflows/page/next-font-manifest.json +6 -0
  321. package/web/.next/server/app/workflows/page/react-loadable-manifest.json +8 -0
  322. package/web/.next/server/app/workflows/page/server-reference-manifest.json +110 -0
  323. package/web/.next/server/app/workflows/page.js +18 -0
  324. package/web/.next/server/app/workflows/page.js.map +5 -0
  325. package/web/.next/server/app/workflows/page.js.nft.json +1 -0
  326. package/web/.next/server/app/workflows/page_client-reference-manifest.js +2 -0
  327. package/web/.next/server/app-paths-manifest.json +2 -1
  328. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  329. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  330. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  331. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  332. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  333. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  334. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  335. package/web/.next/server/chunks/{[root-of-the-server]__2b1074db._.js → [root-of-the-server]__c7d52490._.js} +2 -2
  336. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  337. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  338. package/web/.next/server/chunks/ssr/{_02ec1aea._.js → 403f9_next_53742624._.js} +2 -2
  339. package/web/.next/server/chunks/ssr/403f9_next_53742624._.js.map +1 -0
  340. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +3 -0
  341. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -0
  342. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  343. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  344. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_0c7787d0._.js +3 -0
  345. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_0c7787d0._.js.map +1 -0
  346. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +3 -0
  347. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -0
  348. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +3 -0
  349. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -0
  350. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a5f9c6e5._.js → [root-of-the-server]__07f12984._.js} +3 -3
  351. package/web/.next/server/chunks/ssr/[root-of-the-server]__07f12984._.js.map +1 -0
  352. package/web/.next/server/chunks/ssr/[root-of-the-server]__082758f6._.js +3 -0
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__082758f6._.js.map +1 -0
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__32cd6108._.js +3 -0
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__32cd6108._.js.map +1 -0
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__33ac1a70._.js +3 -0
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__33ac1a70._.js.map +1 -0
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  361. package/web/.next/server/chunks/ssr/[root-of-the-server]__44358910._.js +4 -0
  362. package/web/.next/server/chunks/ssr/[root-of-the-server]__44358910._.js.map +1 -0
  363. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js +3 -0
  364. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js.map +1 -0
  365. package/web/.next/server/chunks/ssr/{[root-of-the-server]__3ef34e4c._.js → [root-of-the-server]__57e0ee34._.js} +3 -3
  366. package/web/.next/server/chunks/ssr/[root-of-the-server]__57e0ee34._.js.map +1 -0
  367. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js +3 -0
  368. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js.map +1 -0
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__6e93b49c._.js +3 -0
  370. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3dbadca._.js.map → [root-of-the-server]__6e93b49c._.js.map} +1 -1
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js +3 -0
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js.map +1 -0
  373. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  374. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  375. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  376. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  377. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js +3 -0
  378. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js.map +1 -0
  379. package/web/.next/server/chunks/ssr/_20a4a0d5._.js +3 -0
  380. package/web/.next/server/chunks/ssr/_20a4a0d5._.js.map +1 -0
  381. package/web/.next/server/chunks/ssr/_25555eb5._.js +3 -0
  382. package/web/.next/server/chunks/ssr/_25555eb5._.js.map +1 -0
  383. package/web/.next/server/chunks/ssr/{_b5fc318a._.js → _277acdde._.js} +2 -2
  384. package/web/.next/server/chunks/ssr/_277acdde._.js.map +1 -0
  385. package/web/.next/server/chunks/ssr/_4711e8cf._.js +3 -0
  386. package/web/.next/server/chunks/ssr/_4711e8cf._.js.map +1 -0
  387. package/web/.next/server/chunks/ssr/{_a9f57758._.js → _6701ee41._.js} +2 -2
  388. package/web/.next/server/chunks/ssr/{_a9f57758._.js.map → _6701ee41._.js.map} +1 -1
  389. package/web/.next/server/chunks/ssr/_89a36303._.js +3 -0
  390. package/web/.next/server/chunks/ssr/_89a36303._.js.map +1 -0
  391. package/web/.next/server/chunks/ssr/_8e8cd7e1._.js +4 -0
  392. package/web/.next/server/chunks/ssr/_8e8cd7e1._.js.map +1 -0
  393. package/web/.next/server/chunks/ssr/_9869d3da._.js +3 -0
  394. package/web/.next/server/chunks/ssr/_9869d3da._.js.map +1 -0
  395. package/web/.next/server/chunks/ssr/{_0020fddd._.js → _a3721140._.js} +2 -2
  396. package/web/.next/server/chunks/ssr/_a3721140._.js.map +1 -0
  397. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  398. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/_cc1243e6._.js +3 -0
  400. package/web/.next/server/chunks/ssr/_cc1243e6._.js.map +1 -0
  401. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  402. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  403. package/web/.next/server/chunks/ssr/_e3411387._.js +9 -0
  404. package/web/.next/server/chunks/ssr/_e3411387._.js.map +1 -0
  405. package/web/.next/server/chunks/ssr/_e69a26ba._.js +4 -0
  406. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +1 -0
  407. package/web/.next/server/chunks/ssr/_f64ffec0._.js +4 -0
  408. package/web/.next/server/chunks/ssr/_f64ffec0._.js.map +1 -0
  409. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  410. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  411. package/web/.next/server/chunks/ssr/{_1b7dae9a._.js → f7870_sonner_dist_index_mjs_dbf63824._.js} +2 -2
  412. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +1 -0
  413. package/web/.next/server/chunks/ssr/node_modules__pnpm_28388798._.js +3 -0
  414. package/web/.next/server/chunks/ssr/node_modules__pnpm_28388798._.js.map +1 -0
  415. package/web/.next/server/chunks/ssr/node_modules__pnpm_ae1705ef._.js +3 -0
  416. package/web/.next/server/chunks/ssr/node_modules__pnpm_ae1705ef._.js.map +1 -0
  417. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +5 -0
  418. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -0
  419. package/web/.next/server/chunks/ssr/src_presentation_web_53fa3010._.js +3 -0
  420. package/web/.next/server/chunks/ssr/{src_presentation_web_97dc2fb0._.js.map → src_presentation_web_53fa3010._.js.map} +1 -1
  421. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +3 -0
  422. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -0
  423. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  424. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  425. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  426. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  427. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  428. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  429. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  430. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  431. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  432. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  433. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +5 -0
  434. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -0
  435. package/web/.next/server/pages/500.html +2 -2
  436. package/web/.next/server/server-reference-manifest.js +1 -1
  437. package/web/.next/server/server-reference-manifest.json +391 -466
  438. package/web/.next/static/chunks/{791e64500a080d4f.js → 196650f8cd7fb06a.js} +1 -1
  439. package/web/.next/static/chunks/2002f5eec5ffec42.css +1 -0
  440. package/web/.next/static/chunks/2c1ff62df9b34313.js +1 -0
  441. package/web/.next/static/chunks/3005583e819fc4fc.js +1 -0
  442. package/web/.next/static/chunks/333c7873f6b17ef1.js +1 -0
  443. package/web/.next/static/chunks/3b3f8c4f6c36a7ba.js +1 -0
  444. package/web/.next/static/chunks/{672e3da3ad26005b.js → 42c9564e375717ed.js} +1 -1
  445. package/web/.next/static/chunks/43e0eea352eb5106.js +5 -0
  446. package/web/.next/static/chunks/5420560352333486.js +1 -0
  447. package/web/.next/static/chunks/62fa33876b0964a4.js +1 -0
  448. package/web/.next/static/chunks/6db2addb5e13e372.js +1 -0
  449. package/web/.next/static/chunks/886d0385ca1d4484.js +1 -0
  450. package/web/.next/static/chunks/8e52a649c3f6bdf4.js +1 -0
  451. package/web/.next/static/chunks/a02fc9467a585a1f.js +2 -0
  452. package/web/.next/static/chunks/bee578019062e7f9.js +2 -0
  453. package/web/.next/static/chunks/cdb51cfd682387d2.js +1 -0
  454. package/web/.next/static/chunks/ed35b4293a81c861.js +9 -0
  455. package/web/.next/static/chunks/ed7fbcdf0b48e735.js +1 -0
  456. package/web/.next/static/chunks/f75142a1b75f1c32.js +1 -0
  457. package/web/.next/static/chunks/fabcd29d488281fa.js +1 -0
  458. package/web/.next/static/chunks/fd925f996c3fa318.js +1 -0
  459. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts +0 -20
  460. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +0 -1
  461. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +0 -74
  462. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +0 -20
  463. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +0 -1
  464. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +0 -65
  465. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +0 -12
  466. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +0 -1
  467. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +0 -16
  468. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +0 -18
  469. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +0 -1
  470. package/dist/src/presentation/cli/commands/feat/archive.command.js +0 -54
  471. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +0 -17
  472. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +0 -1
  473. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +0 -42
  474. package/dist/src/presentation/web/app/actions/archive-feature.d.ts +0 -6
  475. package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +0 -1
  476. package/dist/src/presentation/web/app/actions/archive-feature.js +0 -16
  477. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +0 -6
  478. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +0 -1
  479. package/dist/src/presentation/web/app/actions/unarchive-feature.js +0 -16
  480. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +0 -3
  481. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +0 -1
  482. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js.map +0 -1
  483. package/web/.next/server/chunks/ssr/[root-of-the-server]__61564698._.js +0 -4
  484. package/web/.next/server/chunks/ssr/[root-of-the-server]__61564698._.js.map +0 -1
  485. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +0 -3
  486. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +0 -1
  487. package/web/.next/server/chunks/ssr/[root-of-the-server]__74ab160c._.js +0 -4
  488. package/web/.next/server/chunks/ssr/[root-of-the-server]__74ab160c._.js.map +0 -1
  489. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +0 -1
  490. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +0 -3
  491. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd16cded._.js +0 -4
  492. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd16cded._.js.map +0 -1
  493. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +0 -3
  494. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +0 -1
  495. package/web/.next/server/chunks/ssr/[root-of-the-server]__f14fffe1._.js +0 -4
  496. package/web/.next/server/chunks/ssr/[root-of-the-server]__f14fffe1._.js.map +0 -1
  497. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +0 -1
  498. package/web/.next/server/chunks/ssr/_01046927._.js +0 -9
  499. package/web/.next/server/chunks/ssr/_01046927._.js.map +0 -1
  500. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +0 -1
  501. package/web/.next/server/chunks/ssr/_1b7dae9a._.js.map +0 -1
  502. package/web/.next/server/chunks/ssr/_2fdfd9ab._.js +0 -4
  503. package/web/.next/server/chunks/ssr/_2fdfd9ab._.js.map +0 -1
  504. package/web/.next/server/chunks/ssr/_36059d08._.js +0 -4
  505. package/web/.next/server/chunks/ssr/_36059d08._.js.map +0 -1
  506. package/web/.next/server/chunks/ssr/_65f6e0e0._.js +0 -6
  507. package/web/.next/server/chunks/ssr/_65f6e0e0._.js.map +0 -1
  508. package/web/.next/server/chunks/ssr/_67104d9e._.js +0 -3
  509. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +0 -1
  510. package/web/.next/server/chunks/ssr/_7dca1882._.js +0 -3
  511. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +0 -1
  512. package/web/.next/server/chunks/ssr/_913fb649._.js +0 -3
  513. package/web/.next/server/chunks/ssr/_913fb649._.js.map +0 -1
  514. package/web/.next/server/chunks/ssr/_a51673dd._.js +0 -4
  515. package/web/.next/server/chunks/ssr/_a51673dd._.js.map +0 -1
  516. package/web/.next/server/chunks/ssr/_ae587066._.js +0 -4
  517. package/web/.next/server/chunks/ssr/_ae587066._.js.map +0 -1
  518. package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
  519. package/web/.next/server/chunks/ssr/_d162e30d._.js +0 -4
  520. package/web/.next/server/chunks/ssr/_d162e30d._.js.map +0 -1
  521. package/web/.next/server/chunks/ssr/_d4b20e29._.js +0 -3
  522. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +0 -1
  523. package/web/.next/server/chunks/ssr/_d763f022._.js +0 -6
  524. package/web/.next/server/chunks/ssr/_d763f022._.js.map +0 -1
  525. package/web/.next/server/chunks/ssr/_f39a1adb._.js +0 -3
  526. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +0 -1
  527. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js +0 -3
  528. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +0 -1
  529. package/web/.next/server/chunks/ssr/src_presentation_web_97dc2fb0._.js +0 -3
  530. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -3
  531. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
  532. package/web/.next/static/chunks/0b7fe2ac4f078f54.js +0 -13
  533. package/web/.next/static/chunks/2d6eb4409cc6324d.js +0 -1
  534. package/web/.next/static/chunks/3a7ff215d6a2c489.js +0 -2
  535. package/web/.next/static/chunks/4b3e7454c2b07877.js +0 -1
  536. package/web/.next/static/chunks/601d93593f5f664f.js +0 -1
  537. package/web/.next/static/chunks/688971d5bad5dc7c.js +0 -1
  538. package/web/.next/static/chunks/79c9871d46b22bf8.css +0 -1
  539. package/web/.next/static/chunks/7ee0606f698b032c.js +0 -1
  540. package/web/.next/static/chunks/87640f53f3bff3a6.js +0 -1
  541. package/web/.next/static/chunks/b70dd4985a814b27.js +0 -1
  542. package/web/.next/static/chunks/bb5bd1b5aafc70cd.js +0 -1
  543. package/web/.next/static/chunks/bf0a401666f990e2.js +0 -1
  544. package/web/.next/static/chunks/c4c3fcf18262b386.js +0 -2
  545. package/web/.next/static/chunks/cd14232b3d8f5052.js +0 -1
  546. package/web/.next/static/chunks/d0dff217a94d4ee1.js +0 -1
  547. package/web/.next/static/chunks/dd8f2197640aea64.js +0 -1
  548. package/web/.next/static/chunks/fc442d957b35bd5e.js +0 -1
  549. /package/web/.next/server/chunks/{[root-of-the-server]__2b1074db._.js.map → [root-of-the-server]__c7d52490._.js.map} +0 -0
  550. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → w0YQoUPySQy1O9cN91KEk}/_buildManifest.js +0 -0
  551. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → w0YQoUPySQy1O9cN91KEk}/_clientMiddlewareManifest.json +0 -0
  552. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → w0YQoUPySQy1O9cN91KEk}/_ssgManifest.js +0 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * SQLite Workflow Repository Implementation
3
+ *
4
+ * Implements IWorkflowRepository using SQLite database.
5
+ * Uses prepared statements to prevent SQL injection.
6
+ * Excludes soft-deleted workflows (deleted_at IS NOT NULL) from queries by default.
7
+ */
8
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ };
14
+ var __metadata = (this && this.__metadata) || function (k, v) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16
+ };
17
+ import { injectable } from 'tsyringe';
18
+ import { toDatabase, fromDatabase, } from '../persistence/sqlite/mappers/workflow.mapper.js';
19
+ /**
20
+ * SQLite implementation of IWorkflowRepository.
21
+ * Manages ScheduledWorkflow persistence with CRUD operations.
22
+ */
23
+ let SQLiteWorkflowRepository = class SQLiteWorkflowRepository {
24
+ db;
25
+ constructor(db) {
26
+ this.db = db;
27
+ }
28
+ async create(workflow) {
29
+ const row = toDatabase(workflow);
30
+ const stmt = this.db.prepare(`
31
+ INSERT INTO scheduled_workflows (
32
+ id, name, description, prompt, tool_constraints,
33
+ cron_expression, timezone, enabled,
34
+ last_run_at, next_run_at,
35
+ repository_path, deleted_at,
36
+ created_at, updated_at
37
+ ) VALUES (
38
+ @id, @name, @description, @prompt, @tool_constraints,
39
+ @cron_expression, @timezone, @enabled,
40
+ @last_run_at, @next_run_at,
41
+ @repository_path, @deleted_at,
42
+ @created_at, @updated_at
43
+ )
44
+ `);
45
+ stmt.run(row);
46
+ }
47
+ async findById(id) {
48
+ const stmt = this.db.prepare('SELECT * FROM scheduled_workflows WHERE id = ? AND deleted_at IS NULL');
49
+ const row = stmt.get(id);
50
+ if (!row) {
51
+ return null;
52
+ }
53
+ return fromDatabase(row);
54
+ }
55
+ async findByName(name, repositoryPath) {
56
+ const stmt = this.db.prepare("SELECT * FROM scheduled_workflows WHERE name = ? AND REPLACE(repository_path, '\\', '/') = ? AND deleted_at IS NULL");
57
+ const row = stmt.get(name, repositoryPath.replace(/\\/g, '/'));
58
+ if (!row) {
59
+ return null;
60
+ }
61
+ return fromDatabase(row);
62
+ }
63
+ async findEnabled() {
64
+ const stmt = this.db.prepare('SELECT * FROM scheduled_workflows WHERE enabled = 1 AND deleted_at IS NULL ORDER BY created_at ASC');
65
+ const rows = stmt.all();
66
+ return rows.map(fromDatabase);
67
+ }
68
+ async list(filters) {
69
+ const conditions = [];
70
+ const params = [];
71
+ if (!filters?.includeDeleted) {
72
+ conditions.push('deleted_at IS NULL');
73
+ }
74
+ if (filters?.repositoryPath) {
75
+ conditions.push("REPLACE(repository_path, '\\', '/') = ?");
76
+ params.push(filters.repositoryPath.replace(/\\/g, '/'));
77
+ }
78
+ if (filters?.enabled !== undefined) {
79
+ conditions.push('enabled = ?');
80
+ params.push(filters.enabled ? 1 : 0);
81
+ }
82
+ const where = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';
83
+ const stmt = this.db.prepare(`SELECT * FROM scheduled_workflows${where} ORDER BY created_at ASC`);
84
+ const rows = stmt.all(...params);
85
+ return rows.map(fromDatabase);
86
+ }
87
+ async update(workflow) {
88
+ const row = toDatabase(workflow);
89
+ const stmt = this.db.prepare(`
90
+ UPDATE scheduled_workflows SET
91
+ name = @name,
92
+ description = @description,
93
+ prompt = @prompt,
94
+ tool_constraints = @tool_constraints,
95
+ cron_expression = @cron_expression,
96
+ timezone = @timezone,
97
+ enabled = @enabled,
98
+ last_run_at = @last_run_at,
99
+ next_run_at = @next_run_at,
100
+ repository_path = @repository_path,
101
+ deleted_at = @deleted_at,
102
+ updated_at = @updated_at
103
+ WHERE id = @id
104
+ `);
105
+ stmt.run(row);
106
+ }
107
+ async softDelete(id) {
108
+ const now = Date.now();
109
+ const stmt = this.db.prepare('UPDATE scheduled_workflows SET deleted_at = ?, updated_at = ? WHERE id = ?');
110
+ stmt.run(now, now, id);
111
+ }
112
+ };
113
+ SQLiteWorkflowRepository = __decorate([
114
+ injectable(),
115
+ __metadata("design:paramtypes", [Object])
116
+ ], SQLiteWorkflowRepository);
117
+ export { SQLiteWorkflowRepository };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Real Clock Service
3
+ *
4
+ * Infrastructure implementation of IClock that returns the actual system time.
5
+ * Used in production; tests substitute a MockClock for deterministic behavior.
6
+ */
7
+ import type { IClock } from '../../application/ports/output/services/clock.interface.js';
8
+ export declare class RealClock implements IClock {
9
+ now(): Date;
10
+ }
11
+ //# sourceMappingURL=clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/clock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4DAA4D,CAAC;AAEzF,qBACa,SAAU,YAAW,MAAM;IACtC,GAAG,IAAI,IAAI;CAGZ"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Real Clock Service
3
+ *
4
+ * Infrastructure implementation of IClock that returns the actual system time.
5
+ * Used in production; tests substitute a MockClock for deterministic behavior.
6
+ */
7
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
12
+ };
13
+ import { injectable } from 'tsyringe';
14
+ let RealClock = class RealClock {
15
+ now() {
16
+ return new Date();
17
+ }
18
+ };
19
+ RealClock = __decorate([
20
+ injectable()
21
+ ], RealClock);
22
+ export { RealClock };
@@ -1 +1 @@
1
- {"version":3,"file":"notification.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/notification.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AAEzH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAgB7D,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAEtC,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe;IAKlE,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;CAiBvC"}
1
+ {"version":3,"file":"notification.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/notification.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AAEzH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAmB7D,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAEtC,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe;IAKlE,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;CAiBvC"}
@@ -22,6 +22,9 @@ const EVENT_TYPE_TO_CONFIG_KEY = {
22
22
  [NotificationEventType.PrChecksFailed]: 'prChecksFailed',
23
23
  [NotificationEventType.PrBlocked]: 'prBlocked',
24
24
  [NotificationEventType.MergeReviewReady]: 'mergeReviewReady',
25
+ [NotificationEventType.WorkflowStarted]: 'workflowStarted',
26
+ [NotificationEventType.WorkflowCompleted]: 'workflowCompleted',
27
+ [NotificationEventType.WorkflowFailed]: 'workflowFailed',
25
28
  };
26
29
  export class NotificationService {
27
30
  bus;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Workflow Scheduler Service
3
+ *
4
+ * Polls for due scheduled workflows and executes them sequentially.
5
+ * Follows the NotificationWatcherService/PrSyncWatcherService pattern:
6
+ * - Singleton with start()/stop()/isRunning() lifecycle
7
+ * - setInterval-based polling
8
+ * - Immediate first poll on start()
9
+ * - Graceful shutdown via clearInterval
10
+ *
11
+ * Uses IClock for all time operations (deterministic testing).
12
+ * Uses croner only for validation and nextRun() calculation.
13
+ *
14
+ * Each tick:
15
+ * 1. Query enabled workflows where nextRunAt <= clock.now()
16
+ * 2. Enqueue due workflows into FIFO queue
17
+ * 3. If no execution is running, dequeue and execute next
18
+ * 4. Every 100 ticks: run retention cleanup
19
+ *
20
+ * Crash recovery on startup:
21
+ * - Mark stale 'running' executions as 'failed'
22
+ * - Recalculate nextRunAt for all enabled workflows
23
+ */
24
+ import type { IWorkflowRepository } from '../../../application/ports/output/repositories/workflow-repository.interface.js';
25
+ import type { IWorkflowExecutionRepository } from '../../../application/ports/output/repositories/workflow-execution-repository.interface.js';
26
+ import type { IClock } from '../../../application/ports/output/services/clock.interface.js';
27
+ import type { INotificationService } from '../../../application/ports/output/services/notification-service.interface.js';
28
+ export declare class WorkflowSchedulerService {
29
+ private readonly workflowRepo;
30
+ private readonly executionRepo;
31
+ private readonly clock;
32
+ private readonly notificationService;
33
+ private readonly pollIntervalMs;
34
+ private readonly retentionDays;
35
+ private intervalId;
36
+ private tickCount;
37
+ private isExecuting;
38
+ private readonly queue;
39
+ constructor(workflowRepo: IWorkflowRepository, executionRepo: IWorkflowExecutionRepository, clock: IClock, notificationService: INotificationService, pollIntervalMs?: number, retentionDays?: number);
40
+ isRunning(): boolean;
41
+ start(): Promise<void>;
42
+ stop(): void;
43
+ private poll;
44
+ private executeWorkflow;
45
+ private recoverStaleExecutions;
46
+ private runRetentionCleanup;
47
+ private emitNotification;
48
+ }
49
+ /**
50
+ * Initialize the workflow scheduler singleton.
51
+ * Must be called once during daemon startup.
52
+ */
53
+ export declare function initializeWorkflowScheduler(workflowRepo: IWorkflowRepository, executionRepo: IWorkflowExecutionRepository, clock: IClock, notificationService: INotificationService, pollIntervalMs?: number, retentionDays?: number): void;
54
+ /**
55
+ * Get the workflow scheduler singleton.
56
+ */
57
+ export declare function getWorkflowScheduler(): WorkflowSchedulerService;
58
+ /**
59
+ * Check if the workflow scheduler has been initialized.
60
+ */
61
+ export declare function hasWorkflowScheduler(): boolean;
62
+ /**
63
+ * Reset the workflow scheduler singleton (for testing purposes only).
64
+ * Stops the scheduler if running before resetting.
65
+ *
66
+ * @internal
67
+ */
68
+ export declare function resetWorkflowScheduler(): void;
69
+ //# sourceMappingURL=workflow-scheduler.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-scheduler.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/workflow-scheduler/workflow-scheduler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAcH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iFAAiF,CAAC;AAC3H,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2FAA2F,CAAC;AAC9I,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+DAA+D,CAAC;AAC5F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AAOzH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAGpC,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,4BAA4B,EAC3C,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,aAAa,GAAE,MAA+B;IAUhD,SAAS,IAAI,OAAO;IAId,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,IAAI,IAAI,IAAI;YAOE,IAAI;YA2CJ,eAAe;YA6Hf,sBAAsB;YAqBtB,mBAAmB;IAWjC,OAAO,CAAC,gBAAgB;CAkBzB;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,4BAA4B,EAC3C,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAaN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,wBAAwB,CAQ/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Workflow Scheduler Service
3
+ *
4
+ * Polls for due scheduled workflows and executes them sequentially.
5
+ * Follows the NotificationWatcherService/PrSyncWatcherService pattern:
6
+ * - Singleton with start()/stop()/isRunning() lifecycle
7
+ * - setInterval-based polling
8
+ * - Immediate first poll on start()
9
+ * - Graceful shutdown via clearInterval
10
+ *
11
+ * Uses IClock for all time operations (deterministic testing).
12
+ * Uses croner only for validation and nextRun() calculation.
13
+ *
14
+ * Each tick:
15
+ * 1. Query enabled workflows where nextRunAt <= clock.now()
16
+ * 2. Enqueue due workflows into FIFO queue
17
+ * 3. If no execution is running, dequeue and execute next
18
+ * 4. Every 100 ticks: run retention cleanup
19
+ *
20
+ * Crash recovery on startup:
21
+ * - Mark stale 'running' executions as 'failed'
22
+ * - Recalculate nextRunAt for all enabled workflows
23
+ */
24
+ import { randomUUID } from 'node:crypto';
25
+ import { NotificationEventType, NotificationSeverity, WorkflowExecutionStatus, WorkflowTriggerType, } from '../../../domain/generated/output.js';
26
+ import { calculateNextRunAt } from '../../../application/use-cases/workflows/cron-helpers.js';
27
+ const DEFAULT_POLL_INTERVAL_MS = 60_000;
28
+ const RETENTION_CLEANUP_INTERVAL_TICKS = 100;
29
+ const DEFAULT_RETENTION_DAYS = 30;
30
+ export class WorkflowSchedulerService {
31
+ workflowRepo;
32
+ executionRepo;
33
+ clock;
34
+ notificationService;
35
+ pollIntervalMs;
36
+ retentionDays;
37
+ intervalId = null;
38
+ tickCount = 0;
39
+ isExecuting = false;
40
+ queue = []; // workflow IDs
41
+ constructor(workflowRepo, executionRepo, clock, notificationService, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, retentionDays = DEFAULT_RETENTION_DAYS) {
42
+ this.workflowRepo = workflowRepo;
43
+ this.executionRepo = executionRepo;
44
+ this.clock = clock;
45
+ this.notificationService = notificationService;
46
+ this.pollIntervalMs = pollIntervalMs;
47
+ this.retentionDays = retentionDays;
48
+ }
49
+ isRunning() {
50
+ return this.intervalId !== null;
51
+ }
52
+ async start() {
53
+ if (this.intervalId !== null)
54
+ return;
55
+ // Crash recovery: mark stale 'running' executions as 'failed'
56
+ await this.recoverStaleExecutions();
57
+ // Run first poll immediately
58
+ void this.poll();
59
+ this.intervalId = setInterval(() => {
60
+ void this.poll();
61
+ }, this.pollIntervalMs);
62
+ }
63
+ stop() {
64
+ if (this.intervalId !== null) {
65
+ clearInterval(this.intervalId);
66
+ this.intervalId = null;
67
+ }
68
+ }
69
+ async poll() {
70
+ try {
71
+ this.tickCount++;
72
+ // Find due workflows
73
+ const enabledWorkflows = await this.workflowRepo.findEnabled();
74
+ const now = this.clock.now();
75
+ for (const workflow of enabledWorkflows) {
76
+ if (workflow.nextRunAt &&
77
+ new Date(workflow.nextRunAt).getTime() <= now.getTime() &&
78
+ !this.queue.includes(workflow.id)) {
79
+ this.queue.push(workflow.id);
80
+ }
81
+ }
82
+ // Also process any manually queued executions
83
+ const queuedExecutions = await this.executionRepo.findByStatus(WorkflowExecutionStatus.Queued);
84
+ for (const execution of queuedExecutions) {
85
+ if (!this.queue.includes(execution.workflowId)) {
86
+ this.queue.push(execution.workflowId);
87
+ }
88
+ }
89
+ // Execute one queued workflow if nothing is running
90
+ if (!this.isExecuting && this.queue.length > 0) {
91
+ const workflowId = this.queue.shift();
92
+ void this.executeWorkflow(workflowId, queuedExecutions);
93
+ }
94
+ // Retention cleanup every N ticks
95
+ if (this.tickCount % RETENTION_CLEANUP_INTERVAL_TICKS === 0) {
96
+ await this.runRetentionCleanup();
97
+ }
98
+ }
99
+ catch {
100
+ // DB not ready or query failed — skip this poll cycle
101
+ }
102
+ }
103
+ async executeWorkflow(workflowId, existingQueuedExecutions) {
104
+ this.isExecuting = true;
105
+ try {
106
+ const workflow = await this.workflowRepo.findById(workflowId);
107
+ if (!workflow) {
108
+ this.isExecuting = false;
109
+ return;
110
+ }
111
+ // Find or create execution record
112
+ let execution = existingQueuedExecutions.find((e) => e.workflowId === workflowId && e.status === WorkflowExecutionStatus.Queued);
113
+ const now = this.clock.now();
114
+ if (!execution) {
115
+ // Create execution record for scheduled trigger
116
+ execution = {
117
+ id: randomUUID(),
118
+ workflowId,
119
+ triggerType: WorkflowTriggerType.Scheduled,
120
+ status: WorkflowExecutionStatus.Queued,
121
+ startedAt: now,
122
+ createdAt: now,
123
+ updatedAt: now,
124
+ };
125
+ await this.executionRepo.create(execution);
126
+ }
127
+ // Transition to Running
128
+ execution = {
129
+ ...execution,
130
+ status: WorkflowExecutionStatus.Running,
131
+ startedAt: now,
132
+ updatedAt: now,
133
+ };
134
+ await this.executionRepo.update(execution);
135
+ // Emit WorkflowStarted event
136
+ this.emitNotification(NotificationEventType.WorkflowStarted, NotificationSeverity.Info, workflow, execution, `Workflow "${workflow.name}" started`);
137
+ try {
138
+ // Execute the workflow prompt
139
+ // For now, this is a placeholder — the actual agent execution
140
+ // will be wired in via the CLI/daemon integration (Phase 4).
141
+ // The scheduler creates the record and manages state transitions.
142
+ // Agent execution would happen here via IAgentRunner.
143
+ const completedAt = this.clock.now();
144
+ const durationMs = completedAt.getTime() - now.getTime();
145
+ // Mark as completed
146
+ execution = {
147
+ ...execution,
148
+ status: WorkflowExecutionStatus.Completed,
149
+ completedAt,
150
+ durationMs,
151
+ updatedAt: completedAt,
152
+ };
153
+ await this.executionRepo.update(execution);
154
+ // Emit WorkflowCompleted event
155
+ this.emitNotification(NotificationEventType.WorkflowCompleted, NotificationSeverity.Success, workflow, execution, `Workflow "${workflow.name}" completed successfully`);
156
+ }
157
+ catch (err) {
158
+ const errorMessage = err instanceof Error ? err.message : String(err);
159
+ const failedAt = this.clock.now();
160
+ execution = {
161
+ ...execution,
162
+ status: WorkflowExecutionStatus.Failed,
163
+ completedAt: failedAt,
164
+ durationMs: failedAt.getTime() - now.getTime(),
165
+ errorMessage,
166
+ updatedAt: failedAt,
167
+ };
168
+ await this.executionRepo.update(execution);
169
+ // Emit WorkflowFailed event
170
+ this.emitNotification(NotificationEventType.WorkflowFailed, NotificationSeverity.Error, workflow, execution, `Workflow "${workflow.name}" failed: ${errorMessage}`);
171
+ }
172
+ // Update workflow lastRunAt and recalculate nextRunAt
173
+ const updateNow = this.clock.now();
174
+ const updatedWorkflow = {
175
+ ...workflow,
176
+ lastRunAt: updateNow,
177
+ updatedAt: updateNow,
178
+ };
179
+ if (workflow.cronExpression && workflow.enabled) {
180
+ const nextRunAt = calculateNextRunAt(workflow.cronExpression, workflow.timezone, updateNow);
181
+ updatedWorkflow.nextRunAt = nextRunAt ?? undefined;
182
+ }
183
+ else {
184
+ updatedWorkflow.nextRunAt = undefined;
185
+ }
186
+ await this.workflowRepo.update(updatedWorkflow);
187
+ }
188
+ finally {
189
+ this.isExecuting = false;
190
+ }
191
+ }
192
+ async recoverStaleExecutions() {
193
+ try {
194
+ const staleExecutions = await this.executionRepo.findByStatus(WorkflowExecutionStatus.Running);
195
+ const now = this.clock.now();
196
+ for (const execution of staleExecutions) {
197
+ await this.executionRepo.update({
198
+ ...execution,
199
+ status: WorkflowExecutionStatus.Failed,
200
+ completedAt: now,
201
+ errorMessage: 'Daemon crashed during execution',
202
+ updatedAt: now,
203
+ });
204
+ }
205
+ }
206
+ catch {
207
+ // Best-effort recovery
208
+ }
209
+ }
210
+ async runRetentionCleanup() {
211
+ try {
212
+ const cutoff = new Date(this.clock.now().getTime() - this.retentionDays * 24 * 60 * 60 * 1000);
213
+ await this.executionRepo.deleteOlderThan(cutoff);
214
+ }
215
+ catch {
216
+ // Best-effort cleanup
217
+ }
218
+ }
219
+ emitNotification(eventType, severity, workflow, execution, message) {
220
+ const event = {
221
+ eventType,
222
+ agentRunId: execution.id,
223
+ featureId: workflow.id,
224
+ featureName: workflow.name,
225
+ message,
226
+ severity,
227
+ timestamp: this.clock.now().toISOString(),
228
+ };
229
+ this.notificationService.notify(event);
230
+ }
231
+ }
232
+ // --- Singleton accessors (follows NotificationWatcherService pattern) ---
233
+ let schedulerInstance = null;
234
+ /**
235
+ * Initialize the workflow scheduler singleton.
236
+ * Must be called once during daemon startup.
237
+ */
238
+ export function initializeWorkflowScheduler(workflowRepo, executionRepo, clock, notificationService, pollIntervalMs, retentionDays) {
239
+ if (schedulerInstance !== null) {
240
+ throw new Error('Workflow scheduler already initialized. Cannot re-initialize.');
241
+ }
242
+ schedulerInstance = new WorkflowSchedulerService(workflowRepo, executionRepo, clock, notificationService, pollIntervalMs, retentionDays);
243
+ }
244
+ /**
245
+ * Get the workflow scheduler singleton.
246
+ */
247
+ export function getWorkflowScheduler() {
248
+ if (schedulerInstance === null) {
249
+ throw new Error('Workflow scheduler not initialized. Call initializeWorkflowScheduler() during daemon startup.');
250
+ }
251
+ return schedulerInstance;
252
+ }
253
+ /**
254
+ * Check if the workflow scheduler has been initialized.
255
+ */
256
+ export function hasWorkflowScheduler() {
257
+ return schedulerInstance !== null;
258
+ }
259
+ /**
260
+ * Reset the workflow scheduler singleton (for testing purposes only).
261
+ * Stops the scheduler if running before resetting.
262
+ *
263
+ * @internal
264
+ */
265
+ export function resetWorkflowScheduler() {
266
+ if (schedulerInstance !== null) {
267
+ schedulerInstance.stop();
268
+ }
269
+ schedulerInstance = null;
270
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAwB1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA0D5C"}
1
+ {"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAiC1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA0E5C"}
@@ -29,6 +29,8 @@ import { container } from '../../../../packages/core/src/infrastructure/di/conta
29
29
  import { setVersionEnvVars } from '../../../../packages/core/src/infrastructure/services/version.service.js';
30
30
  import { resolveWebDir } from '../../../../packages/core/src/infrastructure/services/web-server.service.js';
31
31
  import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
32
+ import { initializeWorkflowScheduler, getWorkflowScheduler, hasWorkflowScheduler, } from '../../../../packages/core/src/infrastructure/services/workflow-scheduler/workflow-scheduler.service.js';
33
+ import { hasSettings, getSettings } from '../../../../packages/core/src/infrastructure/services/settings.service.js';
32
34
  function parsePort(value) {
33
35
  const port = parseInt(value, 10);
34
36
  if (isNaN(port) || port < 1024 || port > 65535) {
@@ -62,6 +64,15 @@ export function createServeCommand() {
62
64
  const notificationService = container.resolve('INotificationService');
63
65
  initializeNotificationWatcher(runRepo, phaseTimingRepo, featureRepo, notificationService);
64
66
  getNotificationWatcher().start();
67
+ // Start workflow scheduler (only when feature flag is enabled)
68
+ const scheduledWorkflowsEnabled = hasSettings() && getSettings().featureFlags?.scheduledWorkflows === true;
69
+ if (scheduledWorkflowsEnabled) {
70
+ const workflowRepo = container.resolve('IWorkflowRepository');
71
+ const executionRepo = container.resolve('IWorkflowExecutionRepository');
72
+ const clock = container.resolve('IClock');
73
+ initializeWorkflowScheduler(workflowRepo, executionRepo, clock, notificationService);
74
+ await getWorkflowScheduler().start();
75
+ }
65
76
  // Graceful shutdown handler — identical pattern to ui.command.ts
66
77
  let isShuttingDown = false;
67
78
  const shutdown = async () => {
@@ -71,6 +82,9 @@ export function createServeCommand() {
71
82
  // Force exit after 5s if graceful shutdown stalls
72
83
  const forceExit = setTimeout(() => process.exit(0), 5000);
73
84
  forceExit.unref();
85
+ if (hasWorkflowScheduler()) {
86
+ getWorkflowScheduler().stop();
87
+ }
74
88
  getNotificationWatcher().stop();
75
89
  const deploymentService = container.resolve('IDeploymentService');
76
90
  deploymentService.stopAll();
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgB3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAc3C"}
@@ -21,8 +21,6 @@ import { createApproveCommand } from './approve.command.js';
21
21
  import { createRejectCommand } from './reject.command.js';
22
22
  import { createLogsCommand } from './logs.command.js';
23
23
  import { createAdoptCommand } from './adopt.command.js';
24
- import { createArchiveCommand } from './archive.command.js';
25
- import { createUnarchiveCommand } from './unarchive.command.js';
26
24
  /**
27
25
  * Create the feat command group
28
26
  */
@@ -39,7 +37,5 @@ export function createFeatCommand() {
39
37
  .addCommand(createApproveCommand())
40
38
  .addCommand(createRejectCommand())
41
39
  .addCommand(createLogsCommand())
42
- .addCommand(createAdoptCommand())
43
- .addCommand(createArchiveCommand())
44
- .addCommand(createUnarchiveCommand());
40
+ .addCommand(createAdoptCommand());
45
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkLpC,wBAAgB,eAAe,IAAI,OAAO,CAwGzC"}
1
+ {"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC,wBAAgB,eAAe,IAAI,OAAO,CAsGzC"}
@@ -48,9 +48,6 @@ const STATUS_PRIORITY = {
48
48
  */
49
49
  function formatStatus(feature, run) {
50
50
  // Blocked features show "Waiting" — the parent relationship is conveyed by tree indentation
51
- if (feature.lifecycle === 'Archived') {
52
- return `${colors.muted(symbols.dotEmpty)} ${colors.muted('Archived')}`;
53
- }
54
51
  if (feature.lifecycle === 'Deleting') {
55
52
  return `${colors.muted(symbols.spinner[0])} ${colors.muted('Deleting')}`;
56
53
  }
@@ -171,7 +168,6 @@ export function createLsCommand() {
171
168
  .description('List features')
172
169
  .option('-r, --repo <path>', 'Filter by repository path')
173
170
  .option('--include-deleted', 'Include soft-deleted features')
174
- .option('--show-archived', 'Include archived features')
175
171
  .action(async (options) => {
176
172
  try {
177
173
  const useCase = container.resolve(ListFeaturesUseCase);
@@ -180,7 +176,6 @@ export function createLsCommand() {
180
176
  const filters = {
181
177
  ...(options.repo && { repositoryPath: options.repo }),
182
178
  ...(options.includeDeleted && { includeDeleted: true }),
183
- ...(options.showArchived && { includeArchived: true }),
184
179
  };
185
180
  const features = await useCase.execute(Object.keys(filters).length > 0 ? filters : undefined);
186
181
  // Load agent runs and phase timings for all features in parallel
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Workflow Create Command
3
+ *
4
+ * Create a new scheduled workflow definition with a name, prompt, and optional
5
+ * description, tool constraints, and template.
6
+ *
7
+ * Usage:
8
+ * shep workflow create <name> --prompt <prompt> [options]
9
+ * shep workflow create <name> --template <template-name> [options]
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare function createCreateCommand(): Command;
13
+ //# sourceMappingURL=create.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/workflow/create.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,mBAAmB,IAAI,OAAO,CA+E7C"}