@rubytech/create-realagent-code 0.1.604 → 0.1.606

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 (256) hide show
  1. package/dist/__tests__/claude-trust-seed.test.js +125 -0
  2. package/dist/claude-trust-seed.js +52 -0
  3. package/dist/index.js +68 -33
  4. package/package.json +1 -1
  5. package/payload/platform/lib/routine-templates/dist/roster.d.ts +30 -2
  6. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  7. package/payload/platform/lib/routine-templates/dist/roster.js +76 -32
  8. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  9. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +0 -0
  10. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +22 -1
  11. package/payload/platform/lib/routine-templates/src/roster.ts +108 -35
  12. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +18 -3
  13. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +10 -0
  14. package/payload/platform/plugins/connector/PLUGIN.md +9 -1
  15. package/payload/platform/plugins/connector/mcp/dist/__tests__/queue-descriptor.test.d.ts +2 -0
  16. package/payload/platform/plugins/connector/mcp/dist/__tests__/queue-descriptor.test.d.ts.map +1 -0
  17. package/payload/platform/plugins/connector/mcp/dist/__tests__/queue-descriptor.test.js +67 -0
  18. package/payload/platform/plugins/connector/mcp/dist/__tests__/queue-descriptor.test.js.map +1 -0
  19. package/payload/platform/plugins/connector/mcp/dist/index.js +36 -5
  20. package/payload/platform/plugins/connector/mcp/dist/index.js.map +1 -1
  21. package/payload/platform/plugins/connector/mcp/dist/lib/store.d.ts +35 -0
  22. package/payload/platform/plugins/connector/mcp/dist/lib/store.d.ts.map +1 -1
  23. package/payload/platform/plugins/connector/mcp/dist/lib/store.js +33 -0
  24. package/payload/platform/plugins/connector/mcp/dist/lib/store.js.map +1 -1
  25. package/payload/platform/plugins/connector/mcp/package.json +4 -2
  26. package/payload/platform/plugins/connector/mcp/vitest.config.ts +8 -0
  27. package/payload/platform/plugins/docs/references/admin-ui.md +15 -2
  28. package/payload/platform/plugins/docs/references/platform.md +2 -0
  29. package/payload/platform/plugins/email/PLUGIN.md +4 -0
  30. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/retention.test.d.ts +2 -0
  31. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/retention.test.d.ts.map +1 -0
  32. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/retention.test.js +233 -0
  33. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/retention.test.js.map +1 -0
  34. package/payload/platform/plugins/email/mcp/dist/sampler/main.js +19 -0
  35. package/payload/platform/plugins/email/mcp/dist/sampler/main.js.map +1 -1
  36. package/payload/platform/plugins/email/mcp/dist/sampler/retention-sources.d.ts +3 -0
  37. package/payload/platform/plugins/email/mcp/dist/sampler/retention-sources.d.ts.map +1 -0
  38. package/payload/platform/plugins/email/mcp/dist/sampler/retention-sources.js +146 -0
  39. package/payload/platform/plugins/email/mcp/dist/sampler/retention-sources.js.map +1 -0
  40. package/payload/platform/plugins/email/mcp/dist/sampler/retention.d.ts +150 -0
  41. package/payload/platform/plugins/email/mcp/dist/sampler/retention.d.ts.map +1 -0
  42. package/payload/platform/plugins/email/mcp/dist/sampler/retention.js +199 -0
  43. package/payload/platform/plugins/email/mcp/dist/sampler/retention.js.map +1 -0
  44. package/payload/platform/plugins/scheduling/PLUGIN.md +8 -1
  45. package/payload/platform/plugins/scheduling/mcp/dist/index.js +1 -1
  46. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  47. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +40 -0
  48. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  49. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +322 -4
  50. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  51. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  52. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +21 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  54. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +236 -6
  55. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  56. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +452 -7
  57. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  58. package/payload/platform/services/claude-session-manager/dist/claude-trust-census.d.ts +34 -0
  59. package/payload/platform/services/claude-session-manager/dist/claude-trust-census.d.ts.map +1 -0
  60. package/payload/platform/services/claude-session-manager/dist/claude-trust-census.js +83 -0
  61. package/payload/platform/services/claude-session-manager/dist/claude-trust-census.js.map +1 -0
  62. package/payload/platform/services/claude-session-manager/dist/index.js +13 -0
  63. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  64. package/payload/server/public/activity.html +6 -6
  65. package/payload/server/public/agents.html +5 -5
  66. package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js +1 -0
  67. package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.br +0 -0
  68. package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.gz +0 -0
  69. package/payload/server/public/assets/AdminShell-1HyATV_t.js +3 -0
  70. package/payload/server/public/assets/AdminShell-1HyATV_t.js.br +0 -0
  71. package/payload/server/public/assets/AdminShell-1HyATV_t.js.gz +0 -0
  72. package/payload/server/public/assets/activity-C2qWlcJ5.js +1 -0
  73. package/payload/server/public/assets/activity-C2qWlcJ5.js.br +0 -0
  74. package/payload/server/public/assets/activity-C2qWlcJ5.js.gz +0 -0
  75. package/payload/server/public/assets/admin-DqpfY8-t.js +1 -0
  76. package/payload/server/public/assets/admin-DqpfY8-t.js.br +0 -0
  77. package/payload/server/public/assets/admin-DqpfY8-t.js.gz +0 -0
  78. package/payload/server/public/assets/agents-DoGVAjIT.js +1 -0
  79. package/payload/server/public/assets/agents-DoGVAjIT.js.br +0 -0
  80. package/payload/server/public/assets/agents-DoGVAjIT.js.gz +0 -0
  81. package/payload/server/public/assets/{browser-CqDBcKwU.js → browser-DjqS897k.js} +1 -1
  82. package/payload/server/public/assets/browser-DjqS897k.js.br +0 -0
  83. package/payload/server/public/assets/browser-DjqS897k.js.gz +0 -0
  84. package/payload/server/public/assets/calendar-DJeOm0WS.js +1 -0
  85. package/payload/server/public/assets/calendar-DJeOm0WS.js.br +0 -0
  86. package/payload/server/public/assets/calendar-DJeOm0WS.js.gz +0 -0
  87. package/payload/server/public/assets/chat-BrRE0Dck.js +1 -0
  88. package/payload/server/public/assets/chat-BrRE0Dck.js.br +0 -0
  89. package/payload/server/public/assets/chat-BrRE0Dck.js.gz +0 -0
  90. package/payload/server/public/assets/chevron-left-D9z1aK3p.js +1 -0
  91. package/payload/server/public/assets/chevron-left-D9z1aK3p.js.br +0 -0
  92. package/payload/server/public/assets/clock-BqHWMICF.js +1 -0
  93. package/payload/server/public/assets/clock-BqHWMICF.js.br +0 -0
  94. package/payload/server/public/assets/clock-BqHWMICF.js.gz +0 -0
  95. package/payload/server/public/assets/copy-p9ZM9fnn.js +1 -0
  96. package/payload/server/public/assets/copy-p9ZM9fnn.js.br +0 -0
  97. package/payload/server/public/assets/copy-p9ZM9fnn.js.gz +0 -0
  98. package/payload/server/public/assets/data-CPsqW0qW.js +1 -0
  99. package/payload/server/public/assets/data-CPsqW0qW.js.br +0 -0
  100. package/payload/server/public/assets/data-CPsqW0qW.js.gz +0 -0
  101. package/payload/server/public/assets/{field-X4OVA3vx.js → field-WRk67lvr.js} +1 -1
  102. package/payload/server/public/assets/field-WRk67lvr.js.br +0 -0
  103. package/payload/server/public/assets/field-WRk67lvr.js.gz +0 -0
  104. package/payload/server/public/assets/file-text-BJDCb334.js +1 -0
  105. package/payload/server/public/assets/file-text-BJDCb334.js.br +0 -0
  106. package/payload/server/public/assets/file-text-BJDCb334.js.gz +0 -0
  107. package/payload/server/public/assets/{graph-l7tzHqvm.js → graph-CAU2xh2Z.js} +2 -2
  108. package/payload/server/public/assets/graph-CAU2xh2Z.js.br +0 -0
  109. package/payload/server/public/assets/graph-CAU2xh2Z.js.gz +0 -0
  110. package/payload/server/public/assets/graph-labels-CEDmX7qW.js +1 -0
  111. package/payload/server/public/assets/graph-labels-CEDmX7qW.js.br +0 -0
  112. package/payload/server/public/assets/graph-labels-CEDmX7qW.js.gz +0 -0
  113. package/payload/server/public/assets/{jsx-runtime-bq0g4NlA.css → jsx-runtime-hPFGo4rC.css} +1 -1
  114. package/payload/server/public/assets/jsx-runtime-hPFGo4rC.css.br +0 -0
  115. package/payload/server/public/assets/{jsx-runtime-bq0g4NlA.css.gz → jsx-runtime-hPFGo4rC.css.gz} +0 -0
  116. package/payload/server/public/assets/{operator-Dg-dwf7a.js → operator-1WFztEQA.js} +1 -1
  117. package/payload/server/public/assets/operator-1WFztEQA.js.br +0 -0
  118. package/payload/server/public/assets/operator-1WFztEQA.js.gz +0 -0
  119. package/payload/server/public/assets/page-B72XigcU.js +32 -0
  120. package/payload/server/public/assets/page-B72XigcU.js.br +0 -0
  121. package/payload/server/public/assets/page-B72XigcU.js.gz +0 -0
  122. package/payload/server/public/assets/page-nT8l_cX1.js +1 -0
  123. package/payload/server/public/assets/page-nT8l_cX1.js.br +0 -0
  124. package/payload/server/public/assets/page-nT8l_cX1.js.gz +0 -0
  125. package/payload/server/public/assets/play-CYqOCqm6.js +1 -0
  126. package/payload/server/public/assets/play-CYqOCqm6.js.br +0 -0
  127. package/payload/server/public/assets/play-CYqOCqm6.js.gz +0 -0
  128. package/payload/server/public/assets/public-DAea6w7w.js +1 -0
  129. package/payload/server/public/assets/public-DAea6w7w.js.br +0 -0
  130. package/payload/server/public/assets/public-DAea6w7w.js.gz +0 -0
  131. package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js +1 -0
  132. package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.br +0 -0
  133. package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.gz +0 -0
  134. package/payload/server/public/assets/{routines-6fxZNacQ.js → routines-vy5xsyqx.js} +2 -2
  135. package/payload/server/public/assets/routines-vy5xsyqx.js.br +0 -0
  136. package/payload/server/public/assets/routines-vy5xsyqx.js.gz +0 -0
  137. package/payload/server/public/assets/{skills-51mqx-s5.js → skills-X7FTilVy.js} +1 -1
  138. package/payload/server/public/assets/skills-X7FTilVy.js.br +0 -0
  139. package/payload/server/public/assets/skills-X7FTilVy.js.gz +0 -0
  140. package/payload/server/public/assets/tasks-BXx_jk_p.js +3 -0
  141. package/payload/server/public/assets/tasks-BXx_jk_p.js.br +0 -0
  142. package/payload/server/public/assets/tasks-BXx_jk_p.js.gz +0 -0
  143. package/payload/server/public/assets/triangle-alert-CuWcGaRo.js +1 -0
  144. package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.br +0 -0
  145. package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.gz +0 -0
  146. package/payload/server/public/assets/{useCopyFeedback-BG7h37Rx.js → useCopyFeedback-DLSKs6r2.js} +1 -1
  147. package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.br +0 -0
  148. package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.gz +0 -0
  149. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js +6 -0
  150. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.br +0 -0
  151. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.gz +0 -0
  152. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js +2 -0
  153. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.br +0 -0
  154. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.gz +0 -0
  155. package/payload/server/public/assets/wrench-nDMQ6x-6.js +1 -0
  156. package/payload/server/public/assets/wrench-nDMQ6x-6.js.br +0 -0
  157. package/payload/server/public/assets/wrench-nDMQ6x-6.js.gz +0 -0
  158. package/payload/server/public/browser.html +5 -5
  159. package/payload/server/public/calendar.html +8 -8
  160. package/payload/server/public/chat.html +14 -14
  161. package/payload/server/public/data.html +12 -12
  162. package/payload/server/public/field.html +3 -3
  163. package/payload/server/public/graph.html +10 -10
  164. package/payload/server/public/index.html +14 -14
  165. package/payload/server/public/operator.html +15 -15
  166. package/payload/server/public/public.html +14 -14
  167. package/payload/server/public/routines.html +8 -8
  168. package/payload/server/public/skills.html +6 -6
  169. package/payload/server/public/tasks.html +7 -7
  170. package/payload/server/server.js +1 -1
  171. package/payload/server/public/assets/AdminLoginScreens-DI5bNlX8.js +0 -1
  172. package/payload/server/public/assets/AdminLoginScreens-DI5bNlX8.js.br +0 -0
  173. package/payload/server/public/assets/AdminLoginScreens-DI5bNlX8.js.gz +0 -0
  174. package/payload/server/public/assets/AdminShell-B-iX9ahJ.js +0 -3
  175. package/payload/server/public/assets/AdminShell-B-iX9ahJ.js.br +0 -0
  176. package/payload/server/public/assets/AdminShell-B-iX9ahJ.js.gz +0 -0
  177. package/payload/server/public/assets/activity-CqgFwANo.js +0 -1
  178. package/payload/server/public/assets/activity-CqgFwANo.js.br +0 -0
  179. package/payload/server/public/assets/activity-CqgFwANo.js.gz +0 -0
  180. package/payload/server/public/assets/admin-K63n6ybW.js +0 -1
  181. package/payload/server/public/assets/admin-K63n6ybW.js.br +0 -0
  182. package/payload/server/public/assets/admin-K63n6ybW.js.gz +0 -0
  183. package/payload/server/public/assets/agents-cue5Zf8X.js +0 -1
  184. package/payload/server/public/assets/agents-cue5Zf8X.js.br +0 -0
  185. package/payload/server/public/assets/agents-cue5Zf8X.js.gz +0 -0
  186. package/payload/server/public/assets/browser-CqDBcKwU.js.br +0 -0
  187. package/payload/server/public/assets/browser-CqDBcKwU.js.gz +0 -0
  188. package/payload/server/public/assets/calendar-BgzuW5Rt.js +0 -1
  189. package/payload/server/public/assets/calendar-BgzuW5Rt.js.br +0 -0
  190. package/payload/server/public/assets/calendar-BgzuW5Rt.js.gz +0 -0
  191. package/payload/server/public/assets/chat-HYZViu2u.js +0 -1
  192. package/payload/server/public/assets/chat-HYZViu2u.js.br +0 -3
  193. package/payload/server/public/assets/chat-HYZViu2u.js.gz +0 -0
  194. package/payload/server/public/assets/chevron-left-C5FXH9r_.js +0 -1
  195. package/payload/server/public/assets/chevron-left-C5FXH9r_.js.br +0 -0
  196. package/payload/server/public/assets/clock-DxPtyejC.js +0 -1
  197. package/payload/server/public/assets/clock-DxPtyejC.js.br +0 -0
  198. package/payload/server/public/assets/clock-DxPtyejC.js.gz +0 -0
  199. package/payload/server/public/assets/copy-BNhZ0flH.js +0 -1
  200. package/payload/server/public/assets/copy-BNhZ0flH.js.br +0 -0
  201. package/payload/server/public/assets/copy-BNhZ0flH.js.gz +0 -0
  202. package/payload/server/public/assets/data-kCBB8Z4Z.js +0 -1
  203. package/payload/server/public/assets/data-kCBB8Z4Z.js.br +0 -0
  204. package/payload/server/public/assets/data-kCBB8Z4Z.js.gz +0 -0
  205. package/payload/server/public/assets/field-X4OVA3vx.js.br +0 -0
  206. package/payload/server/public/assets/field-X4OVA3vx.js.gz +0 -0
  207. package/payload/server/public/assets/file-text-BddO_2EI.js +0 -1
  208. package/payload/server/public/assets/file-text-BddO_2EI.js.br +0 -0
  209. package/payload/server/public/assets/file-text-BddO_2EI.js.gz +0 -0
  210. package/payload/server/public/assets/graph-l7tzHqvm.js.br +0 -0
  211. package/payload/server/public/assets/graph-l7tzHqvm.js.gz +0 -0
  212. package/payload/server/public/assets/graph-labels-CtFFq5W2.js +0 -1
  213. package/payload/server/public/assets/graph-labels-CtFFq5W2.js.br +0 -0
  214. package/payload/server/public/assets/graph-labels-CtFFq5W2.js.gz +0 -0
  215. package/payload/server/public/assets/jsx-runtime-bq0g4NlA.css.br +0 -0
  216. package/payload/server/public/assets/operator-Dg-dwf7a.js.br +0 -7
  217. package/payload/server/public/assets/operator-Dg-dwf7a.js.gz +0 -0
  218. package/payload/server/public/assets/page-Ci1bfIbs.js +0 -1
  219. package/payload/server/public/assets/page-Ci1bfIbs.js.br +0 -0
  220. package/payload/server/public/assets/page-Ci1bfIbs.js.gz +0 -0
  221. package/payload/server/public/assets/page-Y9JmFq0Q.js +0 -32
  222. package/payload/server/public/assets/page-Y9JmFq0Q.js.br +0 -0
  223. package/payload/server/public/assets/page-Y9JmFq0Q.js.gz +0 -0
  224. package/payload/server/public/assets/play-BSZVGpQT.js +0 -1
  225. package/payload/server/public/assets/play-BSZVGpQT.js.br +0 -0
  226. package/payload/server/public/assets/play-BSZVGpQT.js.gz +0 -0
  227. package/payload/server/public/assets/public-m66FAza_.js +0 -1
  228. package/payload/server/public/assets/public-m66FAza_.js.br +0 -0
  229. package/payload/server/public/assets/public-m66FAza_.js.gz +0 -0
  230. package/payload/server/public/assets/rotate-ccw-DTOJmOxB.js +0 -1
  231. package/payload/server/public/assets/rotate-ccw-DTOJmOxB.js.br +0 -0
  232. package/payload/server/public/assets/rotate-ccw-DTOJmOxB.js.gz +0 -0
  233. package/payload/server/public/assets/routines-6fxZNacQ.js.br +0 -0
  234. package/payload/server/public/assets/routines-6fxZNacQ.js.gz +0 -0
  235. package/payload/server/public/assets/skills-51mqx-s5.js.br +0 -0
  236. package/payload/server/public/assets/skills-51mqx-s5.js.gz +0 -0
  237. package/payload/server/public/assets/tasks-D4y-Cwa3.js +0 -3
  238. package/payload/server/public/assets/tasks-D4y-Cwa3.js.br +0 -0
  239. package/payload/server/public/assets/tasks-D4y-Cwa3.js.gz +0 -0
  240. package/payload/server/public/assets/triangle-alert-BzCjDFts.js +0 -1
  241. package/payload/server/public/assets/triangle-alert-BzCjDFts.js.br +0 -0
  242. package/payload/server/public/assets/triangle-alert-BzCjDFts.js.gz +0 -0
  243. package/payload/server/public/assets/useCopyFeedback-BG7h37Rx.js.br +0 -2
  244. package/payload/server/public/assets/useCopyFeedback-BG7h37Rx.js.gz +0 -0
  245. package/payload/server/public/assets/useMediaQuery-CqwktQr_.js +0 -6
  246. package/payload/server/public/assets/useMediaQuery-CqwktQr_.js.br +0 -0
  247. package/payload/server/public/assets/useMediaQuery-CqwktQr_.js.gz +0 -0
  248. package/payload/server/public/assets/useVoiceRecorder-CAZcUc1s.js +0 -2
  249. package/payload/server/public/assets/useVoiceRecorder-CAZcUc1s.js.br +0 -0
  250. package/payload/server/public/assets/useVoiceRecorder-CAZcUc1s.js.gz +0 -0
  251. package/payload/server/public/assets/wrench-B2WKLLQG.js +0 -1
  252. package/payload/server/public/assets/wrench-B2WKLLQG.js.br +0 -0
  253. package/payload/server/public/assets/wrench-B2WKLLQG.js.gz +0 -0
  254. /package/payload/server/public/assets/{jsx-runtime-UK6hgBWO.js → jsx-runtime-CvVXOszc.js} +0 -0
  255. /package/payload/server/public/assets/{jsx-runtime-UK6hgBWO.js.br → jsx-runtime-CvVXOszc.js.br} +0 -0
  256. /package/payload/server/public/assets/{jsx-runtime-UK6hgBWO.js.gz → jsx-runtime-CvVXOszc.js.gz} +0 -0
