aimeat 1.16.2 → 1.18.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 (281) hide show
  1. package/dist/.env.example +6 -1
  2. package/dist/locales/en.json +166 -4
  3. package/dist/locales/fi.json +166 -4
  4. package/dist/public/components/Card.js +17 -3
  5. package/dist/public/components/Collapsible.js +39 -0
  6. package/dist/public/components/CopyButton.js +55 -24
  7. package/dist/public/components/DataTable.js +57 -0
  8. package/dist/public/components/EmptyState.js +28 -0
  9. package/dist/public/components/KeyValueRow.js +37 -0
  10. package/dist/public/components/Modal.js +22 -5
  11. package/dist/public/components/Pagination.js +70 -0
  12. package/dist/public/components/SearchBar.js +44 -0
  13. package/dist/public/components/StatusDot.js +29 -0
  14. package/dist/public/components/TagList.js +53 -0
  15. package/dist/public/components/ToggleSwitch.js +28 -0
  16. package/dist/public/components/index.js +41 -1
  17. package/dist/public/css/components/tags.css +24 -0
  18. package/dist/public/css/style-testbed.css +135 -0
  19. package/dist/public/css/theme.css +556 -34
  20. package/dist/public/css/views/admin-agent-integration.css +2 -33
  21. package/dist/public/css/views/admin.css +730 -686
  22. package/dist/public/css/views/agents-detail.css +402 -14
  23. package/dist/public/css/views/help.css +2 -1
  24. package/dist/public/css/views/hobbies.css +53 -33
  25. package/dist/public/css/views/marketplace.css +73 -60
  26. package/dist/public/css/views/openclaw.css +12 -6
  27. package/dist/public/css/views/portal-classic.css +34 -26
  28. package/dist/public/css/views/portal-dev.css +41 -32
  29. package/dist/public/css/views/portal.css +14 -18
  30. package/dist/public/css/views/profile.css +252 -164
  31. package/dist/public/css/views/public-knowledge-viewer.css +18 -6
  32. package/dist/public/css/views/scheduler.css +100 -0
  33. package/dist/public/js/format.js +41 -0
  34. package/dist/public/js/services/agent-tasks.js +14 -1
  35. package/dist/public/js/services/generator-spec-validate.js +5 -1
  36. package/dist/public/js/services/schedules.js +53 -0
  37. package/dist/public/js/style-testbed.js +170 -0
  38. package/dist/public/js/theme.js +114 -0
  39. package/dist/public/spa.html +74 -16
  40. package/dist/public/style-testbed.html +420 -0
  41. package/dist/public/views/admin/agent-integration-tab.js +23 -38
  42. package/dist/public/views/admin/agent-tasks-tab.js +14 -21
  43. package/dist/public/views/admin/chat-instances-tab.js +1 -1
  44. package/dist/public/views/admin/config-tab.js +7 -2
  45. package/dist/public/views/admin/cortex-tab.js +20 -14
  46. package/dist/public/views/admin/csm-tab.js +22 -18
  47. package/dist/public/views/admin/directory-tab.js +3 -3
  48. package/dist/public/views/admin/email-tab.js +23 -28
  49. package/dist/public/views/admin/federation-tab.js +15 -5
  50. package/dist/public/views/admin/generator-debug-tab.js +10 -8
  51. package/dist/public/views/admin/genesis-tab.js +4 -4
  52. package/dist/public/views/admin/ghii-tab.js +3 -3
  53. package/dist/public/views/admin/knowledge-tab.js +15 -5
  54. package/dist/public/views/admin/matching-tab.js +3 -3
  55. package/dist/public/views/admin/memory-tab.js +16 -20
  56. package/dist/public/views/admin/msm-tab.js +30 -17
  57. package/dist/public/views/admin/overview-tab.js +7 -7
  58. package/dist/public/views/admin/packages-tab.js +10 -9
  59. package/dist/public/views/admin/portal-tab.js +14 -4
  60. package/dist/public/views/admin/prompts-tab.js +5 -5
  61. package/dist/public/views/admin/push-tab.js +15 -4
  62. package/dist/public/views/admin/realtime-tab.js +3 -3
  63. package/dist/public/views/admin/services-tab.js +18 -27
  64. package/dist/public/views/admin/shared.js +48 -58
  65. package/dist/public/views/admin/sharing-groups-tab.js +5 -10
  66. package/dist/public/views/admin/stats-tab.js +3 -3
  67. package/dist/public/views/guides.js +9 -13
  68. package/dist/public/views/help.js +3 -24
  69. package/dist/public/views/hobbies.js +47 -41
  70. package/dist/public/views/marketplace.js +42 -34
  71. package/dist/public/views/openclaw.js +0 -1
  72. package/dist/public/views/portal-classic.js +4 -15
  73. package/dist/public/views/portal-dev.js +28 -30
  74. package/dist/public/views/portal.js +16 -21
  75. package/dist/public/views/portfolio.js +11 -12
  76. package/dist/public/views/profile/access-tab.js +250 -1
  77. package/dist/public/views/profile/agents/agent-card.js +75 -4
  78. package/dist/public/views/profile/agents/tab-activity.js +15 -13
  79. package/dist/public/views/profile/agents/tab-agent-config.js +60 -6
  80. package/dist/public/views/profile/agents/tab-integration.js +37 -60
  81. package/dist/public/views/profile/agents/tab-messages.js +10 -1
  82. package/dist/public/views/profile/agents/tab-quality.js +25 -19
  83. package/dist/public/views/profile/agents/tab-schedules.js +110 -0
  84. package/dist/public/views/profile/agents-activity-subtab.js +4 -4
  85. package/dist/public/views/profile/agents-services-subtab.js +5 -4
  86. package/dist/public/views/profile/agents-tab.js +141 -37
  87. package/dist/public/views/profile/agents-tasks-subtab.js +221 -26
  88. package/dist/public/views/profile/calibrator-batch.js +5 -11
  89. package/dist/public/views/profile/calibrator-tab.js +4 -9
  90. package/dist/public/views/profile/chat-sessions-tab.js +9 -5
  91. package/dist/public/views/profile/email-tab.js +2 -2
  92. package/dist/public/views/profile/extensions-tab.js +27 -22
  93. package/dist/public/views/profile/federation-tab.js +4 -1
  94. package/dist/public/views/profile/foundry-detail.js +22 -23
  95. package/dist/public/views/profile/foundry-tab.js +12 -13
  96. package/dist/public/views/profile/generator-dashboard/DebugPanel.js +4 -7
  97. package/dist/public/views/profile/generator-dashboard/use-dashboard-core.js +4 -1
  98. package/dist/public/views/profile/generator-dashboard/use-edit-mode.js +3 -2
  99. package/dist/public/views/profile/generator-detail.js +26 -30
  100. package/dist/public/views/profile/generator-tab.js +5 -5
  101. package/dist/public/views/profile/knowledge-tab.js +12 -12
  102. package/dist/public/views/profile/landing-page.js +100 -149
  103. package/dist/public/views/profile/memory-tab.js +15 -11
  104. package/dist/public/views/profile/node-stats-tab.js +3 -3
  105. package/dist/public/views/profile/nodes-tab.js +10 -3
  106. package/dist/public/views/profile/notifications-tab.js +3 -3
  107. package/dist/public/views/profile/packages-tab.js +14 -14
  108. package/dist/public/views/profile/scheduler-tab.js +340 -0
  109. package/dist/public/views/profile/services-tab.js +1 -1
  110. package/dist/public/views/profile/shared.js +16 -12
  111. package/dist/public/views/profile/wallet-tab.js +27 -50
  112. package/dist/public/views/profile/work-tab.js +29 -31
  113. package/dist/public/views/profile.js +24 -0
  114. package/dist/public/views/public-knowledge-viewer.js +9 -18
  115. package/dist/src/auth/middleware.d.ts +3 -2
  116. package/dist/src/auth/middleware.d.ts.map +1 -1
  117. package/dist/src/auth/middleware.js +78 -3
  118. package/dist/src/auth/middleware.js.map +1 -1
  119. package/dist/src/cli/init-wizard.d.ts.map +1 -1
  120. package/dist/src/cli/init-wizard.js +13 -1
  121. package/dist/src/cli/init-wizard.js.map +1 -1
  122. package/dist/src/config.d.ts +6 -0
  123. package/dist/src/config.d.ts.map +1 -1
  124. package/dist/src/config.js +12 -1
  125. package/dist/src/config.js.map +1 -1
  126. package/dist/src/generated/api-types.d.ts +708 -8
  127. package/dist/src/generated/api-types.d.ts.map +1 -1
  128. package/dist/src/mcp/agent-schedules.d.ts +23 -0
  129. package/dist/src/mcp/agent-schedules.d.ts.map +1 -0
  130. package/dist/src/mcp/agent-schedules.js +175 -0
  131. package/dist/src/mcp/agent-schedules.js.map +1 -0
  132. package/dist/src/mcp/annotations.d.ts.map +1 -1
  133. package/dist/src/mcp/annotations.js +6 -0
  134. package/dist/src/mcp/annotations.js.map +1 -1
  135. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  136. package/dist/src/mcp/catalog/definitions.js +55 -0
  137. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  138. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  139. package/dist/src/mcp/catalog/scopes.js +12 -0
  140. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  141. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  142. package/dist/src/mcp/catalog/surfaces.js +2 -0
  143. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  144. package/dist/src/mcp/index.d.ts.map +1 -1
  145. package/dist/src/mcp/index.js +2 -0
  146. package/dist/src/mcp/index.js.map +1 -1
  147. package/dist/src/models/agent-task-schemas.d.ts +6 -0
  148. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  149. package/dist/src/models/agent-task-schemas.js +6 -0
  150. package/dist/src/models/agent-task-schemas.js.map +1 -1
  151. package/dist/src/models/schemas.d.ts +1 -0
  152. package/dist/src/models/schemas.d.ts.map +1 -1
  153. package/dist/src/models/schemas.js +4 -0
  154. package/dist/src/models/schemas.js.map +1 -1
  155. package/dist/src/routes/access-tokens.d.ts +17 -0
  156. package/dist/src/routes/access-tokens.d.ts.map +1 -0
  157. package/dist/src/routes/access-tokens.js +164 -0
  158. package/dist/src/routes/access-tokens.js.map +1 -0
  159. package/dist/src/routes/agent-tasks.d.ts +2 -0
  160. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  161. package/dist/src/routes/agent-tasks.js +118 -23
  162. package/dist/src/routes/agent-tasks.js.map +1 -1
  163. package/dist/src/routes/agents.d.ts.map +1 -1
  164. package/dist/src/routes/agents.js +46 -0
  165. package/dist/src/routes/agents.js.map +1 -1
  166. package/dist/src/routes/ai.d.ts +6 -9
  167. package/dist/src/routes/ai.d.ts.map +1 -1
  168. package/dist/src/routes/ai.js +26 -175
  169. package/dist/src/routes/ai.js.map +1 -1
  170. package/dist/src/routes/apps.d.ts.map +1 -1
  171. package/dist/src/routes/apps.js +104 -34
  172. package/dist/src/routes/apps.js.map +1 -1
  173. package/dist/src/routes/auth.d.ts.map +1 -1
  174. package/dist/src/routes/auth.js +77 -4
  175. package/dist/src/routes/auth.js.map +1 -1
  176. package/dist/src/routes/cortex.d.ts +2 -1
  177. package/dist/src/routes/cortex.d.ts.map +1 -1
  178. package/dist/src/routes/cortex.js +13 -8
  179. package/dist/src/routes/cortex.js.map +1 -1
  180. package/dist/src/routes/extensions.d.ts.map +1 -1
  181. package/dist/src/routes/extensions.js +85 -51
  182. package/dist/src/routes/extensions.js.map +1 -1
  183. package/dist/src/routes/generator.d.ts.map +1 -1
  184. package/dist/src/routes/generator.js +109 -43
  185. package/dist/src/routes/generator.js.map +1 -1
  186. package/dist/src/routes/ghii.d.ts.map +1 -1
  187. package/dist/src/routes/ghii.js +34 -13
  188. package/dist/src/routes/ghii.js.map +1 -1
  189. package/dist/src/routes/libs.d.ts +15 -0
  190. package/dist/src/routes/libs.d.ts.map +1 -1
  191. package/dist/src/routes/libs.js +178 -55
  192. package/dist/src/routes/libs.js.map +1 -1
  193. package/dist/src/routes/portal.d.ts.map +1 -1
  194. package/dist/src/routes/portal.js +1 -0
  195. package/dist/src/routes/portal.js.map +1 -1
  196. package/dist/src/routes/schedules.d.ts +33 -0
  197. package/dist/src/routes/schedules.d.ts.map +1 -0
  198. package/dist/src/routes/schedules.js +380 -0
  199. package/dist/src/routes/schedules.js.map +1 -0
  200. package/dist/src/server-bootstrap/config-init.js +2 -2
  201. package/dist/src/server-bootstrap/config-init.js.map +1 -1
  202. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  203. package/dist/src/server-bootstrap/routes-loader.js +7 -0
  204. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  205. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  206. package/dist/src/server-bootstrap/service-init.js +2 -1
  207. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  208. package/dist/src/services/access-token.d.ts +28 -0
  209. package/dist/src/services/access-token.d.ts.map +1 -0
  210. package/dist/src/services/access-token.js +37 -0
  211. package/dist/src/services/access-token.js.map +1 -0
  212. package/dist/src/services/ai-completion.d.ts +83 -0
  213. package/dist/src/services/ai-completion.d.ts.map +1 -0
  214. package/dist/src/services/ai-completion.js +187 -0
  215. package/dist/src/services/ai-completion.js.map +1 -0
  216. package/dist/src/services/config-schema.d.ts.map +1 -1
  217. package/dist/src/services/config-schema.js +3 -0
  218. package/dist/src/services/config-schema.js.map +1 -1
  219. package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
  220. package/dist/src/services/generator-prompt-seeds.js +6 -3
  221. package/dist/src/services/generator-prompt-seeds.js.map +1 -1
  222. package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
  223. package/dist/src/services/generator-prompts/spec-validate.js +6 -2
  224. package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
  225. package/dist/src/services/generator-registration.d.ts +12 -4
  226. package/dist/src/services/generator-registration.d.ts.map +1 -1
  227. package/dist/src/services/generator-registration.js +71 -0
  228. package/dist/src/services/generator-registration.js.map +1 -1
  229. package/dist/src/services/generator-validate.d.ts +10 -0
  230. package/dist/src/services/generator-validate.d.ts.map +1 -1
  231. package/dist/src/services/generator-validate.js +180 -36
  232. package/dist/src/services/generator-validate.js.map +1 -1
  233. package/dist/src/services/owner-session.d.ts +43 -0
  234. package/dist/src/services/owner-session.d.ts.map +1 -0
  235. package/dist/src/services/owner-session.js +175 -0
  236. package/dist/src/services/owner-session.js.map +1 -0
  237. package/dist/src/services/schedule-constraints.d.ts +65 -0
  238. package/dist/src/services/schedule-constraints.d.ts.map +1 -0
  239. package/dist/src/services/schedule-constraints.js +106 -0
  240. package/dist/src/services/schedule-constraints.js.map +1 -0
  241. package/dist/src/services/scheduler.d.ts +34 -0
  242. package/dist/src/services/scheduler.d.ts.map +1 -1
  243. package/dist/src/services/scheduler.js +266 -22
  244. package/dist/src/services/scheduler.js.map +1 -1
  245. package/dist/src/services/skill-bundle/generator.js +19 -0
  246. package/dist/src/services/skill-bundle/generator.js.map +1 -1
  247. package/dist/src/storage/interface.d.ts +48 -4
  248. package/dist/src/storage/interface.d.ts.map +1 -1
  249. package/dist/src/storage/interface.js.map +1 -1
  250. package/dist/src/storage/providers/mongodb/index.d.ts +31 -0
  251. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  252. package/dist/src/storage/providers/mongodb/index.js +187 -9
  253. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  254. package/dist/src/storage/providers/sqlite/index.d.ts +31 -0
  255. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  256. package/dist/src/storage/providers/sqlite/index.js +131 -8
  257. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  258. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -1
  259. package/dist/src/storage/providers/sqlite/repos/agent-task.js +6 -4
  260. package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -1
  261. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  262. package/dist/src/storage/providers/sqlite/schema.js +79 -8
  263. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  264. package/dist/src/storage/repositories/pat.repository.d.ts +40 -0
  265. package/dist/src/storage/repositories/pat.repository.d.ts.map +1 -0
  266. package/dist/src/storage/repositories/pat.repository.js +14 -0
  267. package/dist/src/storage/repositories/pat.repository.js.map +1 -0
  268. package/dist/src/storage/repositories/scheduler.repository.d.ts +2 -0
  269. package/dist/src/storage/repositories/scheduler.repository.d.ts.map +1 -1
  270. package/dist/src/storage/repositories/session.repository.d.ts +51 -0
  271. package/dist/src/storage/repositories/session.repository.d.ts.map +1 -1
  272. package/dist/src/storage/repositories/session.repository.js +12 -0
  273. package/dist/src/storage/repositories/session.repository.js.map +1 -1
  274. package/dist/src/utils/env-config.d.ts.map +1 -1
  275. package/dist/src/utils/env-config.js +25 -1
  276. package/dist/src/utils/env-config.js.map +1 -1
  277. package/dist/src/utils/env-validator.d.ts.map +1 -1
  278. package/dist/src/utils/env-validator.js +4 -0
  279. package/dist/src/utils/env-validator.js.map +1 -1
  280. package/package.json +1 -1
  281. package/prisma/schema.prisma +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-session.d.ts","sourceRoot":"","sources":["../../../src/services/owner-session.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,iFAAiF;AACjF,eAAO,MAAM,cAAc,cAAc,CAAC;AAI1C,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAOD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW7D;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQvG;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAOpE;AA0BD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3C,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,aAAa,CAAC,CAuExB"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * @file owner-session.ts
