specweave 0.28.67 → 0.29.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 (239) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +19 -2
  3. package/dist/src/cli/commands/discrepancies.d.ts +89 -0
  4. package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
  5. package/dist/src/cli/commands/discrepancies.js +385 -0
  6. package/dist/src/cli/commands/discrepancies.js.map +1 -0
  7. package/dist/src/cli/commands/notifications.d.ts +70 -0
  8. package/dist/src/cli/commands/notifications.d.ts.map +1 -0
  9. package/dist/src/cli/commands/notifications.js +236 -0
  10. package/dist/src/cli/commands/notifications.js.map +1 -0
  11. package/dist/src/cli/commands/sync-logs.d.ts +54 -0
  12. package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
  13. package/dist/src/cli/commands/sync-logs.js +240 -0
  14. package/dist/src/cli/commands/sync-logs.js.map +1 -0
  15. package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
  16. package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
  17. package/dist/src/cli/commands/sync-monitor.js +191 -0
  18. package/dist/src/cli/commands/sync-monitor.js.map +1 -0
  19. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
  20. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
  21. package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
  22. package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
  23. package/dist/src/cli/helpers/init/index.d.ts +1 -0
  24. package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
  25. package/dist/src/cli/helpers/init/index.js +2 -0
  26. package/dist/src/cli/helpers/init/index.js.map +1 -1
  27. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  28. package/dist/src/cli/helpers/issue-tracker/ado.js +14 -5
  29. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  30. package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
  31. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
  32. package/dist/src/cli/workers/brownfield-worker.js +417 -0
  33. package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
  34. package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
  35. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
  36. package/dist/src/core/background/brownfield-launcher.js +295 -0
  37. package/dist/src/core/background/brownfield-launcher.js.map +1 -0
  38. package/dist/src/core/background/index.d.ts +2 -0
  39. package/dist/src/core/background/index.d.ts.map +1 -1
  40. package/dist/src/core/background/index.js +2 -0
  41. package/dist/src/core/background/index.js.map +1 -1
  42. package/dist/src/core/background/types.d.ts +23 -2
  43. package/dist/src/core/background/types.d.ts.map +1 -1
  44. package/dist/src/core/config/index.d.ts +1 -0
  45. package/dist/src/core/config/index.d.ts.map +1 -1
  46. package/dist/src/core/config/index.js +1 -0
  47. package/dist/src/core/config/index.js.map +1 -1
  48. package/dist/src/core/config/types.d.ts +6 -0
  49. package/dist/src/core/config/types.d.ts.map +1 -1
  50. package/dist/src/core/config/types.js.map +1 -1
  51. package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
  52. package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
  53. package/dist/src/core/dashboard/dashboard-data.js +191 -0
  54. package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
  55. package/dist/src/core/dashboard/index.d.ts +9 -0
  56. package/dist/src/core/dashboard/index.d.ts.map +1 -0
  57. package/dist/src/core/dashboard/index.js +9 -0
  58. package/dist/src/core/dashboard/index.js.map +1 -0
  59. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
  60. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
  61. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
  62. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
  63. package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
  64. package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
  65. package/dist/src/core/discrepancy/analyzers/index.js +8 -0
  66. package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
  67. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
  68. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
  69. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
  70. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
  71. package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
  72. package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
  73. package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
  74. package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
  75. package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
  76. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
  77. package/dist/src/core/discrepancy/brownfield-types.js +11 -0
  78. package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
  79. package/dist/src/core/discrepancy/detector.d.ts +92 -0
  80. package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
  81. package/dist/src/core/discrepancy/detector.js +346 -0
  82. package/dist/src/core/discrepancy/detector.js.map +1 -0
  83. package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
  84. package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
  85. package/dist/src/core/discrepancy/increment-generator.js +234 -0
  86. package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
  87. package/dist/src/core/discrepancy/index.d.ts +18 -0
  88. package/dist/src/core/discrepancy/index.d.ts.map +1 -0
  89. package/dist/src/core/discrepancy/index.js +24 -0
  90. package/dist/src/core/discrepancy/index.js.map +1 -0
  91. package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
  92. package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
  93. package/dist/src/core/discrepancy/severity-classifier.js +289 -0
  94. package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
  95. package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
  96. package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
  97. package/dist/src/core/discrepancy/spec-parser.js +213 -0
  98. package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
  99. package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
  100. package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
  101. package/dist/src/core/discrepancy/update-recommender.js +323 -0
  102. package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
  103. package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
  104. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  105. package/dist/src/core/living-docs/living-docs-sync.js +31 -112
  106. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  107. package/dist/src/core/logs/index.d.ts +10 -0
  108. package/dist/src/core/logs/index.d.ts.map +1 -0
  109. package/dist/src/core/logs/index.js +10 -0
  110. package/dist/src/core/logs/index.js.map +1 -0
  111. package/dist/src/core/logs/log-aggregator.d.ts +130 -0
  112. package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
  113. package/dist/src/core/logs/log-aggregator.js +206 -0
  114. package/dist/src/core/logs/log-aggregator.js.map +1 -0
  115. package/dist/src/core/logs/log-exporter.d.ts +81 -0
  116. package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
  117. package/dist/src/core/logs/log-exporter.js +141 -0
  118. package/dist/src/core/logs/log-exporter.js.map +1 -0
  119. package/dist/src/core/notifications/command-integration.d.ts +82 -0
  120. package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
  121. package/dist/src/core/notifications/command-integration.js +80 -0
  122. package/dist/src/core/notifications/command-integration.js.map +1 -0
  123. package/dist/src/core/notifications/index.d.ts +12 -0
  124. package/dist/src/core/notifications/index.d.ts.map +1 -0
  125. package/dist/src/core/notifications/index.js +12 -0
  126. package/dist/src/core/notifications/index.js.map +1 -0
  127. package/dist/src/core/notifications/notification-display.d.ts +70 -0
  128. package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
  129. package/dist/src/core/notifications/notification-display.js +177 -0
  130. package/dist/src/core/notifications/notification-display.js.map +1 -0
  131. package/dist/src/core/notifications/notification-manager.d.ts +126 -0
  132. package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
  133. package/dist/src/core/notifications/notification-manager.js +287 -0
  134. package/dist/src/core/notifications/notification-manager.js.map +1 -0
  135. package/dist/src/core/notifications/notification-types.d.ts +159 -0
  136. package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
  137. package/dist/src/core/notifications/notification-types.js +93 -0
  138. package/dist/src/core/notifications/notification-types.js.map +1 -0
  139. package/dist/src/core/scheduler/index.d.ts +11 -0
  140. package/dist/src/core/scheduler/index.d.ts.map +1 -0
  141. package/dist/src/core/scheduler/index.js +11 -0
  142. package/dist/src/core/scheduler/index.js.map +1 -0
  143. package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
  144. package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
  145. package/dist/src/core/scheduler/job-scheduler.js +282 -0
  146. package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
  147. package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
  148. package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
  149. package/dist/src/core/scheduler/schedule-persistence.js +180 -0
  150. package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
  151. package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
  152. package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
  153. package/dist/src/core/scheduler/scheduled-job.js +182 -0
  154. package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
  155. package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
  156. package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
  157. package/dist/src/core/sync/permission-enforcer.js +268 -0
  158. package/dist/src/core/sync/permission-enforcer.js.map +1 -0
  159. package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
  160. package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
  161. package/dist/src/core/sync/sync-audit-logger.js +327 -0
  162. package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
  163. package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
  164. package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
  165. package/dist/src/core/sync/sync-interceptor.js +224 -0
  166. package/dist/src/core/sync/sync-interceptor.js.map +1 -0
  167. package/dist/src/core/types/increment-metadata.d.ts +5 -2
  168. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  169. package/dist/src/core/types/sync-config.d.ts +267 -0
  170. package/dist/src/core/types/sync-config.d.ts.map +1 -0
  171. package/dist/src/core/types/sync-config.js +304 -0
  172. package/dist/src/core/types/sync-config.js.map +1 -0
  173. package/dist/src/hooks/index.d.ts +11 -0
  174. package/dist/src/hooks/index.d.ts.map +1 -0
  175. package/dist/src/hooks/index.js +11 -0
  176. package/dist/src/hooks/index.js.map +1 -0
  177. package/dist/src/hooks/platform.d.ts +125 -0
  178. package/dist/src/hooks/platform.d.ts.map +1 -0
  179. package/dist/src/hooks/platform.js +325 -0
  180. package/dist/src/hooks/platform.js.map +1 -0
  181. package/dist/src/hooks/processor.d.ts +20 -0
  182. package/dist/src/hooks/processor.d.ts.map +1 -0
  183. package/dist/src/hooks/processor.js +317 -0
  184. package/dist/src/hooks/processor.js.map +1 -0
  185. package/dist/src/hooks/scheduler-startup.d.ts +19 -0
  186. package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
  187. package/dist/src/hooks/scheduler-startup.js +92 -0
  188. package/dist/src/hooks/scheduler-startup.js.map +1 -0
  189. package/dist/src/hooks/session-start.d.ts +16 -0
  190. package/dist/src/hooks/session-start.d.ts.map +1 -0
  191. package/dist/src/hooks/session-start.js +92 -0
  192. package/dist/src/hooks/session-start.js.map +1 -0
  193. package/dist/src/importers/duplicate-detector.d.ts +13 -2
  194. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  195. package/dist/src/importers/duplicate-detector.js +21 -2
  196. package/dist/src/importers/duplicate-detector.js.map +1 -1
  197. package/dist/src/importers/item-converter.d.ts +41 -2
  198. package/dist/src/importers/item-converter.d.ts.map +1 -1
  199. package/dist/src/importers/item-converter.js +231 -45
  200. package/dist/src/importers/item-converter.js.map +1 -1
  201. package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
  202. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  203. package/dist/src/living-docs/fs-id-allocator.js +30 -4
  204. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  205. package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
  206. package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
  207. package/dist/src/sync/ado-sync-wrapper.js +148 -0
  208. package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
  209. package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
  210. package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
  211. package/dist/src/sync/github-sync-wrapper.js +220 -0
  212. package/dist/src/sync/github-sync-wrapper.js.map +1 -0
  213. package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
  214. package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
  215. package/dist/src/sync/jira-sync-wrapper.js +175 -0
  216. package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
  217. package/dist/src/utils/feature-id-derivation.d.ts +58 -0
  218. package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
  219. package/dist/src/utils/feature-id-derivation.js +77 -0
  220. package/dist/src/utils/feature-id-derivation.js.map +1 -0
  221. package/package.json +1 -1
  222. package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
  223. package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
  224. package/plugins/specweave/commands/specweave-jobs.md +45 -2
  225. package/plugins/specweave/commands/specweave-notifications.md +92 -0
  226. package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
  227. package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
  228. package/plugins/specweave/hooks/hooks.json +3 -3
  229. package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
  230. package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
  231. package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
  232. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
  233. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
  234. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
  235. package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
  236. package/plugins/specweave-ado/lib/ado-project-detector.js +11 -5
  237. package/plugins/specweave-ado/lib/ado-project-detector.ts +16 -5
  238. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +34 -0
  239. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +51 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Notification Manager
