@rubytech/create-maxy-code 0.1.543 → 0.1.544

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 (264) hide show
  1. package/dist/__tests__/public-instruction-seed.test.js +102 -0
  2. package/dist/index.js +10 -0
  3. package/dist/public-instruction-seed.js +70 -0
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/PLUGIN.md +2 -0
  6. package/payload/platform/plugins/admin/hooks/__tests__/public-tool-surface.test.sh +173 -0
  7. package/payload/platform/plugins/admin/hooks/public-tool-surface.sh +123 -0
  8. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.d.ts.map +1 -1
  9. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js +13 -1
  10. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js.map +1 -1
  11. package/payload/platform/plugins/admin/skills/channel-instruction/SKILL.md +46 -0
  12. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +4 -1
  13. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  14. package/payload/platform/plugins/docs/references/internals.md +2 -0
  15. package/payload/platform/plugins/docs/references/platform.md +1 -0
  16. package/payload/platform/scripts/__tests__/public-surface-registered.test.sh +102 -0
  17. package/payload/platform/scripts/lib/__tests__/account-settings-public-surface.test.sh +109 -0
  18. package/payload/platform/scripts/lib/account-settings-public-surface.sh +109 -0
  19. package/payload/platform/scripts/lib/provision-account-dir.sh +6 -3
  20. package/payload/platform/scripts/setup-account.sh +14 -0
  21. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  22. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  23. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +22 -0
  24. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +23 -1
  26. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  28. package/payload/platform/services/claude-session-manager/dist/http-server.js +157 -13
  29. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  30. package/payload/platform/services/claude-session-manager/dist/index.js +86 -40
  31. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  32. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +1 -1
  33. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  34. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +64 -1
  35. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  36. package/payload/platform/services/claude-session-manager/dist/public-surface-audit.d.ts +24 -3
  37. package/payload/platform/services/claude-session-manager/dist/public-surface-audit.d.ts.map +1 -1
  38. package/payload/platform/services/claude-session-manager/dist/public-surface-audit.js +29 -3
  39. package/payload/platform/services/claude-session-manager/dist/public-surface-audit.js.map +1 -1
  40. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.d.ts +27 -0
  41. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.d.ts.map +1 -1
  42. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.js +32 -0
  43. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.js.map +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +15 -0
  45. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  46. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +8 -0
  47. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  48. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts +18 -9
  49. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts.map +1 -1
  50. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js +18 -9
  51. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js.map +1 -1
  52. package/payload/platform/services/claude-session-manager/dist/stuck-turn-respawn.d.ts +60 -0
  53. package/payload/platform/services/claude-session-manager/dist/stuck-turn-respawn.d.ts.map +1 -0
  54. package/payload/platform/services/claude-session-manager/dist/stuck-turn-respawn.js +93 -0
  55. package/payload/platform/services/claude-session-manager/dist/stuck-turn-respawn.js.map +1 -0
  56. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts +12 -1
  57. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts.map +1 -1
  58. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js +41 -13
  59. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js.map +1 -1
  60. package/payload/platform/services/telegram-channel/dist/instructions.d.ts +0 -1
  61. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  62. package/payload/platform/services/telegram-channel/dist/instructions.js +0 -46
  63. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  64. package/payload/platform/services/telegram-channel/dist/notification.d.ts +16 -4
  65. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  66. package/payload/platform/services/telegram-channel/dist/notification.js +27 -14
  67. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  68. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  69. package/payload/platform/services/telegram-channel/dist/server.js +10 -0
  70. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  71. package/payload/platform/services/webchat-channel/dist/instructions.d.ts +0 -1
  72. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  73. package/payload/platform/services/webchat-channel/dist/instructions.js +0 -60
  74. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  75. package/payload/platform/services/webchat-channel/dist/notification.d.ts +14 -2
  76. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  77. package/payload/platform/services/webchat-channel/dist/notification.js +28 -12
  78. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  79. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  80. package/payload/platform/services/webchat-channel/dist/server.js +10 -0
  81. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  82. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +12 -45
  83. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  84. package/payload/platform/services/whatsapp-channel/dist/notification.js +14 -90
  85. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  86. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  87. package/payload/platform/services/whatsapp-channel/dist/server.js +4 -3
  88. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  89. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +5 -4
  90. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  91. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  92. package/payload/platform/templates/agents/admin/INSTRUCTION.md +0 -15
  93. package/payload/server/{chunk-MGW536C5.js → chunk-CVUSUNXM.js} +1 -1
  94. package/payload/server/{chunk-BIHII3CT.js → chunk-DU7GPDJJ.js} +1 -0
  95. package/payload/server/{chunk-RSNVIN4G.js → chunk-X2RRMHVV.js} +1 -1
  96. package/payload/server/{manager-GJHKO7WW.js → manager-TI2YJQVZ.js} +2 -2
  97. package/payload/server/maxy-edge.js +2 -2
  98. package/payload/server/public/activity.html +5 -5
  99. package/payload/server/public/agents.html +4 -4
  100. package/payload/server/public/assets/{AdminLoginScreens-C1iXeR-9.js → AdminLoginScreens-BGKtDqAk.js} +1 -1
  101. package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.br +0 -0
  102. package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.gz +0 -0
  103. package/payload/server/public/assets/{AdminShell-BeIGNC1Q.js → AdminShell-DnfgsAQl.js} +1 -1
  104. package/payload/server/public/assets/AdminShell-DnfgsAQl.js.br +0 -0
  105. package/payload/server/public/assets/AdminShell-DnfgsAQl.js.gz +0 -0
  106. package/payload/server/public/assets/{activity-AaFvfwrZ.js → activity-ByJSut0Q.js} +1 -1
  107. package/payload/server/public/assets/activity-ByJSut0Q.js.br +0 -0
  108. package/payload/server/public/assets/activity-ByJSut0Q.js.gz +0 -0
  109. package/payload/server/public/assets/{admin-Bz34CZqL.js → admin-CkeJO6kA.js} +1 -1
  110. package/payload/server/public/assets/admin-CkeJO6kA.js.br +0 -0
  111. package/payload/server/public/assets/admin-CkeJO6kA.js.gz +0 -0
  112. package/payload/server/public/assets/{agents-N0z7qg8a.js → agents-D8phtRX5.js} +1 -1
  113. package/payload/server/public/assets/agents-D8phtRX5.js.br +0 -0
  114. package/payload/server/public/assets/agents-D8phtRX5.js.gz +0 -0
  115. package/payload/server/public/assets/{browser-_k-v0iky.js → browser-DQSTjdom.js} +1 -1
  116. package/payload/server/public/assets/browser-DQSTjdom.js.br +0 -0
  117. package/payload/server/public/assets/browser-DQSTjdom.js.gz +0 -0
  118. package/payload/server/public/assets/{calendar-D_DvVRJS.js → calendar-DFJu1XjP.js} +1 -1
  119. package/payload/server/public/assets/calendar-DFJu1XjP.js.br +0 -0
  120. package/payload/server/public/assets/calendar-DFJu1XjP.js.gz +0 -0
  121. package/payload/server/public/assets/chat-DUqtIsOt.js +1 -0
  122. package/payload/server/public/assets/chat-DUqtIsOt.js.br +0 -0
  123. package/payload/server/public/assets/chat-DUqtIsOt.js.gz +0 -0
  124. package/payload/server/public/assets/chevron-left-DFK18xVX.js +1 -0
  125. package/payload/server/public/assets/chevron-left-DFK18xVX.js.br +0 -0
  126. package/payload/server/public/assets/chevron-right-DJ4oaHoN.js +1 -0
  127. package/payload/server/public/assets/chevron-right-DJ4oaHoN.js.br +0 -0
  128. package/payload/server/public/assets/clock-wHIan2DW.js +1 -0
  129. package/payload/server/public/assets/clock-wHIan2DW.js.br +0 -0
  130. package/payload/server/public/assets/{copy-BDoxl3Oi.js → copy-lFFhXRGk.js} +1 -1
  131. package/payload/server/public/assets/copy-lFFhXRGk.js.br +0 -0
  132. package/payload/server/public/assets/copy-lFFhXRGk.js.gz +0 -0
  133. package/payload/server/public/assets/data-Cxv97ARy.js +1 -0
  134. package/payload/server/public/assets/data-Cxv97ARy.js.br +0 -0
  135. package/payload/server/public/assets/data-Cxv97ARy.js.gz +0 -0
  136. package/payload/server/public/assets/{file-text-DRGn4gjH.js → file-text-D2Y-bkNy.js} +1 -1
  137. package/payload/server/public/assets/file-text-D2Y-bkNy.js.br +0 -0
  138. package/payload/server/public/assets/file-text-D2Y-bkNy.js.gz +0 -0
  139. package/payload/server/public/assets/{graph-D7ECsLPs.js → graph-C-3yN6JD.js} +1 -1
  140. package/payload/server/public/assets/graph-C-3yN6JD.js.br +0 -0
  141. package/payload/server/public/assets/graph-C-3yN6JD.js.gz +0 -0
  142. package/payload/server/public/assets/{graph-labels-ClzmLEoK.js → graph-labels-DiaPLP27.js} +1 -1
  143. package/payload/server/public/assets/graph-labels-DiaPLP27.js.br +0 -0
  144. package/payload/server/public/assets/graph-labels-DiaPLP27.js.gz +0 -0
  145. package/payload/server/public/assets/{operator-jSdha7TP.js → operator-KuGPvSa9.js} +1 -1
  146. package/payload/server/public/assets/operator-KuGPvSa9.js.br +0 -0
  147. package/payload/server/public/assets/operator-KuGPvSa9.js.gz +0 -0
  148. package/payload/server/public/assets/{page-Cq4SkWbr.js → page-BhGeFXWA.js} +1 -1
  149. package/payload/server/public/assets/page-BhGeFXWA.js.br +0 -0
  150. package/payload/server/public/assets/page-BhGeFXWA.js.gz +0 -0
  151. package/payload/server/public/assets/{page-DrwRXi3K.js → page-EnbVC-yM.js} +1 -1
  152. package/payload/server/public/assets/page-EnbVC-yM.js.br +0 -0
  153. package/payload/server/public/assets/page-EnbVC-yM.js.gz +0 -0
  154. package/payload/server/public/assets/play-jZFZAG-t.js +1 -0
  155. package/payload/server/public/assets/play-jZFZAG-t.js.br +0 -0
  156. package/payload/server/public/assets/play-jZFZAG-t.js.gz +0 -0
  157. package/payload/server/public/assets/{public-D7MfkWvM.js → public-CdSgMNC7.js} +1 -1
  158. package/payload/server/public/assets/public-CdSgMNC7.js.br +0 -0
  159. package/payload/server/public/assets/public-CdSgMNC7.js.gz +0 -0
  160. package/payload/server/public/assets/{rotate-ccw-CaWP-njL.js → rotate-ccw-rTRuTqei.js} +1 -1
  161. package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.br +0 -0
  162. package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.gz +0 -0
  163. package/payload/server/public/assets/{routines-XTk0vJUD.js → routines-DNRxNRSQ.js} +1 -1
  164. package/payload/server/public/assets/routines-DNRxNRSQ.js.br +0 -0
  165. package/payload/server/public/assets/routines-DNRxNRSQ.js.gz +0 -0
  166. package/payload/server/public/assets/{skills-sjTaAr0v.js → skills-DFWtZNkW.js} +1 -1
  167. package/payload/server/public/assets/skills-DFWtZNkW.js.br +0 -0
  168. package/payload/server/public/assets/skills-DFWtZNkW.js.gz +0 -0
  169. package/payload/server/public/assets/{tasks-D0-qwWZR.js → tasks-B94AuKSy.js} +1 -1
  170. package/payload/server/public/assets/tasks-B94AuKSy.js.br +0 -0
  171. package/payload/server/public/assets/tasks-B94AuKSy.js.gz +0 -0
  172. package/payload/server/public/assets/{triangle-alert-BCndBPvE.js → triangle-alert-DtWUg6jR.js} +1 -1
  173. package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.br +0 -0
  174. package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.gz +0 -0
  175. package/payload/server/public/assets/{useCopyFeedback-BFMmBvVw.js → useCopyFeedback-CjKYO-Qf.js} +1 -1
  176. package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.br +0 -0
  177. package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.gz +0 -0
  178. package/payload/server/public/assets/{useMediaQuery-CXdUnGSe.css → useMediaQuery-DlOWP56H.css} +1 -1
  179. package/payload/server/public/assets/useMediaQuery-DlOWP56H.css.br +0 -0
  180. package/payload/server/public/assets/{useMediaQuery-CXdUnGSe.css.gz → useMediaQuery-DlOWP56H.css.gz} +0 -0
  181. package/payload/server/public/assets/{useVoiceRecorder-DmW6CW7B.js → useVoiceRecorder-BKFAYuzz.js} +1 -1
  182. package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.br +0 -0
  183. package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.gz +0 -0
  184. package/payload/server/public/assets/{wrench-BBl51xDU.js → wrench-Ct4kf-uv.js} +1 -1
  185. package/payload/server/public/assets/wrench-Ct4kf-uv.js.br +0 -0
  186. package/payload/server/public/assets/wrench-Ct4kf-uv.js.gz +0 -0
  187. package/payload/server/public/browser.html +4 -4
  188. package/payload/server/public/calendar.html +8 -8
  189. package/payload/server/public/chat.html +13 -13
  190. package/payload/server/public/data.html +11 -11
  191. package/payload/server/public/graph.html +9 -9
  192. package/payload/server/public/index.html +14 -14
  193. package/payload/server/public/operator.html +14 -14
  194. package/payload/server/public/public.html +13 -13
  195. package/payload/server/public/routines.html +6 -6
  196. package/payload/server/public/skills.html +5 -5
  197. package/payload/server/public/tasks.html +6 -6
  198. package/payload/server/server.js +73 -19
  199. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.br +0 -0
  200. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.gz +0 -0
  201. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.br +0 -0
  202. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.gz +0 -0
  203. package/payload/server/public/assets/activity-AaFvfwrZ.js.br +0 -0
  204. package/payload/server/public/assets/activity-AaFvfwrZ.js.gz +0 -0
  205. package/payload/server/public/assets/admin-Bz34CZqL.js.br +0 -0
  206. package/payload/server/public/assets/admin-Bz34CZqL.js.gz +0 -0
  207. package/payload/server/public/assets/agents-N0z7qg8a.js.br +0 -0
  208. package/payload/server/public/assets/agents-N0z7qg8a.js.gz +0 -0
  209. package/payload/server/public/assets/browser-_k-v0iky.js.br +0 -0
  210. package/payload/server/public/assets/browser-_k-v0iky.js.gz +0 -0
  211. package/payload/server/public/assets/calendar-D_DvVRJS.js.br +0 -0
  212. package/payload/server/public/assets/calendar-D_DvVRJS.js.gz +0 -0
  213. package/payload/server/public/assets/chat-BbAsvXL_.js +0 -1
  214. package/payload/server/public/assets/chat-BbAsvXL_.js.br +0 -1
  215. package/payload/server/public/assets/chat-BbAsvXL_.js.gz +0 -0
  216. package/payload/server/public/assets/chevron-left-trZmu0ZU.js +0 -1
  217. package/payload/server/public/assets/chevron-left-trZmu0ZU.js.br +0 -0
  218. package/payload/server/public/assets/chevron-right-BiGJuNSX.js +0 -1
  219. package/payload/server/public/assets/chevron-right-BiGJuNSX.js.br +0 -0
  220. package/payload/server/public/assets/clock-DAeRdj4p.js +0 -1
  221. package/payload/server/public/assets/clock-DAeRdj4p.js.br +0 -0
  222. package/payload/server/public/assets/clock-DAeRdj4p.js.gz +0 -0
  223. package/payload/server/public/assets/copy-BDoxl3Oi.js.br +0 -0
  224. package/payload/server/public/assets/copy-BDoxl3Oi.js.gz +0 -0
  225. package/payload/server/public/assets/data-DB6T1I-w.js +0 -1
  226. package/payload/server/public/assets/data-DB6T1I-w.js.br +0 -1
  227. package/payload/server/public/assets/data-DB6T1I-w.js.gz +0 -0
  228. package/payload/server/public/assets/file-text-DRGn4gjH.js.br +0 -0
  229. package/payload/server/public/assets/file-text-DRGn4gjH.js.gz +0 -0
  230. package/payload/server/public/assets/graph-D7ECsLPs.js.br +0 -0
  231. package/payload/server/public/assets/graph-D7ECsLPs.js.gz +0 -0
  232. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.br +0 -0
  233. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.gz +0 -0
  234. package/payload/server/public/assets/operator-jSdha7TP.js.br +0 -0
  235. package/payload/server/public/assets/operator-jSdha7TP.js.gz +0 -0
  236. package/payload/server/public/assets/page-Cq4SkWbr.js.br +0 -0
  237. package/payload/server/public/assets/page-Cq4SkWbr.js.gz +0 -0
  238. package/payload/server/public/assets/page-DrwRXi3K.js.br +0 -0
  239. package/payload/server/public/assets/page-DrwRXi3K.js.gz +0 -0
  240. package/payload/server/public/assets/play-CWyPEXiB.js +0 -1
  241. package/payload/server/public/assets/play-CWyPEXiB.js.br +0 -0
  242. package/payload/server/public/assets/play-CWyPEXiB.js.gz +0 -0
  243. package/payload/server/public/assets/public-D7MfkWvM.js.br +0 -0
  244. package/payload/server/public/assets/public-D7MfkWvM.js.gz +0 -0
  245. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.br +0 -0
  246. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.gz +0 -0
  247. package/payload/server/public/assets/routines-XTk0vJUD.js.br +0 -0
  248. package/payload/server/public/assets/routines-XTk0vJUD.js.gz +0 -0
  249. package/payload/server/public/assets/skills-sjTaAr0v.js.br +0 -0
  250. package/payload/server/public/assets/skills-sjTaAr0v.js.gz +0 -0
  251. package/payload/server/public/assets/tasks-D0-qwWZR.js.br +0 -0
  252. package/payload/server/public/assets/tasks-D0-qwWZR.js.gz +0 -0
  253. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.br +0 -0
  254. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.gz +0 -0
  255. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.br +0 -0
  256. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.gz +0 -0
  257. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.br +0 -0
  258. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.br +0 -0
  259. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.gz +0 -0
  260. package/payload/server/public/assets/wrench-BBl51xDU.js.br +0 -0
  261. package/payload/server/public/assets/wrench-BBl51xDU.js.gz +0 -0
  262. /package/payload/server/public/assets/{useMediaQuery-q9BSy1Ld.js → useMediaQuery-BYIHo-xL.js} +0 -0
  263. /package/payload/server/public/assets/{useMediaQuery-q9BSy1Ld.js.br → useMediaQuery-BYIHo-xL.js.br} +0 -0
  264. /package/payload/server/public/assets/{useMediaQuery-q9BSy1Ld.js.gz → useMediaQuery-BYIHo-xL.js.gz} +0 -0
