@rubytech/create-maxy-code 0.1.280 → 0.1.282

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 (234) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts +31 -43
  3. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/mcp-spawn-tee/dist/index.js +112 -85
  5. package/payload/platform/lib/mcp-spawn-tee/dist/index.js.map +1 -1
  6. package/payload/platform/lib/mcp-spawn-tee/src/__tests__/spawn-tee.test.ts +111 -0
  7. package/payload/platform/lib/mcp-spawn-tee/src/index.ts +113 -84
  8. package/payload/platform/lib/mcp-spawn-tee/tsconfig.json +2 -1
  9. package/payload/platform/plugins/admin/PLUGIN.md +2 -1
  10. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-compliance.test.sh +154 -0
  11. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-directive.test.sh +24 -0
  12. package/payload/platform/plugins/admin/hooks/prompt-optimiser-compliance.sh +174 -0
  13. package/payload/platform/plugins/admin/hooks/prompt-optimiser-directive.sh +22 -2
  14. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +4 -2
  15. package/payload/platform/plugins/business-assistant/skills/e-sign/SKILL.md +378 -56
  16. package/payload/platform/plugins/cloudflare/references/api.md +35 -1
  17. package/payload/platform/plugins/cloudflare/references/d1-data-capture.md +2 -0
  18. package/payload/platform/plugins/docs/references/cloudflare.md +1 -1
  19. package/payload/platform/plugins/docs/references/platform.md +2 -0
  20. package/payload/platform/plugins/email/PLUGIN.md +1 -1
  21. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts +2 -0
  22. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts.map +1 -0
  23. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js +92 -0
  24. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js.map +1 -0
  25. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts +2 -0
  26. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts.map +1 -0
  27. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js +55 -0
  28. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js.map +1 -0
  29. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts +2 -0
  30. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts.map +1 -0
  31. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js +110 -0
  32. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js.map +1 -0
  33. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts +2 -0
  34. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts.map +1 -0
  35. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js +57 -0
  36. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js.map +1 -0
  37. package/payload/platform/plugins/email/mcp/dist/index.js +8 -1
  38. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  39. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +12 -0
  40. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -1
  41. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +44 -5
  42. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -1
  43. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +13 -8
  44. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  45. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +26 -15
  46. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  47. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +8 -0
  48. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -1
  49. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -1
  50. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts +16 -5
  51. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts.map +1 -1
  52. package/payload/platform/plugins/email/mcp/dist/lib/providers.js +120 -13
  53. package/payload/platform/plugins/email/mcp/dist/lib/providers.js.map +1 -1
  54. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +3 -3
  55. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -1
  56. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js +6 -2
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js.map +1 -1
  59. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  60. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +5 -3
  61. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  62. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  63. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +6 -3
  64. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  65. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
  66. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +22 -4
  67. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  68. package/payload/platform/plugins/email/mcp/package.json +4 -2
  69. package/payload/platform/plugins/email/mcp/vitest.config.ts +9 -0
  70. package/payload/platform/plugins/email/references/email-reference.md +22 -5
  71. package/payload/platform/plugins/email/skills/email-composition/SKILL.md +1 -1
  72. package/payload/platform/plugins/graph/PLUGIN.md +2 -0
  73. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts +2 -0
  74. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js +31 -0
  76. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js.map +1 -0
  77. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts +5 -0
  78. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts.map +1 -1
  79. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js +21 -2
  80. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js.map +1 -1
  81. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/SKILL.md +1 -0
  82. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +5 -5
  83. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  84. package/payload/platform/plugins/whatsapp/.claude-plugin/plugin.json +1 -1
  85. package/payload/platform/plugins/whatsapp/PLUGIN.md +7 -11
  86. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +10 -56
  87. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  88. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +26 -2
  89. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +9 -14
  90. package/payload/platform/scripts/setup-account.sh +7 -0
  91. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -2
  93. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  94. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  95. package/payload/platform/services/claude-session-manager/dist/http-server.js +63 -3
  96. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  97. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  98. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +7 -1
  99. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  100. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +6 -0
  101. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  102. package/payload/platform/services/whatsapp-channel/dist/notification.js +14 -0
  103. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  104. package/payload/platform/services/whatsapp-channel/dist/server.js +5 -3
  105. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  106. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  107. package/payload/server/public/assets/AdminShell-FO766lOW.js +1 -0
  108. package/payload/server/public/assets/{Checkbox-2reCESkb.js → Checkbox-syHoU9nY.js} +1 -1
  109. package/payload/server/public/assets/{admin-BpnsTEa3.js → admin-0_VxffD5.js} +1 -1
  110. package/payload/server/public/assets/{arc-BgelqC_3.js → arc-BW1WhwmV.js} +1 -1
  111. package/payload/server/public/assets/architecture-YZFGNWBL-xHbVjatf.js +1 -0
  112. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BabnAZJm.js → architectureDiagram-Q4EWVU46-DsionCio.js} +1 -1
  113. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BJzZqNsy.js → blockDiagram-DXYQGD6D-NOG5yVZk.js} +1 -1
  114. package/payload/server/public/assets/{browser-fgBRZ5gK.js → browser-Cxjkhtsk.js} +1 -1
  115. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-By-xuh9F.js → c4Diagram-AHTNJAMY-DwFV1k9I.js} +1 -1
  116. package/payload/server/public/assets/channel-D8Go_zJk.js +1 -0
  117. package/payload/server/public/assets/{chunk-2KRD3SAO-Gj2dSpBl.js → chunk-2KRD3SAO-CKn-bEkI.js} +1 -1
  118. package/payload/server/public/assets/{chunk-336JU56O-2PXVPCUA.js → chunk-336JU56O-iJ4ISPCi.js} +2 -2
  119. package/payload/server/public/assets/chunk-426QAEUC-sWe0Iexz.js +1 -0
  120. package/payload/server/public/assets/{chunk-4BX2VUAB-9XIBlnC2.js → chunk-4BX2VUAB-B2mSmC97.js} +1 -1
  121. package/payload/server/public/assets/{chunk-4TB4RGXK-Cr3mXPnI.js → chunk-4TB4RGXK-kKNYi2_i.js} +1 -1
  122. package/payload/server/public/assets/{chunk-55IACEB6-Ccg46J3A.js → chunk-55IACEB6-JLT9m7Hd.js} +1 -1
  123. package/payload/server/public/assets/{chunk-5FUZZQ4R-Cz9MvPKc.js → chunk-5FUZZQ4R-Car3r0he.js} +1 -1
  124. package/payload/server/public/assets/{chunk-5PVQY5BW-BleOdlgO.js → chunk-5PVQY5BW-DR9EfLvj.js} +1 -1
  125. package/payload/server/public/assets/{chunk-67CJDMHE-CyCYCQWy.js → chunk-67CJDMHE-CCdP3Pdx.js} +1 -1
  126. package/payload/server/public/assets/{chunk-7N4EOEYR-KpT3uHzH.js → chunk-7N4EOEYR-bXgVzdM9.js} +1 -1
  127. package/payload/server/public/assets/{chunk-AA7GKIK3-BfOzbuxq.js → chunk-AA7GKIK3-CYeDvY8B.js} +1 -1
  128. package/payload/server/public/assets/{chunk-BSJP7CBP-Bq0M3wlv.js → chunk-BSJP7CBP-U0Fi-Ers.js} +1 -1
  129. package/payload/server/public/assets/{chunk-CIAEETIT-CR-2dNaL.js → chunk-CIAEETIT-C8QrV6Gg.js} +1 -1
  130. package/payload/server/public/assets/{chunk-EDXVE4YY-egUGMTOS.js → chunk-EDXVE4YY-DLUWVRZV.js} +1 -1
  131. package/payload/server/public/assets/{chunk-ENJZ2VHE-CQohBEFw.js → chunk-ENJZ2VHE-B4bNJo6C.js} +1 -1
  132. package/payload/server/public/assets/{chunk-FMBD7UC4-DIxBUbLP.js → chunk-FMBD7UC4-DxAQS3UB.js} +1 -1
  133. package/payload/server/public/assets/{chunk-FOC6F5B3-C2694Zoq.js → chunk-FOC6F5B3-CyIK3zeY.js} +1 -1
  134. package/payload/server/public/assets/{chunk-ICPOFSXX-DpXZKHyn.js → chunk-ICPOFSXX-Qzl8Ki0l.js} +2 -2
  135. package/payload/server/public/assets/{chunk-K5T4RW27-CUicG0Rp.js → chunk-K5T4RW27-7GcDzjyJ.js} +1 -1
  136. package/payload/server/public/assets/{chunk-KGLVRYIC-B5mPJhOr.js → chunk-KGLVRYIC-B7pAr9hf.js} +1 -1
  137. package/payload/server/public/assets/{chunk-LIHQZDEY-q81QhuMs.js → chunk-LIHQZDEY-DEoU2jrz.js} +1 -1
  138. package/payload/server/public/assets/{chunk-ORNJ4GCN-DgurdFZs.js → chunk-ORNJ4GCN-BwMFuN24.js} +1 -1
  139. package/payload/server/public/assets/{chunk-OYMX7WX6-CxqMRu2d.js → chunk-OYMX7WX6-BenBO6O_.js} +1 -1
  140. package/payload/server/public/assets/chunk-QZHKN3VN-CHE_iZO7.js +1 -0
  141. package/payload/server/public/assets/{chunk-U2HBQHQK-BSLctJC9.js → chunk-U2HBQHQK-DewM8R0D.js} +1 -1
  142. package/payload/server/public/assets/{chunk-X2U36JSP--0AUeeFl.js → chunk-X2U36JSP-C22Q6Ea4.js} +1 -1
  143. package/payload/server/public/assets/{chunk-XPW4576I-D-hf9Bcn.js → chunk-XPW4576I-BA0a8Ygs.js} +1 -1
  144. package/payload/server/public/assets/{chunk-YZCP3GAM-PvOhSwI9.js → chunk-YZCP3GAM-DfUUNTnA.js} +1 -1
  145. package/payload/server/public/assets/{chunk-ZZ45TVLE-1zPUlNWz.js → chunk-ZZ45TVLE-CUT6zma2.js} +1 -1
  146. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BLb1mzrT.js +1 -0
  147. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Ctj5qYTS.js +1 -0
  148. package/payload/server/public/assets/clone-DGZ2vydA.js +1 -0
  149. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Cvo-gkBd.js → cose-bilkent-S5V4N54A-Df_JmB8E.js} +1 -1
  150. package/payload/server/public/assets/{dagre-CMHsNfjP.js → dagre-CYXRIdv0.js} +1 -1
  151. package/payload/server/public/assets/{dagre-KV5264BT-CM1DSx4E.js → dagre-KV5264BT-D4EGb60h.js} +1 -1
  152. package/payload/server/public/assets/{data-Cuynp6Y6.js → data-BOgwOWnw.js} +1 -1
  153. package/payload/server/public/assets/{diagram-5BDNPKRD-VDHiHwEI.js → diagram-5BDNPKRD-BzieCEfT.js} +1 -1
  154. package/payload/server/public/assets/{diagram-G4DWMVQ6-OKdufoeW.js → diagram-G4DWMVQ6-DDbO71XD.js} +1 -1
  155. package/payload/server/public/assets/{diagram-MMDJMWI5-Yg6QdCA1.js → diagram-MMDJMWI5-DqQ_UXDA.js} +1 -1
  156. package/payload/server/public/assets/{diagram-TYMM5635-CpEMZQDu.js → diagram-TYMM5635-CFyxA1aZ.js} +1 -1
  157. package/payload/server/public/assets/{dist-811BIK0R.js → dist-BmvZ8OaX.js} +1 -1
  158. package/payload/server/public/assets/{erDiagram-SMLLAGMA-Dw5gAkFM.js → erDiagram-SMLLAGMA-BMaEBbOK.js} +1 -1
  159. package/payload/server/public/assets/{flatten-BsWEYbBB.js → flatten-Bo6YRmWl.js} +1 -1
  160. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Cy_R1XHz.js → flowDiagram-DWJPFMVM-De5ChZQP.js} +1 -1
  161. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BYARP_eH.js → ganttDiagram-T4ZO3ILL-CXEMPVaK.js} +1 -1
  162. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CmHdoS27.js +1 -0
  163. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BGOe0unY.js → gitGraphDiagram-UUTBAWPF-OZedr_6y.js} +1 -1
  164. package/payload/server/public/assets/{graph-Ddg24bjy.js → graph-BqD2GjQd.js} +2 -2
  165. package/payload/server/public/assets/{graph-labels-eOrWYy0R.js → graph-labels-DSDTSBfM.js} +1 -1
  166. package/payload/server/public/assets/{graphlib-DaefxCga.js → graphlib-CN4nhD2U.js} +1 -1
  167. package/payload/server/public/assets/info-OMHHGYJF-DTA9msO-.js +1 -0
  168. package/payload/server/public/assets/infoDiagram-42DDH7IO-CSqg4nRL.js +2 -0
  169. package/payload/server/public/assets/{isEmpty-BWl67LAZ.js → isEmpty-D6Kr-M1M.js} +1 -1
  170. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-YrGuzpiI.js → ishikawaDiagram-UXIWVN3A-ChlzrZyx.js} +1 -1
  171. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-EIykOcqg.js → journeyDiagram-VCZTEJTY-DsrK55ZO.js} +1 -1
  172. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BR0TC6Je.js → kanban-definition-6JOO6SKY-DYF-_Rym.js} +1 -1
  173. package/payload/server/public/assets/{line-DPGcT5IM.js → line-3zmwI8XK.js} +1 -1
  174. package/payload/server/public/assets/{linear-CPN03uSh.js → linear-COm19-p7.js} +1 -1
  175. package/payload/server/public/assets/{mermaid-parser.core-D7Iu4c9M.js → mermaid-parser.core-BrcX8-cl.js} +2 -2
  176. package/payload/server/public/assets/{mermaid.core-krXRpXn9.js → mermaid.core-CBdz3b1N.js} +3 -3
  177. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-HwiCtPzN.js → mindmap-definition-QFDTVHPH-BqCqlYZb.js} +1 -1
  178. package/payload/server/public/assets/{ordinal-krseTxxN.js → ordinal-BDi6f4xk.js} +1 -1
  179. package/payload/server/public/assets/packet-4T2RLAQJ-6GjqIKgu.js +1 -0
  180. package/payload/server/public/assets/pie-ZZUOXDRM-T72DJ5JR.js +1 -0
  181. package/payload/server/public/assets/{pieDiagram-DEJITSTG-xodxyWLe.js → pieDiagram-DEJITSTG-D5LiILuM.js} +1 -1
  182. package/payload/server/public/assets/{public-xVaPcg6i.js → public-udi_Z7la.js} +3 -3
  183. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DuYYY4ZZ.js → quadrantDiagram-34T5L4WZ-C3iuI5l_.js} +1 -1
  184. package/payload/server/public/assets/radar-PYXPWWZC-x-6xW1dE.js +1 -0
  185. package/payload/server/public/assets/{reduce-tk-xY6Fv.js → reduce-CGi9ik8i.js} +1 -1
  186. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D0ta3kru.js → requirementDiagram-MS252O5E-CTPOw5qQ.js} +1 -1
  187. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-KdHdlzvT.js → sankeyDiagram-XADWPNL6-D_5aVlYp.js} +1 -1
  188. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DoSFUTQZ.js → sequenceDiagram-FGHM5R23-D7h5vocM.js} +1 -1
  189. package/payload/server/public/assets/{src-Cpl1JzME.js → src-DLEIsjER.js} +1 -1
  190. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BLW0KiSA.js → stateDiagram-FHFEXIEX-DyZjuwPj.js} +1 -1
  191. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BiW9pGXy.js +1 -0
  192. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-8QAzhYz1.js → timeline-definition-GMOUNBTQ-BqpVYJz_.js} +1 -1
  193. package/payload/server/public/assets/treeView-SZITEDCU-5-6wEryJ.js +1 -0
  194. package/payload/server/public/assets/treemap-W4RFUUIX-DF48Cc86.js +1 -0
  195. package/payload/server/public/assets/{useSelectionMode-DlJsX-_X.js → useSelectionMode-BPzPjKP_.js} +1 -1
  196. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKvfScOi.js → vennDiagram-DHZGUBPP-Czflml0e.js} +1 -1
  197. package/payload/server/public/assets/wardley-RL74JXVD-duKIa6Hq.js +1 -0
  198. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DaMfDpJ3.js → wardleyDiagram-NUSXRM2D-Cqz3pSTK.js} +1 -1
  199. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BIkNQlLa.js → xychartDiagram-5P7HB3ND-CS5dEuUO.js} +1 -1
  200. package/payload/server/public/browser.html +4 -4
  201. package/payload/server/public/data.html +5 -5
  202. package/payload/server/public/graph.html +6 -6
  203. package/payload/server/public/index.html +5 -5
  204. package/payload/server/public/public.html +4 -4
  205. package/payload/server/server.js +74 -275
  206. package/payload/server/public/assets/AdminShell-C6_5h1cC.js +0 -1
  207. package/payload/server/public/assets/architecture-YZFGNWBL-YM-TtgPY.js +0 -1
  208. package/payload/server/public/assets/channel-BRPH0atd.js +0 -1
  209. package/payload/server/public/assets/chunk-426QAEUC-QhauxjvK.js +0 -1
  210. package/payload/server/public/assets/chunk-QZHKN3VN-BDAQvtxz.js +0 -1
  211. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BJv89PB6.js +0 -1
  212. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DNUszH5M.js +0 -1
  213. package/payload/server/public/assets/clone-CREg9jLM.js +0 -1
  214. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CtOPqykB.js +0 -1
  215. package/payload/server/public/assets/info-OMHHGYJF-Jba5enA8.js +0 -1
  216. package/payload/server/public/assets/infoDiagram-42DDH7IO-Df9BlkPA.js +0 -2
  217. package/payload/server/public/assets/packet-4T2RLAQJ-D_eWzeAP.js +0 -1
  218. package/payload/server/public/assets/pie-ZZUOXDRM-BDiy1Ob2.js +0 -1
  219. package/payload/server/public/assets/radar-PYXPWWZC-C5mlfmtg.js +0 -1
  220. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C5zlCV4X.js +0 -1
  221. package/payload/server/public/assets/treeView-SZITEDCU-CM-9m-cS.js +0 -1
  222. package/payload/server/public/assets/treemap-W4RFUUIX-DDHPB-Xh.js +0 -1
  223. package/payload/server/public/assets/wardley-RL74JXVD-CUb3Br4q.js +0 -1
  224. package/payload/server/public/assets/whatsapp-BE79pNh8.js +0 -1
  225. package/payload/server/public/whatsapp.html +0 -18
  226. /package/payload/server/public/assets/{_baseFor-BHtDrjIo.js → _baseFor-Cam2PbSt.js} +0 -0
  227. /package/payload/server/public/assets/{array-DetWRiSa.js → array-DYRGGQae.js} +0 -0
  228. /package/payload/server/public/assets/{chunk-CWOGyPgy.js → chunk-CnGqDkHZ.js} +0 -0
  229. /package/payload/server/public/assets/{cytoscape.esm-C9yNhe1u.js → cytoscape.esm-nWsJMTNI.js} +0 -0
  230. /package/payload/server/public/assets/{defaultLocale-_WRwicXn.js → defaultLocale-Du1XY3Dp.js} +0 -0
  231. /package/payload/server/public/assets/{init-sTEcj9YX.js → init-B5BXBRcm.js} +0 -0
  232. /package/payload/server/public/assets/{katex-s61Rgv6l.js → katex-HOUACuRw.js} +0 -0
  233. /package/payload/server/public/assets/{path-B0Ik7Tu9.js → path-CNO468J-.js} +0 -0
  234. /package/payload/server/public/assets/{rough.esm-DKRO8IF-.js → rough.esm-DRO6hWPh.js} +0 -0