@@ -35,7 +35,7 @@
35
35
  * routine's prompt only when the stored `routineTemplateVersion` is BELOW this
36
36
  * and no operator has edited the row, so an unbumped edit ships to new installs
37
37
  * and never reaches existing ones — bump it in the same commit as the edit. */
38
- export const ROUTINE_TEMPLATE_VERSION = 6;
38
+ export const ROUTINE_TEMPLATE_VERSION = 10;
39
39
 
40
40
  /**
41
41
  * Task 2379 — the check shapes a shipped template may name.
@@ -94,6 +94,34 @@ export interface RoutineGraphUnflaggedCheck {
94
94
  readonly type: "graph-unflagged";
95
95
  readonly label: "ConversationArchive" | "Section";
96
96
  }
97
+ /** Task 2689 — the memory sweep's own state: its two review queues, and whether
98
+ * it has stopped running. No fields, because an account has exactly one sweep
99
+ * and one of each queue. What is compared is a digest, so the routine wakes
100
+ * when a queue moves or the sweep goes silent, never merely because the sweep
101
+ * ran again — it runs hourly and this routine is weekly. */
102
+ /** Task 2688 — records changed in a connector this account registered, since
103
+ * the routine last woke.
104
+ *
105
+ * `scope` is a KIND of connector, never a name: the account describes the
106
+ * queue once, on the connector's own registry record, and the template names
107
+ * only which kind it watches. That is what lets a shipped template gate on a
108
+ * third-party system at all, since it can carry no per-account value (Task
109
+ * 2389). A connector that is not registered, or whose credential is refused,
110
+ * answers quiet, so the routine no-ops rather than erroring every fire. */
111
+ export interface RoutineConnectorCheck {
112
+ readonly type: "connector";
113
+ readonly scope: "operational" | "accounting";
114
+ }
115
+ export interface RoutineSweepCheck {
116
+ readonly type: "sweep";
117
+ }
118
+ /** Task 2689 — growth under the account's own directory since the last accepted
119
+ * wake. `minGrowthBytes` is a size rather than per-account data, so a shipped
120
+ * template may name it and still be correct on every install. */
121
+ export interface RoutineFilesystemCheck {
122
+ readonly type: "filesystem";
123
+ readonly minGrowthBytes?: number;
124
+ }
97
125
  export type RoutineGateCheck =
