@shepai/cli 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  4. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts +29 -0
  6. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.js +12 -0
  8. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +3 -2
  9. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +36 -15
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  12. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +13 -0
  13. package/dist/packages/core/src/domain/generated/output.d.ts +105 -0
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/generated/output.js +15 -0
  16. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/di/container.js +17 -0
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +8 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +22 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
  23. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +17 -3
  25. package/dist/packages/core/src/infrastructure/services/ide-launchers/antigravity.launcher.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts +17 -0
  27. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +24 -0
  29. package/dist/packages/core/src/infrastructure/services/ide-launchers/cursor.launcher.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.interface.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.registry.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts +30 -0
  33. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts.map +1 -0
  34. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.js +41 -0
  35. package/dist/packages/core/src/infrastructure/services/ide-launchers/vscode.launcher.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/services/ide-launchers/windsurf.launcher.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/ide-launchers/zed.launcher.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +22 -0
  39. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -0
  40. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.js +39 -0
  41. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +52 -0
  42. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -0
  43. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +64 -0
  44. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts +60 -0
  45. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts.map +1 -0
  46. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.js +225 -0
  47. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts +21 -0
  48. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -0
  49. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +43 -0
  50. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts +3 -1
  51. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts.map +1 -1
  52. package/dist/packages/core/src/infrastructure/services/settings.service.js +27 -12
  53. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  54. package/dist/src/presentation/cli/commands/agent/show.command.js +1 -8
  55. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/feat/show.command.js +1 -8
  57. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/ide-open.command.js +11 -21
  59. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/ui.command.js +8 -0
  61. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +14 -0
  62. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -0
  63. package/dist/src/presentation/web/app/api/agent-events/route.js +77 -0
  64. package/dist/src/presentation/web/app/api/ide/open/route.d.ts +9 -0
  65. package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +1 -0
  66. package/dist/src/presentation/web/app/api/ide/open/route.js +29 -0
  67. package/dist/src/presentation/web/app/api/shell/open/route.d.ts +9 -0
  68. package/dist/src/presentation/web/app/api/shell/open/route.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/api/shell/open/route.js +51 -0
  70. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts +17 -0
  71. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts.map +1 -0
  72. package/dist/src/presentation/web/app/api/validate-toolbar-input.js +25 -0
  73. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  74. package/dist/src/presentation/web/app/page.js +11 -12
  75. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -4
  77. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +8 -0
  78. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +34 -3
  80. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +14 -0
  81. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +58 -0
  83. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +9 -2
  84. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +9 -0
  86. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  87. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -7
  88. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  89. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +18 -0
  90. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  91. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/index.js +1 -0
  93. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +16 -0
  95. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -0
  97. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +44 -0
  99. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +3 -0
  101. package/dist/src/presentation/web/components/ui/button.d.ts +1 -1
  102. package/dist/src/presentation/web/hooks/use-agent-events.d.ts +12 -0
  103. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -0
  104. package/dist/src/presentation/web/hooks/use-agent-events.js +58 -0
  105. package/dist/src/presentation/web/hooks/use-notifications.d.ts +10 -0
  106. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -0
  107. package/dist/src/presentation/web/hooks/use-notifications.js +57 -0
  108. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts +6 -0
  109. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts.map +1 -0
  110. package/dist/src/presentation/web/hooks/use-notifications.stories.js +62 -0
  111. package/dist/tsconfig.build.tsbuildinfo +1 -1
  112. package/package.json +3 -1
  113. package/web/.next/BUILD_ID +1 -1
  114. package/web/.next/app-path-routes-manifest.json +3 -0
  115. package/web/.next/build-manifest.json +2 -2
  116. package/web/.next/cache/.previewinfo +1 -1
  117. package/web/.next/cache/.rscinfo +1 -1
  118. package/web/.next/cache/.tsbuildinfo +1 -1
  119. package/web/.next/cache/config.json +3 -3
  120. package/web/.next/fallback-build-manifest.json +2 -2
  121. package/web/.next/prerender-manifest.json +3 -3
  122. package/web/.next/required-server-files.js +1 -1
  123. package/web/.next/required-server-files.json +1 -1
  124. package/web/.next/routes-manifest.json +18 -0
  125. package/web/.next/server/app/_global-error/page.js +1 -1
  126. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  127. package/web/.next/server/app/_global-error.html +2 -2
  128. package/web/.next/server/app/_global-error.rsc +1 -1
  129. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  130. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  132. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  133. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  134. package/web/.next/server/app/_not-found/page.js +1 -1
  135. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  136. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/_not-found.html +2 -2
  138. package/web/.next/server/app/_not-found.rsc +10 -10
  139. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  140. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  141. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
  142. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  143. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  144. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  145. package/web/.next/server/app/api/agent-events/route/app-paths-manifest.json +3 -0
  146. package/web/.next/server/app/api/agent-events/route/build-manifest.json +11 -0
  147. package/web/.next/server/app/api/agent-events/route/server-reference-manifest.json +4 -0
  148. package/web/.next/server/app/api/agent-events/route.js +6 -0
  149. package/web/.next/server/app/api/agent-events/route.js.map +5 -0
  150. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -0
  151. package/web/.next/server/app/api/agent-events/route_client-reference-manifest.js +2 -0
  152. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -1
  153. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  154. package/web/.next/server/app/api/dialog/pick-folder/route.js +2 -1
  155. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +1 -1
  156. package/web/.next/server/app/api/features/create/route.js +2 -1
  157. package/web/.next/server/app/api/features/create/route.js.nft.json +1 -1
  158. package/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +3 -0
  159. package/web/.next/server/app/api/ide/open/route/build-manifest.json +11 -0
  160. package/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +4 -0
  161. package/web/.next/server/app/api/ide/open/route.js +8 -0
  162. package/web/.next/server/app/api/ide/open/route.js.map +5 -0
  163. package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -0
  164. package/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +2 -0
  165. package/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +3 -0
  166. package/web/.next/server/app/api/shell/open/route/build-manifest.json +11 -0
  167. package/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +4 -0
  168. package/web/.next/server/app/api/shell/open/route.js +7 -0
  169. package/web/.next/server/app/api/shell/open/route.js.map +5 -0
  170. package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -0
  171. package/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +2 -0
  172. package/web/.next/server/app/page.js +2 -2
  173. package/web/.next/server/app/page.js.nft.json +1 -1
  174. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/version/page.js +1 -1
  176. package/web/.next/server/app/version/page.js.nft.json +1 -1
  177. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/app/version.html +2 -2
  179. package/web/.next/server/app/version.rsc +5 -5
  180. package/web/.next/server/app/version.segments/_full.segment.rsc +5 -5
  181. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  182. package/web/.next/server/app/version.segments/_index.segment.rsc +4 -4
  183. package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
  184. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +2 -2
  185. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  186. package/web/.next/server/app-paths-manifest.json +3 -0
  187. package/web/.next/server/chunks/403f9_next_567de315._.js +17 -0
  188. package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
  189. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +3 -0
  190. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js.map +1 -0
  191. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js +3 -0
  192. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js.map +1 -0
  193. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +3 -0
  194. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js.map +1 -0
  195. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js +7 -0
  196. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js.map +1 -0
  197. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js +3 -0
  198. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js.map +1 -0
  199. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js +3 -0
  200. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js.map +1 -0
  201. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +3 -0
  202. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +1 -0
  203. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +3 -0
  204. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_dbf21e04.js +1 -1
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__80e5bed2._.js +1 -1
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +3 -0
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +3 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa87595c._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_09afa42a._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_884ddade._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_c5d377cc._.js +1 -1
  215. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  219. package/web/.next/server/pages/404.html +2 -2
  220. package/web/.next/server/pages/500.html +2 -2
  221. package/web/.next/server/server-reference-manifest.js +1 -1
  222. package/web/.next/server/server-reference-manifest.json +1 -1
  223. package/web/.next/static/chunks/b32b17f102226f32.js +1 -0
  224. package/web/.next/static/chunks/d8905884f147599c.css +2 -0
  225. package/web/.next/static/chunks/{1c236dcc303f3033.js → fd961ef835ff4867.js} +2 -2
  226. package/web/.next/trace +1 -1
  227. package/web/.next/trace-build +1 -1
  228. package/web/.next/types/link.d.ts +3 -0
  229. package/web/.next/types/routes.d.ts +4 -1
  230. package/web/.next/types/validator.ts +27 -0
  231. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js +0 -21
  232. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js.map +0 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__757c7912._.js +0 -3
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__dbd220d2._.js +0 -3
  235. package/web/.next/static/chunks/74748b4d725c5c74.css +0 -2
  236. package/web/.next/static/chunks/78ef4acb26e4d6ea.js +0 -1
  237. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__757c7912._.js.map → [root-of-the-server]__97377864._.js.map} +0 -0
  238. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__dbd220d2._.js.map → [root-of-the-server]__f285e474._.js.map} +0 -0
  239. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_buildManifest.js +0 -0
  240. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_clientMiddlewareManifest.json +0 -0
  241. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_ssgManifest.js +0 -0
