@rubytech/create-maxy-code 0.1.542 → 0.1.543

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 (320) hide show
  1. package/dist/index.js +37 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/shared-folder/dist/index.d.ts +47 -0
  4. package/payload/platform/lib/shared-folder/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/shared-folder/dist/index.js +93 -0
  6. package/payload/platform/lib/shared-folder/dist/index.js.map +1 -0
  7. package/payload/platform/lib/shared-folder/src/index.ts +92 -0
  8. package/payload/platform/lib/shared-folder/tsconfig.json +5 -0
  9. package/payload/platform/package.json +2 -2
  10. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +15 -1
  11. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +8 -0
  12. package/payload/platform/plugins/docs/references/access-control.md +14 -0
  13. package/payload/platform/plugins/filesystem/.claude-plugin/plugin.json +1 -1
  14. package/payload/platform/plugins/filesystem/PLUGIN.md +11 -1
  15. package/payload/platform/plugins/filesystem/mcp/dist/index.js +23 -7
  16. package/payload/platform/plugins/filesystem/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js +104 -4
  18. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js.map +1 -1
  19. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts +2 -0
  20. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts.map +1 -0
  21. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js +67 -0
  22. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js.map +1 -0
  23. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts +16 -2
  24. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts.map +1 -1
  25. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js +54 -1
  26. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js.map +1 -1
  27. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js +76 -2
  28. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js.map +1 -1
  29. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts +1 -0
  30. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
  31. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +3 -3
  32. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
  33. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts +1 -0
  34. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts.map +1 -1
  35. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js +1 -1
  36. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js.map +1 -1
  37. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts +1 -0
  38. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts.map +1 -1
  39. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js +3 -3
  40. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js.map +1 -1
  41. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts +1 -0
  42. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts.map +1 -1
  43. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js +3 -3
  44. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js.map +1 -1
  45. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts +1 -0
  46. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts.map +1 -1
  47. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js +3 -3
  48. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js.map +1 -1
  49. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts +1 -0
  50. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
  51. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +3 -3
  52. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +81 -1
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +22 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +80 -0
  58. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +13 -1
  60. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  61. package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
  62. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
  63. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  64. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +1 -1
  65. package/payload/platform/scripts/check-no-esm-require.mjs +5 -0
  66. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +8 -4
  67. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -1
  68. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +27 -7
  69. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -1
  70. package/payload/platform/services/claude-session-manager/dist/config.d.ts +11 -6
  71. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  72. package/payload/platform/services/claude-session-manager/dist/config.js +8 -4
  73. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  74. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +2 -2
  75. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  76. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +35 -0
  77. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  78. package/payload/platform/services/claude-session-manager/dist/http-server.js +136 -19
  79. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  80. package/payload/platform/services/claude-session-manager/dist/index.js +98 -26
  81. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  82. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +24 -12
  83. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  84. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +130 -27
  85. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  86. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  87. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +4 -0
  88. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  89. package/payload/platform/services/claude-session-manager/dist/role-census.d.ts +24 -0
  90. package/payload/platform/services/claude-session-manager/dist/role-census.d.ts.map +1 -0
  91. package/payload/platform/services/claude-session-manager/dist/role-census.js +50 -0
  92. package/payload/platform/services/claude-session-manager/dist/role-census.js.map +1 -0
  93. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +9 -2
  94. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  95. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +13 -0
  96. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  97. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts +67 -0
  98. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts.map +1 -1
  99. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js +101 -19
  100. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js.map +1 -1
  101. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts +19 -0
  102. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts.map +1 -1
  103. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js +37 -2
  104. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js.map +1 -1
  105. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -1
  106. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  107. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +9 -1
  108. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  109. package/payload/platform/services/claude-session-manager/dist/types.d.ts +9 -3
  110. package/payload/platform/services/claude-session-manager/dist/types.d.ts.map +1 -1
  111. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +105 -8
  112. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  113. package/payload/platform/services/whatsapp-channel/dist/notification.js +108 -10
  114. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  115. package/payload/platform/services/whatsapp-channel/dist/server.d.ts +18 -0
  116. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  117. package/payload/platform/services/whatsapp-channel/dist/server.js +86 -5
  118. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  119. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +38 -7
  120. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  121. package/payload/platform/services/whatsapp-channel/dist/targets.js +42 -7
  122. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  123. package/payload/platform/templates/agents/admin/INSTRUCTION.md +15 -0
  124. package/payload/server/{adminuser-self-heal-LC7HZAC6.js → adminuser-self-heal-ZHFNDKJK.js} +1 -1
  125. package/payload/server/{chunk-CKTHAHL4.js → chunk-BIHII3CT.js} +3 -2
  126. package/payload/server/{chunk-PFF6I7KP.js → chunk-HYQNUVGO.js} +8 -1
  127. package/payload/server/{chunk-HZP7BKBF.js → chunk-MGW536C5.js} +128 -4
  128. package/payload/server/{chunk-ERIM3EFB.js → chunk-RSNVIN4G.js} +1 -1
  129. package/payload/server/{manager-CM55K4J2.js → manager-GJHKO7WW.js} +3 -3
  130. package/payload/server/maxy-edge.js +3 -3
  131. package/payload/server/public/activity.html +5 -5
  132. package/payload/server/public/agents.html +4 -4
  133. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js +1 -0
  134. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.br +0 -0
  135. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.gz +0 -0
  136. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js +2 -0
  137. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.br +0 -0
  138. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.gz +0 -0
  139. package/payload/server/public/assets/activity-AaFvfwrZ.js +1 -0
  140. package/payload/server/public/assets/activity-AaFvfwrZ.js.br +0 -0
  141. package/payload/server/public/assets/activity-AaFvfwrZ.js.gz +0 -0
  142. package/payload/server/public/assets/admin-Bz34CZqL.js +1 -0
  143. package/payload/server/public/assets/admin-Bz34CZqL.js.br +0 -0
  144. package/payload/server/public/assets/admin-Bz34CZqL.js.gz +0 -0
  145. package/payload/server/public/assets/agents-N0z7qg8a.js +1 -0
  146. package/payload/server/public/assets/agents-N0z7qg8a.js.br +0 -0
  147. package/payload/server/public/assets/agents-N0z7qg8a.js.gz +0 -0
  148. package/payload/server/public/assets/browser-_k-v0iky.js +1 -0
  149. package/payload/server/public/assets/browser-_k-v0iky.js.br +0 -0
  150. package/payload/server/public/assets/browser-_k-v0iky.js.gz +0 -0
  151. package/payload/server/public/assets/calendar-D_DvVRJS.js +1 -0
  152. package/payload/server/public/assets/calendar-D_DvVRJS.js.br +0 -0
  153. package/payload/server/public/assets/calendar-D_DvVRJS.js.gz +0 -0
  154. package/payload/server/public/assets/chat-BbAsvXL_.js +1 -0
  155. package/payload/server/public/assets/chat-BbAsvXL_.js.br +1 -0
  156. package/payload/server/public/assets/chat-BbAsvXL_.js.gz +0 -0
  157. package/payload/server/public/assets/chevron-left-trZmu0ZU.js +1 -0
  158. package/payload/server/public/assets/chevron-left-trZmu0ZU.js.br +0 -0
  159. package/payload/server/public/assets/chevron-right-BiGJuNSX.js +1 -0
  160. package/payload/server/public/assets/chevron-right-BiGJuNSX.js.br +0 -0
  161. package/payload/server/public/assets/clock-DAeRdj4p.js +1 -0
  162. package/payload/server/public/assets/clock-DAeRdj4p.js.br +0 -0
  163. package/payload/server/public/assets/clock-DAeRdj4p.js.gz +0 -0
  164. package/payload/server/public/assets/{copy-3kj9Oaoc.js → copy-BDoxl3Oi.js} +1 -1
  165. package/payload/server/public/assets/copy-BDoxl3Oi.js.br +0 -0
  166. package/payload/server/public/assets/copy-BDoxl3Oi.js.gz +0 -0
  167. package/payload/server/public/assets/data-DB6T1I-w.js +1 -0
  168. package/payload/server/public/assets/data-DB6T1I-w.js.br +1 -0
  169. package/payload/server/public/assets/data-DB6T1I-w.js.gz +0 -0
  170. package/payload/server/public/assets/{file-text-CBaewT76.js → file-text-DRGn4gjH.js} +1 -1
  171. package/payload/server/public/assets/file-text-DRGn4gjH.js.br +0 -0
  172. package/payload/server/public/assets/file-text-DRGn4gjH.js.gz +0 -0
  173. package/payload/server/public/assets/{graph-B8-e2_Z-.js → graph-D7ECsLPs.js} +3 -3
  174. package/payload/server/public/assets/graph-D7ECsLPs.js.br +0 -0
  175. package/payload/server/public/assets/graph-D7ECsLPs.js.gz +0 -0
  176. package/payload/server/public/assets/{graph-labels-Bsc23eZU.js → graph-labels-ClzmLEoK.js} +1 -1
  177. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.br +0 -0
  178. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.gz +0 -0
  179. package/payload/server/public/assets/operator-jSdha7TP.js +1 -0
  180. package/payload/server/public/assets/operator-jSdha7TP.js.br +0 -0
  181. package/payload/server/public/assets/operator-jSdha7TP.js.gz +0 -0
  182. package/payload/server/public/assets/page-Cq4SkWbr.js +1 -0
  183. package/payload/server/public/assets/page-Cq4SkWbr.js.br +0 -0
  184. package/payload/server/public/assets/page-Cq4SkWbr.js.gz +0 -0
  185. package/payload/server/public/assets/page-DrwRXi3K.js +32 -0
  186. package/payload/server/public/assets/page-DrwRXi3K.js.br +0 -0
  187. package/payload/server/public/assets/page-DrwRXi3K.js.gz +0 -0
  188. package/payload/server/public/assets/play-CWyPEXiB.js +1 -0
  189. package/payload/server/public/assets/play-CWyPEXiB.js.br +0 -0
  190. package/payload/server/public/assets/play-CWyPEXiB.js.gz +0 -0
  191. package/payload/server/public/assets/public-D7MfkWvM.js +1 -0
  192. package/payload/server/public/assets/public-D7MfkWvM.js.br +0 -0
  193. package/payload/server/public/assets/public-D7MfkWvM.js.gz +0 -0
  194. package/payload/server/public/assets/{rotate-ccw-FZW7c8p8.js → rotate-ccw-CaWP-njL.js} +1 -1
  195. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.br +0 -0
  196. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.gz +0 -0
  197. package/payload/server/public/assets/routines-XTk0vJUD.js +2 -0
  198. package/payload/server/public/assets/routines-XTk0vJUD.js.br +0 -0
  199. package/payload/server/public/assets/routines-XTk0vJUD.js.gz +0 -0
  200. package/payload/server/public/assets/skills-sjTaAr0v.js +1 -0
  201. package/payload/server/public/assets/skills-sjTaAr0v.js.br +0 -0
  202. package/payload/server/public/assets/skills-sjTaAr0v.js.gz +0 -0
  203. package/payload/server/public/assets/tasks-D0-qwWZR.js +3 -0
  204. package/payload/server/public/assets/tasks-D0-qwWZR.js.br +0 -0
  205. package/payload/server/public/assets/tasks-D0-qwWZR.js.gz +0 -0
  206. package/payload/server/public/assets/{triangle-alert-CR-jRJdI.js → triangle-alert-BCndBPvE.js} +1 -1
  207. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.br +0 -0
  208. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.gz +0 -0
  209. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js +1 -0
  210. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.br +0 -0
  211. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.gz +0 -0
  212. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css +1 -0
  213. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.br +0 -0
  214. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.gz +0 -0
  215. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js +14 -0
  216. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.br +0 -0
  217. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.gz +0 -0
  218. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js +2 -0
  219. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.br +0 -0
  220. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.gz +0 -0
  221. package/payload/server/public/assets/{wrench-CpCOYUBc.js → wrench-BBl51xDU.js} +1 -1
  222. package/payload/server/public/assets/wrench-BBl51xDU.js.br +0 -0
  223. package/payload/server/public/assets/wrench-BBl51xDU.js.gz +0 -0
  224. package/payload/server/public/browser.html +4 -4
  225. package/payload/server/public/calendar.html +8 -8
  226. package/payload/server/public/chat.html +13 -13
  227. package/payload/server/public/data.html +11 -11
  228. package/payload/server/public/graph.html +9 -9
  229. package/payload/server/public/index.html +14 -14
  230. package/payload/server/public/operator.html +14 -14
  231. package/payload/server/public/public.html +13 -13
  232. package/payload/server/public/routines.html +6 -6
  233. package/payload/server/public/skills.html +5 -5
  234. package/payload/server/public/tasks.html +6 -6
  235. package/payload/server/server.js +474 -254
  236. package/payload/server/{src-JN6PIAJN.js → src-MM64CYYZ.js} +1 -1
  237. package/payload/server/{userprofile-reconcile-QHVLY2AH.js → userprofile-reconcile-TL4JKBPG.js} +1 -1
  238. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +0 -1
  239. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
  240. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
  241. package/payload/server/public/assets/AdminShell-DJL5DzRX.js +0 -2
  242. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
  243. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
  244. package/payload/server/public/assets/activity-CpMnNr5c.js +0 -1
  245. package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
  246. package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
  247. package/payload/server/public/assets/admin-CBwKIfaI.js +0 -1
  248. package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
  249. package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
  250. package/payload/server/public/assets/agents-C4LmSKjb.js +0 -1
  251. package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
  252. package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
  253. package/payload/server/public/assets/browser-Bm9xm_yc.js +0 -1
  254. package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
  255. package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
  256. package/payload/server/public/assets/calendar-CNY9FTWe.js +0 -1
  257. package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
  258. package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
  259. package/payload/server/public/assets/chat-3WoUGCTd.js +0 -1
  260. package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
  261. package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
  262. package/payload/server/public/assets/chevron-left-BE16BJnw.js +0 -1
  263. package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
  264. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +0 -1
  265. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
  266. package/payload/server/public/assets/clock-C4Nu2aRV.js +0 -1
  267. package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
  268. package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
  269. package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
  270. package/payload/server/public/assets/data-C-x5EHyi.js +0 -1
  271. package/payload/server/public/assets/data-C-x5EHyi.js.br +0 -1
  272. package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
  273. package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
  274. package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
  275. package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
  276. package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
  277. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
  278. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
  279. package/payload/server/public/assets/operator-Cve0-qfO.js +0 -1
  280. package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
  281. package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
  282. package/payload/server/public/assets/page-BgVMs6Vf.js +0 -1
  283. package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
  284. package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
  285. package/payload/server/public/assets/page-fABub-w8.js +0 -32
  286. package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
  287. package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
  288. package/payload/server/public/assets/play-B6zXB9K7.js +0 -1
  289. package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
  290. package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
  291. package/payload/server/public/assets/public--R2DbdWs.js +0 -1
  292. package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
  293. package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
  294. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
  295. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
  296. package/payload/server/public/assets/routines-BpZs2SaT.js +0 -2
  297. package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
  298. package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
  299. package/payload/server/public/assets/skills-DF7uyEEz.js +0 -1
  300. package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
  301. package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
  302. package/payload/server/public/assets/tasks-BfJJmoWO.js +0 -3
  303. package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
  304. package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
  305. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
  306. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
  307. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +0 -1
  308. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
  309. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
  310. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js +0 -14
  311. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
  312. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.gz +0 -0
  313. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css +0 -1
  314. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
  315. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.gz +0 -0
  316. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +0 -2
  317. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
  318. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
  319. package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
  320. package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { Hono } from 'hono';