98
126
  | RoutineMailCheck
99
127
  | RoutineD1Check
@@ -101,7 +129,10 @@ export type RoutineGateCheck =
101
129
  | RoutineCalendarCheck
102
130
  | RoutineTelegramCheck
103
131
  | RoutineGraphCheck
104
- | RoutineGraphUnflaggedCheck;
132
+ | RoutineGraphUnflaggedCheck
133
+ | RoutineConnectorCheck
134
+ | RoutineSweepCheck
135
+ | RoutineFilesystemCheck;
105
136
 
106
137
  /** The plugin and the tool are constants for every roster gate, so a template
107
138
  * carries neither. `hasWork` is true when ANY check is true. */
@@ -142,11 +173,24 @@ export function isWatermarkedCheck(check: RoutineGateCheck): boolean {
142
173
  //
143
174
  // Task 2681 — `graph` compares an ISO `updatedAt` against a stored one, so a
144
175
  // commitless graph gate reports work on every fire exactly as a mail one does.
176
+ //
177
+ // Task 2688 — `connector` holds one position PER registered connector, and
178
+ // compares each against the instant that connector's queue was last read, so
179
+ // it is watermarked for the same reason.
180
+ //
181
+ // Task 2689 — `sweep` compares a digest and `filesystem` compares a byte
182
+ // count, both against a stored value, so both belong here for the same
183
+ // reason. Their positions are promoted by the dispatcher on an accepted wake,
184
+ // which is what makes "since the last report" literal rather than "since the
185
+ // last fire".
145
186
  return (
146
187
  check.type === "mail" ||
147
188
  check.type === "calendar" ||
148
189
  check.type === "telegram" ||
149
- check.type === "graph"
190
+ check.type === "graph" ||
191
+ check.type === "connector" ||
192
+ check.type === "sweep" ||
193
+ check.type === "filesystem"
150
194
  );
151
195
  }
