@aitne/daemon 0.1.6 → 0.1.8

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 (963) hide show
  1. package/dist/adapters/dashboard-adapter.d.ts +18 -2
  2. package/dist/adapters/dashboard-adapter.d.ts.map +1 -1
  3. package/dist/adapters/dashboard-adapter.js +101 -51
  4. package/dist/adapters/dashboard-adapter.js.map +1 -1
  5. package/dist/adapters/discord.d.ts +8 -0
  6. package/dist/adapters/discord.d.ts.map +1 -1
  7. package/dist/adapters/discord.js +100 -21
  8. package/dist/adapters/discord.js.map +1 -1
  9. package/dist/adapters/message-hub.d.ts.map +1 -1
  10. package/dist/adapters/message-hub.js +7 -1
  11. package/dist/adapters/message-hub.js.map +1 -1
  12. package/dist/adapters/notification-manager.d.ts +102 -2
  13. package/dist/adapters/notification-manager.d.ts.map +1 -1
  14. package/dist/adapters/notification-manager.js +228 -8
  15. package/dist/adapters/notification-manager.js.map +1 -1
  16. package/dist/adapters/outbound-text.d.ts +16 -0
  17. package/dist/adapters/outbound-text.d.ts.map +1 -1
  18. package/dist/adapters/outbound-text.js +118 -1
  19. package/dist/adapters/outbound-text.js.map +1 -1
  20. package/dist/adapters/primary-platform-resolver.d.ts +69 -0
  21. package/dist/adapters/primary-platform-resolver.d.ts.map +1 -0
  22. package/dist/adapters/primary-platform-resolver.js +55 -0
  23. package/dist/adapters/primary-platform-resolver.js.map +1 -0
  24. package/dist/adapters/slack-adapter.d.ts +28 -0
  25. package/dist/adapters/slack-adapter.d.ts.map +1 -1
  26. package/dist/adapters/slack-adapter.js +134 -35
  27. package/dist/adapters/slack-adapter.js.map +1 -1
  28. package/dist/adapters/telegram-adapter.d.ts +7 -1
  29. package/dist/adapters/telegram-adapter.d.ts.map +1 -1
  30. package/dist/adapters/telegram-adapter.js +49 -18
  31. package/dist/adapters/telegram-adapter.js.map +1 -1
  32. package/dist/adapters/whatsapp-adapter.d.ts +33 -0
  33. package/dist/adapters/whatsapp-adapter.d.ts.map +1 -1
  34. package/dist/adapters/whatsapp-adapter.js +84 -0
  35. package/dist/adapters/whatsapp-adapter.js.map +1 -1
  36. package/dist/api/directory-picker.d.ts.map +1 -1
  37. package/dist/api/directory-picker.js +14 -0
  38. package/dist/api/directory-picker.js.map +1 -1
  39. package/dist/api/env-writer.d.ts.map +1 -1
  40. package/dist/api/env-writer.js +6 -1
  41. package/dist/api/env-writer.js.map +1 -1
  42. package/dist/api/helpers/agent-errors.d.ts +2600 -0
  43. package/dist/api/helpers/agent-errors.d.ts.map +1 -0
  44. package/dist/api/helpers/agent-errors.js +2506 -0
  45. package/dist/api/helpers/agent-errors.js.map +1 -0
  46. package/dist/api/integration-route-gate.d.ts.map +1 -1
  47. package/dist/api/integration-route-gate.js +10 -3
  48. package/dist/api/integration-route-gate.js.map +1 -1
  49. package/dist/api/routes/agent-schedule-plan-match.d.ts +5 -0
  50. package/dist/api/routes/agent-schedule-plan-match.d.ts.map +1 -0
  51. package/dist/api/routes/agent-schedule-plan-match.js +101 -0
  52. package/dist/api/routes/agent-schedule-plan-match.js.map +1 -0
  53. package/dist/api/routes/agent-schedule.d.ts +4 -0
  54. package/dist/api/routes/agent-schedule.d.ts.map +1 -0
  55. package/dist/api/routes/agent-schedule.js +750 -0
  56. package/dist/api/routes/agent-schedule.js.map +1 -0
  57. package/dist/api/routes/agent.d.ts.map +1 -1
  58. package/dist/api/routes/agent.js +209 -366
  59. package/dist/api/routes/agent.js.map +1 -1
  60. package/dist/api/routes/apple-calendar.d.ts.map +1 -1
  61. package/dist/api/routes/apple-calendar.js +109 -27
  62. package/dist/api/routes/apple-calendar.js.map +1 -1
  63. package/dist/api/routes/attachments.d.ts.map +1 -1
  64. package/dist/api/routes/attachments.js +113 -21
  65. package/dist/api/routes/attachments.js.map +1 -1
  66. package/dist/api/routes/backends.d.ts.map +1 -1
  67. package/dist/api/routes/backends.js +100 -4
  68. package/dist/api/routes/backends.js.map +1 -1
  69. package/dist/api/routes/books.d.ts.map +1 -1
  70. package/dist/api/routes/books.js +58 -18
  71. package/dist/api/routes/books.js.map +1 -1
  72. package/dist/api/routes/calendar.d.ts +3 -2
  73. package/dist/api/routes/calendar.d.ts.map +1 -1
  74. package/dist/api/routes/calendar.js +330 -55
  75. package/dist/api/routes/calendar.js.map +1 -1
  76. package/dist/api/routes/commands.d.ts.map +1 -1
  77. package/dist/api/routes/commands.js +20 -1
  78. package/dist/api/routes/commands.js.map +1 -1
  79. package/dist/api/routes/context/index.d.ts +33 -0
  80. package/dist/api/routes/context/index.d.ts.map +1 -0
  81. package/dist/api/routes/context/index.js +193 -0
  82. package/dist/api/routes/context/index.js.map +1 -0
  83. package/dist/api/routes/context/locks.d.ts +4 -0
  84. package/dist/api/routes/context/locks.d.ts.map +1 -0
  85. package/dist/api/routes/context/locks.js +136 -0
  86. package/dist/api/routes/context/locks.js.map +1 -0
  87. package/dist/api/routes/context/path-resolve.d.ts +15 -0
  88. package/dist/api/routes/context/path-resolve.d.ts.map +1 -0
  89. package/dist/api/routes/context/path-resolve.js +109 -0
  90. package/dist/api/routes/context/path-resolve.js.map +1 -0
  91. package/dist/api/routes/context/permissions.d.ts +35 -0
  92. package/dist/api/routes/context/permissions.d.ts.map +1 -0
  93. package/dist/api/routes/context/permissions.js +192 -0
  94. package/dist/api/routes/context/permissions.js.map +1 -0
  95. package/dist/api/routes/context/read.d.ts +4 -0
  96. package/dist/api/routes/context/read.d.ts.map +1 -0
  97. package/dist/api/routes/context/read.js +295 -0
  98. package/dist/api/routes/context/read.js.map +1 -0
  99. package/dist/api/routes/context/repair.d.ts +4 -0
  100. package/dist/api/routes/context/repair.d.ts.map +1 -0
  101. package/dist/api/routes/context/repair.js +114 -0
  102. package/dist/api/routes/context/repair.js.map +1 -0
  103. package/dist/api/routes/context/snapshots.d.ts +4 -0
  104. package/dist/api/routes/context/snapshots.d.ts.map +1 -0
  105. package/dist/api/routes/context/snapshots.js +177 -0
  106. package/dist/api/routes/context/snapshots.js.map +1 -0
  107. package/dist/api/routes/context/write.d.ts +4 -0
  108. package/dist/api/routes/context/write.d.ts.map +1 -0
  109. package/dist/api/routes/context/write.js +570 -0
  110. package/dist/api/routes/context/write.js.map +1 -0
  111. package/dist/api/routes/context.d.ts +2 -43
  112. package/dist/api/routes/context.d.ts.map +1 -1
  113. package/dist/api/routes/context.js +415 -558
  114. package/dist/api/routes/context.js.map +1 -1
  115. package/dist/api/routes/dashboard/config.d.ts +4 -0
  116. package/dist/api/routes/dashboard/config.d.ts.map +1 -0
  117. package/dist/api/routes/dashboard/config.js +499 -0
  118. package/dist/api/routes/dashboard/config.js.map +1 -0
  119. package/dist/api/routes/dashboard/conversations.d.ts +4 -0
  120. package/dist/api/routes/dashboard/conversations.d.ts.map +1 -0
  121. package/dist/api/routes/dashboard/conversations.js +309 -0
  122. package/dist/api/routes/dashboard/conversations.js.map +1 -0
  123. package/dist/api/routes/dashboard/cost-approvals.d.ts +29 -0
  124. package/dist/api/routes/dashboard/cost-approvals.d.ts.map +1 -0
  125. package/dist/api/routes/dashboard/cost-approvals.js +259 -0
  126. package/dist/api/routes/dashboard/cost-approvals.js.map +1 -0
  127. package/dist/api/routes/dashboard/index.d.ts +27 -0
  128. package/dist/api/routes/dashboard/index.d.ts.map +1 -0
  129. package/dist/api/routes/dashboard/index.js +47 -0
  130. package/dist/api/routes/dashboard/index.js.map +1 -0
  131. package/dist/api/routes/dashboard/messaging.d.ts +4 -0
  132. package/dist/api/routes/dashboard/messaging.d.ts.map +1 -0
  133. package/dist/api/routes/dashboard/messaging.js +351 -0
  134. package/dist/api/routes/dashboard/messaging.js.map +1 -0
  135. package/dist/api/routes/dashboard/notifications.d.ts +4 -0
  136. package/dist/api/routes/dashboard/notifications.d.ts.map +1 -0
  137. package/dist/api/routes/dashboard/notifications.js +109 -0
  138. package/dist/api/routes/dashboard/notifications.js.map +1 -0
  139. package/dist/api/routes/dashboard/oauth-google.d.ts +4 -0
  140. package/dist/api/routes/dashboard/oauth-google.d.ts.map +1 -0
  141. package/dist/api/routes/dashboard/oauth-google.js +293 -0
  142. package/dist/api/routes/dashboard/oauth-google.js.map +1 -0
  143. package/dist/api/routes/dashboard/schedule-readonly.d.ts +4 -0
  144. package/dist/api/routes/dashboard/schedule-readonly.d.ts.map +1 -0
  145. package/dist/api/routes/dashboard/schedule-readonly.js +46 -0
  146. package/dist/api/routes/dashboard/schedule-readonly.js.map +1 -0
  147. package/dist/api/routes/dashboard/secrets.d.ts +24 -0
  148. package/dist/api/routes/dashboard/secrets.d.ts.map +1 -0
  149. package/dist/api/routes/dashboard/secrets.js +307 -0
  150. package/dist/api/routes/dashboard/secrets.js.map +1 -0
  151. package/dist/api/routes/dashboard/snapshots.d.ts +4 -0
  152. package/dist/api/routes/dashboard/snapshots.d.ts.map +1 -0
  153. package/dist/api/routes/dashboard/snapshots.js +33 -0
  154. package/dist/api/routes/dashboard/snapshots.js.map +1 -0
  155. package/dist/api/routes/dashboard.d.ts.map +1 -1
  156. package/dist/api/routes/dashboard.js +20 -12
  157. package/dist/api/routes/dashboard.js.map +1 -1
  158. package/dist/api/routes/delegated.d.ts +5 -4
  159. package/dist/api/routes/delegated.d.ts.map +1 -1
  160. package/dist/api/routes/delegated.js +6 -5
  161. package/dist/api/routes/delegated.js.map +1 -1
  162. package/dist/api/routes/docs.d.ts.map +1 -1
  163. package/dist/api/routes/docs.js +72 -9
  164. package/dist/api/routes/docs.js.map +1 -1
  165. package/dist/api/routes/entities.d.ts.map +1 -1
  166. package/dist/api/routes/entities.js +112 -43
  167. package/dist/api/routes/entities.js.map +1 -1
  168. package/dist/api/routes/fs.d.ts.map +1 -1
  169. package/dist/api/routes/fs.js +27 -12
  170. package/dist/api/routes/fs.js.map +1 -1
  171. package/dist/api/routes/git-templates.d.ts.map +1 -1
  172. package/dist/api/routes/git-templates.js +107 -27
  173. package/dist/api/routes/git-templates.js.map +1 -1
  174. package/dist/api/routes/git.d.ts.map +1 -1
  175. package/dist/api/routes/git.js +55 -11
  176. package/dist/api/routes/git.js.map +1 -1
  177. package/dist/api/routes/github.d.ts.map +1 -1
  178. package/dist/api/routes/github.js +110 -17
  179. package/dist/api/routes/github.js.map +1 -1
  180. package/dist/api/routes/integrations/crud-patch.d.ts +17 -0
  181. package/dist/api/routes/integrations/crud-patch.d.ts.map +1 -0
  182. package/dist/api/routes/integrations/crud-patch.js +600 -0
  183. package/dist/api/routes/integrations/crud-patch.js.map +1 -0
  184. package/dist/api/routes/integrations/crud.d.ts +16 -0
  185. package/dist/api/routes/integrations/crud.d.ts.map +1 -0
  186. package/dist/api/routes/integrations/crud.js +158 -0
  187. package/dist/api/routes/integrations/crud.js.map +1 -0
  188. package/dist/api/routes/integrations/exec.d.ts +23 -0
  189. package/dist/api/routes/integrations/exec.d.ts.map +1 -0
  190. package/dist/api/routes/integrations/exec.js +356 -0
  191. package/dist/api/routes/integrations/exec.js.map +1 -0
  192. package/dist/api/routes/integrations/index.d.ts +62 -0
  193. package/dist/api/routes/integrations/index.d.ts.map +1 -0
  194. package/dist/api/routes/integrations/index.js +70 -0
  195. package/dist/api/routes/integrations/index.js.map +1 -0
  196. package/dist/api/routes/integrations/integrations/crud.d.ts +16 -0
  197. package/dist/api/routes/integrations/integrations/crud.d.ts.map +1 -0
  198. package/dist/api/routes/integrations/integrations/crud.js +158 -0
  199. package/dist/api/routes/integrations/integrations/crud.js.map +1 -0
  200. package/dist/api/routes/integrations/integrations/index.d.ts +55 -0
  201. package/dist/api/routes/integrations/integrations/index.d.ts.map +1 -0
  202. package/dist/api/routes/integrations/integrations/index.js +65 -0
  203. package/dist/api/routes/integrations/integrations/index.js.map +1 -0
  204. package/dist/api/routes/integrations/integrations/invoke.d.ts +38 -0
  205. package/dist/api/routes/integrations/integrations/invoke.d.ts.map +1 -0
  206. package/dist/api/routes/integrations/integrations/invoke.js +320 -0
  207. package/dist/api/routes/integrations/integrations/invoke.js.map +1 -0
  208. package/dist/api/routes/integrations/integrations/probe.d.ts +21 -0
  209. package/dist/api/routes/integrations/integrations/probe.d.ts.map +1 -0
  210. package/dist/api/routes/integrations/integrations/probe.js +247 -0
  211. package/dist/api/routes/integrations/integrations/probe.js.map +1 -0
  212. package/dist/api/routes/integrations/invoke.d.ts +38 -0
  213. package/dist/api/routes/integrations/invoke.d.ts.map +1 -0
  214. package/dist/api/routes/integrations/invoke.js +320 -0
  215. package/dist/api/routes/integrations/invoke.js.map +1 -0
  216. package/dist/api/routes/integrations/probe.d.ts +21 -0
  217. package/dist/api/routes/integrations/probe.d.ts.map +1 -0
  218. package/dist/api/routes/integrations/probe.js +247 -0
  219. package/dist/api/routes/integrations/probe.js.map +1 -0
  220. package/dist/api/routes/integrations.d.ts.map +1 -1
  221. package/dist/api/routes/integrations.js +65 -13
  222. package/dist/api/routes/integrations.js.map +1 -1
  223. package/dist/api/routes/knowledge.d.ts.map +1 -1
  224. package/dist/api/routes/knowledge.js +13 -2
  225. package/dist/api/routes/knowledge.js.map +1 -1
  226. package/dist/api/routes/mail/_pa_wip_mail/app-password.d.ts +4 -0
  227. package/dist/api/routes/mail/_pa_wip_mail/app-password.d.ts.map +1 -0
  228. package/dist/api/routes/mail/_pa_wip_mail/app-password.js +192 -0
  229. package/dist/api/routes/mail/_pa_wip_mail/app-password.js.map +1 -0
  230. package/dist/api/routes/mail/_pa_wip_mail/body-helpers.d.ts +55 -0
  231. package/dist/api/routes/mail/_pa_wip_mail/body-helpers.d.ts.map +1 -0
  232. package/dist/api/routes/mail/_pa_wip_mail/body-helpers.js +91 -0
  233. package/dist/api/routes/mail/_pa_wip_mail/body-helpers.js.map +1 -0
  234. package/dist/api/routes/mail/_pa_wip_mail/dependencies.d.ts +36 -0
  235. package/dist/api/routes/mail/_pa_wip_mail/dependencies.d.ts.map +1 -0
  236. package/dist/api/routes/mail/_pa_wip_mail/dependencies.js +2 -0
  237. package/dist/api/routes/mail/_pa_wip_mail/dependencies.js.map +1 -0
  238. package/dist/api/routes/mail/_pa_wip_mail/gating.d.ts +45 -0
  239. package/dist/api/routes/mail/_pa_wip_mail/gating.d.ts.map +1 -0
  240. package/dist/api/routes/mail/_pa_wip_mail/gating.js +98 -0
  241. package/dist/api/routes/mail/_pa_wip_mail/gating.js.map +1 -0
  242. package/dist/api/routes/mail/_pa_wip_mail/mail/accounts.d.ts +4 -0
  243. package/dist/api/routes/mail/_pa_wip_mail/mail/accounts.d.ts.map +1 -0
  244. package/dist/api/routes/mail/_pa_wip_mail/mail/accounts.js +289 -0
  245. package/dist/api/routes/mail/_pa_wip_mail/mail/accounts.js.map +1 -0
  246. package/dist/api/routes/mail/_pa_wip_mail/mail/app-password.d.ts +4 -0
  247. package/dist/api/routes/mail/_pa_wip_mail/mail/app-password.d.ts.map +1 -0
  248. package/dist/api/routes/mail/_pa_wip_mail/mail/app-password.js +192 -0
  249. package/dist/api/routes/mail/_pa_wip_mail/mail/app-password.js.map +1 -0
  250. package/dist/api/routes/mail/_pa_wip_mail/mail/body-helpers.d.ts +55 -0
  251. package/dist/api/routes/mail/_pa_wip_mail/mail/body-helpers.d.ts.map +1 -0
  252. package/dist/api/routes/mail/_pa_wip_mail/mail/body-helpers.js +91 -0
  253. package/dist/api/routes/mail/_pa_wip_mail/mail/body-helpers.js.map +1 -0
  254. package/dist/api/routes/mail/_pa_wip_mail/mail/dependencies.d.ts +36 -0
  255. package/dist/api/routes/mail/_pa_wip_mail/mail/dependencies.d.ts.map +1 -0
  256. package/dist/api/routes/mail/_pa_wip_mail/mail/dependencies.js +2 -0
  257. package/dist/api/routes/mail/_pa_wip_mail/mail/dependencies.js.map +1 -0
  258. package/dist/api/routes/mail/_pa_wip_mail/mail/drafts.d.ts +5 -0
  259. package/dist/api/routes/mail/_pa_wip_mail/mail/drafts.d.ts.map +1 -0
  260. package/dist/api/routes/mail/_pa_wip_mail/mail/drafts.js +139 -0
  261. package/dist/api/routes/mail/_pa_wip_mail/mail/drafts.js.map +1 -0
  262. package/dist/api/routes/mail/_pa_wip_mail/mail/gating.d.ts +45 -0
  263. package/dist/api/routes/mail/_pa_wip_mail/mail/gating.d.ts.map +1 -0
  264. package/dist/api/routes/mail/_pa_wip_mail/mail/gating.js +98 -0
  265. package/dist/api/routes/mail/_pa_wip_mail/mail/gating.js.map +1 -0
  266. package/dist/api/routes/mail/_pa_wip_mail/mail/index.d.ts +18 -0
  267. package/dist/api/routes/mail/_pa_wip_mail/mail/index.d.ts.map +1 -0
  268. package/dist/api/routes/mail/_pa_wip_mail/mail/index.js +40 -0
  269. package/dist/api/routes/mail/_pa_wip_mail/mail/index.js.map +1 -0
  270. package/dist/api/routes/mail/_pa_wip_mail/mail/messages.d.ts +15 -0
  271. package/dist/api/routes/mail/_pa_wip_mail/mail/messages.d.ts.map +1 -0
  272. package/dist/api/routes/mail/_pa_wip_mail/mail/messages.js +239 -0
  273. package/dist/api/routes/mail/_pa_wip_mail/mail/messages.js.map +1 -0
  274. package/dist/api/routes/mail/_pa_wip_mail/mail/outlook-config.d.ts +4 -0
  275. package/dist/api/routes/mail/_pa_wip_mail/mail/outlook-config.d.ts.map +1 -0
  276. package/dist/api/routes/mail/_pa_wip_mail/mail/outlook-config.js +73 -0
  277. package/dist/api/routes/mail/_pa_wip_mail/mail/outlook-config.js.map +1 -0
  278. package/dist/api/routes/mail/_pa_wip_mail/mail/provider-resolver.d.ts +64 -0
  279. package/dist/api/routes/mail/_pa_wip_mail/mail/provider-resolver.d.ts.map +1 -0
  280. package/dist/api/routes/mail/_pa_wip_mail/mail/provider-resolver.js +286 -0
  281. package/dist/api/routes/mail/_pa_wip_mail/mail/provider-resolver.js.map +1 -0
  282. package/dist/api/routes/mail/_pa_wip_mail/mail/providers.d.ts +4 -0
  283. package/dist/api/routes/mail/_pa_wip_mail/mail/providers.d.ts.map +1 -0
  284. package/dist/api/routes/mail/_pa_wip_mail/mail/providers.js +73 -0
  285. package/dist/api/routes/mail/_pa_wip_mail/mail/providers.js.map +1 -0
  286. package/dist/api/routes/mail/_pa_wip_mail/mail/tags-folders.d.ts +5 -0
  287. package/dist/api/routes/mail/_pa_wip_mail/mail/tags-folders.d.ts.map +1 -0
  288. package/dist/api/routes/mail/_pa_wip_mail/mail/tags-folders.js +35 -0
  289. package/dist/api/routes/mail/_pa_wip_mail/mail/tags-folders.js.map +1 -0
  290. package/dist/api/routes/mail/_pa_wip_mail/mail/validators.d.ts +23 -0
  291. package/dist/api/routes/mail/_pa_wip_mail/mail/validators.d.ts.map +1 -0
  292. package/dist/api/routes/mail/_pa_wip_mail/mail/validators.js +131 -0
  293. package/dist/api/routes/mail/_pa_wip_mail/mail/validators.js.map +1 -0
  294. package/dist/api/routes/mail/_pa_wip_mail/provider-resolver.d.ts +64 -0
  295. package/dist/api/routes/mail/_pa_wip_mail/provider-resolver.d.ts.map +1 -0
  296. package/dist/api/routes/mail/_pa_wip_mail/provider-resolver.js +286 -0
  297. package/dist/api/routes/mail/_pa_wip_mail/provider-resolver.js.map +1 -0
  298. package/dist/api/routes/mail/_pa_wip_mail/search-health.d.ts +4 -0
  299. package/dist/api/routes/mail/_pa_wip_mail/search-health.d.ts.map +1 -0
  300. package/dist/api/routes/mail/_pa_wip_mail/search-health.js +131 -0
  301. package/dist/api/routes/mail/_pa_wip_mail/search-health.js.map +1 -0
  302. package/dist/api/routes/mail/_pa_wip_mail/validators.d.ts +23 -0
  303. package/dist/api/routes/mail/_pa_wip_mail/validators.d.ts.map +1 -0
  304. package/dist/api/routes/mail/_pa_wip_mail/validators.js +131 -0
  305. package/dist/api/routes/mail/_pa_wip_mail/validators.js.map +1 -0
  306. package/dist/api/routes/mail/accounts.d.ts +4 -0
  307. package/dist/api/routes/mail/accounts.d.ts.map +1 -0
  308. package/dist/api/routes/mail/accounts.js +289 -0
  309. package/dist/api/routes/mail/accounts.js.map +1 -0
  310. package/dist/api/routes/mail/app-password.d.ts +4 -0
  311. package/dist/api/routes/mail/app-password.d.ts.map +1 -0
  312. package/dist/api/routes/mail/app-password.js +192 -0
  313. package/dist/api/routes/mail/app-password.js.map +1 -0
  314. package/dist/api/routes/mail/body-helpers.d.ts +56 -0
  315. package/dist/api/routes/mail/body-helpers.d.ts.map +1 -0
  316. package/dist/api/routes/mail/body-helpers.js +91 -0
  317. package/dist/api/routes/mail/body-helpers.js.map +1 -0
  318. package/dist/api/routes/mail/dependencies.d.ts +36 -0
  319. package/dist/api/routes/mail/dependencies.d.ts.map +1 -0
  320. package/dist/api/routes/mail/dependencies.js +2 -0
  321. package/dist/api/routes/mail/dependencies.js.map +1 -0
  322. package/dist/api/routes/mail/drafts.d.ts +5 -0
  323. package/dist/api/routes/mail/drafts.d.ts.map +1 -0
  324. package/dist/api/routes/mail/drafts.js +139 -0
  325. package/dist/api/routes/mail/drafts.js.map +1 -0
  326. package/dist/api/routes/mail/gating.d.ts +45 -0
  327. package/dist/api/routes/mail/gating.d.ts.map +1 -0
  328. package/dist/api/routes/mail/gating.js +99 -0
  329. package/dist/api/routes/mail/gating.js.map +1 -0
  330. package/dist/api/routes/mail/index.d.ts +18 -0
  331. package/dist/api/routes/mail/index.d.ts.map +1 -0
  332. package/dist/api/routes/mail/index.js +40 -0
  333. package/dist/api/routes/mail/index.js.map +1 -0
  334. package/dist/api/routes/mail/messages.d.ts +15 -0
  335. package/dist/api/routes/mail/messages.d.ts.map +1 -0
  336. package/dist/api/routes/mail/messages.js +239 -0
  337. package/dist/api/routes/mail/messages.js.map +1 -0
  338. package/dist/api/routes/mail/outlook-config.d.ts +4 -0
  339. package/dist/api/routes/mail/outlook-config.d.ts.map +1 -0
  340. package/dist/api/routes/mail/outlook-config.js +73 -0
  341. package/dist/api/routes/mail/outlook-config.js.map +1 -0
  342. package/dist/api/routes/mail/provider-resolver.d.ts +64 -0
  343. package/dist/api/routes/mail/provider-resolver.d.ts.map +1 -0
  344. package/dist/api/routes/mail/provider-resolver.js +286 -0
  345. package/dist/api/routes/mail/provider-resolver.js.map +1 -0
  346. package/dist/api/routes/mail/providers.d.ts +4 -0
  347. package/dist/api/routes/mail/providers.d.ts.map +1 -0
  348. package/dist/api/routes/mail/providers.js +73 -0
  349. package/dist/api/routes/mail/providers.js.map +1 -0
  350. package/dist/api/routes/mail/search-health.d.ts +4 -0
  351. package/dist/api/routes/mail/search-health.d.ts.map +1 -0
  352. package/dist/api/routes/mail/search-health.js +131 -0
  353. package/dist/api/routes/mail/search-health.js.map +1 -0
  354. package/dist/api/routes/mail/tags-folders.d.ts +5 -0
  355. package/dist/api/routes/mail/tags-folders.d.ts.map +1 -0
  356. package/dist/api/routes/mail/tags-folders.js +35 -0
  357. package/dist/api/routes/mail/tags-folders.js.map +1 -0
  358. package/dist/api/routes/mail/validators.d.ts +23 -0
  359. package/dist/api/routes/mail/validators.d.ts.map +1 -0
  360. package/dist/api/routes/mail/validators.js +131 -0
  361. package/dist/api/routes/mail/validators.js.map +1 -0
  362. package/dist/api/routes/mail.d.ts.map +1 -1
  363. package/dist/api/routes/mail.js +259 -67
  364. package/dist/api/routes/mail.js.map +1 -1
  365. package/dist/api/routes/managed-tasks.d.ts.map +1 -1
  366. package/dist/api/routes/managed-tasks.js +142 -54
  367. package/dist/api/routes/managed-tasks.js.map +1 -1
  368. package/dist/api/routes/mcp.d.ts.map +1 -1
  369. package/dist/api/routes/mcp.js +115 -47
  370. package/dist/api/routes/mcp.js.map +1 -1
  371. package/dist/api/routes/metrics.d.ts +1 -1
  372. package/dist/api/routes/metrics.js +2 -2
  373. package/dist/api/routes/notion.d.ts.map +1 -1
  374. package/dist/api/routes/notion.js +230 -54
  375. package/dist/api/routes/notion.js.map +1 -1
  376. package/dist/api/routes/observations.d.ts.map +1 -1
  377. package/dist/api/routes/observations.js +40 -169
  378. package/dist/api/routes/observations.js.map +1 -1
  379. package/dist/api/routes/obsidian.d.ts.map +1 -1
  380. package/dist/api/routes/obsidian.js +193 -32
  381. package/dist/api/routes/obsidian.js.map +1 -1
  382. package/dist/api/routes/profile-questions.d.ts.map +1 -1
  383. package/dist/api/routes/profile-questions.js +19 -3
  384. package/dist/api/routes/profile-questions.js.map +1 -1
  385. package/dist/api/routes/receipts.d.ts.map +1 -1
  386. package/dist/api/routes/receipts.js +64 -24
  387. package/dist/api/routes/receipts.js.map +1 -1
  388. package/dist/api/routes/recurring-schedules.d.ts.map +1 -1
  389. package/dist/api/routes/recurring-schedules.js +243 -13
  390. package/dist/api/routes/recurring-schedules.js.map +1 -1
  391. package/dist/api/routes/repositories.d.ts.map +1 -1
  392. package/dist/api/routes/repositories.js +278 -104
  393. package/dist/api/routes/repositories.js.map +1 -1
  394. package/dist/api/routes/schedule-model-resolver.d.ts +153 -0
  395. package/dist/api/routes/schedule-model-resolver.d.ts.map +1 -0
  396. package/dist/api/routes/schedule-model-resolver.js +282 -0
  397. package/dist/api/routes/schedule-model-resolver.js.map +1 -0
  398. package/dist/api/routes/schedule-options.d.ts +25 -0
  399. package/dist/api/routes/schedule-options.d.ts.map +1 -0
  400. package/dist/api/routes/schedule-options.js +77 -0
  401. package/dist/api/routes/schedule-options.js.map +1 -0
  402. package/dist/api/routes/schedule-validation.d.ts +146 -0
  403. package/dist/api/routes/schedule-validation.d.ts.map +1 -0
  404. package/dist/api/routes/schedule-validation.js +153 -0
  405. package/dist/api/routes/schedule-validation.js.map +1 -0
  406. package/dist/api/routes/setup.d.ts.map +1 -1
  407. package/dist/api/routes/setup.js +100 -26
  408. package/dist/api/routes/setup.js.map +1 -1
  409. package/dist/api/routes/skills.d.ts.map +1 -1
  410. package/dist/api/routes/skills.js +81 -30
  411. package/dist/api/routes/skills.js.map +1 -1
  412. package/dist/api/routes/sot-bindings.d.ts.map +1 -1
  413. package/dist/api/routes/sot-bindings.js +46 -11
  414. package/dist/api/routes/sot-bindings.js.map +1 -1
  415. package/dist/api/routes/sse.d.ts.map +1 -1
  416. package/dist/api/routes/sse.js +6 -1
  417. package/dist/api/routes/sse.js.map +1 -1
  418. package/dist/api/routes/system.d.ts.map +1 -1
  419. package/dist/api/routes/system.js +15 -2
  420. package/dist/api/routes/system.js.map +1 -1
  421. package/dist/api/routes/travel-bookings.d.ts.map +1 -1
  422. package/dist/api/routes/travel-bookings.js +26 -9
  423. package/dist/api/routes/travel-bookings.js.map +1 -1
  424. package/dist/api/routes/travel-time.d.ts.map +1 -1
  425. package/dist/api/routes/travel-time.js +50 -10
  426. package/dist/api/routes/travel-time.js.map +1 -1
  427. package/dist/api/routes/wiki.d.ts.map +1 -1
  428. package/dist/api/routes/wiki.js +49 -8
  429. package/dist/api/routes/wiki.js.map +1 -1
  430. package/dist/api/server.d.ts +15 -3
  431. package/dist/api/server.d.ts.map +1 -1
  432. package/dist/api/server.js +32 -10
  433. package/dist/api/server.js.map +1 -1
  434. package/dist/bootstrap/adapters.d.ts.map +1 -1
  435. package/dist/bootstrap/adapters.js +7 -4
  436. package/dist/bootstrap/adapters.js.map +1 -1
  437. package/dist/bootstrap/api.d.ts +205 -0
  438. package/dist/bootstrap/api.d.ts.map +1 -0
  439. package/dist/bootstrap/api.js +443 -0
  440. package/dist/bootstrap/api.js.map +1 -0
  441. package/dist/bootstrap/db.d.ts +119 -0
  442. package/dist/bootstrap/db.d.ts.map +1 -0
  443. package/dist/bootstrap/db.js +294 -0
  444. package/dist/bootstrap/db.js.map +1 -0
  445. package/dist/bootstrap/event-pipeline.d.ts +308 -0
  446. package/dist/bootstrap/event-pipeline.d.ts.map +1 -0
  447. package/dist/bootstrap/event-pipeline.js +704 -0
  448. package/dist/bootstrap/event-pipeline.js.map +1 -0
  449. package/dist/bootstrap/observers.d.ts +148 -0
  450. package/dist/bootstrap/observers.d.ts.map +1 -0
  451. package/dist/bootstrap/observers.js +558 -0
  452. package/dist/bootstrap/observers.js.map +1 -0
  453. package/dist/bootstrap/schedule-helpers.d.ts +122 -0
  454. package/dist/bootstrap/schedule-helpers.d.ts.map +1 -1
  455. package/dist/bootstrap/schedule-helpers.js +202 -4
  456. package/dist/bootstrap/schedule-helpers.js.map +1 -1
  457. package/dist/config.d.ts.map +1 -1
  458. package/dist/config.js +20 -3
  459. package/dist/config.js.map +1 -1
  460. package/dist/core/abort-utils.d.ts +14 -0
  461. package/dist/core/abort-utils.d.ts.map +1 -0
  462. package/dist/core/abort-utils.js +36 -0
  463. package/dist/core/abort-utils.js.map +1 -0
  464. package/dist/core/agent-core.d.ts +22 -3
  465. package/dist/core/agent-core.d.ts.map +1 -1
  466. package/dist/core/agent-core.js +3 -1
  467. package/dist/core/agent-core.js.map +1 -1
  468. package/dist/core/backends/auth-health-monitor.js +2 -3
  469. package/dist/core/backends/auth-health-monitor.js.map +1 -1
  470. package/dist/core/backends/backend-router.d.ts +11 -1
  471. package/dist/core/backends/backend-router.d.ts.map +1 -1
  472. package/dist/core/backends/backend-router.js +97 -2
  473. package/dist/core/backends/backend-router.js.map +1 -1
  474. package/dist/core/backends/claude-code-core.d.ts +51 -0
  475. package/dist/core/backends/claude-code-core.d.ts.map +1 -1
  476. package/dist/core/backends/claude-code-core.js +134 -11
  477. package/dist/core/backends/claude-code-core.js.map +1 -1
  478. package/dist/core/backends/claude-tool-collection.js +1 -1
  479. package/dist/core/backends/codex-core.d.ts +13 -1
  480. package/dist/core/backends/codex-core.d.ts.map +1 -1
  481. package/dist/core/backends/codex-core.js +436 -22
  482. package/dist/core/backends/codex-core.js.map +1 -1
  483. package/dist/core/backends/gemini-cli-core.d.ts +5 -1
  484. package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
  485. package/dist/core/backends/gemini-cli-core.js +298 -15
  486. package/dist/core/backends/gemini-cli-core.js.map +1 -1
  487. package/dist/core/backends/install-methods.d.ts.map +1 -1
  488. package/dist/core/backends/install-methods.js +22 -0
  489. package/dist/core/backends/install-methods.js.map +1 -1
  490. package/dist/core/backends/model-registry.d.ts +9 -4
  491. package/dist/core/backends/model-registry.d.ts.map +1 -1
  492. package/dist/core/backends/model-registry.js +153 -23
  493. package/dist/core/backends/model-registry.js.map +1 -1
  494. package/dist/core/backends/native-skill-discovery-probe.d.ts +80 -0
  495. package/dist/core/backends/native-skill-discovery-probe.d.ts.map +1 -0
  496. package/dist/core/backends/native-skill-discovery-probe.js +175 -0
  497. package/dist/core/backends/native-skill-discovery-probe.js.map +1 -0
  498. package/dist/core/backends/opencode-basic-auth-fetch.d.ts +27 -0
  499. package/dist/core/backends/opencode-basic-auth-fetch.d.ts.map +1 -0
  500. package/dist/core/backends/opencode-basic-auth-fetch.js +40 -0
  501. package/dist/core/backends/opencode-basic-auth-fetch.js.map +1 -0
  502. package/dist/core/backends/opencode-config-builder.d.ts +86 -0
  503. package/dist/core/backends/opencode-config-builder.d.ts.map +1 -0
  504. package/dist/core/backends/opencode-config-builder.js +172 -0
  505. package/dist/core/backends/opencode-config-builder.js.map +1 -0
  506. package/dist/core/backends/opencode-core.d.ts +316 -0
  507. package/dist/core/backends/opencode-core.d.ts.map +1 -0
  508. package/dist/core/backends/opencode-core.js +1502 -0
  509. package/dist/core/backends/opencode-core.js.map +1 -0
  510. package/dist/core/backends/opencode-event-mapper.d.ts +133 -0
  511. package/dist/core/backends/opencode-event-mapper.d.ts.map +1 -0
  512. package/dist/core/backends/opencode-event-mapper.js +198 -0
  513. package/dist/core/backends/opencode-event-mapper.js.map +1 -0
  514. package/dist/core/backends/opencode-mcp.d.ts +82 -0
  515. package/dist/core/backends/opencode-mcp.d.ts.map +1 -0
  516. package/dist/core/backends/opencode-mcp.js +165 -0
  517. package/dist/core/backends/opencode-mcp.js.map +1 -0
  518. package/dist/core/backends/opencode-server-manager.d.ts +114 -0
  519. package/dist/core/backends/opencode-server-manager.d.ts.map +1 -0
  520. package/dist/core/backends/opencode-server-manager.js +222 -0
  521. package/dist/core/backends/opencode-server-manager.js.map +1 -0
  522. package/dist/core/backends/opencode-types.d.ts +46 -0
  523. package/dist/core/backends/opencode-types.d.ts.map +1 -0
  524. package/dist/core/backends/opencode-types.js +14 -0
  525. package/dist/core/backends/opencode-types.js.map +1 -0
  526. package/dist/core/backends/plan-presets.d.ts +18 -5
  527. package/dist/core/backends/plan-presets.d.ts.map +1 -1
  528. package/dist/core/backends/plan-presets.js +144 -23
  529. package/dist/core/backends/plan-presets.js.map +1 -1
  530. package/dist/core/backends/process-config-cascade.d.ts +35 -0
  531. package/dist/core/backends/process-config-cascade.d.ts.map +1 -1
  532. package/dist/core/backends/process-config-cascade.js +35 -1
  533. package/dist/core/backends/process-config-cascade.js.map +1 -1
  534. package/dist/core/backends/prompt-utils.d.ts.map +1 -1
  535. package/dist/core/backends/prompt-utils.js +0 -2
  536. package/dist/core/backends/prompt-utils.js.map +1 -1
  537. package/dist/core/backends/quota-reset-hints.d.ts +44 -0
  538. package/dist/core/backends/quota-reset-hints.d.ts.map +1 -0
  539. package/dist/core/backends/quota-reset-hints.js +117 -0
  540. package/dist/core/backends/quota-reset-hints.js.map +1 -0
  541. package/dist/core/bang-commands/commands-close.d.ts +24 -0
  542. package/dist/core/bang-commands/commands-close.d.ts.map +1 -0
  543. package/dist/core/bang-commands/commands-close.js +24 -0
  544. package/dist/core/bang-commands/commands-close.js.map +1 -0
  545. package/dist/core/bang-commands/commands-cost.d.ts.map +1 -1
  546. package/dist/core/bang-commands/commands-cost.js +13 -0
  547. package/dist/core/bang-commands/commands-cost.js.map +1 -1
  548. package/dist/core/bang-commands/commands-help.d.ts.map +1 -1
  549. package/dist/core/bang-commands/commands-help.js +44 -5
  550. package/dist/core/bang-commands/commands-help.js.map +1 -1
  551. package/dist/core/bang-commands/commands-report.d.ts.map +1 -1
  552. package/dist/core/bang-commands/commands-report.js +1 -0
  553. package/dist/core/bang-commands/commands-report.js.map +1 -1
  554. package/dist/core/bang-commands/commands-stop-start.d.ts.map +1 -1
  555. package/dist/core/bang-commands/commands-stop-start.js +2 -0
  556. package/dist/core/bang-commands/commands-stop-start.js.map +1 -1
  557. package/dist/core/bang-commands/commands-wiki.d.ts.map +1 -1
  558. package/dist/core/bang-commands/commands-wiki.js +12 -1
  559. package/dist/core/bang-commands/commands-wiki.js.map +1 -1
  560. package/dist/core/bang-commands/format-utils.d.ts +13 -1
  561. package/dist/core/bang-commands/format-utils.d.ts.map +1 -1
  562. package/dist/core/bang-commands/format-utils.js +21 -2
  563. package/dist/core/bang-commands/format-utils.js.map +1 -1
  564. package/dist/core/bang-commands/index.d.ts +1 -0
  565. package/dist/core/bang-commands/index.d.ts.map +1 -1
  566. package/dist/core/bang-commands/index.js +3 -0
  567. package/dist/core/bang-commands/index.js.map +1 -1
  568. package/dist/core/bang-commands/registry.d.ts +50 -0
  569. package/dist/core/bang-commands/registry.d.ts.map +1 -1
  570. package/dist/core/bang-commands/registry.js +164 -19
  571. package/dist/core/bang-commands/registry.js.map +1 -1
  572. package/dist/core/channel-timeline.d.ts +18 -1
  573. package/dist/core/channel-timeline.d.ts.map +1 -1
  574. package/dist/core/channel-timeline.js +44 -0
  575. package/dist/core/channel-timeline.js.map +1 -1
  576. package/dist/core/context/activity-view-runner.js +9 -1
  577. package/dist/core/context/activity-view-runner.js.map +1 -1
  578. package/dist/core/context/default-schedules-runner.js +44 -4
  579. package/dist/core/context/default-schedules-runner.js.map +1 -1
  580. package/dist/core/context/domain-index-runner.js +9 -1
  581. package/dist/core/context/domain-index-runner.js.map +1 -1
  582. package/dist/core/context/entity-source-rename.d.ts.map +1 -1
  583. package/dist/core/context/entity-source-rename.js +9 -1
  584. package/dist/core/context/entity-source-rename.js.map +1 -1
  585. package/dist/core/context/policy-index-runner.js +9 -1
  586. package/dist/core/context/policy-index-runner.js.map +1 -1
  587. package/dist/core/context/reconciler-runner.js +9 -1
  588. package/dist/core/context/reconciler-runner.js.map +1 -1
  589. package/dist/core/context-builder.d.ts +97 -2
  590. package/dist/core/context-builder.d.ts.map +1 -1
  591. package/dist/core/context-builder.js +303 -30
  592. package/dist/core/context-builder.js.map +1 -1
  593. package/dist/core/context-frontmatter.d.ts +6 -0
  594. package/dist/core/context-frontmatter.d.ts.map +1 -1
  595. package/dist/core/context-frontmatter.js +120 -8
  596. package/dist/core/context-frontmatter.js.map +1 -1
  597. package/dist/core/context-health.js +21 -9
  598. package/dist/core/context-health.js.map +1 -1
  599. package/dist/core/context-validation/_pa_wip_context_validation/index.d.ts +19 -0
  600. package/dist/core/context-validation/_pa_wip_context_validation/index.d.ts.map +1 -0
  601. package/dist/core/context-validation/_pa_wip_context_validation/index.js +19 -0
  602. package/dist/core/context-validation/_pa_wip_context_validation/index.js.map +1 -0
  603. package/dist/core/context-validation/_pa_wip_context_validation/prepare-write.d.ts +94 -0
  604. package/dist/core/context-validation/_pa_wip_context_validation/prepare-write.d.ts.map +1 -0
  605. package/dist/core/context-validation/_pa_wip_context_validation/prepare-write.js +130 -0
  606. package/dist/core/context-validation/_pa_wip_context_validation/prepare-write.js.map +1 -0
  607. package/dist/core/context-validation/_pa_wip_context_validation/routine-rulebook.d.ts +60 -0
  608. package/dist/core/context-validation/_pa_wip_context_validation/routine-rulebook.d.ts.map +1 -0
  609. package/dist/core/context-validation/_pa_wip_context_validation/routine-rulebook.js +156 -0
  610. package/dist/core/context-validation/_pa_wip_context_validation/routine-rulebook.js.map +1 -0
  611. package/dist/core/context-validation/_pa_wip_context_validation/section.d.ts +41 -0
  612. package/dist/core/context-validation/_pa_wip_context_validation/section.d.ts.map +1 -0
  613. package/dist/core/context-validation/_pa_wip_context_validation/section.js +82 -0
  614. package/dist/core/context-validation/_pa_wip_context_validation/section.js.map +1 -0
  615. package/dist/core/context-validation/_pa_wip_context_validation/snapshot-debounce.d.ts +52 -0
  616. package/dist/core/context-validation/_pa_wip_context_validation/snapshot-debounce.d.ts.map +1 -0
  617. package/dist/core/context-validation/_pa_wip_context_validation/snapshot-debounce.js +110 -0
  618. package/dist/core/context-validation/_pa_wip_context_validation/snapshot-debounce.js.map +1 -0
  619. package/dist/core/context-validation/_pa_wip_context_validation/today.d.ts +85 -0
  620. package/dist/core/context-validation/_pa_wip_context_validation/today.d.ts.map +1 -0
  621. package/dist/core/context-validation/_pa_wip_context_validation/today.js +162 -0
  622. package/dist/core/context-validation/_pa_wip_context_validation/today.js.map +1 -0
  623. package/dist/core/context-validation/index.d.ts +19 -0
  624. package/dist/core/context-validation/index.d.ts.map +1 -0
  625. package/dist/core/context-validation/index.js +19 -0
  626. package/dist/core/context-validation/index.js.map +1 -0
  627. package/dist/core/context-validation/prepare-write.d.ts +95 -0
  628. package/dist/core/context-validation/prepare-write.d.ts.map +1 -0
  629. package/dist/core/context-validation/prepare-write.js +135 -0
  630. package/dist/core/context-validation/prepare-write.js.map +1 -0
  631. package/dist/core/context-validation/routine-rulebook.d.ts +60 -0
  632. package/dist/core/context-validation/routine-rulebook.d.ts.map +1 -0
  633. package/dist/core/context-validation/routine-rulebook.js +156 -0
  634. package/dist/core/context-validation/routine-rulebook.js.map +1 -0
  635. package/dist/core/context-validation/section.d.ts +41 -0
  636. package/dist/core/context-validation/section.d.ts.map +1 -0
  637. package/dist/core/context-validation/section.js +82 -0
  638. package/dist/core/context-validation/section.js.map +1 -0
  639. package/dist/core/context-validation/snapshot-debounce.d.ts +52 -0
  640. package/dist/core/context-validation/snapshot-debounce.d.ts.map +1 -0
  641. package/dist/core/context-validation/snapshot-debounce.js +110 -0
  642. package/dist/core/context-validation/snapshot-debounce.js.map +1 -0
  643. package/dist/core/context-validation/today.d.ts +85 -0
  644. package/dist/core/context-validation/today.d.ts.map +1 -0
  645. package/dist/core/context-validation/today.js +168 -0
  646. package/dist/core/context-validation/today.js.map +1 -0
  647. package/dist/core/daemon-api-cli.d.ts +6 -5
  648. package/dist/core/daemon-api-cli.d.ts.map +1 -1
  649. package/dist/core/daemon-api-cli.js +73 -32
  650. package/dist/core/daemon-api-cli.js.map +1 -1
  651. package/dist/core/dispatcher-error-handling.d.ts +13 -0
  652. package/dist/core/dispatcher-error-handling.d.ts.map +1 -1
  653. package/dist/core/dispatcher-error-handling.js +69 -0
  654. package/dist/core/dispatcher-error-handling.js.map +1 -1
  655. package/dist/core/dispatcher-hourly-check.d.ts +73 -1
  656. package/dist/core/dispatcher-hourly-check.d.ts.map +1 -1
  657. package/dist/core/dispatcher-hourly-check.js +249 -151
  658. package/dist/core/dispatcher-hourly-check.js.map +1 -1
  659. package/dist/core/dispatcher-message-handler.d.ts +11 -1
  660. package/dist/core/dispatcher-message-handler.d.ts.map +1 -1
  661. package/dist/core/dispatcher-message-handler.js +165 -47
  662. package/dist/core/dispatcher-message-handler.js.map +1 -1
  663. package/dist/core/dispatcher-morning-routine.d.ts +38 -30
  664. package/dist/core/dispatcher-morning-routine.d.ts.map +1 -1
  665. package/dist/core/dispatcher-morning-routine.js +162 -104
  666. package/dist/core/dispatcher-morning-routine.js.map +1 -1
  667. package/dist/core/dispatcher-prompt.d.ts +4 -1
  668. package/dist/core/dispatcher-prompt.d.ts.map +1 -1
  669. package/dist/core/dispatcher-prompt.js +18 -2
  670. package/dist/core/dispatcher-prompt.js.map +1 -1
  671. package/dist/core/dispatcher-repository-helpers.d.ts.map +1 -1
  672. package/dist/core/dispatcher-repository-helpers.js +5 -1
  673. package/dist/core/dispatcher-repository-helpers.js.map +1 -1
  674. package/dist/core/dispatcher-result-processor.d.ts.map +1 -1
  675. package/dist/core/dispatcher-result-processor.js +9 -4
  676. package/dist/core/dispatcher-result-processor.js.map +1 -1
  677. package/dist/core/dispatcher-scheduled-tasks.d.ts +1 -1
  678. package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -1
  679. package/dist/core/dispatcher-scheduled-tasks.js +79 -16
  680. package/dist/core/dispatcher-scheduled-tasks.js.map +1 -1
  681. package/dist/core/dispatcher-types.d.ts +84 -12
  682. package/dist/core/dispatcher-types.d.ts.map +1 -1
  683. package/dist/core/dispatcher-types.js.map +1 -1
  684. package/dist/core/dispatcher.d.ts +50 -1
  685. package/dist/core/dispatcher.d.ts.map +1 -1
  686. package/dist/core/dispatcher.js +143 -8
  687. package/dist/core/dispatcher.js.map +1 -1
  688. package/dist/core/dm-freshness-metrics.d.ts +6 -5
  689. package/dist/core/dm-freshness-metrics.d.ts.map +1 -1
  690. package/dist/core/dm-freshness-metrics.js +7 -6
  691. package/dist/core/dm-freshness-metrics.js.map +1 -1
  692. package/dist/core/evening-review-verify.d.ts +164 -0
  693. package/dist/core/evening-review-verify.d.ts.map +1 -0
  694. package/dist/core/evening-review-verify.js +637 -0
  695. package/dist/core/evening-review-verify.js.map +1 -0
  696. package/dist/core/fetch-window-prompt-loader.d.ts +47 -0
  697. package/dist/core/fetch-window-prompt-loader.d.ts.map +1 -0
  698. package/dist/core/fetch-window-prompt-loader.js +72 -0
  699. package/dist/core/fetch-window-prompt-loader.js.map +1 -0
  700. package/dist/core/management-md.d.ts.map +1 -1
  701. package/dist/core/management-md.js +23 -9
  702. package/dist/core/management-md.js.map +1 -1
  703. package/dist/core/management-registry.d.ts +13 -21
  704. package/dist/core/management-registry.d.ts.map +1 -1
  705. package/dist/core/management-registry.js +27 -48
  706. package/dist/core/management-registry.js.map +1 -1
  707. package/dist/core/metrics.d.ts +88 -1
  708. package/dist/core/metrics.d.ts.map +1 -1
  709. package/dist/core/metrics.js +78 -2
  710. package/dist/core/metrics.js.map +1 -1
  711. package/dist/core/morning/agent-journal-appender.d.ts +197 -0
  712. package/dist/core/morning/agent-journal-appender.d.ts.map +1 -0
  713. package/dist/core/morning/agent-journal-appender.js +458 -0
  714. package/dist/core/morning/agent-journal-appender.js.map +1 -0
  715. package/dist/core/morning/handoff-parser.d.ts +45 -0
  716. package/dist/core/morning/handoff-parser.d.ts.map +1 -0
  717. package/dist/core/morning/handoff-parser.js +117 -0
  718. package/dist/core/morning/handoff-parser.js.map +1 -0
  719. package/dist/core/morning/journal-skeleton-builder.d.ts +157 -0
  720. package/dist/core/morning/journal-skeleton-builder.d.ts.map +1 -0
  721. package/dist/core/morning/journal-skeleton-builder.js +303 -0
  722. package/dist/core/morning/journal-skeleton-builder.js.map +1 -0
  723. package/dist/core/morning/orchestrator.d.ts +312 -0
  724. package/dist/core/morning/orchestrator.d.ts.map +1 -0
  725. package/dist/core/morning/orchestrator.js +827 -0
  726. package/dist/core/morning/orchestrator.js.map +1 -0
  727. package/dist/core/morning/parent-audit-emitter.d.ts +82 -0
  728. package/dist/core/morning/parent-audit-emitter.d.ts.map +1 -0
  729. package/dist/core/morning/parent-audit-emitter.js +120 -0
  730. package/dist/core/morning/parent-audit-emitter.js.map +1 -0
  731. package/dist/core/morning/roadmap-skeleton-builder.d.ts +159 -0
  732. package/dist/core/morning/roadmap-skeleton-builder.d.ts.map +1 -0
  733. package/dist/core/morning/roadmap-skeleton-builder.js +338 -0
  734. package/dist/core/morning/roadmap-skeleton-builder.js.map +1 -0
  735. package/dist/core/output-language-policy.js +1 -1
  736. package/dist/core/output-language-policy.js.map +1 -1
  737. package/dist/core/policy-files.d.ts +19 -2
  738. package/dist/core/policy-files.d.ts.map +1 -1
  739. package/dist/core/policy-files.js +65 -7
  740. package/dist/core/policy-files.js.map +1 -1
  741. package/dist/core/pre-pass-freshness.d.ts +28 -0
  742. package/dist/core/pre-pass-freshness.d.ts.map +1 -0
  743. package/dist/core/pre-pass-freshness.js +10 -0
  744. package/dist/core/pre-pass-freshness.js.map +1 -0
  745. package/dist/core/previous-week-digest.d.ts +130 -0
  746. package/dist/core/previous-week-digest.d.ts.map +1 -0
  747. package/dist/core/previous-week-digest.js +257 -0
  748. package/dist/core/previous-week-digest.js.map +1 -0
  749. package/dist/core/prompts.js +3 -3
  750. package/dist/core/prompts.js.map +1 -1
  751. package/dist/core/quiet-hours-sync.d.ts.map +1 -1
  752. package/dist/core/quiet-hours-sync.js +7 -0
  753. package/dist/core/quiet-hours-sync.js.map +1 -1
  754. package/dist/core/recurrence.d.ts +13 -0
  755. package/dist/core/recurrence.d.ts.map +1 -1
  756. package/dist/core/recurrence.js +108 -13
  757. package/dist/core/recurrence.js.map +1 -1
  758. package/dist/core/release-assets.d.ts +21 -1
  759. package/dist/core/release-assets.d.ts.map +1 -1
  760. package/dist/core/release-assets.js +58 -3
  761. package/dist/core/release-assets.js.map +1 -1
  762. package/dist/core/repository-management-docs.d.ts.map +1 -1
  763. package/dist/core/repository-management-docs.js +14 -4
  764. package/dist/core/repository-management-docs.js.map +1 -1
  765. package/dist/core/review-context.d.ts.map +1 -1
  766. package/dist/core/review-context.js +29 -1
  767. package/dist/core/review-context.js.map +1 -1
  768. package/dist/core/roadmap-maintenance.d.ts +213 -0
  769. package/dist/core/roadmap-maintenance.d.ts.map +1 -0
  770. package/dist/core/roadmap-maintenance.js +706 -0
  771. package/dist/core/roadmap-maintenance.js.map +1 -0
  772. package/dist/core/roadmap-validate.d.ts +5 -0
  773. package/dist/core/roadmap-validate.d.ts.map +1 -1
  774. package/dist/core/roadmap-validate.js +6 -69
  775. package/dist/core/roadmap-validate.js.map +1 -1
  776. package/dist/core/routine-acquisition-plan.d.ts +43 -7
  777. package/dist/core/routine-acquisition-plan.d.ts.map +1 -1
  778. package/dist/core/routine-acquisition-plan.js +99 -8
  779. package/dist/core/routine-acquisition-plan.js.map +1 -1
  780. package/dist/core/routine-fetch-window-retry.d.ts +41 -2
  781. package/dist/core/routine-fetch-window-retry.d.ts.map +1 -1
  782. package/dist/core/routine-fetch-window-retry.js +91 -8
  783. package/dist/core/routine-fetch-window-retry.js.map +1 -1
  784. package/dist/core/routine-fetch-window-runner.d.ts +55 -21
  785. package/dist/core/routine-fetch-window-runner.d.ts.map +1 -1
  786. package/dist/core/routine-fetch-window-runner.js +258 -35
  787. package/dist/core/routine-fetch-window-runner.js.map +1 -1
  788. package/dist/core/routine-windows.d.ts +17 -13
  789. package/dist/core/routine-windows.d.ts.map +1 -1
  790. package/dist/core/routine-windows.js +78 -36
  791. package/dist/core/routine-windows.js.map +1 -1
  792. package/dist/core/scheduler.d.ts +121 -37
  793. package/dist/core/scheduler.d.ts.map +1 -1
  794. package/dist/core/scheduler.js +359 -80
  795. package/dist/core/scheduler.js.map +1 -1
  796. package/dist/core/session-manager.d.ts +25 -6
  797. package/dist/core/session-manager.d.ts.map +1 -1
  798. package/dist/core/session-manager.js +32 -15
  799. package/dist/core/session-manager.js.map +1 -1
  800. package/dist/core/skeleton.d.ts.map +1 -1
  801. package/dist/core/skeleton.js +23 -23
  802. package/dist/core/skeleton.js.map +1 -1
  803. package/dist/core/skills-compiler.d.ts +275 -25
  804. package/dist/core/skills-compiler.d.ts.map +1 -1
  805. package/dist/core/skills-compiler.js +844 -205
  806. package/dist/core/skills-compiler.js.map +1 -1
  807. package/dist/core/skills-manifest.d.ts +104 -0
  808. package/dist/core/skills-manifest.d.ts.map +1 -1
  809. package/dist/core/skills-manifest.js +350 -39
  810. package/dist/core/skills-manifest.js.map +1 -1
  811. package/dist/core/wiki/git-precompile.d.ts +9 -0
  812. package/dist/core/wiki/git-precompile.d.ts.map +1 -1
  813. package/dist/core/wiki/git-precompile.js +7 -1
  814. package/dist/core/wiki/git-precompile.js.map +1 -1
  815. package/dist/core/workdir.d.ts +30 -1
  816. package/dist/core/workdir.d.ts.map +1 -1
  817. package/dist/core/workdir.js +140 -15
  818. package/dist/core/workdir.js.map +1 -1
  819. package/dist/db/entities-store.d.ts +5 -5
  820. package/dist/db/entities-store.js +5 -5
  821. package/dist/db/hourly-check-signals.d.ts.map +1 -1
  822. package/dist/db/hourly-check-signals.js +121 -35
  823. package/dist/db/hourly-check-signals.js.map +1 -1
  824. package/dist/db/observations.d.ts +1 -1
  825. package/dist/db/observations.js +1 -1
  826. package/dist/db/observations.js.map +1 -1
  827. package/dist/db/recurring-schedules.d.ts +32 -1
  828. package/dist/db/recurring-schedules.d.ts.map +1 -1
  829. package/dist/db/recurring-schedules.js +29 -10
  830. package/dist/db/recurring-schedules.js.map +1 -1
  831. package/dist/db/repositories-store.d.ts +2 -1
  832. package/dist/db/repositories-store.d.ts.map +1 -1
  833. package/dist/db/repositories-store.js +38 -3
  834. package/dist/db/repositories-store.js.map +1 -1
  835. package/dist/db/schema.d.ts.map +1 -1
  836. package/dist/db/schema.js +157 -51
  837. package/dist/db/schema.js.map +1 -1
  838. package/dist/db/wiki-store.d.ts.map +1 -1
  839. package/dist/db/wiki-store.js +3 -0
  840. package/dist/db/wiki-store.js.map +1 -1
  841. package/dist/index.js +308 -1473
  842. package/dist/index.js.map +1 -1
  843. package/dist/messaging/magic-phrase.d.ts +16 -0
  844. package/dist/messaging/magic-phrase.d.ts.map +1 -1
  845. package/dist/messaging/magic-phrase.js +53 -0
  846. package/dist/messaging/magic-phrase.js.map +1 -1
  847. package/dist/messaging/owner-channels.d.ts +24 -0
  848. package/dist/messaging/owner-channels.d.ts.map +1 -1
  849. package/dist/messaging/owner-channels.js +38 -0
  850. package/dist/messaging/owner-channels.js.map +1 -1
  851. package/dist/messaging/setup-welcome-dm.d.ts +30 -0
  852. package/dist/messaging/setup-welcome-dm.d.ts.map +1 -0
  853. package/dist/messaging/setup-welcome-dm.js +86 -0
  854. package/dist/messaging/setup-welcome-dm.js.map +1 -0
  855. package/dist/observers/calendar-poller.d.ts +2 -0
  856. package/dist/observers/calendar-poller.d.ts.map +1 -1
  857. package/dist/observers/calendar-poller.js +76 -54
  858. package/dist/observers/calendar-poller.js.map +1 -1
  859. package/dist/observers/delegated-sync-worker.d.ts +62 -0
  860. package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
  861. package/dist/observers/delegated-sync-worker.js +128 -1
  862. package/dist/observers/delegated-sync-worker.js.map +1 -1
  863. package/dist/observers/git-watcher.d.ts +22 -0
  864. package/dist/observers/git-watcher.d.ts.map +1 -1
  865. package/dist/observers/git-watcher.js +31 -7
  866. package/dist/observers/git-watcher.js.map +1 -1
  867. package/dist/observers/imminent-event-scheduler.d.ts +2 -0
  868. package/dist/observers/imminent-event-scheduler.d.ts.map +1 -1
  869. package/dist/observers/imminent-event-scheduler.js +29 -0
  870. package/dist/observers/imminent-event-scheduler.js.map +1 -1
  871. package/dist/observers/notion-poller.d.ts +2 -0
  872. package/dist/observers/notion-poller.d.ts.map +1 -1
  873. package/dist/observers/notion-poller.js +44 -6
  874. package/dist/observers/notion-poller.js.map +1 -1
  875. package/dist/observers/poll-guard.d.ts +63 -0
  876. package/dist/observers/poll-guard.d.ts.map +1 -0
  877. package/dist/observers/poll-guard.js +89 -0
  878. package/dist/observers/poll-guard.js.map +1 -0
  879. package/dist/safety/absolute-block-audit.d.ts +17 -0
  880. package/dist/safety/absolute-block-audit.d.ts.map +1 -1
  881. package/dist/safety/absolute-block-audit.js +28 -2
  882. package/dist/safety/absolute-block-audit.js.map +1 -1
  883. package/dist/safety/agent-write-tracker.d.ts +42 -1
  884. package/dist/safety/agent-write-tracker.d.ts.map +1 -1
  885. package/dist/safety/agent-write-tracker.js +81 -1
  886. package/dist/safety/agent-write-tracker.js.map +1 -1
  887. package/dist/safety/always-disallowed.d.ts +34 -0
  888. package/dist/safety/always-disallowed.d.ts.map +1 -1
  889. package/dist/safety/always-disallowed.js +114 -7
  890. package/dist/safety/always-disallowed.js.map +1 -1
  891. package/dist/safety/audit.d.ts +20 -0
  892. package/dist/safety/audit.d.ts.map +1 -1
  893. package/dist/safety/audit.js +126 -0
  894. package/dist/safety/audit.js.map +1 -1
  895. package/dist/safety/risk-classifier.d.ts +17 -1
  896. package/dist/safety/risk-classifier.d.ts.map +1 -1
  897. package/dist/safety/risk-classifier.js +75 -7
  898. package/dist/safety/risk-classifier.js.map +1 -1
  899. package/dist/safety/subprocess-block-scanner.d.ts +89 -0
  900. package/dist/safety/subprocess-block-scanner.d.ts.map +1 -0
  901. package/dist/safety/subprocess-block-scanner.js +177 -0
  902. package/dist/safety/subprocess-block-scanner.js.map +1 -0
  903. package/dist/scheduler/hourly-check-gate.d.ts +23 -9
  904. package/dist/scheduler/hourly-check-gate.d.ts.map +1 -1
  905. package/dist/scheduler/hourly-check-gate.js +11 -6
  906. package/dist/scheduler/hourly-check-gate.js.map +1 -1
  907. package/dist/secrets/backend-api-key-env.d.ts.map +1 -1
  908. package/dist/secrets/backend-api-key-env.js +1 -0
  909. package/dist/secrets/backend-api-key-env.js.map +1 -1
  910. package/dist/services/delegated-backend-invoker.d.ts.map +1 -1
  911. package/dist/services/delegated-backend-invoker.js +8 -1
  912. package/dist/services/delegated-backend-invoker.js.map +1 -1
  913. package/dist/services/delegated-invoker-audit.d.ts.map +1 -1
  914. package/dist/services/delegated-invoker-audit.js +5 -1
  915. package/dist/services/delegated-invoker-audit.js.map +1 -1
  916. package/dist/services/delegated-proxy-config.d.ts +3 -2
  917. package/dist/services/delegated-proxy-config.d.ts.map +1 -1
  918. package/dist/services/delegated-proxy-config.js.map +1 -1
  919. package/dist/services/integrations/extract-write-item-id.d.ts +5 -2
  920. package/dist/services/integrations/extract-write-item-id.d.ts.map +1 -1
  921. package/dist/services/integrations/extract-write-item-id.js.map +1 -1
  922. package/dist/services/mcp/generators/index.d.ts +1 -0
  923. package/dist/services/mcp/generators/index.d.ts.map +1 -1
  924. package/dist/services/mcp/generators/index.js +3 -0
  925. package/dist/services/mcp/generators/index.js.map +1 -1
  926. package/dist/services/mcp/sdk-observations-server.d.ts +60 -0
  927. package/dist/services/mcp/sdk-observations-server.d.ts.map +1 -0
  928. package/dist/services/mcp/sdk-observations-server.js +161 -0
  929. package/dist/services/mcp/sdk-observations-server.js.map +1 -0
  930. package/dist/services/mcp/session-materializer.d.ts.map +1 -1
  931. package/dist/services/mcp/session-materializer.js +13 -9
  932. package/dist/services/mcp/session-materializer.js.map +1 -1
  933. package/dist/services/mcp/types.d.ts +1 -0
  934. package/dist/services/mcp/types.d.ts.map +1 -1
  935. package/dist/services/notion.d.ts +19 -1
  936. package/dist/services/notion.d.ts.map +1 -1
  937. package/dist/services/notion.js +41 -2
  938. package/dist/services/notion.js.map +1 -1
  939. package/dist/services/observations-batch.d.ts +100 -0
  940. package/dist/services/observations-batch.d.ts.map +1 -0
  941. package/dist/services/observations-batch.js +258 -0
  942. package/dist/services/observations-batch.js.map +1 -0
  943. package/dist/services/voice/transcriber.d.ts +23 -0
  944. package/dist/services/voice/transcriber.d.ts.map +1 -1
  945. package/dist/services/voice/transcriber.js +55 -0
  946. package/dist/services/voice/transcriber.js.map +1 -1
  947. package/dist/settings/runtime-settings.d.ts +9 -6
  948. package/dist/settings/runtime-settings.d.ts.map +1 -1
  949. package/dist/settings/runtime-settings.js +50 -17
  950. package/dist/settings/runtime-settings.js.map +1 -1
  951. package/package.json +3 -2
  952. package/dist/api/delegated-proxy-helper.d.ts +0 -33
  953. package/dist/api/delegated-proxy-helper.d.ts.map +0 -1
  954. package/dist/api/delegated-proxy-helper.js +0 -54
  955. package/dist/api/delegated-proxy-helper.js.map +0 -1
  956. package/dist/core/roadmap-merge.d.ts +0 -7
  957. package/dist/core/roadmap-merge.d.ts.map +0 -1
  958. package/dist/core/roadmap-merge.js +0 -187
  959. package/dist/core/roadmap-merge.js.map +0 -1
  960. package/dist/db/test-schemas.d.ts +0 -23
  961. package/dist/db/test-schemas.d.ts.map +0 -1
  962. package/dist/db/test-schemas.js +0 -111
  963. package/dist/db/test-schemas.js.map +0 -1