@@ -24,6 +24,8 @@ const singleNode = {
24
24
  lifecycle: 'requirements',
25
25
  state: 'running',
26
26
  progress: 45,
27
+ repositoryPath: '/home/user/my-repo',
28
+ branch: 'feat/auth-module',
27
29
  },
28
30
  };
29
31
  const multipleNodes = [
@@ -38,6 +40,8 @@ const multipleNodes = [
38
40
  lifecycle: 'implementation',
39
41
  state: 'running',
40
42
  progress: 65,
43
+ repositoryPath: '/home/user/my-repo',
44
+ branch: 'feat/auth-module',
41
45
  },
42
46
  },
43
47
  {
@@ -51,6 +55,8 @@ const multipleNodes = [
51
55
  lifecycle: 'research',
52
56
  state: 'action-required',
53
57
  progress: 20,
58
+ repositoryPath: '/home/user/my-repo',
59
+ branch: 'feat/user-dashboard',
54
60
  },
55
61
  },
56
62
  {
@@ -64,6 +70,8 @@ const multipleNodes = [
64
70
  lifecycle: 'deploy',
65
71
  state: 'done',
66
72
  progress: 100,
73
+ repositoryPath: '/home/user/my-repo',
74
+ branch: 'feat/api-gateway',
67
75
  },
68
76
  },
