@rubytech/create-sitedesk-code 0.1.528 → 0.1.530

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 (282) hide show
  1. package/dist/index.js +13 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/account-ingest-token/dist/index.d.ts +21 -0
  4. package/payload/platform/lib/account-ingest-token/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/account-ingest-token/dist/index.js +128 -0
  6. package/payload/platform/lib/account-ingest-token/dist/index.js.map +1 -0
  7. package/payload/platform/lib/account-ingest-token/src/index.ts +137 -0
  8. package/payload/platform/lib/account-ingest-token/tsconfig.json +8 -0
  9. package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts +5 -0
  10. package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts.map +1 -1
  11. package/payload/platform/lib/agent-dispatch-rule/dist/index.js.map +1 -1
  12. package/payload/platform/lib/agent-dispatch-rule/src/index.ts +5 -0
  13. package/payload/platform/lib/routine-templates/dist/index.d.ts +19 -3
  14. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  15. package/payload/platform/lib/routine-templates/dist/index.js +22 -4
  16. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  17. package/payload/platform/lib/routine-templates/dist/roster.d.ts +19 -6
  18. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  19. package/payload/platform/lib/routine-templates/dist/roster.js +127 -17
  20. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  21. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +46 -3
  22. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +52 -10
  23. package/payload/platform/lib/routine-templates/src/index.ts +30 -4
  24. package/payload/platform/lib/routine-templates/src/roster.ts +147 -17
  25. package/payload/platform/package.json +2 -2
  26. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  27. package/payload/platform/plugins/admin/PLUGIN.md +5 -1
  28. package/payload/platform/plugins/admin/mcp/dist/index.js +37 -0
  29. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  30. package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts +10 -0
  31. package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts.map +1 -0
  32. package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js +22 -0
  33. package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js.map +1 -0
  34. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +31 -6
  35. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
  36. package/payload/platform/plugins/docs/references/admin-ui.md +28 -3
  37. package/payload/platform/plugins/docs/references/linkedin-extension.md +2 -2
  38. package/payload/platform/plugins/linkedin-extension/extension/README.md +3 -3
  39. package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +12 -7
  40. package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +4 -1
  41. package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +4 -1
  42. package/payload/platform/plugins/linkedin-extension/extension/options/options.html +3 -3
  43. package/payload/platform/plugins/linkedin-extension/extension/options/options.js +24 -16
  44. package/payload/platform/plugins/scheduling/PLUGIN.md +2 -0
  45. package/payload/platform/plugins/scheduling/mcp/dist/index.js +5 -0
  46. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  47. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts +2 -0
  48. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts.map +1 -0
  49. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js +100 -0
  50. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js.map +1 -0
  51. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts +36 -0
  52. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts.map +1 -0
  53. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js +82 -0
  54. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js.map +1 -0
  55. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts +31 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js +99 -0
  58. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +12 -12
  60. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  61. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts +2 -0
  62. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js +79 -0
  64. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js.map +1 -0
  65. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts +2 -0
  66. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts.map +1 -0
  67. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js +23 -0
  68. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js.map +1 -0
  69. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +61 -1
  70. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -1
  71. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js +45 -2
  72. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js.map +1 -1
  73. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +33 -1
  74. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  75. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +111 -9
  76. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  77. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +21 -69
  78. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  79. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts +24 -0
  80. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts.map +1 -0
  81. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js +87 -0
  82. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js.map +1 -0
  83. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts +2 -0
  84. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts.map +1 -0
  85. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js +123 -0
  86. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js.map +1 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts +2 -0
  88. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts.map +1 -0
  89. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js +71 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js.map +1 -0
  91. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js +14 -3
  92. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js.map +1 -1
  93. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +9 -0
  94. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  95. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +19 -3
  96. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  97. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  98. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +24 -9
  99. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  100. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  101. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  102. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  103. package/payload/server/{chunk-UTIHI6KV.js → chunk-2YMGNYA3.js} +12 -12
  104. package/payload/server/{manager-B4LRDZKC.js → manager-XPRN5UF5.js} +1 -1
  105. package/payload/server/package.json +1 -1
  106. package/payload/server/public/activity.html +5 -5
  107. package/payload/server/public/agents.html +4 -4
  108. package/payload/server/public/assets/{AdminLoginScreens-Bx9vPuUg.js → AdminLoginScreens-7Czw3MAC.js} +1 -1
  109. package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.br +0 -0
  110. package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.gz +0 -0
  111. package/payload/server/public/assets/{AdminShell-BxJPbC3p.js → AdminShell-D5GApZ_n.js} +1 -1
  112. package/payload/server/public/assets/AdminShell-D5GApZ_n.js.br +0 -0
  113. package/payload/server/public/assets/AdminShell-D5GApZ_n.js.gz +0 -0
  114. package/payload/server/public/assets/{CdpScreencastSurface-5HLhTQTV.js → CdpScreencastSurface-BbekDUFw.js} +1 -1
  115. package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.br +0 -0
  116. package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.gz +0 -0
  117. package/payload/server/public/assets/{activity-BaSYn62l.js → activity-ClI-RgJu.js} +1 -1
  118. package/payload/server/public/assets/activity-ClI-RgJu.js.br +0 -0
  119. package/payload/server/public/assets/activity-ClI-RgJu.js.gz +0 -0
  120. package/payload/server/public/assets/{admin-CYCKrV_x.js → admin-svtCmBPk.js} +1 -1
  121. package/payload/server/public/assets/admin-svtCmBPk.js.br +0 -0
  122. package/payload/server/public/assets/admin-svtCmBPk.js.gz +0 -0
  123. package/payload/server/public/assets/{agents-D8EJG-ta.js → agents-BO8YBj8d.js} +1 -1
  124. package/payload/server/public/assets/agents-BO8YBj8d.js.br +0 -0
  125. package/payload/server/public/assets/agents-BO8YBj8d.js.gz +0 -0
  126. package/payload/server/public/assets/{browser-D6Y_Zu8C.js → browser-Bj8oTG5R.js} +1 -1
  127. package/payload/server/public/assets/browser-Bj8oTG5R.js.br +0 -0
  128. package/payload/server/public/assets/browser-Bj8oTG5R.js.gz +0 -0
  129. package/payload/server/public/assets/{calendar-DD4oVa-r.js → calendar-CrkSY8U7.js} +1 -1
  130. package/payload/server/public/assets/calendar-CrkSY8U7.js.br +0 -0
  131. package/payload/server/public/assets/calendar-CrkSY8U7.js.gz +0 -0
  132. package/payload/server/public/assets/chat-Bvxoni2e.js +1 -0
  133. package/payload/server/public/assets/chat-Bvxoni2e.js.br +0 -0
  134. package/payload/server/public/assets/chat-Bvxoni2e.js.gz +0 -0
  135. package/payload/server/public/assets/chevron-left-CdUzxzeB.js +1 -0
  136. package/payload/server/public/assets/chevron-left-CdUzxzeB.js.br +0 -0
  137. package/payload/server/public/assets/chevron-right-CKGwd-M0.js +1 -0
  138. package/payload/server/public/assets/chevron-right-CKGwd-M0.js.br +0 -0
  139. package/payload/server/public/assets/clock-Cf8Oe9qi.js +1 -0
  140. package/payload/server/public/assets/clock-Cf8Oe9qi.js.br +0 -0
  141. package/payload/server/public/assets/clock-Cf8Oe9qi.js.gz +0 -0
  142. package/payload/server/public/assets/data-DF0Pstdp.js +1 -0
  143. package/payload/server/public/assets/data-DF0Pstdp.js.br +1 -0
  144. package/payload/server/public/assets/data-DF0Pstdp.js.gz +0 -0
  145. package/payload/server/public/assets/{file-download-sXU3_umF.js → file-download-Di_s0_4w.js} +1 -1
  146. package/payload/server/public/assets/file-download-Di_s0_4w.js.br +0 -0
  147. package/payload/server/public/assets/file-download-Di_s0_4w.js.gz +0 -0
  148. package/payload/server/public/assets/{file-text-CeXBviDH.js → file-text-CP1KIrJV.js} +1 -1
  149. package/payload/server/public/assets/file-text-CP1KIrJV.js.br +1 -0
  150. package/payload/server/public/assets/file-text-CP1KIrJV.js.gz +0 -0
  151. package/payload/server/public/assets/{graph-BSuDP6k7.js → graph-BCMscnCV.js} +1 -1
  152. package/payload/server/public/assets/graph-BCMscnCV.js.br +0 -0
  153. package/payload/server/public/assets/graph-BCMscnCV.js.gz +0 -0
  154. package/payload/server/public/assets/{graph-labels-D2pQkgYW.js → graph-labels-CgP17xHK.js} +1 -1
  155. package/payload/server/public/assets/graph-labels-CgP17xHK.js.br +0 -0
  156. package/payload/server/public/assets/graph-labels-CgP17xHK.js.gz +0 -0
  157. package/payload/server/public/assets/{maximize-2-DlzSNygU.js → maximize-2-DkQzDv-g.js} +1 -1
  158. package/payload/server/public/assets/maximize-2-DkQzDv-g.js.br +0 -0
  159. package/payload/server/public/assets/maximize-2-DkQzDv-g.js.gz +0 -0
  160. package/payload/server/public/assets/{operator-BP61-xjz.js → operator-CLbCar9e.js} +1 -1
  161. package/payload/server/public/assets/operator-CLbCar9e.js.br +0 -0
  162. package/payload/server/public/assets/operator-CLbCar9e.js.gz +0 -0
  163. package/payload/server/public/assets/{page-DX7ArY_s.js → page-CNJl3tWT.js} +1 -1
  164. package/payload/server/public/assets/page-CNJl3tWT.js.br +0 -0
  165. package/payload/server/public/assets/page-CNJl3tWT.js.gz +0 -0
  166. package/payload/server/public/assets/{page-eQ4OVros.js → page-CPVUAwb8.js} +1 -1
  167. package/payload/server/public/assets/page-CPVUAwb8.js.br +0 -0
  168. package/payload/server/public/assets/page-CPVUAwb8.js.gz +0 -0
  169. package/payload/server/public/assets/{public-DPDKFKM2.js → public-DQea3Ybz.js} +1 -1
  170. package/payload/server/public/assets/public-DQea3Ybz.js.br +0 -0
  171. package/payload/server/public/assets/public-DQea3Ybz.js.gz +0 -0
  172. package/payload/server/public/assets/{rotate-ccw-BR0JbPFV.js → rotate-ccw-DPw0vXC0.js} +1 -1
  173. package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.br +0 -0
  174. package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.gz +0 -0
  175. package/payload/server/public/assets/routines-CwiiYpfK.js +2 -0
  176. package/payload/server/public/assets/routines-CwiiYpfK.js.br +0 -0
  177. package/payload/server/public/assets/routines-CwiiYpfK.js.gz +0 -0
  178. package/payload/server/public/assets/{skills-fH0uA7cj.js → skills-0FOjKUM-.js} +1 -1
  179. package/payload/server/public/assets/skills-0FOjKUM-.js.br +0 -0
  180. package/payload/server/public/assets/skills-0FOjKUM-.js.gz +0 -0
  181. package/payload/server/public/assets/{tasks-CrVzFrTR.js → tasks-BUVsPEGm.js} +1 -1
  182. package/payload/server/public/assets/tasks-BUVsPEGm.js.br +0 -0
  183. package/payload/server/public/assets/tasks-BUVsPEGm.js.gz +0 -0
  184. package/payload/server/public/assets/{time-entry-format-C_0jiMpQ.js → time-entry-format-B6fX_19a.js} +1 -1
  185. package/payload/server/public/assets/time-entry-format-B6fX_19a.js.br +0 -0
  186. package/payload/server/public/assets/time-entry-format-B6fX_19a.js.gz +0 -0
  187. package/payload/server/public/assets/{triangle-alert-eLJHC_QJ.js → triangle-alert-vAaSDhVq.js} +1 -1
  188. package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.br +0 -0
  189. package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.gz +0 -0
  190. package/payload/server/public/assets/{useCopyFeedback-vPCmdOmY.js → useCopyFeedback-BvIRgs7W.js} +1 -1
  191. package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.br +0 -0
  192. package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.gz +0 -0
  193. package/payload/server/public/assets/{useSubAccountSwitcher-DxuUS_C7.css → useSubAccountSwitcher-DM5Y9eio.css} +1 -1
  194. package/payload/server/public/assets/useSubAccountSwitcher-DM5Y9eio.css.br +0 -0
  195. package/payload/server/public/assets/{useSubAccountSwitcher-DxuUS_C7.css.gz → useSubAccountSwitcher-DM5Y9eio.css.gz} +0 -0
  196. package/payload/server/public/assets/{useVoiceRecorder-D5bFDRqL.js → useVoiceRecorder-CiDOh8PG.js} +1 -1
  197. package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.br +0 -0
  198. package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.gz +0 -0
  199. package/payload/server/public/assets/{wrench-sXisQXkf.js → wrench-BNBtwT2p.js} +1 -1
  200. package/payload/server/public/assets/wrench-BNBtwT2p.js.br +0 -0
  201. package/payload/server/public/assets/wrench-BNBtwT2p.js.gz +0 -0
  202. package/payload/server/public/browser.html +5 -5
  203. package/payload/server/public/calendar.html +7 -7
  204. package/payload/server/public/chat.html +13 -13
  205. package/payload/server/public/data.html +12 -12
  206. package/payload/server/public/graph.html +9 -9
  207. package/payload/server/public/index.html +16 -16
  208. package/payload/server/public/operator.html +15 -15
  209. package/payload/server/public/public.html +13 -13
  210. package/payload/server/public/routines.html +7 -7
  211. package/payload/server/public/skills.html +5 -5
  212. package/payload/server/public/tasks.html +6 -6
  213. package/payload/server/server.js +353 -209
  214. package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.br +0 -0
  215. package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.gz +0 -0
  216. package/payload/server/public/assets/AdminShell-BxJPbC3p.js.br +0 -0
  217. package/payload/server/public/assets/AdminShell-BxJPbC3p.js.gz +0 -0
  218. package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.br +0 -0
  219. package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.gz +0 -0
  220. package/payload/server/public/assets/activity-BaSYn62l.js.br +0 -0
  221. package/payload/server/public/assets/activity-BaSYn62l.js.gz +0 -0
  222. package/payload/server/public/assets/admin-CYCKrV_x.js.br +0 -0
  223. package/payload/server/public/assets/admin-CYCKrV_x.js.gz +0 -0
  224. package/payload/server/public/assets/agents-D8EJG-ta.js.br +0 -0
  225. package/payload/server/public/assets/agents-D8EJG-ta.js.gz +0 -0
  226. package/payload/server/public/assets/browser-D6Y_Zu8C.js.br +0 -0
  227. package/payload/server/public/assets/browser-D6Y_Zu8C.js.gz +0 -0
  228. package/payload/server/public/assets/calendar-DD4oVa-r.js.br +0 -0
  229. package/payload/server/public/assets/calendar-DD4oVa-r.js.gz +0 -0
  230. package/payload/server/public/assets/chat-CwWs69PO.js +0 -1
  231. package/payload/server/public/assets/chat-CwWs69PO.js.br +0 -0
  232. package/payload/server/public/assets/chat-CwWs69PO.js.gz +0 -0
  233. package/payload/server/public/assets/chevron-left-ClfIy5Fx.js +0 -1
  234. package/payload/server/public/assets/chevron-right-B0QvXpxl.js +0 -1
  235. package/payload/server/public/assets/chevron-right-B0QvXpxl.js.br +0 -0
  236. package/payload/server/public/assets/clock-BIaRnIP_.js +0 -1
  237. package/payload/server/public/assets/clock-BIaRnIP_.js.br +0 -0
  238. package/payload/server/public/assets/clock-BIaRnIP_.js.gz +0 -0
  239. package/payload/server/public/assets/data-O_9Kiicl.js +0 -1
  240. package/payload/server/public/assets/data-O_9Kiicl.js.br +0 -2
  241. package/payload/server/public/assets/data-O_9Kiicl.js.gz +0 -0
  242. package/payload/server/public/assets/file-download-sXU3_umF.js.br +0 -0
  243. package/payload/server/public/assets/file-download-sXU3_umF.js.gz +0 -0
  244. package/payload/server/public/assets/file-text-CeXBviDH.js.br +0 -0
  245. package/payload/server/public/assets/file-text-CeXBviDH.js.gz +0 -0
  246. package/payload/server/public/assets/graph-BSuDP6k7.js.br +0 -0
  247. package/payload/server/public/assets/graph-BSuDP6k7.js.gz +0 -0
  248. package/payload/server/public/assets/graph-labels-D2pQkgYW.js.br +0 -0
  249. package/payload/server/public/assets/graph-labels-D2pQkgYW.js.gz +0 -0
  250. package/payload/server/public/assets/maximize-2-DlzSNygU.js.br +0 -0
  251. package/payload/server/public/assets/maximize-2-DlzSNygU.js.gz +0 -0
  252. package/payload/server/public/assets/operator-BP61-xjz.js.br +0 -0
  253. package/payload/server/public/assets/operator-BP61-xjz.js.gz +0 -0
  254. package/payload/server/public/assets/page-DX7ArY_s.js.br +0 -0
  255. package/payload/server/public/assets/page-DX7ArY_s.js.gz +0 -0
  256. package/payload/server/public/assets/page-eQ4OVros.js.br +0 -0
  257. package/payload/server/public/assets/page-eQ4OVros.js.gz +0 -0
  258. package/payload/server/public/assets/public-DPDKFKM2.js.br +0 -0
  259. package/payload/server/public/assets/public-DPDKFKM2.js.gz +0 -0
  260. package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.br +0 -0
  261. package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.gz +0 -0
  262. package/payload/server/public/assets/routines-y413YZa-.js +0 -1
  263. package/payload/server/public/assets/routines-y413YZa-.js.br +0 -0
  264. package/payload/server/public/assets/routines-y413YZa-.js.gz +0 -0
  265. package/payload/server/public/assets/skills-fH0uA7cj.js.br +0 -0
  266. package/payload/server/public/assets/skills-fH0uA7cj.js.gz +0 -0
  267. package/payload/server/public/assets/tasks-CrVzFrTR.js.br +0 -0
  268. package/payload/server/public/assets/tasks-CrVzFrTR.js.gz +0 -0
  269. package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.br +0 -1
  270. package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.gz +0 -0
  271. package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.br +0 -1
  272. package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.gz +0 -0
  273. package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.br +0 -0
  274. package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.gz +0 -0
  275. package/payload/server/public/assets/useSubAccountSwitcher-DxuUS_C7.css.br +0 -0
  276. package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.br +0 -0
  277. package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.gz +0 -0
  278. package/payload/server/public/assets/wrench-sXisQXkf.js.br +0 -0
  279. package/payload/server/public/assets/wrench-sXisQXkf.js.gz +0 -0
  280. /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js → useSubAccountSwitcher-BEwQMRMo.js} +0 -0
  281. /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js.br → useSubAccountSwitcher-BEwQMRMo.js.br} +0 -0
  282. /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js.gz → useSubAccountSwitcher-BEwQMRMo.js.gz} +0 -0