3
+ *
4
+ * Manages notification storage, retrieval, and lifecycle.
5
+ *
6
+ * @module core/notifications/notification-manager
7
+ */
8
+ import { Notification, CreateNotificationInput, NotificationQueryOptions } from './notification-types.js';
9
+ import { Logger } from '../../utils/logger.js';
10
+ /**
11
+ * Notification manager options
12
+ */
13
+ export interface NotificationManagerOptions {
14
+ /**
15
+ * Path to .specweave directory
16
+ */
17
+ specweavePath?: string;
18
+ /**
19
+ * Logger instance
20
+ */
21
+ logger?: Logger;
22
+ /**
23
+ * Default cleanup age in days
24
+ * @default 30
25
+ */
26
+ defaultRetentionDays?: number;
27
+ }
28
+ /**
29
+ * NotificationManager - Central notification storage and retrieval
30
+ *
31
+ * Features:
32
+ * - Add/query/dismiss notifications
33
+ * - Automatic persistence
34
+ * - Cleanup of old notifications
35
+ */
36
+ export declare class NotificationManager {
37
+ private readonly filePath;
38
+ private readonly logger;
39
+ private readonly defaultRetentionDays;
40
+ private notifications;
41
+ constructor(options?: NotificationManagerOptions);
42
+ /**
43
+ * Add a new notification
44
+ *
45
+ * @param input - Notification input
46
+ * @returns Created notification
47
+ */
48
+ add(input: CreateNotificationInput): Promise<Notification>;
49
+ /**
50
+ * Get pending notifications (not dismissed)
51
+ *
52
+ * @returns Array of pending notifications
53
+ */
54
+ getPending(): Promise<Notification[]>;
55
+ /**
56
+ * Get all notifications with optional filtering
57
+ *
58
+ * @param options - Query options
59
+ * @returns Array of notifications
60
+ */
61
+ getAll(options?: NotificationQueryOptions): Promise<Notification[]>;
62
+ /**
63
+ * Get a single notification by ID
64
+ *
65
+ * @param id - Notification ID
66
+ * @returns Notification or undefined
67
+ */
68
+ getById(id: string): Promise<Notification | undefined>;
69
+ /**
70
+ * Mark notifications as read
71
+ *
72
+ * @param ids - Array of notification IDs to mark as read
73
+ */
74
+ markRead(ids: string[]): Promise<void>;
75
+ /**
76
+ * Dismiss notifications (hide from pending but keep in history)
77
+ *
78
+ * @param ids - Array of notification IDs to dismiss
79
+ */
80
+ dismiss(ids: string[]): Promise<void>;
81
+ /**
82
+ * Dismiss all pending notifications
83
+ */
84
+ dismissAll(): Promise<void>;
85
+ /**
86
+ * Cleanup old notifications
87
+ *
88
+ * @param olderThanDays - Remove notifications older than this many days
89
+ * @returns Number of removed notifications
90
+ */
91
+ cleanup(olderThanDays?: number): Promise<number>;
92
+ /**
93
+ * Get summary for display
94
+ *
95
+ * @returns Summary object
96
+ */
97
+ getSummary(): Promise<{
98
+ total: number;
99
+ pending: number;
100
+ bySeverity: Record<string, number>;
101
+ byType: Record<string, number>;
102
+ }>;
103
+ /**
104
+ * Check if there are any pending notifications
105
+ *
106
+ * @returns true if pending notifications exist
107
+ */
108
+ hasPending(): Promise<boolean>;
109
+ /**
110
+ * Load notifications from disk
111
+ */
112
+ private load;
113
+ /**
114
+ * Save notifications to disk
115
+ */
116
+ private save;
117
+ /**
118
+ * Clear cache (for testing)
119
+ */
120
+ clearCache(): void;
121
+ /**
122
+ * Get file path (for testing/debugging)
123
+ */
124
+ getFilePath(): string;
125
+ }
126
+ //# sourceMappingURL=notification-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/notifications/notification-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EAGzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AA2B9D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,aAAa,CAA+B;gBAExC,OAAO,GAAE,0BAA+B;IAOpD;;;;;OAKG;IACG,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAWhE;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAO3C;;;;;OAKG;IACG,MAAM,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0C7E;;;;;OAKG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAK5D;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5C;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC;;;;;OAKG;IACG,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;IAoBF;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAKpC;;OAEG;YACW,IAAI;IAkClB;;OAEG;YACW,IAAI;IA8BlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Notification Manager
3
+ *
4
+ * Manages notification storage, retrieval, and lifecycle.
5
+ *
6
+ * @module core/notifications/notification-manager
7
+ */
8
+ import { promises as fs } from 'fs';
9
+ import path from 'path';
10
+ import { createNotification, isPendingNotification, } from './notification-types.js';
11
+ import { consoleLogger } from '../../utils/logger.js';
12
+ /**
13
+ * Current schema version
14
+ */
15
+ const CURRENT_VERSION = 1;
16
+ /**
17
+ * NotificationManager - Central notification storage and retrieval
18
+ *
19
+ * Features:
20
+ * - Add/query/dismiss notifications
21
+ * - Automatic persistence
22
+ * - Cleanup of old notifications
23
+ */
24
+ export class NotificationManager {
25
+ constructor(options = {}) {
26
+ this.notifications = null;
27
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
28
+ this.filePath = path.join(specweavePath, 'state', 'notifications.json');
29
+ this.logger = options.logger ?? consoleLogger;
30
+ this.defaultRetentionDays = options.defaultRetentionDays ?? 30;
31
+ }
32
+ /**
33
+ * Add a new notification
34
+ *
35
+ * @param input - Notification input
36
+ * @returns Created notification
37
+ */
38
+ async add(input) {
39
+ const notifications = await this.load();
40
+ const notification = createNotification(input);
41
+ notifications.push(notification);
42
+ await this.save(notifications);
43
+ this.logger.debug(`Added notification: ${notification.id} (${notification.type})`);
44
+ return notification;
45
+ }
46
+ /**
47
+ * Get pending notifications (not dismissed)
48
+ *
49
+ * @returns Array of pending notifications
50
+ */
51
+ async getPending() {
52
+ const notifications = await this.load();
53
+ return notifications
54
+ .filter(isPendingNotification)
55
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
56
+ }
57
+ /**
58
+ * Get all notifications with optional filtering
59
+ *
60
+ * @param options - Query options
61
+ * @returns Array of notifications
62
+ */
63
+ async getAll(options = {}) {
64
+ const notifications = await this.load();
65
+ let filtered = notifications;
66
+ // Filter by type
67
+ if (options.type) {
68
+ filtered = filtered.filter((n) => n.type === options.type);
69
+ }
70
+ // Filter by severity
71
+ if (options.severity) {
72
+ filtered = filtered.filter((n) => n.severity === options.severity);
73
+ }
74
+ // Filter dismissed
75
+ if (!options.includeDismissed) {
76
+ filtered = filtered.filter((n) => !n.dismissedAt);
77
+ }
78
+ // Filter read (default: include read)
79
+ if (options.includeRead === false) {
80
+ filtered = filtered.filter((n) => !n.readAt);
81
+ }
82
+ // Sort
83
+ const sortMultiplier = options.sortOrder === 'asc' ? 1 : -1;
84
+ filtered.sort((a, b) => sortMultiplier * (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()));
85
+ // Pagination
86
+ if (options.offset) {
87
+ filtered = filtered.slice(options.offset);
88
+ }
89
+ if (options.limit) {
90
+ filtered = filtered.slice(0, options.limit);
91
+ }
92
+ return filtered;
93
+ }
94
+ /**
95
+ * Get a single notification by ID
96
+ *
97
+ * @param id - Notification ID
98
+ * @returns Notification or undefined
99
+ */
100
+ async getById(id) {
101
+ const notifications = await this.load();
102
+ return notifications.find((n) => n.id === id);
103
+ }
104
+ /**
105
+ * Mark notifications as read
106
+ *
107
+ * @param ids - Array of notification IDs to mark as read
108
+ */
109
+ async markRead(ids) {
110
+ const notifications = await this.load();
111
+ const now = new Date().toISOString();
112
+ let changed = false;
113
+ for (const id of ids) {
114
+ const notification = notifications.find((n) => n.id === id);
115
+ if (notification && !notification.readAt) {
116
+ notification.readAt = now;
117
+ changed = true;
118
+ }
119
+ }
120
+ if (changed) {
121
+ await this.save(notifications);
122
+ this.logger.debug(`Marked ${ids.length} notifications as read`);
123
+ }
124
+ }
125
+ /**
126
+ * Dismiss notifications (hide from pending but keep in history)
127
+ *
128
+ * @param ids - Array of notification IDs to dismiss
129
+ */
130
+ async dismiss(ids) {
131
+ const notifications = await this.load();
132
+ const now = new Date().toISOString();
133
+ let changed = false;
134
+ for (const id of ids) {
135
+ const notification = notifications.find((n) => n.id === id);
136
+ if (notification && !notification.dismissedAt) {
137
+ notification.dismissedAt = now;
138
+ // Also mark as read if not already
139
+ if (!notification.readAt) {
140
+ notification.readAt = now;
141
+ }
142
+ changed = true;
143
+ }
144
+ }
145
+ if (changed) {
146
+ await this.save(notifications);
147
+ this.logger.debug(`Dismissed ${ids.length} notifications`);
148
+ }
149
+ }
150
+ /**
151
+ * Dismiss all pending notifications
152
+ */
153
+ async dismissAll() {
154
+ const pending = await this.getPending();
155
+ const ids = pending.map((n) => n.id);
156
+ if (ids.length > 0) {
157
+ await this.dismiss(ids);
158
+ }
159
+ }
160
+ /**
161
+ * Cleanup old notifications
162
+ *
163
+ * @param olderThanDays - Remove notifications older than this many days
164
+ * @returns Number of removed notifications
165
+ */
166
+ async cleanup(olderThanDays) {
167
+ const days = olderThanDays ?? this.defaultRetentionDays;
168
+ const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
169
+ const notifications = await this.load();
170
+ const originalCount = notifications.length;
171
+ const filtered = notifications.filter((n) => {
172
+ const createdAt = new Date(n.createdAt);
173
+ return createdAt > cutoff;
174
+ });
175
+ const removedCount = originalCount - filtered.length;
176
+ if (removedCount > 0) {
177
+ await this.save(filtered);
178
+ this.logger.debug(`Cleaned up ${removedCount} old notifications`);
179
+ }
180
+ return removedCount;
181
+ }
182
+ /**
183
+ * Get summary for display
184
+ *
185
+ * @returns Summary object
186
+ */
187
+ async getSummary() {
188
+ const notifications = await this.load();
189
+ const pending = notifications.filter(isPendingNotification);
190
+ const bySeverity = {};
191
+ const byType = {};
192
+ for (const n of pending) {
193
+ bySeverity[n.severity] = (bySeverity[n.severity] || 0) + 1;
194
+ byType[n.type] = (byType[n.type] || 0) + 1;
195
+ }
196
+ return {
197
+ total: notifications.length,
198
+ pending: pending.length,
199
+ bySeverity,
200
+ byType,
201
+ };
202
+ }
203
+ /**
204
+ * Check if there are any pending notifications
205
+ *
206
+ * @returns true if pending notifications exist
207
+ */
208
+ async hasPending() {
209
+ const pending = await this.getPending();
210
+ return pending.length > 0;
211
+ }
212
+ /**
213
+ * Load notifications from disk
214
+ */
215
+ async load() {
216
+ if (this.notifications !== null) {
217
+ return this.notifications;
218
+ }
219
+ try {
220
+ const content = await fs.readFile(this.filePath, 'utf-8');
221
+ const data = JSON.parse(content);
222
+ if (!Array.isArray(data.notifications)) {
223
+ this.notifications = [];
224
+ return this.notifications;
225
+ }
226
+ this.notifications = data.notifications;
227
+ return this.notifications;
228
+ }
229
+ catch (error) {
230
+ if (error.code === 'ENOENT') {
231
+ this.notifications = [];
232
+ return this.notifications;
233
+ }
234
+ if (error instanceof SyntaxError) {
235
+ this.logger.warn('Corrupted notifications file, starting fresh');
236
+ this.notifications = [];
237
+ return this.notifications;
238
+ }
239
+ this.logger.error(`Failed to load notifications: ${error}`);
240
+ this.notifications = [];
241
+ return this.notifications;
242
+ }
243
+ }
244
+ /**
245
+ * Save notifications to disk
246
+ */
247
+ async save(notifications) {
248
+ this.notifications = notifications;
249
+ const data = {
250
+ version: CURRENT_VERSION,
251
+ notifications,
252
+ lastUpdated: new Date().toISOString(),
253
+ };
254
+ // Ensure directory exists
255
+ const dir = path.dirname(this.filePath);
256
+ await fs.mkdir(dir, { recursive: true });
257
+ // Atomic write
258
+ const tempPath = `${this.filePath}.tmp`;
259
+ const content = JSON.stringify(data, null, 2);
260
+ try {
261
+ await fs.writeFile(tempPath, content, 'utf-8');
262
+ await fs.rename(tempPath, this.filePath);
263
+ }
264
+ catch (error) {
265
+ try {
266
+ await fs.unlink(tempPath);
267
+ }
268
+ catch {
269
+ // Ignore cleanup errors
270
+ }
271
+ throw error;
272
+ }
273
+ }
274
+ /**
275
+ * Clear cache (for testing)
276
+ */
277
+ clearCache() {
278
+ this.notifications = null;
279
+ }
280
+ /**
281
+ * Get file path (for testing/debugging)
282
+ */
283
+ getFilePath() {
284
+ return this.filePath;
285
+ }
286
+ }
287
+ //# sourceMappingURL=notification-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../../../src/core/notifications/notification-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAIL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsB9D;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC;AAuB1B;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAmB;IAM9B,YAAY,UAAsC,EAAE;QAF5C,kBAAa,GAA0B,IAAI,CAAC;QAGlD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,KAA8B;QACtC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE/C,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;QACnF,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,aAAa;aACjB,MAAM,CAAC,qBAAqB,CAAC;aAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAAoC,EAAE;QACjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,QAAQ,GAAG,aAAa,CAAC;QAE7B,iBAAiB;QACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrE,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC9B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC;QAED,sCAAsC;QACtC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAClC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO;QACP,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrB,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CACrF,CAAC;QAEF,aAAa;QACb,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAa;QAC1B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzC,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC1B,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,wBAAwB,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAa;QACzB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC9C,YAAY,CAAC,WAAW,GAAG,GAAG,CAAC;gBAC/B,mCAAmC;gBACnC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACzB,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC5B,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,aAAsB;QAClC,MAAM,IAAI,GAAG,aAAa,IAAI,IAAI,CAAC,oBAAoB,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEjE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC;QAE3C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACxC,OAAO,SAAS,GAAG,MAAM,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;QAErD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,YAAY,oBAAoB,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QAMd,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAE5D,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,KAAK,EAAE,aAAa,CAAC,MAAM;YAC3B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,UAAU;YACV,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;YAEtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACxC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC5B,CAAC;YAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBACjE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI,CAAC,aAA6B;QAC9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,MAAM,IAAI,GAAsB;YAC9B,OAAO,EAAE,eAAe;YACxB,aAAa;YACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,eAAe;QACf,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Notification Types
3
+ *
4
+ * Defines the types for the notification system.
5
+ *
6
+ * @module core/notifications/notification-types
7
+ */
8
+ /**
9
+ * Types of notifications
10
+ */
11
+ export type NotificationType = 'import-complete' | 'discrepancy' | 'sync-failure' | 'drift' | 'job-complete';
12
+ /**
13
+ * Notification severity levels
14
+ */
15
+ export type NotificationSeverity = 'info' | 'warning' | 'critical';
16
+ /**
17
+ * Notification data structure
18
+ */
19
+ export interface Notification {
20
+ /**
21
+ * Unique notification ID
22
+ */
23
+ id: string;
24
+ /**
25
+ * Type of notification
26
+ */
27
+ type: NotificationType;
28
+ /**
29
+ * Severity level
30
+ */
31
+ severity: NotificationSeverity;
32
+ /**
33
+ * Short title for display
34
+ */
35
+ title: string;
36
+ /**
37
+ * Detailed message
38
+ */
39
+ message: string;
40
+ /**
41
+ * Type-specific data
42
+ */
43
+ data?: Record<string, unknown>;
44
+ /**
45
+ * ISO timestamp when created
46
+ */
47
+ createdAt: string;
48
+ /**
49
+ * ISO timestamp when user saw the notification
50
+ */
51
+ readAt?: string;
52
+ /**
53
+ * ISO timestamp when user dismissed the notification
54
+ */
55
+ dismissedAt?: string;
56
+ }
57
+ /**
58
+ * Input for creating a new notification
59
+ */
60
+ export interface CreateNotificationInput {
61
+ /**
62
+ * Type of notification
63
+ */
64
+ type: NotificationType;
65
+ /**
66
+ * Severity level
67
+ */
68
+ severity: NotificationSeverity;
69
+ /**
70
+ * Short title for display
71
+ */
72
+ title: string;
73
+ /**
74
+ * Detailed message
75
+ */
76
+ message: string;
77
+ /**
78
+ * Type-specific data
79
+ */
80
+ data?: Record<string, unknown>;
81
+ }
82
+ /**
83
+ * Query options for notifications
84
+ */
85
+ export interface NotificationQueryOptions {
86
+ /**
87
+ * Filter by type
88
+ */
89
+ type?: NotificationType;
90
+ /**
91
+ * Filter by severity
92
+ */
93
+ severity?: NotificationSeverity;
94
+ /**
95
+ * Include dismissed notifications
96
+ * @default false
97
+ */
98
+ includeDismissed?: boolean;
99
+ /**
100
+ * Include read notifications
101
+ * @default true
102
+ */
103
+ includeRead?: boolean;
104
+ /**
105
+ * Maximum number of notifications to return
106
+ */
107
+ limit?: number;
108
+ /**
109
+ * Skip first N notifications
110
+ */
111
+ offset?: number;
112
+ /**
113
+ * Sort order
114
+ * @default 'desc' (newest first)
115
+ */
116
+ sortOrder?: 'asc' | 'desc';
117
+ }
118
+ /**
119
+ * Generate a unique notification ID
120
+ *
121
+ * @returns Unique ID string
122
+ */
123
+ export declare function generateNotificationId(): string;
124
+ /**
125
+ * Create a notification from input
126
+ *
127
+ * @param input - Notification input
128
+ * @returns Full notification object
129
+ */
130
+ export declare function createNotification(input: CreateNotificationInput): Notification;
131
+ /**
132
+ * Check if notification should be shown (not dismissed)
133
+ *
134
+ * @param notification - Notification to check
135
+ * @returns true if notification should be shown
136
+ */
137
+ export declare function isPendingNotification(notification: Notification): boolean;
138
+ /**
139
+ * Check if notification has been read
140
+ *
141
+ * @param notification - Notification to check
142
+ * @returns true if notification has been read
143
+ */
144
+ export declare function isReadNotification(notification: Notification): boolean;
145
+ /**
146
+ * Get severity emoji for display
147
+ *
148
+ * @param severity - Severity level
149
+ * @returns Emoji string
150
+ */
151
+ export declare function getSeverityEmoji(severity: NotificationSeverity): string;
152
+ /**
153
+ * Get notification type label for display
154
+ *
155
+ * @param type - Notification type
156
+ * @returns Human-readable label
157
+ */
158
+ export declare function getNotificationTypeLabel(type: NotificationType): string;
159
+ //# sourceMappingURL=notification-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-types.d.ts","sourceRoot":"","sources":["../../../../src/core/notifications/notification-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,OAAO,GACP,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,gBAAgB,CAAC;IAEvB;;OAEG;IACH,QAAQ,EAAE,oBAAoB,CAAC;IAE/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,IAAI,EAAE,gBAAgB,CAAC;IAEvB;;OAEG;IACH,QAAQ,EAAE,oBAAoB,CAAC;IAE/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEhC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,YAAY,CAU/E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAevE"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Notification Types
3
+ *
4
+ * Defines the types for the notification system.
5
+ *
6
+ * @module core/notifications/notification-types
7
+ */
8
+ /**
9
+ * Generate a unique notification ID
10
+ *
11
+ * @returns Unique ID string
12
+ */
13
+ export function generateNotificationId() {
14
+ const timestamp = Date.now().toString(36);
15
+ const random = Math.random().toString(36).substring(2, 8);
16
+ return `notif-${timestamp}-${random}`;
17
+ }
18
+ /**
19
+ * Create a notification from input
20
+ *
21
+ * @param input - Notification input
22
+ * @returns Full notification object
23
+ */
24
+ export function createNotification(input) {
25
+ return {
26
+ id: generateNotificationId(),
27
+ type: input.type,
28
+ severity: input.severity,
29
+ title: input.title,
30
+ message: input.message,
31
+ data: input.data,
32
+ createdAt: new Date().toISOString(),
33
+ };
34
+ }
35
+ /**
36
+ * Check if notification should be shown (not dismissed)
37
+ *
38
+ * @param notification - Notification to check
39
+ * @returns true if notification should be shown
40
+ */
41
+ export function isPendingNotification(notification) {
42
+ return !notification.dismissedAt;
43
+ }
44
+ /**
45
+ * Check if notification has been read
46
+ *
47
+ * @param notification - Notification to check
48
+ * @returns true if notification has been read
49
+ */
50
+ export function isReadNotification(notification) {
51
+ return !!notification.readAt;
52
+ }
53
+ /**
54
+ * Get severity emoji for display
55
+ *
56
+ * @param severity - Severity level
57
+ * @returns Emoji string
58
+ */
59
+ export function getSeverityEmoji(severity) {
60
+ switch (severity) {
61
+ case 'critical':
62
+ return '❗';
63
+ case 'warning':
64
+ return '⚠️';
65
+ case 'info':
66
+ return 'ℹ️';
67
+ default:
68
+ return '📬';
69
+ }
70
+ }
71
+ /**
72
+ * Get notification type label for display
73
+ *
74
+ * @param type - Notification type
75
+ * @returns Human-readable label
76
+ */
77
+ export function getNotificationTypeLabel(type) {
78
+ switch (type) {
79
+ case 'import-complete':
80
+ return 'Import Complete';
81
+ case 'discrepancy':
82
+ return 'Discrepancy';
83
+ case 'sync-failure':
84
+ return 'Sync Failure';
85
+ case 'drift':
86
+ return 'Drift Detected';
87
+ case 'job-complete':
88
+ return 'Job Complete';
89
+ default:
90
+ return 'Notification';
91
+ }
92
+ }
93
+ //# sourceMappingURL=notification-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-types.js","sourceRoot":"","sources":["../../../../src/core/notifications/notification-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4IH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,SAAS,SAAS,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,OAAO;QACL,EAAE,EAAE,sBAAsB,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAA0B;IAC9D,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAA0B;IAC3D,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA8B;IAC7D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAsB;IAC7D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,iBAAiB,CAAC;QAC3B,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC;QACvB,KAAK,cAAc;YACjB,OAAO,cAAc,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,gBAAgB,CAAC;QAC1B,KAAK,cAAc;YACjB,OAAO,cAAc,CAAC;QACxB;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC"}