@@ -6,6 +6,20 @@ WhatsApp connects via Baileys multi-account:
6
6
  |----------|----------|------------|
7
7
  | **baileys** | All WhatsApp accounts | WebSocket via QR code (linked device) |
8
8
 
9
+ ## Reply-only posture (Task 723)
10
+
11
+ The agent has **no tool to initiate a WhatsApp message to an arbitrary number.** The `whatsapp-send` and `whatsapp-send-document` MCP tools were removed after an agent-initiated cold first-contact send (to a number with no prior conversation) tripped WhatsApp's anti-automation guard and restricted the operator's account. Initiating is intentionally unavailable, not merely gated — a soft approval gate already existed and did not prevent the incident.
12
+
13
+ What the agent **can** still do: reply within an existing chat. The whatsapp-channel `reply` tool (per-sender stdio channel, `platform/services/whatsapp-channel/`) and reply-path document delivery (`SendUserFile` → `file-delivery-bridge.ts` → `POST /api/whatsapp/send-document`) respond to a sender who messaged first. Replying within your chats is what WhatsApp permits; starting new chats from a linked device is what it penalises.
14
+
15
+ ## Observation-only in groups (Task 726)
16
+
17
+ The agent **never responds in a group chat.** Every inbound group message is stored, recorded, and persisted to the graph (observation is fully preserved — `list-groups`, `whatsapp-group-info`, conversations, and the `/whatsapp` reader all still work), but it is never dispatched to a responding session and never produces an outbound message into the group. `checkGroupAccess` is a structural observe-only deny — there is no group policy, allowlist, per-group activation, or @mention setting to turn responses on. A belt invariant in the manager's `reply` closure refuses any `@g.us` recipient (`op=group-reply-blocked`).
18
+
19
+ This is the same Meta-policy constraint as the reply-only DM posture above, applied one step further. Replying into a group from an unofficial linked device is automated business-style messaging — the class of behaviour that restricted a live operator account. It is a **Meta-policy constraint, not a Maxy limitation.**
20
+
21
+ For agent-driven messaging in groups or initiating conversations, **Telegram is the better channel** — it has no equivalent linked-device automation penalty, so the agent can send and respond freely there. See `platform/plugins/telegram/references/setup-guide.md`.
22
+
9
23
  ## Primary Architecture: Multi-Account Baileys