152
196
 
@@ -249,18 +293,6 @@ Say what is unfinished and what tomorrow looks like, in that order, in plain sen
249
293
 
250
294
  If nothing is waiting, nothing is overdue and tomorrow is empty, end the turn without replying.`;
251
295
 
252
- const APPOINTMENT_REMINDER = `Remind the people attending an appointment that is coming up, so nobody is reminded twice and nobody is missed.
253
-
254
- Call capabilities-here first. If neither a mail plugin nor a messaging channel is enabled, end the turn without replying.
255
-
256
- Find appointments starting within the next reminder window with schedule-list, and read each one's attendees. Resolve each attendee to a person and a contact route with contact-lookup. An attendee you cannot resolve to a route is not a failure to work around: leave them, and say so at the end.
257
-
258
- Send each attendee one reminder on the route they are already reachable on: email-send for a mailbox, whatsapp-reply or the Telegram message tool for a messaging thread that already exists. Carry the time, the place and what the appointment is about. Do not open a new conversation with someone who has never messaged the business.
259
-
260
- Send at most one reminder per attendee per appointment. Before sending, check the appointment's notes for a reminder already recorded, and record the one you send there.
261
-
262
- Reply with one line naming who was reminded and who could not be reached. If no appointment falls in the window, end the turn without replying.`;
263
-
264
296
  const COMMITMENT_CHASE = `Find the promises the business has made and not kept, and the promises made to it that nobody has kept.
265
297
 
266
298
  Call capabilities-here first and use only the surfaces it reports.
@@ -387,7 +419,20 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
387
419
  "Sends one morning message covering what needs a decision, what is time-bound and what changed overnight; stays silent when there is nothing worth saying.",
388
420
  recurrence: "30 7 * * 1-5",
389
421
  prompt: START_OF_DAY,
390
- gateless: "A morning briefing is judgement every fire, so a gate would either always pass or suppress the briefing.",
422
+ // Task 2686 the briefing's two gateable arms. `Section` rather than
423
+ // `ConversationArchive` on every email-driven row here: sections are written
424
+ // per ingest, so a reply into a thread this routine already flagged arrives
425
+ // as a fresh unflagged node, while the archive is MERGEd per thread and
426
+ // would stay flagged — muting the routine on the traffic it exists to read.
427
+ // The check names a label and not a source, so any ingested content wakes
428
+ // these rows, which over-wakes and never mutes. The briefing's third arm,
429
+ // open and overdue work, has no check type: Task 2714.
430
+ gate: {
431
+ checks: [
432
+ { type: "graph-unflagged", label: "Section" },
433
+ { type: "graph", scope: "appointments" },
434
+ ],
435
+ },
391
436
  },
392
437
  {
393
438
  key: "inbound-check",
@@ -396,7 +441,10 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
396
441
  "Triages mail that arrived since the last check and writes replies for you to approve; it never sends anything itself.",
397
442
  recurrence: "*/30 9-17 * * 1-5",
398
443
  prompt: INBOUND_CHECK,
399
- gateless: "Conditional on new mail, but the mail check matches an exact mailbox address and no shipped template can name one (Task 2389).",
444
+ // Task 2686 the mail check still cannot name a mailbox, but the sampler
445
+ // puts every inbound message in the graph, so the unflagged-section check
446
+ // reaches the same mail without per-account data.
447
+ gate: { checks: [{ type: "graph-unflagged", label: "Section" }] },
400
448
  },