@@ -0,0 +1,750 @@
1
+ import { scheduleRequestSchema, scheduleUpdateRequestSchema, scheduleDmRequestSchema, scheduleBatchRequestSchema, formatSqliteDatetime, isProcessTier, } from "@aitne/shared";
2
+ import { createLogger } from "../../logging.js";
3
+ import { readJsonBody } from "../json-body.js";
4
+ import { maybeTriggerRoadmapRefresh } from "../../core/schedule-insert-helper.js";
5
+ import { composeIssue, respondWithAgentError, translateZodError, } from "../helpers/agent-errors.js";
6
+ import { enrichAgentPlanTaskContext } from "./agent-schedule-plan-match.js";
7
+ import { resolveModelToken, resolveModelTokenForPatch, } from "./schedule-model-resolver.js";
8
+ import { snapshotModelRegistry } from "./schedule-validation.js";
9
+ const logger = createLogger("agent-schedule-api");
10
+ /**
11
+ * Promote a JSON-encoded `taskContext.tier_override` slot to the
12
+ * dedicated `agent_schedule.tier_override` column. The slot pre-dates
13
+ * the column (declared on `scheduleBatchTaskContextSchema` since the
14
+ * batch endpoint's first cut and documented in
15
+ * `agent-assets/skills/schedule/references/batch.md`) but was never
16
+ * read at dispatch time — the column is the runtime contract. Lifting
17
+ * here keeps callers that follow `references/batch.md` working
18
+ * without introducing a second precedence path at dispatch.
19
+ *
20
+ * Returns `null` when the slot is absent or carries an unrecognised
21
+ * value (CHECK constraint would reject the latter anyway; refusing
22
+ * here lets the row land with `tier_override = NULL` instead of an
23
+ * INSERT-time SqliteError).
24
+ */
25
+ function liftTierFromTaskContext(ctx) {
26
+ if (!ctx)
27
+ return null;
28
+ const value = ctx.tier_override;
29
+ return isProcessTier(value) ? value : null;
30
+ }
31
+ function parseTaskContextJson(raw) {
32
+ // The agent_schedule.task_context column has DEFAULT '{}', so `raw` is never
33
+ // null from a properly-seeded row. This guard handles the edge case of a row
34
+ // inserted directly without the column value (test or legacy data).
35
+ /* c8 ignore next */
36
+ if (!raw)
37
+ return {};
38
+ try {
39
+ const parsed = JSON.parse(raw);
40
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
41
+ return parsed;
42
+ }
43
+ }
44
+ catch (err) {
45
+ logger.warn({ err }, "Invalid task_context JSON in agent_schedule row");
46
+ }
47
+ return {};
48
+ }
49
+ export function registerAgentScheduleRoutes(app, deps) {
50
+ const { db } = deps;
51
+ // POST /schedule — Register dynamic schedule
52
+ app.post("/schedule", async (c) => {
53
+ const parsedBody = await readJsonBody(c);
54
+ if (!parsedBody.ok)
55
+ return parsedBody.response;
56
+ const parsed = scheduleRequestSchema.safeParse(parsedBody.body);
57
+ if (!parsed.success) {
58
+ // Per docs/design/appendices/morning-routine-optimization.md
59
+ // Phase 1, the existing single-row endpoint adopts the agent-
60
+ // consumable error envelope so agent callers self-correct in
61
+ // the same turn instead of looping on opaque "validation_error"
62
+ // strings. Field-keyed code overrides cover the schema's
63
+ // string-min and enum constraints; anything else falls through
64
+ // to the namespace-level placeholder hint so a missing
65
+ // registry entry surfaces in tests.
66
+ // Schema-level fields (`time`, `taskType`) are typed as bare
67
+ // `z.string()` here so the body-level Zod failure has no
68
+ // registry-mapped semantics on its own. Field-keyed overrides
69
+ // promote each to the nearest registry code so an LLM caller
70
+ // gets a useful hint instead of a `<ns>.<field>_missing`
71
+ // placeholder. The post-Zod handler below still re-checks
72
+ // `time` for ISO8601 parseability and future-bound — the
73
+ // override here only covers the "field absent / wrong type"
74
+ // path Zod produces.
75
+ const issues = translateZodError(parsed.error, {
76
+ namespace: "schedule",
77
+ fieldCodeMap: {
78
+ time: "schedule.scheduled_for_invalid",
79
+ taskType: "schedule.task_type_unknown",
80
+ description: "schedule.description_too_short",
81
+ prompt: "schedule.prompt_too_short",
82
+ model: "schedule.model_unknown",
83
+ tier: "schedule.tier_unknown",
84
+ },
85
+ });
86
+ return respondWithAgentError(c, 400, issues);
87
+ }
88
+ const { time, taskType, description, prompt, model, tier, taskContext } = parsed.data;
89
+ // Phase D — resolve the `(model, tier)` pair against the live
90
+ // model registry BEFORE we do any other work so the alias-rewrite
91
+ // and ambiguous/unknown branches reject the row at the same
92
+ // boundary as the schema parse. The resolver also enforces §4.3's
93
+ // tier/model mutual exclusion and emits the deprecated-warning
94
+ // bookkeeping. Single snapshot per request so the conflict /
95
+ // unknown / deprecated payloads stay consistent within the call.
96
+ const registrySnapshot = snapshotModelRegistry();
97
+ const resolved = resolveModelToken({
98
+ model,
99
+ tier,
100
+ fieldBase: "model",
101
+ tierField: "tier",
102
+ rowIndex: null,
103
+ snapshot: registrySnapshot,
104
+ });
105
+ if (!resolved.ok) {
106
+ return respondWithAgentError(c, 400, resolved.errors);
107
+ }
108
+ // Normalize ISO8601 (possibly with timezone offset) to UTC SQLite format.
109
+ // Without this, "2026-04-05T07:00:00+09:00" would be stored as-is and
110
+ // ScheduleWatcher's lexicographic comparison (YYYY-MM-DD HH:MM:SS) would
111
+ // fail due to the 'T' separator being > ' ' in ASCII.
112
+ const parsedDate = new Date(time);
113
+ if (isNaN(parsedDate.getTime())) {
114
+ return respondWithAgentError(c, 400, [
115
+ composeIssue("schedule.scheduled_for_invalid", {
116
+ field: "time",
117
+ received: time,
118
+ }),
119
+ ]);
120
+ }
121
+ // Reject times more than 1 minute in the past. This mirrors
122
+ // /schedule/dm and prevents accidental immediate catch-up tasks when a
123
+ // model resolves a relative time incorrectly.
124
+ if (parsedDate.getTime() < Date.now() - 60_000) {
125
+ return respondWithAgentError(c, 400, [
126
+ composeIssue("schedule.scheduled_for_in_past", {
127
+ field: "time",
128
+ received: time,
129
+ }),
130
+ ]);
131
+ }
132
+ const scheduledForUtc = formatSqliteDatetime(parsedDate);
133
+ const enrichedTaskContext = enrichAgentPlanTaskContext(taskContext, parsedDate, description, deps);
134
+ // Tier precedence: resolved `(model, tier_override, backend_id)`
135
+ // from §4.3 wins over the legacy `taskContext.tier_override` slot.
136
+ // The slot pre-dates the column and the resolver above already
137
+ // rejected `{tier, model}` conflicts — so the lift here only
138
+ // fires when the resolver returned all-NULL (no top-level pin)
139
+ // AND the legacy JSON slot carries a tier the dispatcher should
140
+ // honour. Lift the slot into `tier_override` for backward compat
141
+ // with skills that follow the old `references/batch.md` shape.
142
+ const liftedTier = liftTierFromTaskContext(enrichedTaskContext);
143
+ const effectiveTier = resolved.model !== null || resolved.tierOverride !== null
144
+ ? resolved.tierOverride
145
+ : liftedTier;
146
+ const result = db
147
+ .prepare(`INSERT INTO agent_schedule (
148
+ scheduled_for, task_type, task_description, task_prompt,
149
+ task_context, model, tier_override, backend_id, status
150
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending')`)
151
+ .run(scheduledForUtc, taskType, description, prompt ?? null, JSON.stringify(enrichedTaskContext),
152
+ // §4.3 persistence rule: at most one of (model, tier_override)
153
+ // is non-NULL at rest. The resolver normalizes alias rows to
154
+ // `tier_override` and clears `model` + `backend_id` so the
155
+ // dispatcher's override block reads a self-consistent row.
156
+ resolved.model, effectiveTier,
157
+ // §4.3a — snapshot the backend pin at write time. NULL for
158
+ // alias rows, pure-tier rows, and the no-override path so
159
+ // the scheduler falls through to the process-key defaults.
160
+ resolved.backendId);
161
+ logger.info({ scheduleId: result.lastInsertRowid, taskType, scheduledFor: scheduledForUtc }, "Task scheduled");
162
+ // Surface long-horizon user-facing schedules in roadmap.md as
163
+ // `Scheduled:` entries. Internal/short-lived callers opt out via
164
+ // `taskContext.importance = "low"` or `"transient"`; strategic rows
165
+ // opt in regardless of horizon.
166
+ maybeTriggerRoadmapRefresh({ scheduledFor: scheduledForUtc, taskContext: enrichedTaskContext }, deps.triggerRoadmapRefresh, "scheduled_task_created");
167
+ // 2026-05 skill/API consistency: `/schedule/dm` returns
168
+ // `scheduledFor` so the caller can confirm the normalized UTC
169
+ // timestamp without a round-trip GET. The wake-task variant did
170
+ // not, forcing callers that wanted to log the scheduled time to
171
+ // either re-parse the input `time` themselves or query the table.
172
+ // Returning it here is additive and matches the DM variant.
173
+ //
174
+ // Phase D — `warnings` carries the §5.0.5 advisory channel. The
175
+ // most common entry is `schedule.model_deprecated` for a
176
+ // registered-but-deprecated pin. Surface ALWAYS (even as empty
177
+ // array) so the agent's parser doesn't have to handle two
178
+ // response shapes.
179
+ return c.json({
180
+ status: "scheduled",
181
+ scheduleId: String(result.lastInsertRowid),
182
+ scheduledFor: scheduledForUtc,
183
+ warnings: resolved.warnings,
184
+ });
185
+ });
186
+ // POST /schedule/batch — Bulk schedule registration with rich taskContext.
187
+ //
188
+ // docs/design/appendices/morning-routine-optimization.md §"POST
189
+ // /api/schedule/batch". Atomic by default — either every row commits or
190
+ // none. The agent (Stage A in the morning-routine pipeline) is the only
191
+ // actor with fresh access to mail / calendar / projects / roadmap so it
192
+ // is the only actor that can compose a per-row `taskContext` carrying
193
+ // background / expected_output / references / tone. A future
194
+ // `scheduled.task` session firing hours later inherits that context
195
+ // verbatim — its output quality is bounded by what the agent wrote at
196
+ // scheduling time.
197
+ //
198
+ // Errors emit the uniform agent-consumable envelope so the LLM can
199
+ // self-correct in the same turn rather than guessing. Per-row issues
200
+ // carry rowIndex; cross-row issues carry rowIndex=null.
201
+ app.post("/schedule/batch", async (c) => {
202
+ const parsedBody = await readJsonBody(c);
203
+ if (!parsedBody.ok)
204
+ return parsedBody.response;
205
+ if (!parsedBody.body
206
+ || typeof parsedBody.body !== "object"
207
+ || Array.isArray(parsedBody.body)) {
208
+ return respondWithAgentError(c, 400, [
209
+ composeIssue("schedule.body_not_object", {
210
+ field: "$",
211
+ received: parsedBody.body,
212
+ }),
213
+ ]);
214
+ }
215
+ const parsed = scheduleBatchRequestSchema.safeParse(parsedBody.body);
216
+ if (!parsed.success) {
217
+ // Let the Zod translator emit "<ns>.<fieldTail>_<reason>" codes;
218
+ // remap to registry codes per field. This keeps the missing vs
219
+ // too-short distinction intact for taskContext required slots
220
+ // (a field-code map would collapse both Zod reasons onto one
221
+ // override and lose the "populate the field" vs "expand the
222
+ // string" remediation hint).
223
+ const rawIssues = translateZodError(parsed.error, {
224
+ namespace: "schedule",
225
+ });
226
+ const remapped = rawIssues.map((issue) => {
227
+ const f = issue.field;
228
+ const reason = issue.code.replace(/^schedule\./, "");
229
+ // taskContext slots — required vs optional are distinguished by
230
+ // which keys the schema marks required (background, expected_output).
231
+ // For those two we surface missing vs too-short separately so the
232
+ // hint pushes the agent to populate the required slot. For any
233
+ // other taskContext sub-field (references / tone / tier_override /
234
+ // sub_flow / catch-all extras) the only failure shape Zod produces
235
+ // is wrong-type — we collapse those to a single wrong_type code
236
+ // so the response carries a useful hint instead of leaking the
237
+ // unregistered <namespace>.<fieldTail>_invalid placeholder.
238
+ if (f.includes(".taskContext.")) {
239
+ const isRequiredSlot = f.endsWith(".taskContext.background")
240
+ || f.endsWith(".taskContext.expected_output");
241
+ if (isRequiredSlot && reason.endsWith("_missing")) {
242
+ return composeIssue("schedule.task_context_field_missing", {
243
+ field: f,
244
+ received: issue.received,
245
+ rowIndex: issue.rowIndex,
246
+ });
247
+ }
248
+ if (isRequiredSlot && reason.endsWith("_too_short")) {
249
+ return composeIssue("schedule.task_context_field_too_short", {
250
+ field: f,
251
+ received: issue.received,
252
+ rowIndex: issue.rowIndex,
253
+ });
254
+ }
255
+ return composeIssue("schedule.task_context_field_wrong_type", {
256
+ field: f,
257
+ received: issue.received,
258
+ rowIndex: issue.rowIndex,
259
+ });
260
+ }
261
+ // rows[] cardinality — too_big maps onto rows_too_many; missing /
262
+ // wrong-type onto rows_field_missing.
263
+ if (f === "rows") {
264
+ if (reason.endsWith("_too_long") || reason.endsWith("_too_big")) {
265
+ return composeIssue("schedule.rows_too_many", {
266
+ field: f,
267
+ received: issue.received,
268
+ rowIndex: null,
269
+ });
270
+ }
271
+ return composeIssue("schedule.rows_field_missing", {
272
+ field: f,
273
+ received: issue.received,
274
+ rowIndex: null,
275
+ });
276
+ }
277
+ // Row-content slots.
278
+ if (f.endsWith(".taskDescription") && reason.endsWith("_too_short")) {
279
+ return composeIssue("schedule.description_too_short", {
280
+ field: f,
281
+ received: issue.received,
282
+ rowIndex: issue.rowIndex,
283
+ });
284
+ }
285
+ if (f.endsWith(".taskPrompt") && reason.endsWith("_too_short")) {
286
+ return composeIssue("schedule.prompt_too_short", {
287
+ field: f,
288
+ received: issue.received,
289
+ rowIndex: issue.rowIndex,
290
+ });
291
+ }
292
+ if (f.endsWith(".taskType")) {
293
+ return composeIssue("schedule.task_type_unknown", {
294
+ field: f,
295
+ received: issue.received,
296
+ rowIndex: issue.rowIndex,
297
+ });
298
+ }
299
+ if (f.endsWith(".model")) {
300
+ return composeIssue("schedule.model_unknown", {
301
+ field: f,
302
+ received: issue.received,
303
+ rowIndex: issue.rowIndex,
304
+ });
305
+ }
306
+ if (f.endsWith(".tier")) {
307
+ return composeIssue("schedule.tier_unknown", {
308
+ field: f,
309
+ received: issue.received,
310
+ rowIndex: issue.rowIndex,
311
+ });
312
+ }
313
+ if (f === "atomic") {
314
+ return composeIssue("schedule.batch_atomic_invalid", {
315
+ field: f,
316
+ received: issue.received,
317
+ rowIndex: null,
318
+ });
319
+ }
320
+ return issue;
321
+ });
322
+ return respondWithAgentError(c, 422, remapped, {
323
+ rowsAttempted: Array.isArray(parsedBody.body.rows)
324
+ ? (parsedBody.body.rows.length)
325
+ : 0,
326
+ rowsCommitted: 0,
327
+ retryHint: "Fix the listed rows and POST the same body again. atomic=true (the default) means no rows were committed.",
328
+ });
329
+ }
330
+ const { rows, atomic = true } = parsed.data;
331
+ if (rows.length === 0) {
332
+ // Documented no-op — keeps Stage A's "register everything I wrote"
333
+ // step idempotent on days where it produced no schedules.
334
+ return c.json({
335
+ ok: true,
336
+ rowsAttempted: 0,
337
+ rowsCommitted: 0,
338
+ ids: [],
339
+ });
340
+ }
341
+ // Per-row business validation (Date-parse + future-bound + Phase D
342
+ // model resolution). Zod can't express "Date(time) >= now" without
343
+ // a refine that loses the row index in the path, and the model
344
+ // resolver needs a live registry snapshot it doesn't currently
345
+ // hold, so both checks happen in one pass here.
346
+ const nowMs = Date.now();
347
+ const registrySnapshot = snapshotModelRegistry();
348
+ const businessIssues = [];
349
+ const warnings = [];
350
+ const normalized = [];
351
+ for (let i = 0; i < rows.length; i++) {
352
+ const row = rows[i];
353
+ const date = new Date(row.scheduledFor);
354
+ if (Number.isNaN(date.getTime())) {
355
+ businessIssues.push(composeIssue("schedule.scheduled_for_invalid", {
356
+ field: `rows[${i}].scheduledFor`,
357
+ received: row.scheduledFor,
358
+ rowIndex: i,
359
+ }));
360
+ continue;
361
+ }
362
+ if (date.getTime() < nowMs - 60_000) {
363
+ businessIssues.push(composeIssue("schedule.scheduled_for_in_past", {
364
+ field: `rows[${i}].scheduledFor`,
365
+ received: row.scheduledFor,
366
+ rowIndex: i,
367
+ }));
368
+ continue;
369
+ }
370
+ // Phase D — per-row registry resolution. Nullable schema fields
371
+ // come through as `null`; the resolver only acts on defined
372
+ // values, so coerce null → undefined to reach the "no pin"
373
+ // branch instead of misreading it as an explicit clear (which
374
+ // is a PATCH-only concept on batch inserts).
375
+ const resolved = resolveModelToken({
376
+ model: row.model ?? undefined,
377
+ tier: row.tier ?? undefined,
378
+ fieldBase: `rows[${i}].model`,
379
+ tierField: `rows[${i}].tier`,
380
+ rowIndex: i,
381
+ snapshot: registrySnapshot,
382
+ });
383
+ if (!resolved.ok) {
384
+ for (const issue of resolved.errors)
385
+ businessIssues.push(issue);
386
+ continue;
387
+ }
388
+ for (const w of resolved.warnings)
389
+ warnings.push(w);
390
+ normalized.push({
391
+ row,
392
+ scheduledForUtc: formatSqliteDatetime(date),
393
+ scheduledForDate: date,
394
+ resolvedModel: resolved.model,
395
+ resolvedTier: resolved.tierOverride,
396
+ resolvedBackendId: resolved.backendId,
397
+ });
398
+ }
399
+ if (businessIssues.length > 0) {
400
+ return respondWithAgentError(c, 422, businessIssues, {
401
+ rowsAttempted: rows.length,
402
+ rowsCommitted: 0,
403
+ retryHint: "Fix the listed rows and POST the same body again. atomic=true (the default) means no rows were committed.",
404
+ });
405
+ }
406
+ // Insert phase. With `atomic:true` we wrap the loop in a single
407
+ // better-sqlite3 transaction so an unforeseen DB-side rejection
408
+ // (e.g. CHECK constraint) rolls back every row. The validated
409
+ // path above already covers the per-row failure shape, so the
410
+ // transaction is a defense-in-depth rather than the primary
411
+ // error channel.
412
+ const insert = db.prepare(`INSERT INTO agent_schedule (
413
+ scheduled_for, task_type, task_description, task_prompt,
414
+ task_context, correlation_id, model, tier_override, backend_id, status
415
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending')`);
416
+ const ids = [];
417
+ const writeOne = (entry) => {
418
+ const enriched = enrichAgentPlanTaskContext(entry.row.taskContext, entry.scheduledForDate, entry.row.taskDescription, deps);
419
+ // Tier precedence per single-row endpoint: the resolved pin
420
+ // from §4.3 wins. Fall through to the legacy
421
+ // `taskContext.tier_override` slot only when the resolver
422
+ // returned no pin (no top-level `model` and no top-level
423
+ // `tier` on the row).
424
+ const liftedTier = liftTierFromTaskContext(enriched);
425
+ const effectiveTier = entry.resolvedModel !== null || entry.resolvedTier !== null
426
+ ? entry.resolvedTier
427
+ : liftedTier;
428
+ const result = insert.run(entry.scheduledForUtc, entry.row.taskType, entry.row.taskDescription, entry.row.taskPrompt ?? null, JSON.stringify(enriched), entry.row.correlationId ?? null,
429
+ // §4.3 — at most one of (model, tier_override) is non-NULL.
430
+ entry.resolvedModel, effectiveTier,
431
+ // §4.3a — backend pin paired with the model column.
432
+ entry.resolvedBackendId);
433
+ return Number(result.lastInsertRowid);
434
+ };
435
+ if (atomic) {
436
+ const tx = db.transaction((entries) => {
437
+ for (const entry of entries) {
438
+ ids.push(writeOne(entry));
439
+ }
440
+ });
441
+ tx(normalized);
442
+ }
443
+ else {
444
+ for (const entry of normalized) {
445
+ ids.push(writeOne(entry));
446
+ }
447
+ }
448
+ logger.info({
449
+ rowsCommitted: ids.length,
450
+ atomic,
451
+ }, "Schedule batch registered");
452
+ // Roadmap refresh: trigger once per batch if any row qualifies.
453
+ // Matches the single-row /schedule path's semantics — strategic +
454
+ // long-horizon normal rows surface as roadmap `Scheduled:` entries.
455
+ for (const entry of normalized) {
456
+ maybeTriggerRoadmapRefresh({
457
+ scheduledFor: entry.scheduledForUtc,
458
+ taskContext: entry.row.taskContext,
459
+ }, deps.triggerRoadmapRefresh, "scheduled_task_created");
460
+ }
461
+ return c.json({
462
+ ok: true,
463
+ rowsAttempted: rows.length,
464
+ rowsCommitted: ids.length,
465
+ ids,
466
+ // §5.0.5 advisory channel. Always present (even as []) so
467
+ // the LLM's batch parser doesn't have to handle two shapes.
468
+ warnings,
469
+ }, 201);
470
+ });
471
+ // POST /schedule/dm — Schedule a direct DM (no agent needed)
472
+ app.post("/schedule/dm", async (c) => {
473
+ const parsedBody = await readJsonBody(c);
474
+ if (!parsedBody.ok)
475
+ return parsedBody.response;
476
+ const parsed = scheduleDmRequestSchema.safeParse(parsedBody.body);
477
+ if (!parsed.success) {
478
+ return respondWithAgentError(c, 400, [composeIssue("agent.schedule_dm_validation_error", { field: "body", received: parsedBody.body })], { legacyFields: { details: parsed.error } });
479
+ }
480
+ const { time, message, platform, platforms, importance } = parsed.data;
481
+ const parsedDate = new Date(time);
482
+ if (isNaN(parsedDate.getTime())) {
483
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_time", { field: "time", received: time })], { legacyFields: { details: "Cannot parse time as a valid date" } });
484
+ }
485
+ // Reject times more than 1 minute in the past
486
+ if (parsedDate.getTime() < Date.now() - 60_000) {
487
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_time", { field: "time", received: time })], { legacyFields: { details: "Scheduled time is in the past" } });
488
+ }
489
+ const scheduledForUtc = formatSqliteDatetime(parsedDate);
490
+ const dmTaskContext = {
491
+ platforms: platforms ?? (platform ? [platform] : null),
492
+ importance: importance ?? "transient",
493
+ };
494
+ const result = db
495
+ .prepare(
496
+ // task_type='dm' is consumed directly by `handleDirectDm` —
497
+ // the LLM never runs, so `model` is meaningless. Persist NULL
498
+ // so a reader can't mistake the row for a model-pinned task.
499
+ `INSERT INTO agent_schedule (scheduled_for, task_type, task_description, task_context, model, status)
500
+ VALUES (?, 'dm', ?, ?, NULL, 'pending')`)
501
+ .run(scheduledForUtc, message, JSON.stringify(dmTaskContext));
502
+ // DM-scheduled reminders are transient by default so short pings do
503
+ // not pollute roadmap.md. Callers can opt in with `importance`.
504
+ maybeTriggerRoadmapRefresh({ scheduledFor: scheduledForUtc, taskContext: dmTaskContext }, deps.triggerRoadmapRefresh, "scheduled_task_created");
505
+ return c.json({
506
+ status: "scheduled",
507
+ scheduleId: String(result.lastInsertRowid),
508
+ scheduledFor: scheduledForUtc,
509
+ });
510
+ });
511
+ // GET /schedule — List scheduled items
512
+ app.get("/schedule", (c) => {
513
+ const statusParam = c.req.query("status") ?? "pending,running";
514
+ const roadmapEligible = c.req.query("roadmapEligible") === "true" ||
515
+ c.req.query("roadmapEligible") === "1";
516
+ const statuses = statusParam.split(",").map((s) => s.trim()).filter(Boolean);
517
+ const allowed = new Set(["pending", "running", "completed", "failed", "skipped"]);
518
+ for (const s of statuses) {
519
+ if (!allowed.has(s)) {
520
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_status", { field: "status", received: s })], { legacyFields: { details: `Unknown status: ${s}` } });
521
+ }
522
+ }
523
+ const placeholders = statuses.map(() => "?").join(",");
524
+ const where = [`status IN (${placeholders})`];
525
+ const queryParams = [...statuses];
526
+ if (roadmapEligible) {
527
+ const normalHorizonCutoff = formatSqliteDatetime(new Date(Date.now() + 7 * 24 * 60 * 60 * 1000));
528
+ where.push(`(
529
+ json_extract(task_context, '$.importance') = 'strategic'
530
+ OR (
531
+ (
532
+ json_extract(task_context, '$.importance') IS NULL
533
+ OR json_extract(task_context, '$.importance') NOT IN ('transient', 'low', 'strategic')
534
+ )
535
+ AND scheduled_for > ?
536
+ )
537
+ )`);
538
+ queryParams.push(normalHorizonCutoff);
539
+ }
540
+ const rows = db
541
+ .prepare(`SELECT id, scheduled_for, task_type, task_description, task_prompt, task_context, model, tier_override, backend_id, status, created_at
542
+ FROM agent_schedule
543
+ WHERE ${where.join(" AND ")}
544
+ ORDER BY scheduled_for ASC
545
+ LIMIT 50`)
546
+ .all(...queryParams);
547
+ const items = rows.map((r) => ({
548
+ id: r.id,
549
+ scheduledFor: r.scheduled_for,
550
+ taskType: r.task_type,
551
+ description: r.task_description,
552
+ prompt: r.task_prompt,
553
+ status: r.status,
554
+ model: r.model,
555
+ tier: r.tier_override,
556
+ // Phase D §4.3a — surface the backend pin so callers
557
+ // inspecting a row see the full (model, backend_id) tuple.
558
+ backendId: r.backend_id,
559
+ taskContext: parseTaskContextJson(r.task_context),
560
+ createdAt: r.created_at,
561
+ }));
562
+ return c.json({ items });
563
+ });
564
+ // PATCH /schedule/:id — Edit a pending scheduled item
565
+ app.patch("/schedule/:id", async (c) => {
566
+ const id = Number(c.req.param("id"));
567
+ if (!Number.isInteger(id) || id <= 0) {
568
+ return respondWithAgentError(c, 400, [
569
+ composeIssue("agent.invalid_id", { field: "id", received: c.req.param("id") }),
570
+ ]);
571
+ }
572
+ const parsedBody = await readJsonBody(c);
573
+ if (!parsedBody.ok)
574
+ return parsedBody.response;
575
+ const parsed = scheduleUpdateRequestSchema.safeParse(parsedBody.body);
576
+ if (!parsed.success) {
577
+ // SCHEDULE_API_REDESIGN_PLAN §11 — PATCH parity with POST /schedule.
578
+ // The legacy `agent.schedule_dm_validation_error` collapse erased
579
+ // the offending field; the field-keyed map below preserves it so
580
+ // the LLM caller self-corrects in one turn. `message` is omitted —
581
+ // no `schedule.message_*` registry code exists and the post-Zod
582
+ // block at ~785-807 handles the field/task_type mismatch path.
583
+ // The three root-path refines (empty body, description+message,
584
+ // prompt+message) all surface at field="" with Zod code "custom"
585
+ // (mapped to `<ns>._invalid` by the generic translator). Remap to
586
+ // `agent.no_changes`, which is registered and carries a coherent
587
+ // hint for the dominant empty-body case; the other two refines
588
+ // are accepted as conflated per §11 (the agent's retry path
589
+ // naturally converges on a single-field body).
590
+ const issues = translateZodError(parsed.error, {
591
+ namespace: "schedule",
592
+ fieldCodeMap: {
593
+ time: "schedule.scheduled_for_invalid",
594
+ description: "schedule.description_too_short",
595
+ prompt: "schedule.prompt_too_short",
596
+ model: "schedule.model_unknown",
597
+ tier: "schedule.tier_unknown",
598
+ },
599
+ }).map((issue) => {
600
+ if (issue.field === "" && issue.code.endsWith("_invalid")) {
601
+ return composeIssue("agent.no_changes", {
602
+ field: "body",
603
+ received: parsedBody.body,
604
+ rowIndex: null,
605
+ });
606
+ }
607
+ return issue;
608
+ });
609
+ return respondWithAgentError(c, 400, issues);
610
+ }
611
+ const row = db
612
+ .prepare("SELECT id, status, task_type FROM agent_schedule WHERE id = ?")
613
+ .get(id);
614
+ if (!row) {
615
+ return respondWithAgentError(c, 404, [
616
+ composeIssue("agent.not_found", { field: "id", received: id }),
617
+ ]);
618
+ }
619
+ if (row.status !== "pending") {
620
+ return respondWithAgentError(c, 409, [composeIssue("agent.schedule_conflict", { field: "status", received: row.status })], { legacyFields: { details: `Cannot edit item with status '${row.status}'. Only 'pending' items can be edited.` } });
621
+ }
622
+ // Type-field validation: description ↔ wake/escalation, message ↔ dm,
623
+ // prompt forbidden on dm (direct DMs do not run an agent so the prompt
624
+ // override has nothing to override).
625
+ if (parsed.data.description !== undefined && row.task_type === "dm") {
626
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_field", { field: "description", received: parsed.data.description })], { legacyFields: { details: "'description' cannot be set on dm-type schedules. Use 'message' instead." } });
627
+ }
628
+ if (parsed.data.message !== undefined && row.task_type !== "dm") {
629
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_field", { field: "message", received: parsed.data.message })], { legacyFields: { details: "'message' can only be set on dm-type schedules. Use 'description' instead." } });
630
+ }
631
+ if (parsed.data.prompt !== undefined && row.task_type === "dm") {
632
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_field", { field: "prompt", received: parsed.data.prompt })], { legacyFields: { details: "'prompt' cannot be set on dm-type schedules — direct DMs do not run an agent." } });
633
+ }
634
+ const updates = [];
635
+ const values = [];
636
+ if (parsed.data.time !== undefined) {
637
+ const parsedDate = new Date(parsed.data.time);
638
+ if (isNaN(parsedDate.getTime())) {
639
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_time", { field: "time", received: parsed.data.time })], { legacyFields: { details: "Cannot parse time as a valid date" } });
640
+ }
641
+ // Reject past times for dm type (consistent with POST /schedule/dm)
642
+ if (row.task_type === "dm" && parsedDate.getTime() < Date.now() - 60_000) {
643
+ return respondWithAgentError(c, 400, [composeIssue("agent.invalid_time", { field: "time", received: parsed.data.time })], { legacyFields: { details: "Scheduled time is in the past" } });
644
+ }
645
+ updates.push("scheduled_for = ?");
646
+ values.push(formatSqliteDatetime(parsedDate));
647
+ }
648
+ if (parsed.data.description !== undefined) {
649
+ updates.push("task_description = ?");
650
+ values.push(parsed.data.description);
651
+ }
652
+ if (parsed.data.message !== undefined) {
653
+ updates.push("task_description = ?");
654
+ values.push(parsed.data.message);
655
+ }
656
+ // `prompt: null` is the explicit clear (revert to using task_description
657
+ // as the agent body). `prompt: <string>` sets an override. `undefined` =
658
+ // no change. The dm-type rejection is handled in the type-field block above.
659
+ if (parsed.data.prompt !== undefined) {
660
+ updates.push("task_prompt = ?");
661
+ values.push(parsed.data.prompt);
662
+ }
663
+ // Phase D — resolve `(model, tier)` against the live registry
664
+ // BEFORE assembling the UPDATE so the alias-rewrite, conflict,
665
+ // and ambiguous/unknown paths reject at the same boundary as the
666
+ // schema parse. PATCH-only semantics: `null` is the explicit
667
+ // clear sentinel (separate from `undefined` = no change).
668
+ const patchResolved = resolveModelTokenForPatch({
669
+ model: parsed.data.model,
670
+ tier: parsed.data.tier,
671
+ fieldBase: "model",
672
+ tierField: "tier",
673
+ rowIndex: null,
674
+ });
675
+ if (!patchResolved.ok) {
676
+ return respondWithAgentError(c, 400, patchResolved.errors);
677
+ }
678
+ if (patchResolved.model.present) {
679
+ updates.push("model = ?");
680
+ values.push(patchResolved.model.value);
681
+ }
682
+ // `tier: null` is the explicit clear; `tier: <enum>` sets the
683
+ // override; `undefined` leaves the column untouched. The
684
+ // PATCH resolver above coordinates with the model branch — an
685
+ // alias rewrite or a registered-model set ALSO writes
686
+ // `tier_override` (clears or sets) to keep the row consistent
687
+ // with §4.3's "at most one pin non-NULL" invariant.
688
+ if (patchResolved.tierOverride.present) {
689
+ updates.push("tier_override = ?");
690
+ values.push(patchResolved.tierOverride.value);
691
+ }
692
+ // §4.3a — `backend_id` always moves with `model`. The resolver
693
+ // sets `present:true` on both for every model-write so the
694
+ // dispatcher's override block (which guards on both columns
695
+ // together) never reads a half-applied row.
696
+ if (patchResolved.backendId.present) {
697
+ updates.push("backend_id = ?");
698
+ values.push(patchResolved.backendId.value);
699
+ }
700
+ if (parsed.data.taskContext !== undefined) {
701
+ updates.push("task_context = ?");
702
+ values.push(JSON.stringify(parsed.data.taskContext));
703
+ }
704
+ // This branch is unreachable: the zod refine above requires at least one
705
+ // field to be defined — so updates can only be empty if all field-update
706
+ // blocks above are individually skipped, which contradicts the refine.
707
+ /* c8 ignore start */
708
+ if (updates.length === 0) {
709
+ return respondWithAgentError(c, 400, [composeIssue("agent.no_changes", { field: "body", received: parsed.data })], { legacyFields: { details: "No valid fields to update" } });
710
+ }
711
+ /* c8 ignore stop */
712
+ // Optimistic lock: only update if still pending
713
+ values.push(id);
714
+ const result = db.prepare(`UPDATE agent_schedule SET ${updates.join(", ")} WHERE id = ? AND status = 'pending'`).run(...values);
715
+ // Unreachable in unit tests: requires a concurrent scheduler tick to
716
+ // change status from 'pending' to 'running' between the SELECT and this
717
+ // UPDATE. The prior status !== 'pending' check (line ~660) catches the
718
+ // row-not-found case; this fires only on a true time-of-check/time-of-use
719
+ // race that cannot be reproduced without process-level suspension.
720
+ /* c8 ignore start */
721
+ if (result.changes === 0) {
722
+ return respondWithAgentError(c, 409, [composeIssue("agent.schedule_conflict", { field: "status", received: "running" })], { legacyFields: { details: "Item is no longer pending (may have been picked up by scheduler)" } });
723
+ }
724
+ /* c8 ignore stop */
725
+ return c.json({ status: "updated", id, warnings: patchResolved.warnings });
726
+ });
727
+ // DELETE /schedule/:id — Cancel a pending scheduled item
728
+ app.delete("/schedule/:id", (c) => {
729
+ const id = Number(c.req.param("id"));
730
+ if (!Number.isInteger(id) || id <= 0) {
731
+ return respondWithAgentError(c, 400, [
732
+ composeIssue("agent.invalid_id", { field: "id", received: c.req.param("id") }),
733
+ ]);
734
+ }
735
+ const row = db
736
+ .prepare("SELECT id, status FROM agent_schedule WHERE id = ?")
737
+ .get(id);
738
+ if (!row) {
739
+ return respondWithAgentError(c, 404, [
740
+ composeIssue("agent.not_found", { field: "id", received: id }),
741
+ ]);
742
+ }
743
+ if (row.status !== "pending") {
744
+ return respondWithAgentError(c, 409, [composeIssue("agent.schedule_conflict", { field: "status", received: row.status })], { legacyFields: { details: `Cannot cancel item with status '${row.status}'. Only 'pending' items can be cancelled.` } });
745
+ }
746
+ db.prepare("UPDATE agent_schedule SET status = 'skipped' WHERE id = ?").run(id);
747
+ return c.json({ status: "cancelled", id });
748
+ });
749
+ }
750
+ //# sourceMappingURL=agent-schedule.js.map