10
24
 
11
25
  Users link one or more WhatsApp numbers via QR. Each account is an independent Baileys connection with its own credentials, policies, and agent routing. Multiple accounts are optional — most setups use a single account.
@@ -44,7 +58,6 @@ Accounts are linked via QR in the Channels UI. Outbound routing (`src/web/outbou
44
58
  |--------|---------|--------|
45
59
  | Admin phones | Account with admin binding | Admin's registered number |
46
60
  | Self-chat | Account with selfChatMode | Admin talking to themselves |
47
- | Group messages | Account that is a group member | Whichever is in the group |
48
61
  | Customer DMs | Account with open DM policy | Dedicated agent number |
49
62
  | Inbound replies | Same account that received | Closures capture the right provider |
50
63
 
@@ -105,7 +118,7 @@ Admin phones always bypass DM policy — the `isAdminPhone()` check runs before
105
118
 
106
119
  **Schema constraint:** `dmPolicy: "open"` requires `allowFrom` to include `"*"` (enforced by Zod validation).
107
120
 
108
- **Key file:** `access-control.ts` — `checkDmAccess()` and `checkGroupAccess()`.
121
+ **Key file:** `access-control.ts` — `checkDmAccess()` gates DMs by the policy above; `checkGroupAccess()` is a structural observe-only deny (always `allowed:false reason:group-observe-only`, Task 726) — no group policy is consulted.
109
122
 
110
123
  **Config path:** Per-account at `whatsapp.accounts.{accountId}.dmPolicy` in `account.json`. Falls back to `whatsapp.dmPolicy`. Changes are conversational — the admin agent writes to config via `whatsapp-config action: "update-config"`.
111
124
 
@@ -220,6 +233,17 @@ Baileys disconnect errors carry a numeric status code mapped to `DisconnectReaso
220
233
 
221
234
  **Conflict vs logout (401 ambiguity):** WhatsApp's server can send a stream error with code 401 and reason "conflict" — Baileys normally maps "conflict" to 440, but the server's explicit `code` attribute overrides the mapping. The monitor checks for "conflict" in the error message to distinguish this from a true logout.
222
235
 
236
+ ## Terminal Logout: Visibility and Remedy
237
+
238
+ A `loggedOut` (401, `device_removed`) or a `conflict` (login taken over elsewhere) is **terminal**: the manager stops reconnecting (`classifyDisconnect` returns `shouldRetry: false`) and the link will NOT come back on its own. The cause is a WhatsApp-account-side action — the phone unlinked the device, or another login replaced this one — not something the gateway can recover from. The only remedy is re-pairing (the connect-whatsapp skill); waiting does nothing.
239
+
240
+ The dead state is reported at two surfaces so it is visible without a reply having to fail first:
241
+
242
+ - **Standing health signal.** On a terminal disconnect the manager sets `terminalReason` on the account connection (distinct from `sessionStuckReason`, which is the fast-reconnect-churn give-up). `/api/health` reports `whatsapp.any_terminal = true` and the account's `terminalReason`; `whatsapp-status` shows the account Disconnected with the reason (`Session logged out — re-link required`). `terminalReason` clears automatically once a re-pair establishes a fresh connection.
243
+ - **Reply failures are correctly described.** The native-channel `reply` tool no longer returns a bare `gateway returned 500`. On a terminal link it returns `reply: WhatsApp logged out — re-link required` (the agent must NOT promise an automatic recovery — there is none until re-pairing); a transient blip during reconnection stays a retryable `reply: WhatsApp disconnected — cannot reply`. The gateway carries the distinction as a `terminal` boolean in the `/wa-channel/reply` failure body, and the `op=reply-failed` log line records `terminal=true|false`.
244
+
245
+ What is NOT handled here: the end user who triggered the reply receives no delivery-failure notice over WhatsApp, and there is no outbound retry queue — a dropped reply on a dead link is lost (the agent is made aware of the failure, but the sender is not). That is a separate concern; file a task if it is wanted.
246
+
223
247
  ## Reconnection: Setup Failures vs Runtime Disconnects
224
248
 
225
249
  > **Authoritative source:** The current runtime connection lifecycle — including reconnect bounding (`STABLE_UPTIME_MS`, `MAX_RECONNECT_ATTEMPTS`), platform-side init queries (fetchBlocklist, fetchPrivacySettings, intentional fetchProps skip), and the `/api/health` WhatsApp field — is documented in [`.docs/whatsapp.md`](../../../../.docs/whatsapp.md) under "Connection Lifecycle", "Init Query Visibility", and "Reconnect Bounding and Escape". The content below describes the historical disconnect-reason mapping which still applies; for anything about how the loop retries, aborts, or runs its init sequence, read the `.docs` file first.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: manage-whatsapp-config
3
- description: Guide the user through viewing and editing WhatsApp settings — messaging policies, operational limits, group config, and acknowledgement behaviour. Conversational, not a raw form dump.
3
+ description: Guide the user through viewing and editing WhatsApp settings — DM messaging policy, operational limits, and acknowledgement behaviour. Conversational, not a raw form dump.
4
4
  ---
5
5
 
6
6
  # Manage WhatsApp Config
@@ -11,7 +11,7 @@ Conversational editing of WhatsApp settings. Every field is presented with its d
11
11
 
12
12
  ## When to activate
13
13
 
14
- User asks to change, view, edit, or manage WhatsApp settings, policies, limits, or group configuration. Also activate when the user asks about read receipts, message batching, media limits, or DM/group policies.
14
+ User asks to change, view, edit, or manage WhatsApp settings, policies, or limits. Also activate when the user asks about read receipts, message batching, media limits, or the DM policy. If the user asks how to make the agent respond in a group, see "Group posture" below — the answer is that it cannot, by design.
15
15
 
16
16
  ## Prerequisites
17
17
 
@@ -47,10 +47,8 @@ Call `whatsapp-config action: list-public-agents` to get available agents, and `
47
47
  - `open` — "Open — anyone can message"
48
48
  - `allowlist` — "Allowlist — only approved numbers"
49
49
  - `disabled` — "Disabled — no public DMs"
50
- - `groupPolicy` (`select`): label "Group message handling", options:
51
- - `open` "Always respond to all group messages"
52
- - `allowlist` — "Allowlist — only in approved groups"
53
- - `disabled` — "Disabled — ignore all group messages"
50
+
51
+ There is no group policy. Groups are observation-only see "Group posture" below.
54
52
 
55
53
  **Behaviour:**
56
54
 
@@ -68,16 +66,13 @@ Call `whatsapp-config action: list-public-agents` to get available agents, and `
68
66
 
69
67
  The form's `submitMessage` must map the field values back to `update-config` field names: `Save these WhatsApp settings: {{json}}` — where `{{json}}` produces the JSON object with field names as keys (e.g. `{ "dmPolicy": "open", "mediaMaxMb": 50, ... }`).
70
68
 
71
- ## Group configuration
69
+ ## Group posture
70
+
71
+ The agent is **observation-only in groups**: it sees and records every group message but never replies in a group. There is no per-group setting to turn responses on — the restriction is structural, not a toggle. `whatsapp-config action: list-groups` still lists the groups the connected phone is in, for reference.
72
72
 
73
- When the user wants to configure per-group settings:
73
+ This is a **Meta-policy constraint, not a Maxy limitation.** WhatsApp penalises automated and business-style messaging sent from an unofficial linked device. Replying in groups and sending cold first-contact messages are both anti-automation triggers — they restricted a live operator account, which is why the agent is observe-only in groups and reply-only in DMs (Task 723).
74
74
 
75
- 1. Call `whatsapp-config action: list-groups` to get groups the account belongs to, with names and participant counts
76
- 2. If the account is not connected, explain that group discovery requires an active WhatsApp connection
77
- 3. If no groups are found, tell the user: "You're not in any WhatsApp groups on this account yet. Groups will appear here once the connected phone joins them."
78
- 4. Present groups by name (not by JID) — the user picks from a list
79
- 5. For each selected group, offer the activation options: 'always' (respond to every message), 'mention' (respond only when @mentioned), 'off' (silent)
80
- 6. Map the user's selections back to JIDs when writing config
75
+ If the user wants an agent that actively messages in groups or initiates conversations, recommend **Telegram** instead. Telegram has no equivalent linked-device automation penalty, so the agent can send and respond freely there. Point them to the Telegram setup path at `platform/plugins/telegram/references/setup-guide.md`.
81
76
 
82
77
  ## Writing changes
83
78
 
@@ -160,6 +160,13 @@ cat > "$ACCOUNT_SETTINGS" << SETTINGS_EOF
160
160
  { "type": "command", "command": "bash $HOOKS_PATH/prompt-optimiser-directive.sh" }
161
161
  ]