2
+ import type { AgentRole } from './types.js';
2
3
  import { type SpawnDeps } from './pty-spawner.js';
3
4
  import type { PtyCensusSnapshot } from './pty-census.js';
5
+ import type { RoleCensus } from './role-census.js';
4
6
  import type { FsWatcher } from './fs-watcher.js';
5
7
  import type { SubagentInjectionTail } from './subagent-injection-tail.js';
6
8
  import type { RateLimiter } from './spawn-rate-limiter.js';
@@ -9,6 +11,35 @@ import { AccountTitleStores } from './account-title-stores.js';
9
11
  import { WaChannelStore } from './wa-channel-store.js';
10
12
  import { WebchatChannelStore } from './webchat-channel-store.js';
11
13
  import { TelegramChannelStore } from './telegram-channel-store.js';
14
+ /** Task 2325 — the rc-spawn role, as supplied by the request body. Task 1468
15
+ * widened this position to allow `undefined` because rc-spawn's role was
16
+ * absent for a non-admin/non-public request; null now means "the body named
17
+ * none", and the handler resolves it against the prior sidecar before
18
+ * deciding whether that is an error. `passive` is not accepted here:
19
+ * rc-spawn composes no persona at all (its --append-system-prompt segments
20
+ * are reseat / voice / specialist-domains / authenticated-identity
21
+ * fragments, never composeAppendSystemPrompt). */
22
+ export declare function parseRcSpawnRole(body: {
23
+ role?: unknown;
24
+ }): Extract<AgentRole, 'admin' | 'public'> | null;
25
+ /** Task 2325 — the single place a /public-spawn wire role becomes a typed one.
26
+ * Returns the wire role (always 'admin' or 'public', narrowed by the ROLES
27
+ * allowlist above) and the persona role the spawn composes from. They differ
28
+ * only for a passive spawn. Anything the allowlist does not name returns null
29
+ * and the caller refuses; nothing falls through to 'admin'.
30
+ *
31
+ * The passive condition reproduces the Task 1483 invariant exactly, moved
32
+ * here from pty-spawner: a passive spawn rides `role:'public'` on the wire
33
+ * and is never a specialist, so a passive flag on any other role or on a
34
+ * specialist is ignored rather than silently registering a different (e.g.
35
+ * full-admin) server surface while the allowlist locks to work-create. */
36
+ export declare function parseSpawnRole(body: {
37
+ role?: unknown;
38
+ passive?: unknown;
39
+ }, specialist: string | undefined): {
40
+ role: AgentRole;
41
+ agentRole: AgentRole;
42
+ } | null;
12
43
  export declare const SESSION_ID_PATTERN: RegExp;