package/dist/index.js CHANGED
@@ -3385,6 +3385,19 @@ function setupAccount() {
3385
3385
  logFile(` [neo4j] passing NEO4J_URI=${neo4jUri} to seed`);
3386
3386
  shell("bash", [seedScript], { cwd: INSTALL_DIR, env: neo4jEnv });
3387
3387
  }
3388
+ // Task 2213 — converge :Event.startDate onto canonical UTC. The dispatcher
3389
+ // compares startDate to new Date().toISOString() LEXICALLY, so a row storing
3390
+ // a +01:00 offset fires 60 minutes late under BST. Runs after the seed so the
3391
+ // schema exists, with the same Neo4j env, and needs PLATFORM_ROOT to scope
3392
+ // itself to this install's accounts on a shared Neo4j. Idempotent: a converged
3393
+ // install rewrites nothing and prints op=done rewritten=0.
3394
+ const convergeStartDate = join(INSTALL_DIR, "platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js");
3395
+ if (existsSync(convergeStartDate)) {
3396
+ shell("node", [convergeStartDate], {
3397
+ cwd: INSTALL_DIR,
3398
+ env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
3399
+ });
3400
+ }
3388
3401
  // Task 165 — register every bundled specialist subagent at
3389
3402
  // $CLAUDE_CONFIG_DIR/agents/<name>.md. Claude Code's `--agent <name>`