162
162
  }
163
+ ],
164
+ "Stop": [
165
+ {
166
+ "hooks": [
167
+ { "type": "command", "command": "bash $HOOKS_PATH/prompt-optimiser-compliance.sh" }
168
+ ]
169
+ }
163
170
  ]
164
171
  }
165
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAiB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAgLtD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAiB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA8KtD,CAAA"}
@@ -176,8 +176,6 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
176
176
  "mcp__plugin_whatsapp_whatsapp__whatsapp-login-start",
177
177
  "mcp__plugin_whatsapp_whatsapp__whatsapp-login-wait",
178
178
  "mcp__plugin_whatsapp_whatsapp__whatsapp-messages",
179
- "mcp__plugin_whatsapp_whatsapp__whatsapp-send",
180
- "mcp__plugin_whatsapp_whatsapp__whatsapp-send-document",
181
179
  "mcp__plugin_whatsapp_whatsapp__whatsapp-status",
182
180
  "mcp__plugin_work_work__project-complete",
183
181
  "mcp__plugin_work_work__project-create",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,kEAAkE;AAClE,yDAAyD;AACzD,kFAAkF;AAClF,EAAE;AACF,yEAAyE;AACzE,6DAA6D;AAE7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,OAAO;IACP,KAAK;IACL,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,cAAc;IACd,QAAQ;IACR,SAAS;IACT,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,UAAU;IACV,MAAM;IACN,WAAW;CACZ,CAAA;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,yCAAyC;IACzC,yCAAyC;IACzC,yCAAyC;IACzC,sCAAsC;IACtC,yCAAyC;IACzC,wCAAwC;IACxC,oCAAoC;IACpC,qCAAqC;IACrC,uCAAuC;IACvC,2CAA2C;IAC3C,4CAA4C;IAC5C,qCAAqC;IACrC,yCAAyC;IACzC,4CAA4C;IAC5C,oCAAoC;IACpC,sCAAsC;IACtC,0CAA0C;IAC1C,uCAAuC;IACvC,sCAAsC;IACtC,mDAAmD;IACnD,6CAA6C;IAC7C,wCAAwC;IACxC,yCAAyC;IACzC,qCAAqC;IACrC,uCAAuC;IACvC,sCAAsC;IACtC,wCAAwC;IACxC,+BAA+B;IAC/B,qCAAqC;IACrC,sCAAsC;IACtC,yCAAyC;IACzC,4CAA4C;IAC5C,uDAAuD;IACvD,+CAA+C;IAC/C,2CAA2C;IAC3C,gDAAgD;IAChD,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,+CAA+C;IAC/C,gDAAgD;IAChD,6CAA6C;IAC7C,6CAA6C;IAC7C,iDAAiD;IACjD,oDAAoD;IACpD,+CAA+C;IAC/C,2CAA2C;IAC3C,2CAA2C;IAC3C,+CAA+C;IAC/C,+CAA+C;IAC/C,+CAA+C;IAC/C,8CAA8C;IAC9C,+CAA+C;IAC/C,6CAA6C;IAC7C,+CAA+C;IAC/C,+CAA+C;IAC/C,6CAA6C;IAC7C,6CAA6C;IAC7C,sCAAsC;IACtC,4CAA4C;IAC5C,uCAAuC;IACvC,4CAA4C;IAC5C,8CAA8C;IAC9C,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;IACvC,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;IACvC,qDAAqD;IACrD,sDAAsD;IACtD,uDAAuD;IACvD,wDAAwD;IACxD,iEAAiE;IACjE,kEAAkE;IAClE,6DAA6D;IAC7D,8CAA8C;IAC9C,wDAAwD;IACxD,gDAAgD;IAChD,qDAAqD;IACrD,sDAAsD;IACtD,wDAAwD;IACxD,wCAAwC;IACxC,wCAAwC;IACxC,iDAAiD;IACjD,wDAAwD;IACxD,0DAA0D;IAC1D,0CAA0C;IAC1C,6CAA6C;IAC7C,wCAAwC;IACxC,mDAAmD;IACnD,+CAA+C;IAC/C,mDAAmD;IACnD,0CAA0C;IAC1C,kDAAkD;IAClD,8CAA8C;IAC9C,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,mDAAmD;IACnD,2CAA2C;IAC3C,qDAAqD;IACrD,+CAA+C;IAC/C,sDAAsD;IACtD,gDAAgD;IAChD,2CAA2C;IAC3C,gDAAgD;IAChD,0CAA0C;IAC1C,mDAAmD;IACnD,0CAA0C;IAC1C,kDAAkD;IAClD,yCAAyC;IACzC,kDAAkD;IAClD,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAC3C,4CAA4C;IAC5C,mDAAmD;IACnD,uDAAuD;IACvD,qDAAqD;IACrD,oDAAoD;IACpD,oDAAoD;IACpD,gDAAgD;IAChD,kDAAkD;IAClD,mDAAmD;IACnD,iDAAiD;IACjD,sDAAsD;IACtD,uDAAuD;IACvD,yDAAyD;IACzD,oDAAoD;IACpD,mDAAmD;IACnD,wDAAwD;IACxD,iDAAiD;IACjD,wDAAwD;IACxD,kDAAkD;IAClD,oDAAoD;IACpD,iDAAiD;IACjD,wCAAwC;IACxC,gDAAgD;IAChD,0DAA0D;IAC1D,sCAAsC;IACtC,kDAAkD;IAClD,gDAAgD;IAChD,kEAAkE;IAClE,uDAAuD;IACvD,oDAAoD;IACpD,oDAAoD;IACpD,qDAAqD;IACrD,oDAAoD;IACpD,kDAAkD;IAClD,8CAA8C;IAC9C,uDAAuD;IACvD,gDAAgD;IAChD,yCAAyC;IACzC,uCAAuC;IACvC,oCAAoC;IACpC,qCAAqC;IACrC,uCAAuC;IACvC,qCAAqC;IACrC,qCAAqC;IACrC,sCAAsC;IACtC,oCAAoC;IACpC,iCAAiC;IACjC,kCAAkC;IAClC,mCAAmC;IACnC,oCAAoC;IACpC,oCAAoC;IACpC,kDAAkD;IAClD,kDAAkD;IAClD,mDAAmD;IACnD,+CAA+C;IAC/C,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,oDAAoD;CACrD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAS3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAoBzB,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAgFtD,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,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA+MD;;;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;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAgzDpD"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAS3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAoBzB,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAgFtD,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,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA+MD;;;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;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAo3DpD"}
