agent-office 0.5.0 → 0.6.1

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 (189) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +259 -228
  3. package/dist/commands/cron-requests.d.ts +7 -0
  4. package/dist/commands/cron-requests.d.ts.map +1 -0
  5. package/dist/commands/cron-requests.js +31 -0
  6. package/dist/commands/cron-requests.js.map +1 -0
  7. package/dist/commands/crons.d.ts +10 -0
  8. package/dist/commands/crons.d.ts.map +1 -0
  9. package/dist/commands/crons.js +45 -0
  10. package/dist/commands/crons.js.map +1 -0
  11. package/dist/commands/hello.d.ts +5 -0
  12. package/dist/commands/hello.d.ts.map +1 -0
  13. package/dist/commands/hello.js +4 -0
  14. package/dist/commands/hello.js.map +1 -0
  15. package/dist/commands/messages.d.ts +5 -0
  16. package/dist/commands/messages.d.ts.map +1 -0
  17. package/dist/commands/messages.js +18 -0
  18. package/dist/commands/messages.js.map +1 -0
  19. package/dist/commands/sessions.d.ts +13 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +58 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/commands/task-columns.d.ts +2 -0
  24. package/dist/commands/task-columns.d.ts.map +1 -0
  25. package/dist/commands/task-columns.js +13 -0
  26. package/dist/commands/task-columns.js.map +1 -0
  27. package/dist/commands/tasks.d.ts +11 -0
  28. package/dist/commands/tasks.d.ts.map +1 -0
  29. package/dist/commands/tasks.js +75 -0
  30. package/dist/commands/tasks.js.map +1 -0
  31. package/dist/config.test.d.ts +2 -0
  32. package/dist/config.test.d.ts.map +1 -0
  33. package/dist/config.test.js +50 -0
  34. package/dist/config.test.js.map +1 -0
  35. package/dist/db/index.d.ts +6 -70
  36. package/dist/db/index.d.ts.map +1 -0
  37. package/dist/db/index.js +4 -11
  38. package/dist/db/index.js.map +1 -0
  39. package/dist/db/mock-storage.d.ts +79 -0
  40. package/dist/db/mock-storage.d.ts.map +1 -0
  41. package/dist/db/mock-storage.js +381 -0
  42. package/dist/db/mock-storage.js.map +1 -0
  43. package/dist/db/mock-storage.test.d.ts +2 -0
  44. package/dist/db/mock-storage.test.d.ts.map +1 -0
  45. package/dist/db/mock-storage.test.js +234 -0
  46. package/dist/db/mock-storage.test.js.map +1 -0
  47. package/dist/db/postgresql-storage.d.ts +10 -8
  48. package/dist/db/postgresql-storage.d.ts.map +1 -0
  49. package/dist/db/postgresql-storage.js +76 -42
  50. package/dist/db/postgresql-storage.js.map +1 -0
  51. package/dist/db/sqlite-storage.d.ts +9 -8
  52. package/dist/db/sqlite-storage.d.ts.map +1 -0
  53. package/dist/db/sqlite-storage.js +75 -41
  54. package/dist/db/sqlite-storage.js.map +1 -0
  55. package/dist/db/storage-base.d.ts +7 -8
  56. package/dist/db/storage-base.d.ts.map +1 -0
  57. package/dist/db/storage-base.js +3 -2
  58. package/dist/db/storage-base.js.map +1 -0
  59. package/dist/db/storage.d.ts +12 -12
  60. package/dist/db/storage.d.ts.map +1 -0
  61. package/dist/db/storage.js +1 -0
  62. package/dist/db/storage.js.map +1 -0
  63. package/dist/db/types.d.ts +67 -0
  64. package/dist/db/types.d.ts.map +1 -0
  65. package/dist/db/types.js +2 -0
  66. package/dist/db/types.js.map +1 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +397 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/index.test.d.ts +2 -0
  72. package/dist/index.test.d.ts.map +1 -0
  73. package/dist/index.test.js +49 -0
  74. package/dist/index.test.js.map +1 -0
  75. package/dist/lib/output.d.ts +2 -0
  76. package/dist/lib/output.d.ts.map +1 -0
  77. package/dist/lib/output.js +8 -0
  78. package/dist/lib/output.js.map +1 -0
  79. package/dist/services/cron-service.constraints.test.d.ts +2 -0
  80. package/dist/services/cron-service.constraints.test.d.ts.map +1 -0
  81. package/dist/services/cron-service.constraints.test.js +90 -0
  82. package/dist/services/cron-service.constraints.test.js.map +1 -0
  83. package/dist/services/cron-service.d.ts +45 -0
  84. package/dist/services/cron-service.d.ts.map +1 -0
  85. package/dist/services/cron-service.js +157 -0
  86. package/dist/services/cron-service.js.map +1 -0
  87. package/dist/services/cron-service.test.d.ts +2 -0
  88. package/dist/services/cron-service.test.d.ts.map +1 -0
  89. package/dist/services/cron-service.test.js +280 -0
  90. package/dist/services/cron-service.test.js.map +1 -0
  91. package/dist/services/index.d.ts +5 -0
  92. package/dist/services/index.d.ts.map +1 -0
  93. package/dist/services/index.js +5 -0
  94. package/dist/services/index.js.map +1 -0
  95. package/dist/services/message-service.d.ts +16 -0
  96. package/dist/services/message-service.d.ts.map +1 -0
  97. package/dist/services/message-service.js +39 -0
  98. package/dist/services/message-service.js.map +1 -0
  99. package/dist/services/message-service.test.d.ts +2 -0
  100. package/dist/services/message-service.test.d.ts.map +1 -0
  101. package/dist/services/message-service.test.js +145 -0
  102. package/dist/services/message-service.test.js.map +1 -0
  103. package/dist/services/session-service.constraints.test.d.ts +2 -0
  104. package/dist/services/session-service.constraints.test.d.ts.map +1 -0
  105. package/dist/services/session-service.constraints.test.js +34 -0
  106. package/dist/services/session-service.constraints.test.js.map +1 -0
  107. package/dist/services/session-service.d.ts +27 -0
  108. package/dist/services/session-service.d.ts.map +1 -0
  109. package/dist/services/session-service.js +55 -0
  110. package/dist/services/session-service.js.map +1 -0
  111. package/dist/services/session-service.test.d.ts +2 -0
  112. package/dist/services/session-service.test.d.ts.map +1 -0
  113. package/dist/services/session-service.test.js +87 -0
  114. package/dist/services/session-service.test.js.map +1 -0
  115. package/dist/services/task-service.d.ts +25 -0
  116. package/dist/services/task-service.d.ts.map +1 -0
  117. package/dist/services/task-service.js +87 -0
  118. package/dist/services/task-service.js.map +1 -0
  119. package/dist/services/task-service.test.d.ts +2 -0
  120. package/dist/services/task-service.test.d.ts.map +1 -0
  121. package/dist/services/task-service.test.js +180 -0
  122. package/dist/services/task-service.test.js.map +1 -0
  123. package/package.json +41 -42
  124. package/dist/cli.d.ts +0 -2
  125. package/dist/cli.js +0 -317
  126. package/dist/commands/communicator.d.ts +0 -9
  127. package/dist/commands/communicator.js +0 -2232
  128. package/dist/commands/manage.d.ts +0 -5
  129. package/dist/commands/manage.js +0 -20
  130. package/dist/commands/notifier.d.ts +0 -11
  131. package/dist/commands/notifier.js +0 -100
  132. package/dist/commands/screensaver.d.ts +0 -8
  133. package/dist/commands/screensaver.js +0 -1280
  134. package/dist/commands/serve.d.ts +0 -13
  135. package/dist/commands/serve.js +0 -95
  136. package/dist/commands/task-board.d.ts +0 -29
  137. package/dist/commands/task-board.js +0 -251
  138. package/dist/commands/worker.d.ts +0 -16
  139. package/dist/commands/worker.js +0 -145
  140. package/dist/db/migrate.d.ts +0 -2
  141. package/dist/db/migrate.js +0 -3
  142. package/dist/lib/agentic-coding-server.d.ts +0 -66
  143. package/dist/lib/agentic-coding-server.js +0 -7
  144. package/dist/lib/notifier.d.ts +0 -18
  145. package/dist/lib/notifier.js +0 -15
  146. package/dist/lib/opencode-coding-server.d.ts +0 -11
  147. package/dist/lib/opencode-coding-server.js +0 -66
  148. package/dist/lib/pi-coding-server.d.ts +0 -20
  149. package/dist/lib/pi-coding-server.js +0 -162
  150. package/dist/manage/app.d.ts +0 -6
  151. package/dist/manage/app.js +0 -128
  152. package/dist/manage/components/AgentCode.d.ts +0 -8
  153. package/dist/manage/components/AgentCode.js +0 -73
  154. package/dist/manage/components/CreateSession.d.ts +0 -8
  155. package/dist/manage/components/CreateSession.js +0 -37
  156. package/dist/manage/components/CronList.d.ts +0 -9
  157. package/dist/manage/components/CronList.js +0 -321
  158. package/dist/manage/components/CronRequests.d.ts +0 -8
  159. package/dist/manage/components/CronRequests.js +0 -181
  160. package/dist/manage/components/DeleteSession.d.ts +0 -7
  161. package/dist/manage/components/DeleteSession.js +0 -55
  162. package/dist/manage/components/InjectText.d.ts +0 -8
  163. package/dist/manage/components/InjectText.js +0 -51
  164. package/dist/manage/components/ItemSelector.d.ts +0 -7
  165. package/dist/manage/components/ItemSelector.js +0 -20
  166. package/dist/manage/components/MenuSelect.d.ts +0 -13
  167. package/dist/manage/components/MenuSelect.js +0 -22
  168. package/dist/manage/components/MyMail.d.ts +0 -9
  169. package/dist/manage/components/MyMail.js +0 -143
  170. package/dist/manage/components/Profile.d.ts +0 -8
  171. package/dist/manage/components/Profile.js +0 -60
  172. package/dist/manage/components/ReadMail.d.ts +0 -8
  173. package/dist/manage/components/ReadMail.js +0 -110
  174. package/dist/manage/components/SendMessage.d.ts +0 -9
  175. package/dist/manage/components/SendMessage.js +0 -79
  176. package/dist/manage/components/SessionList.d.ts +0 -9
  177. package/dist/manage/components/SessionList.js +0 -608
  178. package/dist/manage/components/SessionSidebar.d.ts +0 -6
  179. package/dist/manage/components/SessionSidebar.js +0 -24
  180. package/dist/manage/components/TailMessages.d.ts +0 -8
  181. package/dist/manage/components/TailMessages.js +0 -126
  182. package/dist/manage/hooks/useApi.d.ts +0 -147
  183. package/dist/manage/hooks/useApi.js +0 -181
  184. package/dist/server/cron.d.ts +0 -25
  185. package/dist/server/cron.js +0 -107
  186. package/dist/server/index.d.ts +0 -4
  187. package/dist/server/index.js +0 -22
  188. package/dist/server/routes.d.ts +0 -13
  189. package/dist/server/routes.js +0 -1396