401
449
  {
402
450
  key: "telegram-inbound-check",
@@ -411,19 +459,18 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
411
459
  key: "end-of-day",
412
460
  name: "End of day wrap-up",
413
461
  description:
414
- "Closes the day with your unsent drafts, overdue work and tomorrow's diary; says nothing when all three are empty.",
462
+ "Closes the day with your unsent drafts, overdue work and tomorrow's diary, once new mail or a diary change has woken it.",
415
463
  recurrence: "0 18 * * 1-5",
416
464
  prompt: END_OF_DAY,
417
- gateless: "A wrap-up is judgement every fire, so no cheap check stands in for reading the three surfaces it reports.",
418
- },
419
- {
420
- key: "appointment-reminder",
421
- name: "Appointment reminders",
422
- description:
423
- "Reminds each attendee once before a booked appointment, on a route they already use; it never opens a conversation with a stranger.",
424
- recurrence: "0 * * * *",
425
- prompt: APPOINTMENT_REMINDER,
426
- gateless: "Conditional on an appointment falling in the window, but no check type reads appointments held in the graph (Task 2389).",
465
+ // Task 2686 — the wrap-up wakes on new mail or a diary change. Its other two
466
+ // surfaces, unsent drafts and overdue work, have no check type, so a day
467
+ // whose only outstanding item is one of those is silent until Task 2714.
468
+ gate: {
469
+ checks: [
470
+ { type: "graph-unflagged", label: "Section" },
471
+ { type: "graph", scope: "appointments" },
472
+ ],
473
+ },
427
474
  },
428
475
  {
429
476
  key: "commitment-chase",
@@ -432,7 +479,11 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
432
479
  "Surfaces promises the business made and did not keep, and promises made to it that nobody kept; it reports them rather than chasing them.",
433
480
  recurrence: "0 10 * * 2",
434
481
  prompt: COMMITMENT_CHASE,
435
- gateless: "Whether a promise has been dropped is the judgement itself, so no check can answer it more cheaply.",
482
+ // Task 2686 a dropped promise is a judgement, but the correspondence it
483
+ // judges is not: this wakes when inbound mail it has not read is in the
484
+ // graph. Its outbound arm reads sent mail, which the sampler does not ingest
485
+ // and no shipped template can name a mailbox for: Task 2715.
486
+ gate: { checks: [{ type: "graph-unflagged", label: "Section" }] },
436
487
  },
437
488
  {
438
489
  key: "calendar-reconcile",
@@ -452,7 +503,9 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
452
503
  "Reconciles the people you correspond with against the people on record, creating and updating contacts; it never merges two records that might be two people.",
453
504
  recurrence: "45 6 * * 1-5",
454
505
  prompt: CONTACT_RECONCILE,
455
- gateless: "Conditional on new correspondence, but no check type reads correspondence (Task 2389).",
506
+ // Task 2686 correspondence is readable now: the sampler writes it and the
507
+ // unflagged-section check counts what this routine has not reconciled.
508
+ gate: { checks: [{ type: "graph-unflagged", label: "Section" }] },
456
509
  },
457
510
  {
458
511
  key: "crm-reconcile",
@@ -461,7 +514,9 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
461
514
  "Brings across what changed in whichever operational system this business runs; it reads only and never writes back to that system.",
462
515
  recurrence: "0 3 * * *",
463
516
  prompt: CRM_RECONCILE,
464
- gateless: "Conditional on connector movement, but no check type reads a connector queue (Task 2389).",
517
+ // Task 2688 wakes when a connector the account registered as its
518
+ // operational system holds records changed since the last accepted wake.
519
+ gate: { checks: [{ type: "connector", scope: "operational" }] },
465
520
  },
466
521
  {
467
522
  key: "finance-reconcile",
@@ -470,7 +525,10 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
470
525
  "Reconciles the accounting system against the internal ledger and reports what does not agree; it never adjusts an entry to make the two sides match.",
471
526
  recurrence: "0 4 * * 1",
472
527
  prompt: FINANCE_RECONCILE,
473
- gateless: "Conditional on accounting movement, but no check type reads an accounting ledger (Task 2389).",
528
+ // Task 2688 wakes on movement in the connector the account registered as
529
+ // its accounting system. A connector that is absent or whose credential is
530
+ // refused answers quiet, so this no-ops rather than erroring every fire.
531
+ gate: { checks: [{ type: "connector", scope: "accounting" }] },
474
532
  },
475
533
  {
476
534
  key: "weekly-digest",
@@ -479,7 +537,15 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
479
537
  "Writes the week in three paragraphs at most: what changed, what is stuck, and what next week turns on.",
480
538
  recurrence: "0 16 * * 5",
481
539
  prompt: WEEKLY_DIGEST,
482
- gateless: "A digest is judgement every fire, and a gate would suppress the report it exists to send.",
540
+ // Task 2686 a week with no correspondence and no diary movement has
541
+ // nothing to report movement on, so the digest is silent rather than
542
+ // writing three paragraphs about a week in which nothing happened.
543
+ gate: {
544
+ checks: [
545
+ { type: "graph-unflagged", label: "Section" },
546
+ { type: "graph", scope: "appointments" },
547
+ ],
548
+ },
483
549
  },
484
550
  {
485
551
  key: "channel-link-check",
@@ -497,7 +563,11 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
497
563
  "Reports what the hourly graph sweep last did and what is waiting for review; it reads only and never runs the sweep itself.",
498
564
  recurrence: "0 9 * * 1",
499
565
  prompt: GRAPH_HEALTH,
500
- gateless: "Reports the sweep's state every fire by design, so there is nothing conditional to check.",
566
+ // Task 2689 — the sweep's state IS the delta. The digest carries the two
567
+ // review-queue counts and whether the sweep has stopped writing reports,
568
+ // never the newest report's identity: the sweep runs hourly, so a digest
569
+ // that moved on every run would make this weekly routine wake every fire.
570
+ gate: { checks: [{ type: "sweep" }] },
501
571
  },
502
572
  {
503
573
  key: "filesystem-health",
@@ -506,7 +576,10 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
506
576
  "Reports what has grown under the account directory and which paths are worth attention; it deletes nothing.",
507
577
  recurrence: "0 9 * * 1",
508
578
  prompt: FILESYSTEM_HEALTH,
509
- gateless: "Reports what has grown every fire by design, so there is nothing conditional to check.",
579
+ // Task 2689 64 MiB of growth under the account directory since the last
580
+ // report. What has ACCUMULATED is the question, so an account that is large
581
+ // and stable has nothing new to say and the routine stays silent.
582
+ gate: { checks: [{ type: "filesystem", minGrowthBytes: 67108864 }] },
510
583
  },
511
584
  ];
512
585
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Real Agent ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:5dcfb553e3786cf49ce7e335c8f9c40c0321781e8b86b2667741555492eb2d06
4
+ content-hash: sha256:72ceb87984dc863b94b0bb40ef8aead338b2d093e44caf456504d6d09ea0a2c6
5
5
  brand: realagent-code
6
6
  product-name: Real Agent
7
7
  ---