13
44
  export declare const RC_SPAWN_URL_WAIT_DEFAULT_MS = 60000;
14
45
  export interface HttpDeps extends Omit<SpawnDeps, 'onSessionReady' | 'watcher'> {
@@ -37,6 +68,10 @@ export interface HttpDeps extends Omit<SpawnDeps, 'onSessionReady' | 'watcher'>
37
68
  * the live /rc-spawn handler) keep working unchanged; production index.ts
38
69
  * always injects it. */
39
70
  webchatChannelStore?: WebchatChannelStore;
71
+ /** Task 2325 — the standing per-role spawn census. Optional so the existing
72
+ * test deps factories keep working unchanged; production index.ts always
73
+ * injects it. */
74
+ roleCensus?: RoleCensus;
40
75
  /** Per-session telegram channel binding, the telegram twin of
41
76
  * webchatChannelStore. Optional for the same reason: test deps factories
42
77
  * that run the live /rc-spawn handler keep working unchanged; production
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAa3B,OAAO,KAAK,EAAU,SAAS,EAAW,MAAM,YAAY,CAAA;AAK5D,OAAO,EAkBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAqBzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAoBlD,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAQlE;;;;;;;mDAOmD;AACnD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACvB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC,GAAG,IAAI,CAE/C;AAED;;;;;;;;;;2EAU2E;AAC3E,wBAAgB,cAAc,CAC5B,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3C,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAOlD;AAsFD,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB;;oEAEgE;IAChE,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,WAAW,EAAE,kBAAkB,CAAA;IAC/B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;sBAEkB;IAClB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;;sCAGkC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;4EAGwE;IACxE,YAAY,CAAC,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAA;CAC9C;AAsFD;;;;;;mEAMmE;AACnE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC9D;AAMD;;;;;;iBAMiB;AACjB,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAmCvF;AAID;;;;;;yBAMyB;AACzB,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAiCzD;AAwCD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAiGD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CASvG;AAUD,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,OAAO,GACxB,IAAI,CA4BN;AAkED;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AA8CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAw5GpD"}
@@ -59,7 +59,40 @@ import { claudeStateRoot, projectSlugForCwd, jsonlPathForSessionId, sidecarPathF
59
59
  import { basename, dirname, join } from 'node:path';
60
60
  import { validateUserTitle } from './user-title-store.js';
61
61
  import { credentialsPathForConfigDir, snapshotAuthForFailureReason } from './auth-snapshot.js';
62
+ // Task 2325 — the wire subset of AgentRole. `passive` is a persona role
63
+ // resolved at the /public-spawn boundary from role:'public' plus the passive
64
+ // flag; it is deliberately absent here so no client can POST it directly.
62
65
  const ROLES = ['admin', 'public'];
66
+ /** Task 2325 — the rc-spawn role, as supplied by the request body. Task 1468
67
+ * widened this position to allow `undefined` because rc-spawn's role was
68
+ * absent for a non-admin/non-public request; null now means "the body named
69
+ * none", and the handler resolves it against the prior sidecar before
70
+ * deciding whether that is an error. `passive` is not accepted here:
71
+ * rc-spawn composes no persona at all (its --append-system-prompt segments
72
+ * are reseat / voice / specialist-domains / authenticated-identity
73
+ * fragments, never composeAppendSystemPrompt). */
74
+ export function parseRcSpawnRole(body) {
75
+ return body.role === 'admin' || body.role === 'public' ? body.role : null;
76
+ }
77
+ /** Task 2325 — the single place a /public-spawn wire role becomes a typed one.
78
+ * Returns the wire role (always 'admin' or 'public', narrowed by the ROLES
79
+ * allowlist above) and the persona role the spawn composes from. They differ
80
+ * only for a passive spawn. Anything the allowlist does not name returns null
81
+ * and the caller refuses; nothing falls through to 'admin'.
82
+ *
83
+ * The passive condition reproduces the Task 1483 invariant exactly, moved
84
+ * here from pty-spawner: a passive spawn rides `role:'public'` on the wire
85
+ * and is never a specialist, so a passive flag on any other role or on a
86
+ * specialist is ignored rather than silently registering a different (e.g.
87
+ * full-admin) server surface while the allowlist locks to work-create. */
88
+ export function parseSpawnRole(body, specialist) {
89
+ const raw = body.role;
90
+ if (typeof raw !== 'string' || !ROLES.includes(raw))
91
+ return null;
92
+ const role = raw;
93
+ const agentRole = body.passive === true && role === 'public' && specialist === undefined ? 'passive' : role;
94
+ return { role, agentRole };
95
+ }
63
96
  const CHANNELS = ['browser', 'whatsapp', 'telegram', 'webchat', 'email'];