3
+ * @description Owner (human) login sessions backed by rotating, server-side refresh
4
+ * tokens delivered as an httpOnly cookie. Decouples session continuity from the
5
+ * owner keypair so logging in on one device never invalidates another. Provides the
6
+ * cookie helpers, session establishment (login), and the refresh-with-rotation +
7
+ * reuse-detection logic used by POST /v1/auth/refresh.
8
+ * @structure REFRESH_COOKIE constant; cookie helpers (read/set/clear/secure);
9
+ * establishOwnerSession() for login; refreshOwnerSession() for rotation.
10
+ * @usage import { establishOwnerSession, refreshOwnerSession, clearRefreshCookie } from '../services/owner-session.js'
11
+ * @version-history
12
+ * v1.0.0 - 2026-06-03 - Initial implementation (plan 2026-06-03-owner-session-refresh-tokens).
13
+ */
14
+ import { createHash, randomBytes, randomUUID } from 'node:crypto';
15
+ import { issueJWT } from '../auth/jwt.js';
16
+ /** Name of the httpOnly refresh-token cookie. Scoped to /v1/auth on the wire. */
17
+ export const REFRESH_COOKIE = 'aimeat_rt';
18
+ const COOKIE_PATH = '/v1/auth';
19
+ const DAY_MS = 86_400_000;
20
+ /** SHA-256 hex of a raw token — only the hash is ever stored. */
21
+ export function hashToken(token) {
22
+ return createHash('sha256').update(token).digest('hex');
23
+ }
24
+ /** Whether the cookie should carry the Secure flag (https or proxied https). */
25
+ function cookieSecure(req) {
26
+ return req.secure || req.headers['x-forwarded-proto'] === 'https';
27
+ }
28
+ /** Read the raw refresh token from the request's Cookie header (no cookie-parser dep). */
29
+ export function readRefreshCookie(req) {
30
+ const header = req.headers.cookie;
31
+ if (!header)
32
+ return null;
33
+ for (const part of header.split(';')) {
34
+ const eq = part.indexOf('=');
35
+ if (eq === -1)
36
+ continue;
37
+ if (part.slice(0, eq).trim() === REFRESH_COOKIE) {
38
+ return decodeURIComponent(part.slice(eq + 1).trim());
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ /** Set the httpOnly refresh cookie. maxAge defaults to the absolute cap. */
44
+ export function setRefreshCookie(req, res, config, token) {
45
+ res.cookie(REFRESH_COOKIE, token, {
46
+ httpOnly: true,
47
+ secure: cookieSecure(req),
48
+ sameSite: 'strict',
49
+ path: COOKIE_PATH,
50
+ maxAge: config.refreshAbsoluteDays * DAY_MS,
51
+ });
52
+ }
53
+ /** Clear the refresh cookie (logout / revocation / invalid token). */
54
+ export function clearRefreshCookie(req, res) {
55
+ res.clearCookie(REFRESH_COOKIE, {
56
+ httpOnly: true,
57
+ secure: cookieSecure(req),
58
+ sameSite: 'strict',
59
+ path: COOKIE_PATH,
60
+ });
61
+ }
62
+ /** Best-effort human label for the session list, derived from the User-Agent. */
63
+ function deviceLabelFromUA(ua) {
64
+ if (!ua)
65
+ return 'Unknown device';
66
+ const browser = /Edg\//.test(ua) ? 'Edge'
67
+ : /OPR\/|Opera/.test(ua) ? 'Opera'
68
+ : /Chrome\//.test(ua) ? 'Chrome'
69
+ : /Firefox\//.test(ua) ? 'Firefox'
70
+ : /Safari\//.test(ua) ? 'Safari'
71
+ : 'Browser';
72
+ const os = /Windows/.test(ua) ? 'Windows'
73
+ : /Mac OS X|Macintosh/.test(ua) ? 'macOS'
74
+ : /Android/.test(ua) ? 'Android'
75
+ : /iPhone|iPad|iPod|iOS/.test(ua) ? 'iOS'
76
+ : /Linux/.test(ua) ? 'Linux'
77
+ : '';
78
+ return os ? `${browser} on ${os}` : browser;
79
+ }
80
+ /** Re-read the owner's current roles so refreshed tokens never carry stale privileges. */
81
+ async function freshOwnerRoles(storage, owner) {
82
+ const ownerRecord = await storage.getOwner(owner);
83
+ return ownerRecord?.roles ?? ['owner'];
84
+ }
85
+ /**
86
+ * Create an owner login session: mint a refresh token (cookie) + a short-lived access
87
+ * JWT bound to the session, and persist the session row. Called on successful login.
88
+ */
89
+ export async function establishOwnerSession(storage, config, req, res, identity) {
90
+ const sessionId = randomUUID();
91
+ const rawToken = randomBytes(32).toString('hex');
92
+ const now = Date.now();
93
+ const issuedAt = new Date(now).toISOString();
94
+ const idleExpiresAt = new Date(now + config.refreshIdleDays * DAY_MS).toISOString();
95
+ const absoluteExpiresAt = new Date(now + config.refreshAbsoluteDays * DAY_MS).toISOString();
96
+ await storage.createOwnerSession({
97
+ sessionId,
98
+ gaii: identity.owner, // owner sessions are keyed to the bare owner name (no agent GAII)
99
+ owner: identity.owner,
100
+ issuedAt,
101
+ refreshTokenHash: hashToken(rawToken),
102
+ idleExpiresAt,
103
+ absoluteExpiresAt,
104
+ lastUsedAt: issuedAt,
105
+ deviceLabel: deviceLabelFromUA(req.headers['user-agent']),
106
+ userAgent: (req.headers['user-agent'] ?? null),
107
+ });
108
+ setRefreshCookie(req, res, config, rawToken);
109
+ const token = await issueJWT({ sub: identity.owner, owner: identity.owner, node: config.nodeId, roles: identity.roles }, config.accessTtlSeconds, sessionId);
110
+ return { token, sessionId, expiresIn: config.accessTtlSeconds };
111
+ }
112
+ /**
113
+ * Validate the refresh cookie, rotate it (one-time use with a grace window), detect
114
+ * reuse, and issue a new access token. Sets/clears the cookie on `res` as needed.
115
+ */
116
+ export async function refreshOwnerSession(storage, config, req, res) {
117
+ const rawToken = readRefreshCookie(req);
118
+ if (!rawToken) {
119
+ return { ok: false, status: 401, code: 'AUTH_REQUIRED', message: 'No refresh token' };
120
+ }
121
+ // CSRF guard: cross-site requests cannot set this custom header without a CORS preflight.
122
+ if (req.headers['x-aimeat-refresh'] !== '1') {
123
+ return { ok: false, status: 400, code: 'CSRF_REQUIRED', message: 'Missing X-AIMEAT-Refresh header' };
124
+ }
125
+ const presentedHash = hashToken(rawToken);
126
+ const session = await storage.getSessionByRefreshHash(presentedHash);
127
+ if (!session) {
128
+ clearRefreshCookie(req, res);
129
+ return { ok: false, status: 401, code: 'INVALID_GRANT', message: 'Invalid refresh token' };
130
+ }
131
+ if (session.revoked) {
132
+ clearRefreshCookie(req, res);
133
+ return { ok: false, status: 401, code: 'SESSION_REVOKED', message: 'Session has been revoked' };
134
+ }
135
+ const now = Date.now();
136
+ const idle = session.idleExpiresAt ? Date.parse(session.idleExpiresAt) : 0;
137
+ const absolute = session.absoluteExpiresAt ? Date.parse(session.absoluteExpiresAt) : 0;
138
+ if ((idle && now >= idle) || (absolute && now >= absolute)) {
139
+ await storage.revokeSession(session.sessionId);
140
+ clearRefreshCookie(req, res);
141
+ return { ok: false, status: 401, code: 'SESSION_EXPIRED', message: 'Session expired — please log in again' };
142
+ }
143
+ // Reuse detection: the presented token matched the PREVIOUS hash.
144
+ if (session.prevTokenHash && presentedHash === session.prevTokenHash) {
145
+ const graceUntil = session.prevValidUntil ? Date.parse(session.prevValidUntil) : 0;
146
+ if (!(graceUntil && now < graceUntil)) {
147
+ // Previous token replayed after the grace window → treat as theft, revoke the family.
148
+ await storage.revokeSession(session.sessionId);
149
+ clearRefreshCookie(req, res);
150
+ return { ok: false, status: 401, code: 'SESSION_REVOKED', message: 'Refresh token reuse detected' };
151
+ }
152
+ // Within grace: an in-flight request carrying the just-rotated-away cookie. A sibling
153
+ // request already rotated and set the new cookie, so DON'T rotate again — just issue a
154
+ // fresh access token bound to the session.
155
+ const roles = await freshOwnerRoles(storage, session.owner);
156
+ const token = await issueJWT({ sub: session.gaii, owner: session.owner, node: config.nodeId, roles }, config.accessTtlSeconds, session.sessionId);
157
+ return { ok: true, token, expiresIn: config.accessTtlSeconds, rotated: false };
158
+ }
159
+ // Normal path: presented token == current. Rotate one-time-use and slide the idle window.
160
+ const roles = await freshOwnerRoles(storage, session.owner);
161
+ const newRawToken = randomBytes(32).toString('hex');
162
+ const newIdle = new Date(absolute ? Math.min(now + config.refreshIdleDays * DAY_MS, absolute) : now + config.refreshIdleDays * DAY_MS).toISOString();
163
+ await storage.rotateSessionRefresh(session.sessionId, {
164
+ refreshTokenHash: hashToken(newRawToken),
165
+ prevTokenHash: session.refreshTokenHash ?? null,
166
+ prevValidUntil: new Date(now + config.refreshGraceMs).toISOString(),
167
+ idleExpiresAt: newIdle,
168
+ expiresAt: newIdle,
169
+ lastUsedAt: new Date(now).toISOString(),
170
+ });
171
+ setRefreshCookie(req, res, config, newRawToken);
172
+ const token = await issueJWT({ sub: session.gaii, owner: session.owner, node: config.nodeId, roles }, config.accessTtlSeconds, session.sessionId);
173
+ return { ok: true, token, expiresIn: config.accessTtlSeconds, rotated: true };
174
+ }
175
+ //# sourceMappingURL=owner-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-session.js","sourceRoot":"","sources":["../../../src/services/owner-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file schedule-constraints.ts
3
+ * @description Extensible, opt-in budget/run guards for recurring schedules.
4
+ * Each guard is a registry entry implementing a pre-fire check() (and optional
5
+ * post-run hook). Guards are stored on ScheduledJobRecord.constraints as a JSON
6
+ * array, so adding a new guard type later is one REGISTRY entry + a UI toggle —
7
+ * no schema migration. All guards are disabled unless explicitly toggled on.
8
+ *
9
+ * v1 guards:
10
+ * - max_runs { limit } — stop after N successful fires
11
+ * - daily_limit { limit } — cap today's AI spend (USD) for the
12
+ * owner before an `ai` fire; sourced
13
+ * from the guard, falling back to the
14
+ * agent's dailySpendLimit.
15
+ * @structure
16
+ * - REGISTRY: Record<type, ConstraintDef>
17
+ * - evaluateConstraints(schedule, ctx) — pre-fire gate (allow/deny + disable hint)
18
+ * - applyAfterRun(schedule, ctx) — post-fire constraint-state updates
19
+ * - mergeConstraintDefaults(...) — inherit agent defaults at creation
20
+ * @version-history
21
+ * v1.0.0 — 2026-06-03 — Initial registry (max_runs, daily_limit)
22
+ */
23
+ import type { AimeatConfig } from '../config.js';
24
+ import type { Storage, ScheduledJobRecord, ScheduleConstraint, AgentRecord } from '../storage/interface.js';
25
+ export interface ConstraintContext {
26
+ storage: Storage;
27
+ config: AimeatConfig;
28
+ /** Owner GHII whose spend/usage the guard checks (for daily_limit). */
29
+ ownerGaii?: string;
30
+ /** The target agent record, when the schedule belongs to one. */
31
+ agent?: AgentRecord | null;
32
+ }
33
+ export interface ConstraintCheckResult {
34
+ allow: boolean;
35
+ reason?: string;
36
+ /** When true, the scheduler should disable the schedule entirely (e.g. max_runs reached). */
37
+ disable?: boolean;
38
+ }
39
+ export interface ConstraintDef {
40
+ type: string;
41
+ /** Pre-fire gate. allow=false skips this fire (logged as 'skipped'). */
42
+ check(schedule: ScheduledJobRecord, constraint: ScheduleConstraint, ctx: ConstraintContext): Promise<ConstraintCheckResult>;
43
+ /** Optional post-successful-fire state mutation; returns the updated constraint state. */
44
+ onAfterRun?(schedule: ScheduledJobRecord, constraint: ScheduleConstraint, ctx: ConstraintContext): Promise<Record<string, unknown> | void>;
45
+ }
46
+ /** True if a guard type is known to the registry. */
47
+ export declare function isKnownConstraint(type: string): boolean;
48
+ /** The set of guard types the node currently supports (for UI + validation). */
49
+ export declare function knownConstraintTypes(): string[];
50
+ /**
51
+ * Evaluate all enabled+known guards before a fire. Returns the first denial
52
+ * (with an optional `disable` hint), else allow.
53
+ */
54
+ export declare function evaluateConstraints(schedule: ScheduledJobRecord, ctx: ConstraintContext): Promise<ConstraintCheckResult>;
55
+ /**
56
+ * Apply post-fire state updates. Returns the new constraints array if any guard
57
+ * mutated its state, else undefined (no write needed).
58
+ */
59
+ export declare function applyAfterRun(schedule: ScheduledJobRecord, ctx: ConstraintContext): Promise<ScheduleConstraint[] | undefined>;
60
+ /**
61
+ * At schedule creation, inherit the agent's default guards for any guard type
62
+ * the new schedule didn't specify. Explicit per-schedule guards win.
63
+ */
64
+ export declare function mergeConstraintDefaults(scheduleConstraints: ScheduleConstraint[] | undefined, agentDefaults: ScheduleConstraint[] | undefined): ScheduleConstraint[] | undefined;
65
+ //# sourceMappingURL=schedule-constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-constraints.d.ts","sourceRoot":"","sources":["../../../src/services/schedule-constraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5G,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5H,0FAA0F;IAC1F,UAAU,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;CAC5I;AA0CD,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,qBAAqB,CAAC,CAUhC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,EAAE,GAAG,SAAS,CAAC,CAY3C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,mBAAmB,EAAE,kBAAkB,EAAE,GAAG,SAAS,EACrD,aAAa,EAAE,kBAAkB,EAAE,GAAG,SAAS,GAC9C,kBAAkB,EAAE,GAAG,SAAS,CAQlC"}
@@ -0,0 +1,106 @@
1
+ import { getTodayUsage } from './ai-completion.js';
2
+ const numParam = (constraint, key) => {
3
+ const v = constraint.params?.[key];
4
+ return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
5
+ };
6
+ const REGISTRY = {
7
+ // ── Stop after N successful fires ──
8
+ max_runs: {
9
+ type: 'max_runs',
10
+ async check(schedule, constraint) {
11
+ const limit = numParam(constraint, 'limit');
12
+ if (limit === undefined || limit <= 0)
13
+ return { allow: true };
14
+ const ran = schedule.runCount ?? 0;
15
+ if (ran >= limit) {
16
+ return { allow: false, disable: true, reason: `max_runs reached (${ran}/${limit})` };
17
+ }
18
+ return { allow: true };
19
+ },
20
+ },
21
+ // ── Cap today's AI spend (USD) for the owner before an ai-kind fire ──
22
+ daily_limit: {
23
+ type: 'daily_limit',
24
+ async check(schedule, constraint, ctx) {
25
+ // Only the `ai` path has a real per-day spend signal today (ai-usage.<gaii>.<day>).
26
+ // For other kinds the guard is a no-op (documented); kept extensible.
27
+ if (schedule.type !== 'ai')
28
+ return { allow: true };
29
+ const limit = numParam(constraint, 'limit') ?? ctx.agent?.dailySpendLimit ?? undefined;
30
+ if (limit === undefined || limit === null || limit <= 0)
31
+ return { allow: true };
32
+ const owner = ctx.ownerGaii ?? schedule.ownerScope;
33
+ if (!owner)
34
+ return { allow: true };
35
+ const usage = await getTodayUsage(ctx.storage, owner);
36
+ if (usage.total_cost_usd >= limit) {
37
+ return { allow: false, reason: `daily AI spend limit reached ($${usage.total_cost_usd.toFixed(4)} / $${limit})` };
38
+ }
39
+ return { allow: true };
40
+ },
41
+ },
42
+ };
43
+ /** True if a guard type is known to the registry. */
44
+ export function isKnownConstraint(type) {
45
+ return type in REGISTRY;
46
+ }
47
+ /** The set of guard types the node currently supports (for UI + validation). */
48
+ export function knownConstraintTypes() {
49
+ return Object.keys(REGISTRY);
50
+ }
51
+ /**
52
+ * Evaluate all enabled+known guards before a fire. Returns the first denial
53
+ * (with an optional `disable` hint), else allow.
54
+ */
55
+ export async function evaluateConstraints(schedule, ctx) {
56
+ const constraints = schedule.constraints ?? [];
57
+ for (const c of constraints) {
58
+ if (!c.enabled)
59
+ continue;
60
+ const def = REGISTRY[c.type];
61
+ if (!def)
62
+ continue; // unknown guard type — ignore (forward-compatible)
63
+ const result = await def.check(schedule, c, ctx);
64
+ if (!result.allow)
65
+ return result;
66
+ }
67
+ return { allow: true };
68
+ }
69
+ /**
70
+ * Apply post-fire state updates. Returns the new constraints array if any guard
71
+ * mutated its state, else undefined (no write needed).
72
+ */
73
+ export async function applyAfterRun(schedule, ctx) {
74
+ const constraints = schedule.constraints ?? [];
75
+ let changed = false;
76
+ const next = await Promise.all(constraints.map(async (c) => {
77
+ if (!c.enabled)
78
+ return c;
79
+ const def = REGISTRY[c.type];
80
+ if (!def?.onAfterRun)
81
+ return c;
82
+ const patch = await def.onAfterRun(schedule, c, ctx);
83
+ if (patch) {
84
+ changed = true;
85
+ return { ...c, state: { ...(c.state ?? {}), ...patch } };
86
+ }
87
+ return c;
88
+ }));
89
+ return changed ? next : undefined;
90
+ }
91
+ /**
92
+ * At schedule creation, inherit the agent's default guards for any guard type
93
+ * the new schedule didn't specify. Explicit per-schedule guards win.
94
+ */
95
+ export function mergeConstraintDefaults(scheduleConstraints, agentDefaults) {
96
+ if (!agentDefaults?.length)
97
+ return scheduleConstraints;
98
+ const out = [...(scheduleConstraints ?? [])];
99
+ const present = new Set(out.map(c => c.type));
100
+ for (const d of agentDefaults) {
101
+ if (!present.has(d.type))
102
+ out.push({ ...d });
103
+ }
104
+ return out.length ? out : undefined;
105
+ }
106
+ //# sourceMappingURL=schedule-constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-constraints.js","sourceRoot":"","sources":["../../../src/services/schedule-constraints.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import type { AimeatConfig } from '../config.js';
2
2
  import type { Storage, ScheduledJobRecord } from '../storage/interface.js';
3
3
  import type { EmailService } from './email.js';
4
+ import type { PushService } from './push.js';
5
+ import type { createWebhookDispatcher } from './webhook-dispatcher.js';
6
+ type WebhookDispatcher = ReturnType<typeof createWebhookDispatcher>;
7
+ export declare function setActiveScheduler(scheduler: Scheduler): void;
8
+ export declare function getActiveScheduler(): Scheduler | null;
4
9
  export type JobTrigger = 'cron' | 'manual' | 'activate';
5
10
  export declare class Scheduler {
6
11
  private config;
@@ -9,7 +14,15 @@ export declare class Scheduler {
9
14
  private coreHandlers;
10
15
  private running;
11
16
  private emailService?;
17
+ private webhookDispatcher?;
18
+ private pushService?;
19
+ /** Guards against overlapping fires of the same job (one run at a time). */
20
+ private executing;
12
21
  constructor(config: AimeatConfig, storage: Storage, emailService?: EmailService);
22
+ /** Inject the webhook dispatcher used to wake agents for `agent_task` fires. */
23
+ setWebhookDispatcher(dispatcher: WebhookDispatcher): void;
24
+ /** Inject the push service used to notify the owner on failed/auto-paused schedules. */
25
+ setPushService(pushService: PushService): void;
13
26
  /**
14
27
  * Register a core handler function that can be referenced by scheduled jobs.
15
28
  * Must be called before start().
@@ -49,7 +62,28 @@ export declare class Scheduler {
49
62
  private runActivateJobsList;
50
63
  private scheduleJob;
51
64
  private executeJob;
65
+ /** Write one ExecutionLogEntry (best-effort). */
66
+ private writeLog;
67
+ /** Disable a schedule (stop the cron, persist enabled:false) and notify the owner. */
68
+ private autoDisable;
69
+ /** After a successful run, disable the schedule if a max_runs cap is now reached. */
70
+ private maybeAutoDisableMaxRuns;
71
+ /** Send an owner push notification (best-effort; no-op if push disabled). */
72
+ private notifyOwner;
73
+ /**
74
+ * `ai` kind: gather predefined input memory keys, compose the prompt, run a
75
+ * server-side completion on the owner's OpenRouter key, and store the result
76
+ * to the owner's output key. Zero agent involvement; runs even when offline.
77
+ */
78
+ private executeAiJob;
79
+ /**
80
+ * `agent_task` kind: materialise an AgentTaskRecord into the target agent's
81
+ * queue and wake it via the existing webhook/MCP/SSE fan-out. The schedule is
82
+ * the parent (parentTaskId); offline agents pick it up on reconnect.
83
+ */
84
+ private executeAgentTaskJob;
52
85
  private executeCoreJob;
53
86
  private executeExtensionJob;
54
87
  }
88
+ export {};
55
89
  //# sourceMappingURL=scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/services/scheduler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,yBAAyB,CAAC;AAG9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;gBAExB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY;IAM/E;;;OAGG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI9D;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAMxC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS3B;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C;;;OAGG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAU7B,mBAAmB;IAWjC,OAAO,CAAC,WAAW;YA8BL,UAAU;YAoEV,cAAc;YAad,mBAAmB;CAiNlC"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/services/scheduler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAA0E,MAAM,yBAAyB,CAAC;AAGnJ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAOvE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAQpE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAkC;AAChG,wBAAgB,kBAAkB,IAAI,SAAS,GAAG,IAAI,CAA6B;AAEnF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AASxD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAqB;gBAE1B,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY;IAM/E,gFAAgF;IAChF,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAIzD,wFAAwF;IACxF,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI9D;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAMxC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS3B;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C;;;OAGG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAU7B,mBAAmB;IAWjC,OAAO,CAAC,WAAW;YAkCL,UAAU;IA6FxB,iDAAiD;YACnC,QAAQ;IAwBtB,sFAAsF;YACxE,WAAW;IASzB,qFAAqF;YACvE,uBAAuB;IAWrC,6EAA6E;IAC7E,OAAO,CAAC,WAAW;IAYnB;;;;OAIG;YACW,YAAY;IAoD1B;;;;OAIG;YACW,mBAAmB;YAoFnB,cAAc;YAad,mBAAmB;CAiNlC"}