69
77
  {
@@ -77,6 +85,8 @@ const multipleNodes = [
77
85
  lifecycle: 'review',
78
86
  state: 'blocked',
79
87
  progress: 40,
88
+ repositoryPath: '/home/user/my-repo',
89
+ branch: 'feat/payment-integration',
80
90
  },
81
91
  },
82
92
  {
@@ -90,6 +100,8 @@ const multipleNodes = [
90
100
  lifecycle: 'implementation',
91
101
  state: 'error',
92
102
  progress: 30,
103
+ repositoryPath: '/home/user/my-repo',
104
+ branch: 'feat/email-service',
93
105
  },
94
106
  },
95
107
  ];
@@ -105,6 +117,8 @@ const connectedNodes = [
105
117
  lifecycle: 'implementation',
106
118
  state: 'running',
107
119
  progress: 65,
120
+ repositoryPath: '/home/user/my-repo',
121
+ branch: 'feat/auth-module',
108
122
  },
109
123
  },
110
124
  {
@@ -119,6 +133,8 @@ const connectedNodes = [
119
133
  state: 'blocked',
120
134
  progress: 10,
121
135
  blockedBy: 'Auth Module',
136
+ repositoryPath: '/home/user/my-repo',
137
+ branch: 'feat/user-dashboard',
122
138
  },
123
139
  },
