@rubytech/create-maxy-code 0.1.300 → 0.1.302

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 (219) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/PLUGIN.md +10 -10
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +93 -84
  4. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +4 -4
  5. package/payload/platform/plugins/aeo/PLUGIN.md +1 -1
  6. package/payload/platform/plugins/business-assistant/skills/e-sign/SKILL.md +4 -4
  7. package/payload/platform/plugins/cloudflare/PLUGIN.md +1 -1
  8. package/payload/platform/plugins/cloudflare/references/manual-setup.md +14 -8
  9. package/payload/platform/plugins/cloudflare/references/reset-guide.md +1 -1
  10. package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +5 -2
  11. package/payload/platform/plugins/contacts/PLUGIN.md +1 -1
  12. package/payload/platform/plugins/docs/references/admin-identity-gate.md +6 -6
  13. package/payload/platform/plugins/docs/references/admin-session.md +15 -15
  14. package/payload/platform/plugins/docs/references/admin-ui.md +27 -18
  15. package/payload/platform/plugins/docs/references/aeo.md +1 -1
  16. package/payload/platform/plugins/docs/references/deployment.md +3 -3
  17. package/payload/platform/plugins/docs/references/internals.md +28 -28
  18. package/payload/platform/plugins/docs/references/platform.md +21 -21
  19. package/payload/platform/plugins/docs/references/plugins-guide.md +3 -3
  20. package/payload/platform/plugins/docs/references/troubleshooting.md +6 -6
  21. package/payload/platform/plugins/docs/references/visitor-graph.md +3 -3
  22. package/payload/platform/plugins/email/PLUGIN.md +2 -2
  23. package/payload/platform/plugins/email/references/email-reference.md +2 -2
  24. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +2 -2
  25. package/payload/platform/plugins/memory/.claude-plugin/plugin.json +1 -1
  26. package/payload/platform/plugins/memory/PLUGIN.md +9 -9
  27. package/payload/platform/plugins/memory/references/graph-primitives.md +2 -2
  28. package/payload/platform/plugins/memory/references/schema-base.md +14 -14
  29. package/payload/platform/plugins/memory/references/transcript-formats/circleback.md +1 -1
  30. package/payload/platform/plugins/memory/references/transcript-formats/otter.md +1 -1
  31. package/payload/platform/plugins/memory/skills/conversation-archive/SKILL.md +6 -6
  32. package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +1 -1
  33. package/payload/platform/plugins/memory/skills/conversation-archive-mcp/SKILL.md +8 -8
  34. package/payload/platform/plugins/memory/skills/document-ingest/SKILL.md +5 -5
  35. package/payload/platform/plugins/obsidian-import/skills/obsidian-import/references/daily-notes.md +1 -1
  36. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/SKILL.md +1 -1
  37. package/payload/platform/plugins/slides/PROVENANCE.md +1 -1
  38. package/payload/platform/plugins/substack-import/skills/substack-import/SKILL.md +1 -1
  39. package/payload/platform/plugins/telegram/PLUGIN.md +1 -1
  40. package/payload/platform/plugins/url-get/PLUGIN.md +2 -2
  41. package/payload/platform/plugins/whatsapp/.claude-plugin/plugin.json +1 -1
  42. package/payload/platform/plugins/whatsapp/PLUGIN.md +5 -5
  43. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +5 -5
  44. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +1 -1
  45. package/payload/platform/plugins/workflows/PLUGIN.md +1 -1
  46. package/payload/platform/plugins/x-import/PLUGIN.md +2 -2
  47. package/payload/platform/plugins/x-import/skills/x-import/SKILL.md +1 -1
  48. package/payload/platform/scripts/__tests__/check-no-task-id-leaks.test.sh +125 -0
  49. package/payload/platform/scripts/__tests__/resume-tunnel.test.sh +253 -0
  50. package/payload/platform/scripts/check-no-task-id-leaks.mjs +62 -6
  51. package/payload/platform/scripts/resume-tunnel.sh +89 -5
  52. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -0
  53. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  54. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +23 -0
  55. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  56. package/payload/platform/services/webchat-channel/dist/notification.d.ts +12 -0
  57. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  58. package/payload/platform/services/webchat-channel/dist/notification.js +29 -0
  59. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  60. package/payload/platform/services/webchat-channel/dist/server.d.ts +1 -0
  61. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  62. package/payload/platform/services/webchat-channel/dist/server.js +21 -6
  63. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  64. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +26 -0
  65. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  66. package/payload/platform/services/whatsapp-channel/dist/notification.js +40 -0
  67. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  68. package/payload/platform/services/whatsapp-channel/dist/server.d.ts +4 -0
  69. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  70. package/payload/platform/services/whatsapp-channel/dist/server.js +93 -9
  71. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  72. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +22 -0
  73. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -0
  74. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +157 -0
  75. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -0
  76. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  77. package/payload/platform/templates/specialists/agents/librarian.md +2 -2
  78. package/payload/server/public/assets/AdminShell-CKQFuyG1.js +1 -0
  79. package/payload/server/public/assets/{Checkbox-BZ1XbA1t.js → Checkbox-CTB1YICm.js} +1 -1
  80. package/payload/server/public/assets/{Transcript-CaVix6W0.js → Transcript-ClvmtDzk.js} +1 -1
  81. package/payload/server/public/assets/admin-STC3C8ed.js +1 -0
  82. package/payload/server/public/assets/{arc-DxSm8tli.js → arc-BrTRjBIM.js} +1 -1
  83. package/payload/server/public/assets/architecture-YZFGNWBL-DqQB3T6j.js +1 -0
  84. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-7JSAh0vL.js → architectureDiagram-Q4EWVU46-DJ9on7sZ.js} +1 -1
  85. package/payload/server/public/assets/{audio-attachment-mime-CFyc3gpD.js → audio-attachment-mime-B6GLbrSj.js} +3 -3
  86. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DLoVmHKD.js → blockDiagram-DXYQGD6D-CIcyQn0q.js} +1 -1
  87. package/payload/server/public/assets/{browser-ClnGUKp-.js → browser-Df57jxpr.js} +1 -1
  88. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-Nv1G0o9P.js → c4Diagram-AHTNJAMY-Dt5dh_GR.js} +1 -1
  89. package/payload/server/public/assets/channel-NZeJdLVK.js +1 -0
  90. package/payload/server/public/assets/chat-B9ZI_e8i.js +1 -0
  91. package/payload/server/public/assets/{chunk-2KRD3SAO-BpqPMhoA.js → chunk-2KRD3SAO-BUq3MqUy.js} +1 -1
  92. package/payload/server/public/assets/{chunk-336JU56O-DgXHlVU_.js → chunk-336JU56O-CUzJH5Qt.js} +2 -2
  93. package/payload/server/public/assets/chunk-426QAEUC-DFKX5l0L.js +1 -0
  94. package/payload/server/public/assets/{chunk-4BX2VUAB-nwyZSZH8.js → chunk-4BX2VUAB-B4JUc3UA.js} +1 -1
  95. package/payload/server/public/assets/{chunk-4TB4RGXK-Tfxz9LHX.js → chunk-4TB4RGXK-HRO9fIIs.js} +1 -1
  96. package/payload/server/public/assets/{chunk-55IACEB6-6FMJQGXG.js → chunk-55IACEB6-MZdrLBuw.js} +1 -1
  97. package/payload/server/public/assets/{chunk-5FUZZQ4R-g2FgZF3D.js → chunk-5FUZZQ4R-XcAN5zlM.js} +1 -1
  98. package/payload/server/public/assets/{chunk-5PVQY5BW-DtLwXsPH.js → chunk-5PVQY5BW-PQ1GEsxo.js} +1 -1
  99. package/payload/server/public/assets/{chunk-67CJDMHE-K91CP5ZU.js → chunk-67CJDMHE-BVvCaqGd.js} +1 -1
  100. package/payload/server/public/assets/{chunk-7N4EOEYR-BGpCQhqK.js → chunk-7N4EOEYR-BlBbZdpM.js} +1 -1
  101. package/payload/server/public/assets/{chunk-AA7GKIK3-jkDbInck.js → chunk-AA7GKIK3-Ct-PgkGa.js} +1 -1
  102. package/payload/server/public/assets/{chunk-BSJP7CBP-mDosdzGs.js → chunk-BSJP7CBP-DZRRfCSz.js} +1 -1
  103. package/payload/server/public/assets/{chunk-CIAEETIT-DhBxewpQ.js → chunk-CIAEETIT-BoGEJiXe.js} +1 -1
  104. package/payload/server/public/assets/{chunk-EDXVE4YY-B7c-9Emg.js → chunk-EDXVE4YY-DiSmN31f.js} +1 -1
  105. package/payload/server/public/assets/{chunk-ENJZ2VHE-Cqhhncox.js → chunk-ENJZ2VHE-uhhokIvs.js} +1 -1
  106. package/payload/server/public/assets/{chunk-FMBD7UC4-BpDq6wj1.js → chunk-FMBD7UC4-CfCx5WI7.js} +1 -1
  107. package/payload/server/public/assets/{chunk-FOC6F5B3-Ds02-ktu.js → chunk-FOC6F5B3-Dj9E9gTu.js} +1 -1
  108. package/payload/server/public/assets/{chunk-ICPOFSXX-BTX5POFr.js → chunk-ICPOFSXX-DcBs_FNy.js} +2 -2
  109. package/payload/server/public/assets/{chunk-K5T4RW27-Du1PXXBU.js → chunk-K5T4RW27-7-VefyJD.js} +1 -1
  110. package/payload/server/public/assets/{chunk-KGLVRYIC-siasOAf8.js → chunk-KGLVRYIC-CqgTEVxm.js} +1 -1
  111. package/payload/server/public/assets/{chunk-LIHQZDEY-xf1rbZtf.js → chunk-LIHQZDEY-C0gzDXha.js} +1 -1
  112. package/payload/server/public/assets/{chunk-ORNJ4GCN-DeTLQ_LD.js → chunk-ORNJ4GCN-JXz23R1H.js} +1 -1
  113. package/payload/server/public/assets/{chunk-OYMX7WX6-DQ7_oVJn.js → chunk-OYMX7WX6-C2snCNq9.js} +1 -1
  114. package/payload/server/public/assets/chunk-QZHKN3VN-BWCCN0AM.js +1 -0
  115. package/payload/server/public/assets/{chunk-U2HBQHQK-CXmFUKgn.js → chunk-U2HBQHQK-CXCU7M-M.js} +1 -1
  116. package/payload/server/public/assets/{chunk-X2U36JSP-Bj8-8Wkz.js → chunk-X2U36JSP-CEdcSb28.js} +1 -1
  117. package/payload/server/public/assets/{chunk-XPW4576I-Con3TXqt.js → chunk-XPW4576I-Cckc75YS.js} +1 -1
  118. package/payload/server/public/assets/{chunk-YZCP3GAM-Dx8BHGWf.js → chunk-YZCP3GAM-4nN8AO7H.js} +1 -1
  119. package/payload/server/public/assets/{chunk-ZZ45TVLE-Dp4Q5Y-f.js → chunk-ZZ45TVLE-DcoBc8-7.js} +1 -1
  120. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DPlCQCX2.js +1 -0
  121. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CqkQq74h.js +1 -0
  122. package/payload/server/public/assets/clone-CSykdD1A.js +1 -0
  123. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-pZiCv69E.js → cose-bilkent-S5V4N54A-BFFro_t9.js} +1 -1
  124. package/payload/server/public/assets/{dagre-CLqhEgbL.js → dagre-CN5to_JM.js} +1 -1
  125. package/payload/server/public/assets/{dagre-KV5264BT-BCxE8iyk.js → dagre-KV5264BT-WYrPwDg0.js} +1 -1
  126. package/payload/server/public/assets/{data-DDjeQQ7e.js → data-BYiwvhSl.js} +1 -1
  127. package/payload/server/public/assets/{diagram-5BDNPKRD-slUEdZzz.js → diagram-5BDNPKRD-Dz2CiboN.js} +1 -1
  128. package/payload/server/public/assets/{diagram-G4DWMVQ6-DPcraMfu.js → diagram-G4DWMVQ6-r8h3Ip9O.js} +1 -1
  129. package/payload/server/public/assets/{diagram-MMDJMWI5-DR6luhGK.js → diagram-MMDJMWI5-CECcpGtr.js} +1 -1
  130. package/payload/server/public/assets/{diagram-TYMM5635-Jap1B4wA.js → diagram-TYMM5635-CHOcAyIP.js} +1 -1
  131. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DJKUs2hO.js → erDiagram-SMLLAGMA-YIqKdPbS.js} +1 -1
  132. package/payload/server/public/assets/{file-download-DBMW0BNz.js → file-download-CU0xHXGF.js} +1 -1
  133. package/payload/server/public/assets/{flatten-Cl1Bc3dR.js → flatten-DhYYI_lo.js} +1 -1
  134. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C8W-ZZ9W.js → flowDiagram-DWJPFMVM-DaEvQWpj.js} +1 -1
  135. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DYCX4Xu2.js → ganttDiagram-T4ZO3ILL-x1hClEOB.js} +1 -1
  136. package/payload/server/public/assets/gitGraph-7Q5UKJZL-V7Tx7_eY.js +1 -0
  137. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CZu_fpgS.js → gitGraphDiagram-UUTBAWPF-C-sZsh6Z.js} +1 -1
  138. package/payload/server/public/assets/{graph-CR74qec3.js → graph-BqdF9YLX.js} +1 -1
  139. package/payload/server/public/assets/{graph-labels-1Uz0ZBRd.js → graph-labels-Bv6MHqfG.js} +1 -1
  140. package/payload/server/public/assets/{graphlib-Bdp7TA4y.js → graphlib-CNkAqm2w.js} +1 -1
  141. package/payload/server/public/assets/info-OMHHGYJF-D3DqVPGn.js +1 -0
  142. package/payload/server/public/assets/infoDiagram-42DDH7IO-B_O-R0vN.js +2 -0
  143. package/payload/server/public/assets/{isEmpty-D1pGOD1J.js → isEmpty-DGhq_DBP.js} +1 -1
  144. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-B7KfIX6z.js → ishikawaDiagram-UXIWVN3A-wHE-RwzZ.js} +1 -1
  145. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CSDwBfhF.js → journeyDiagram-VCZTEJTY-DQB6iThz.js} +1 -1
  146. package/payload/server/public/assets/jsx-runtime-DuiIXAPx.css +1 -0
  147. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CWzcEKTr.js → kanban-definition-6JOO6SKY-Ck08vXSA.js} +1 -1
  148. package/payload/server/public/assets/{line-BNQSlbYn.js → line-Cdc2FBEU.js} +1 -1
  149. package/payload/server/public/assets/{linear-BN6kGN93.js → linear-DhtUm5H7.js} +1 -1
  150. package/payload/server/public/assets/{mermaid-parser.core-CcFhkElq.js → mermaid-parser.core-CSYulPIL.js} +2 -2
  151. package/payload/server/public/assets/{mermaid.core-BsIeJ7Cc.js → mermaid.core-CP-hOmMh.js} +3 -3
  152. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CQVzj6D_.js → mindmap-definition-QFDTVHPH-GxlkvV1Z.js} +1 -1
  153. package/payload/server/public/assets/operator-lvmlNtX0.js +1 -0
  154. package/payload/server/public/assets/{ordinal-CBZeH4Yp.js → ordinal-CibZU3PM.js} +1 -1
  155. package/payload/server/public/assets/packet-4T2RLAQJ-BY7mgCTQ.js +1 -0
  156. package/payload/server/public/assets/page-lv61ROf4.js +1 -0
  157. package/payload/server/public/assets/pie-ZZUOXDRM-B9f6jN54.js +1 -0
  158. package/payload/server/public/assets/{pieDiagram-DEJITSTG-DnrQ9fyn.js → pieDiagram-DEJITSTG-Di6kWh9c.js} +1 -1
  159. package/payload/server/public/assets/{public-W-HholkU.js → public-B3qyifbI.js} +1 -1
  160. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BQWlCyWi.js → quadrantDiagram-34T5L4WZ-iNHC5bkO.js} +1 -1
  161. package/payload/server/public/assets/radar-PYXPWWZC-BKS8JOUe.js +1 -0
  162. package/payload/server/public/assets/{reduce-PuPlFPRX.js → reduce-Da0RBva0.js} +1 -1
  163. package/payload/server/public/assets/{requirementDiagram-MS252O5E-Du_vZhU1.js → requirementDiagram-MS252O5E-BBlLREXo.js} +1 -1
  164. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-Cf6Z8GPQ.js → sankeyDiagram-XADWPNL6-qyDkP-Ca.js} +1 -1
  165. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CS8GVol8.js → sequenceDiagram-FGHM5R23-C0MJuS0m.js} +1 -1
  166. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Bv1NW2F1.js → stateDiagram-FHFEXIEX-aHTrlosa.js} +1 -1
  167. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-V2vo4BjY.js +1 -0
  168. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-ClGYAsr0.js → timeline-definition-GMOUNBTQ-BlRZIxEp.js} +1 -1
  169. package/payload/server/public/assets/treeView-SZITEDCU-bIKzyIdw.js +1 -0
  170. package/payload/server/public/assets/treemap-W4RFUUIX-CQycQ4H9.js +1 -0
  171. package/payload/server/public/assets/{useSelectionMode-geYq13zs.js → useSelectionMode-FzQBlPMx.js} +1 -1
  172. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-C2wTcxQT.js → vennDiagram-DHZGUBPP-s76adysx.js} +1 -1
  173. package/payload/server/public/assets/wardley-RL74JXVD-COr9o-nG.js +1 -0
  174. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-D86-ivEx.js → wardleyDiagram-NUSXRM2D-xC8t2QGW.js} +1 -1
  175. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Ba5WAN8P.js → xychartDiagram-5P7HB3ND-DRcHg-Wj.js} +1 -1
  176. package/payload/server/public/browser.html +6 -6
  177. package/payload/server/public/chat.html +10 -9
  178. package/payload/server/public/data.html +5 -5
  179. package/payload/server/public/graph.html +8 -8
  180. package/payload/server/public/index.html +9 -10
  181. package/payload/server/public/operator.html +11 -10
  182. package/payload/server/public/public.html +7 -7
  183. package/payload/server/server.js +51 -6
  184. package/payload/server/public/assets/AdminShell-BFdBxg4P.js +0 -1
  185. package/payload/server/public/assets/admin-BK7xIr3o.js +0 -1
  186. package/payload/server/public/assets/architecture-YZFGNWBL-6g9jRVgc.js +0 -1
  187. package/payload/server/public/assets/channel-BgQLJanG.js +0 -1
  188. package/payload/server/public/assets/chat-ZTAhSoJV.js +0 -1
  189. package/payload/server/public/assets/chunk-426QAEUC-Dr_XVuUq.js +0 -1
  190. package/payload/server/public/assets/chunk-QZHKN3VN-DF4o9HRJ.js +0 -1
  191. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DAbPKU6u.js +0 -1
  192. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BKuFQLcv.js +0 -1
  193. package/payload/server/public/assets/clone-DnNHGhNe.js +0 -1
  194. package/payload/server/public/assets/gitGraph-7Q5UKJZL-g7mvu6IY.js +0 -1
  195. package/payload/server/public/assets/info-OMHHGYJF-DZqJuIkB.js +0 -1
  196. package/payload/server/public/assets/infoDiagram-42DDH7IO-cGfGccHz.js +0 -2
  197. package/payload/server/public/assets/jsx-runtime-BqGVUT1h.css +0 -1
  198. package/payload/server/public/assets/operator-QP_z97s8.js +0 -1
  199. package/payload/server/public/assets/packet-4T2RLAQJ-Hn8rlHpy.js +0 -1
  200. package/payload/server/public/assets/page-CLijftr1.js +0 -1
  201. package/payload/server/public/assets/pie-ZZUOXDRM-BPGWVqBm.js +0 -1
  202. package/payload/server/public/assets/radar-PYXPWWZC-DMdLrj3E.js +0 -1
  203. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BGUCxPmp.js +0 -1
  204. package/payload/server/public/assets/treeView-SZITEDCU-CWxofUbI.js +0 -1
  205. package/payload/server/public/assets/treemap-W4RFUUIX-Cfgb_ZG0.js +0 -1
  206. package/payload/server/public/assets/wardley-RL74JXVD-B45olYjj.js +0 -1
  207. /package/payload/server/public/assets/{page-CWMpccrR.css → 500-CWMpccrR.css} +0 -0
  208. /package/payload/server/public/assets/{_baseFor-brRjpUOX.js → _baseFor-BFYpZGkN.js} +0 -0
  209. /package/payload/server/public/assets/{array-BGFCBI0e.js → array-CYkMkqnU.js} +0 -0
  210. /package/payload/server/public/assets/{cytoscape.esm-TvRJ2tGX.js → cytoscape.esm-DqlHsaog.js} +0 -0
  211. /package/payload/server/public/assets/{defaultLocale-CRZydyG6.js → defaultLocale-Beh6XjaL.js} +0 -0
  212. /package/payload/server/public/assets/{dist-Dbh7HrZX.js → dist-t9p-NJH2.js} +0 -0
  213. /package/payload/server/public/assets/{init-B8gtcn7T.js → init-Rr1s_RiX.js} +0 -0
  214. /package/payload/server/public/assets/{jsx-runtime-D3JkFIbi.js → jsx-runtime-Brvwqc85.js} +0 -0
  215. /package/payload/server/public/assets/{katex-RxgSu_dy.js → katex-pVJiI_rc.js} +0 -0
  216. /package/payload/server/public/assets/{path-DZF-JdEe.js → path-BAQ3hXlG.js} +0 -0
  217. /package/payload/server/public/assets/{preload-helper-CQ36nxok.js → preload-helper-B_l5jfgx.js} +0 -0
  218. /package/payload/server/public/assets/{rough.esm-6CnTHTkH.js → rough.esm-nHaDi0Kw.js} +0 -0
  219. /package/payload/server/public/assets/{src-BoaldmnP.js → src-DuPQVw-H.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
3
  import { type WatchGrewFn, type FindJsonlFn } from './jsonl-watch.js';
4
+ import { type OnTurnEnd } from './turn-follow.js';
5
+ export type FollowTurnEndsFn = (jsonlPath: string, startOffset: number, onTurnEnd: OnTurnEnd) => Promise<void>;
6
+ export declare const INSTRUCTIONS: string;
4
7
  export declare const mcp: Server<{
5
8
  method: string;
6
9
  params?: {
@@ -39,6 +42,7 @@ export declare function subscribeInbound(opts?: {
39
42
  watchGrew?: WatchGrewFn;
40
43
  findJsonl?: FindJsonlFn;
41
44
  notificationTimeoutMs?: number;
45
+ followTurnEnds?: FollowTurnEndsFn;
42
46
  }): Promise<void>;
43
47
  export declare function main(): Promise<void>;
44
48
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAIlE,OAAO,EAAyC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAwC5G,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMf,CAAA;AA6GD,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IAC5C,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHhB;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAO1C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAIlE,OAAO,EAAyC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC5G,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAuBjE,MAAM,MAAM,gBAAgB,GAAG,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,KACjB,OAAO,CAAC,IAAI,CAAC,CAAA;AAMlB,eAAO,MAAM,YAAY,QAkBgE,CAAA;AAEzF,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMf,CAAA;AA2HD,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IAC5C,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAA;CAClC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoLhB;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAO1C"}
@@ -9,13 +9,14 @@
9
9
  //
10
10
  // Transport glue only — message shaping and the reply body are the unit-tested
11
11
  // pure helpers in ./notification. Verified end-to-end at deploy (Task 7).
12
- import { realpathSync } from 'node:fs';
12
+ import { realpathSync, statSync } from 'node:fs';
13
13
  import { pathToFileURL } from 'node:url';
14
14
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
15
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
16
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
17
- import { acceptsSender, composeAdminContent, buildReplyPostBody, buildReplyDocumentPostBody, buildReceivedPostBody, buildReplyError, postWithRetry } from './notification.js';
17
+ import { acceptsSender, composeAdminContent, buildReplyPostBody, buildReplyDocumentPostBody, buildReceivedPostBody, buildTurnEndPostBody, buildReplyError, redactInternalLeaks, postWithRetry } from './notification.js';
18
18
  import { findJsonlForSessionId, watchForGrowth } from './jsonl-watch.js';
19
+ import { followTurnEnds } from './turn-follow.js';
19
20
  function requireEnv(name) {
20
21
  const v = process.env[name];
21
22
  if (!v)
@@ -38,7 +39,7 @@ const NOTIFICATION_RETRY_TIMEOUT_MS = 10_000;
38
39
  // where the reply tool call shows but its text does not. Instruct the agent to
39
40
  // also write its answer as normal assistant text so the operator can read it
40
41
  // in the web view, AND relay that same text via the reply tool to WhatsApp.
41
- const INSTRUCTIONS = `You are connected to WhatsApp. Every <channel source="whatsapp" sender_id="..."> event is a ` +
42
+ export const INSTRUCTIONS = `You are connected to WhatsApp. Every <channel source="whatsapp" sender_id="..."> event is a ` +
42
43
  `message the operator has sent you directly over WhatsApp — treat it EXACTLY as if the operator ` +
43
44
  `had typed that text to you in this session, and act on it immediately as their instruction. ` +
44
45
  `Do NOT describe it as an "incoming message", do NOT summarise it, and do NOT ask whether to ` +
@@ -46,9 +47,16 @@ const INSTRUCTIONS = `You are connected to WhatsApp. Every <channel source="what
46
47
  `writing your response as normal text so it stays visible here, then (2) call the reply tool with ` +
47
48
  `that same response to deliver it to the sender on WhatsApp. Always finish by calling the reply ` +
48
49
  `tool; never wait for confirmation before replying. ` +
50
+ `Your turn is not finished until you have called the reply tool: ending a turn with your answer ` +
51
+ `written only as text, without a reply call, fails to deliver it to the operator. ` +
49
52
  `When you need to send the operator a file or attachment, call the reply-document tool with the ` +
50
53
  `file path(s) — this is the only surface that delivers a document to WhatsApp. Do NOT rely on ` +
51
- `SendUserFile alone for a WhatsApp attachment.`;
54
+ `SendUserFile alone for a WhatsApp attachment. ` +
55
+ `The platform you run on is a black box: never read, grep, or edit the platform install or its ` +
56
+ `server bundle, and never restart platform services. If the platform itself is broken, describe ` +
57
+ `the problem to the operator in plain terms and stop — never hand-patch it on this machine. Never ` +
58
+ `put engineering internals into a reply: no task numbers, repository paths, source filenames, code ` +
59
+ `identifiers, internal log tags, or claims that you patched or restarted the platform.`;
52
60
  export const mcp = new Server({ name: 'whatsapp', version: '0.1.0' }, {
53
61
  capabilities: { experimental: { 'claude/channel': {} }, tools: {} },
54
62
  instructions: INSTRUCTIONS,
@@ -98,15 +106,27 @@ mcp.setRequestHandler(ListToolsRequestSchema, async () => ({
98
106
  },
99
107
  ],
100
108
  }));
109
+ // Task 834 — redact internal-leak patterns from any outbound operator text and
110
+ // log each redaction, before it leaves the box. Used by all three delivery
111
+ // surfaces: the reply tool, the reply-document caption, and the turn-end
112
+ // fallback that ships the agent's final assistant text when no reply was made.
113
+ function guardOutbound(text) {
114
+ const { clean, redactions } = redactInternalLeaks(text);
115
+ for (const r of redactions) {
116
+ console.error(`[channel-guard] op=redact senderId=${SENDER_ID} pattern=${r.pattern} bytes=${Buffer.byteLength(r.match, 'utf8')}`);
117
+ }
118
+ return clean;
119
+ }
101
120
  mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
102
121
  if (req.params.name === 'reply') {
103
- const text = req.params.arguments?.text;
104
- if (typeof text !== 'string')
122
+ const rawText = req.params.arguments?.text;
123
+ if (typeof rawText !== 'string')
105
124
  throw new Error('reply: text must be a string');
125
+ const clean = guardOutbound(rawText);
106
126
  const res = await fetch(`${GATEWAY_URL}/wa-channel/reply`, {
107
127
  method: 'POST',
108
128
  headers: { 'content-type': 'application/json' },
109
- body: JSON.stringify(buildReplyPostBody(SENDER_ID, text)),
129
+ body: JSON.stringify(buildReplyPostBody(SENDER_ID, clean)),
110
130
  });
111
131
  if (!res.ok) {
112
132
  const body = await res.json().catch(() => null);
@@ -119,7 +139,9 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
119
139
  const files = Array.isArray(args.files) ? args.files.filter((f) => typeof f === 'string') : [];
120
140
  if (files.length === 0)
121
141
  throw new Error('reply-document: files must be a non-empty string array');
122
- const caption = typeof args.caption === 'string' ? args.caption : undefined;
142
+ let caption = typeof args.caption === 'string' ? args.caption : undefined;
143
+ if (caption !== undefined)
144
+ caption = guardOutbound(caption);
123
145
  const res = await fetch(`${GATEWAY_URL}/wa-channel/reply-document`, {
124
146
  method: 'POST',
125
147
  headers: { 'content-type': 'application/json' },
@@ -157,9 +179,17 @@ async function postReady() {
157
179
  export async function subscribeInbound(opts) {
158
180
  const watchGrower = opts?.watchGrew ?? watchForGrowth;
159
181
  const notificationTimeoutMs = opts?.notificationTimeoutMs ?? NOTIFICATION_RETRY_TIMEOUT_MS;
182
+ const followTurns = opts?.followTurnEnds ?? followTurnEnds;
160
183
  const sessionId = process.env.WA_CHANNEL_SESSION_ID;
161
184
  const findJsonlFn = opts?.findJsonl ?? ((s) => findJsonlForSessionId(s));
162
- const jsonlPath = sessionId ? findJsonlFn(sessionId) : null;
185
+ let jsonlPath = sessionId ? findJsonlFn(sessionId) : null;
186
+ // Task 839 — one session-long follower reports every assistant end_turn; the
187
+ // channel server counts the inbounds it emits (pendingTurns) and delivers a
188
+ // turn-end decision only while an inbound is outstanding. A turn queued
189
+ // mid-turn is covered by the next end_turn the follower reports, and a
190
+ // claude.ai-driven turn (pendingTurns === 0) delivers nothing.
191
+ let pendingTurns = 0;
192
+ let followerStarted = false;
163
193
  const url = `${GATEWAY_URL}/wa-channel/inbound?senderId=${encodeURIComponent(SENDER_ID)}`;
164
194
  for (;;) {
165
195
  try {
@@ -208,6 +238,18 @@ export async function subscribeInbound(opts) {
208
238
  // misroute can be reconciled against the dispatch detector (Task 747).
209
239
  const composed = composeAdminContent(payload);
210
240
  console.error(`[reframe] op=applied sender=${SENDER_ID.slice(0, 8)} channel=whatsapp payloadBytes=${composed.payloadBytes}`);
241
+ // Task 832 — JSONL byte offset at turn start, captured before the emit
242
+ // so the turn-follow catches every line this turn produces. Resilient:
243
+ // a missing/odd file yields 0 and the follow bails fast.
244
+ let turnStartOffset = 0;
245
+ if (jsonlPath) {
246
+ try {
247
+ turnStartOffset = statSync(jsonlPath).size;
248
+ }
249
+ catch {
250
+ turnStartOffset = 0;
251
+ }
252
+ }
211
253
  await mcp.notification({
212
254
  method: 'notifications/claude/channel',
213
255
  params: { content: composed.content },
@@ -259,6 +301,48 @@ export async function subscribeInbound(opts) {
259
301
  }
260
302
  }
261
303
  }
304
+ // Task 839 — count this inbound and ensure the session-long follower
305
+ // is running. The follower reports every assistant end_turn; each
306
+ // callback delivers a turn-end decision (and decrements) only while an
307
+ // inbound is outstanding, so a turn queued mid-turn is covered by the
308
+ // next end_turn the follower reports, and a claude.ai-driven turn
309
+ // (pendingTurns === 0) delivers nothing. Re-resolve the path lazily
310
+ // when it was absent at startup (brand-new session whose JSONL appears
311
+ // on the first turn). The follower is detached so the SSE read loop
312
+ // keeps receiving.
313
+ if (!jsonlPath && sessionId)
314
+ jsonlPath = findJsonlFn(sessionId);
315
+ if (jsonlPath) {
316
+ pendingTurns++;
317
+ if (!followerStarted) {
318
+ followerStarted = true;
319
+ const followPath = jsonlPath;
320
+ const followStart = turnStartOffset;
321
+ void followTurns(followPath, followStart, (outcome) => {
322
+ if (pendingTurns <= 0)
323
+ return;
324
+ pendingTurns--;
325
+ // Task 834 — the turn-end fallback delivers finalText to the
326
+ // sender only when no reply tool was called (replied === false);
327
+ // guard that delivered text. When replied is true the gateway
328
+ // ignores finalText, so leave it unredacted (no spurious log).
329
+ const finalText = outcome.replied ? outcome.finalText : guardOutbound(outcome.finalText);
330
+ void fetch(`${GATEWAY_URL}/wa-channel/turn-end`, {
331
+ method: 'POST',
332
+ headers: { 'content-type': 'application/json' },
333
+ body: JSON.stringify(buildTurnEndPostBody(SENDER_ID, sessionId ?? '', outcome.replied, finalText)),
334
+ }).catch(() => { });
335
+ }).finally(() => {
336
+ // The follower only settles on a stat failure (file unreadable —
337
+ // the session is ending). Any outstanding pendingTurns are no
338
+ // longer followable, so clear them: a replacement follower
339
+ // started by a later inbound begins clean rather than carrying a
340
+ // phantom count that would over-deliver onto future turns.
341
+ pendingTurns = 0;
342
+ followerStarted = false;
343
+ });
344
+ }
345
+ }
262
346
  }
263
347
  }
264
348
  console.error('[whatsapp-channel] inbound stream closed by gateway; reconnecting');
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface TurnOutcome {
2
+ /** A reply/reply-document tool_use appeared in the turn. */
3
+ replied: boolean;
4
+ /** Text of the end_turn assistant message ('' when none / not yet reached). */
5
+ finalText: string;
6
+ /** The turn reached an assistant end_turn. */
7
+ reachedEndTurn: boolean;
8
+ }
9
+ /** Fold one turn's JSONL line strings into the delivery decision. Pure. */
10
+ export declare function reduceTurnFromLines(lines: string[]): TurnOutcome;
11
+ export type OnTurnEnd = (outcome: TurnOutcome) => void;
12
+ /**
13
+ * Tail `jsonlPath` from `startOffset` for the life of the session, invoking
14
+ * `onTurnEnd` once for every assistant end_turn with that turn's outcome
15
+ * (Task 839). Unlike a one-shot follow it does not stop at the first end_turn:
16
+ * it segments the JSONL at each end_turn so a follow-on turn produced from a
17
+ * mid-turn-queued message is reported too. The process dies with the session,
18
+ * so there is no per-turn timeout; the promise resolves only when the file
19
+ * becomes unreadable (mirrors watchForGrowth's stat-failure bail). Never rejects.
20
+ */
21
+ export declare function followTurnEnds(jsonlPath: string, startOffset: number, onTurnEnd: OnTurnEnd): Promise<void>;
22
+ //# sourceMappingURL=turn-follow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-follow.d.ts","sourceRoot":"","sources":["../src/turn-follow.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAA;IAChB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,cAAc,EAAE,OAAO,CAAA;CACxB;AAUD,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAoChE;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;AActD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAuEf"}
@@ -0,0 +1,157 @@
1
+ // Turn-end detector for the WhatsApp native channel (Task 832, extended in
2
+ // Task 839). Pure of the MCP SDK so it unit-tests in isolation.
3
+ // `reduceTurnFromLines` folds one turn's JSONL lines into the delivery decision;
4
+ // `followTurnEnds` tails the session JSONL from a byte offset and reports every
5
+ // assistant end_turn (not just the first), so a follow-on turn produced from a
6
+ // mid-turn-queued message is covered too.
7
+ import { closeSync, openSync, readSync, statSync, watch } from 'node:fs';
8
+ // The reply tools the agent uses to deliver to WhatsApp. Either one appearing in
9
+ // a turn means the operator received something this turn — so the turn was not
10
+ // silent and no text fallback fires. Mirrors WA_CHANNEL_SERVER_NAME
11
+ // ('whatsapp-channel') in claude-session-manager's wa-channel-mcp.ts; kept as a
12
+ // literal here to avoid a cross-package import.
13
+ const REPLY_TOOL_NAMES = new Set([
14
+ 'mcp__whatsapp-channel__reply',
15
+ 'mcp__whatsapp-channel__reply-document',
16
+ ]);
17
+ /** Fold one turn's JSONL line strings into the delivery decision. Pure. */
18
+ export function reduceTurnFromLines(lines) {
19
+ let replied = false;
20
+ let finalText = '';
21
+ let reachedEndTurn = false;
22
+ for (const line of lines) {
23
+ if (!line)
24
+ continue;
25
+ let ev;
26
+ try {
27
+ ev = JSON.parse(line);
28
+ }
29
+ catch {
30
+ continue;
31
+ }
32
+ if (ev.type !== 'assistant')
33
+ continue;
34
+ const msg = ev.message;
35
+ const isEnd = msg?.stop_reason === 'end_turn';
36
+ if (!msg || !Array.isArray(msg.content)) {
37
+ if (isEnd) {
38
+ reachedEndTurn = true;
39
+ finalText = '';
40
+ }
41
+ continue;
42
+ }
43
+ let endText = '';
44
+ for (const block of msg.content) {
45
+ if (block?.type === 'tool_use' && typeof block.name === 'string' && REPLY_TOOL_NAMES.has(block.name)) {
46
+ replied = true;
47
+ }
48
+ else if (block?.type === 'text' && typeof block.text === 'string' && isEnd) {
49
+ endText += block.text;
50
+ }
51
+ }
52
+ if (isEnd) {
53
+ reachedEndTurn = true;
54
+ finalText = endText;
55
+ }
56
+ }
57
+ return { replied, finalText, reachedEndTurn };
58
+ }
59
+ /** True iff `line` is an assistant message with stop_reason 'end_turn'. */
60
+ function isAssistantEndTurn(line) {
61
+ if (!line)
62
+ return false;
63
+ let ev;
64
+ try {
65
+ ev = JSON.parse(line);
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ return ev.type === 'assistant' && ev.message?.stop_reason === 'end_turn';
71
+ }
72
+ /**
73
+ * Tail `jsonlPath` from `startOffset` for the life of the session, invoking
74
+ * `onTurnEnd` once for every assistant end_turn with that turn's outcome
75
+ * (Task 839). Unlike a one-shot follow it does not stop at the first end_turn:
76
+ * it segments the JSONL at each end_turn so a follow-on turn produced from a
77
+ * mid-turn-queued message is reported too. The process dies with the session,
78
+ * so there is no per-turn timeout; the promise resolves only when the file
79
+ * becomes unreadable (mirrors watchForGrowth's stat-failure bail). Never rejects.
80
+ */
81
+ export async function followTurnEnds(jsonlPath, startOffset, onTurnEnd) {
82
+ let baseSize;
83
+ try {
84
+ baseSize = statSync(jsonlPath).size;
85
+ }
86
+ catch {
87
+ return;
88
+ }
89
+ return new Promise((resolve) => {
90
+ let offset = Math.min(startOffset, baseSize);
91
+ let carry = '';
92
+ // The lines of the turn currently being accumulated; reset after each
93
+ // end_turn so each onTurnEnd sees exactly one turn's lines.
94
+ let segment = [];
95
+ let settled = false;
96
+ const settle = () => {
97
+ if (settled)
98
+ return;
99
+ settled = true;
100
+ watcher.close();
101
+ clearInterval(poll);
102
+ resolve();
103
+ };
104
+ // Poll as well as watch: fs.watch misses appends on some platforms (notably
105
+ // macOS), so a light poll guarantees growth is seen within the interval.
106
+ const poll = setInterval(() => drain(), 200);
107
+ // Fully synchronous read of newly-appended bytes. Being synchronous, two
108
+ // pending invocations (the poll and the fs.watch callback) run to completion
109
+ // serially on the event loop, so `offset`/`carry`/`segment` advance
110
+ // atomically per call — overlapping reads can never reassemble bytes out of
111
+ // order or split a turn across two onTurnEnd calls.
112
+ const drain = () => {
113
+ let end;
114
+ try {
115
+ end = statSync(jsonlPath).size;
116
+ }
117
+ catch {
118
+ settle();
119
+ return;
120
+ }
121
+ if (end <= offset)
122
+ return;
123
+ let buf;
124
+ try {
125
+ const fd = openSync(jsonlPath, 'r');
126
+ try {
127
+ buf = Buffer.alloc(end - offset);
128
+ readSync(fd, buf, 0, buf.length, offset);
129
+ }
130
+ finally {
131
+ closeSync(fd);
132
+ }
133
+ }
134
+ catch {
135
+ settle();
136
+ return;
137
+ }
138
+ offset = end;
139
+ carry += buf.toString('utf8');
140
+ let nl = carry.indexOf('\n');
141
+ while (nl !== -1) {
142
+ const line = carry.slice(0, nl);
143
+ carry = carry.slice(nl + 1);
144
+ nl = carry.indexOf('\n');
145
+ segment.push(line);
146
+ if (isAssistantEndTurn(line)) {
147
+ onTurnEnd(reduceTurnFromLines(segment));
148
+ segment = [];
149
+ }
150
+ }
151
+ };
152
+ const watcher = watch(jsonlPath, { persistent: false }, () => drain());
153
+ watcher.on('error', () => settle());
154
+ drain(); // catch lines already present between startOffset and now
155
+ });
156
+ }
157
+ //# sourceMappingURL=turn-follow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-follow.js","sourceRoot":"","sources":["../src/turn-follow.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ Decide the precise operations against the schema, execute them with the writers
22
22
 
23
23
  ## Typed-edge auto-extraction pass (on `/insight`)
24
24
 
25
- When admin's brief names the typed-edge pass (Task 305) and supplies a `sinceIso` timestamp, call `memory-typed-edge-pass` with that timestamp exactly once. The tool reads prose-bearing nodes (Message/Page/Meeting/KnowledgeDocument/ConversationArchive/Idea/Note/Post/Report — `:KnowledgeDocument` covers email threads via `source:'email'` since Task 321; `:ConversationArchive` covers chat transcripts since Task 397) the account wrote since `sinceIso`, asks Haiku for typed-edge proposals against a closed allowlist, validates each one, and MERGEs accepted edges with `createdBy` provenance. Return the full counter object verbatim — admin needs `nodesProcessed` and `accepted` for its insight-pass summary. Do not reinterpret the counts or summarise them.
25
+ When admin's brief names the typed-edge pass and supplies a `sinceIso` timestamp, call `memory-typed-edge-pass` with that timestamp exactly once. The tool reads prose-bearing nodes (Message/Page/Meeting/KnowledgeDocument/ConversationArchive/Idea/Note/Post/Report — `:KnowledgeDocument` covers email threads via `source:'email'`; `:ConversationArchive` covers chat transcripts) the account wrote since `sinceIso`, asks Haiku for typed-edge proposals against a closed allowlist, validates each one, and MERGEs accepted edges with `createdBy` provenance. Return the full counter object verbatim — admin needs `nodesProcessed` and `accepted` for its insight-pass summary. Do not reinterpret the counts or summarise them.
26
26
 
27
27
  ## Bulk external archives route elsewhere
28
28
 
@@ -34,7 +34,7 @@ The dispatch brief from the admin agent names the input class. Map it to one ski
34
34
  | Input | Skill | Parent label |
35
35
  |---|---|---|
36
36
  | Document (PDF / text / web page) | `document-ingest` (mode='document') | `:KnowledgeDocument` (keyed on `attachmentId`) |
37
- | Conversation transcript (any source) | `conversation-archive` | `:ConversationArchive` (Task 397 — keyed on `conversationIdentity`) |
37
+ | Conversation transcript (any source) | `conversation-archive` | `:ConversationArchive` (keyed on `conversationIdentity`) |
38
38
  | Granola / Otter / Circleback meeting ingest (provider MCP connected to the host) | `conversation-archive-mcp` | `:ConversationArchive` (same identity formula as `conversation-archive`; source ∈ {granola, otter, circleback}; per-provider meeting ID and `calendarEventId` stamped as cross-references) |
39
39
  | Per-row enrich pass over an existing conversation-document parent | `conversation-archive-enrich` | (mutates existing `:Section` chunks) |
40
40
  | LinkedIn Basic Data Export directory | `linkedin-import` | flat-dataset MERGE via `memory-archive-write` |
@@ -44,7 +44,7 @@ If the brief is ambiguous between two skills (e.g. an unzipped tree that contain
44
44
 
45
45
  ## Graph hierarchy
46
46
 
47
- Every node has a parent in the canonical chain `LocalBusiness → Project → Task | Person | Organisation | KnowledgeDocument | ConversationArchive` (Task 397 promoted `:ConversationArchive` to a peer parent). The wrapped writers reject orphans. The four ingest skills each name the anchor or participant flow that must complete before any write; honour those flows.
47
+ Every node has a parent in the canonical chain `LocalBusiness → Project → Task | Person | Organisation | KnowledgeDocument | ConversationArchive` (`:ConversationArchive` is a peer parent). The wrapped writers reject orphans. The four ingest skills each name the anchor or participant flow that must complete before any write; honour those flows.
48
48
 
49
49
  ## When a tool returns an error
50
50
 
@@ -0,0 +1 @@
1
+ import{o as e}from"./chunk-Pqm5yXtL.js";import{a as t,n,r,t as i}from"./jsx-runtime-Brvwqc85.js";import{a,c as o,o as s,r as c,s as l,t as u}from"./file-download-CU0xHXGF.js";import{l as d,o as f,r as p,t as m}from"./useSelectionMode-FzQBlPMx.js";async function h(){try{let e=await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})});return e.ok?(await e.json().catch(()=>({})))?.logged_out===!0:(console.error(`[admin-ui] claude-logout http-status=${e.status}`),!1)}catch(e){return console.error(`[admin-ui] claude-logout fetch failed: ${e instanceof Error?e.message:String(e)}`),!1}}var g=r(`archive-restore`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),_=r(`archive`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]),v=r(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),y=r(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),b=r(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),x=r(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),S=r(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),ee=r(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),C=r(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]),w=r(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),te=r(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),T=r(`list-todo`,[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]),ne=r(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),re=r(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),ie=r(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),E=r(`panel-right-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]),ae=r(`panel-right`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),oe=r(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),D=r(`share-2`,[[`circle`,{cx:`18`,cy:`5`,r:`3`,key:`gq8acd`}],[`circle`,{cx:`6`,cy:`12`,r:`3`,key:`w7nqdw`}],[`circle`,{cx:`18`,cy:`19`,r:`3`,key:`1xt0gg`}],[`line`,{x1:`8.59`,x2:`15.42`,y1:`13.51`,y2:`17.49`,key:`47mynk`}],[`line`,{x1:`15.41`,x2:`8.59`,y1:`6.51`,y2:`10.49`,key:`1n3mei`}]]),O=r(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]),se=r(`unplug`,[[`path`,{d:`m19 5 3-3`,key:`yk6iyv`}],[`path`,{d:`m2 22 3-3`,key:`19mgm9`}],[`path`,{d:`M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z`,key:`goz73y`}],[`path`,{d:`M7.5 13.5 10 11`,key:`7xgeeb`}],[`path`,{d:`M10.5 16.5 13 14`,key:`10btkg`}],[`path`,{d:`m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z`,key:`1snsnr`}]]),k=r(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),A=e(t(),1),j=i();function M(e){let{businessName:t,variant:r=`admin`,onNavigate:i,onToggleSidebar:o,sidebarOpen:s,onLogout:u,onDisconnect:d,disconnecting:m}=e,[h,g]=(0,A.useState)(!1),_=(0,A.useRef)(null),v=(0,A.useRef)(null),y=c(null),[C,T]=(0,A.useState)(null),[ie,oe]=(0,A.useState)(!1),[O,k]=(0,A.useState)(null),[M,N]=(0,A.useState)(null),[P,F]=(0,A.useState)(!1),[I,L]=(0,A.useState)(null),[R,ce]=(0,A.useState)(null),[le,z]=(0,A.useState)(``);(0,A.useEffect)(()=>{z(window.location.hostname.startsWith(`admin.`)?window.location.origin.replace(`admin.`,`public.`):window.location.origin)},[]),(0,A.useEffect)(()=>{if(!h)return;let e=e=>{_.current&&!_.current.contains(e.target)&&g(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[h]),(0,A.useEffect)(()=>{if(!h)return;let e=e=>{e.key===`Escape`&&g(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h]),(0,A.useEffect)(()=>{h&&v.current?.focus()},[h]),(0,A.useEffect)(()=>{if(!h||r!==`admin`)return;let e=!1;return y(`/api/admin/version`).then(e=>e.json()).then(t=>{e||ce(t)}).catch(e=>{console.error(`[admin/version] menu-open client fetch failed:`,e)}),()=>{e=!0}},[h,r,y]);let B=(0,A.useCallback)(()=>{g(e=>{let t=!e;return t&&console.info(`[admin-ui] header-menu-open`),t})},[]),V=(0,A.useCallback)(e=>{g(!1),i(e)},[i]),ue=(0,A.useCallback)(async()=>{if(C!==null){T(null),N(null);return}oe(!0),k(null);try{let e=await y(`/api/admin/agents`);if(!e.ok)throw Error(`Failed to load agents`);T((await e.json()).agents??[])}catch(e){console.error(`[admin/agents] list failed:`,e),k(e instanceof Error?e.message:String(e)),T([])}finally{oe(!1)}},[C,y]),H=(0,A.useCallback)(e=>{N(null),T(t=>t?.filter(t=>t.slug!==e)??null),y(`/api/admin/agents/${encodeURIComponent(e)}`,{method:`DELETE`}).catch(e=>console.error(`[admin/agents] delete failed:`,e))},[y]),de=(0,A.useCallback)(()=>{g(!1),u()},[u]),fe=(0,A.useCallback)(async()=>{L(null),await d()?(F(!1),g(!1)):L(`Disconnect failed — credentials still present. Try again.`)},[d]),pe=t||p.productName;return(0,j.jsxs)(`header`,{className:`admin-header`,children:[r===`admin`&&(0,j.jsx)(`button`,{type:`button`,className:`admin-sidebar-toggle`,"aria-label":s?`Hide sidebar`:`Show sidebar`,title:s?`Hide sidebar`:`Show sidebar`,"aria-expanded":s,onClick:o,children:s?(0,j.jsx)(E,{size:20,strokeWidth:1.5}):(0,j.jsx)(ae,{size:20,strokeWidth:1.5})}),(0,j.jsxs)(`div`,{className:`chat-header-label`,children:[(0,j.jsx)(`span`,{className:`chat-logo-btn`,"aria-hidden":`true`,children:(0,j.jsx)(`img`,{src:f,alt:``,className:`chat-logo`})}),(0,j.jsx)(`h1`,{className:`chat-tagline`,children:pe})]}),(0,j.jsxs)(`div`,{className:`chat-burger-wrap`,ref:_,children:[(0,j.jsx)(`button`,{type:`button`,className:`admin-burger`,onClick:B,"aria-label":`Menu`,"aria-haspopup":`true`,"aria-expanded":h,children:(0,j.jsx)(re,{size:20})}),h&&(0,j.jsxs)(`div`,{className:`admin-menu`,role:`menu`,children:[r===`admin`&&(0,j.jsxs)(`button`,{ref:v,type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`dashboard`),children:[(0,j.jsx)(te,{size:14}),` Dashboard`]}),r===`operator`&&(0,j.jsxs)(`button`,{ref:v,type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`chat`),children:[(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`chat-menu-claude-icon`}),` Chat`]}),(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`data`),children:[(0,j.jsx)(x,{size:14}),` Data`]}),r===`admin`&&(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`graph`),children:[(0,j.jsx)(D,{size:14}),` Graph`]}),r===`admin`&&(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`browser`),children:[(0,j.jsx)(ee,{size:14}),` Browser`]}),r===`admin`&&(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>V(`chat`),children:[(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`chat-menu-claude-icon`}),` Chat`]}),r===`admin`&&(0,j.jsx)(`div`,{className:`chat-menu-divider`}),r===`admin`&&(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:ue,children:[(0,j.jsx)(S,{size:14}),` Public`,ie&&(0,j.jsx)(l,{size:12,className:`spin`})]}),r===`admin`&&C!==null&&(0,j.jsxs)(`div`,{className:`chat-menu-agents`,children:[O&&(0,j.jsx)(`span`,{className:`chat-menu-agent-error`,children:O}),C.length===0&&!O&&(0,j.jsx)(`span`,{className:`chat-menu-agent-empty`,children:`No public agents configured`}),C.map(e=>(0,j.jsxs)(`div`,{className:`chat-menu-item chat-menu-agent-item`,children:[(0,j.jsx)(`span`,{className:`agent-status-dot ${e.status}`}),(0,j.jsxs)(`span`,{className:`agent-text`,children:[(0,j.jsx)(`span`,{className:`agent-display-name`,children:e.displayName}),(0,j.jsxs)(`span`,{className:`agent-slug`,children:[`/`,e.slug]})]}),M===e.slug?(0,j.jsxs)(`span`,{className:`agent-actions agent-confirm`,children:[(0,j.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-yes`,title:`Confirm delete`,onClick:()=>H(e.slug),children:(0,j.jsx)(b,{size:12})}),(0,j.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-no`,title:`Cancel`,onClick:()=>N(null),children:(0,j.jsx)(a,{size:12})})]}):(0,j.jsxs)(`span`,{className:`agent-actions`,children:[(0,j.jsx)(`a`,{href:`${le}/${e.slug}`,target:`_blank`,rel:`noopener noreferrer`,className:`agent-action-btn`,title:`Open agent`,onClick:()=>g(!1),children:(0,j.jsx)(S,{size:12})}),(0,j.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-delete-btn`,title:`Delete agent`,onClick:()=>N(e.slug),children:(0,j.jsx)(n,{size:12})})]})]},e.slug))]}),r===`admin`&&(0,j.jsx)(`div`,{className:`chat-menu-divider`}),r===`admin`&&(0,j.jsxs)(`div`,{className:`chat-menu-version chat-menu-version-passive`,children:[(0,j.jsx)(w,{size:14}),(0,j.jsxs)(`span`,{className:`version-installed`,children:[R?`v${R.installed}`:`…`,R&&!R.updateAvailable&&(0,j.jsx)(`span`,{className:`version-uptodate-dot`}),R?.updateAvailable&&(0,j.jsx)(`span`,{className:`version-update-dot`})]})]}),r===`admin`&&(P?(0,j.jsxs)(`div`,{className:`chat-menu-item chat-menu-disconnect`,children:[(0,j.jsx)(`span`,{children:`Disconnect Claude account?`}),(0,j.jsxs)(`span`,{className:`agent-actions agent-confirm`,children:[(0,j.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-yes`,title:`Confirm disconnect`,disabled:m,onClick:fe,children:m?(0,j.jsx)(l,{size:12,className:`spin`}):(0,j.jsx)(b,{size:12})}),(0,j.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-no`,title:`Cancel disconnect`,disabled:m,onClick:()=>{F(!1),L(null)},children:(0,j.jsx)(a,{size:12})})]})]}):(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item chat-menu-disconnect`,role:`menuitem`,onClick:()=>{L(null),F(!0)},children:[(0,j.jsx)(se,{size:14}),` Disconnect Claude account`]})),r===`admin`&&I&&(0,j.jsx)(`span`,{className:`chat-menu-agent-error`,children:I}),(0,j.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:de,children:[(0,j.jsx)(ne,{size:14}),` Log out`]})]})]})]})}var N=`maxy-shell-side-px`;function P(){if(typeof window>`u`)return 0;let e=document.querySelector(`.platform > .artefact`)?.getBoundingClientRect();return e&&e.width>0?Math.round(e.width):0}function F(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=Math.max(248,t-480-P());return Math.min(Math.max(e,248),n)}function I(){if(typeof window>`u`)return 264;try{let e=window.localStorage.getItem(N);if(!e)return 264;let t=parseInt(e,10);if(!Number.isFinite(t))return console.warn(`[admin-ui] sidebar-width-parse-failed stored=${JSON.stringify(e)} fallback=264`),264;if(t>=248)return F(t)}catch{}return 264}function L({targetSelector:e=`.platform`}){let t=(0,A.useRef)(null),[n,r]=(0,A.useState)(()=>I()),i=(0,A.useRef)(n);(0,A.useLayoutEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--side-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,A.useCallback)(()=>{r(e=>{let t=F(e);return t===e?e:t})},[]);(0,A.useEffect)(()=>{a(),window.addEventListener(`resize`,a);let t=document.querySelector(e),n=null;return t instanceof HTMLElement&&(n=new MutationObserver(a),n.observe(t,{attributes:!0,attributeFilter:[`data-artefact`,`class`]})),()=>{window.removeEventListener(`resize`,a),n?.disconnect()}},[a,e]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(F(Math.round(e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(N,String(t))}catch{}console.info(`[admin-ui] sidebar-resize px=${t}`)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{let e=F(264);r(e);try{window.localStorage.removeItem(N)}catch{}console.info(`[admin-ui] sidebar-resize px=${e}`)};return(0,j.jsx)(`div`,{ref:t,className:`side-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize sidebar`,onPointerDown:o,onDoubleClick:s})}var R={whatsapp:{fill:`#25D366`,label:`WhatsApp`,path:`M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.71.306 1.263.489 1.694.625.712.227 1.36.195 1.872.118.571-.085 1.758-.719 2.006-1.413.247-.694.247-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.885-9.885 9.885M20.52 3.449C18.24 1.245 15.24.044 12.045.044 5.463.044.103 5.404.1 11.99c0 2.096.546 4.142 1.588 5.945L0 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.585 0 11.946-5.36 11.949-11.946 0-3.193-1.24-6.19-3.495-8.445`},telegram:{fill:`#229ED9`,label:`Telegram`,path:`M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z`}};function ce({channel:e,size:t=16}){let n=R[e];return(0,j.jsx)(`svg`,{width:t,height:t,viewBox:`0 0 24 24`,fill:n.fill,role:`img`,"aria-label":n.label,className:`channel-icon`,children:(0,j.jsx)(`path`,{d:n.path})})}var le=[`whatsapp`,`telegram`];function z(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function B(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}var V=`auth-refresh-failed`;function ue({error:e,onClose:t}){if(!e)return null;let n=e.reason===V,r=n?`Claude sign-in expired`:`Session didn’t open`,i=n?`Your claude.ai login has expired. Re-authenticate to resume sessions.`:`The session did not bind within 60 seconds, so there is no live conversation to open.`;return(0,j.jsx)(`div`,{className:`claude-info-overlay`,onClick:t,children:(0,j.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Session could not be opened`,children:[(0,j.jsxs)(`div`,{className:`claude-info-header`,children:[(0,j.jsx)(`span`,{children:r}),(0,j.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:`✕`})]}),(0,j.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[i,(0,j.jsxs)(`div`,{className:`claude-info-row`,style:{marginTop:`8px`},children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Reason`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:e.reason})]}),e.sessionId&&(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,j.jsxs)(`span`,{className:`claude-info-value`,children:[e.sessionId.slice(0,8),`…`]})]})]})]})})}function H(e){let{show:t,onClose:n,claudeInfo:r,messages:i,sessionElapsed:a,sessionId:o,cacheKey:s}=e,[c,l]=(0,A.useState)(null);if(!t)return null;let u=i.flatMap(e=>e.events?.filter(e=>e.type===`usage`)??[]),d=u.at(-1),f=d?.peak_request_pct==null?d?.context_window?Math.round((d.input_tokens+d.cache_creation_tokens+d.cache_read_tokens)/d.context_window*100):0:Math.round(d.peak_request_pct*100),p=u.reduce((e,t)=>e+t.input_tokens+t.cache_creation_tokens+t.cache_read_tokens+t.output_tokens,0),h=i.flatMap(e=>e.events?.filter(e=>e.type===`rate_limit`)??[]).at(-1),g=u.reduce((e,t)=>e+(t.total_cost_usd??0),0),_=r?.account?.subscriptionType,v=e=>{let t=e*1e3-Date.now();if(t<=0)return`now`;let n=Math.floor(t/36e5),r=Math.floor(t%36e5/6e4);return n>0?`${n}h ${r}m`:`${r}m`};return(0,j.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,j.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),children:[(0,j.jsxs)(`div`,{className:`claude-info-header`,children:[(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`claude-info-icon`}),(0,j.jsx)(`span`,{children:`Claude Code`}),(0,j.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,j.jsxs)(`div`,{className:`claude-info-section`,children:[(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Version`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:r?r.version:`…`})]}),(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Email`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:r?.account?.email??`…`})]})]}),(_||h||g>0)&&(0,j.jsxs)(`div`,{className:`claude-info-section`,children:[_&&(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Plan`}),(0,j.jsx)(`span`,{className:`claude-info-value`,style:{textTransform:`capitalize`},children:_})]}),h&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Usage`}),(0,j.jsxs)(`span`,{className:`claude-info-value`,children:[Math.round(h.utilization*100),`%`]})]}),(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Resets in`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:v(h.resetsAt)})]}),h.isUsingOverage&&(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Overage`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:`Active`})]})]}),g>0&&(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Session cost`}),(0,j.jsxs)(`span`,{className:`claude-info-value`,children:[`$`,g<.01?g.toFixed(4):g.toFixed(2)]})]})]}),(0,j.jsxs)(`div`,{className:`claude-info-section`,children:[(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Model`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:r?.model??`…`})]}),(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Context used`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:f>0?`${f}%`:`—`})]}),(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Tokens`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:p>0?B(p):`—`})]}),(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,j.jsx)(`span`,{className:`claude-info-value`,children:z(a)})]}),(o||s)&&(()=>{let e=o??s??``;return(0,j.jsxs)(`div`,{className:`claude-info-row`,children:[(0,j.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,j.jsx)(`button`,{type:`button`,className:`claude-info-value claude-info-id-copy`,title:`${e} (${o?`flushed`:`pre-flush`}) — click to copy`,onClick:async()=>{l(await m(e)?`copied`:`failed`),setTimeout(()=>l(null),1200)},children:c===`copied`?`copied ✓`:c===`failed`?`copy failed ✕`:`${e.slice(0,8)}…`})]})})()]})]})})}var de=`https://claude.ai/code`,fe=[500,1e3,1500,2e3,2500,3e3,3e3];function pe(e,t,n){if(e&&n.target)return{kind:`navigate`,url:n.target};let r=n.slug??n.bridgeSessionId??null;if(e&&r)return{kind:`navigate`,url:`${de}/${r}`};let i=n.reason||n.error||`status ${t}`;return{kind:`error`,sessionId:n.sessionId??null,reason:i}}function me(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function U(e){let{businessName:t,cacheKey:r,role:i,userName:a,userAvatar:l,onSelectProjects:f,onSelectPeople:m,onSelectTasks:h,onSelectAgents:b,onCloseMobileDrawer:x,variant:ee=`admin`,collapsed:w,selectedWhatsappId:te,onSelectWhatsappConversation:ne,initialWhatsappSurface:re=!1}=e,E=c(r),ae=p.productName,D=typeof a==`string`?a:a===null?`name unavailable`:t||ae,se=(D.trim().charAt(0)||`?`).toUpperCase(),[M,N]=(0,A.useState)(re?`whatsapp`:`sessions`),[P,F]=(0,A.useState)([]),[I,L]=(0,A.useState)(!1),[R,z]=(0,A.useState)(null),[B,V]=(0,A.useState)(!1),[H,de]=(0,A.useState)(`file`),[U,W]=(0,A.useState)(null),[G,K]=(0,A.useState)(null),[q,_e]=(0,A.useState)([]),[J,ve]=(0,A.useState)(!1),[Y,ye]=(0,A.useState)(null),[X,be]=(0,A.useState)(!1),[xe,Se]=(0,A.useState)(!1),[Ce,we]=(0,A.useState)(!1),[Te,Ee]=(0,A.useState)(null),[De,Oe]=(0,A.useState)(new Set),[ke,Ae]=(0,A.useState)(new Set),[je,Me]=(0,A.useState)(new Set),[Ne,Pe]=(0,A.useState)(new Set),[Z,Fe]=(0,A.useState)(!1),[Ie,Le]=(0,A.useState)([]),[Re,ze]=(0,A.useState)(!1),[Be,Ve]=(0,A.useState)(null),[He,Ue]=(0,A.useState)(`whatsapp`),We=(0,A.useCallback)(e=>{if(x(),!r){console.error(`[admin-ui] artefact-download-blocked id=${e.id} reason=no-cache-key`),W({message:`Session not ready — try again`,failed:!0});return}if(!e.downloadPath){console.error(`[admin-ui] artefact-download-blocked id=${e.id} reason=not-downloadable`),W({message:`${e.name} can’t be downloaded`,failed:!0});return}console.info(`[admin-ui] artefact-download id=${e.id} root=${e.downloadRoot??`data`} path=${e.downloadPath}`),u(r,e.downloadPath,e.downloadRoot??`data`),W({message:`Downloading ${e.name}`,failed:!1})},[r,x]);(0,A.useEffect)(()=>{if(!U)return;let e=setTimeout(()=>W(null),2500);return()=>clearTimeout(e)},[U]);let Ge=(0,A.useCallback)(async()=>{if(r){V(!0),z(null);try{let e=await E(`/api/admin/sidebar-artefacts`);if(!e.ok)throw Error(`status ${e.status}`);F((await e.json()).artefacts??[]),L(!0)}catch(e){let t=e instanceof Error?e.message:String(e);z(`Failed to load artefacts: ${t}`),console.error(`[admin-ui] sidebar-artefacts fetch failed: ${t}`)}finally{V(!1)}}},[r,E]),Q=(0,A.useCallback)(async()=>{if(!r)return null;be(!0),ye(null);try{let e=await E(`/api/admin/sidebar-sessions`);if(!e.ok)throw Error(`status ${e.status}`);let t=await e.json(),n=t.sessions??[];return _e(n),Ee(t.accountId??null),ve(!0),n}catch(e){let t=e instanceof Error?e.message:String(e);return ye(`Failed to load sessions: ${t}`),console.error(`[admin-ui] sidebar-sessions fetch failed: ${t}`),null}finally{be(!1)}},[r,E]),Ke=(0,A.useCallback)(async()=>{if(r){Ve(null);try{let e=await E(`/api/whatsapp-reader/conversations`);if(!e.ok)throw Error(`status ${e.status}`);Le((await e.json()).conversations??[]),ze(!0)}catch(e){let t=e instanceof Error?e.message:String(e);Ve(`Couldn't load conversations: ${t}`),console.error(`[admin-ui] channel-convos fetch failed: ${t}`)}}},[r,E]);(0,A.useEffect)(()=>{!r||J||Q()},[r,J,Q]),(0,A.useEffect)(()=>{if(!r)return;let e=null;return Ke(),e=setInterval(()=>{Ke()},he),()=>{e!==null&&clearInterval(e)}},[r,Ke]);let qe=(0,A.useMemo)(()=>{let e=new Map;for(let t of le)e.set(t,[]);for(let t of Ie)e.get(t.channel)?.push(t);for(let t of le)console.info(`[admin-ui] sidebar-nav surface=${t} count=${e.get(t).length}`);return e},[Ie]),Je={whatsapp:`WhatsApp`,telegram:`Telegram`},Ye=()=>{ne(null),N(`artefacts`),console.info(`[admin-ui] sidebar-nav surface=artefacts count=${I?P.length:0} collapsed=${w}`),Ge()},$=1.5,Xe=()=>{console.info(`[admin-ui] sidebar-refresh surface=artefacts`),Ge()},Ze=()=>{ne(null),N(`sessions`),console.info(`[admin-ui] sidebar-nav surface=sessions count=${J?q.length:0} collapsed=${w}`),J||Q()},Qe=()=>{console.info(`[admin-ui] sidebar-refresh surface=sessions`),Q()},$e=e=>{N(`whatsapp`),Ue(e),console.info(`[admin-ui] sidebar-nav surface=${e} count=${qe.get(e)?.length??0} collapsed=${w}`)},et=(0,A.useCallback)(async e=>{if(e.resumable===!1||ke.has(e.sessionId))return;Ae(t=>{let n=new Set(t);return n.add(e.sessionId),n});let t=window.open(``,`_blank`);try{let n=await E(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,name:e.title||e.sessionId})}),r=await n.json().catch(()=>({})),i=pe(n.ok,n.status,{...r,sessionId:r.sessionId??e.sessionId});console.info(`[admin-ui] sidebar-session-resume sessionId=${e.sessionId} status=${n.status} outcome=${i.kind} slug=${r.slug??r.bridgeSessionId??`none`}`),i.kind===`navigate`?(x(),t?t.location.href=i.url:window.open(i.url,`_blank`)):(t?.close(),console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} status=${n.status} reason=${i.reason}`),K(i))}catch(n){t?.close();let r=n instanceof Error?n.message:String(n);console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} error=${r}`),K({sessionId:e.sessionId,reason:r})}finally{Ae(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[E,x,ke]),tt=(0,A.useCallback)(async e=>{let t=e.slice(0,8);for(let n=1;n<=fe.length;n++){await new Promise(e=>setTimeout(e,fe[n-1]));let r=await Q();if(r&&r.some(t=>t.sessionId===e)){console.info(`[admin-ui] sidebar-new-session-converged sessionId=${t} via=retry attempts=${n}`);return}}console.error(`[admin-ui] sidebar-new-session-converge-timeout sessionId=${t}`)},[Q]),nt=(0,A.useCallback)(async()=>{if(Z)return;Fe(!0);let e=window.open(``,`_blank`);try{let t=await E(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}),n=await t.json().catch(()=>({})),r=pe(t.ok,t.status,n);console.info(`[admin-ui] sidebar-new-session-spawned status=${t.status} outcome=${r.kind} slug=${n.slug??n.bridgeSessionId??`none`}`),r.kind===`navigate`?(e?e.location.href=r.url:window.open(r.url,`_blank`),n.sessionId?tt(n.sessionId):console.error(`[admin-ui] sidebar-new-session-converge-skipped reason=no-session-id`)):(e?.close(),console.error(`[admin-ui] sidebar-new-session-failed status=${t.status} reason=${r.reason}`),K(r))}catch(t){e?.close();let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-new-session-failed error=${n}`),K({sessionId:null,reason:n})}finally{Fe(!1)}},[E,Z,tt]),rt=(0,A.useCallback)(async(e,t)=>{if(e.stopPropagation(),!De.has(t.sessionId)){Oe(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await E(`/api/admin/session-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId})});if(!e.ok){let n=await e.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${t.sessionId} status=${e.status} error=${n.error??`unknown`}`),W({message:`Delete failed: ${n.error??`status ${e.status}`}`,failed:!0});return}let n=await e.json();console.info(`[admin-ui] sidebar-session-delete sessionId=${t.sessionId} pidKilled=${n.pidKilled??`?`} deleted=${n.deleted??`?`}`),_e(e=>e.filter(e=>e.sessionId!==t.sessionId)),Q()}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${t.sessionId} error=${n}`),W({message:`Delete failed: ${n}`,failed:!0})}finally{Oe(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[E,De,Q]),it=(0,A.useCallback)(async(e,t)=>{if(e.stopPropagation(),!je.has(t.sessionId)){Me(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await E(`/api/admin/session-stop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId})});if(!e.ok){let n=await e.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} status=${e.status} error=${n.error??`unknown`}`),W({message:`Stop failed: ${n.error??`status ${e.status}`}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-stop sessionId=${t.sessionId}`),Q()}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} error=${n}`),W({message:`Stop failed: ${n}`,failed:!0})}finally{Me(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[E,je,Q]),at=(0,A.useCallback)(async(e,t,n)=>{if(e.stopPropagation(),!Ne.has(t.sessionId)){Pe(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await E(`/api/admin/session-archive`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId,mode:n})});if(!e.ok){let r=await e.json().catch(()=>({})),i=r.detail??r.error??`status ${e.status}`;console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} status=${e.status} error=${r.error??`unknown`}`),W({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${i}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-archive sessionId=${t.sessionId} mode=${n}`),Q()}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} error=${r}`),W({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${r}`,failed:!0})}finally{Pe(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[E,Ne,Q]);return(0,j.jsxs)(`aside`,{className:`side`,children:[(0,j.jsx)(`div`,{className:`side-new-session-row`,children:(0,j.jsxs)(`button`,{type:`button`,className:`side-new-session`,onClick:nt,disabled:Z,"aria-busy":Z,children:[(0,j.jsx)(oe,{size:14}),(0,j.jsx)(`span`,{children:Z?`Spawning…`:`New session`})]})}),(0,j.jsxs)(`nav`,{className:`side-nav`,children:[ee===`admin`&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=people`),m(),x()},children:[(0,j.jsx)(k,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`People`}),(0,j.jsx)(`span`,{className:`kbd`})]}),(0,j.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=agents`),b(),x()},children:[(0,j.jsx)(v,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`Agents`}),(0,j.jsx)(`span`,{className:`kbd`})]}),(0,j.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=projects`),f(),x()},children:[(0,j.jsx)(y,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`Projects`}),(0,j.jsx)(`span`,{className:`kbd`})]}),(0,j.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=tasks`),h(),x()},children:[(0,j.jsx)(T,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`Tasks`}),(0,j.jsx)(`span`,{className:`kbd`})]}),(0,j.jsxs)(`button`,{type:`button`,className:`nav-row${M===`artefacts`?` active`:``}`,onClick:Ye,children:[(0,j.jsx)(d,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`Artefacts`}),(0,j.jsx)(`span`,{className:`kbd`})]})]}),(0,j.jsxs)(`button`,{type:`button`,className:`nav-row${M===`sessions`?` active`:``}`,onClick:Ze,children:[(0,j.jsx)(C,{size:20,strokeWidth:$}),(0,j.jsx)(`span`,{className:`label`,children:`Sessions`}),(0,j.jsx)(`span`,{className:`kbd`})]}),Re&&le.filter(e=>qe.get(e).length>0).map(e=>(0,j.jsxs)(`button`,{type:`button`,className:`nav-row${M===`whatsapp`&&He===e?` active`:``}`,onClick:()=>$e(e),children:[(0,j.jsx)(ce,{channel:e,size:16}),(0,j.jsx)(`span`,{className:`label`,children:Je[e]}),(0,j.jsx)(`span`,{className:`kbd`})]},e)),Be&&(0,j.jsx)(`div`,{className:`nav-row`,style:{color:`var(--text-tertiary)`,cursor:`default`},"aria-disabled":`true`,children:(0,j.jsx)(`span`,{className:`label`,children:Be})})]}),M===`artefacts`&&(0,j.jsxs)(`div`,{className:`side-list`,children:[(0,j.jsxs)(`div`,{className:`group-head`,children:[(0,j.jsx)(`span`,{children:`Artefacts`}),(0,j.jsxs)(`span`,{className:`group-head-meta`,children:[(0,j.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh artefacts`,"aria-label":`Refresh artefacts`,onClick:Xe,disabled:B,children:(0,j.jsx)(s,{size:12,className:B?`spinning`:void 0})}),(0,j.jsx)(`span`,{children:B?`…`:String(P.length)})]})]}),R&&(0,j.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:R}),I&&!R&&P.length>0&&(()=>{let e=P.filter(e=>e.kind===`agent-template`).length,t=P.length-e;return(0,j.jsx)(`div`,{className:`artefact-filter-chips`,children:[{key:`all`,label:`All`,count:P.length},{key:`agent`,label:`Agents`,count:e},{key:`file`,label:`Files`,count:t}].map(e=>(0,j.jsxs)(`button`,{type:`button`,className:`artefact-filter-chip${H===e.key?` active`:``}`,onClick:()=>de(e.key),disabled:e.count===0&&e.key!==`all`,children:[e.label,(0,j.jsx)(`span`,{className:`artefact-filter-chip-count`,children:e.count})]},e.key))})})(),I&&!R&&P.length===0&&(0,j.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No artefacts yet`}),P.filter(e=>H===`all`?!0:H===`agent`?e.kind===`agent-template`:e.kind!==`agent-template`).map(e=>{let t=e.kind===`agent-template`,n=t?v:d,r=me(e.updatedAt),i=e.downloadPath!==null;return(0,j.jsxs)(`button`,{type:`button`,className:`conv`,onClick:()=>We(e),disabled:!i,style:i?void 0:{cursor:`default`},title:i?`Download ${e.name}`:`${e.name} can’t be downloaded`,children:[(0,j.jsx)(n,{size:14,className:`conv-icon`,"data-kind":t?`agent`:`file`,"aria-label":t?`agent template`:`file`}),(0,j.jsxs)(`span`,{className:`conv-stack`,children:[(0,j.jsx)(`span`,{className:`conv-name-line`,children:(0,j.jsx)(`span`,{className:`conv-name`,children:e.name})}),r&&(0,j.jsx)(`span`,{className:`conv-timestamp`,children:r})]}),i&&(0,j.jsx)(o,{size:12,className:`conv-rc-icon`,"aria-hidden":`true`})]},e.id)})]}),M===`sessions`&&(()=>{let e=q.filter(e=>xe?!0:!e.isSubagent).filter(e=>Ce?!0:!e.archived),t=q.some(e=>e.isSubagent),r=q.some(e=>e.archived);return(0,j.jsxs)(`div`,{className:`side-list`,children:[(0,j.jsxs)(`div`,{className:`group-head`,children:[(0,j.jsx)(`span`,{children:`Sessions`}),(0,j.jsxs)(`span`,{className:`group-head-meta`,children:[(0,j.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh sessions`,"aria-label":`Refresh sessions`,onClick:Qe,disabled:X,children:(0,j.jsx)(s,{size:12,className:X?`spinning`:void 0})}),(0,j.jsx)(`span`,{children:X?`…`:String(e.length)})]})]}),Te&&(0,j.jsx)(`div`,{className:`side-account-id`,title:`This install's accountId. The first 8 characters match the truncated UUID label on the live Remote Control daemon entry in claude.ai/code.`,children:(0,j.jsx)(`code`,{children:Te})}),(t||r)&&(0,j.jsxs)(`div`,{className:`artefact-filter-chips`,children:[t&&(0,j.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${xe?` active`:``}`,onClick:()=>Se(e=>!e),title:xe?`Hide subagent sessions`:`Show subagent sessions`,children:`Subagents`}),r&&(0,j.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${Ce?` active`:``}`,onClick:()=>we(e=>!e),title:Ce?`Hide archived sessions`:`Show archived sessions`,children:`Archived`})]}),Y&&(0,j.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:Y}),J&&!Y&&e.length===0&&(0,j.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No sessions yet`}),e.map(e=>{let t=me(e.startedAt),r=ke.has(e.sessionId),i=De.has(e.sessionId),a=je.has(e.sessionId),o=Ne.has(e.sessionId);return(0,j.jsxs)(`div`,{className:`conv conv-with-actions`,children:[(0,j.jsxs)(`div`,{className:`conv-main-static`,children:[(0,j.jsx)(`span`,{className:`conv-live-dot`,"data-live":e.live?`1`:`0`,"aria-label":e.live?`live session`:`ended session`}),(0,j.jsxs)(`span`,{className:`conv-stack`,children:[(0,j.jsx)(`span`,{className:`conv-name-line`,children:(0,j.jsx)(`span`,{className:`conv-name`,title:e.title,children:e.title})}),(0,j.jsxs)(`span`,{className:`conv-timestamp`,children:[(0,j.jsx)(`code`,{className:`conv-session-id`,title:`First 8 characters of this session's id — distinguishes rows with identical auto-titles. The resume/delete buttons act on the full id.`,children:e.sessionId.slice(0,8)}),t&&(0,j.jsxs)(`span`,{children:[` · `,t]})]})]})]}),(0,j.jsxs)(`div`,{className:`conv-actions`,children:[e.resumable===!1?(0,j.jsx)(`span`,{className:`conv-ephemeral`,title:`Public webchat session — ephemeral, not resumable`,"aria-label":`Ephemeral public session (not resumable)`,children:(0,j.jsx)(C,{size:12})}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`button`,{type:`button`,className:`conv-action`,onClick:()=>{et(e)},disabled:r||i||a||o,"aria-busy":r,"aria-label":`Resume session ${e.title} in claude.ai/code`,title:`Resume in a fresh local Remote Control PTY`,children:(0,j.jsx)(S,{size:12})}),(0,j.jsx)(`button`,{type:`button`,className:`conv-action`,onClick:()=>{window.location.assign(`/chat?session=${e.sessionId}`)},disabled:r||i||a||o,"aria-label":`Open session ${e.title} in admin webchat`,title:`Open in admin webchat (/chat) — sending resumes this session`,children:(0,j.jsx)(ie,{size:12})})]}),e.live?(0,j.jsx)(`button`,{type:`button`,className:`conv-action`,onClick:t=>{it(t,e)},disabled:r||i||a||o,"aria-busy":a,"aria-label":`Stop session ${e.title}`,title:`Stop session process (keeps the conversation, can resume later)`,children:(0,j.jsx)(O,{size:12})}):null,e.archived?(0,j.jsx)(`button`,{type:`button`,className:`conv-action`,onClick:t=>{at(t,e,`unarchive`)},disabled:r||i||a||o,"aria-busy":o,"aria-label":`Unarchive session ${e.title}`,title:`Unarchive (move back to the active list)`,children:(0,j.jsx)(g,{size:12})}):(0,j.jsx)(`button`,{type:`button`,className:`conv-action`,onClick:t=>{at(t,e,`archive`)},disabled:r||i||a||o,"aria-busy":o,"aria-label":`Archive session ${e.title}`,title:`Archive (hide from the list, keeps the conversation resumable)`,children:(0,j.jsx)(_,{size:12})}),(0,j.jsx)(`button`,{type:`button`,className:`conv-action conv-action-danger`,onClick:t=>{rt(t,e)},disabled:r||i||a||o,"aria-busy":i,"aria-label":`Delete session ${e.title}`,title:`Delete session (stops the process, removes the conversation)`,children:(0,j.jsx)(n,{size:12})})]})]},e.sessionId)})]})})(),M===`whatsapp`&&(0,j.jsxs)(`div`,{className:`side-list`,children:[(0,j.jsxs)(`div`,{className:`group-head`,children:[(0,j.jsx)(`span`,{children:Je[He]}),(0,j.jsxs)(`span`,{className:`group-head-meta`,children:[(0,j.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh conversations`,"aria-label":`Refresh conversations`,onClick:()=>{Ke()},children:(0,j.jsx)(s,{size:12})}),(0,j.jsx)(`span`,{children:String(qe.get(He).length)})]})]}),qe.get(He).map(e=>{let t=me(e.lastMessageAt);return(0,j.jsxs)(`button`,{type:`button`,className:`conv${te===e.sessionId?` active`:``}`,onClick:()=>{ne(e),x()},title:e.title,children:[(0,j.jsx)(ce,{channel:e.channel,size:14}),(0,j.jsxs)(`span`,{className:`conv-stack`,children:[(0,j.jsx)(`span`,{className:`conv-name-line`,children:(0,j.jsx)(`span`,{className:`conv-name`,children:e.operatorName??e.whatsappName??e.senderId??e.title})}),t&&(0,j.jsx)(`span`,{className:`conv-timestamp`,children:t})]})]},e.sessionId)})]}),(0,j.jsx)(ge,{}),(0,j.jsxs)(`div`,{className:`side-foot`,children:[(0,j.jsx)(`div`,{className:`avatar`,children:l?(0,j.jsx)(`img`,{src:l,alt:D}):se}),(0,j.jsxs)(`div`,{className:`who`,children:[(0,j.jsx)(`span`,{className:`name`,children:D}),(0,j.jsx)(`span`,{className:`role`,children:i??`operator`})]})]}),U&&(0,j.jsx)(`div`,{className:`copy-toast${U.failed?` copy-toast-failed`:``}`,role:`status`,children:U.message}),(0,j.jsx)(ue,{error:G,onClose:()=>K(null)})]})}var W=5e3,he=3e4;function ge(){let[e,t]=(0,A.useState)(null);if((0,A.useEffect)(()=>{let e=!1,n=null;async function r(){try{let n=await fetch(`/api/admin/system-stats`);if(!n.ok){console.error(`[admin-ui] system-stats-fetch-failed status=${n.status}`);return}let r=await n.json();e||t(r)}catch(e){console.error(`[admin-ui] system-stats-fetch-failed reason=${e instanceof Error?e.message:String(e)}`)}}function i(){n===null&&(r(),n=setInterval(()=>{r()},W))}function a(){n!==null&&(clearInterval(n),n=null)}function o(){document.hidden?a():i()}return document.hidden||i(),document.addEventListener(`visibilitychange`,o),()=>{e=!0,a(),document.removeEventListener(`visibilitychange`,o)}},[]),!e||e.platform===`darwin`)return null;let n=e.cpuPct,r=e.memUsedPct,i=n!==null&&n>=.9,a=n!==null&&n>=.98,o=r!==null&&r>=.9,s=r!==null&&r>=.98,c=i||o,l=a||s,u=e=>e===null?`—`:`${Math.round(e*100)}%`,d=e=>{if(e===null)return{width:`0%`,background:`var(--text-tertiary)`};let t=Math.min(1,Math.max(0,e)),n=Math.round(140*(1-t));return{width:`${Math.round(t*100)}%`,background:`hsl(${n}, 65%, 45%)`}},f=[`system-stats`];return c&&f.push(`system-stats--warn`),l&&f.push(`system-stats--crit`),(0,j.jsxs)(`div`,{className:f.join(` `),role:`status`,"aria-label":`host CPU and RAM`,children:[(0,j.jsxs)(`div`,{className:`system-stats__metric`,children:[(0,j.jsxs)(`span`,{className:i?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`CPU `,u(n)]}),(0,j.jsx)(`div`,{className:`system-stats__bar`,children:(0,j.jsx)(`div`,{className:`system-stats__bar-fill`,style:d(n)})})]}),(0,j.jsxs)(`div`,{className:`system-stats__metric`,children:[(0,j.jsxs)(`span`,{className:o?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`RAM `,u(r)]}),(0,j.jsx)(`div`,{className:`system-stats__bar`,children:(0,j.jsx)(`div`,{className:`system-stats__bar-fill`,style:d(r)})})]})]})}var G=`admin-sidebar-collapsed`,K=`admin-sidebar-drawer-open`;function q(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(G)===`1`}catch{return!1}}function _e(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(G,`1`):window.sessionStorage.removeItem(G)}catch{}}function J(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(K)===`1`}catch{return!1}}function ve(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(K,`1`):window.sessionStorage.removeItem(K)}catch{}}var Y=720;function ye(e,t){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?wa=${encodeURIComponent(t.sessionId)}&projectDir=${encodeURIComponent(t.projectDir)}`}}function X(e,t){if(e!==`/`)return null;let n=new URLSearchParams(t),r=n.get(`wa`),i=n.get(`projectDir`);return!r||!i?null:{sessionId:r,projectDir:i,title:``,senderId:null,startedAt:``,channel:`whatsapp`,operatorName:null,whatsappName:null,lastMessageAt:null}}function be(e,t){return t===`operator`&&e===`chat`||e===`dashboard`?`/`:e===`data`?`/data`:e===`graph`?`/graph`:e===`chat`?`/chat`:`/browser`}function xe(e){let{cacheKey:t,businessName:n,variant:r=`admin`,onLogout:i,onDisconnect:a,disconnecting:o,userName:s,userAvatar:c,role:l,children:u,footer:d}=e,[f,p]=(0,A.useState)(()=>q()),[m,h]=(0,A.useState)(()=>J()),[g,_]=(0,A.useState)(()=>typeof window<`u`&&window.matchMedia(`(max-width: ${Y}px)`).matches),[v,y]=(0,A.useState)(()=>typeof window>`u`?null:X(window.location.pathname,window.location.search)),[b]=(0,A.useState)(()=>v!==null);(0,A.useEffect)(()=>{if(typeof window>`u`)return;let e=window.matchMedia(`(max-width: ${Y}px)`),t=e=>_(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let x=(0,A.useCallback)(e=>{_e(e),p(e)},[]),S=(0,A.useCallback)(e=>{ve(e),h(e)},[]);(0,A.useEffect)(()=>{if(typeof window>`u`)return;let e=window.location?.pathname??``;console.info(`[admin-ui] shell-mount route=${e} variant=${r} sidebar=${r===`operator`?`none`:`present`} collapsed=${f} drawer=${m}`)},[]),(0,A.useEffect)(()=>{typeof window>`u`||!v||(console.info(`[admin-ui] wa-hydrate route=/ sessionId=${v.sessionId.slice(0,8)}`),window.history.replaceState(null,``,`/`))},[]);let ee=(0,A.useCallback)(e=>{if(e===null){y(null);return}let t=typeof window<`u`?window.location.pathname:`/`,n=ye(t,e);console.info(`[admin-ui] wa-open route=${t} via=${n.via} sessionId=${e.sessionId.slice(0,8)}`),n.via===`in-place`?y(e):window.location.href=n.href},[]),C=g?m:!f,w=(0,A.useCallback)(()=>{if(!(typeof window>`u`))if(window.matchMedia(`(max-width: ${Y}px)`).matches){let e=m;console.info(`[admin-ui] header-sidebar-toggle from=${e?`open`:`closed`} mode=drawer`),S(!e)}else{let e=f;console.info(`[admin-ui] header-sidebar-toggle from=${e?`closed`:`open`} mode=collapse`),x(!e)}},[f,m,x,S]),te=(0,A.useCallback)(e=>{let t=be(e,r);console.info(`[admin-ui] header-menu-nav target=${e} dest=${t}`),window.location.href=t},[r]),T={collapsed:f,mobileDrawerOpen:m,sidebarOpen:C,onToggleSidebar:w,setMobileDrawerOpen:S,selectedWhatsapp:v,onClearWhatsapp:()=>y(null)};return r===`operator`?(0,j.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[(0,j.jsx)(M,{businessName:n,variant:r,onNavigate:te,onToggleSidebar:w,sidebarOpen:C,onLogout:i,onDisconnect:a,disconnecting:o}),(0,j.jsx)(`div`,{className:`platform platform-operator`,children:typeof u==`function`?u(T):u}),d]}):(0,j.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[(0,j.jsx)(M,{businessName:n,variant:r,onNavigate:te,onToggleSidebar:w,sidebarOpen:C,onLogout:i,onDisconnect:a,disconnecting:o}),(0,j.jsxs)(`div`,{className:`platform${m?` menu-open`:``}${f?` sidebar-collapsed`:``}`,"data-artefact":`closed`,children:[(0,j.jsx)(U,{businessName:n,variant:r,cacheKey:t,role:l??null,userName:s,userAvatar:c??null,onSelectProjects:()=>{window.location.href=`/graph?label=Project`},onSelectPeople:()=>{window.location.href=`/graph?label=Person`},onSelectTasks:()=>{window.location.href=`/graph?label=Task`},onSelectAgents:()=>{window.location.href=`/graph?label=Agent`},onCloseMobileDrawer:()=>S(!1),collapsed:f,mobileDrawerOpen:m,selectedWhatsappId:v?.sessionId??null,onSelectWhatsappConversation:ee,initialWhatsappSurface:b}),!g&&(0,j.jsx)(L,{}),typeof u==`function`?u(T):u]}),m&&(0,j.jsx)(`div`,{className:`sidebar-backdrop menu-open`,"aria-hidden":`true`,onClick:()=>S(!1)}),d]})}export{oe as a,S as c,D as i,b as l,H as n,T as o,k as r,ee as s,xe as t,h as u};
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-D3JkFIbi.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};
1
+ import{t as e}from"./jsx-runtime-Brvwqc85.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};