@rubytech/create-realagent-code 0.1.608 → 0.1.610

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 (251) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/graph-write/dist/__tests__/account-id-gate.test.js +86 -0
  3. package/payload/platform/lib/graph-write/dist/__tests__/account-id-gate.test.js.map +1 -1
  4. package/payload/platform/lib/graph-write/dist/index.d.ts +30 -9
  5. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  6. package/payload/platform/lib/graph-write/dist/index.js +22 -2
  7. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  8. package/payload/platform/lib/graph-write/src/__tests__/account-id-gate.test.ts +99 -1
  9. package/payload/platform/lib/graph-write/src/index.ts +47 -12
  10. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +45 -1
  11. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
  12. package/payload/platform/plugins/docs/references/telegram-guide.md +44 -0
  13. package/payload/platform/plugins/memory/mcp/dist/index.js +65 -0
  14. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  15. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.d.ts +2 -0
  16. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.d.ts.map +1 -0
  17. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.js +169 -0
  18. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.js.map +1 -0
  19. package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.d.ts +63 -0
  20. package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.d.ts.map +1 -0
  21. package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.js +114 -0
  22. package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.js.map +1 -0
  23. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.d.ts +2 -0
  24. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.d.ts.map +1 -0
  25. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.js +123 -0
  26. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.js.map +1 -0
  27. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.d.ts +2 -0
  28. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.d.ts.map +1 -0
  29. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.js +110 -0
  30. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.js.map +1 -0
  31. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  32. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +7 -0
  33. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  34. package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
  35. package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.d.ts +43 -0
  36. package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.d.ts.map +1 -0
  37. package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.js +88 -0
  38. package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.js.map +1 -0
  39. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  40. package/payload/platform/services/claude-session-manager/dist/http-server.js +125 -4
  41. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  42. package/payload/platform/services/claude-session-manager/dist/index.js +26 -1
  43. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  46. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +26 -0
  47. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  48. package/payload/platform/services/claude-session-manager/dist/recover-account.d.ts +54 -0
  49. package/payload/platform/services/claude-session-manager/dist/recover-account.d.ts.map +1 -0
  50. package/payload/platform/services/claude-session-manager/dist/recover-account.js +141 -0
  51. package/payload/platform/services/claude-session-manager/dist/recover-account.js.map +1 -0
  52. package/payload/platform/services/claude-session-manager/dist/session-account-census.d.ts +30 -0
  53. package/payload/platform/services/claude-session-manager/dist/session-account-census.d.ts.map +1 -0
  54. package/payload/platform/services/claude-session-manager/dist/session-account-census.js +96 -0
  55. package/payload/platform/services/claude-session-manager/dist/session-account-census.js.map +1 -0
  56. package/payload/platform/services/telegram-channel/dist/instructions.d.ts +9 -0
  57. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  58. package/payload/platform/services/telegram-channel/dist/instructions.js +15 -0
  59. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  60. package/payload/platform/services/telegram-channel/dist/notification.d.ts +6 -4
  61. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  62. package/payload/platform/services/telegram-channel/dist/notification.js +15 -1
  63. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  64. package/payload/server/{chunk-GI5AVCRG.js → chunk-DRDU74ZM.js} +1 -1
  65. package/payload/server/{chunk-MNN2RWJR.js → chunk-IOPUA7QV.js} +1 -1
  66. package/payload/server/{chunk-6AQYMT6C.js → chunk-T6NXRWMG.js} +43 -8
  67. package/payload/server/{manager-VDHT3YYI.js → manager-O5L2SKW7.js} +2 -2
  68. package/payload/server/maxy-edge.js +2 -2
  69. package/payload/server/public/activity.html +6 -6
  70. package/payload/server/public/agents.html +5 -5
  71. package/payload/server/public/assets/{AdminLoginScreens-DuQ3ax5U.js → AdminLoginScreens-uk2gBvI9.js} +1 -1
  72. package/payload/server/public/assets/AdminLoginScreens-uk2gBvI9.js.br +0 -0
  73. package/payload/server/public/assets/AdminLoginScreens-uk2gBvI9.js.gz +0 -0
  74. package/payload/server/public/assets/AdminShell-DyOPTLdb.js +3 -0
  75. package/payload/server/public/assets/AdminShell-DyOPTLdb.js.br +0 -0
  76. package/payload/server/public/assets/AdminShell-DyOPTLdb.js.gz +0 -0
  77. package/payload/server/public/assets/{activity-C2qWlcJ5.js → activity-DfIud5UH.js} +1 -1
  78. package/payload/server/public/assets/activity-DfIud5UH.js.br +0 -0
  79. package/payload/server/public/assets/activity-DfIud5UH.js.gz +0 -0
  80. package/payload/server/public/assets/admin-Duy2d3ks.js +1 -0
  81. package/payload/server/public/assets/admin-Duy2d3ks.js.br +0 -0
  82. package/payload/server/public/assets/admin-Duy2d3ks.js.gz +0 -0
  83. package/payload/server/public/assets/{agents-DoGVAjIT.js → agents-Rcdk-pni.js} +1 -1
  84. package/payload/server/public/assets/agents-Rcdk-pni.js.br +0 -0
  85. package/payload/server/public/assets/agents-Rcdk-pni.js.gz +0 -0
  86. package/payload/server/public/assets/{browser-DjqS897k.js → browser-Bt6h1Pjb.js} +1 -1
  87. package/payload/server/public/assets/browser-Bt6h1Pjb.js.br +0 -0
  88. package/payload/server/public/assets/browser-Bt6h1Pjb.js.gz +0 -0
  89. package/payload/server/public/assets/{calendar-DJeOm0WS.js → calendar-Di0yArmc.js} +1 -1
  90. package/payload/server/public/assets/calendar-Di0yArmc.js.br +0 -0
  91. package/payload/server/public/assets/calendar-Di0yArmc.js.gz +0 -0
  92. package/payload/server/public/assets/chat-xJTrFY2U.js +1 -0
  93. package/payload/server/public/assets/chat-xJTrFY2U.js.br +1 -0
  94. package/payload/server/public/assets/chat-xJTrFY2U.js.gz +0 -0
  95. package/payload/server/public/assets/{chevron-left-D9z1aK3p.js → chevron-left-QGcFX-3R.js} +1 -1
  96. package/payload/server/public/assets/chevron-left-QGcFX-3R.js.br +0 -0
  97. package/payload/server/public/assets/clock-PkEm8y4i.js +1 -0
  98. package/payload/server/public/assets/clock-PkEm8y4i.js.br +0 -0
  99. package/payload/server/public/assets/clock-PkEm8y4i.js.gz +0 -0
  100. package/payload/server/public/assets/copy-RSaF-402.js +1 -0
  101. package/payload/server/public/assets/copy-RSaF-402.js.br +0 -0
  102. package/payload/server/public/assets/copy-RSaF-402.js.gz +0 -0
  103. package/payload/server/public/assets/data-CLmmCyzs.js +1 -0
  104. package/payload/server/public/assets/data-CLmmCyzs.js.br +1 -0
  105. package/payload/server/public/assets/data-CLmmCyzs.js.gz +0 -0
  106. package/payload/server/public/assets/{field-WRk67lvr.js → field-nfpVNHyk.js} +1 -1
  107. package/payload/server/public/assets/field-nfpVNHyk.js.br +0 -0
  108. package/payload/server/public/assets/field-nfpVNHyk.js.gz +0 -0
  109. package/payload/server/public/assets/{file-text-BJDCb334.js → file-text-Cws2LExM.js} +1 -1
  110. package/payload/server/public/assets/file-text-Cws2LExM.js.br +0 -0
  111. package/payload/server/public/assets/file-text-Cws2LExM.js.gz +0 -0
  112. package/payload/server/public/assets/graph-56nTCvKa.js +51 -0
  113. package/payload/server/public/assets/graph-56nTCvKa.js.br +0 -0
  114. package/payload/server/public/assets/graph-56nTCvKa.js.gz +0 -0
  115. package/payload/server/public/assets/{graph-labels-CEDmX7qW.js → graph-labels-qHDVYalh.js} +1 -1
  116. package/payload/server/public/assets/graph-labels-qHDVYalh.js.br +0 -0
  117. package/payload/server/public/assets/graph-labels-qHDVYalh.js.gz +0 -0
  118. package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css → jsx-runtime-B5zQuMcr.css} +1 -1
  119. package/payload/server/public/assets/jsx-runtime-B5zQuMcr.css.br +0 -0
  120. package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css.gz → jsx-runtime-B5zQuMcr.css.gz} +0 -0
  121. package/payload/server/public/assets/{operator-1WFztEQA.js → operator-D-P6oemk.js} +1 -1
  122. package/payload/server/public/assets/operator-D-P6oemk.js.br +2 -0
  123. package/payload/server/public/assets/operator-D-P6oemk.js.gz +0 -0
  124. package/payload/server/public/assets/page-8goE0IWS.js +32 -0
  125. package/payload/server/public/assets/page-8goE0IWS.js.br +0 -0
  126. package/payload/server/public/assets/page-8goE0IWS.js.gz +0 -0
  127. package/payload/server/public/assets/page-iL446JAc.js +1 -0
  128. package/payload/server/public/assets/page-iL446JAc.js.br +0 -0
  129. package/payload/server/public/assets/page-iL446JAc.js.gz +0 -0
  130. package/payload/server/public/assets/play-B8bxRax6.js +1 -0
  131. package/payload/server/public/assets/play-B8bxRax6.js.br +0 -0
  132. package/payload/server/public/assets/play-B8bxRax6.js.gz +0 -0
  133. package/payload/server/public/assets/{public-DAea6w7w.js → public-BwfIj7tM.js} +1 -1
  134. package/payload/server/public/assets/public-BwfIj7tM.js.br +0 -0
  135. package/payload/server/public/assets/public-BwfIj7tM.js.gz +0 -0
  136. package/payload/server/public/assets/{rotate-ccw-CqlRlGsY.js → rotate-ccw-X7-7vE7t.js} +1 -1
  137. package/payload/server/public/assets/rotate-ccw-X7-7vE7t.js.br +0 -0
  138. package/payload/server/public/assets/rotate-ccw-X7-7vE7t.js.gz +0 -0
  139. package/payload/server/public/assets/{routines-vy5xsyqx.js → routines-sFud5tka.js} +2 -2
  140. package/payload/server/public/assets/routines-sFud5tka.js.br +0 -0
  141. package/payload/server/public/assets/routines-sFud5tka.js.gz +0 -0
  142. package/payload/server/public/assets/{skills-X7FTilVy.js → skills-_Dc3eG9T.js} +1 -1
  143. package/payload/server/public/assets/skills-_Dc3eG9T.js.br +0 -0
  144. package/payload/server/public/assets/skills-_Dc3eG9T.js.gz +0 -0
  145. package/payload/server/public/assets/tasks-C0u8AtqT.js +3 -0
  146. package/payload/server/public/assets/tasks-C0u8AtqT.js.br +0 -0
  147. package/payload/server/public/assets/tasks-C0u8AtqT.js.gz +0 -0
  148. package/payload/server/public/assets/{triangle-alert-CuWcGaRo.js → triangle-alert-DD4kSK45.js} +1 -1
  149. package/payload/server/public/assets/triangle-alert-DD4kSK45.js.br +0 -0
  150. package/payload/server/public/assets/triangle-alert-DD4kSK45.js.gz +0 -0
  151. package/payload/server/public/assets/{useCopyFeedback-DLSKs6r2.js → useCopyFeedback-Dq-Putj7.js} +1 -1
  152. package/payload/server/public/assets/useCopyFeedback-Dq-Putj7.js.br +0 -0
  153. package/payload/server/public/assets/useCopyFeedback-Dq-Putj7.js.gz +0 -0
  154. package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js +6 -0
  155. package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js.br +0 -0
  156. package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js.gz +0 -0
  157. package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js +2 -0
  158. package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js.br +0 -0
  159. package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js.gz +0 -0
  160. package/payload/server/public/assets/{wrench-nDMQ6x-6.js → wrench-Bjw6eVl_.js} +1 -1
  161. package/payload/server/public/assets/wrench-Bjw6eVl_.js.br +0 -0
  162. package/payload/server/public/assets/wrench-Bjw6eVl_.js.gz +0 -0
  163. package/payload/server/public/browser.html +5 -5
  164. package/payload/server/public/calendar.html +8 -8
  165. package/payload/server/public/chat.html +14 -14
  166. package/payload/server/public/data.html +12 -12
  167. package/payload/server/public/field.html +3 -3
  168. package/payload/server/public/graph.html +10 -10
  169. package/payload/server/public/index.html +14 -14
  170. package/payload/server/public/operator.html +16 -16
  171. package/payload/server/public/public.html +14 -14
  172. package/payload/server/public/routines.html +8 -8
  173. package/payload/server/public/skills.html +6 -6
  174. package/payload/server/public/tasks.html +7 -7
  175. package/payload/server/server.js +511 -283
  176. package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.br +0 -0
  177. package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.gz +0 -0
  178. package/payload/server/public/assets/AdminShell-1HyATV_t.js +0 -3
  179. package/payload/server/public/assets/AdminShell-1HyATV_t.js.br +0 -0
  180. package/payload/server/public/assets/AdminShell-1HyATV_t.js.gz +0 -0
  181. package/payload/server/public/assets/activity-C2qWlcJ5.js.br +0 -0
  182. package/payload/server/public/assets/activity-C2qWlcJ5.js.gz +0 -0
  183. package/payload/server/public/assets/admin-DqpfY8-t.js +0 -1
  184. package/payload/server/public/assets/admin-DqpfY8-t.js.br +0 -0
  185. package/payload/server/public/assets/admin-DqpfY8-t.js.gz +0 -0
  186. package/payload/server/public/assets/agents-DoGVAjIT.js.br +0 -0
  187. package/payload/server/public/assets/agents-DoGVAjIT.js.gz +0 -0
  188. package/payload/server/public/assets/browser-DjqS897k.js.br +0 -0
  189. package/payload/server/public/assets/browser-DjqS897k.js.gz +0 -0
  190. package/payload/server/public/assets/calendar-DJeOm0WS.js.br +0 -0
  191. package/payload/server/public/assets/calendar-DJeOm0WS.js.gz +0 -0
  192. package/payload/server/public/assets/chat-BrRE0Dck.js +0 -1
  193. package/payload/server/public/assets/chat-BrRE0Dck.js.br +0 -0
  194. package/payload/server/public/assets/chat-BrRE0Dck.js.gz +0 -0
  195. package/payload/server/public/assets/chevron-left-D9z1aK3p.js.br +0 -0
  196. package/payload/server/public/assets/clock-BqHWMICF.js +0 -1
  197. package/payload/server/public/assets/clock-BqHWMICF.js.br +0 -0
  198. package/payload/server/public/assets/clock-BqHWMICF.js.gz +0 -0
  199. package/payload/server/public/assets/copy-p9ZM9fnn.js +0 -1
  200. package/payload/server/public/assets/copy-p9ZM9fnn.js.br +0 -0
  201. package/payload/server/public/assets/copy-p9ZM9fnn.js.gz +0 -0
  202. package/payload/server/public/assets/data-CPsqW0qW.js +0 -1
  203. package/payload/server/public/assets/data-CPsqW0qW.js.br +0 -0
  204. package/payload/server/public/assets/data-CPsqW0qW.js.gz +0 -0
  205. package/payload/server/public/assets/field-WRk67lvr.js.br +0 -0
  206. package/payload/server/public/assets/field-WRk67lvr.js.gz +0 -0
  207. package/payload/server/public/assets/file-text-BJDCb334.js.br +0 -0
  208. package/payload/server/public/assets/file-text-BJDCb334.js.gz +0 -0
  209. package/payload/server/public/assets/graph-CAU2xh2Z.js +0 -51
  210. package/payload/server/public/assets/graph-CAU2xh2Z.js.br +0 -0
  211. package/payload/server/public/assets/graph-CAU2xh2Z.js.gz +0 -0
  212. package/payload/server/public/assets/graph-labels-CEDmX7qW.js.br +0 -0
  213. package/payload/server/public/assets/graph-labels-CEDmX7qW.js.gz +0 -0
  214. package/payload/server/public/assets/jsx-runtime-hPFGo4rC.css.br +0 -0
  215. package/payload/server/public/assets/operator-1WFztEQA.js.br +0 -0
  216. package/payload/server/public/assets/operator-1WFztEQA.js.gz +0 -0
  217. package/payload/server/public/assets/page-B72XigcU.js +0 -32
  218. package/payload/server/public/assets/page-B72XigcU.js.br +0 -0
  219. package/payload/server/public/assets/page-B72XigcU.js.gz +0 -0
  220. package/payload/server/public/assets/page-nT8l_cX1.js +0 -1
  221. package/payload/server/public/assets/page-nT8l_cX1.js.br +0 -0
  222. package/payload/server/public/assets/page-nT8l_cX1.js.gz +0 -0
  223. package/payload/server/public/assets/play-CYqOCqm6.js +0 -1
  224. package/payload/server/public/assets/play-CYqOCqm6.js.br +0 -0
  225. package/payload/server/public/assets/play-CYqOCqm6.js.gz +0 -0
  226. package/payload/server/public/assets/public-DAea6w7w.js.br +0 -0
  227. package/payload/server/public/assets/public-DAea6w7w.js.gz +0 -0
  228. package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.br +0 -0
  229. package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.gz +0 -0
  230. package/payload/server/public/assets/routines-vy5xsyqx.js.br +0 -0
  231. package/payload/server/public/assets/routines-vy5xsyqx.js.gz +0 -0
  232. package/payload/server/public/assets/skills-X7FTilVy.js.br +0 -0
  233. package/payload/server/public/assets/skills-X7FTilVy.js.gz +0 -0
  234. package/payload/server/public/assets/tasks-BXx_jk_p.js +0 -3
  235. package/payload/server/public/assets/tasks-BXx_jk_p.js.br +0 -0
  236. package/payload/server/public/assets/tasks-BXx_jk_p.js.gz +0 -0
  237. package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.br +0 -0
  238. package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.gz +0 -0
  239. package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.br +0 -0
  240. package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.gz +0 -0
  241. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js +0 -6
  242. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.br +0 -0
  243. package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.gz +0 -0
  244. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js +0 -2
  245. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.br +0 -0
  246. package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.gz +0 -0
  247. package/payload/server/public/assets/wrench-nDMQ6x-6.js.br +0 -0
  248. package/payload/server/public/assets/wrench-nDMQ6x-6.js.gz +0 -0
  249. /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js → jsx-runtime-DeRQuYlX.js} +0 -0
  250. /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.br → jsx-runtime-DeRQuYlX.js.br} +0 -0
  251. /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.gz → jsx-runtime-DeRQuYlX.js.gz} +0 -0