@@ -30,7 +30,7 @@ import { buildRcChildEnv } from './rc-daemon.js';
30
30
  import { spawnClaudeSession, stopSession, writeInputToPty, isLive, onPtyExit, livePtyCount, liveSessionIds, getPtyTrackerForTests, livePidForSession, priorExitedCountForSession, PERMISSION_MODES, openFdCount, registerRcSpawnPty, } from './pty-spawner.js';
31
31
  import { writeScopeRecord, removeScopeRecord } from './scope-record.js';
32
32
  import { getScopeMainPid, defaultProcessSignals, defaultSystemctlRunner } from './systemd-scope.js';
33
- import { readSidecar, updateSidecar, appendBridgeId } from './session-sidecar.js';
33
+ import { readSidecar, updateSidecar, appendBridgeId, writeSidecar } from './session-sidecar.js';
34
34
  import { emitRcLife } from './rc-life.js';
35
35
  import { readJsonlSession } from './jsonl-enumerator.js';
36
36
  import { watchInputSubmission, countUserEntries } from './input-postcondition.js';
@@ -1612,6 +1612,18 @@ export function buildHttpApp(deps) {
1612
1612
  typeof waChannelRaw.serverPath === 'string'
1613
1613
  ? waChannelRaw
1614
1614
  : undefined;
1615
+ // Task 724 — the bridge routes EVERY role=admin channel inbound here, not
1616
+ // just WhatsApp, and supplies the real channel (+ role:'admin', senderId) so
1617
+ // the classification sidecar below records the actual channel. The WaGateway
1618
+ // supplies channel:'whatsapp'; the one-shot admin jobs (LinkedIn ingest,
1619
+ // session-end review) supply no channel and get no sidecar.
1620
+ const adminRole = body.role === 'admin' ? 'admin' : undefined;
1621
+ const adminChannel = typeof body.channel === 'string' && CHANNELS.includes(body.channel)
1622
+ ? body.channel
1623
+ : undefined;
1624
+ const adminSenderId = typeof body.senderId === 'string' && body.senderId.length > 0 && body.senderId.length <= 256
1625
+ ? body.senderId
1626
+ : undefined;
1615
1627
  if (sessionId !== null && !UUID_PATTERN.test(sessionId)) {
1616
1628
  timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
1617
1629
  return c.json({ error: 'sessionId must be a v4 UUID' }, 400);
@@ -1808,10 +1820,58 @@ export function buildHttpApp(deps) {
1808
1820
  const tracker = registerRcSpawnPty({ logger: deps.logger }, trackerKey, pty, unitToken);
1809
1821
  // Task 702 — persist the reattach hint so a manager restart adopts this
1810
1822
  // scope instead of orphan-killing it. /spawn persists this via its sidecar;
1811
- // /rc-spawn writes no sidecar, so it writes the record here. Only resumable
1812
- // sessions (a caller-supplied sessionId) have a stable id worth reattaching.
1823
+ // the Task 721/724 classification sidecar below carries scopeUnitToken too,
1824
+ // but only for channel-admin spawns, so /rc-spawn writes the record here for
1825
+ // every resumable session. Only resumable sessions (a caller-supplied
1826
+ // sessionId) have a stable id worth reattaching.
1813
1827
  if (sessionId)
1814
1828
  writeScopeRecord(sessionsDir, sessionId, unitToken, deps.logger);
1829
+ // Task 721 / Task 724 — the WhatsApp reader, the sidebar channel badge, and
1830
+ // archive classification read a live session's channel ONLY from its
1831
+ // <sessionId>.meta.json sidecar (role:admin, channel:<channel>). /spawn
1832
+ // writes that sidecar for the public path; channel-admin sessions never use
1833
+ // /spawn — they land here via /rc-spawn — so /rc-spawn must write it too.
1834
+ // Task 721 wrote it only for the WhatsApp case (keyed on effectiveWaChannel);
1835
+ // Task 724 generalizes it: the bridge routes EVERY role=admin channel inbound
1836
+ // here and supplies the real channel, so write the sidecar for any admin
1837
+ // channel, not one at a time. The channel comes from the body (the bridge and
1838
+ // the WaGateway both supply it); senderId comes from the body, or for the
1839
+ // WhatsApp gateway path that carries it inside waChannel, from
1840
+ // effectiveWaChannel. The one-shot admin jobs (LinkedIn ingest, session-end
1841
+ // review) supply no channel and are correctly skipped — they are role:admin
1842
+ // but not channel conversations. Write-once: a resume already has the sidecar
1843
+ // (url filled by url-capture, bridgeIds appended by Task 550); overwriting
1844
+ // would wipe both (the single-writer note in session-sidecar.ts), so skip
1845
+ // when one exists. Non-fatal: the PTY here is already serving a live thread —
1846
+ // a failed classification sidecar must not tear it down, so it logs and the
1847
+ // session keeps running (the pre-fix reader-blind behaviour, no worse).
1848
+ const classifyChannel = adminRole === 'admin' ? adminChannel : undefined;
1849
+ const classifySenderId = adminSenderId ?? effectiveWaChannel?.senderId;
1850
+ if (sessionId && classifyChannel && classifySenderId) {
1851
+ const classifySidecarPath = sidecarPathForSessionId(deps.spawnCwd, sessionId);
1852
+ if (!existsSync(classifySidecarPath)) {
1853
+ try {
1854
+ writeSidecar(classifySidecarPath, {
1855
+ senderId: classifySenderId,
1856
+ role: 'admin',
1857
+ channel: classifyChannel,
1858
+ url: null,
1859
+ startedAt: new Date().toISOString(),
1860
+ permissionMode: null,
1861
+ effectivePermissionMode: null,
1862
+ model: null,
1863
+ hidden: false,
1864
+ specialist: null,
1865
+ scopeUnitToken: unitToken,
1866
+ bridgeIds: [],
1867
+ }, deps.logger);
1868
+ deps.watcher.refreshSidecar?.(sessionId);
1869
+ }
1870
+ catch (err) {
1871
+ deps.logger(`[rc-spawn] op=channel-sidecar-write-failed sessionId=${sessionId.slice(0, 8)} channel=${classifyChannel} err=${JSON.stringify(err instanceof Error ? err.message : String(err))}`);
1872
+ }
1873
+ }
1874
+ }
1815
1875
  // Task 626 — one-shot job (LinkedIn ingest, public session-end review):
1816
1876
  // stop the PTY once its single assistant turn lands `end_turn`. closeAfterTurn
1817
1877
  // implies a sessionId (validated above), so trackerKey === sessionId and the