@@ -0,0 +1,102 @@
1
+ // Task 2342 — a public agent owns the `## Instruction` block of the turns it
2
+ // answers. install-defaults runs on upgrade, so this pass is what gives every
3
+ // agent created before the file existed a file of its own. Filesystem fixtures
4
+ // under a tmp dir; no installer side effects. Runs under `node --test dist/__tests__/*`.
5
+ import test from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, existsSync, rmSync, statSync, chmodSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { seedPublicInstructionFiles } from "../public-instruction-seed.js";
11
+ function makeAccount() {
12
+ const dir = mkdtempSync(join(tmpdir(), "pub-instr-2342-"));
13
+ mkdirSync(join(dir, "agents"), { recursive: true });
14
+ return dir;
15
+ }
16
+ function agent(accountDir, slug, files) {
17
+ const d = join(accountDir, "agents", slug);
18
+ mkdirSync(d, { recursive: true });
19
+ for (const [name, body] of Object.entries(files))
20
+ writeFileSync(join(d, name), body);
21
+ }
22
+ test("creates a zero-byte INSTRUCTION.md for an agent that has none", () => {
23
+ const acct = makeAccount();
24
+ try {
25
+ agent(acct, "beagle", { "config.json": "{}", "SOUL.md": "s" });
26
+ const out = seedPublicInstructionFiles(acct);
27
+ assert.deepEqual(out.map((r) => [r.slug, r.action, r.bytes]), [["beagle", "created", 0]]);
28
+ const p = join(acct, "agents", "beagle", "INSTRUCTION.md");
29
+ assert.equal(existsSync(p), true);
30
+ assert.equal(statSync(p).size, 0);
31
+ }
32
+ finally {
33
+ rmSync(acct, { recursive: true, force: true });
34
+ }
35
+ });
36
+ test("never overwrites an operator's file, and reports its size", () => {
37
+ const acct = makeAccount();
38
+ try {
39
+ agent(acct, "beagle", { "config.json": "{}", "INSTRUCTION.md": "Ask for the trip.\n" });
40
+ const out = seedPublicInstructionFiles(acct);
41
+ assert.deepEqual(out.map((r) => [r.slug, r.action]), [["beagle", "preserved"]]);
42
+ assert.equal(readFileSync(join(acct, "agents", "beagle", "INSTRUCTION.md"), "utf-8"), "Ask for the trip.\n");
43
+ assert.equal(out[0].bytes, 18);
44
+ }
45
+ finally {
46
+ rmSync(acct, { recursive: true, force: true });
47
+ }
48
+ });
49
+ // installDefaults seeds agents/admin/INSTRUCTION.md from its own template
50
+ // immediately before this pass runs; reaching it here would report a file this
51
+ // pass did not handle.
52
+ test("skips admin, and skips a directory with no config.json", () => {
53
+ const acct = makeAccount();
54
+ try {
55
+ agent(acct, "admin", { "config.json": "{}", "IDENTITY.md": "i" });
56
+ agent(acct, "public", { "IDENTITY.md": "i" });
57
+ const out = seedPublicInstructionFiles(acct);
58
+ assert.deepEqual(out, []);
59
+ assert.equal(existsSync(join(acct, "agents", "admin", "INSTRUCTION.md")), false);
60
+ assert.equal(existsSync(join(acct, "agents", "public", "INSTRUCTION.md")), false);
61
+ }
62
+ finally {
63
+ rmSync(acct, { recursive: true, force: true });
64
+ }
65
+ });
66
+ // writeInstallDefaults runs on every upgrade. One unwritable agent directory
67
+ // must not abort the install, and must not pass as done either.
68
+ test("reports write-failed instead of throwing when the agent dir is read-only", () => {
69
+ const acct = makeAccount();
70
+ try {
71
+ agent(acct, "beagle", { "config.json": "{}" });
72
+ agent(acct, "clerk", { "config.json": "{}" });
73
+ chmodSync(join(acct, "agents", "beagle"), 0o500);
74
+ const out = seedPublicInstructionFiles(acct).sort((a, b) => a.slug.localeCompare(b.slug));
75
+ assert.deepEqual(out.map((r) => [r.slug, r.action]), [["beagle", "write-failed"], ["clerk", "created"]]);
76
+ // The pass continued past the failure: the later agent still got its file.
77
+ assert.equal(existsSync(join(acct, "agents", "clerk", "INSTRUCTION.md")), true);
78
+ }
79
+ finally {
80
+ chmodSync(join(acct, "agents", "beagle"), 0o700);
81
+ rmSync(acct, { recursive: true, force: true });
82
+ }
83
+ });
84
+ test("handles several agents in one pass and returns [] for an account with no agents dir", () => {
85
+ const acct = makeAccount();
86
+ try {
87
+ agent(acct, "beagle", { "config.json": "{}" });
88
+ agent(acct, "clerk", { "config.json": "{}", "INSTRUCTION.md": "x" });
89
+ const out = seedPublicInstructionFiles(acct).sort((a, b) => a.slug.localeCompare(b.slug));
90
+ assert.deepEqual(out.map((r) => [r.slug, r.action]), [["beagle", "created"], ["clerk", "preserved"]]);
91
+ }
92
+ finally {
93
+ rmSync(acct, { recursive: true, force: true });
94
+ }
95
+ const bare = mkdtempSync(join(tmpdir(), "pub-instr-bare-"));
96
+ try {
97
+ assert.deepEqual(seedPublicInstructionFiles(bare), []);
98
+ }
99
+ finally {
100
+ rmSync(bare, { recursive: true, force: true });
101
+ }
102
+ });
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ import { validateTierFlag, validateEntitlementBase64, applyTierToAccountConfig,
11
11
  import { parseOsRelease, isUbuntuLike as isUbuntuLikePure, parseAptCacheCandidate, decideAptResolution, } from "./apt-resolve.js";
12
12
  import { findPeerBrandOnDefaultNeo4jPort } from "./peer-brand-detect.js";
13
13
  import { removeClientAdminsKey } from "./converge-client-admins.js";
14
+ import { seedPublicInstructionFiles } from "./public-instruction-seed.js";
14
15
  import { backupHouseCloudflare, restoreHouseCloudflare, migrateHouseCredentialFromAccount, } from "./preserve-house-cloudflare.js";
15
16
  import { resolveNeo4jPidfileScrub } from "./neo4j-pidfile-scrub.js";
16
17
  import { runInitLogging } from "./init-logging.js";
@@ -3554,6 +3555,15 @@ function writeInstallDefaults(accountId) {
3554
3555
  }
3555
3556
  console.log(` [install-defaults] public-identity path=${publicIdentityDst}`);
3556
3557
  logFile(` [install-defaults] public-identity path=${publicIdentityDst}`);
3558
+ // Task 2342 — each public agent's own INSTRUCTION.md, created empty and never
3559
+ // overwritten. install-defaults runs on upgrade, which is what backfills the
3560
+ // agents created before this file existed. Placed after the public-identity
3561
+ // block so the log reads in the same order the files are made.
3562
+ for (const seeded of seedPublicInstructionFiles(accountDir)) {
3563
+ const line = ` [install-defaults] public-instruction-md ${seeded.action} path=${seeded.path} bytes=${seeded.bytes}`;
3564
+ console.log(line);
3565
+ logFile(line);
3566
+ }
3557
3567
  }