64
97
  // Task 382 — body.conversationNodeId shape gate. The value is the
65
98
  // sessionId UUID (v4) minted by createNewAdminConversation in
@@ -1037,12 +1070,21 @@ export function buildHttpApp(deps) {
1037
1070
  const userId = typeof body.userId === 'string' && body.userId.length > 0 && body.userId.length <= 128
1038
1071
  ? body.userId
1039
1072
  : undefined;
1040
- const role = typeof body.role === 'string' ? body.role : '';
1041
1073
  const channel = typeof body.channel === 'string' ? body.channel : '';
1042
1074
  const hidden = body.hidden === true;
1043
1075
  const specialist = typeof body.specialist === 'string' && /^[A-Za-z0-9_-]{1,64}$/.test(body.specialist)
1044
1076
  ? body.specialist
1045
1077
  : undefined;
1078
+ // Task 2325 — one parse, before any other use of the role. `role` is what
1079
+ // arrived on the wire; `agentRole` is which persona it resolves to. They
1080
+ // differ only for a passive spawn. `role` keeps its string-or-empty shape
1081
+ // so every existing read of it, including the spawn-request log line's
1082
+ // `role=${role || 'missing'}`, is unchanged.
1083
+ const parsedRole = parseSpawnRole(body, specialist);
1084
+ const role = parsedRole?.role ?? '';
1085
+ const agentRole = parsedRole?.agentRole ?? null;
1086
+ // Task 2325 — recorded before the guard so a refused spawn is counted.
1087
+ deps.roleCensus?.record(agentRole);
1046
1088
  // Task 956 — public sessions are pinned to Sonnet 5 (operator decision:
1047
1089
  // admin-only Bypass/Opus; public stays Sonnet + fail-closed dontAsk). The
1048
1090
  // role==='public' force is the chokepoint covering every public spawn
@@ -1152,7 +1194,15 @@ export function buildHttpApp(deps) {
1152
1194
  : body.dormantPlugins == null ? 'absent' : typeof body.dormantPlugins;
1153
1195
  const initialMessageBytes = typeof body.initialMessage === 'string' ? Buffer.byteLength(body.initialMessage, 'utf8') : 0;
1154
1196
  deps.logger(`spawn-request senderId=${senderId || 'missing'} userId=${userId ? userId.slice(0, 8) : 'absent'} role=${role || 'missing'} channel=${channel || 'missing'} permissionMode=${typeof body.permissionMode === 'string' ? body.permissionMode : 'default'} channels=${Array.isArray(body.channels) ? body.channels.length : 0} attachmentDir=${typeof body.attachmentDir === 'string' ? 'set' : 'absent'} aboutOwner=${aboutOwnerShape} dormantPlugins=${dormantPluginsShape} tunnelUrl=${typeof body.tunnelUrl === 'string' ? 'set' : (body.tunnelUrl === null ? 'null' : 'absent')} initialMessageBytes=${initialMessageBytes}`);
1155
- if (!senderId || !ROLES.includes(role) || !CHANNELS.includes(channel)) {
1197
+ if (!senderId || parsedRole === null || agentRole === null || !CHANNELS.includes(channel)) {
1198
+ // Task 2325 — emitted only when the ROLE is what failed. The guard also
1199
+ // covers a missing senderId and a bad channel, and naming those
1200
+ // `role-unresolved` would make the line lie about its own cause, which
1201
+ // is the exact defect class this task exists to remove. The 400 body
1202
+ // below still reports all three fields.
1203
+ if (parsedRole === null) {
1204
+ deps.logger(`[spawn] op=role-unresolved sessionId=new role=${typeof body.role === 'string' ? body.role : String(body.role)} site=public-spawn`);
1205
+ }
1156
1206
  timed(deps.logger, 'POST', '/public-spawn', 400, Date.now() - start);
1157
1207
  return c.json({ error: 'invalid-arguments', detail: { senderId: !!senderId, role, channel } }, 400);
1158
1208
  }
@@ -1282,7 +1332,7 @@ export function buildHttpApp(deps) {
1282
1332
  if (!passive) {
1283
1333
  // Task 2271 — `spawnCwd` here is the re-scoped value, so the audit
1284
1334
  // follows a public-agent session into its own account's slug.
1285
- attachPublicAudit(deps, tracker.sessionId, role, spawnCwd);
1335
+ attachPublicAudit(deps, tracker.sessionId, parsedRole.role, spawnCwd);
1286
1336
  // Task 2262 — the exit notify is webchat machinery: the route it
1287
1337
  // calls resolves the sessionId against the WEBCHAT gateway's
1288
1338
  // publicSessions map to fire a slice-review, so a WhatsApp public
@@ -1292,7 +1342,7 @@ export function buildHttpApp(deps) {
1292
1342
  // because a WhatsApp visitor's realised tool surface is exactly what
1293
1343
  // Task 2260 wants audited.
1294
1344
  if (channel !== 'whatsapp') {
1295
- attachPublicExitNotify(tracker.sessionId, role, deps.logger);
1345
+ attachPublicExitNotify(tracker.sessionId, parsedRole.role, deps.logger);
1296
1346
  }
1297
1347
  }
1298
1348
  attachSpecialistEndTurnAutoArchive(deps, tracker.sessionId, tracker.specialist);
@@ -1304,7 +1354,10 @@ export function buildHttpApp(deps) {
1304
1354
  }, {
1305
1355
  senderId,
1306
1356
  userId,
1307
- role: role,
1357
+ // Task 2325 — the PERSONA role the spawn composes from, resolved by
1358
+ // the boundary parse above. No cast: `agentRole` is non-null past the
1359
+ // guard. The wire role stays on the sidecar (pty-spawner maps it back).
1360
+ role: agentRole,
1308
1361
  channel: channel,
1309
1362
  channels,
1310
1363
  permissionMode,
@@ -1326,7 +1379,6 @@ export function buildHttpApp(deps) {
1326
1379
  waChannel,
1327
1380
  ...sessionIdFields,
1328
1381
  previousContext,
1329
- passive,
1330
1382
  targetAccountId,
1331
1383
  // Task 2271 — the RESOLVED variable, not the parsed field: when the
1332
1384
  // same-slug rule declines the re-scope, the sidecar stays at the house
@@ -2692,7 +2744,11 @@ export function buildHttpApp(deps) {
2692
2744
  // session-end review) supply no channel and get no sidecar. Task 852 widens
2693
2745
  // the accepted role to 'public' (authenticated-public WhatsApp person) and
2694
2746
  // the sidecar records the actual role.
2695
- const rcRole = body.role === 'admin' || body.role === 'public' ? body.role : undefined;
2747
+ // Task 2325 the BODY's role. Null when absent or unrecognised. A
2748
+ // channel-bound resume legitimately omits it and inherits from its prior
2749
+ // sidecar, so the refusal is not here; it is where both sources have been
2750
+ // consulted, just below `priorSidecar`.
2751
+ const rcRole = parseRcSpawnRole(body);
2696
2752
  const adminChannel = typeof body.channel === 'string' && CHANNELS.includes(body.channel)
2697
2753
  ? body.channel
2698
2754
  : undefined;
@@ -3035,11 +3091,46 @@ export function buildHttpApp(deps) {
3035
3091
  // yields null; the gate degrades to the not-resolvable identity form.
3036
3092
  // Task 1214 — widened from webchat-only to any channel-bound session so the
3037
3093
  // admin-role signal resolves for WhatsApp/Telegram resumes that omit role
3038
- // too (the voice-contract gate below keys on `adminBinding`). Every
3039
- // channel-less resume still skips the disk touch.
3040
- const priorSidecar = sessionId && (effectiveWebchatChannel || effectiveWaChannel || effectiveTelegramChannel)
3094
+ // too (the voice-contract gate below keys on `adminBinding`).
3095
+ // Task 2325 — widened again to EVERY resume, channel-bound or not, so the
3096
+ // role can be inherited from disk before the refusal below. The dropped
3097
+ // "channel-less resumes skip the disk touch" optimisation cost one small
3098
+ // readFileSync on a path that then spawns a PTY. Without it, the bare
3099
+ // `{ sessionId }` resumes that wedged-session recovery (index.ts, the
3100
+ // recoverWedgedSession resumeSpawn) and the re-seat route send would be
3101
+ // refused for carrying no role, when their role has been on disk all along.
3102
+ const priorSidecar = sessionId
3041
3103
  ? readSidecar(sidecarPathForSessionId(effectiveAccountDir, sessionId), deps.logger).sidecar
3042
3104
  : null;
3105
+ // Task 2325 — the session's role, from the body or inherited from disk.
3106
+ // The refusal sits here rather than at the body parse because an absent
3107
+ // `role` has THREE legitimate readings and only one of them is an error:
3108
+ // 1. a channel-bound resume, which inherits from `priorSidecar` (Task
3109
+ // 2260's own words: "a resume omits `role` in the body");
3110
+ // 2. a one-shot admin job, which is not a channel conversation — those
3111
+ // now pass role:'admin' and are told apart by their absent `channel`,
3112
+ // which is what the classification-sidecar gate below reads;
3113
+ // 3. a caller that simply supplied none on a FRESH spawn, which is the
3114
+ // error. Before this it became `undefined` and rode on, and
3115
+ // `sessionRole=undefined` was documented (Task 1468) as a value to
3116
+ // preserve rather than treated as a fault.
3117
+ //
3118
+ // The `mode === 'fresh'` half of the gate is load-bearing, not caution. A
3119
+ // resume that inherits nothing is the claude.ai/code bridge: the bare
3120
+ // admin-host branch of session-rc-spawn.ts posts `{ sessionId, name }`
3121
+ // with no role and no channel, and wedged-session recovery posts
3122
+ // `{ sessionId }`. Both resume a session whose role predates the request.
3123
+ // Refusing them would take out a core operator surface to close a hole
3124
+ // that only a fresh spawn can open: a resume composes no new persona,
3125
+ // and rc-spawn composes none at all.
3126
+ const effectiveRcRole = rcRole ?? priorSidecar?.role ?? null;
3127
+ // Task 2325 — recorded before the refusal so a refused spawn is counted.
3128
+ deps.roleCensus?.record(effectiveRcRole);
3129
+ if (effectiveRcRole === null && mode === 'fresh') {
3130
+ deps.logger(`[rc-spawn] op=role-unresolved sessionId=${sessionId ? sessionId.slice(0, 8) : 'new'} role=${String(body.role)} site=rc-spawn`);
3131
+ timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
3132
+ return c.json({ error: 'invalid-arguments', detail: { role: body.role ?? null } }, 400);
3133
+ }
3043
3134
  // Task 850 — assemble the bound target set and choose the channel server:
3044
3135
  // - ≥2 kinds: ONE unified `channel` server (one reply tool fanning to every
3045
3136
  // target's existing gateway endpoint). The mature per-kind servers are
@@ -3136,7 +3227,9 @@ export function buildHttpApp(deps) {
3136
3227
  gatewayUrl: effectiveTelegramChannel.gatewayUrl,
3137
3228
  serverPath: effectiveTelegramChannel.serverPath,
3138
3229
  nodeBin: deps.nodeBin,
3139
- role: rcRole,
3230
+ // Task 2325 — the body role, unchanged in meaning; `?? undefined`
3231
+ // only bridges null to the optional parameter this builder declares.
3232
+ role: rcRole ?? undefined,
3140
3233
  });
3141
3234
  telegramPath = telegramChannelMcpConfigPath(sessionId, tmpdir());
3142
3235
  try {
@@ -3159,7 +3252,7 @@ export function buildHttpApp(deps) {
3159
3252
  // which is every public spawn that can reply. Pushed after the channel argv
3160
3253
  // so `--strict-mcp-config` leaves exactly the per-spawn channel server
3161
3254
  // registered; `admin` and roleless spawns produce byte-identical argv.
3162
- const effectiveRcRole = rcRole ?? priorSidecar?.role;
3255
+ // Task 2325 resolved once, above, beside the refusal.
3163
3256
  const publicLockdown = effectiveRcRole === 'public' ? buildRcPublicLockdownArgv(channelServerName) : null;
3164
3257
  if (publicLockdown) {
3165
3258
  // A re-seat fork pushes its own caller-picked --permission-mode above,
@@ -3279,6 +3372,12 @@ export function buildHttpApp(deps) {
3279
3372
  // (effectiveAccountId !== house) spawns — fail-closed, no escalation.
3280
3373
  const acctIsHouse = isHouseAccount(deps.platformRoot, effectiveAccountId);
3281
3374
  const rcHouseAdminScope = houseAdminScopeFor({
3375
+ // Task 2325 — the BODY's role, deliberately not `effectiveRcRole`. A
3376
+ // resume that omits the role has never carried house scope (its old
3377
+ // `undefined` was cast and failed the `role === 'admin'` test), and
3378
+ // switching to the inherited role here would newly grant cross-account
3379
+ // authority to every admin channel resume. That gap is real and
3380
+ // pre-existing; deciding it is not this task's scope.
3282
3381
  role: rcRole,
3283
3382
  accountId: effectiveAccountId,
3284
3383
  isHouse: acctIsHouse,
@@ -3290,7 +3389,12 @@ export function buildHttpApp(deps) {
3290
3389
  // line makes the rc-spawn decision greppable per spawn.
3291
3390
  deps.logger(formatHouseScopeInjectLine({
3292
3391
  sessionId,
3293
- sessionRole: rcRole,
3392
+ // Task 2325 — the session's role, so this line can no longer render
3393
+ // `sessionRole=undefined`. A resume that inherits no role renders the
3394
+ // explicit token `none`, matching the idiom this handler already uses
3395
+ // for the same value below. A stringified absence read as a formatting
3396
+ // artefact, which is how an unnamed role stayed invisible for two tasks.
3397
+ sessionRole: effectiveRcRole ?? 'none',
3294
3398
  acctIsHouse,
3295
3399
  inject: rcHouseAdminScope !== null,
3296
3400
  }));
@@ -3509,18 +3613,31 @@ export function buildHttpApp(deps) {
3509
3613
  // when one exists. Non-fatal: the PTY here is already serving a live thread —
3510
3614
  // a failed classification sidecar must not tear it down, so it logs and the
3511
3615
  // session keeps running (the pre-fix reader-blind behaviour, no worse).
3512
- const classifyChannel = rcRole !== undefined ? adminChannel : undefined;
3616
+ // Task 2325 the sidecar is written for a channel conversation. What
3617
+ // distinguishes one from a one-shot admin job is the CHANNEL, not whether
3618
+ // a role was supplied: the LinkedIn ingest and the public session-end
3619
+ // review are role:'admin' and pass no channel, and they still get no
3620
+ // sidecar. Before this the absent role carried both meanings at once.
3621
+ const classifyChannel = adminChannel;
3513
3622
  const classifySenderId = adminSenderId ?? effectiveWaChannel?.senderId ?? effectiveWebchatChannel?.key ?? effectiveTelegramChannel?.senderId;
3514
- if (sessionId && classifyChannel && classifySenderId) {
3623
+ // Task 2325 `effectiveRcRole !== null` joins the guard rather than being
3624
+ // cast away. The sidecar's `role` is read back through an allowlist that
3625
+ // rejects the whole row on a bad value, so a session with no resolvable
3626
+ // role gets NO sidecar rather than one recording an absence.
3627
+ if (sessionId && classifyChannel && classifySenderId && effectiveRcRole !== null) {
3515
3628
  const classifySidecarPath = sidecarPathForSessionId(effectiveAccountDir, sessionId);
3516
3629
  if (!existsSync(classifySidecarPath)) {
3517
3630
  try {
3518
3631
  writeSidecar(classifySidecarPath, {
3519
3632
  senderId: classifySenderId,
3520
- // Task 852 — the actual role from the body ('admin' | 'public'),
3521
- // not a hardcoded 'admin'; rcRole is defined whenever
3522
- // classifyChannel is.
3523
- role: rcRole,
3633
+ // Task 852 — the actual role, not a hardcoded 'admin'. Task 2325
3634
+ // the effective role (body, else inherited from disk),
3635
+ // non-null by the guard above. The old
3636
+ // `rcRole as 'admin' | 'public'` relied on this gate being
3637
+ // role-derived; the gate now reads the channel, so without the
3638
+ // guard a resume with a channel and no body role would have
3639
+ // written a cast `undefined` into the sidecar.
3640
+ role: effectiveRcRole,
3524
3641
  channel: classifyChannel,
3525
3642
  url: null,
3526
3643
  startedAt: new Date().toISOString(),