@rubytech/create-sitedesk-code 0.1.522 → 0.1.523

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 (338) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -1
  3. package/payload/platform/lib/graph-style/dist/index.js +28 -0
  4. package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
  5. package/payload/platform/lib/graph-style/src/__tests__/caption-coverage.test.ts +7 -0
  6. package/payload/platform/lib/graph-style/src/index.ts +24 -0
  7. package/payload/platform/lib/graph-write/dist/__tests__/merge-on.test.d.ts.map +1 -0
  8. package/payload/platform/lib/graph-write/dist/__tests__/merge-on.test.js.map +1 -0
  9. package/payload/platform/lib/graph-write/dist/index.d.ts +16 -0
  10. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  11. package/payload/platform/lib/graph-write/dist/index.js +83 -6
  12. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  13. package/payload/platform/lib/graph-write/src/index.ts +117 -10
  14. package/payload/platform/lib/routine-templates/dist/index.d.ts +151 -0
  15. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -0
  16. package/payload/platform/lib/routine-templates/dist/index.js +207 -0
  17. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -0
  18. package/payload/platform/lib/routine-templates/dist/roster.d.ts +57 -0
  19. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -0
  20. package/payload/platform/lib/routine-templates/dist/roster.js +182 -0
  21. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -0
  22. package/payload/platform/lib/routine-templates/dist/seed-cli.d.ts +2 -0
  23. package/payload/platform/lib/routine-templates/dist/seed-cli.d.ts.map +1 -0
  24. package/payload/platform/lib/routine-templates/dist/seed-cli.js +64 -0
  25. package/payload/platform/lib/routine-templates/dist/seed-cli.js.map +1 -0
  26. package/payload/platform/lib/routine-templates/package.json +6 -0
  27. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +170 -0
  28. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +298 -0
  29. package/payload/platform/lib/routine-templates/src/index.ts +299 -0
  30. package/payload/platform/lib/routine-templates/src/roster.ts +206 -0
  31. package/payload/platform/lib/routine-templates/src/seed-cli.ts +65 -0
  32. package/payload/platform/lib/routine-templates/tsconfig.json +9 -0
  33. package/payload/platform/lib/routine-templates/vitest.config.ts +9 -0
  34. package/payload/platform/neo4j/edge-annotations.json +2 -2
  35. package/payload/platform/neo4j/schema.cypher +25 -1
  36. package/payload/platform/package.json +3 -2
  37. package/payload/platform/plugins/admin/PLUGIN.md +2 -2
  38. package/payload/platform/plugins/admin/mcp/dist/index.js +39 -1
  39. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  40. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +277 -61
  41. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  42. package/payload/platform/plugins/docs/references/admin-ui.md +265 -59
  43. package/payload/platform/plugins/docs/references/memory-guide.md +11 -1
  44. package/payload/platform/plugins/graph/.claude-plugin/plugin.json +1 -1
  45. package/payload/platform/plugins/graph/PLUGIN.md +1 -1
  46. package/payload/platform/plugins/memory/PLUGIN.md +1 -1
  47. package/payload/platform/plugins/memory/mcp/dist/index.js +12 -5
  48. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  49. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.d.ts +2 -0
  50. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.d.ts.map +1 -0
  51. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.js +197 -0
  52. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.js.map +1 -0
  53. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js +55 -9
  54. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js.map +1 -1
  55. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js +96 -0
  56. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js.map +1 -1
  57. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.d.ts +7 -0
  58. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.d.ts.map +1 -1
  59. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.d.ts +29 -0
  60. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.d.ts.map +1 -0
  61. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.js +126 -0
  62. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.js.map +1 -0
  63. package/payload/platform/plugins/memory/mcp/dist/scripts/dream-cycle-sweep.js +7 -4
  64. package/payload/platform/plugins/memory/mcp/dist/scripts/dream-cycle-sweep.js.map +1 -1
  65. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts +1 -0
  66. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts.map +1 -1
  67. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js +18 -1
  68. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts +7 -0
  70. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  71. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +4 -3
  72. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  73. package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
  74. package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -2
  75. package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +4 -4
  76. package/payload/platform/plugins/quickbooks/PLUGIN.md +10 -10
  77. package/payload/platform/plugins/scheduling/PLUGIN.md +49 -1
  78. package/payload/platform/plugins/scheduling/mcp/dist/index.js +48 -0
  79. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  80. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.d.ts +2 -0
  81. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.d.ts.map +1 -0
  82. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.js +78 -0
  83. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.js.map +1 -0
  84. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.d.ts +2 -0
  85. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +457 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -0
  88. package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.d.ts +35 -0
  89. package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.d.ts.map +1 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.js +39 -0
  91. package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.js.map +1 -0
  92. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +175 -0
  93. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -0
  94. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js +533 -0
  95. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -0
  96. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +123 -9
  97. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  98. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.d.ts +2 -0
  99. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.d.ts.map +1 -0
  100. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +189 -0
  101. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -0
  102. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.d.ts +2 -0
  103. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.d.ts.map +1 -0
  104. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js +95 -0
  105. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js.map +1 -0
  106. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.d.ts +2 -0
  107. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.d.ts.map +1 -0
  108. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.js +114 -0
  109. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.js.map +1 -0
  110. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +109 -2
  111. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  112. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +340 -9
  113. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  114. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.d.ts +9 -1
  115. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.d.ts.map +1 -1
  116. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +210 -45
  117. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  118. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +43 -1
  119. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
  120. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js +55 -7
  121. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js.map +1 -1
  122. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-list.test.js +45 -1
  123. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-list.test.js.map +1 -1
  124. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.d.ts +2 -0
  125. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.d.ts.map +1 -0
  126. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.js +96 -0
  127. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.js.map +1 -0
  128. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.d.ts.map +1 -1
  129. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js +2 -1
  130. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js.map +1 -1
  131. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts +5 -0
  132. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
  133. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +13 -0
  134. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
  135. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts +4 -0
  136. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts.map +1 -1
  137. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js +24 -3
  138. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js.map +1 -1
  139. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.d.ts +33 -0
  140. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.d.ts.map +1 -0
  141. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.js +51 -0
  142. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.js.map +1 -0
  143. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  144. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +12 -2
  145. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  146. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +30 -2
  147. package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
  148. package/payload/platform/scripts/check-specialist-tool-surface.mjs +92 -16
  149. package/payload/platform/scripts/seed-neo4j.sh +41 -0
  150. package/payload/platform/scripts/verify-skill-tool-surface.sh +91 -2
  151. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  152. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  153. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  154. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  155. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  156. package/payload/server/{chunk-K7CJGZPU.js → chunk-VUXKXOJU.js} +342 -152
  157. package/payload/server/{chunk-UX2FRNO7.js → chunk-WT2PFGY4.js} +37 -265
  158. package/payload/server/{chunk-PXNY2TAP.js → chunk-XCR5D2G3.js} +239 -10
  159. package/payload/server/{manager-RKL7JZ4Y.js → manager-4TJK3YOY.js} +2 -2
  160. package/payload/server/maxy-edge.js +2 -2
  161. package/payload/server/public/activity.html +5 -5
  162. package/payload/server/public/agents.html +4 -4
  163. package/payload/server/public/assets/{AdminLoginScreens-zc2_qqh-.js → AdminLoginScreens-uknqh2Pm.js} +1 -1
  164. package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.br +0 -0
  165. package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.gz +0 -0
  166. package/payload/server/public/assets/AdminShell-GqtMImyQ.js +2 -0
  167. package/payload/server/public/assets/AdminShell-GqtMImyQ.js.br +0 -0
  168. package/payload/server/public/assets/AdminShell-GqtMImyQ.js.gz +0 -0
  169. package/payload/server/public/assets/{activity-DVgO8YuM.js → activity-B4KfMJqO.js} +1 -1
  170. package/payload/server/public/assets/activity-B4KfMJqO.js.br +0 -0
  171. package/payload/server/public/assets/activity-B4KfMJqO.js.gz +0 -0
  172. package/payload/server/public/assets/admin-DxCZeVw0.js +1 -0
  173. package/payload/server/public/assets/admin-DxCZeVw0.js.br +0 -0
  174. package/payload/server/public/assets/admin-DxCZeVw0.js.gz +0 -0
  175. package/payload/server/public/assets/agents-BtwBuO4G.js +1 -0
  176. package/payload/server/public/assets/agents-BtwBuO4G.js.br +0 -0
  177. package/payload/server/public/assets/agents-BtwBuO4G.js.gz +0 -0
  178. package/payload/server/public/assets/{browser-Mw7DY3ft.js → browser-B3hSzI3O.js} +1 -1
  179. package/payload/server/public/assets/browser-B3hSzI3O.js.br +0 -0
  180. package/payload/server/public/assets/browser-B3hSzI3O.js.gz +0 -0
  181. package/payload/server/public/assets/{calendar-B9gvL_1_.js → calendar-BggxXxhS.js} +1 -1
  182. package/payload/server/public/assets/calendar-BggxXxhS.js.br +0 -0
  183. package/payload/server/public/assets/calendar-BggxXxhS.js.gz +0 -0
  184. package/payload/server/public/assets/chat-flivHt0t.js +1 -0
  185. package/payload/server/public/assets/chat-flivHt0t.js.br +0 -0
  186. package/payload/server/public/assets/chat-flivHt0t.js.gz +0 -0
  187. package/payload/server/public/assets/chevron-left-nVRThX7f.js +1 -0
  188. package/payload/server/public/assets/chevron-right-CLqfrkRA.js +1 -0
  189. package/payload/server/public/assets/chevron-right-CLqfrkRA.js.br +0 -0
  190. package/payload/server/public/assets/clock-Dj3SRZKo.js +1 -0
  191. package/payload/server/public/assets/clock-Dj3SRZKo.js.br +0 -0
  192. package/payload/server/public/assets/clock-Dj3SRZKo.js.gz +0 -0
  193. package/payload/server/public/assets/data-Ckjkne54.js +1 -0
  194. package/payload/server/public/assets/data-Ckjkne54.js.br +3 -0
  195. package/payload/server/public/assets/data-Ckjkne54.js.gz +0 -0
  196. package/payload/server/public/assets/{file-text-dYBnXNEX.js → file-text-BKs9eyiw.js} +1 -1
  197. package/payload/server/public/assets/file-text-BKs9eyiw.js.br +0 -0
  198. package/payload/server/public/assets/file-text-BKs9eyiw.js.gz +0 -0
  199. package/payload/server/public/assets/{graph-CDyzd1Et.js → graph-DTi71NaZ.js} +3 -3
  200. package/payload/server/public/assets/graph-DTi71NaZ.js.br +0 -0
  201. package/payload/server/public/assets/graph-DTi71NaZ.js.gz +0 -0
  202. package/payload/server/public/assets/graph-labels-BT3S6e9H.js +1 -0
  203. package/payload/server/public/assets/graph-labels-BT3S6e9H.js.br +0 -0
  204. package/payload/server/public/assets/graph-labels-BT3S6e9H.js.gz +0 -0
  205. package/payload/server/public/assets/{maximize-2-M-iSaznd.js → maximize-2-zC94tsxY.js} +1 -1
  206. package/payload/server/public/assets/maximize-2-zC94tsxY.js.br +0 -0
  207. package/payload/server/public/assets/maximize-2-zC94tsxY.js.gz +0 -0
  208. package/payload/server/public/assets/operator-BtWNEMh-.js +1 -0
  209. package/payload/server/public/assets/operator-BtWNEMh-.js.br +0 -0
  210. package/payload/server/public/assets/operator-BtWNEMh-.js.gz +0 -0
  211. package/payload/server/public/assets/page-BFm91p0e.js +1 -0
  212. package/payload/server/public/assets/page-BFm91p0e.js.br +0 -0
  213. package/payload/server/public/assets/page-BFm91p0e.js.gz +0 -0
  214. package/payload/server/public/assets/{page-CZ-73FAk.js → page-Ccl0FazM.js} +3 -3
  215. package/payload/server/public/assets/page-Ccl0FazM.js.br +0 -0
  216. package/payload/server/public/assets/page-Ccl0FazM.js.gz +0 -0
  217. package/payload/server/public/assets/{public-CN-ltC8x.js → public-BpC6cn9S.js} +1 -1
  218. package/payload/server/public/assets/public-BpC6cn9S.js.br +0 -0
  219. package/payload/server/public/assets/public-BpC6cn9S.js.gz +0 -0
  220. package/payload/server/public/assets/{rotate-ccw-Buopsc22.js → rotate-ccw-BNcqbHkZ.js} +1 -1
  221. package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.br +0 -0
  222. package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.gz +0 -0
  223. package/payload/server/public/assets/routines-D5iia-XG.js +1 -0
  224. package/payload/server/public/assets/routines-D5iia-XG.js.br +0 -0
  225. package/payload/server/public/assets/routines-D5iia-XG.js.gz +0 -0
  226. package/payload/server/public/assets/{skills-DiiuVzDK.js → skills-COLAw_jt.js} +1 -1
  227. package/payload/server/public/assets/skills-COLAw_jt.js.br +0 -0
  228. package/payload/server/public/assets/skills-COLAw_jt.js.gz +0 -0
  229. package/payload/server/public/assets/tasks-CZDQI4nB.js +1 -0
  230. package/payload/server/public/assets/tasks-CZDQI4nB.js.br +0 -0
  231. package/payload/server/public/assets/tasks-CZDQI4nB.js.gz +0 -0
  232. package/payload/server/public/assets/{time-entry-format-BBokCF-D.js → time-entry-format-laTFzawg.js} +1 -1
  233. package/payload/server/public/assets/time-entry-format-laTFzawg.js.br +0 -0
  234. package/payload/server/public/assets/time-entry-format-laTFzawg.js.gz +0 -0
  235. package/payload/server/public/assets/{triangle-alert-C_AcpTW5.js → triangle-alert-DrwqhEog.js} +1 -1
  236. package/payload/server/public/assets/triangle-alert-DrwqhEog.js.br +0 -0
  237. package/payload/server/public/assets/triangle-alert-DrwqhEog.js.gz +0 -0
  238. package/payload/server/public/assets/{useCopyFeedback-TdimmPVR.js → useCopyFeedback-Cxme5GK6.js} +1 -1
  239. package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.br +0 -0
  240. package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.gz +0 -0
  241. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css +1 -0
  242. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.br +0 -0
  243. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.gz +0 -0
  244. package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js +14 -0
  245. package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js.br +0 -0
  246. package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js.gz +0 -0
  247. package/payload/server/public/assets/{useVoiceRecorder-BT2738ZS.js → useVoiceRecorder-DUBpVa2T.js} +1 -1
  248. package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.br +0 -0
  249. package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.gz +0 -0
  250. package/payload/server/public/assets/{wrench-B51s5kGA.js → wrench-DWuxPnzF.js} +1 -1
  251. package/payload/server/public/assets/wrench-DWuxPnzF.js.br +0 -0
  252. package/payload/server/public/assets/wrench-DWuxPnzF.js.gz +0 -0
  253. package/payload/server/public/browser.html +4 -4
  254. package/payload/server/public/calendar.html +7 -7
  255. package/payload/server/public/chat.html +13 -13
  256. package/payload/server/public/data.html +11 -11
  257. package/payload/server/public/graph.html +9 -9
  258. package/payload/server/public/index.html +14 -14
  259. package/payload/server/public/operator.html +14 -14
  260. package/payload/server/public/public.html +13 -13
  261. package/payload/server/public/routines.html +6 -6
  262. package/payload/server/public/skills.html +5 -5
  263. package/payload/server/public/tasks.html +6 -6
  264. package/payload/server/server.js +5910 -5369
  265. package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.br +0 -0
  266. package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.gz +0 -0
  267. package/payload/server/public/assets/AdminShell-IGUdTx5q.js +0 -2
  268. package/payload/server/public/assets/AdminShell-IGUdTx5q.js.br +0 -0
  269. package/payload/server/public/assets/AdminShell-IGUdTx5q.js.gz +0 -0
  270. package/payload/server/public/assets/activity-DVgO8YuM.js.br +0 -0
  271. package/payload/server/public/assets/activity-DVgO8YuM.js.gz +0 -0
  272. package/payload/server/public/assets/admin-xtpM7fgl.js +0 -1
  273. package/payload/server/public/assets/admin-xtpM7fgl.js.br +0 -0
  274. package/payload/server/public/assets/admin-xtpM7fgl.js.gz +0 -0
  275. package/payload/server/public/assets/agents-P0nTIxo-.js +0 -1
  276. package/payload/server/public/assets/agents-P0nTIxo-.js.br +0 -0
  277. package/payload/server/public/assets/agents-P0nTIxo-.js.gz +0 -0
  278. package/payload/server/public/assets/browser-Mw7DY3ft.js.br +0 -0
  279. package/payload/server/public/assets/browser-Mw7DY3ft.js.gz +0 -0
  280. package/payload/server/public/assets/calendar-B9gvL_1_.js.br +0 -0
  281. package/payload/server/public/assets/calendar-B9gvL_1_.js.gz +0 -0
  282. package/payload/server/public/assets/chat-DBGqh4wg.js +0 -1
  283. package/payload/server/public/assets/chat-DBGqh4wg.js.br +0 -2
  284. package/payload/server/public/assets/chat-DBGqh4wg.js.gz +0 -0
  285. package/payload/server/public/assets/chevron-left-Bl4vpOM0.js +0 -1
  286. package/payload/server/public/assets/chevron-left-Bl4vpOM0.js.br +0 -0
  287. package/payload/server/public/assets/chevron-right-BExigCnp.js +0 -1
  288. package/payload/server/public/assets/chevron-right-BExigCnp.js.br +0 -0
  289. package/payload/server/public/assets/clock-D8TJvgJC.js +0 -1
  290. package/payload/server/public/assets/clock-D8TJvgJC.js.br +0 -0
  291. package/payload/server/public/assets/data-HfFSxaC2.js +0 -1
  292. package/payload/server/public/assets/data-HfFSxaC2.js.br +0 -0
  293. package/payload/server/public/assets/data-HfFSxaC2.js.gz +0 -0
  294. package/payload/server/public/assets/file-text-dYBnXNEX.js.br +0 -0
  295. package/payload/server/public/assets/file-text-dYBnXNEX.js.gz +0 -0
  296. package/payload/server/public/assets/graph-CDyzd1Et.js.br +0 -0
  297. package/payload/server/public/assets/graph-CDyzd1Et.js.gz +0 -0
  298. package/payload/server/public/assets/graph-labels-D1LkKiJr.js +0 -1
  299. package/payload/server/public/assets/graph-labels-D1LkKiJr.js.br +0 -0
  300. package/payload/server/public/assets/graph-labels-D1LkKiJr.js.gz +0 -0
  301. package/payload/server/public/assets/maximize-2-M-iSaznd.js.br +0 -0
  302. package/payload/server/public/assets/maximize-2-M-iSaznd.js.gz +0 -0
  303. package/payload/server/public/assets/operator-9jfCv1Fg.js +0 -1
  304. package/payload/server/public/assets/operator-9jfCv1Fg.js.br +0 -0
  305. package/payload/server/public/assets/operator-9jfCv1Fg.js.gz +0 -0
  306. package/payload/server/public/assets/page-CZ-73FAk.js.br +0 -0
  307. package/payload/server/public/assets/page-CZ-73FAk.js.gz +0 -0
  308. package/payload/server/public/assets/page-CjwSt7kx.js +0 -1
  309. package/payload/server/public/assets/page-CjwSt7kx.js.br +0 -0
  310. package/payload/server/public/assets/page-CjwSt7kx.js.gz +0 -0
  311. package/payload/server/public/assets/public-CN-ltC8x.js.br +0 -0
  312. package/payload/server/public/assets/public-CN-ltC8x.js.gz +0 -0
  313. package/payload/server/public/assets/rotate-ccw-Buopsc22.js.br +0 -0
  314. package/payload/server/public/assets/rotate-ccw-Buopsc22.js.gz +0 -0
  315. package/payload/server/public/assets/routines-C-yr8ddT.js +0 -1
  316. package/payload/server/public/assets/routines-C-yr8ddT.js.br +0 -0
  317. package/payload/server/public/assets/routines-C-yr8ddT.js.gz +0 -0
  318. package/payload/server/public/assets/skills-DiiuVzDK.js.br +0 -0
  319. package/payload/server/public/assets/skills-DiiuVzDK.js.gz +0 -0
  320. package/payload/server/public/assets/tasks-CnHIfn2_.js +0 -1
  321. package/payload/server/public/assets/tasks-CnHIfn2_.js.br +0 -0
  322. package/payload/server/public/assets/tasks-CnHIfn2_.js.gz +0 -0
  323. package/payload/server/public/assets/time-entry-format-BBokCF-D.js.br +0 -0
  324. package/payload/server/public/assets/time-entry-format-BBokCF-D.js.gz +0 -0
  325. package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.br +0 -0
  326. package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.gz +0 -0
  327. package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.br +0 -0
  328. package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.gz +0 -0
  329. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js +0 -14
  330. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.br +0 -0
  331. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.gz +0 -0
  332. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css +0 -1
  333. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.br +0 -0
  334. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.gz +0 -0
  335. package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.br +0 -0
  336. package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.gz +0 -0
  337. package/payload/server/public/assets/wrench-B51s5kGA.js.br +0 -0
  338. package/payload/server/public/assets/wrench-B51s5kGA.js.gz +0 -0