3558
3568
  /**
3559
3569
  * Commercial-mode entitlement delivery (Task 240). Writes the decoded payload
@@ -0,0 +1,70 @@
1
+ // Task 2342 — every public agent owns the `## Instruction` block of the channel
2
+ // turns it answers, at agents/<slug>/INSTRUCTION.md. Before 2342 that block was
3
+ // read from agents/admin/INSTRUCTION.md whoever the turn woke, so a visitor's
4
+ // turn carried the operator's own operating doctrine.
5
+ //
6
+ // The file is created EMPTY. An empty file resolves 'absent' at the resolver and
7
+ // refuses the turn, which is the intended closed state for an agent whose
8
+ // per-turn behaviour nobody has written; seeding any text would make that text
9
+ // the instruction on every account that never edits it, which is the
10
+ // arrangement 2342 removes. It is never overwritten, so an operator's own file
11
+ // survives every upgrade.
12
+ //
13
+ // A public agent is a directory holding a config.json. `agents/public/` is the
14
+ // template holder installDefaults writes IDENTITY.md into and has no
15
+ // config.json, so it is skipped without needing to be named. `admin` is named
16
+ // because it does carry one on some installs, and installDefaults seeds its
17
+ // file from a template directly before calling this.
18
+ import { existsSync, readdirSync, statSync, writeFileSync } from "node:fs";
19
+ import { join } from "node:path";
20
+ export function seedPublicInstructionFiles(accountDir) {
21
+ const out = [];
22
+ const agentsDir = join(accountDir, "agents");
23
+ let entries = [];
24
+ try {
25
+ entries = readdirSync(agentsDir);
26
+ }
27
+ catch {
28
+ return out;
29
+ }
30
+ for (const slug of entries) {
31
+ if (slug.startsWith(".") || slug === "admin")
32
+ continue;
33
+ const dir = join(agentsDir, slug);
34
+ try {
35
+ if (!statSync(dir).isDirectory())
36
+ continue;
37
+ }
38
+ catch {
39
+ continue;
40
+ }
41
+ if (!existsSync(join(dir, "config.json")))
42
+ continue;
43
+ const path = join(dir, "INSTRUCTION.md");
44
+ if (existsSync(path)) {
45
+ let bytes = 0;
46
+ try {
47
+ bytes = statSync(path).size;
48
+ }
49
+ catch {
50
+ bytes = 0;
51
+ }
52
+ out.push({ slug, action: "preserved", path, bytes });
53
+ continue;
54
+ }
55
+ // Guarded like the two reads above, and for the same reason: this runs
56
+ // inside writeInstallDefaults on every upgrade, and one agent directory the
57
+ // installer cannot write must not abort the install part-way. The sibling
58
+ // admin-instruction block does the same. The failure is reported rather
59
+ // than skipped, so it reaches the install log instead of passing as done.
60
+ try {
61
+ writeFileSync(path, "");
62
+ }
63
+ catch {
64
+ out.push({ slug, action: "write-failed", path, bytes: 0 });
65
+ continue;
66
+ }
67
+ out.push({ slug, action: "created", path, bytes: 0 });
68
+ }
69
+ return out;
70
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.543",
3
+ "version": "0.1.544",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -256,6 +256,7 @@ Tools are available via the `admin` MCP server.
256
256
  | Compose a business document | User asks to write or draft a proposal, report (market / analysis / strategic), brief, memo, white paper, plan (non-fundraise), or case study | `skills/professional-document/SKILL.md` |
257
257
  | Manage admin users | User asks to add, remove, or list admins on this account, or change an admin PIN | `skills/admin-user-management/SKILL.md` |
258
258
  | Session reset / continue / resume | User asks to clear the session, start fresh, continue the last session, or pick up where they left off | `skills/session-management/SKILL.md` |
259
+ | Set up channel message handling | Owner asks to set up or change what the agent does with incoming channel messages, asks why an incoming message got no answer, or reports the agent replying to someone it should not have | `skills/channel-instruction/SKILL.md` |
259
260
  | Show or download a file | User asks to view, attach, or download a file or document, or the current turn produces a document the owner needs to review | `skills/file-presentation/SKILL.md` |
260
261
  | Upgrade Maxy | User asks to upgrade, update, install the latest version, or accepts an upgrade offer | `skills/upgrade/SKILL.md` |
261
262
  | Run a structured sprint without `gstack` | User asks to run a sprint, execute a `.tasks/NNN-*.md`, or invokes "superpowers sprint" / "sprint without gstack" | `skills/superpowers-sprint/SKILL.md` |
@@ -273,6 +274,7 @@ Tools are available via the `admin` MCP server.
273
274
  - `hooks/webfetch-preflight.mjs` — short-circuits WebFetch on JS-SPA shells with a structured `WEBFETCH_CANNOT_READ_JS_SPA` error so the agent surfaces a loud failure to the owner instead of paying the 60s extraction timeout. Fail-open on any internal error.
274
275
  - `hooks/askuserquestion-investigate-gate.sh` — PreToolUse matcher=`AskUserQuestion`. Blocks the question (exit 2) when no read-only investigation tool has fired since the latest real user turn in the session JSONL. The structural fix for the failure class where the agent fabricates a menu before evidence-gathering (session `c085ec2c-46fb-4b73-8865-68cf85866ea8` 2026-05-22 — "change remote access password" → invented options "Admin PIN / Cloudflare tunnel / WiFi password" with zero prior tool_use; post-correction the agent immediately fired `remote-auth-status` → `ToolSearch` → `remote-auth-set-password`, proving it knew the moves). **Allowlist** (exact, with trailing `__<tool>` suffix-match for namespaced `mcp__plugin_<plugin>_<server>__<tool>` aliases): `ToolSearch`, `Grep`, `Glob`, `Read`, `LS`, `NotebookRead`, `Bash`, `WebFetch`, `WebSearch`, plus the read-only admin / memory MCP tools (`*-status`, `*-list`, `*-read`, `skill-find`, `memory-find-candidates`, `profile-read`, `conversation-list`, `memory-list-attachments`, `memory-read-attachment`). **Block message:** `Blocked: AskUserQuestion requires at least one investigation tool (ToolSearch, Grep, Read, *-list, *-status, *-read, skill-find, ...) earlier in this turn. Search the operator's literal phrase first.` **Log line** (stderr, one per call): `[ask-gate] decision=<allow|block> sessionId=<id8> seen=<csv|-> reason=<allowlist-hit|no-investigation|fail-open-no-transcript|fail-open-parse-error>`. **Fail-open** on missing transcript or parse error — nudges, never bricks the UI.
275
276
  - `hooks/askuserquestion-channel-carrier-gate.sh` — PreToolUse matcher=`AskUserQuestion`, registered as a **second command on the same matcher** as the investigate-gate (either exit 2 blocks; the two guard different conditions). Blocks the question (exit 2) when the session has a native channel attached, because the Claude Code channel protocol carries only the two permission methods — there is no carrier for the `AskUserQuestion` elicitation, so on an rc-spawn channel (webchat/WhatsApp/Telegram) session the harness would block the turn awaiting a selection that can never arrive and the reader renders only delivered replies, wedging the turn (live SiteDesk incident session `1a085718` 2026-07-11: `/chat` stalled on the delivered "On it…" ack with no card). **Signal:** the rc-spawn writes the channel MCP registration as a config file in `os.tmpdir()` keyed by session id (`maxy-channel-<sid>.json` / `maxy-webchat-channel-<sid>.json` / `maxy-wa-channel-<sid>.json` / `maxy-telegram-channel-<sid>.json`, `sid` sanitized `[^A-Za-z0-9_-]→_` exactly as the writers do); its presence at tool-call time is the authoritative "channel attached to this session" marker. The hook resolves the tmpdir the way Node's `os.tmpdir()` does (`${TMPDIR:-/tmp}`, trailing slash stripped). Correct in both readings of the claude.ai/code scoping question: a Pi channel process sees the tmpfile (block); a claude.ai/code process on another host never sees the Pi tmpfile (fail-open → allow, that surface can answer the card). **Block message:** `Blocked: this is a native-channel session and AskUserQuestion cannot be delivered over a channel (the channel protocol carries no elicitation card, so the turn would wedge). Ask the same question as prose in your channel reply tool and wait for the operator's next message.` **Log line** (stderr, one per decisive call): `[ask-channel] decision=<allow|block> sessionId=<id8> channel=<attached|none> reason=<channel-attached|no-channel|fail-open-no-envelope|fail-open-no-session>`. **Fail-open** on no envelope, blank session id, or absent channel file — nudges, never bricks the UI. The complementary standing check (`interactive-wedge` in the session manager) catches any un-carried interactive tool_use that slips past this hook; it scans every account's project-slug (not just the boot slug), so a client sub-account channel wedge is covered too. **Reach on upgrade:** `provision-account-dir.sh` writes this matcher only at account-provision time, and the upgrade path re-provisions only the house account — so an account provisioned before this gate landed keeps a stale matcher and re-wedges (live SiteDesk recurrence session `d39a22b0`, account `2078cb54`, 2026-07-15). `setup-account.sh` runs `reconcile_all_accounts_askgate` (`platform/scripts/lib/account-settings-askgate.sh`) on every install to retrofit the carrier gate onto every existing account's `settings.json` — idempotent surgical jq patch of the `AskUserQuestion` matcher, one `[backfill-1683] file=<f> status=<absent|no-hooks|already-set|updated|rewrite-failed>` line per account, contents never echoed.
277
+ - `hooks/public-tool-surface.sh` — **PreToolUse matcher-less (every tool) + UserPromptSubmit + Stop.** Records the tool surface a `role='public'` spawn REALISES, which nothing recorded before: `tool-allowlist` records the surface a spawn was given, and `[public-surface] op=audit` reconciles MCP server names from spawn-tee filenames, so it is blind to `Read`, `Bash`, `Skill` and `ToolSearch` (no MCP child, no tee file). On 2026-08-01 five such tools ran in a session spawned with `--allowed-tools mcp__whatsapp-channel__reply --strict-mcp-config --permission-mode dontAsk` and produced no line. **Input:** `MAXY_PUBLIC_ALLOWED_TOOLS`, stamped by both spawn paths (`http-server.ts` rc-spawn, `pty-spawner.ts`) for `role='public'` only, carrying that spawn's final `--allowed-tools` argv set comma-joined. Absent means not a public spawn: the hook exits 0 in silence. **Log lines** (server.log only — a visitor's PTY gains no output): `[public-surface] op=tool-realised sessionId=<id8> tool=<name> allowed=<y|n>` per call, `allowed` being exact membership of the stamped set; `[public-surface] op=realised-census sessionId=<id8> calls=<n> disallowed=<n>` at Stop, emitted including zero so a session with no disallowed call is distinguishable from one the hook never saw. Per-call tallies are appends to `<logdir>/public-surface/<sanitised-session-id>`, removed by the census, so no counter mutex is needed. The `UserPromptSubmit` registration is the turn-start reset and emits nothing: the stuck-turn recycler kills a wedged PTY and resumes the SAME session id, so that turn's `Stop` never fires and its tally would otherwise be counted into the next turn's census (measured: three calls in a killed turn plus one call in the next reported `calls=4 disallowed=3`). **Never blocks:** exit 0 on every path, including unparseable stdin, absent `session_id`, missing `python3` and an unwritable log. **Reach on upgrade:** `provision-account-dir.sh` writes both entries only at account-provision time, so `setup-account.sh` runs `reconcile_all_accounts_public_surface` (`platform/scripts/lib/account-settings-public-surface.sh`) on every install to retrofit them onto every existing account, one `[backfill-2339] file=<f> status=<absent|no-hooks|already-set|updated|rewrite-failed>` line per account, contents never echoed.
276
278
  - `hooks/mcp-tool-missing.sh` — **PostToolUse hook on `mcp__.*` (directive 3).** Defence-in-depth for the `No such tool available: mcp__…` failure class that the name-binding is built to eliminate. Fires on any MCP tool call; no-op unless the `tool_response` carries `No such tool available` AND the qualified name resolves to a maxy plugin (read from the generated `hooks/lib/maxy-mcp-plugins.txt`). On a maxy match it logs one deterministic `[mcp-tool-missing] server=<server> tool=<tool>` line and exits 2 with a fixed envelope on stderr, so the agent relays a named server-unavailable failure instead of narrating "warming up" or blind-retrying. A missing non-maxy bridge tool (Playwright etc., upstream-owned) passes through (exit 0). The maxy-plugin list is regenerated and gate-diffed by `platform/scripts/check-canonical-tool-names.mjs`.
277
279
  - `hooks/post-tool-use-agent.sh` — **PostToolUse hook on `Agent`.** Drains any subagent hook-decision buffers under `~/.maxy-code/logs/hook-decisions/` modified since this parent's previous PostToolUse-Agent fire (cursor file keyed by parent session id), prints one `[hook-propagate]` line per record to stdout — Claude Code attaches the stdout as a `hook_success` attachment on the parent JSONL, making the records grep-queryable from the parent session alone. Rotates consumed buffers to `consumed/`. Emits one `[hook-propagate-census] parentSession=<…> subagentHooksObserved=<N> attachmentsEmitted=<M>` line per fire to stdout and server.log; `N != M` is the propagation regression signal. The companion emitter library `hooks/lib/hook-emit.sh` is sourced by `post-tool-use-agent.sh` and any other hook that records a block decision (4 KB stderr truncation, `truncated=true` set on the record).
278
280
  - `hooks/admin-authoring-observer.sh` — **PostToolUse hook on Write and Edit.** Observation only — never blocks; exits 0 on every path. Fires when the admin agent (not a specialist subagent — gated by `MAXY_SPECIALIST` env) writes or edits a file under `<accountDir>/output/`. Walks the session transcript from the latest real-user turn forward to detect any prior `Task` `tool_use` whose `subagent_type` starts with `specialists:`. Emits one stderr line `[admin-authoring] inline-write path=<rel> priorSpecialistSpawnInTurn=<true|false|unknown>`. A `false` value on a long-form prose file is the regression signal this hook was designed to make visible — the BioSymm proposal session (admin authored a customer-facing proposal inline despite content-producer being installed) is the failure mode this surfaces mechanically. Mechanical enforcement (refuse the write, force a re-spawn) is deferred per the task spec.
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env bash
2
+ # Regression test for public-tool-surface.sh (Task 2339).
3
+ #
4
+ # The hook records the tool surface a public spawn REALISES: one line per tool
5
+ # call classified against that spawn's own --allowed-tools set, and a per-turn
6
+ # census. It is observability only and must never block, so every case here
7
+ # asserts exit 0 as well as the emitted line.
8
+
9
+ set -u
10
+
11
+ HOOK="$(cd "$(dirname "$0")/.." && pwd)/public-tool-surface.sh"
12
+ if [[ ! -x "$HOOK" ]]; then
13
+ echo "FAIL: $HOOK not executable" >&2
14
+ exit 1
15
+ fi
16
+
17
+ PASS=0
18
+ FAIL=0
19
+ ok() { echo "PASS: $1"; PASS=$((PASS+1)); }
20
+ bad() { echo "FAIL: $1" >&2; FAIL=$((FAIL+1)); }
21
+
22
+ SID=aa11bb22-cccc-dddd-eeee-ffff00001111
23
+ ALLOW='mcp__whatsapp-channel__reply'
24
+
25
+ # newlog -> prints a fresh LOG_DIR
26
+ newlog() { local d; d=$(mktemp -d); printf '%s' "$d"; }
27
+
28
+ # fire <logdir> <env-allowlist|-> <stdin-json> -> prints exit code; log at $1/server.log
29
+ fire() {
30
+ local d="$1" allow="$2" input="$3" rc
31
+ if [[ "$allow" == "-" ]]; then
32
+ printf '%s' "$input" | env -u MAXY_PUBLIC_ALLOWED_TOOLS LOG_DIR="$d" bash "$HOOK" >/dev/null 2>&1
33
+ else
34
+ printf '%s' "$input" | env MAXY_PUBLIC_ALLOWED_TOOLS="$allow" LOG_DIR="$d" bash "$HOOK" >/dev/null 2>&1
35
+ fi
36
+ rc=$?
37
+ printf '%s' "$rc"
38
+ }
39
+
40
+ pre() { printf '{"hook_event_name":"PreToolUse","tool_name":"%s","session_id":"%s"}' "$1" "$SID"; }
41
+ stop() { printf '{"hook_event_name":"Stop","session_id":"%s"}' "$SID"; }
42
+ ups() { printf '{"hook_event_name":"UserPromptSubmit","session_id":"%s","prompt":"hi"}' "$SID"; }
43
+
44
+ # --- 1. allowed tool -------------------------------------------------------
45
+ D=$(newlog)
46
+ RC=$(fire "$D" "$ALLOW" "$(pre "$ALLOW")")
47
+ if [[ "$RC" == "0" ]]; then ok "allowed tool exits 0"; else bad "allowed tool exit $RC"; fi
48
+ if /usr/bin/grep -qF "[public-surface] op=tool-realised sessionId=aa11bb22 tool=$ALLOW allowed=y" "$D/server.log"; then
49
+ ok "allowed tool logs allowed=y"
50
+ else
51
+ bad "allowed=y line absent"
52
+ fi
53
+
54
+ # --- 2. disallowed native tool ---------------------------------------------
55
+ D=$(newlog)
56
+ RC=$(fire "$D" "$ALLOW" "$(pre Bash)")
57
+ if [[ "$RC" == "0" ]]; then ok "disallowed tool exits 0"; else bad "disallowed tool exit $RC"; fi
58
+ if /usr/bin/grep -qF "[public-surface] op=tool-realised sessionId=aa11bb22 tool=Bash allowed=n" "$D/server.log"; then
59
+ ok "disallowed tool logs allowed=n"
60
+ else
61
+ bad "allowed=n line absent"
62
+ fi
63
+
64
+ # --- 3. no env stamp -> silent ---------------------------------------------
65
+ D=$(newlog)
66
+ RC=$(fire "$D" "-" "$(pre Bash)")
67
+ if [[ "$RC" == "0" ]]; then ok "unstamped session exits 0"; else bad "unstamped exit $RC"; fi
68
+ if [[ ! -f "$D/server.log" ]]; then ok "unstamped session writes nothing"; else bad "unstamped session wrote a log"; fi
69
+
70
+ # --- 4. census with zero calls ---------------------------------------------
71
+ D=$(newlog)
72
+ RC=$(fire "$D" "$ALLOW" "$(stop)")
73
+ if [[ "$RC" == "0" ]]; then ok "zero-call census exits 0"; else bad "zero-call census exit $RC"; fi
74
+ if /usr/bin/grep -qF "[public-surface] op=realised-census sessionId=aa11bb22 calls=0 disallowed=0" "$D/server.log"; then
75
+ ok "census is emitted at zero"
76
+ else
77
+ bad "zero census absent"
78
+ fi
79
+
80
+ # --- 5. census after one allowed and one disallowed call -------------------
81
+ D=$(newlog)
82
+ fire "$D" "$ALLOW" "$(pre "$ALLOW")" >/dev/null
83
+ fire "$D" "$ALLOW" "$(pre Bash)" >/dev/null
84
+ fire "$D" "$ALLOW" "$(stop)" >/dev/null
85
+ if /usr/bin/grep -qF "[public-surface] op=realised-census sessionId=aa11bb22 calls=2 disallowed=1" "$D/server.log"; then
86
+ ok "census counts calls and disallowed"
87
+ else
88
+ bad "census counts wrong"
89
+ fi
90
+ if [[ -z "$(ls -A "$D/public-surface" 2>/dev/null)" ]]; then
91
+ ok "census removes the tally"
92
+ else
93
+ bad "tally survived the census"
94
+ fi
95
+
96
+ # --- 6. a second turn starts from zero -------------------------------------
97
+ D=$(newlog)
98
+ fire "$D" "$ALLOW" "$(pre Bash)" >/dev/null
99
+ fire "$D" "$ALLOW" "$(stop)" >/dev/null
100
+ fire "$D" "$ALLOW" "$(stop)" >/dev/null
101
+ if [[ "$(/usr/bin/grep -cF 'op=realised-census sessionId=aa11bb22 calls=0 disallowed=0' "$D/server.log")" == "1" ]]; then
102
+ ok "the turn after a census starts from zero"
103
+ else
104
+ bad "second census did not reset"
105
+ fi
106
+
107
+ # --- 7. unparseable stdin --------------------------------------------------
108
+ D=$(newlog)
109
+ RC=$(fire "$D" "$ALLOW" 'not json at all')
110
+ if [[ "$RC" == "0" ]]; then ok "unparseable stdin exits 0"; else bad "unparseable stdin exit $RC"; fi
111
+ if [[ ! -f "$D/server.log" ]]; then ok "unparseable stdin writes nothing"; else bad "unparseable stdin wrote a log"; fi
112
+
113
+ # --- 8. a tool name containing a glob is compared literally -----------------
114
+ D=$(newlog)
115
+ RC=$(fire "$D" "$ALLOW" "$(pre '*')")
116
+ if /usr/bin/grep -qF "tool=* allowed=n" "$D/server.log"; then
117
+ ok "a glob tool name is compared literally, not expanded"
118
+ else
119
+ bad "glob tool name mishandled"
120
+ fi
121
+
122
+ # --- 9. multi-entry allowlist ----------------------------------------------
123
+ D=$(newlog)
124
+ fire "$D" "Read,$ALLOW" "$(pre Read)" >/dev/null
125
+ if /usr/bin/grep -qF "tool=Read allowed=y" "$D/server.log"; then
126
+ ok "membership matches any entry of a multi-entry allowlist"
127
+ else
128
+ bad "multi-entry allowlist mismatch"
129
+ fi
130
+
131
+ # --- 10. absent session_id still emits -------------------------------------
132
+ D=$(newlog)
133
+ fire "$D" "$ALLOW" '{"hook_event_name":"PreToolUse","tool_name":"Bash"}' >/dev/null
134
+ if /usr/bin/grep -qF "sessionId=none tool=Bash allowed=n" "$D/server.log"; then
135
+ ok "a call with no session_id is still recorded"
136
+ else
137
+ bad "no-session call was silent"
138
+ fi
139
+
140
+ # --- 11. a killed turn leaves no residue in the next turn's census ---------
141
+ # The stuck-turn recycler kills a wedged PTY and resumes the SAME sessionId, so
142
+ # the killed turn's Stop never fires. Without a turn-start reset its tally is
143
+ # inherited and the next census over-counts, which is exactly the number the
144
+ # task's verification asserts against that turn's tool_use count.
145
+ D=$(newlog)
146
+ for t in Bash Read ToolSearch; do fire "$D" "$ALLOW" "$(pre "$t")" >/dev/null; done
147
+ # no Stop: the turn was killed here.
148
+ fire "$D" "$ALLOW" "$(ups)" >/dev/null
149
+ fire "$D" "$ALLOW" "$(pre "$ALLOW")" >/dev/null
150
+ fire "$D" "$ALLOW" "$(stop)" >/dev/null
151
+ if /usr/bin/grep -qF "op=realised-census sessionId=aa11bb22 calls=1 disallowed=0" "$D/server.log"; then
152
+ ok "a killed turn's tally does not leak into the next turn's census"
153
+ else
154
+ bad "census inherited a killed turn's tally"
155
+ fi
156
+
157
+ # --- 12. the turn-start reset is silent and never blocks --------------------
158
+ D=$(newlog)
159
+ RC=$(fire "$D" "$ALLOW" "$(ups)")
160
+ if [[ "$RC" == "0" ]]; then ok "turn-start reset exits 0"; else bad "turn-start reset exit $RC"; fi
161
+ if [[ ! -f "$D/server.log" ]]; then ok "turn-start reset writes no log line"; else bad "turn-start reset wrote a log line"; fi
162
+
163
+ echo "----"
164
+ echo "PASS=$PASS FAIL=$FAIL"
165
+ # The count is asserted, not just the failures: a case that stops running leaves
166
+ # a green suite that tested less than it claims, and .husky/pre-commit reads only
167
+ # the exit status.
168
+ EXPECTED=19
169
+ if [[ $((PASS+FAIL)) -ne "$EXPECTED" ]]; then
170
+ echo "FAIL: expected $EXPECTED cases, ran $((PASS+FAIL))" >&2
171
+ exit 1
172
+ fi
173
+ [[ "$FAIL" -eq 0 ]]
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ # public-tool-surface.sh — Task 2339. Records the tool surface a public spawn
3
+ # REALISES: one line per tool call, plus a per-turn census.
4
+ #
5
+ # `tool-allowlist` (rc-public-lockdown.ts, pty-spawner.ts) records the surface a
6
+ # spawn was GIVEN. `[public-surface] op=audit` (public-surface-audit.ts)
7
+ # reconciles MCP server names from spawn-tee filenames, so it is structurally
8
+ # blind to Read, Bash, Skill and ToolSearch: those spawn no MCP child and write
9
+ # no tee file. On 2026-08-01 five such tools ran in a session spawned with a
10
+ # one-tool allowlist and produced no log line at all.
11
+ #
12
+ # Registered on the matcher-less PreToolUse entry (which matches every tool,
13
+ # native and MCP alike) and on the Stop entry. Fires only when
14
+ # MAXY_PUBLIC_ALLOWED_TOOLS is set, which both spawn paths stamp for
15
+ # role='public' only.
16
+ #
17
+ # Observability only: never blocks, exits 0 on every path, and writes to
18
+ # server.log alone — a public visitor's PTY gains no new output.
19
+
20
+ set -uo pipefail
21
+
22
+ # No stamp means this is not a public spawn. Silent, and the common case.
23
+ [ -n "${MAXY_PUBLIC_ALLOWED_TOOLS:-}" ] || exit 0
24
+
25
+ # Log destination. LOG_DIR is stamped on the rc-spawn path and is brand-correct;
26
+ # MAXY_HOOK_SERVER_LOG is the override post-tool-use-agent.sh already honours;
27
+ # the literal is that hook's own default.
28
+ if [ -n "${LOG_DIR:-}" ]; then
29
+ : "${MAXY_HOOK_SERVER_LOG:=$LOG_DIR/server.log}"
30
+ fi
31
+ : "${MAXY_HOOK_SERVER_LOG:=$HOME/.maxy-code/logs/server.log}"
32
+ TALLY_DIR="$(dirname "$MAXY_HOOK_SERVER_LOG")/public-surface"
33
+
34
+ emit() {
35
+ mkdir -p "$(dirname "$MAXY_HOOK_SERVER_LOG")" 2>/dev/null || true
36
+ printf '%s\n' "$1" >>"$MAXY_HOOK_SERVER_LOG" 2>/dev/null || true
37
+ }
38
+
39
+ # No stdin (tty) — no call to classify. Fail-open.
40
+ [ -t 0 ] && exit 0
41
+ INPUT=$(cat)
42
+ [ -n "$INPUT" ] || exit 0
43
+
44
+ PARSED=$(printf '%s' "$INPUT" | python3 -c '
45
+ import sys, json
46
+ try:
47
+ d = json.load(sys.stdin)
48
+ except Exception:
49
+ sys.exit(1)
50
+ if not isinstance(d, dict):
51
+ sys.exit(1)
52
+ def s(k):
53
+ v = d.get(k)
54
+ return v if isinstance(v, str) else ""
55
+ print(s("hook_event_name"))
56
+ print(s("tool_name"))
57
+ print(s("session_id"))
58
+ ' 2>/dev/null) || exit 0
59
+
60
+ { IFS= read -r EVENT; IFS= read -r TOOL; IFS= read -r SID; } <<EOF
61
+ $PARSED
62
+ EOF
63
+ EVENT="${EVENT:-}"
64
+ TOOL="${TOOL:-}"
65
+ SID="${SID:-}"
66
+
67
+ # The 8-character form used by every other session-scoped line. An envelope with
68
+ # no session_id still emits: a public session must never be silent, and `none`
69
+ # is visibly not an id.
70
+ SID8="${SID:0:8}"
71
+ [ -n "$SID8" ] || SID8=none
72
+ # Tally filename. Sanitised the way the rc-spawn channel-config writers sanitise
73
+ # theirs, so no session id can escape the directory.
74
+ KEY=$(printf '%s' "${SID:-none}" | tr -c 'A-Za-z0-9_-' '_')
75
+
76
+ if [ "$EVENT" = "UserPromptSubmit" ]; then
77
+ # Turn start. Drop any tally left by a turn that never reached Stop — the
78
+ # stuck-turn recycler kills a wedged PTY and resumes the SAME sessionId, so
79
+ # that turn's Stop never fires and its tally would otherwise be counted into
80
+ # the next turn's census. Silent: the reset is not itself an observation.
81
+ rm -f "$TALLY_DIR/$KEY" 2>/dev/null || true
82
+ exit 0
83
+ fi
84
+
85
+ if [ "$EVENT" = "PreToolUse" ]; then
86
+ [ -n "$TOOL" ] || exit 0
87
+ ALLOWED=n
88
+ # -f so a tool name or allowlist entry containing a glob character is compared
89
+ # literally rather than expanded against the cwd.
90
+ set -f
91
+ OLDIFS=$IFS
92
+ IFS=','
93
+ for t in $MAXY_PUBLIC_ALLOWED_TOOLS; do
94
+ if [ "$t" = "$TOOL" ]; then ALLOWED=y; break; fi
95
+ done
96
+ IFS=$OLDIFS
97
+ set +f
98
+ emit "[public-surface] op=tool-realised sessionId=$SID8 tool=$TOOL allowed=$ALLOWED"
99
+ # Append one line per call rather than read-modify-writing a counter: an
100
+ # append needs no mutex, a counter would need the one hook-emit.sh carries.
101
+ mkdir -p "$TALLY_DIR" 2>/dev/null || true
102
+ printf '%s\n' "$ALLOWED" >>"$TALLY_DIR/$KEY" 2>/dev/null || true
103
+ exit 0
104
+ fi
105
+
106
+ if [ "$EVENT" = "Stop" ]; then
107
+ CALLS=0
108
+ DIS=0
109
+ if [ -f "$TALLY_DIR/$KEY" ]; then
110
+ while IFS= read -r v || [ -n "$v" ]; do
111
+ [ -n "$v" ] || continue
112
+ CALLS=$((CALLS+1))
113
+ if [ "$v" = "n" ]; then DIS=$((DIS+1)); fi
114
+ done <"$TALLY_DIR/$KEY"
115
+ rm -f "$TALLY_DIR/$KEY" 2>/dev/null || true
116
+ fi
117
+ # Emitted including zero, so a public session with no disallowed call is
118
+ # distinguishable from one this hook never saw.
119
+ emit "[public-surface] op=realised-census sessionId=$SID8 calls=$CALLS disallowed=$DIS"
120
+ exit 0
121
+ fi
122
+
123
+ exit 0
@@ -1 +1 @@
1
- {"version":3,"file":"agent-write.d.ts","sourceRoot":"","sources":["../../src/tools/agent-write.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,gBAAgB,GAChB,iBAAiB,GACjB,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CAsDnE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CA4CnE;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB/G"}
1
+ {"version":3,"file":"agent-write.d.ts","sourceRoot":"","sources":["../../src/tools/agent-write.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,gBAAgB,GAChB,iBAAiB,GACjB,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CAkEnE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CA4CnE;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB/G"}
@@ -62,6 +62,14 @@ export function createAgent(args) {
62
62
  writeFileSync(resolve(dir, "SOUL.md"), args.soul);
63
63
  writeFileSync(resolve(dir, "KNOWLEDGE.md"), args.knowledge);
64
64
  writeFileSync(resolve(dir, "config.json"), `${JSON.stringify(config, null, 2)}\n`);
65
+ // Task 2342 — the agent's own turn instruction, created empty. Its whole
66
+ // body becomes the `## Instruction` block of every channel turn this agent
67
+ // answers. Empty resolves 'absent' at the resolver and refuses the turn,
68
+ // which is the correct closed state for an agent whose per-turn behaviour
69
+ // nobody has written yet; before 2342 such a turn silently borrowed
70
+ // agents/admin/INSTRUCTION.md. Written inside this try with the others so
71
+ // the rollback below still leaves no half-made agent.
72
+ writeFileSync(resolve(dir, "INSTRUCTION.md"), "");
65
73
  }
66
74
  catch (err) {
67
75
  // The directory did not exist before this call, so removing it restores the
@@ -70,7 +78,11 @@ export function createAgent(args) {
70
78
  rmSync(dir, { recursive: true, force: true });
71
79
  throw err;
72
80
  }
73
- return { ok: true, slug: args.slug, filesWritten: ["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md", "config.json"] };
81
+ return {
82
+ ok: true,
83
+ slug: args.slug,
84
+ filesWritten: ["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md", "config.json", "INSTRUCTION.md"],
85
+ };
74
86
  }
75
87
  export function updateAgent(args) {
76
88
  const verdict = checkAgentSlug(args.slug);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-write.js","sourceRoot":"","sources":["../../src/tools/agent-write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-write.js","sourceRoot":"","sources":["../../src/tools/agent-write.ts"],"names":[],"mappings":"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"}