@@ -0,0 +1,141 @@
1
+ // Task 2728 — account resolution for the `/rc-spawn` recover path.
2
+ //
3
+ // `/rc-spawn` resolves its account as `requestedAccountId ?? deps.accountId`.
4
+ // The recovery caller (`manager-client.ts` `managerRcRecover`) sends no
5
+ // `targetAccountId` at all, so every wedged sub-account session respawned under
6
+ // the boot house account, carrying the same conversation id into a second
7
+ // account's projects dir. Eight lines above that default, an UNKNOWN account id
8
+ // is rejected outright, with the comment that a silent default "would route a
9
+ // switched session to the wrong account's graph"; the absent case did exactly
10
+ // that, and emitted nothing.
11
+ //
12
+ // Observed 2026-08-15 on laptop 192.168.88.10 (maxy-code): session 26f5687a,
13
+ // opened on sub-account 8a160746 at 12:30:53.322, answered by house 20028fb5
14
+ // from 12:32:45.406, one uuid holding two sidecar records.
15
+ //
16
+ // What this module answers: which account directory holds the session's own
17
+ // sidecar record. The DIRECTORY is the fact, not the sidecar's `accountId`
18
+ // field — that field is optional on disk (pre-983 sidecars and every /spawn
19
+ // sidecar written before Task 2038 carry no key), and a record that fails the
20
+ // strict `parseSidecar` shape still proves which account owns the session. So
21
+ // resolution reads file locations, and parses only to break a tie.
22
+ //
23
+ // Account membership mirrors the predicate /rc-spawn already applies inline when
24
+ // it rejects an unknown `targetAccountId`: a directory under `accountsRoot`
25
+ // carrying an `account.json`. The manager has no rootDir-clean import path for
26
+ // the account-enumeration lib, which is why that predicate is repeated rather
27
+ // than imported.
28
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
29
+ import { join } from 'node:path';
30
+ import { sidecarPathForSessionId } from './jsonl-path.js';
31
+ /** Accounts in the on-disk registry, in readdir order. Never throws: an absent
32
+ * or unreadable accountsRoot yields no accounts, which the caller reports as a
33
+ * refusal rather than a silent fall-back to house.
34
+ *
35
+ * Exported so the standing census in `session-account-census.ts` counts the
36
+ * same account set this resolver searches. Two copies of the predicate could
37
+ * disagree, and the census exists to catch exactly what this resolver missed. */
38
+ export function registeredAccountIds(accountsRoot) {
39
+ if (!existsSync(accountsRoot))
40
+ return [];
41
+ try {
42
+ return readdirSync(accountsRoot, { withFileTypes: true })
43
+ .filter((d) => d.isDirectory())
44
+ .map((d) => d.name)
45
+ .filter((id) => existsSync(join(accountsRoot, id, 'account.json')));
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ /** The sidecar's `startedAt` as epoch ms, or null when the file is unreadable,
52
+ * unparseable, or carries no usable timestamp. Only the tie-break reads this;
53
+ * a null orders AFTER every real timestamp, so a record whose start time is
54
+ * known always beats one whose is not. */
55
+ function startedAtMs(path) {
56
+ let raw;
57
+ try {
58
+ raw = readFileSync(path, 'utf8');
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(raw);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ if (!parsed || typeof parsed !== 'object')
71
+ return null;
72
+ const startedAt = parsed.startedAt;
73
+ if (typeof startedAt !== 'string')
74
+ return null;
75
+ const ms = Date.parse(startedAt);
76
+ return Number.isNaN(ms) ? null : ms;
77
+ }
78
+ /** Task 2728 — the account a `recover: true` spawn must run under: the one whose
79
+ * directory holds this session's sidecar record (live or archived).
80
+ *
81
+ * No account holds one → `refused-no-sidecar`. There is no session to recover,
82
+ * so the house account is never the right answer and the caller refuses rather
83
+ * than spawning.
84
+ *
85
+ * More than one holds one → the defect's own residue, one conversation id
86
+ * spanning two accounts. The earlier `startedAt` wins, which is the account the
87
+ * conversation was opened on. `candidates` carries the count so a split id is
88
+ * visible in the log line at recover time, not only in the standing census. */
89
+ export function resolveRecoverAccount(input) {
90
+ const env = input.env ?? process.env;
91
+ const holders = [];
92
+ for (const accountId of registeredAccountIds(input.accountsRoot)) {
93
+ const accountDir = join(input.accountsRoot, accountId);
94
+ const live = sidecarPathForSessionId(accountDir, input.sessionId, {}, env);
95
+ const archived = sidecarPathForSessionId(accountDir, input.sessionId, { archived: true }, env);
96
+ if (existsSync(live) || existsSync(archived))
97
+ holders.push(accountId);
98
+ }
99
+ if (holders.length === 0)
100
+ return { outcome: 'refused-no-sidecar', candidates: 0 };
101
+ if (holders.length === 1)
102
+ return { outcome: 'ok', accountId: holders[0], candidates: 1 };
103
+ // Deterministic ordering: earliest known startedAt first, unknown last, then
104
+ // account id. Without the final key, two unreadable records would resolve in
105
+ // readdir order and the same split id could answer differently per boot.
106
+ const ranked = holders
107
+ .map((accountId) => {
108
+ const accountDir = join(input.accountsRoot, accountId);
109
+ const live = sidecarPathForSessionId(accountDir, input.sessionId, {}, env);
110
+ const path = existsSync(live)
111
+ ? live
112
+ : sidecarPathForSessionId(accountDir, input.sessionId, { archived: true }, env);
113
+ return { accountId, ms: startedAtMs(path) };
114
+ })
115
+ .sort((a, b) => {
116
+ if (a.ms !== b.ms) {
117
+ if (a.ms === null)
118
+ return 1;
119
+ if (b.ms === null)
120
+ return -1;
121
+ return a.ms - b.ms;
122
+ }
123
+ return a.accountId < b.accountId ? -1 : a.accountId > b.accountId ? 1 : 0;
124
+ });
125
+ return { outcome: 'ok', accountId: ranked[0].accountId, candidates: holders.length };
126
+ }
127
+ /** The per-recover lifeline. Emitted on EVERY recover, including one that
128
+ * carried an explicit `targetAccountId` (`source=body`), so a grep on one
129
+ * sessionId shows which account the recovery landed on and what decided it.
130
+ * `source=default` on a recover is the 2728 defect recurring. No call site can
131
+ * produce it today — a recover either resolves from sidecars or is handed an
132
+ * account by the body — and that is the point: it renders only if a later change
133
+ * lets a recover reach the boot-account fallback again, which is the regression
134
+ * this line exists to make visible.
135
+ * A null sessionId renders `new`, the token this route already uses for it. */
136
+ export function formatRecoverAccountLine(input) {
137
+ return (`[rc-spawn] op=recover-account sessionId=${input.sessionId ? input.sessionId.slice(0, 8) : 'new'}` +
138
+ ` resolved=${input.resolved ?? 'none'} source=${input.source}` +
139
+ ` outcome=${input.outcome} candidates=${input.candidates}`);
140
+ }
141
+ //# sourceMappingURL=recover-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-account.js","sourceRoot":"","sources":["../src/recover-account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Logger } from './types.js';
2
+ /** Reconcile sidecar records by session id across every registered account.
3
+ * `ids` counts distinct session ids seen; `splitIds` names, in the eight-char
4
+ * short form the manager's log lines use, the ids that hold a record under more
5
+ * than one account. Live and archived records of the same account are one
6
+ * account, not a split, because archiving moves the pair within a directory. */
7
+ export declare function collectSessionAccountCensus(input: {
8
+ accountsRoot: string;
9
+ env?: NodeJS.ProcessEnv;
10
+ }): {
11
+ ids: number;
12
+ splitIds: string[];
13
+ };
14
+ /** `splitIds=none` (not an empty field) marks "no offenders", so the field is
15
+ * always present and greppable. `split>0` is the alarm condition. */
16
+ export declare function formatSessionAccountCensus(input: {
17
+ ids: number;
18
+ splitIds: string[];
19
+ }): string;
20
+ export interface SessionAccountCensus {
21
+ start(): void;
22
+ stop(): void;
23
+ }
24
+ export declare function createSessionAccountCensus(deps: {
25
+ accountsRoot: string;
26
+ intervalMs: number;
27
+ logger: Logger;
28
+ env?: NodeJS.ProcessEnv;
29
+ }): SessionAccountCensus;
30
+ //# sourceMappingURL=session-account-census.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-account-census.d.ts","sourceRoot":"","sources":["../src/session-account-census.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAkBxC;;;;iFAIiF;AACjF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBtC;AAED;sEACsE;AACtE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAM7F;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;CACb;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB,GAAG,oBAAoB,CAwBvB"}
@@ -0,0 +1,96 @@
1
+ // Task 2728 — standing session-to-account census.
2
+ //
3
+ // One conversation id must hold sidecar records under exactly one account. The
4
+ // wrong-account respawn broke that: session 26f5687a held a record under
5
+ // sub-account 8a160746 (opened 12:30:53.322, no transcript) and another under
6
+ // house 20028fb5 (12:32:45.406, the whole transcript). Nothing emitted an event
7
+ // when the second record was written, and the state does not reproduce on
8
+ // demand, so no action log can catch it. A periodic reconciliation over the
9
+ // on-disk sidecars is the only reader that sees it.
10
+ //
11
+ // `ids=` is in the line for a reason: zero split out of zero ids is a census
12
+ // that is not measuring, not a healthy install, and a reader that only greps
13
+ // `split=0` cannot tell those apart.
14
+ //
15
+ // Shape mirrors cross-account-census.ts: a pure formatter and a pure-enough
16
+ // collector (both unit-tested), plus a start/stop factory whose setInterval is
17
+ // unref'd so it never holds the process open.
18
+ import { existsSync, readdirSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { projectsDirForCwd } from './jsonl-path.js';
21
+ import { registeredAccountIds } from './recover-account.js';
22
+ const SIDECAR_SUFFIX = '.meta.json';
23
+ /** Session ids with a sidecar in this directory. Never throws; an absent or
24
+ * unreadable directory contributes nothing. */
25
+ function sessionIdsIn(dir) {
26
+ if (!existsSync(dir))
27
+ return [];
28
+ try {
29
+ return readdirSync(dir, { withFileTypes: true })
30
+ .filter((d) => d.isFile() && d.name.endsWith(SIDECAR_SUFFIX))
31
+ .map((d) => d.name.slice(0, -SIDECAR_SUFFIX.length))
32
+ .filter((id) => id.length > 0);
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ /** Reconcile sidecar records by session id across every registered account.
39
+ * `ids` counts distinct session ids seen; `splitIds` names, in the eight-char
40
+ * short form the manager's log lines use, the ids that hold a record under more
41
+ * than one account. Live and archived records of the same account are one
42
+ * account, not a split, because archiving moves the pair within a directory. */
43
+ export function collectSessionAccountCensus(input) {
44
+ const env = input.env ?? process.env;
45
+ const accountsBySession = new Map();
46
+ for (const accountId of registeredAccountIds(input.accountsRoot)) {
47
+ const projectsDir = projectsDirForCwd(join(input.accountsRoot, accountId), env);
48
+ for (const sessionId of [...sessionIdsIn(projectsDir), ...sessionIdsIn(join(projectsDir, 'archive'))]) {
49
+ const holders = accountsBySession.get(sessionId) ?? new Set();
50
+ holders.add(accountId);
51
+ accountsBySession.set(sessionId, holders);
52
+ }
53
+ }
54
+ const splitIds = [...accountsBySession.entries()]
55
+ .filter(([, holders]) => holders.size > 1)
56
+ .map(([sessionId]) => sessionId.slice(0, 8))
57
+ .sort();
58
+ return { ids: accountsBySession.size, splitIds };
59
+ }
60
+ /** `splitIds=none` (not an empty field) marks "no offenders", so the field is
61
+ * always present and greppable. `split>0` is the alarm condition. */
62
+ export function formatSessionAccountCensus(input) {
63
+ const named = [...input.splitIds].sort();
64
+ return (`[session-account-census] ids=${input.ids} split=${named.length}` +
65
+ ` splitIds=${named.length === 0 ? 'none' : named.join(',')}`);
66
+ }
67
+ export function createSessionAccountCensus(deps) {
68
+ const emit = () => {
69
+ try {
70
+ deps.logger(formatSessionAccountCensus(collectSessionAccountCensus({ accountsRoot: deps.accountsRoot, env: deps.env })));
71
+ }
72
+ catch {
73
+ // Best-effort, like every other standing check here: a census that throws
74
+ // must not take the manager down with it.
75
+ }
76
+ };
77
+ let timer = null;
78
+ return {
79
+ start() {
80
+ if (timer)
81
+ return;
82
+ // Emit once at start so the standing signal has a baseline immediately and
83
+ // an install that restarts inside the interval still produces a line.
84
+ emit();
85
+ timer = setInterval(emit, deps.intervalMs);
86
+ if (typeof timer.unref === 'function')
87
+ timer.unref();
88
+ },
89
+ stop() {
90
+ if (timer)
91
+ clearInterval(timer);
92
+ timer = null;
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=session-account-census.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-account-census.js","sourceRoot":"","sources":["../src/session-account-census.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,15 @@ export type TelegramChannelRole = 'admin' | 'public';
15
15
  * spawn is wrong and the channel must not boot. */
16
16
  export declare function resolveChannelRole(raw: string | undefined): TelegramChannelRole;
17
17
  export declare const OPERATOR_INSTRUCTION_REFRAME: string;
18
+ /** Task 2730 — the operator did not instruct the agent here; they answered the
19
+ * visitor themselves. The visitor already holds these exact words, so the only
20
+ * thing owed is that this conversation's context holds them too.
21
+ *
22
+ * The follower withholds this turn's final text whatever this block says, so its
23
+ * job is to stop the agent spending the turn composing a reply nobody will see,
24
+ * and to stop it reaching for a card, which sends through the Bot API directly
25
+ * and is the one delivery the follower cannot withhold. */
26
+ export declare const OPERATOR_SENT_REFRAME: string;
18
27
  export declare function channelInstructions(role: TelegramChannelRole): string;
19
28
  export declare function replyToolDescription(role: TelegramChannelRole): string;
20
29
  export declare function replyTextDescription(role: TelegramChannelRole): string;
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;;;;;;;;;;;;;oDAaoD;AACpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAM/E;AAiFD,eAAO,MAAM,4BAA4B,QAQb,CAAA;AAE5B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAkEiE,CAAA"}
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;;;;;;;;;;;;;oDAaoD;AACpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAM/E;AAiFD,eAAO,MAAM,4BAA4B,QAQb,CAAA;AAE5B;;;;;;;4DAO4D;AAC5D,eAAO,MAAM,qBAAqB,QAOgD,CAAA;AAElF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAkEiE,CAAA"}
@@ -104,6 +104,21 @@ export const OPERATOR_INSTRUCTION_REFRAME = 'The account operator sent this thro
104
104
  'Write it as your own words to the visitor, in the same voice as the rest of this conversation. ' +
105
105
  'Never quote this block, never repeat the instruction back, and never tell the visitor that ' +
106
106
  'somebody instructed you.';
107
+ /** Task 2730 — the operator did not instruct the agent here; they answered the
108
+ * visitor themselves. The visitor already holds these exact words, so the only
109
+ * thing owed is that this conversation's context holds them too.
110
+ *
111
+ * The follower withholds this turn's final text whatever this block says, so its
112
+ * job is to stop the agent spending the turn composing a reply nobody will see,
113
+ * and to stop it reaching for a card, which sends through the Bot API directly
114
+ * and is the one delivery the follower cannot withhold. */
115
+ export const OPERATOR_SENT_REFRAME = 'The account operator sent this message to the visitor themselves, from their own admin door. ' +
116
+ 'It is not the visitor speaking and it is not an instruction for you. ' +
117
+ 'The visitor has already received these exact words, so treat them as part of this ' +
118
+ 'conversation and as something already said to the visitor on your side. ' +
119
+ 'Nothing is to be sent in response: no reply, no acknowledgement, no card, no follow-up. ' +
120
+ 'Answer with one short line for the record and stop. That line is not delivered to anybody. ' +
121
+ 'Never quote this block, and never tell the visitor that anything was recorded.';
107
122
  export function channelInstructions(role) {
108
123
  return role === 'public' ? PUBLIC_INSTRUCTIONS : ADMIN_INSTRUCTIONS;
109
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
@@ -77,7 +77,7 @@ export interface InboundPayload {
77
77
  * write.
78
78
  *
79
79
  * Absent on legacy frames = 'user'. */
80
- source?: 'user' | 'schedule' | 'operator';
80
+ source?: 'user' | 'schedule' | 'operator' | 'operator-sent';
81
81
  /** Task 2561 — who sent this message, and the account it landed on. The
82
82
  * gateway held both for the whole turn and passed neither, so an admin turn
83
83
  * opened straight into rules written about the account owner and a second
@@ -151,9 +151,11 @@ export interface ComposedInbound {
151
151
  * this service's own admin constant, which is every admin turn on this door and
152
152
  * cannot fail; 'public-plain' is the public role, which carries no instruction
153
153
  * block at all. Task 2724 adds 'operator': the public role carrying the
154
- * operator-instruction constant, the one public turn that IS framed. There is
155
- * no 'absent': this door reads no file. */
156
- instructionSource: 'platform' | 'public-plain' | 'operator';
154
+ * operator-instruction constant, the one public turn that IS framed. Task 2730
155
+ * adds 'operator-sent': the public role carrying the already-sent constant,
156
+ * which is framed for the opposite reason. There is no 'absent': this door
157
+ * reads no file. */
158
+ instructionSource: 'platform' | 'public-plain' | 'operator' | 'operator-sent';
157
159
  }
158
160
  export declare function composeContent(p: InboundPayload, role: TelegramChannelRole): ComposedInbound;
159
161
  /** Defence in depth: this server serves exactly one key. Even though the
@@ -1 +1 @@
1
- {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAyBA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAA;AAE1B;;uEAEuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM,CAUpE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;2CAOuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAaT;AAED;;;wBAGwB;AACxB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAA;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;iDAI6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;0CAIsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;4CAUwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAA;IACzC;;;;;oFAKgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;qDAEiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;6DAIyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;gDAE4C;IAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC;;kFAE8E;IAC9E,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC9B;;;;;;4DAMwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED;;4EAE4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAQzD;AAED;yCACyC;AACzC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;;;;mDAQ+C;IAC/C,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;gDAK4C;IAC5C,iBAAiB,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAA;CAC5D;AAoDD,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,eAAe,CA8D5F;AAED;;2BAE2B;AAC3B,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAErE;AAED;;;mCAGmC;AACnC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE7F;AAED;;;;;;;;;mDASmD;AACnD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAEzD;AAID;;;;cAIc;AACd,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAChF,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;kFAEkF;AAClF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrE"}
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAyBA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAA;AAE1B;;uEAEuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM,CAUpE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;2CAOuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAaT;AAED;;;wBAGwB;AACxB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAA;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;iDAI6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;0CAIsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;4CAUwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,eAAe,CAAA;IAC3D;;;;;oFAKgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;qDAEiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;6DAIyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;gDAE4C;IAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC;;kFAE8E;IAC9E,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC9B;;;;;;4DAMwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED;;4EAE4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAQzD;AAED;yCACyC;AACzC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;;;;mDAQ+C;IAC/C,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;;;yBAOqB;IACrB,iBAAiB,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,eAAe,CAAA;CAC9E;AAoDD,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,eAAe,CA6E5F;AAED;;2BAE2B;AAC3B,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAErE;AAED;;;mCAGmC;AACnC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE7F;AAED;;;;;;;;;mDASmD;AACnD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAEzD;AAID;;;;cAIc;AACd,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAChF,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;kFAEkF;AAClF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrE"}
@@ -21,7 +21,7 @@
21
21
  // Task 2364 — a type-only import from this package's own turn follower, so the
22
22
  // turn-end body and the counts it carries have one definition. Type-only, so it
23
23
  // erases at build and this file still pulls in no runtime dependency.
24
- import { ADMIN_REFRAME_INSTRUCTION, OPERATOR_INSTRUCTION_REFRAME, } from './instructions.js';
24
+ import { ADMIN_REFRAME_INSTRUCTION, OPERATOR_INSTRUCTION_REFRAME, OPERATOR_SENT_REFRAME, } from './instructions.js';
25
25
  /**
26
26
  * Task 1516 — render the dispatcher's operator-provenance as a platform-verified
27
27
  * preamble. Every value is dispatcher-stamped (an inbound message cannot produce
@@ -148,6 +148,20 @@ export function composeContent(p, role) {
148
148
  instructionSource: 'operator',
149
149
  };
150
150
  }
151
+ // Task 2730 — the second public payload the visitor did not write, framed for
152
+ // the OPPOSITE reason to the one above: the visitor HAS seen it, so this
153
+ // tells the agent to record it and send nothing. The follower withholds the
154
+ // turn's final text regardless; this is what stops the agent reaching for a
155
+ // card, which no suppression here can catch.
156
+ if (p.source === 'operator-sent') {
157
+ return {
158
+ content: `## Operator message already sent to the visitor (platform-verified)\n${OPERATOR_SENT_REFRAME}\n\n` +
159
+ `## What the operator sent\n${payload}`,
160
+ payloadBytes,
161
+ provenance: true,
162
+ instructionSource: 'operator-sent',
163
+ };
164
+ }
151
165
  return { content: payload, payloadBytes, provenance: false, instructionSource: 'public-plain' };
152
166
  }
153
167
  // Task 1516 — a scheduled turn opens with the platform-verified provenance
@@ -1 +1 @@
1
- {"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import {
8
8
  getUserTimezone,
9
9
  isValidAccountId,
10
10
  registerLoop
11
- } from "./chunk-6AQYMT6C.js";
11
+ } from "./chunk-T6NXRWMG.js";
12
12
  import {
13
13
  extractVideo,
14
14
  transcribe
@@ -12,7 +12,7 @@ import {
12
12
  getConversationOwner,
13
13
  isValidAccountId,
14
14
  registerLoop
15
- } from "./chunk-6AQYMT6C.js";
15
+ } from "./chunk-T6NXRWMG.js";
16
16
 
17
17
  // node_modules/hono/dist/compose.js
18
18
  var compose = (middleware, onError, onNotFound) => {
@@ -183,22 +183,33 @@ if (!existsSync3(PLATFORM_ROOT2)) {
183
183
  Set the MAXY_PLATFORM_ROOT environment variable to the absolute path of the platform directory.`
184
184
  );
185
185
  }
186
- var _stubDirsLoggedThisBoot = /* @__PURE__ */ new Set();
187
- function listValidAccounts() {
188
- if (!existsSync3(ACCOUNTS_DIR)) return [];
186
+ var STUB_DIR_GRACE_MS = 6e4;
187
+ function stubDirIdleMs(accountDir, nowMs) {
188
+ let st;
189
+ try {
190
+ st = statSync(accountDir);
191
+ } catch {
192
+ return 0;
193
+ }
194
+ return nowMs - Math.max(st.birthtimeMs, st.ctimeMs, st.mtimeMs);
195
+ }
196
+ var _stubDirsReported = /* @__PURE__ */ new Map();
197
+ function listValidAccounts(accountsDir = ACCOUNTS_DIR, nowMs = Date.now()) {
198
+ if (!existsSync3(accountsDir)) return [];
189
199
  const out = [];
190
- const entries2 = readdirSync(ACCOUNTS_DIR, { withFileTypes: true });
200
+ const entries2 = readdirSync(accountsDir, { withFileTypes: true });
191
201
  for (const entry of entries2) {
192
202
  if (!entry.isDirectory()) continue;
193
203
  if (entry.name.startsWith(".")) continue;
194
- const accountDir = resolve2(ACCOUNTS_DIR, entry.name);
204
+ const accountDir = resolve2(accountsDir, entry.name);
195
205
  const configPath = resolve2(accountDir, "account.json");
196
206
  if (!existsSync3(configPath)) {
197
- if (!_stubDirsLoggedThisBoot.has(entry.name)) {
207
+ const idleMs = stubDirIdleMs(accountDir, nowMs);
208
+ if (idleMs >= STUB_DIR_GRACE_MS && !_stubDirsReported.has(entry.name)) {
198
209
  console.error(
199
- `[platform] accounts-state STUB-DIR id=${entry.name} \u2014 onboarding leak; remove or repair`
210
+ `[platform] accounts-state STUB-DIR id=${entry.name} idleMs=${idleMs} \u2014 no account.json; not enumerated. Inspect it; an account directory is the account's only copy.`
200
211
  );
201
- _stubDirsLoggedThisBoot.add(entry.name);
212
+ _stubDirsReported.set(entry.name, nowMs);
202
213
  }
203
214
  continue;
204
215
  }
@@ -211,10 +222,33 @@ function listValidAccounts() {
211
222
  );
212
223
  continue;
213
224
  }
225
+ const reportedAtMs = _stubDirsReported.get(entry.name);
226
+ if (reportedAtMs !== void 0) {
227
+ console.error(
228
+ `[accounts-state] op=stub-dir-resolved id=${entry.name} reportedAgoMs=${nowMs - reportedAtMs}`
229
+ );
230
+ _stubDirsReported.delete(entry.name);
231
+ }
214
232
  out.push({ accountId: config.accountId, accountDir, config });
215
233
  }
216
234
  return out;
217
235
  }
236
+ function censusAccountDirs(accountsDir = ACCOUNTS_DIR, nowMs = Date.now()) {
237
+ if (!existsSync3(accountsDir)) return { dirs: 0, provisioning: [], abandoned: [] };
238
+ const provisioning = [];
239
+ const abandoned = [];
240
+ let dirs = 0;
241
+ for (const entry of readdirSync(accountsDir, { withFileTypes: true })) {
242
+ if (!entry.isDirectory()) continue;
243
+ if (entry.name.startsWith(".")) continue;
244
+ dirs++;
245
+ const accountDir = resolve2(accountsDir, entry.name);
246
+ if (existsSync3(resolve2(accountDir, "account.json"))) continue;
247
+ if (stubDirIdleMs(accountDir, nowMs) >= STUB_DIR_GRACE_MS) abandoned.push(entry.name);
248
+ else provisioning.push(entry.name);
249
+ }
250
+ return { dirs, provisioning, abandoned };
251
+ }
218
252
  function isValidAccountId(id) {
219
253
  return listValidAccounts().some((a) => a.accountId === id);
220
254
  }
@@ -2194,6 +2228,7 @@ export {
2194
2228
  PLATFORM_ROOT2 as PLATFORM_ROOT,
2195
2229
  ACCOUNTS_DIR,
2196
2230
  listValidAccounts,
2231
+ censusAccountDirs,
2197
2232
  isValidAccountId,
2198
2233
  resolveAccount,
2199
2234
  readAgentFile,
@@ -30,8 +30,8 @@ import {
30
30
  startConnection,
31
31
  stopConnection,
32
32
  storeMessage
33
- } from "./chunk-GI5AVCRG.js";
34
- import "./chunk-6AQYMT6C.js";
33
+ } from "./chunk-DRDU74ZM.js";
34
+ import "./chunk-T6NXRWMG.js";
35
35
  import "./chunk-CYU75QAV.js";
36
36
  import "./chunk-HYQNUVGO.js";
37
37
  export {
@@ -19,13 +19,13 @@ import {
19
19
  screencastLog,
20
20
  vncLog,
21
21
  websockifyLog
22
- } from "./chunk-MNN2RWJR.js";
22
+ } from "./chunk-IOPUA7QV.js";
23
23
  import {
24
24
  CDP_PORT,
25
25
  LOG_DIR,
26
26
  WEBSOCKIFY_PORT,
27
27
  registerLoop
28
- } from "./chunk-6AQYMT6C.js";
28
+ } from "./chunk-T6NXRWMG.js";
29
29
  import "./chunk-HYQNUVGO.js";
30
30
 
31
31
  // server/edge.ts
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Activity — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/activity-C2qWlcJ5.js"></script>
8
+ <script type="module" crossorigin src="/assets/activity-DfIud5UH.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-CvVXOszc.js">
11
- <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-C_1CV_iW.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-1HyATV_t.js">
13
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-CuWcGaRo.js">
14
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-hPFGo4rC.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-DeRQuYlX.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-Cm_fvNIH.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DyOPTLdb.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-DD4kSK45.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-B5zQuMcr.css">
15
15
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
16
16
  <link rel="stylesheet" href="/brand-defaults.css">
17
17
  </head>