@@ -325,6 +325,8 @@ If you suspect background processes are piling up, run `grep '\[reaper\]' ~/.{br
325
325
 
326
326
  Every install seeds `permissions.allow:[]` plus `defaultMode:"bypassPermissions"` into both the brand-scoped settings file (`~/.{brand}/.claude/settings.json`) and every account-scoped one (`<install>/data/accounts/<id>/.claude/settings.json`). `bypassPermissions` alone stops Claude Code from sending tool calls to its remote auto-classifier (it skips all permission checks), which would otherwise surface a permission prompt in the chat that an unattended session never answers. The `allow` array stays empty and **must never contain `"*"`**: Claude Code ≥ 2.1.167 rejects `"*"` as an allow token and renders a blocking Settings Warning that, under `--remote-control`, stops every `/rc-spawn` from binding. What each subagent is allowed to use is still controlled by the `tools:` line in its agent file, not by a top-level allowlist. To verify after an install: `cat ~/.{brand}/.claude/settings.json | jq '.permissions'` (expect `allow: []`). To repair an install seeded before this change: `bash <install>/platform/scripts/backfill-bypass-permissions.sh ~/.{brand}`.
327
327
 
328
+ **Workspace trust.** Separate from permissions, and its own way to stop a spawn dead. Claude Code refuses to start in a directory it does not trust, and it scopes that trust to the **git repository root** of the working directory rather than to any trusted ancestor. Every account directory is its own repository (`provision-account-dir.sh` runs `git init` there so Claude Code finds the account's own `.claude/` hook set), so trusting the home directory does not reach them. Every install therefore seeds `projects[<dir>].hasTrustDialogAccepted: true` into `~/.{brand}/.claude/.claude.json` for the home directory **and for every directory under `<install>/data/accounts`**, preserving all other fields the CLI wrote. Without it the PTY-spawned session halts on "Quick safety check: Is this a project you created or one you trust?" and never binds, which surfaces as a session that starts and answers nothing, with no error in the interface. The seeding runs twice per install and both passes matter: the `deploy` pass trusts the accounts an upgrade already has, and the `post-account` pass, which runs straight after account setup, trusts the account a brand-new install has only just created. The install line is `[install] op=claude-trust-seed phase=<deploy|post-account> file=… accounts=<N> seeded=<n> alreadyTrusted=<n> stale=<n> error=<none|msg>`; `seeded + alreadyTrusted` equals `accounts`, and a re-run reads `seeded=0`. Because an account added *after* an install has an untrusted repository root that no event announces, the session manager reconciles the two every hour and logs `[claude-trust-census] accounts=<N> trusted=<n> untrusted=<n> untrustedDirs=<csv|none> homeTrusted=<bool> onboarded=<bool>` — a non-zero `untrusted` names the directories whose next session will hang. To verify after an install: `node -e 'const j=require(process.env.HOME+"/.{brand}/.claude/.claude.json");const p=j.projects||{};for(const k of Object.keys(p))if(k.includes("/data/accounts/"))console.log(k,p[k].hasTrustDialogAccepted)'` (expect `true` for every account directory that exists).
329
+
328
330
  **`autoMode` trust block.** The same brand-scoped writer ([`permissions-seed.ts`](../../../packages/create-maxy-code/src/permissions-seed.ts), `AUTO_MODE_BLOCK`) also seeds the harness `autoMode` block. `bypassPermissions` skips the auto-mode classifier entirely, so the block is **belt-and-suspenders**: it only matters when a session is toggled into `auto` mode, where the classifier otherwise soft-denies the doctrine-sanctioned Cloudflare scoped-token mint ("permission/credential escalation") because the install's own Cloudflare infra is not in the classifier's default trusted environment. The block keeps `"$defaults"` first in `environment` and `allow` (so the built-in Data-Exfiltration / force-push / prod-deploy guards stay intact) and adds prose declaring `api.cloudflare.com` the install's own provider endpoint plus an allow for minting/persisting narrow per-scope tokens. It is seeded **only** into the brand/user settings (`~/.{brand}/.claude/settings.json`) — the classifier never reads `autoMode` from the shared project (account-scoped) settings, so `setup-account.sh` does not carry it. An auto-mode agent cannot seed this itself (the default `hard_deny` "Auto-Mode Bypass" blocks any agent editing `.claude/settings*.json`); installer seed is the only path. To verify after an install: `CLAUDE_CONFIG_DIR=~/.{brand}/.claude claude auto-mode config | jq '.environment, .allow'` (expect the Cloudflare entries, `$defaults` expanded) and `jq '.autoMode' ~/.{brand}/.claude/settings.json`.
329
331
 
330
332
  ---
@@ -4095,6 +4097,19 @@ which fails `prebuild` if any emoji codepoint appears in a `.ts`/`.tsx` file
4095
4097
  under `app/` (tests excluded). Inline an icon at the surrounding text size and
4096
4098
  colour (`size={14}` matches body text; Lucide inherits `currentColor`).
4097
4099
 
4100
+ **A long message shows its first 8 lines.** On `/chat`, the WhatsApp and
4101
+ Telegram readers and the public visitor chat, a message body taller than 8 lines
4102
+ is cut at 8 and carries a "Show more…" control that reveals the rest; "Show
4103
+ less" puts it back. The control appears only when there is genuinely more to
4104
+ see, so a short message looks exactly as it did before. Expanding one message
4105
+ expands only that message, and scrolling back through older messages does not
4106
+ carry an expansion onto a different one. Two things are never cut: an error the
4107
+ agent reports, and the map on a shared location. The reader's search also opens
4108
+ any message whose match would otherwise sit in the hidden part, so a search
4109
+ never finds something it then hides. See
4110
+ [`.docs/message-body-clamp.md`](../../../.docs/message-body-clamp.md) for the
4111
+ render sites and the census that watches it.
4112
+
4098
4113
  ## Admin Hono routes
4099
4114
 
4100
4115
  Every admin sub-app is mounted by
@@ -4352,9 +4367,9 @@ one, over the same automation set the routes list. The roster seed's own
4352
4367
  `descNull` counter is its narrow twin, scoped to seeded rows and so blind to
4353
4368
  exactly the operator-created ones most likely to carry no caption.
4354
4369
 
4355
- **The shipped roster.** Every account starts with fourteen routines —
4370
+ **The shipped roster.** Every account starts with thirteen routines —
4356
4371
  `start-of-day`, `inbound-check`, `telegram-inbound-check`, `end-of-day`,
4357
- `appointment-reminder`, `commitment-chase`, `calendar-reconcile`,
4372
+ `commitment-chase`, `calendar-reconcile`,
4358
4373
  `contact-reconcile`, `crm-reconcile`, `finance-reconcile`, `weekly-digest`,
4359
4374
  `channel-link-check`, `graph-health`, `filesystem-health`, in `/routines`
4360
4375
  display order. `ROUTINE_ROSTER_KEYS.length`
@@ -9,6 +9,16 @@ Invoked by the admin agent directly.
9
9
 
10
10
  This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
11
11
 
12
+ ## 2026-08-14 (0.1.606)
13
+
14
+ - Conversations start after an install again. The installer marked only your home folder as trusted, and the assistant now asks about the folder each account actually runs from, so a session would stop at a trust prompt nobody could answer.
15
+ - A long chat message is capped at eight lines with a control to show the rest, instead of filling the pane.
16
+
17
+ ## 2026-08-14 (0.1.605)
18
+
19
+ - Five more routines now check whether there is anything to do before waking the assistant. Mail triage, appointment reminders, the operational and finance reconciles, and the two health reports all previously ran on the clock and did the deciding after starting up.
20
+ - Email kept in the graph is now pruned on a schedule, so it does not grow without limit.
21
+
12
22
  ## 2026-08-13 (0.1.604)
13
23
 
14
24
  - Your assistant can now read a Telegram conversation back to you, both sides of it, from the record kept on your own machine. Ask for the chat with someone and you get every message they sent and every one the bot sent, in order, with a voice note shown as its transcript and a message they deleted marked as deleted.
@@ -41,11 +41,19 @@ The credential is stored in the account's secrets file and is never returned by
41
41
 
42
42
  ## Capabilities
43
43
 
44
- - **connector-register** — store a named API's base URL and a static credential. The credential scheme is one of bearer, api-key-header (a named header), or basic. Returns the non-secret record only.
44
+ - **connector-register** — store a named API's base URL and a static credential, and optionally describe its changed-since queue. The credential scheme is one of bearer, api-key-header (a named header), or basic. Returns the non-secret record only.
45
45
  - **connector-call** — make a request (GET or a mutating method) to a registered connector. The credential is injected from the secret store; the request is host-bound and SSRF-guarded. Returns the status, redacted response headers, and the (size-capped) body.
46
46
  - **connector-list** — the registered connectors for this account: names and base URLs only.
47
47
  - **connector-deregister** — remove a connector and its stored credential.
48
48
 
49
+ ## The changed-since queue
50
+
51
+ A registered connector may carry a `queue`, which is what lets a scheduled routine wake only when that system has actually moved. It names four things: the `kind` (`operational` or `accounting`), the `path` to read under the base URL, the `changedSinceParam` the API expects the watermark in, and the `itemsField` holding the array of changed records.
52
+
53
+ The kind decides which routine watches it. The shipped operational-system reconcile gates on `operational` and the finance reconcile on `accounting`, and neither names a connector: the routine names a kind, the account names the queue. A connector registered without a queue is watched by nothing, which is visible in the listing rather than silent.
54
+
55
+ The scheduling gate reads it by calling `connector-list` and then `connector-call`, so the credential and the host guard never leave this plugin. A queue whose credential is refused (401 or 403) reports no work rather than an error, so the routine no-ops instead of waking a model to rediscover a dead credential every fire. Registering an existing name again replaces its record, so omitting the queue removes it; that drop writes `op=register name=<n> queue=dropped`, because a queue lost in silence mutes whichever routine gated on it.
56
+
49
57
  ## Who can use it
50
58
 
51
59
  These tools are admin-driven. The operator's admin agent registers connectors and makes calls; the tools are not granted to any specialist agent, given their reach (arbitrary authenticated outbound requests and a credential store). A vertical agent that needs an external API is served by the admin acting on its behalf.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=queue-descriptor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-descriptor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/queue-descriptor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Task 2688 — the changed-since queue a registered connector can describe.
3
+ *
4
+ * The descriptor exists so a shipped routine template can gate on "this
5
+ * account's operational system" without naming a connector, a path or an
6
+ * address (Task 2389). These assert the two properties the gate depends on:
7
+ * the descriptor survives a round trip through the registry, and it reaches a
8
+ * reader through the listing while the credential never does.
9
+ */
10
+ import { mkdtempSync } from "node:fs";
11
+ import { tmpdir } from "node:os";
12
+ import { join } from "node:path";
13
+ import { describe, expect, it } from "vitest";
14
+ import { listConnectors, queueFromArgs, readRegistry, registerConnector } from "../lib/store.js";
15
+ const ACCOUNT = "20028fb5-0000-4000-8000-000000000000";
16
+ const REC = {
17
+ baseUrl: "https://api.example.com",
18
+ host: "api.example.com",
19
+ authScheme: "bearer",
20
+ };
21
+ const QUEUE = {
22
+ kind: "operational",
23
+ path: "/v2/jobs/changed",
24
+ changedSinceParam: "updatedSince",
25
+ itemsField: "items",
26
+ };
27
+ function root() {
28
+ return join(mkdtempSync(join(tmpdir(), "connector-store-")), "platform");
29
+ }
30
+ describe("queue descriptor", () => {
31
+ it("round-trips through the registry", () => {
32
+ const p = root();
33
+ registerConnector(p, ACCOUNT, "jobs", { ...REC, queue: QUEUE }, "secret");
34
+ expect(readRegistry(p, ACCOUNT).jobs.queue).toEqual(QUEUE);
35
+ });
36
+ it("is returned by the connector listing, and the credential is not", () => {
37
+ const p = root();
38
+ registerConnector(p, ACCOUNT, "jobs", { ...REC, queue: QUEUE }, "secret");
39
+ expect(listConnectors(p, ACCOUNT)).toEqual([
40
+ { name: "jobs", baseUrl: REC.baseUrl, queue: QUEUE },
41
+ ]);
42
+ });
43
+ it("omits the queue for a connector registered without one", () => {
44
+ const p = root();
45
+ registerConnector(p, ACCOUNT, "plain", REC, "secret");
46
+ expect(listConnectors(p, ACCOUNT)).toEqual([{ name: "plain", baseUrl: REC.baseUrl }]);
47
+ });
48
+ });
49
+ describe("queue validation", () => {
50
+ it("accepts a complete descriptor", () => {
51
+ expect(queueFromArgs(QUEUE)).toEqual({ queue: QUEUE });
52
+ });
53
+ it("refuses a kind outside the two", () => {
54
+ expect(queueFromArgs({ ...QUEUE, kind: "sales" })).toEqual({
55
+ refusal: "queue.kind must be operational or accounting.",
56
+ });
57
+ });
58
+ it("refuses a blank field", () => {
59
+ expect(queueFromArgs({ ...QUEUE, path: " " })).toEqual({
60
+ refusal: "queue.path must not be blank.",
61
+ });
62
+ });
63
+ it("passes undefined through as no queue", () => {
64
+ expect(queueFromArgs(undefined)).toEqual({});
65
+ });
66
+ });
67
+ //# sourceMappingURL=queue-descriptor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-descriptor.test.js","sourceRoot":"","sources":["../../src/__tests__/queue-descriptor.test.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { z } from "zod";
4
4
  import { lifelineTool } from "../../../../lib/mcp-lifeline/dist/index.js";
5
- import { readRegistry, listConnectors, registerConnector, deregisterConnector, resolveConnector, } from "./lib/store.js";
5
+ import { readRegistry, listConnectors, registerConnector, deregisterConnector, resolveConnector, queueFromArgs, } from "./lib/store.js";
6
6
  import { performCall } from "./lib/call.js";
7
7
  import { hostResolvesPrivate } from "./lib/ssrf.js";
8
8
  // Plugin-system boot tolerance: module init must never throw. tools/list is enumerated
@@ -41,7 +41,7 @@ function ctx(tool) {
41
41
  return { platformRoot: PLATFORM_ROOT, accountId: ACCOUNT_ID };
42
42
  }
43
43
  const server = new McpServer({ name: "connector", version: "0.1.0" });
44
- lifelineTool(server, "connector-register", "Register a named third-party REST API: store its base URL and a static credential so the agent can call it. auth.scheme is bearer | api-key-header | basic; headerName is required for api-key-header. The credential is stored in the account secrets file and is never returned or logged. Returns the non-secret record only.", {
44
+ lifelineTool(server, "connector-register", "Register a named third-party REST API: store its base URL and a static credential so the agent can call it. auth.scheme is bearer | api-key-header | basic; headerName is required for api-key-header. The credential is stored in the account secrets file and is never returned or logged. Optionally describe a changed-since queue, which is what lets a scheduled reconcile wake only when this system has moved: queue.kind (operational or accounting) chooses which routine watches it, queue.path is the endpoint under the base URL, queue.changedSinceParam is the query parameter carrying the watermark, and queue.itemsField is the response field holding the array of changed records. Registering an existing name again replaces its record, so omitting queue removes it. Returns the non-secret record only.", {
45
45
  name: z.string().min(1),
46
46
  baseUrl: z.string().min(1),
47
47
  auth: z.object({
@@ -49,7 +49,15 @@ lifelineTool(server, "connector-register", "Register a named third-party REST AP
49
49
  value: z.string().min(1),
50
50
  headerName: z.string().min(1).optional(),
51
51
  }),
52
- }, async ({ name, baseUrl, auth }) => {
52
+ queue: z
53
+ .object({
54
+ kind: z.enum(["operational", "accounting"]),
55
+ path: z.string().min(1),
56
+ changedSinceParam: z.string().min(1),
57
+ itemsField: z.string().min(1),
58
+ })
59
+ .optional(),
60
+ }, async ({ name, baseUrl, auth, queue }) => {
53
61
  const c = ctx("connector-register");
54
62
  if ("refusal" in c)
55
63
  return c.refusal;
@@ -68,15 +76,38 @@ lifelineTool(server, "connector-register", "Register a named third-party REST AP
68
76
  process.stderr.write(`[connector] op=register-refused name=${name} reason=private-ip target=${url.hostname}\n`);
69
77
  return fail("connector-register: refused — baseUrl host resolves to a private or loopback address.");
70
78
  }
79
+ // Task 2688 — the zod schema already refuses a malformed queue from a tool
80
+ // call; this refuses one that reached the handler any other way, and it is
81
+ // the single place the shape is judged, so the store and the tool cannot
82
+ // disagree about what a valid descriptor is.
83
+ const parsedQueue = queueFromArgs(queue);
84
+ if (parsedQueue.refusal)
85
+ return fail(`connector-register: ${parsedQueue.refusal}`);
86
+ // Registering an existing name REPLACES its record, so omitting the queue
87
+ // removes it. Merging instead would be invented behaviour; the drop is made
88
+ // visible, because a queue silently lost mutes whichever routine gated on
89
+ // it and no other surface would say so.
90
+ const previous = readRegistry(c.platformRoot, c.accountId)[name];
91
+ if (previous?.queue && !parsedQueue.queue) {
92
+ process.stderr.write(`[connector] op=register name=${name} queue=dropped\n`);
93
+ }
71
94
  const rec = {
72
95
  baseUrl,
73
96
  host: url.hostname,
74
97
  authScheme: auth.scheme,
75
98
  ...(auth.scheme === "api-key-header" ? { headerName: auth.headerName } : {}),
99
+ ...(parsedQueue.queue ? { queue: parsedQueue.queue } : {}),
76
100
  };
77
101
  registerConnector(c.platformRoot, c.accountId, name, rec, auth.value);
78
- process.stderr.write(`[connector] op=register name=${name} host=${url.hostname} scheme=${auth.scheme}\n`);
79
- return ok({ name, baseUrl, host: url.hostname, authScheme: auth.scheme });
102
+ process.stderr.write(`[connector] op=register name=${name} host=${url.hostname} scheme=${auth.scheme} ` +
103
+ `queue=${parsedQueue.queue?.kind ?? "none"}\n`);
104
+ return ok({
105
+ name,
106
+ baseUrl,
107
+ host: url.hostname,
108
+ authScheme: auth.scheme,
109
+ ...(parsedQueue.queue ? { queue: parsedQueue.queue } : {}),
110
+ });
80
111
  });
81
112
  lifelineTool(server, "connector-call", "Make an authenticated request to a registered connector. The credential is injected from the secret store; the request is confined to the registered host (a different host, a private address, or a cross-host redirect is refused). Returns { status, headers (redacted), body (capped) }.", {
82
113
  name: z.string().min(1),
@@ -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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"}
@@ -1,11 +1,45 @@
1
1
  export type AuthScheme = "bearer" | "api-key-header" | "basic";
2
+ /** Task 2688 — which routine watches this queue. A scheduled reconcile names
3
+ * the KIND, never the connector, because a shipped routine template can carry
4
+ * no per-account value (Task 2389). */
5
+ export type ConnectorQueueKind = "operational" | "accounting";
6
+ /**
7
+ * Task 2688 — how this connector answers "what changed since <instant>".
8
+ *
9
+ * Held on the registry record rather than on the gate that reads it: the
10
+ * account knows its own API and describes it once, and the scheduling gate then
11
+ * asks for whichever queues carry the kind it was armed with. Without this the
12
+ * gate would have to name a path and a parameter itself, which no shipped
13
+ * template can do.
14
+ */
15
+ export interface ConnectorQueue {
16
+ kind: ConnectorQueueKind;
17
+ /** Path under the registered base URL, e.g. "/v2/jobs/changed". */
18
+ path: string;
19
+ /** The query parameter that carries the watermark, e.g. "updatedSince". */
20
+ changedSinceParam: string;
21
+ /** Top-level response field holding the array of changed records. */
22
+ itemsField: string;
23
+ }
2
24
  export interface ConnectorRecord {
3
25
  baseUrl: string;
4
26
  host: string;
5
27
  authScheme: AuthScheme;
6
28
  /** Required when authScheme is "api-key-header"; the header the credential is sent in. */
7
29
  headerName?: string;
30
+ queue?: ConnectorQueue;
8
31
  }
32
+ /**
33
+ * Validate a queue descriptor arriving off tool arguments.
34
+ *
35
+ * Returns `{}` for an absent queue, `{ queue }` for a valid one, and
36
+ * `{ refusal }` for anything else. A refusal string rather than a throw,
37
+ * because the tool answers a refusal as text and never as an exception.
38
+ */
39
+ export declare function queueFromArgs(raw: unknown): {
40
+ queue?: ConnectorQueue;
41
+ refusal?: string;
42
+ };
9
43
  type Registry = Record<string, ConnectorRecord>;
10
44
  type Secrets = Record<string, string>;
11
45
  export declare function readRegistry(platformRoot: string, accountId: string): Registry;
@@ -20,6 +54,7 @@ export declare function resolveConnector(platformRoot: string, accountId: string
20
54
  export declare function listConnectors(platformRoot: string, accountId: string): {
21
55
  name: string;
22
56
  baseUrl: string;
57
+ queue?: ConnectorQueue;
23
58
  }[];
24
59
  export {};
25
60
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAChD,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAyBtC,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAE9E;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAON;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CASlG;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKjD;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAK3G"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAE/D;;wCAEwC;AACxC,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAID;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAoBxF;AAED,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAChD,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAyBtC,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAE9E;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAON;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CASlG;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKjD;AAED,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAE,EAAE,CAQ7D"}