124
140
  {
@@ -132,6 +148,8 @@ const connectedNodes = [
132
148
  lifecycle: 'requirements',
133
149
  state: 'action-required',
134
150
  progress: 5,
151
+ repositoryPath: '/home/user/my-repo',
152
+ branch: 'feat/api-gateway',
135
153
  },
136
154
  },
137
155
  {
@@ -146,6 +164,8 @@ const connectedNodes = [
146
164
  state: 'blocked',
147
165
  progress: 0,
148
166
  blockedBy: 'User Dashboard',
167
+ repositoryPath: '/home/user/my-repo',
168
+ branch: 'feat/admin-panel',
149
169
  },
150
170
  },
151
171
  ];
@@ -220,6 +240,8 @@ const repoFeatureNodes = [
220
240
  lifecycle: 'implementation',
221
241
  state: 'running',
222
242
  progress: 65,
243
+ repositoryPath: '/home/user/my-repo',
244
+ branch: 'feat/auth-module',
223
245
  },
224
246
  },
225
247
  {
@@ -233,6 +255,8 @@ const repoFeatureNodes = [
233
255
  lifecycle: 'requirements',
234
256
  state: 'action-required',
235
257
  progress: 20,
258
+ repositoryPath: '/home/user/my-repo',
259
+ branch: 'feat/feature-flow-canvas',
236
260
  },
237
261
  },
238
262
  ];
@@ -274,6 +298,8 @@ const singleRepoSingleFeatureNodes = [
274
298
  lifecycle: 'implementation',
275
299
  state: 'running',
276
300
  progress: 65,
301
+ repositoryPath: '/home/user/my-repo',
302
+ branch: 'feat/auth-module',
277
303
  },
278
304
  },
279
305
  ];
@@ -312,6 +338,8 @@ const singleRepoMultiFeatNodes = [
312
338
  lifecycle: 'implementation',
313
339
  state: 'running',
314
340
  progress: 40,
341
+ repositoryPath: '/home/user/my-repo',
342
+ branch: 'feat/sso-integration',
315
343
  },
316
344
  },
317
345
  {
@@ -325,6 +353,8 @@ const singleRepoMultiFeatNodes = [
325
353
  lifecycle: 'requirements',
326
354
  state: 'action-required',
327
355
  progress: 10,
356
+ repositoryPath: '/home/user/my-repo',
357
+ branch: 'feat/auth-module',
328
358
  },
329
359
  },
330
360
  {
@@ -338,6 +368,8 @@ const singleRepoMultiFeatNodes = [
338
368
  lifecycle: 'research',
339
369
  state: 'running',
340
370
  progress: 25,
371
+ repositoryPath: '/home/user/my-repo',
372
+ branch: 'feat/api-gateway',
341
373
  },
342
374
  },
343
375
  ];
@@ -384,6 +416,8 @@ const multiRepoNodes = [
384
416
  lifecycle: 'implementation',
385
417
  state: 'running',
386
418
  progress: 65,
419
+ repositoryPath: '/home/user/my-repo',
420
+ branch: 'feat/auth-module',
387
421
  },
388
422
  },
389
423
  {
@@ -397,6 +431,8 @@ const multiRepoNodes = [
397
431
  lifecycle: 'requirements',
398
432
  state: 'action-required',
399
433
  progress: 15,
434
+ repositoryPath: '/home/user/my-repo',
435
+ branch: 'feat/dashboard-ui',
400
436
  },
401
437
  },
402
438
  ];
@@ -448,6 +484,8 @@ const mixedRepoFeatureNodesRaw = [
448
484
  lifecycle: 'implementation',
449
485
  state: 'running',
450
486
  progress: 65,
487
+ repositoryPath: '/home/user/my-repo',
488
+ branch: 'feat/auth-module',
451
489
  },
452
490
  },