3390
3403
  // discovery only resolves under this path; without these symlinks,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-sitedesk-code",
3
- "version": "0.1.528",
3
+ "version": "0.1.530",
4
4
  "description": "Install SiteDesk — automated back office for independent building contractors",
5
5
  "bin": {
6
6
  "create-sitedesk-code": "./dist/index.js"
@@ -0,0 +1,21 @@
1
+ /** The `account.json` field holding the token. */
2
+ export declare const INGEST_TOKEN_FIELD: "ingestToken";
3
+ /** The account's current token, or null when none is set or it is malformed. */
4
+ export declare function readIngestToken(accountsDir: string, accountId: string): string | null;
5
+ /** Mint on first call; return the existing token unchanged on every call after. */
6
+ export declare function ensureIngestToken(accountsDir: string, accountId: string): {
7
+ token: string;
8
+ minted: boolean;
9
+ };
10
+ /** Issue a replacement, invalidating every extension install holding the old one. */
11
+ export declare function rotateIngestToken(accountsDir: string, accountId: string): string;
12
+ /**
13
+ * Reverse lookup: which account owns this token.
14
+ *
15
+ * Compared with `timingSafeEqual` because the token is a bearer secret and a
16
+ * length- or prefix-sensitive compare leaks it across repeated calls. The shape
17
+ * check runs first so a malformed input costs no disk reads at all — which is
18
+ * the common case, since a pasted conversation session key is a UUID.
19
+ */
20
+ export declare function resolveAccountIdByIngestToken(accountsDir: string, token: string): string | null;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,EAAG,aAAsB,CAAC;AA2CzD,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAIpC;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhF;AA0BD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAYf"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INGEST_TOKEN_FIELD = void 0;
4
+ exports.readIngestToken = readIngestToken;
5
+ exports.ensureIngestToken = ensureIngestToken;
6
+ exports.rotateIngestToken = rotateIngestToken;
7
+ exports.resolveAccountIdByIngestToken = resolveAccountIdByIngestToken;
8
+ /**
9
+ * Per-account LinkedIn ingest token (Task 2208).
10
+ *
11
+ * The admin browser's `session_key` cannot serve as the extension's credential.
12
+ * It lives in an in-memory Map with a 24h TTL (`platform/ui/app/lib/claude-agent/
13
+ * session-store.ts`), every service restart wipes it, and starting a new chat
14
+ * session rotates it. No cookie ever carried it either, so the documented
15
+ * "copy session_key from the cookie" instruction named something that does not
16
+ * exist and operators pasted conversation session keys instead.
17
+ *
18
+ * This token is a durable bearer secret held in `account.json`: minted once on
19
+ * request by the `linkedin-ingest-token` admin MCP tool, then stable across
20
+ * restarts, new sessions and time.
21
+ *
22
+ * Pure by construction. Callers supply `accountsDir`, and the reverse lookup
23
+ * takes the account-id list from `account-enumeration` as a parameter, so this
24
+ * module reads no environment and depends on no sibling lib.
25
+ */
26
+ const node_crypto_1 = require("node:crypto");
27
+ const node_fs_1 = require("node:fs");
28
+ const node_path_1 = require("node:path");
29
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
30
+ /** The `account.json` field holding the token. */
31
+ exports.INGEST_TOKEN_FIELD = "ingestToken";
32
+ const TOKEN_BYTES = 32;
33
+ /** 32 bytes hex-encoded. Anything else on disk is treated as absent. */
34
+ const TOKEN_RE = /^[0-9a-f]{64}$/;
35
+ function configPath(accountsDir, accountId) {
36
+ return (0, node_path_1.resolve)(accountsDir, accountId, "account.json");
37
+ }
38
+ /**
39
+ * null on a missing or unparseable config. Corruption is never a partial read:
40
+ * a half-understood account.json must not produce a token decision.
41
+ */
42
+ function readConfig(accountsDir, accountId) {
43
+ const path = configPath(accountsDir, accountId);
44
+ if (!(0, node_fs_1.existsSync)(path))
45
+ return null;
46
+ try {
47
+ const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
48
+ return parsed !== null && typeof parsed === "object"
49
+ ? parsed
50
+ : null;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function writeToken(accountsDir, accountId) {
57
+ const config = readConfig(accountsDir, accountId);
58
+ if (!config) {
59
+ throw new Error(`[ingest-token] no readable account.json for accountId=${accountId}`);
60
+ }
61
+ const token = (0, node_crypto_1.randomBytes)(TOKEN_BYTES).toString("hex");
62
+ config[exports.INGEST_TOKEN_FIELD] = token;
63
+ (0, node_fs_1.writeFileSync)(configPath(accountsDir, accountId), JSON.stringify(config, null, 2) + "\n", "utf-8");
64
+ return token;
65
+ }
66
+ /** The account's current token, or null when none is set or it is malformed. */
67
+ function readIngestToken(accountsDir, accountId) {
68
+ const value = readConfig(accountsDir, accountId)?.[exports.INGEST_TOKEN_FIELD];
69
+ return typeof value === "string" && TOKEN_RE.test(value) ? value : null;
70
+ }
71
+ /** Mint on first call; return the existing token unchanged on every call after. */
72
+ function ensureIngestToken(accountsDir, accountId) {
73
+ const existing = readIngestToken(accountsDir, accountId);
74
+ if (existing)
75
+ return { token: existing, minted: false };
76
+ return { token: writeToken(accountsDir, accountId), minted: true };
77
+ }
78
+ /** Issue a replacement, invalidating every extension install holding the old one. */
79
+ function rotateIngestToken(accountsDir, accountId) {
80
+ return writeToken(accountsDir, accountId);
81
+ }
82
+ /**
83
+ * Every UUID-shaped account dir carrying an account.json, scanned fresh.
84
+ *
85
+ * Deliberately NOT `account-enumeration`'s `enumerateValidAccountIds`: that is a
86
+ * per-process cached list, and its own module doc records that the install-time
87
+ * invariant no longer holds because `account_create` provisions sub-accounts
88
+ * during a live session, so the cached list is stale for exactly the account
89
+ * that just minted a token. This endpoint runs once per pill click, at human
90
+ * rate, so a fresh readdir is the right trade against a token that authenticates
91
+ * only after a restart.
92
+ */
93
+ function listAccountIdsOnDisk(accountsDir) {
94
+ if (!(0, node_fs_1.existsSync)(accountsDir))
95
+ return [];
96
+ let entries;
97
+ try {
98
+ entries = (0, node_fs_1.readdirSync)(accountsDir);
99
+ }
100
+ catch {
101
+ return [];
102
+ }
103
+ return entries.filter((name) => UUID_RE.test(name) && (0, node_fs_1.existsSync)((0, node_path_1.resolve)(accountsDir, name, "account.json")));
104
+ }
105
+ /**
106
+ * Reverse lookup: which account owns this token.
107
+ *
108
+ * Compared with `timingSafeEqual` because the token is a bearer secret and a
109
+ * length- or prefix-sensitive compare leaks it across repeated calls. The shape
110
+ * check runs first so a malformed input costs no disk reads at all — which is
111
+ * the common case, since a pasted conversation session key is a UUID.
112
+ */
113
+ function resolveAccountIdByIngestToken(accountsDir, token) {
114
+ if (typeof token !== "string" || !TOKEN_RE.test(token))
115
+ return null;
116
+ const probe = Buffer.from(token, "utf-8");
117
+ for (const accountId of listAccountIdsOnDisk(accountsDir)) {
118
+ const stored = readIngestToken(accountsDir, accountId);
119
+ if (!stored)
120
+ continue;
121
+ const candidate = Buffer.from(stored, "utf-8");
122
+ if (candidate.length === probe.length && (0, node_crypto_1.timingSafeEqual)(candidate, probe)) {
123
+ return accountId;
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Per-account LinkedIn ingest token (Task 2208).
3
+ *
4
+ * The admin browser's `session_key` cannot serve as the extension's credential.
5
+ * It lives in an in-memory Map with a 24h TTL (`platform/ui/app/lib/claude-agent/
6
+ * session-store.ts`), every service restart wipes it, and starting a new chat
7
+ * session rotates it. No cookie ever carried it either, so the documented
8
+ * "copy session_key from the cookie" instruction named something that does not
9
+ * exist and operators pasted conversation session keys instead.
10
+ *
11
+ * This token is a durable bearer secret held in `account.json`: minted once on
12
+ * request by the `linkedin-ingest-token` admin MCP tool, then stable across
13
+ * restarts, new sessions and time.
14
+ *
15
+ * Pure by construction. Callers supply `accountsDir`, and the reverse lookup
16
+ * takes the account-id list from `account-enumeration` as a parameter, so this
17
+ * module reads no environment and depends on no sibling lib.
18
+ */
19
+ import { randomBytes, timingSafeEqual } from "node:crypto";
20
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
21
+ import { resolve } from "node:path";
22
+
23
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
24
+
25
+ /** The `account.json` field holding the token. */
26
+ export const INGEST_TOKEN_FIELD = "ingestToken" as const;
27
+
28
+ const TOKEN_BYTES = 32;
29
+
30
+ /** 32 bytes hex-encoded. Anything else on disk is treated as absent. */
31
+ const TOKEN_RE = /^[0-9a-f]{64}$/;
32
+
33
+ function configPath(accountsDir: string, accountId: string): string {
34
+ return resolve(accountsDir, accountId, "account.json");
35
+ }
36
+
37
+ /**
38
+ * null on a missing or unparseable config. Corruption is never a partial read:
39
+ * a half-understood account.json must not produce a token decision.
40
+ */
41
+ function readConfig(accountsDir: string, accountId: string): Record<string, unknown> | null {
42
+ const path = configPath(accountsDir, accountId);
43
+ if (!existsSync(path)) return null;
44
+ try {
45
+ const parsed: unknown = JSON.parse(readFileSync(path, "utf-8"));
46
+ return parsed !== null && typeof parsed === "object"
47
+ ? (parsed as Record<string, unknown>)
48
+ : null;
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
53
+
54
+ function writeToken(accountsDir: string, accountId: string): string {
55
+ const config = readConfig(accountsDir, accountId);
56
+ if (!config) {
57
+ throw new Error(`[ingest-token] no readable account.json for accountId=${accountId}`);
58
+ }
59
+ const token = randomBytes(TOKEN_BYTES).toString("hex");
60
+ config[INGEST_TOKEN_FIELD] = token;
61
+ writeFileSync(
62
+ configPath(accountsDir, accountId),
63
+ JSON.stringify(config, null, 2) + "\n",
64
+ "utf-8",
65
+ );
66
+ return token;
67
+ }
68
+
69
+ /** The account's current token, or null when none is set or it is malformed. */
70
+ export function readIngestToken(accountsDir: string, accountId: string): string | null {
71
+ const value = readConfig(accountsDir, accountId)?.[INGEST_TOKEN_FIELD];
72
+ return typeof value === "string" && TOKEN_RE.test(value) ? value : null;
73
+ }
74
+
75
+ /** Mint on first call; return the existing token unchanged on every call after. */
76
+ export function ensureIngestToken(
77
+ accountsDir: string,
78
+ accountId: string,
79
+ ): { token: string; minted: boolean } {
80
+ const existing = readIngestToken(accountsDir, accountId);
81
+ if (existing) return { token: existing, minted: false };
82
+ return { token: writeToken(accountsDir, accountId), minted: true };
83
+ }
84
+
85
+ /** Issue a replacement, invalidating every extension install holding the old one. */
86
+ export function rotateIngestToken(accountsDir: string, accountId: string): string {
87
+ return writeToken(accountsDir, accountId);
88
+ }
89
+
90
+ /**
91
+ * Every UUID-shaped account dir carrying an account.json, scanned fresh.
92
+ *
93
+ * Deliberately NOT `account-enumeration`'s `enumerateValidAccountIds`: that is a
94
+ * per-process cached list, and its own module doc records that the install-time
95
+ * invariant no longer holds because `account_create` provisions sub-accounts
96
+ * during a live session, so the cached list is stale for exactly the account
97
+ * that just minted a token. This endpoint runs once per pill click, at human
98
+ * rate, so a fresh readdir is the right trade against a token that authenticates
99
+ * only after a restart.
100
+ */
101
+ function listAccountIdsOnDisk(accountsDir: string): string[] {
102
+ if (!existsSync(accountsDir)) return [];
103
+ let entries: string[];
104
+ try {
105
+ entries = readdirSync(accountsDir);
106
+ } catch {
107
+ return [];
108
+ }
109
+ return entries.filter(
110
+ (name) => UUID_RE.test(name) && existsSync(resolve(accountsDir, name, "account.json")),
111
+ );
112
+ }
113
+
114
+ /**
115
+ * Reverse lookup: which account owns this token.
116
+ *
117
+ * Compared with `timingSafeEqual` because the token is a bearer secret and a
118
+ * length- or prefix-sensitive compare leaks it across repeated calls. The shape
119
+ * check runs first so a malformed input costs no disk reads at all — which is
120
+ * the common case, since a pasted conversation session key is a UUID.
121
+ */
122
+ export function resolveAccountIdByIngestToken(
123
+ accountsDir: string,
124
+ token: string,
125
+ ): string | null {
126
+ if (typeof token !== "string" || !TOKEN_RE.test(token)) return null;
127
+ const probe = Buffer.from(token, "utf-8");
128
+ for (const accountId of listAccountIdsOnDisk(accountsDir)) {
129
+ const stored = readIngestToken(accountsDir, accountId);
130
+ if (!stored) continue;
131
+ const candidate = Buffer.from(stored, "utf-8");
132
+ if (candidate.length === probe.length && timingSafeEqual(candidate, probe)) {
133
+ return accountId;
134
+ }
135
+ }
136
+ return null;
137
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"]
8
+ }
@@ -78,6 +78,11 @@ export interface DispatchDestination {
78
78
  channel: AgentChannel;
79
79
  destination: string;
80
80
  label: DispatchLabel;
81
+ /** Task 2204 — a display-only person name, attached by a CALLER that has a
82
+ * graph to read. `listDispatchDestinations` never sets it: this module reads
83
+ * account.json and nothing else, and `validateAgentDestination` never
84
+ * consults it. Absent means no `:Person` matched, which is not an error. */
85
+ name?: string;
81
86
  }
82
87
  /**
83
88
  * Every destination `accountId` may legally bind, computed from the same lists
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG;wCACwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;uCAEuC;AACvC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;AAC3F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwDrG;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAOf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAkBrB;AAED;;uDAEuD;AACvD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,mBAAmB,EAAE,CAsCxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG;wCACwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;uCAEuC;AACvC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;AAC3F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwDrG;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAOf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAkBrB;AAED;;uDAEuD;AACvD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB;;;iFAG6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,mBAAmB,EAAE,CAsCxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -211,6 +211,11 @@ export interface DispatchDestination {
211
211
  channel: AgentChannel;
212
212
  destination: string;
213
213
  label: DispatchLabel;
214
+ /** Task 2204 — a display-only person name, attached by a CALLER that has a
215
+ * graph to read. `listDispatchDestinations` never sets it: this module reads
216
+ * account.json and nothing else, and `validateAgentDestination` never
217
+ * consults it. Absent means no `:Person` matched, which is not an error. */
218
+ name?: string;
214
219
  }
215
220
 
216
221
  /**
@@ -70,6 +70,14 @@ export interface RoutineVerifyCounts {
70
70
  actual: number;
71
71
  suspended: number;
72
72
  nextRunNull: number;
73
+ /** Task 2214 — roster rows holding no description. Zero is the healthy value
74
+ * on every account, not only a fresh one: `VERIFY_CYPHER` matches
75
+ * `routineTemplate IS NOT NULL`, so operator-created routines are outside
76
+ * its scope and cannot contribute, and `ON MATCH` writes the description
77
+ * unconditionally, so an operator-edited row is covered too. Anything above
78
+ * zero while `expected === actual` is a MERGE that wrote no description —
79
+ * the one failure here that emits no error and does not reproduce. */
80
+ descNull: number;
73
81
  }
74
82
  export interface RoutineSeedReport {
75
83
  accountId: string;
@@ -114,11 +122,19 @@ export declare function resolveOwnerTimezone(session: SeedSessionLike, accountId
114
122
  * `agentChannel`, not `agentDestination`, not `recurrence`, not `timezone`. A
115
123
  * re-seed on upgrade must not re-suspend an enabled routine, unbind a bound
116
124
  * destination, or reset a retimed cron. Only the prompt, the name and the
117
- * version move, and only when the row is behind and unedited. */
118
- export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
125
+ * version move, and only when the row is behind and unedited.
126
+ *
127
+ * `routineDescription` (Task 2214) is the one property ON MATCH writes on
128
+ * every match rather than only on the refresh branch, and that is not an
129
+ * exception to the rule above. It is roster-owned: the routines route projects
130
+ * it but its PATCH field set refuses it, so no operator edit exists for this
131
+ * to overwrite. Gating it on `refreshing` would leave every operator-edited
132
+ * row description-less permanently, because `skip-operator-edited` takes
133
+ * neither branch, and that row's card would show a title and nothing else. */
134
+ export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.routineDescription = row.description,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.routineDescription = row.description,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
119
135
  /** The post-condition read. Counts every roster row the account actually holds,
120
136
  * independently of what the MERGE above believes it wrote. */
121
- export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull";
137
+ export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull";
122
138
  export interface SeedRoutineRosterArgs {
123
139
  session: SeedSessionLike;
124
140
  accountId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;kEAYkE;AAClE,eAAO,MAAM,YAAY,01DAsCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,4QAK+C,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyE/F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;2EAMuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;+EAoB+E;AAC/E,eAAO,MAAM,YAAY,28DAwCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,+VAMuD,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgF/F"}
@@ -90,7 +90,15 @@ async function resolveOwnerTimezone(session, accountId) {
90
90
  * `agentChannel`, not `agentDestination`, not `recurrence`, not `timezone`. A
91
91
  * re-seed on upgrade must not re-suspend an enabled routine, unbind a bound
92
92
  * destination, or reset a retimed cron. Only the prompt, the name and the
93
- * version move, and only when the row is behind and unedited. */
93
+ * version move, and only when the row is behind and unedited.
94
+ *
95
+ * `routineDescription` (Task 2214) is the one property ON MATCH writes on
96
+ * every match rather than only on the refresh branch, and that is not an
97
+ * exception to the rule above. It is roster-owned: the routines route projects
98
+ * it but its PATCH field set refuses it, so no operator edit exists for this
99
+ * to overwrite. Gating it on `refreshing` would leave every operator-edited
100
+ * row description-less permanently, because `skip-operator-edited` takes
101
+ * neither branch, and that row's card would show a title and nothing else. */
94
102
  exports.MERGE_CYPHER = `
95
103
  UNWIND $rows AS row
96
104
  OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
@@ -103,6 +111,7 @@ WITH row, existed, priorVersion, edited,
103
111
  MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
104
112
  ON CREATE SET e.eventId = randomUUID(),
105
113
  e.name = row.name,
114
+ e.routineDescription = row.description,
106
115
  e.agentPrompt = row.prompt,
107
116
  e.recurrence = row.recurrence,
108
117
  e.routineTemplateVersion = $version,
@@ -122,6 +131,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
122
131
  e.updatedAt = $now
123
132
  ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
124
133
  e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
134
+ e.routineDescription = row.description,
125
135
  e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
126
136
  e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
127
137
  RETURN row.key AS key,
@@ -137,7 +147,8 @@ MATCH (e:Event {accountId: $accountId})
137
147
  WHERE e.routineTemplate IS NOT NULL
138
148
  RETURN count(e) AS actual,
139
149
  sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
140
- sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull`;
150
+ sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
151
+ sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull`;
141
152
  /**
142
153
  * Seed (or re-seed) the roster for one account and report what happened.
143
154
  *
@@ -163,7 +174,13 @@ async function seedRoutineRoster(args) {
163
174
  version,
164
175
  timezone,
165
176
  now,
166
- rows: roster.map((r) => ({ key: r.key, name: r.name, prompt: r.prompt, recurrence: r.recurrence })),
177
+ rows: roster.map((r) => ({
178
+ key: r.key,
179
+ name: r.name,
180
+ description: r.description,
181
+ prompt: r.prompt,
182
+ recurrence: r.recurrence,
183
+ })),
167
184
  });
168
185
  const merges = mergeRes.records.map((rec) => ({
169
186
  key: String(rec.get("key")),
@@ -180,9 +197,10 @@ async function seedRoutineRoster(args) {
180
197
  actual: toInt(verifyRec?.get("actual")),
181
198
  suspended: toInt(verifyRec?.get("suspended")),
182
199
  nextRunNull: toInt(verifyRec?.get("nextRunNull")),
200
+ descNull: toInt(verifyRec?.get("descNull")),
183
201
  };
184
202
  log(`[routine-seed] op=verify acct=${acct} expected=${verify.expected} actual=${verify.actual} ` +
185
- `suspended=${verify.suspended} nextRunNull=${verify.nextRunNull}`);
203
+ `suspended=${verify.suspended} nextRunNull=${verify.nextRunNull} descNull=${verify.descNull}`);
186
204
  const created = merges.filter((m) => m.action === "create").length;
187
205
  const refreshed = merges.filter((m) => m.action === "refresh-version").length;
188
206
  const skippedOperatorEdited = merges.filter((m) => m.action === "skip-operator-edited").length;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -3,15 +3,17 @@
3
3
  *
4
4
  * A fresh install used to ship zero routines, so the only working examples
5
5
  * lived in one customer's graph and every operator wrote the prompts from
6
- * scratch. These eleven are the catalogue that ships with the platform instead.
6
+ * scratch. These thirteen are the catalogue that ships with the platform
7
+ * instead.
7
8
  *
8
9
  * Two properties make a routine shippable, and both are load-bearing:
9
10
  *
10
11
  * 1. It resolves its own surfaces at run time. Every prompt opens on
11
12
  * `capabilities-here`, which reports the account's live install set, and
12
13
  * ends the turn without replying when the surface it needs is absent. That
13
- * is what makes the same eleven rows correct on an estate agency, a web studio
14
- * and a field-service install rather than a template someone must edit.
14
+ * is what makes the same thirteen rows correct on an estate agency, a web
15
+ * studio and a field-service install rather than a template someone must
16
+ * edit.
15
17
  *
16
18
  * 2. It names nobody. No prompt carries a person's name, an email address, a
17
19
  * phone number, a hostname or a database name. `scripts/check-routine-
@@ -32,7 +34,7 @@
32
34
  * routine's prompt only when the stored `routineTemplateVersion` is BELOW this
33
35
  * and no operator has edited the row, so an unbumped edit ships to new installs
34
36
  * and never reaches existing ones — bump it in the same commit as the edit. */
35
- export declare const ROUTINE_TEMPLATE_VERSION = 1;
37
+ export declare const ROUTINE_TEMPLATE_VERSION = 2;
36
38
  export interface RoutineTemplate {
37
39
  /** Stable identity. Half of the MERGE key `(accountId, routineTemplate)`, so
38
40
  * it is never renamed: a renamed key seeds a duplicate row and orphans the
@@ -40,15 +42,26 @@ export interface RoutineTemplate {
40
42
  readonly key: string;
41
43
  /** The title shown on `/routines`. */
42
44
  readonly name: string;
45
+ /** One sentence under the title on the card: what this does and what it will
46
+ * not do. Roster-owned and read-only — projected by the routines route but
47
+ * absent from its PATCH field set, so no operator edit exists for the seed to
48
+ * overwrite and the MERGE rewrites it on every match. */
49
+ readonly description: string;
43
50
  /** The proposed cron. Written ON CREATE only, never refreshed, so an operator
44
51
  * who retimes a routine keeps their expression across upgrades. */
45
52
  readonly recurrence: string;
46
53
  /** The injected turn. Refreshed on a version bump when the row is unedited. */
47
54
  readonly prompt: string;
48
55
  }
49
- /** The eleven. Order is the display order on `/routines` before the operator
56
+ /** The thirteen. Order is the display order on `/routines` before the operator
50
57
  * retimes anything: the daily rhythm first, then the reconciles, then the
51
- * weekly, then the standing check. */
58
+ * weekly, then the standing check, then the two health reports.
59
+ *
60
+ * `description` is what the card shows under the title. It says what the row
61
+ * does and, where the row is deliberately narrower than its name suggests,
62
+ * what it will not do — the send it never makes, the write it never performs,
63
+ * the file it never deletes. That second half is the part an operator cannot
64
+ * infer from a title, and it is why the sentence is not just the name again. */
52
65
  export declare const ROUTINE_ROSTER: readonly RoutineTemplate[];
53
66
  /** Every roster key, in roster order. The scheduling heartbeat's `op=roster`
54
67
  * drift check reconciles this expected set against what is actually in the
@@ -1 +1 @@
1
- {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAwID;;uCAEuC;AACvC,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAYpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
1
+ {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;8DAG0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgKD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAyGpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}