@@ -0,0 +1,45 @@
1
+ import { AgentOfficeStorage, CronJobRow, CronRequestRow, CronHistoryRow } from '../db/index.js';
2
+ export interface CronJobInfo {
3
+ id: number;
4
+ name: string;
5
+ session_name: string;
6
+ schedule: string;
7
+ timezone: string | null;
8
+ message: string;
9
+ enabled: boolean;
10
+ created_at: Date;
11
+ last_run: Date | null;
12
+ }
13
+ export interface CronRequestInfo {
14
+ id: number;
15
+ name: string;
16
+ session_name: string;
17
+ schedule: string;
18
+ timezone: string | null;
19
+ message: string;
20
+ status: 'pending' | 'approved' | 'rejected';
21
+ requested_at: Date;
22
+ }
23
+ export declare class CronService {
24
+ private storage;
25
+ constructor(storage: AgentOfficeStorage);
26
+ listCronJobs(): Promise<CronJobInfo[]>;
27
+ listCronJobsForSession(coworkerName: string): Promise<CronJobInfo[]>;
28
+ getCronJobById(id: number): Promise<CronJobRow | null>;
29
+ createCronJob(name: string, coworkerName: string, schedule: string, timezone: string | null, message: string): Promise<CronJobRow>;
30
+ deleteCronJob(id: number): Promise<void>;
31
+ enableCronJob(id: number): Promise<void>;
32
+ disableCronJob(id: number): Promise<void>;
33
+ getCronHistory(cronJobId: number, limit?: number): Promise<CronHistoryRow[]>;
34
+ listCronRequests(filters?: {
35
+ status?: string;
36
+ coworkerName?: string;
37
+ }): Promise<CronRequestInfo[]>;
38
+ createCronRequest(name: string, coworkerName: string, schedule: string, timezone: string | null, message: string): Promise<CronRequestRow>;
39
+ getCronRequestById(id: number): Promise<CronRequestRow | null>;
40
+ approveCronRequest(id: number, reviewedBy: string, reviewerNotes?: string): Promise<CronRequestRow>;
41
+ rejectCronRequest(id: number, reviewedBy: string, reviewerNotes?: string): Promise<CronRequestRow>;
42
+ deleteCronRequest(id: number): Promise<void>;
43
+ checkCronJob(cronJobId: number, referenceDate?: Date): Promise<boolean>;
44
+ }
45
+ //# sourceMappingURL=cron-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.d.ts","sourceRoot":"","sources":["../../src/services/cron-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/F,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,IAAI,CAAA;IAChB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;IAC3C,YAAY,EAAE,IAAI,CAAA;CACnB;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAEzC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAetC,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAepE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAItD,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAgBhB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIhF,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgBlG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC;IAUpB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI9D,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAenG,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAelG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAuB1F"}
@@ -0,0 +1,157 @@
1
+ import { parseCronExpression } from 'cron-schedule';
2
+ export class CronService {
3
+ storage;
4
+ constructor(storage) {
5
+ this.storage = storage;
6
+ }
7
+ async listCronJobs() {
8
+ const jobs = await this.storage.listCronJobs();
9
+ return jobs.map(job => ({
10
+ id: job.id,
11
+ name: job.name,
12
+ session_name: job.session_name,
13
+ schedule: job.schedule,
14
+ timezone: job.timezone,
15
+ message: job.message,
16
+ enabled: job.enabled,
17
+ created_at: job.created_at,
18
+ last_run: job.last_run,
19
+ }));
20
+ }
21
+ async listCronJobsForSession(coworkerName) {
22
+ const jobs = await this.storage.listCronJobsForSession(coworkerName);
23
+ return jobs.map(job => ({
24
+ id: job.id,
25
+ name: job.name,
26
+ session_name: job.session_name,
27
+ schedule: job.schedule,
28
+ timezone: job.timezone,
29
+ message: job.message,
30
+ enabled: job.enabled,
31
+ created_at: job.created_at,
32
+ last_run: job.last_run,
33
+ }));
34
+ }
35
+ async getCronJobById(id) {
36
+ return this.storage.getCronJobById(id);
37
+ }
38
+ async createCronJob(name, coworkerName, schedule, timezone, message) {
39
+ // Verify coworker exists
40
+ const coworker = await this.storage.getSessionByName(coworkerName);
41
+ if (!coworker) {
42
+ throw new Error(`Coworker ${coworkerName} not found`);
43
+ }
44
+ // Check if cron job already exists
45
+ const exists = await this.storage.cronJobExistsForSession(name, coworkerName);
46
+ if (exists) {
47
+ throw new Error(`Cron job ${name} already exists for coworker ${coworkerName}`);
48
+ }
49
+ return this.storage.createCronJob(name, coworkerName, schedule, timezone, message);
50
+ }
51
+ async deleteCronJob(id) {
52
+ const job = await this.storage.getCronJobById(id);
53
+ if (!job) {
54
+ throw new Error(`Cron job ${id} not found`);
55
+ }
56
+ await this.storage.deleteCronJob(id);
57
+ }
58
+ async enableCronJob(id) {
59
+ const job = await this.storage.getCronJobById(id);
60
+ if (!job) {
61
+ throw new Error(`Cron job ${id} not found`);
62
+ }
63
+ await this.storage.enableCronJob(id);
64
+ }
65
+ async disableCronJob(id) {
66
+ const job = await this.storage.getCronJobById(id);
67
+ if (!job) {
68
+ throw new Error(`Cron job ${id} not found`);
69
+ }
70
+ await this.storage.disableCronJob(id);
71
+ }
72
+ async getCronHistory(cronJobId, limit = 10) {
73
+ return this.storage.listCronHistory(cronJobId, limit);
74
+ }
75
+ async listCronRequests(filters) {
76
+ // Map coworkerName filter to sessionName for storage layer
77
+ const storageFilters = filters?.coworkerName ? { ...filters, sessionName: filters.coworkerName } : filters;
78
+ const requests = await this.storage.listCronRequests(storageFilters);
79
+ return requests.map(request => ({
80
+ id: request.id,
81
+ name: request.name,
82
+ session_name: request.session_name,
83
+ schedule: request.schedule,
84
+ timezone: request.timezone,
85
+ message: request.message,
86
+ status: request.status,
87
+ requested_at: request.requested_at,
88
+ }));
89
+ }
90
+ async createCronRequest(name, coworkerName, schedule, timezone, message) {
91
+ // Verify coworker exists
92
+ const coworker = await this.storage.getSessionByName(coworkerName);
93
+ if (!coworker) {
94
+ throw new Error(`Coworker ${coworkerName} not found`);
95
+ }
96
+ return this.storage.createCronRequest(name, coworkerName, schedule, timezone, message);
97
+ }
98
+ async getCronRequestById(id) {
99
+ return this.storage.getCronRequestById(id);
100
+ }
101
+ async approveCronRequest(id, reviewedBy, reviewerNotes) {
102
+ const request = await this.storage.getCronRequestById(id);
103
+ if (!request) {
104
+ throw new Error(`Cron request ${id} not found`);
105
+ }
106
+ if (request.status !== 'pending') {
107
+ throw new Error(`Cannot approve cron request ${id}: status is ${request.status}, expected pending`);
108
+ }
109
+ const updated = await this.storage.updateCronRequestStatus(id, 'approved', reviewedBy, reviewerNotes);
110
+ if (!updated) {
111
+ throw new Error(`Failed to approve cron request ${id}`);
112
+ }
113
+ return updated;
114
+ }
115
+ async rejectCronRequest(id, reviewedBy, reviewerNotes) {
116
+ const request = await this.storage.getCronRequestById(id);
117
+ if (!request) {
118
+ throw new Error(`Cron request ${id} not found`);
119
+ }
120
+ if (request.status !== 'pending') {
121
+ throw new Error(`Cannot reject cron request ${id}: status is ${request.status}, expected pending`);
122
+ }
123
+ const updated = await this.storage.updateCronRequestStatus(id, 'rejected', reviewedBy, reviewerNotes);
124
+ if (!updated) {
125
+ throw new Error(`Failed to reject cron request ${id}`);
126
+ }
127
+ return updated;
128
+ }
129
+ async deleteCronRequest(id) {
130
+ const request = await this.storage.getCronRequestById(id);
131
+ if (!request) {
132
+ throw new Error(`Cron request ${id} not found`);
133
+ }
134
+ await this.storage.deleteCronRequest(id);
135
+ }
136
+ async checkCronJob(cronJobId, referenceDate = new Date()) {
137
+ const job = await this.storage.getCronJobById(cronJobId);
138
+ if (!job) {
139
+ throw new Error(`Cron job ${cronJobId} not found`);
140
+ }
141
+ if (!job.enabled) {
142
+ return false;
143
+ }
144
+ try {
145
+ const cron = parseCronExpression(job.schedule);
146
+ // Check if the schedule matches the current minute
147
+ // We truncate seconds to match by minute
148
+ const checkDate = new Date(referenceDate);
149
+ checkDate.setSeconds(0, 0);
150
+ return cron.matchDate(checkDate);
151
+ }
152
+ catch (error) {
153
+ throw new Error(`Invalid cron schedule "${job.schedule}": ${error}`);
154
+ }
155
+ }
156
+ }
157
+ //# sourceMappingURL=cron-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.js","sourceRoot":"","sources":["../../src/services/cron-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cron-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.test.d.ts","sourceRoot":"","sources":["../../src/services/cron-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,280 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockStorage } from '../db/mock-storage.js';
3
+ import { CronService } from './cron-service.js';
4
+ describe('CronService', () => {
5
+ let storage;
6
+ let service;
7
+ beforeEach(() => {
8
+ storage = createMockStorage();
9
+ service = new CronService(storage);
10
+ });
11
+ describe('listCronJobs', () => {
12
+ it('should return empty array when no cron jobs exist', async () => {
13
+ const jobs = await service.listCronJobs();
14
+ expect(jobs).toEqual([]);
15
+ });
16
+ it('should return all cron jobs sorted by name', async () => {
17
+ // Create a session first (required for cron jobs)
18
+ await storage.createSession('session1', 'id1', 'agent1');
19
+ await service.createCronJob('job-b', 'session1', '0 0 * * *', null, 'Message B');
20
+ await service.createCronJob('job-a', 'session1', '0 0 * * *', null, 'Message A');
21
+ const jobs = await service.listCronJobs();
22
+ expect(jobs).toHaveLength(2);
23
+ expect(jobs[0].name).toBe('job-a'); // Sorted alphabetically
24
+ expect(jobs[1].name).toBe('job-b');
25
+ });
26
+ });
27
+ describe('listCronJobsForSession', () => {
28
+ it('should return only cron jobs for specified session', async () => {
29
+ await storage.createSession('session1', 'id1', 'agent1');
30
+ await storage.createSession('session2', 'id2', 'agent2');
31
+ await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Message 1');
32
+ await service.createCronJob('job2', 'session2', '0 0 * * *', null, 'Message 2');
33
+ const jobs = await service.listCronJobsForSession('session1');
34
+ expect(jobs).toHaveLength(1);
35
+ expect(jobs[0].name).toBe('job1');
36
+ });
37
+ });
38
+ describe('createCronJob', () => {
39
+ it('should create a new cron job', async () => {
40
+ await storage.createSession('session1', 'id1', 'agent1');
41
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', 'UTC', 'Hello!');
42
+ expect(job.name).toBe('job1');
43
+ expect(job.session_name).toBe('session1');
44
+ expect(job.schedule).toBe('0 0 * * *');
45
+ expect(job.timezone).toBe('UTC');
46
+ expect(job.message).toBe('Hello!');
47
+ expect(job.enabled).toBe(true);
48
+ });
49
+ it('should throw error when coworker does not exist', async () => {
50
+ await expect(service.createCronJob('job1', 'nonexistent', '0 0 * * *', null, 'Hello!')).rejects.toThrow('Coworker nonexistent not found');
51
+ });
52
+ it('should throw error when cron job already exists', async () => {
53
+ await storage.createSession('session1', 'id1', 'agent1');
54
+ await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
55
+ await expect(service.createCronJob('job1', 'session1', '0 12 * * *', null, 'Different message')).rejects.toThrow('Cron job job1 already exists for coworker session1');
56
+ });
57
+ });
58
+ describe('deleteCronJob', () => {
59
+ it('should delete existing cron job', async () => {
60
+ await storage.createSession('session1', 'id1', 'agent1');
61
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
62
+ await service.deleteCronJob(job.id);
63
+ const stored = await storage.getCronJobById(job.id);
64
+ expect(stored).toBeNull();
65
+ });
66
+ it('should throw error when cron job does not exist', async () => {
67
+ await expect(service.deleteCronJob(999)).rejects.toThrow('Cron job 999 not found');
68
+ });
69
+ });
70
+ describe('enableCronJob', () => {
71
+ it('should enable disabled cron job', async () => {
72
+ await storage.createSession('session1', 'id1', 'agent1');
73
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
74
+ await storage.disableCronJob(job.id);
75
+ await service.enableCronJob(job.id);
76
+ const stored = await storage.getCronJobById(job.id);
77
+ expect(stored?.enabled).toBe(true);
78
+ });
79
+ it('should throw error when cron job does not exist', async () => {
80
+ await expect(service.enableCronJob(999)).rejects.toThrow('Cron job 999 not found');
81
+ });
82
+ });
83
+ describe('disableCronJob', () => {
84
+ it('should disable enabled cron job', async () => {
85
+ await storage.createSession('session1', 'id1', 'agent1');
86
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
87
+ expect(job.enabled).toBe(true);
88
+ await service.disableCronJob(job.id);
89
+ const stored = await storage.getCronJobById(job.id);
90
+ expect(stored?.enabled).toBe(false);
91
+ });
92
+ it('should throw error when cron job does not exist', async () => {
93
+ await expect(service.disableCronJob(999)).rejects.toThrow('Cron job 999 not found');
94
+ });
95
+ });
96
+ describe('getCronHistory', () => {
97
+ it('should return empty array when no history exists', async () => {
98
+ const history = await service.getCronHistory(1);
99
+ expect(history).toEqual([]);
100
+ });
101
+ it('should return cron job history sorted by executed_at desc', async () => {
102
+ await storage.createSession('session1', 'id1', 'agent1');
103
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
104
+ await storage.createCronHistory(job.id, new Date('2024-01-01'), true);
105
+ await storage.createCronHistory(job.id, new Date('2024-01-03'), true);
106
+ await storage.createCronHistory(job.id, new Date('2024-01-02'), false, 'Error message');
107
+ const history = await service.getCronHistory(job.id, 10);
108
+ expect(history).toHaveLength(3);
109
+ expect(history[0].executed_at.toISOString()).toContain('2024-01-03');
110
+ expect(history[1].executed_at.toISOString()).toContain('2024-01-02');
111
+ expect(history[2].executed_at.toISOString()).toContain('2024-01-01');
112
+ });
113
+ it('should respect limit parameter', async () => {
114
+ await storage.createSession('session1', 'id1', 'agent1');
115
+ const job = await service.createCronJob('job1', 'session1', '0 0 * * *', null, 'Hello!');
116
+ await storage.createCronHistory(job.id, new Date(), true);
117
+ await storage.createCronHistory(job.id, new Date(), true);
118
+ await storage.createCronHistory(job.id, new Date(), true);
119
+ const history = await service.getCronHistory(job.id, 2);
120
+ expect(history).toHaveLength(2);
121
+ });
122
+ });
123
+ describe('listCronRequests', () => {
124
+ it('should return empty array when no requests exist', async () => {
125
+ const requests = await service.listCronRequests();
126
+ expect(requests).toEqual([]);
127
+ });
128
+ it('should return all cron requests sorted by requested_at desc', async () => {
129
+ await storage.createSession('session1', 'id1', 'agent1');
130
+ await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Message 1');
131
+ await new Promise(resolve => setTimeout(resolve, 10));
132
+ await service.createCronRequest('req2', 'session1', '0 12 * * *', null, 'Message 2');
133
+ const requests = await service.listCronRequests();
134
+ expect(requests).toHaveLength(2);
135
+ expect(requests[0].name).toBe('req2'); // Most recent first
136
+ expect(requests[1].name).toBe('req1');
137
+ });
138
+ it('should filter by status', async () => {
139
+ await storage.createSession('session1', 'id1', 'agent1');
140
+ const req1 = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Message 1');
141
+ await storage.updateCronRequestStatus(req1.id, 'approved', 'reviewer1');
142
+ await service.createCronRequest('req2', 'session1', '0 12 * * *', null, 'Message 2');
143
+ const pendingRequests = await service.listCronRequests({ status: 'pending' });
144
+ expect(pendingRequests).toHaveLength(1);
145
+ expect(pendingRequests[0].name).toBe('req2');
146
+ });
147
+ it('should filter by coworkerName', async () => {
148
+ await storage.createSession('session1', 'id1', 'agent1');
149
+ await storage.createSession('session2', 'id2', 'agent2');
150
+ await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Message 1');
151
+ await service.createCronRequest('req2', 'session2', '0 12 * * *', null, 'Message 2');
152
+ const session1Requests = await service.listCronRequests({ coworkerName: 'session1' });
153
+ expect(session1Requests).toHaveLength(1);
154
+ expect(session1Requests[0].name).toBe('req1');
155
+ });
156
+ });
157
+ describe('createCronRequest', () => {
158
+ it('should create a new cron request with pending status', async () => {
159
+ await storage.createSession('session1', 'id1', 'agent1');
160
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', 'UTC', 'Hello!');
161
+ expect(request.name).toBe('req1');
162
+ expect(request.session_name).toBe('session1');
163
+ expect(request.schedule).toBe('0 0 * * *');
164
+ expect(request.timezone).toBe('UTC');
165
+ expect(request.message).toBe('Hello!');
166
+ expect(request.status).toBe('pending');
167
+ });
168
+ it('should throw error when coworker does not exist', async () => {
169
+ await expect(service.createCronRequest('req1', 'nonexistent', '0 0 * * *', null, 'Hello!')).rejects.toThrow('Coworker nonexistent not found');
170
+ });
171
+ });
172
+ describe('checkCronJob', () => {
173
+ beforeEach(async () => {
174
+ await storage.createSession('session1', 'id1', 'agent1');
175
+ });
176
+ it('should return true when cron job should run this minute', async () => {
177
+ // Create a job that runs every minute
178
+ const job = await service.createCronJob('job1', 'session1', '* * * * *', null, 'Hello!');
179
+ const shouldRun = await service.checkCronJob(job.id);
180
+ expect(shouldRun).toBe(true);
181
+ });
182
+ it('should return false when cron job should not run this minute', async () => {
183
+ // Create a job that runs at a specific time (e.g., 3 AM)
184
+ const job = await service.createCronJob('job1', 'session1', '0 3 * * *', null, 'Hello!');
185
+ const shouldRun = await service.checkCronJob(job.id);
186
+ expect(shouldRun).toBe(false);
187
+ });
188
+ it('should return false when cron job is disabled', async () => {
189
+ const job = await service.createCronJob('job1', 'session1', '* * * * *', null, 'Hello!');
190
+ await storage.disableCronJob(job.id);
191
+ const shouldRun = await service.checkCronJob(job.id);
192
+ expect(shouldRun).toBe(false);
193
+ });
194
+ it('should throw error when cron job does not exist', async () => {
195
+ await expect(service.checkCronJob(999)).rejects.toThrow('Cron job 999 not found');
196
+ });
197
+ it('should check at specific reference date', async () => {
198
+ // Create a job that runs at 3 AM
199
+ const job = await service.createCronJob('job1', 'session1', '0 3 * * *', null, 'Hello!');
200
+ // Check at 3:00 AM - should match
201
+ const at3AM = new Date('2024-01-15T03:00:00');
202
+ const shouldRunAt3AM = await service.checkCronJob(job.id, at3AM);
203
+ expect(shouldRunAt3AM).toBe(true);
204
+ // Check at 4:00 AM - should not match
205
+ const at4AM = new Date('2024-01-15T04:00:00');
206
+ const shouldRunAt4AM = await service.checkCronJob(job.id, at4AM);
207
+ expect(shouldRunAt4AM).toBe(false);
208
+ });
209
+ });
210
+ describe('getCronRequestById', () => {
211
+ beforeEach(async () => {
212
+ await storage.createSession('session1', 'id1', 'agent1');
213
+ });
214
+ it('should return cron request by id', async () => {
215
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
216
+ const retrieved = await service.getCronRequestById(request.id);
217
+ expect(retrieved).not.toBeNull();
218
+ expect(retrieved?.name).toBe('req1');
219
+ });
220
+ it('should return null for non-existent request', async () => {
221
+ const retrieved = await service.getCronRequestById(999);
222
+ expect(retrieved).toBeNull();
223
+ });
224
+ });
225
+ describe('approveCronRequest', () => {
226
+ beforeEach(async () => {
227
+ await storage.createSession('session1', 'id1', 'agent1');
228
+ });
229
+ it('should approve a pending cron request', async () => {
230
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
231
+ const approved = await service.approveCronRequest(request.id, 'reviewer1', 'Looks good');
232
+ expect(approved.status).toBe('approved');
233
+ expect(approved.reviewed_by).toBe('reviewer1');
234
+ expect(approved.reviewer_notes).toBe('Looks good');
235
+ });
236
+ it('should throw error when request not found', async () => {
237
+ await expect(service.approveCronRequest(999, 'reviewer1')).rejects.toThrow('Cron request 999 not found');
238
+ });
239
+ it('should throw error when request is not pending', async () => {
240
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
241
+ await service.approveCronRequest(request.id, 'reviewer1');
242
+ await expect(service.approveCronRequest(request.id, 'reviewer2')).rejects.toThrow('Cannot approve cron request');
243
+ });
244
+ });
245
+ describe('rejectCronRequest', () => {
246
+ beforeEach(async () => {
247
+ await storage.createSession('session1', 'id1', 'agent1');
248
+ });
249
+ it('should reject a pending cron request', async () => {
250
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
251
+ const rejected = await service.rejectCronRequest(request.id, 'reviewer1', 'Invalid schedule');
252
+ expect(rejected.status).toBe('rejected');
253
+ expect(rejected.reviewed_by).toBe('reviewer1');
254
+ expect(rejected.reviewer_notes).toBe('Invalid schedule');
255
+ });
256
+ it('should throw error when request not found', async () => {
257
+ await expect(service.rejectCronRequest(999, 'reviewer1')).rejects.toThrow('Cron request 999 not found');
258
+ });
259
+ it('should throw error when request is not pending', async () => {
260
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
261
+ await service.rejectCronRequest(request.id, 'reviewer1');
262
+ await expect(service.rejectCronRequest(request.id, 'reviewer2')).rejects.toThrow('Cannot reject cron request');
263
+ });
264
+ });
265
+ describe('deleteCronRequest', () => {
266
+ beforeEach(async () => {
267
+ await storage.createSession('session1', 'id1', 'agent1');
268
+ });
269
+ it('should delete an existing cron request', async () => {
270
+ const request = await service.createCronRequest('req1', 'session1', '0 0 * * *', null, 'Hello!');
271
+ await service.deleteCronRequest(request.id);
272
+ const retrieved = await service.getCronRequestById(request.id);
273
+ expect(retrieved).toBeNull();
274
+ });
275
+ it('should throw error when request not found', async () => {
276
+ await expect(service.deleteCronRequest(999)).rejects.toThrow('Cron request 999 not found');
277
+ });
278
+ });
279
+ });
280
+ //# sourceMappingURL=cron-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.test.js","sourceRoot":"","sources":["../../src/services/cron-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { SessionService, type CoworkerInfo } from './session-service.js';
2
+ export { MessageService } from './message-service.js';
3
+ export { CronService, type CronJobInfo, type CronRequestInfo } from './cron-service.js';
4
+ export { TaskService, type ColumnStats, type ColumnName } from './task-service.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACvF,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { SessionService } from './session-service.js';
2
+ export { MessageService } from './message-service.js';
3
+ export { CronService } from './cron-service.js';
4
+ export { TaskService } from './task-service.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAA0C,MAAM,mBAAmB,CAAA;AACvF,OAAO,EAAE,WAAW,EAAqC,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { AgentOfficeStorage, MessageRow } from '../db/index.js';
2
+ export declare class MessageService {
3
+ private storage;
4
+ constructor(storage: AgentOfficeStorage);
5
+ sendMessage(from: string, recipients: string[], body: string): Promise<MessageRow[]>;
6
+ listMessagesForRecipient(recipient: string, filters?: {
7
+ unread?: boolean;
8
+ olderThanHours?: number;
9
+ }): Promise<MessageRow[]>;
10
+ listMessagesFromSender(sender: string): Promise<MessageRow[]>;
11
+ markMessageAsRead(id: number): Promise<MessageRow | null>;
12
+ countUnreadBySender(recipientName: string): Promise<Map<string, number>>;
13
+ checkUnreadMail(coworkerName: string): Promise<boolean>;
14
+ getUnreadMail(coworkerName: string): Promise<MessageRow[]>;
15
+ }
16
+ //# sourceMappingURL=message-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-service.d.ts","sourceRoot":"","sources":["../../src/services/message-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE/D,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAEzC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASpF,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACtD,OAAO,CAAC,UAAU,EAAE,CAAC;IAIlB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI7D,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIzD,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIxE,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAUjE"}
@@ -0,0 +1,39 @@
1
+ export class MessageService {
2
+ storage;
3
+ constructor(storage) {
4
+ this.storage = storage;
5
+ }
6
+ async sendMessage(from, recipients, body) {
7
+ const messages = [];
8
+ for (const to of recipients) {
9
+ const message = await this.storage.createMessage(from, to, body);
10
+ messages.push(message);
11
+ }
12
+ return messages;
13
+ }
14
+ async listMessagesForRecipient(recipient, filters) {
15
+ return this.storage.listMessagesForRecipient(recipient, filters);
16
+ }
17
+ async listMessagesFromSender(sender) {
18
+ return this.storage.listMessagesFromSender(sender);
19
+ }
20
+ async markMessageAsRead(id) {
21
+ return this.storage.markMessageAsRead(id);
22
+ }
23
+ async countUnreadBySender(recipientName) {
24
+ return this.storage.countUnreadBySender(recipientName);
25
+ }
26
+ async checkUnreadMail(coworkerName) {
27
+ const unreadMessages = await this.storage.listMessagesForRecipient(coworkerName, { unread: true });
28
+ return unreadMessages.length > 0;
29
+ }
30
+ async getUnreadMail(coworkerName) {
31
+ const unreadMessages = await this.storage.listMessagesForRecipient(coworkerName, { unread: true });
32
+ // Mark all as read
33
+ for (const message of unreadMessages) {
34
+ await this.storage.markMessageAsRead(message.id);
35
+ }
36
+ return unreadMessages;
37
+ }
38
+ }
39
+ //# sourceMappingURL=message-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-service.js","sourceRoot":"","sources":["../../src/services/message-service.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;IAAG,CAAC;IAEnD,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,UAAoB,EAAE,IAAY;QAChE,MAAM,QAAQ,GAAiB,EAAE,CAAA;QACjC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;YAChE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,SAAiB,EACjB,OAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,aAAqB;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,YAAoB;QACxC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAClG,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAElG,mBAAmB;QACnB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-service.test.d.ts.map