@shepai/cli 1.26.0 → 1.28.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 (225) 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 +109 -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/notifications/desktop-notifier.d.ts +22 -0
  26. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.js +39 -0
  28. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +52 -0
  29. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +64 -0
  31. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts +60 -0
  32. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.js +225 -0
  34. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts +21 -0
  35. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +43 -0
  37. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  38. package/dist/src/presentation/cli/commands/feat/new.command.js +7 -6
  39. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  40. package/dist/src/presentation/cli/commands/ui.command.js +8 -0
  41. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +14 -0
  42. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -0
  43. package/dist/src/presentation/web/app/api/agent-events/route.js +77 -0
  44. package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +1 -1
  45. package/dist/src/presentation/web/app/api/features/create/route.js +28 -2
  46. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  47. package/dist/src/presentation/web/app/page.js +9 -12
  48. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -8
  49. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +37 -4
  51. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +30 -6
  52. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +74 -18
  54. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts +1 -1
  55. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +2 -2
  57. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +3 -3
  58. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -2
  59. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  60. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +9 -0
  61. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -7
  63. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +3 -0
  65. package/dist/src/presentation/web/components/common/index.d.ts +1 -1
  66. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/common/index.js +1 -1
  68. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  70. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +3 -2
  71. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +4 -12
  73. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +3 -0
  75. package/dist/src/presentation/web/components/ui/button.d.ts +1 -1
  76. package/dist/src/presentation/web/components/ui/checkbox-group-item.d.ts +11 -0
  77. package/dist/src/presentation/web/components/ui/checkbox-group-item.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/ui/checkbox-group-item.js +8 -0
  79. package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.d.ts +17 -0
  80. package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.d.ts.map +1 -0
  81. package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.js +33 -0
  82. package/dist/src/presentation/web/components/ui/checkbox-group.d.ts +21 -0
  83. package/dist/src/presentation/web/components/ui/checkbox-group.d.ts.map +1 -0
  84. package/dist/src/presentation/web/components/ui/checkbox-group.js +24 -0
  85. package/dist/src/presentation/web/components/ui/checkbox-group.stories.d.ts +23 -0
  86. package/dist/src/presentation/web/components/ui/checkbox-group.stories.d.ts.map +1 -0
  87. package/dist/src/presentation/web/components/ui/checkbox-group.stories.js +61 -0
  88. package/dist/src/presentation/web/components/ui/checkbox.d.ts +5 -0
  89. package/dist/src/presentation/web/components/ui/checkbox.d.ts.map +1 -0
  90. package/dist/src/presentation/web/components/ui/checkbox.js +9 -0
  91. package/dist/src/presentation/web/components/ui/checkbox.stories.d.ts +10 -0
  92. package/dist/src/presentation/web/components/ui/checkbox.stories.d.ts.map +1 -0
  93. package/dist/src/presentation/web/components/ui/checkbox.stories.js +24 -0
  94. package/dist/src/presentation/web/hooks/use-agent-events.d.ts +12 -0
  95. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -0
  96. package/dist/src/presentation/web/hooks/use-agent-events.js +58 -0
  97. package/dist/src/presentation/web/hooks/use-notifications.d.ts +10 -0
  98. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -0
  99. package/dist/src/presentation/web/hooks/use-notifications.js +57 -0
  100. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts +6 -0
  101. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts.map +1 -0
  102. package/dist/src/presentation/web/hooks/use-notifications.stories.js +62 -0
  103. package/dist/tsconfig.build.tsbuildinfo +1 -1
  104. package/package.json +3 -1
  105. package/web/.next/BUILD_ID +1 -1
  106. package/web/.next/app-path-routes-manifest.json +1 -0
  107. package/web/.next/build-manifest.json +2 -2
  108. package/web/.next/cache/.previewinfo +1 -1
  109. package/web/.next/cache/.rscinfo +1 -1
  110. package/web/.next/cache/.tsbuildinfo +1 -1
  111. package/web/.next/cache/config.json +3 -3
  112. package/web/.next/fallback-build-manifest.json +2 -2
  113. package/web/.next/prerender-manifest.json +3 -3
  114. package/web/.next/required-server-files.js +1 -1
  115. package/web/.next/required-server-files.json +1 -1
  116. package/web/.next/routes-manifest.json +6 -0
  117. package/web/.next/server/app/_global-error.html +2 -2
  118. package/web/.next/server/app/_global-error.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/_not-found.html +2 -2
  127. package/web/.next/server/app/_not-found.rsc +10 -10
  128. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  129. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  130. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
  131. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  132. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  133. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  134. package/web/.next/server/app/api/agent-events/route/app-paths-manifest.json +3 -0
  135. package/web/.next/server/app/api/agent-events/route/build-manifest.json +11 -0
  136. package/web/.next/server/app/api/agent-events/route/server-reference-manifest.json +4 -0
  137. package/web/.next/server/app/api/agent-events/route.js +6 -0
  138. package/web/.next/server/app/api/agent-events/route.js.map +5 -0
  139. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -0
  140. package/web/.next/server/app/api/agent-events/route_client-reference-manifest.js +2 -0
  141. package/web/.next/server/app/api/dialog/pick-files/route.js +3 -2
  142. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  143. package/web/.next/server/app/api/dialog/pick-folder/route.js +3 -2
  144. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +1 -1
  145. package/web/.next/server/app/api/features/create/route.js +3 -2
  146. package/web/.next/server/app/api/features/create/route.js.nft.json +1 -1
  147. package/web/.next/server/app/api/ide/open/route.js +4 -2
  148. package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -1
  149. package/web/.next/server/app/api/shell/open/route.js +3 -2
  150. package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -1
  151. package/web/.next/server/app/page.js +1 -1
  152. package/web/.next/server/app/page.js.nft.json +1 -1
  153. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/version/page.js.nft.json +1 -1
  155. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/version.html +2 -2
  157. package/web/.next/server/app/version.rsc +5 -5
  158. package/web/.next/server/app/version.segments/_full.segment.rsc +5 -5
  159. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  160. package/web/.next/server/app/version.segments/_index.segment.rsc +4 -4
  161. package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
  162. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +2 -2
  163. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  164. package/web/.next/server/app-paths-manifest.json +1 -0
  165. package/web/.next/server/chunks/403f9_next_567de315._.js +17 -0
  166. package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
  167. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +3 -0
  168. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js.map +1 -0
  169. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js +3 -0
  170. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js.map +1 -0
  171. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js +8 -0
  172. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js.map +1 -0
  173. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js +7 -0
  174. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js.map +1 -0
  175. package/web/.next/server/chunks/{[root-of-the-server]__602cce1b._.js → [root-of-the-server]__61349adc._.js} +2 -2
  176. package/web/.next/server/chunks/{[root-of-the-server]__bb4fc5b5._.js → [root-of-the-server]__a6bf88cc._.js} +2 -2
  177. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js +3 -0
  178. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js.map +1 -0
  179. package/web/.next/server/chunks/{[root-of-the-server]__1913013c._.js → [root-of-the-server]__ec87d735._.js} +2 -2
  180. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +3 -0
  181. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_dbf21e04.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__80e5bed2._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa87595c._.js +1 -1
  186. package/web/.next/server/chunks/ssr/_09afa42a._.js +6 -1
  187. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_884ddade._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_a4189414._.js +10 -0
  190. package/web/.next/server/chunks/ssr/_a4189414._.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/_c5d377cc._.js +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  196. package/web/.next/server/pages/404.html +2 -2
  197. package/web/.next/server/pages/500.html +2 -2
  198. package/web/.next/server/server-reference-manifest.js +1 -1
  199. package/web/.next/server/server-reference-manifest.json +1 -1
  200. package/web/.next/static/chunks/1d665ddc2230f73f.js +5 -0
  201. package/web/.next/static/chunks/{c2854b6c6d0ca1f3.js → 28c05929f2636c01.js} +7 -2
  202. package/web/.next/static/chunks/a7273c84449394e0.css +2 -0
  203. package/web/.next/static/chunks/b32b17f102226f32.js +1 -0
  204. package/web/.next/trace +1 -1
  205. package/web/.next/trace-build +1 -1
  206. package/web/.next/types/link.d.ts +1 -0
  207. package/web/.next/types/routes.d.ts +2 -1
  208. package/web/.next/types/validator.ts +9 -0
  209. package/web/.next/server/chunks/[root-of-the-server]__56ac1509._.js +0 -3
  210. package/web/.next/server/chunks/[root-of-the-server]__56ac1509._.js.map +0 -1
  211. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js +0 -21
  212. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js.map +0 -1
  213. package/web/.next/server/chunks/[root-of-the-server]__eaa478b7._.js +0 -8
  214. package/web/.next/server/chunks/[root-of-the-server]__eaa478b7._.js.map +0 -1
  215. package/web/.next/server/chunks/ssr/_1c3962d7._.js +0 -10
  216. package/web/.next/server/chunks/ssr/_1c3962d7._.js.map +0 -1
  217. package/web/.next/static/chunks/78ef4acb26e4d6ea.js +0 -1
  218. package/web/.next/static/chunks/79009d1ca0d944d2.js +0 -5
  219. package/web/.next/static/chunks/86ff2b6444e06e88.css +0 -2
  220. /package/web/.next/server/chunks/{[root-of-the-server]__602cce1b._.js.map → [root-of-the-server]__61349adc._.js.map} +0 -0
  221. /package/web/.next/server/chunks/{[root-of-the-server]__bb4fc5b5._.js.map → [root-of-the-server]__a6bf88cc._.js.map} +0 -0
  222. /package/web/.next/server/chunks/{[root-of-the-server]__1913013c._.js.map → [root-of-the-server]__ec87d735._.js.map} +0 -0
  223. /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_buildManifest.js +0 -0
  224. /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_clientMiddlewareManifest.json +0 -0
  225. /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_ssgManifest.js +0 -0
@@ -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
+ };