453
491
  {
@@ -461,6 +499,8 @@ const mixedRepoFeatureNodesRaw = [
461
499
  lifecycle: 'research',
462
500
  state: 'action-required',
463
501
  progress: 20,
502
+ repositoryPath: '/home/user/my-repo',
503
+ branch: 'feat/sso-integration',
464
504
  },
465
505
  },
466
506
  {
@@ -474,6 +514,8 @@ const mixedRepoFeatureNodesRaw = [
474
514
  lifecycle: 'requirements',
475
515
  state: 'running',
476
516
  progress: 10,
517
+ repositoryPath: '/home/user/my-repo',
518
+ branch: 'feat/api-gateway',
477
519
  },
478
520
  },
479
521
  {
@@ -487,6 +529,8 @@ const mixedRepoFeatureNodesRaw = [
487
529
  lifecycle: 'deploy',
488
530
  state: 'done',
489
531
  progress: 100,
532
+ repositoryPath: '/home/user/my-repo',
533
+ branch: 'feat/admin-panel',
490
534
  },
491
535
  },
492
536
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAkBnD"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAqBnD"}
@@ -4,7 +4,10 @@ import { useCallback } from 'react';
4
4
  import { SidebarProvider, SidebarInset } from '../../ui/sidebar.js';
5
5
  import { AppSidebar } from '../../layouts/app-sidebar/index.js';
6
6
  import { ThemeToggle } from '../../common/theme-toggle/index.js';