@@ -0,0 +1,533 @@
1
+ /**
2
+ * Task 2136 — the per-run record.
3
+ *
4
+ * A routine fire used to write five last-write-wins scalars onto its own
5
+ * `:Event` node, so firing N+1 destroyed firing N and no page could show what a
6
+ * run produced. This module owns the durable alternative: one `:RoutineRun` per
7
+ * fire, linked `(r)-[:RUN_OF]->(e:Event)` on the `:WorkflowRun` precedent
8
+ * (workflows/mcp/src/tools/workflow-execute.ts).
9
+ *
10
+ * Both dispatch paths import this module rather than writing their own Cypher,
11
+ * so the recurring loop and the one-time loop cannot drift — a drift that is the
12
+ * exact reason the one-time path never got a `lastTriggered`.
13
+ *
14
+ * Every export honours the sweep contract: it never throws. A record that cannot
15
+ * be written degrades to a null runId, and every later call on a null runId is a
16
+ * no-op. A dispatch is never lost because its bookkeeping failed.
17
+ */
18
+ import { randomUUID } from "node:crypto";
19
+ import { closeSync, openSync, readdirSync, readSync, statSync } from "node:fs";
20
+ import { dirname, join } from "node:path";
21
+ /** Records are kept for 30 days. A quarter-hourly routine settles at ~2,900 per account. */
22
+ export const RETENTION_DAYS = 30;
23
+ /**
24
+ * How long an `open` record may live before it counts as an orphan. This is
25
+ * `DISPATCH_TIMEOUT_MS` from check-due-events, the hard ceiling on the dispatch
26
+ * leg, so a genuinely in-flight run can never be miscounted.
27
+ */
28
+ export const ORPHAN_AFTER_MS = 600_000;
29
+ /** Neo4j integers arrive as `{low, high}` objects; normalise to a JS number. */
30
+ export function toNumber(v) {
31
+ if (v === null || v === undefined)
32
+ return null;
33
+ if (typeof v === "number")
34
+ return v;
35
+ if (typeof v === "object" &&
36
+ v !== null &&
37
+ typeof v.toNumber === "function") {
38
+ return v.toNumber();
39
+ }
40
+ const n = Number(v);
41
+ return Number.isNaN(n) ? null : n;
42
+ }
43
+ /**
44
+ * Open the record BEFORE the dispatch, so a run that dies mid-flight still has a
45
+ * record and a line. Returns the runId, or null when the write failed.
46
+ */
47
+ export async function openRoutineRun(driver, input) {
48
+ const runId = randomUUID();
49
+ const startedAt = new Date().toISOString();
50
+ const session = driver.session();
51
+ try {
52
+ await session.run(`MATCH (e:Event {eventId: $eventId})
53
+ CREATE (r:RoutineRun $props)
54
+ CREATE (r)-[:RUN_OF]->(e)`, {
55
+ eventId: input.eventId,
56
+ props: {
57
+ runId,
58
+ eventId: input.eventId,
59
+ accountId: input.accountId,
60
+ kind: input.kind,
61
+ mode: input.mode,
62
+ status: "open",
63
+ target: input.target,
64
+ scheduledFor: input.scheduledFor,
65
+ startedAt,
66
+ endedAt: null,
67
+ finishedAt: null,
68
+ ranMs: null,
69
+ httpStatus: null,
70
+ dispatchResult: null,
71
+ sessionKey: null,
72
+ transcriptOffset: null,
73
+ bounded: false,
74
+ error: null,
75
+ },
76
+ });
77
+ console.error(`[routine-run] op=open runId=${runId} eventId=${input.eventId.slice(0, 8)} ` +
78
+ `acct=${input.accountId.slice(0, 8)} kind=${input.kind} mode=${input.mode} ` +
79
+ `scheduledFor=${input.scheduledFor}`);
80
+ return runId;
81
+ }
82
+ catch (err) {
83
+ console.error(`[routine-run] op=open-error eventId=${input.eventId.slice(0, 8)} ` +
84
+ `detail=${err instanceof Error ? err.message : String(err)}`);
85
+ return null;
86
+ }
87
+ finally {
88
+ try {
89
+ await session.close();
90
+ }
91
+ catch {
92
+ // ignore
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * The transport result, emitted separately from the work result so the two can
98
+ * never be conflated. Log-only: the httpStatus lands on the node at close.
99
+ */
100
+ export function logRunDispatch(runId, target, httpStatus) {
101
+ if (!runId)
102
+ return;
103
+ console.error(`[routine-run] op=dispatch runId=${runId} target=${target} httpStatus=${httpStatus ?? "-"}`);
104
+ }
105
+ /**
106
+ * Close the record. `ranMs` is computed in Cypher from the stored `startedAt`
107
+ * so it is measured against the record's own clock rather than assumed from a
108
+ * value the caller carried. `startedAt` is an ISO string, so it is parsed with
109
+ * `datetime()` before the subtraction — a bare string compare against a
110
+ * temporal would silently yield null.
111
+ */
112
+ export async function closeRoutineRun(driver, runId, input) {
113
+ if (!runId)
114
+ return;
115
+ const endedAt = new Date().toISOString();
116
+ const session = driver.session();
117
+ try {
118
+ const res = await session.run(`MATCH (r:RoutineRun {runId: $runId})
119
+ SET r.status = $outcome,
120
+ r.endedAt = $endedAt,
121
+ r.dispatchResult = $dispatchResult,
122
+ r.httpStatus = $httpStatus,
123
+ r.error = $error,
124
+ r.ranMs = datetime($endedAt).epochMillis - datetime(r.startedAt).epochMillis
125
+ RETURN r.ranMs AS ranMs`, {
126
+ runId,
127
+ outcome: input.outcome,
128
+ endedAt,
129
+ dispatchResult: input.dispatchResult ?? null,
130
+ httpStatus: input.httpStatus ?? null,
131
+ error: input.error ?? null,
132
+ });
133
+ const ranMs = toNumber(res.records[0]?.get("ranMs"));
134
+ console.error(`[routine-run] op=close runId=${runId} outcome=${input.outcome} ranMs=${ranMs ?? "-"}`);
135
+ }
136
+ catch (err) {
137
+ console.error(`[routine-run] op=close-error runId=${runId} outcome=${input.outcome} ` +
138
+ `detail=${err instanceof Error ? err.message : String(err)}`);
139
+ }
140
+ finally {
141
+ try {
142
+ await session.close();
143
+ }
144
+ catch {
145
+ // ignore
146
+ }
147
+ }
148
+ }
149
+ export async function recordRunSession(driver, runId, input) {
150
+ if (!runId)
151
+ return;
152
+ const session = driver.session();
153
+ try {
154
+ await session.run(`MATCH (r:RoutineRun {runId: $runId})
155
+ SET r.sessionKey = $sessionKey,
156
+ r.transcriptOffset = $transcriptOffset,
157
+ r.bounded = $bounded`, {
158
+ runId,
159
+ sessionKey: input.sessionKey,
160
+ transcriptOffset: input.transcriptOffset,
161
+ bounded: input.bounded,
162
+ });
163
+ console.error(`[routine-run] op=session runId=${runId} sessionKey=${input.sessionKey ?? "-"} bounded=${input.bounded}`);
164
+ }
165
+ catch (err) {
166
+ console.error(`[routine-run] op=session-error runId=${runId} ` +
167
+ `detail=${err instanceof Error ? err.message : String(err)}`);
168
+ }
169
+ finally {
170
+ try {
171
+ await session.close();
172
+ }
173
+ catch {
174
+ // ignore
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * Locate a session's project dir by scanning the projects root for its JSONL.
180
+ *
181
+ * Probes `<slug>/archive/` as well as `<slug>/` because the boundary writer does:
182
+ * `schedule-inject` resolves through `findSessionProjectDir`, whose scan covers
183
+ * both. Without the archive probe an operator-archived session gets
184
+ * `bounded=true` at inject time and no project dir at promote time, so its
185
+ * records claim a usable boundary and are then permanently unpromotable — the
186
+ * one state the `bounded` flag exists to rule out.
187
+ */
188
+ function defaultProjectDirFor(sessionKey) {
189
+ const cfg = process.env.CLAUDE_CONFIG_DIR;
190
+ if (!cfg)
191
+ return null;
192
+ const projectsRoot = join(cfg, "projects");
193
+ let slugs;
194
+ try {
195
+ slugs = readdirSync(projectsRoot, { withFileTypes: true })
196
+ .filter((d) => d.isDirectory())
197
+ .map((d) => d.name);
198
+ }
199
+ catch {
200
+ return null;
201
+ }
202
+ for (const slug of slugs) {
203
+ for (const candidate of [
204
+ join(projectsRoot, slug, `${sessionKey}.jsonl`),
205
+ join(projectsRoot, slug, "archive", `${sessionKey}.jsonl`),
206
+ ]) {
207
+ try {
208
+ statSync(candidate);
209
+ return dirname(candidate);
210
+ }
211
+ catch {
212
+ // not here
213
+ }
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ /**
219
+ * Read a transcript from `from` BYTES to the end. Null when unreadable.
220
+ *
221
+ * The offset is a byte count — `schedule-inject` records `statSync().size`. It is
222
+ * therefore read with a positional `readSync`, not by decoding the file and
223
+ * slicing the string: `String.prototype.slice` indexes UTF-16 code units, so one
224
+ * multi-byte character anywhere before the boundary (an emoji, an accented name,
225
+ * a curly quote — all routine in a transcript) would shift the cut and silently
226
+ * drop the head of this run's output, leaving a finished run recorded as merely
227
+ * started. Reading positionally also means only the tail is loaded, not the whole
228
+ * transcript, on every record on every 120-second tick.
229
+ */
230
+ export function readTranscriptTail(path, from, to = null) {
231
+ let fd = null;
232
+ try {
233
+ const size = statSync(path).size;
234
+ const end = to === null ? size : Math.min(to, size);
235
+ if (end <= from)
236
+ return "";
237
+ const length = end - from;
238
+ const buf = Buffer.allocUnsafe(length);
239
+ fd = openSync(path, "r");
240
+ const read = readSync(fd, buf, 0, length, from);
241
+ return buf.subarray(0, read).toString("utf8");
242
+ }
243
+ catch {
244
+ return null;
245
+ }
246
+ finally {
247
+ if (fd !== null) {
248
+ try {
249
+ closeSync(fd);
250
+ }
251
+ catch {
252
+ // ignore
253
+ }
254
+ }
255
+ }
256
+ }
257
+ /**
258
+ * Decide a run's status from the slice of transcript that belongs to it.
259
+ *
260
+ * Pure, so the rule is testable without a filesystem or a graph.
261
+ *
262
+ * The window alone is not enough to attribute output. `adminSessionIdFor` puts
263
+ * every run for one destination in ONE transcript together with the operator's
264
+ * own messages, so "an assistant row appeared after this run's offset" is true
265
+ * whenever the operator simply had a conversation — which would report a routine
266
+ * that has been dead for a week as having produced output on every fire. The
267
+ * dispatcher prefixes each injected turn with a schedule marker naming the
268
+ * routine (`… event <first 8 of eventId> …`, composeScheduleMarker on both the
269
+ * WhatsApp and Telegram notification paths), so the run's own inbound is
270
+ * identifiable inside the window:
271
+ *
272
+ * - no marker → nothing of this run's landed. Do not promote.
273
+ * - marker, no assistant → started: the inbound journalled, no answer yet.
274
+ * - marker then assistant → finished: this run produced that output.
275
+ *
276
+ * The assistant row must come AFTER the marker, or a reply to the operator's
277
+ * earlier message would be credited to this run.
278
+ */
279
+ export function classifyRunEvidence(window, eventId) {
280
+ const marker = `event ${eventId.slice(0, 8)}`;
281
+ const at = window.indexOf(marker);
282
+ if (at === -1)
283
+ return "none";
284
+ return /"role"\s*:\s*"assistant"/.test(window.slice(at + marker.length)) ? "finished" : "started";
285
+ }
286
+ /**
287
+ * Promote `accepted` and `started` records from evidence in the transcript.
288
+ *
289
+ * This is the honest half of the outcome vocabulary. The dispatcher can only
290
+ * ever say `accepted` — `handleInbound` is fire-and-forget and a spawn failure
291
+ * returns rather than throwing — so `started` and `finished` are established
292
+ * here, from evidence inside the slice of transcript that belongs to the run:
293
+ * bounded below by its own recorded offset and above by the next run's on the
294
+ * same transcript, and identified within that window by the run's own schedule
295
+ * marker (see `classifyRunEvidence`).
296
+ *
297
+ * A `bounded=false` record is never selected: without a lower boundary there is
298
+ * no way to attribute appended bytes to THIS run rather than to the operator's
299
+ * own traffic in the same shared transcript. Leaving it `accepted` is the
300
+ * correct reading, not a gap.
301
+ *
302
+ * Never throws (honours the sweep contract).
303
+ */
304
+ export async function promoteRoutineRuns(driver, accountId, deps = {}) {
305
+ const readTail = deps.readTail ?? readTranscriptTail;
306
+ const projectDirFor = deps.projectDirFor ?? defaultProjectDirFor;
307
+ let started = 0;
308
+ let finished = 0;
309
+ const session = driver.session();
310
+ try {
311
+ // Every run on this account's transcripts, not just the promotable ones:
312
+ // a candidate's window is closed by the NEXT run's offset on the same
313
+ // sessionKey, and that successor may already be finished.
314
+ const res = await session.run(`MATCH (r:RoutineRun)
315
+ WHERE r.accountId = $accountId
316
+ AND r.bounded = true
317
+ AND r.sessionKey IS NOT NULL
318
+ RETURN r.runId AS runId, r.sessionKey AS sessionKey, r.eventId AS eventId,
319
+ r.transcriptOffset AS transcriptOffset, r.status AS status
320
+ ORDER BY r.sessionKey, r.transcriptOffset`, { accountId });
321
+ const rows = res.records.map((rec) => ({
322
+ runId: rec.get("runId"),
323
+ sessionKey: rec.get("sessionKey"),
324
+ eventId: rec.get("eventId"),
325
+ offset: toNumber(rec.get("transcriptOffset")) ?? 0,
326
+ status: rec.get("status"),
327
+ }));
328
+ for (let i = 0; i < rows.length; i++) {
329
+ const { runId, sessionKey, eventId, offset, status } = rows[i];
330
+ if (status !== "accepted" && status !== "started")
331
+ continue;
332
+ // The ceiling is the next run's offset in the same transcript. Without it
333
+ // a run's window runs to end of file and swallows every later run's
334
+ // output, so run N and run N+1 would both be credited with the same
335
+ // answer. `null` means this is the newest run there: the window is still
336
+ // open and simply ends at the current end of file.
337
+ const succ = rows[i + 1];
338
+ const ceiling = succ && succ.sessionKey === sessionKey ? succ.offset : null;
339
+ const projectDir = projectDirFor(sessionKey);
340
+ if (!projectDir)
341
+ continue;
342
+ const win = readTail(join(projectDir, `${sessionKey}.jsonl`), offset, ceiling);
343
+ if (win === null || win.length === 0)
344
+ continue;
345
+ const evidence = classifyRunEvidence(win, eventId);
346
+ if (evidence === "none")
347
+ continue;
348
+ const next = evidence;
349
+ const produced = evidence === "finished";
350
+ if (next === status)
351
+ continue;
352
+ const now = new Date().toISOString();
353
+ const w = driver.session();
354
+ try {
355
+ await w.run(`MATCH (r:RoutineRun {runId: $runId})
356
+ SET r.status = $status,
357
+ r.finishedAt = $finishedAt`, { runId, status: next, finishedAt: produced ? now : null });
358
+ if (produced)
359
+ finished++;
360
+ else
361
+ started++;
362
+ console.error(`[routine-run] op=promote runId=${runId} status=${next}`);
363
+ }
364
+ finally {
365
+ try {
366
+ await w.close();
367
+ }
368
+ catch {
369
+ // ignore
370
+ }
371
+ }
372
+ }
373
+ }
374
+ catch (err) {
375
+ console.error(`[routine-run] op=promote-error acct=${accountId.slice(0, 8)} ` +
376
+ `detail=${err instanceof Error ? err.message : String(err)}`);
377
+ }
378
+ finally {
379
+ try {
380
+ await session.close();
381
+ }
382
+ catch {
383
+ // ignore
384
+ }
385
+ }
386
+ return { started, finished };
387
+ }
388
+ /**
389
+ * The retention control. Unbounded record growth is the same defect as the
390
+ * uncapped notes string this task removes, so the sweep ships with the record
391
+ * rather than after it. Never throws.
392
+ */
393
+ export async function sweepRoutineRuns(driver, accountId, nowMs, retentionDays = RETENTION_DAYS) {
394
+ const cutoff = new Date(nowMs - retentionDays * 24 * 60 * 60 * 1000).toISOString();
395
+ const session = driver.session();
396
+ try {
397
+ const res = await session.run(`MATCH (r:RoutineRun)
398
+ WHERE r.accountId = $accountId AND r.startedAt < $cutoff
399
+ WITH r LIMIT 5000
400
+ DETACH DELETE r
401
+ RETURN count(*) AS deleted`, { accountId, cutoff });
402
+ const deleted = toNumber(res.records[0]?.get("deleted")) ?? 0;
403
+ if (deleted > 0) {
404
+ console.error(`[routine-run] op=sweep acct=${accountId.slice(0, 8)} deleted=${deleted} cutoff=${cutoff}`);
405
+ }
406
+ return deleted;
407
+ }
408
+ catch (err) {
409
+ console.error(`[routine-run] op=sweep-error acct=${accountId.slice(0, 8)} ` +
410
+ `detail=${err instanceof Error ? err.message : String(err)}`);
411
+ return 0;
412
+ }
413
+ finally {
414
+ try {
415
+ await session.close();
416
+ }
417
+ catch {
418
+ // ignore
419
+ }
420
+ }
421
+ }
422
+ /**
423
+ * Records opened and never closed. A run dying between open and close emits
424
+ * nothing on its own; this is the only control that finds it. Emitted every
425
+ * tick including zero, because a check that is silent when healthy cannot be
426
+ * distinguished from a check that stopped running.
427
+ */
428
+ export async function auditRunOrphans(driver, accountId, nowMs) {
429
+ const cutoff = new Date(nowMs - ORPHAN_AFTER_MS).toISOString();
430
+ const session = driver.session();
431
+ try {
432
+ const res = await session.run(`MATCH (r:RoutineRun)
433
+ WHERE r.accountId = $accountId AND r.status = 'open' AND r.startedAt < $cutoff
434
+ RETURN r.runId AS runId
435
+ ORDER BY r.startedAt`, { accountId, cutoff });
436
+ const runIds = res.records.map((r) => r.get("runId"));
437
+ console.error(`[schedule-audit] op=run-orphans acct=${accountId.slice(0, 8)} count=${runIds.length} ` +
438
+ `runIds=[${runIds.join(",")}]`);
439
+ }
440
+ catch (err) {
441
+ console.error(`[schedule-audit] op=run-orphans-error acct=${accountId.slice(0, 8)} ` +
442
+ `detail=${err instanceof Error ? err.message : String(err)}`);
443
+ }
444
+ finally {
445
+ try {
446
+ await session.close();
447
+ }
448
+ catch {
449
+ // ignore
450
+ }
451
+ }
452
+ }
453
+ /**
454
+ * Reconciles the OLD scalar against the NEW record: a routine whose
455
+ * `lastTriggered` moved past the previous audit with no `:RoutineRun` at that
456
+ * instant fired through a path that writes no record. Load-bearing — without it
457
+ * a missed dispatch path would be assumed absent rather than detected.
458
+ *
459
+ * Defined against `lastTriggered`, which only the RECURRING path writes (the
460
+ * one-time path sets `eventStatus` and `updatedAt` alone). It therefore covers
461
+ * the recurring path only, by construction. The one-time path is covered by its
462
+ * own test and by the census.
463
+ *
464
+ * Returns the new watermark: the newest `lastTriggered` seen, or the previous
465
+ * watermark when nothing fired. Never throws.
466
+ */
467
+ export async function auditFiresWithoutRecords(driver, accountId, watermark) {
468
+ const since = watermark ?? new Date(0).toISOString();
469
+ const session = driver.session();
470
+ try {
471
+ const res = await session.run(`MATCH (e:Event)
472
+ WHERE e.accountId = $accountId
473
+ AND e.lastTriggered IS NOT NULL
474
+ AND e.lastTriggered > $watermark
475
+ AND NOT EXISTS {
476
+ MATCH (r:RoutineRun)-[:RUN_OF]->(e)
477
+ WHERE r.scheduledFor = e.lastTriggered
478
+ }
479
+ RETURN e.eventId AS eventId, e.lastTriggered AS lastTriggered
480
+ ORDER BY e.lastTriggered`, { accountId, watermark: since });
481
+ const rows = res.records.map((r) => ({
482
+ eventId: r.get("eventId"),
483
+ lastTriggered: r.get("lastTriggered"),
484
+ }));
485
+ console.error(`[schedule-audit] op=fires-without-records acct=${accountId.slice(0, 8)} count=${rows.length} ` +
486
+ `eventIds=[${rows.map((r) => r.eventId).join(",")}]`);
487
+ if (rows.length === 0)
488
+ return since;
489
+ return rows.reduce((a, b) => (b.lastTriggered > a ? b.lastTriggered : a), since);
490
+ }
491
+ catch (err) {
492
+ console.error(`[schedule-audit] op=fires-without-records-error acct=${accountId.slice(0, 8)} ` +
493
+ `detail=${err instanceof Error ? err.message : String(err)}`);
494
+ return since;
495
+ }
496
+ finally {
497
+ try {
498
+ await session.close();
499
+ }
500
+ catch {
501
+ // ignore
502
+ }
503
+ }
504
+ }
505
+ /**
506
+ * The retention control's own signal. A rising `total` with a fixed `oldest` is
507
+ * the unbounded-growth signature — the shape the notes blob had for years with
508
+ * nothing watching it. Emitted every tick including zero.
509
+ */
510
+ export async function auditRunCensus(driver, accountId) {
511
+ const session = driver.session();
512
+ try {
513
+ const res = await session.run(`MATCH (r:RoutineRun)
514
+ WHERE r.accountId = $accountId
515
+ RETURN count(r) AS total, min(r.startedAt) AS oldest`, { accountId });
516
+ const total = toNumber(res.records[0]?.get("total")) ?? 0;
517
+ const oldest = res.records[0]?.get("oldest") ?? "-";
518
+ console.error(`[schedule-audit] op=run-census acct=${accountId.slice(0, 8)} total=${total} oldest=${oldest}`);
519
+ }
520
+ catch (err) {
521
+ console.error(`[schedule-audit] op=run-census-error acct=${accountId.slice(0, 8)} ` +
522
+ `detail=${err instanceof Error ? err.message : String(err)}`);
523
+ }
524
+ finally {
525
+ try {
526
+ await session.close();
527
+ }
528
+ catch {
529
+ // ignore
530
+ }
531
+ }
532
+ }
533
+ //# sourceMappingURL=routine-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routine-run.js","sourceRoot":"","sources":["../../src/lib/routine-run.ts"],"names":[],"mappings":"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"}