7
+ import { useNotifications } from '../../../hooks/use-notifications.js';
7
8
  export function AppShell({ children }) {
9
+ // Subscribe to agent lifecycle events and dispatch toast/browser notifications
10
+ useNotifications();
8
11
  const handleNewFeature = useCallback(() => {
9
12
  window.dispatchEvent(new CustomEvent('shep:open-create-drawer'));
10
13
  }, []);
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const buttonVariants: (props?: ({
4
4
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
- size?: "default" | "icon" | "sm" | "lg" | "xs" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
5
+ size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
8
8
  asChild?: boolean;
@@ -0,0 +1,12 @@
1
+ import type { NotificationEvent } from '../../../../packages/core/src/domain/generated/output.js';
2
+ export type ConnectionStatus = 'connected' | 'connecting' | 'disconnected';
3
+ export interface UseAgentEventsOptions {
4
+ runId?: string;
5
+ }
6
+ export interface UseAgentEventsResult {
7
+ events: NotificationEvent[];
8
+ lastEvent: NotificationEvent | null;
9
+ connectionStatus: ConnectionStatus;
10
+ }
11
+ export declare function useAgentEvents(options?: UseAgentEventsOptions): UseAgentEventsResult;
12
+ //# sourceMappingURL=use-agent-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-events.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-agent-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAKD,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAkEpF"}
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ const BASE_BACKOFF_MS = 1000;
4
+ const MAX_BACKOFF_MS = 30_000;
5
+ export function useAgentEvents(options) {
6
+ const [events, setEvents] = useState([]);
7
+ const [lastEvent, setLastEvent] = useState(null);
8
+ const [connectionStatus, setConnectionStatus] = useState('disconnected');
9
+ const backoffRef = useRef(BASE_BACKOFF_MS);
10
+ const reconnectTimerRef = useRef(null);
11
+ const esRef = useRef(null);
12
+ const runId = options?.runId;
13
+ const connect = useCallback(() => {
14
+ if (typeof window === 'undefined' || typeof EventSource === 'undefined') {
15
+ return;
16
+ }
17
+ const url = runId
18
+ ? `/api/agent-events?runId=${encodeURIComponent(runId)}`
19
+ : '/api/agent-events';
20
+ const es = new EventSource(url);
21
+ esRef.current = es;
22
+ setConnectionStatus('connecting');
23
+ es.onopen = () => {
24
+ setConnectionStatus('connected');
25
+ backoffRef.current = BASE_BACKOFF_MS;
26
+ };
27
+ es.onerror = () => {
28
+ es.close();
29
+ esRef.current = null;
30
+ setConnectionStatus('disconnected');
31
+ const delay = backoffRef.current;
32
+ backoffRef.current = Math.min(delay * 2, MAX_BACKOFF_MS);
33
+ reconnectTimerRef.current = setTimeout(() => {
34
+ reconnectTimerRef.current = null;
35
+ connect();
36
+ }, delay);
37
+ };
38
+ es.addEventListener('notification', ((event) => {
39
+ const parsed = JSON.parse(event.data);
40
+ setEvents((prev) => [...prev, parsed]);
41
+ setLastEvent(parsed);
42
+ }));
43
+ }, [runId]);
44
+ useEffect(() => {
45
+ connect();
46
+ return () => {
47
+ if (reconnectTimerRef.current !== null) {
48
+ clearTimeout(reconnectTimerRef.current);
49
+ reconnectTimerRef.current = null;
50
+ }
51
+ if (esRef.current) {
52
+ esRef.current.close();
53
+ esRef.current = null;
54
+ }
55
+ };
56
+ }, [connect]);
57
+ return { events, lastEvent, connectionStatus };
58
+ }
@@ -0,0 +1,10 @@
1
+ export interface UseNotificationsOptions {
2
+ browserEnabled?: boolean;
3
+ runId?: string;
4
+ }
5
+ export interface UseNotificationsResult {
6
+ requestBrowserPermission: () => Promise<void>;
7
+ browserPermissionState: NotificationPermission;
8
+ }
9
+ export declare function useNotifications(options?: UseNotificationsOptions): UseNotificationsResult;
10
+ //# sourceMappingURL=use-notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-notifications.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-notifications.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,sBAAsB,EAAE,sBAAsB,CAAC;CAChD;AAqBD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAyC1F"}
@@ -0,0 +1,57 @@
1
+ 'use client';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { toast } from 'sonner';
4
+ import { NotificationSeverity } from '../../../../packages/core/src/domain/generated/output.js';
5
+ import { useAgentEvents } from './use-agent-events.js';
6
+ const SEVERITY_TO_TOAST = {
7
+ [NotificationSeverity.Success]: 'success',
8
+ [NotificationSeverity.Error]: 'error',
9
+ [NotificationSeverity.Warning]: 'warning',
10
+ [NotificationSeverity.Info]: 'info',
11
+ };
12
+ function dispatchToast(event) {
13
+ const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';
14
+ toast[method](event.featureName, { description: event.message });
15
+ }
16
+ function dispatchBrowserNotification(event) {
17
+ if (globalThis.Notification?.permission !== 'granted') {
18
+ return;
19
+ }
20
+ new Notification(event.featureName, { body: event.message });
21
+ }
22
+ export function useNotifications(options) {
23
+ const browserEnabled = options?.browserEnabled ?? false;
24
+ const { lastEvent } = useAgentEvents({ runId: options?.runId });
25
+ const [browserPermissionState, setBrowserPermissionState] = useState(() => {
26
+ if (typeof globalThis.Notification === 'undefined')
27
+ return 'default';
28
+ return globalThis.Notification.permission;
29
+ });
30
+ // Track which events we've already dispatched to avoid re-dispatching on re-render
31
+ const processedRef = useRef(new Set());
32
+ useEffect(() => {
33
+ if (!lastEvent)
34
+ return;
35
+ // Create a key for deduplication
36
+ const key = `${lastEvent.agentRunId}-${lastEvent.eventType}-${lastEvent.timestamp}`;
37
+ if (processedRef.current.has(key))
38
+ return;
39
+ processedRef.current.add(key);
40
+ // Always dispatch toast
41
+ dispatchToast(lastEvent);
42
+ // Dispatch browser notification if enabled and permitted
43
+ if (browserEnabled) {
44
+ dispatchBrowserNotification(lastEvent);
45
+ }
46
+ }, [lastEvent, browserEnabled]);
47
+ const requestBrowserPermission = useCallback(async () => {
48
+ if (typeof globalThis.Notification === 'undefined')
49
+ return;
50
+ const result = await globalThis.Notification.requestPermission();
51
+ setBrowserPermissionState(result);
52
+ }, []);
53
+ return {
54
+ requestBrowserPermission,
55
+ browserPermissionState,
56
+ };
57
+ }
@@ -0,0 +1,6 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ declare const meta: Meta;
3
+ export default meta;
4
+ type Story = StoryObj;
5
+ export declare const Default: Story;
6
+ //# sourceMappingURL=use-notifications.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-notifications.stories.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-notifications.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAwIvD,QAAA,MAAM,IAAI,EAAE,IAcX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { toast } from 'sonner';
4
+ import { Toaster } from '../components/ui/sonner.js';
5
+ import { Button } from '../components/ui/button.js';
6
+ function simulateNotification(event) {
7
+ const method = event.severity ?? 'info';
8
+ toast[method](event.featureName, { description: event.message });
9
+ if (globalThis.Notification?.permission === 'granted') {
10
+ new Notification(event.featureName, { body: event.message });
11
+ }
12
+ }
13
+ function NotificationDemo() {
14
+ const [browserPermission, setBrowserPermission] = useState(typeof globalThis.Notification !== 'undefined' ? globalThis.Notification.permission : 'default');
15
+ const requestPermission = async () => {
16
+ if (typeof globalThis.Notification === 'undefined')
17
+ return;
18
+ const result = await globalThis.Notification.requestPermission();
19
+ setBrowserPermission(result);
20
+ };
21
+ return (_jsxs("div", { className: "flex w-[420px] flex-col gap-6", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Browser Notification Permission" }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "text-muted-foreground text-sm", children: ["Status: ", _jsx("code", { className: "bg-muted rounded px-1.5 py-0.5", children: browserPermission })] }), _jsx(Button, { size: "sm", variant: "outline", onClick: requestPermission, children: "Request Permission" })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Simulate Notification Events" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Click a button to fire a toast and browser notification." }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => simulateNotification({
22
+ eventType: 'agent_started',
23
+ severity: 'info',
24
+ featureName: 'Auth Module',
25
+ message: 'Agent started running',
26
+ }), children: "Agent Started" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => simulateNotification({
27
+ eventType: 'phase_completed',
28
+ severity: 'info',
29
+ featureName: 'Auth Module',
30
+ message: 'Completed analyze phase',
31
+ phaseName: 'analyze',
32
+ }), children: "Phase Completed" }), _jsx(Button, { size: "sm", variant: "secondary", onClick: () => simulateNotification({
33
+ eventType: 'waiting_approval',
34
+ severity: 'warning',
35
+ featureName: 'Auth Module',
36
+ message: 'Waiting for user approval',
37
+ }), children: "Waiting Approval" }), _jsx(Button, { size: "sm", onClick: () => simulateNotification({
38
+ eventType: 'agent_completed',
39
+ severity: 'success',
40
+ featureName: 'Auth Module',
41
+ message: 'Agent completed successfully',
42
+ }), children: "Agent Completed" }), _jsx(Button, { size: "sm", variant: "destructive", onClick: () => simulateNotification({
43
+ eventType: 'agent_failed',
44
+ severity: 'error',
45
+ featureName: 'Auth Module',
46
+ message: 'Agent failed: token refresh error',
47
+ }), children: "Agent Failed" })] })] })] }));
48
+ }
49
+ const meta = {
50
+ title: 'Hooks/useNotifications',
51
+ parameters: {
52
+ layout: 'centered',
53
+ },
54
+ tags: ['autodocs'],
55
+ decorators: [
56
+ (Story) => (_jsxs(_Fragment, { children: [_jsx(Story, {}), _jsx(Toaster, {})] })),
57
+ ],
58
+ };
59
+ export default meta;
60
+ export const Default = {
61
+ render: () => _jsx(NotificationDemo, {}),
62
+ };