excaliagent 0.3.0 → 0.4.0

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 (165) hide show
  1. package/README.md +113 -29
  2. package/dist/server/args.js +14 -1
  3. package/dist/server/characters.js +540 -0
  4. package/dist/server/cli.js +16 -1
  5. package/dist/server/http.js +95 -6
  6. package/dist/server/hub.js +17 -3
  7. package/dist/server/panes/herdr.js +29 -3
  8. package/dist/server/sources/claude.js +36 -1
  9. package/dist/server/sources/codex-live.js +279 -0
  10. package/dist/server/sources/codex-rollout.js +154 -0
  11. package/dist/server/sources/codex.js +363 -0
  12. package/dist/server/sources/jsonl.js +142 -0
  13. package/dist/server/sources/multi.js +53 -0
  14. package/dist/server/sources/opencode-live.js +144 -0
  15. package/dist/server/sources/opencode.js +265 -0
  16. package/dist/server/sources/proc.js +34 -0
  17. package/dist/server/sources/transcript.js +9 -103
  18. package/dist/shared/packs.js +62 -0
  19. package/dist/web/apple-touch-icon.png +0 -0
  20. package/dist/web/assets/{abnfDiagram-VCTEODGH-DV-5IMmB.js → abnfDiagram-VCTEODGH-BxrKsDoB.js} +1 -1
  21. package/dist/web/assets/{ar-SA-G6X2FPQ2-n3XdOipE.js → ar-SA-G6X2FPQ2-Cc6gbg88.js} +1 -1
  22. package/dist/web/assets/{architecture-7GRP2DOG-C497sWO2.js → architecture-7GRP2DOG-CIqN5I9B.js} +1 -1
  23. package/dist/web/assets/{architectureDiagram-5GKGNRK7-DuCJZflG.js → architectureDiagram-5GKGNRK7-DsXC8AqK.js} +1 -1
  24. package/dist/web/assets/{az-AZ-76LH7QW2-DSYFdGPZ.js → az-AZ-76LH7QW2-BH8VzNec.js} +1 -1
  25. package/dist/web/assets/{bg-BG-XCXSNQG7-aq-bPVBx.js → bg-BG-XCXSNQG7-ClFUbics.js} +1 -1
  26. package/dist/web/assets/{blockDiagram-I7D4REHJ-D6rbmy9X.js → blockDiagram-I7D4REHJ-CltS-Zt2.js} +1 -1
  27. package/dist/web/assets/{bn-BD-2XOGV67Q-BsnX_gLN.js → bn-BD-2XOGV67Q-BVUiOO4B.js} +1 -1
  28. package/dist/web/assets/{c4Diagram-7LVT6UL2-bkZh0r6f.js → c4Diagram-7LVT6UL2-C-C_SvWm.js} +1 -1
  29. package/dist/web/assets/{ca-ES-6MX7JW3Y-CvtjFAUU.js → ca-ES-6MX7JW3Y-CEK8mB8J.js} +1 -1
  30. package/dist/web/assets/channel-Dom8D_0o.js +1 -0
  31. package/dist/web/assets/{chunk-4HAMMTFA-DZJ_s-sA.js → chunk-4HAMMTFA-Bfdmb0Hg.js} +1 -1
  32. package/dist/web/assets/{chunk-75Z2AOVW-DU74RPBJ.js → chunk-75Z2AOVW-NYwkutzS.js} +1 -1
  33. package/dist/web/assets/{chunk-DU6HZSFF-CChYnq-U.js → chunk-DU6HZSFF-SqE0xdu5.js} +1 -1
  34. package/dist/web/assets/{chunk-EIO257PC-DIGaCD3q.js → chunk-EIO257PC-DpOeKaLq.js} +1 -1
  35. package/dist/web/assets/{chunk-F27PBJKO-C65b5F8o.js → chunk-F27PBJKO-g9bJrSwZ.js} +1 -1
  36. package/dist/web/assets/{chunk-GMAD6QVW-CJy4srfe.js → chunk-GMAD6QVW-B1y2ol5w.js} +1 -1
  37. package/dist/web/assets/{chunk-GVQU2GXP-CedQyfJw.js → chunk-GVQU2GXP-BUjRNRXo.js} +1 -1
  38. package/dist/web/assets/{chunk-IMKFNOWR-DPwApfTy.js → chunk-IMKFNOWR-DyeQep8U.js} +1 -1
  39. package/dist/web/assets/{chunk-L3NEJ4N5-DXku7BIn.js → chunk-L3NEJ4N5-BcTVhsWp.js} +1 -1
  40. package/dist/web/assets/{chunk-OSK3NFVY-BstcDrHK.js → chunk-OSK3NFVY-Db7B8jPm.js} +1 -1
  41. package/dist/web/assets/{chunk-P2QGCYS3-BHerElni.js → chunk-P2QGCYS3-Cx5iBC5z.js} +1 -1
  42. package/dist/web/assets/{chunk-POPQ4Y6H-ZS2hGTJJ.js → chunk-POPQ4Y6H-CqVRZDA8.js} +1 -1
  43. package/dist/web/assets/{chunk-PWAF6VOD-BUUBZvSR.js → chunk-PWAF6VOD-Cf2j9yew.js} +1 -1
  44. package/dist/web/assets/{chunk-SHT3W25Y-CMdySuQW.js → chunk-SHT3W25Y-0_N13xgE.js} +1 -1
  45. package/dist/web/assets/{chunk-SVP7TREG-E_6g4L6l.js → chunk-SVP7TREG-DkRJF9jr.js} +1 -1
  46. package/dist/web/assets/{chunk-TICWLB2K-CBTJSW3m.js → chunk-TICWLB2K-D6OC50xH.js} +1 -1
  47. package/dist/web/assets/classDiagram-ZZMXUADV-BMEkgkEJ.js +1 -0
  48. package/dist/web/assets/classDiagram-v2-VYDZK3BY-BMEkgkEJ.js +1 -0
  49. package/dist/web/assets/{cs-CZ-2BRQDIVT-DLt9XJMu.js → cs-CZ-2BRQDIVT-DWt1RUsP.js} +1 -1
  50. package/dist/web/assets/{cynefin-OW5HDTMX-BYqJDvxe.js → cynefin-OW5HDTMX-Dx0HzRCl.js} +1 -1
  51. package/dist/web/assets/{cynefinDiagram-5FMLGOSQ-iwuMBkRk.js → cynefinDiagram-5FMLGOSQ-C8AMQNhe.js} +1 -1
  52. package/dist/web/assets/{da-DK-5WZEPLOC-BnzwheRI.js → da-DK-5WZEPLOC-BPggh0j6.js} +1 -1
  53. package/dist/web/assets/{dagre-GXQ25YYZ-DGskQLMq.js → dagre-GXQ25YYZ-f9qU6BFq.js} +1 -1
  54. package/dist/web/assets/{de-DE-XR44H4JA-B05-7snG.js → de-DE-XR44H4JA-B1q1pJrQ.js} +1 -1
  55. package/dist/web/assets/{diagram-S7CK7UJ4-Sclpr_lb.js → diagram-S7CK7UJ4-Bcq77Nl3.js} +1 -1
  56. package/dist/web/assets/{diagram-UQ7AKVKN-CkRKjDjq.js → diagram-UQ7AKVKN-DXzlgVTk.js} +1 -1
  57. package/dist/web/assets/{diagram-VSXAHHWV-DKAzSk6r.js → diagram-VSXAHHWV-C1vz2FvT.js} +1 -1
  58. package/dist/web/assets/{diagram-VX7I27RA-Bjdeg2uG.js → diagram-VX7I27RA-_c4ucp3r.js} +1 -1
  59. package/dist/web/assets/{diagram-Z3DM3KII-4jN9UD5P.js → diagram-Z3DM3KII-cUg91K-F.js} +1 -1
  60. package/dist/web/assets/{dist-BQE0NGB-.js → dist-DcwmvBdV.js} +4 -4
  61. package/dist/web/assets/{ebnfDiagram-PWID7BFC-BSFSSJ77.js → ebnfDiagram-PWID7BFC-9iWfohHg.js} +1 -1
  62. package/dist/web/assets/{el-GR-BZB4AONW-ShhNmsmN.js → el-GR-BZB4AONW-CrhwvNDD.js} +1 -1
  63. package/dist/web/assets/{en-B4ZKOASM-BNw5UiKn.js → en-B4ZKOASM-DCjnkz5L.js} +1 -1
  64. package/dist/web/assets/{erDiagram-RLTQ6QDP-CXr09bBy.js → erDiagram-RLTQ6QDP-A72uVlS3.js} +1 -1
  65. package/dist/web/assets/{es-ES-U4NZUMDT-2jCdm2lH.js → es-ES-U4NZUMDT-D0sRCoDL.js} +1 -1
  66. package/dist/web/assets/{eu-ES-A7QVB2H4-BhBUGvkL.js → eu-ES-A7QVB2H4-DLG-liPb.js} +1 -1
  67. package/dist/web/assets/{eventmodeling-NTZA5JFV-DLX5id4n.js → eventmodeling-NTZA5JFV-CIKZvDAj.js} +1 -1
  68. package/dist/web/assets/{fa-IR-HGAKTJCU-B-Z0NFoQ.js → fa-IR-HGAKTJCU-BW3pPOVT.js} +1 -1
  69. package/dist/web/assets/{fi-FI-Z5N7JZ37-C3a93Lzr.js → fi-FI-Z5N7JZ37-D2XaqwPp.js} +1 -1
  70. package/dist/web/assets/flowDiagram-HODETNUW-DhQSc3KP.js +1 -0
  71. package/dist/web/assets/{fr-FR-RHASNOE6-BfJc7jwO.js → fr-FR-RHASNOE6-B-BjRA7r.js} +1 -1
  72. package/dist/web/assets/{ganttDiagram-EL5Y4UJY-V2sHQ0x1.js → ganttDiagram-EL5Y4UJY-cgwUfr0G.js} +1 -1
  73. package/dist/web/assets/{gitGraph-4MIJSDKK-BGpxF8pu.js → gitGraph-4MIJSDKK-CeKopPn3.js} +1 -1
  74. package/dist/web/assets/{gitGraphDiagram-WWUBYQGX-asoaR4Hx.js → gitGraphDiagram-WWUBYQGX-BWjAy7ei.js} +1 -1
  75. package/dist/web/assets/{gl-ES-HMX3MZ6V-C8eeUPra.js → gl-ES-HMX3MZ6V-DYUAqB0N.js} +1 -1
  76. package/dist/web/assets/{he-IL-6SHJWFNN-DB0HanYn.js → he-IL-6SHJWFNN-CXkYqbuu.js} +1 -1
  77. package/dist/web/assets/{hi-IN-IWLTKZ5I-B3Gf328f.js → hi-IN-IWLTKZ5I-BwVBsHWG.js} +1 -1
  78. package/dist/web/assets/{hu-HU-A5ZG7DT2-7jNfqM7f.js → hu-HU-A5ZG7DT2-DkmlE7Aa.js} +1 -1
  79. package/dist/web/assets/{id-ID-SAP4L64H-DZd1jLNQ.js → id-ID-SAP4L64H-CwkytHX_.js} +1 -1
  80. package/dist/web/assets/{image-GAAHSSAO-DKJMzS7d.js → image-GAAHSSAO-u-hBxkaK.js} +1 -1
  81. package/dist/web/assets/index-D43I17T9.js +212 -0
  82. package/dist/web/assets/{index-DtRVLazd.css → index-DxXUknKX.css} +1 -1
  83. package/dist/web/assets/{info-A6RAGUB7-Dw0JaEzD.js → info-A6RAGUB7-DmadBmci.js} +1 -1
  84. package/dist/web/assets/{infoDiagram-27XIBGKW-DhivBaFe.js → infoDiagram-27XIBGKW-D93CKwhy.js} +1 -1
  85. package/dist/web/assets/{ishikawaDiagram-5VMMS53U-DHIyFGlH.js → ishikawaDiagram-5VMMS53U-BQ-x5YXp.js} +1 -1
  86. package/dist/web/assets/{it-IT-JPQ66NNP-BF7oahO7.js → it-IT-JPQ66NNP-Bc-Qa6KI.js} +1 -1
  87. package/dist/web/assets/{ja-JP-DBVTYXUO-CtGU47sH.js → ja-JP-DBVTYXUO-BPmQCryQ.js} +1 -1
  88. package/dist/web/assets/{journeyDiagram-3NMN7TZE-wwS9CODt.js → journeyDiagram-3NMN7TZE-CO_LXx1E.js} +1 -1
  89. package/dist/web/assets/{kaa-6HZHGXH3-CyohUVIM.js → kaa-6HZHGXH3-DuBFVAjv.js} +1 -1
  90. package/dist/web/assets/{kab-KAB-ZGHBKWFO-2acNr90z.js → kab-KAB-ZGHBKWFO-DhEFzSTh.js} +1 -1
  91. package/dist/web/assets/{kanban-definition-UXKFOSKX-vqJ11RID.js → kanban-definition-UXKFOSKX-B72Jztau.js} +1 -1
  92. package/dist/web/assets/{kk-KZ-P5N5QNE5-C56zTJ0v.js → kk-KZ-P5N5QNE5-CW7PxU2h.js} +1 -1
  93. package/dist/web/assets/{km-KH-HSX4SM5Z-Bg7FoxwJ.js → km-KH-HSX4SM5Z-CYy7yySD.js} +1 -1
  94. package/dist/web/assets/{ko-KR-MTYHY66A-wlZa8Fb7.js → ko-KR-MTYHY66A-C5O645Qe.js} +1 -1
  95. package/dist/web/assets/{ku-TR-6OUDTVRD-DpMT6JcJ.js → ku-TR-6OUDTVRD-CKcd_iWr.js} +1 -1
  96. package/dist/web/assets/{line-Cy2R8zKE.js → line-Ckd3sAmP.js} +1 -1
  97. package/dist/web/assets/{lt-LT-XHIRWOB4-0nDOQqUM.js → lt-LT-XHIRWOB4-ya2_xWiy.js} +1 -1
  98. package/dist/web/assets/{lv-LV-5QDEKY6T-DGNAIt-v.js → lv-LV-5QDEKY6T-cYYwyzmz.js} +1 -1
  99. package/dist/web/assets/{mermaid-parser.core-C-IWeUrh.js → mermaid-parser.core-Dbqkvrw-.js} +3 -3
  100. package/dist/web/assets/{mindmap-definition-YA3MSWOX-DDX8XN8u.js → mindmap-definition-YA3MSWOX-B4onxNgk.js} +1 -1
  101. package/dist/web/assets/{mr-IN-CRQNXWMA-CHXpujpK.js → mr-IN-CRQNXWMA-CfaHpVWe.js} +1 -1
  102. package/dist/web/assets/{my-MM-5M5IBNSE-Bg0H7WJb.js → my-MM-5M5IBNSE-BfKiTATq.js} +1 -1
  103. package/dist/web/assets/{nb-NO-T6EIAALU-BE_hPlhF.js → nb-NO-T6EIAALU-Cz3yDFYg.js} +1 -1
  104. package/dist/web/assets/{nl-NL-IS3SIHDZ-fdiiEQqB.js → nl-NL-IS3SIHDZ-DDX026n5.js} +1 -1
  105. package/dist/web/assets/{nn-NO-6E72VCQL-C7j1gMVo.js → nn-NO-6E72VCQL-BcokL_SN.js} +1 -1
  106. package/dist/web/assets/{oc-FR-POXYY2M6-Q5CdkT-D.js → oc-FR-POXYY2M6-bNFsGpEp.js} +1 -1
  107. package/dist/web/assets/{pa-IN-N4M65BXN-DJyQmbX0.js → pa-IN-N4M65BXN-iIHN9Z8W.js} +1 -1
  108. package/dist/web/assets/{packet-AYTQ26CC-D4ouOVez.js → packet-AYTQ26CC-BzBpP9hg.js} +1 -1
  109. package/dist/web/assets/{pegDiagram-XKGWAZYB-DAWOkGLy.js → pegDiagram-XKGWAZYB-BPScRPVZ.js} +1 -1
  110. package/dist/web/assets/percentages-BXMCSKIN-EDfR-TFr.js +1 -0
  111. package/dist/web/assets/{pie-WAS4IAKB-MCWueKc-.js → pie-WAS4IAKB-N-9RHtKL.js} +1 -1
  112. package/dist/web/assets/{pieDiagram-E7YTZNPT-BLlQT9t_.js → pieDiagram-E7YTZNPT-Bpd_yCG-.js} +1 -1
  113. package/dist/web/assets/{pl-PL-T2D74RX3-CcWFE9AN.js → pl-PL-T2D74RX3-DeqOx-a4.js} +1 -1
  114. package/dist/web/assets/{pt-BR-5N22H2LF-D6QCOM38.js → pt-BR-5N22H2LF-DG1PCIkb.js} +1 -1
  115. package/dist/web/assets/{pt-PT-UZXXM6DQ-ByJh7ZNa.js → pt-PT-UZXXM6DQ-BsUJk2fq.js} +1 -1
  116. package/dist/web/assets/{quadrantDiagram-AXDQQJYC-CIinawCS.js → quadrantDiagram-AXDQQJYC-CSLCp0xS.js} +1 -1
  117. package/dist/web/assets/{radar-RG4KPBEZ-Cm5qT3Hl.js → radar-RG4KPBEZ-rKULJroO.js} +1 -1
  118. package/dist/web/assets/{railroad-74A4TZTK-DO3FGMCu.js → railroad-74A4TZTK-hDn0WPg3.js} +1 -1
  119. package/dist/web/assets/{railroad-abnf-HS5TGJTU-DqC68RR5.js → railroad-abnf-HS5TGJTU-DfI0hiCR.js} +1 -1
  120. package/dist/web/assets/{railroad-ebnf-LZEXJU2U-Cby7H3Dj.js → railroad-ebnf-LZEXJU2U-paFQAnqR.js} +1 -1
  121. package/dist/web/assets/{railroad-peg-WCYAUIDC-CJpoUW06.js → railroad-peg-WCYAUIDC-B-2Um3QI.js} +1 -1
  122. package/dist/web/assets/{railroadDiagram-O6MQD6OU-CIJ1E8KE.js → railroadDiagram-O6MQD6OU-WkZPN5MA.js} +1 -1
  123. package/dist/web/assets/{requirementDiagram-BXWQKSXE-BTDHXcSN.js → requirementDiagram-BXWQKSXE-BJULFhuR.js} +1 -1
  124. package/dist/web/assets/{ro-RO-JPDTUUEW-BlhbQCSw.js → ro-RO-JPDTUUEW-yKjTMizq.js} +1 -1
  125. package/dist/web/assets/{ru-RU-B4JR7IUQ-Cd8b9tGe.js → ru-RU-B4JR7IUQ-DITGdMQL.js} +1 -1
  126. package/dist/web/assets/{sankeyDiagram-P5KCCOFB-DFx8uxV2.js → sankeyDiagram-P5KCCOFB-b_vfju3s.js} +1 -1
  127. package/dist/web/assets/{sequenceDiagram-WJ2MYXX4-Dr8vTa3e.js → sequenceDiagram-WJ2MYXX4-D5n2aEN6.js} +1 -1
  128. package/dist/web/assets/{si-LK-N5RQ5JYF-Y7h5xFBD.js → si-LK-N5RQ5JYF-DaFciStR.js} +1 -1
  129. package/dist/web/assets/{sk-SK-C5VTKIMK-DU5G4wEe.js → sk-SK-C5VTKIMK-CpyCIFtD.js} +1 -1
  130. package/dist/web/assets/{sl-SI-NN7IZMDC-4olCD7lc.js → sl-SI-NN7IZMDC-cnwvs7FN.js} +1 -1
  131. package/dist/web/assets/{stateDiagram-D77RDMKH-CRqebLR8.js → stateDiagram-D77RDMKH-CbFjpKDm.js} +1 -1
  132. package/dist/web/assets/stateDiagram-v2-MP3YSRHH-MOkTt8Mv.js +1 -0
  133. package/dist/web/assets/subset-shared.chunk-CWAaXrHb.js +1 -0
  134. package/dist/web/assets/{subset-worker.chunk-Bqgy-Y1W.js → subset-worker.chunk-Cebu2JDe.js} +1 -1
  135. package/dist/web/assets/{sv-SE-XGPEYMSR-Cp0rVzLX.js → sv-SE-XGPEYMSR-dOntI1Fk.js} +1 -1
  136. package/dist/web/assets/{swimlanes-42K2YHIH-BYd8YoU8.js → swimlanes-42K2YHIH-DtmsuzRR.js} +1 -1
  137. package/dist/web/assets/swimlanesDiagram-VR7AAH4N-v2ue4raa.js +8 -0
  138. package/dist/web/assets/{ta-IN-2NMHFXQM-DPDOL5cy.js → ta-IN-2NMHFXQM-Comju6i2.js} +1 -1
  139. package/dist/web/assets/{th-TH-HPSO5L25-CN82X-G0.js → th-TH-HPSO5L25-uPCBvbue.js} +1 -1
  140. package/dist/web/assets/{timeline-definition-24CTP7MA-DeQFCevv.js → timeline-definition-24CTP7MA-DKZOmZFD.js} +1 -1
  141. package/dist/web/assets/{tr-TR-DEFEU3FU-DZkONFun.js → tr-TR-DEFEU3FU-LaP2C4go.js} +1 -1
  142. package/dist/web/assets/{treeView-Q6P3EWNA-C4dlZskR.js → treeView-Q6P3EWNA-DJii9IFr.js} +1 -1
  143. package/dist/web/assets/{treemap-WGGIJYW6-oSQNu9HW.js → treemap-WGGIJYW6-U42pUP2Q.js} +1 -1
  144. package/dist/web/assets/{uk-UA-QMV73CPH-da8znbfC.js → uk-UA-QMV73CPH-u-WBulor.js} +1 -1
  145. package/dist/web/assets/{vennDiagram-4TSXK5OY-e4T6zK4z.js → vennDiagram-4TSXK5OY-C8_zJPdp.js} +1 -1
  146. package/dist/web/assets/{vi-VN-M7AON7JQ-QWCjquXm.js → vi-VN-M7AON7JQ-DOSv3aq5.js} +1 -1
  147. package/dist/web/assets/{wardley-WFR3VGLG-BzQw11Sd.js → wardley-WFR3VGLG-DU89dbbh.js} +1 -1
  148. package/dist/web/assets/{wardleyDiagram-VM6X3IG4-DyPpKV2H.js → wardleyDiagram-VM6X3IG4-BGnASelu.js} +1 -1
  149. package/dist/web/assets/{xychartDiagram-S5SC5T6Z-DKjIes2P.js → xychartDiagram-S5SC5T6Z-js8-abv7.js} +1 -1
  150. package/dist/web/assets/{zh-CN-LNUGB5OW-BbT-kvRj.js → zh-CN-LNUGB5OW-B8soJHf3.js} +1 -1
  151. package/dist/web/assets/{zh-HK-E62DVLB3-BPw2AWZD.js → zh-HK-E62DVLB3-DKByBmSJ.js} +1 -1
  152. package/dist/web/assets/{zh-TW-RAJ6MFWO-BE9F3OdK.js → zh-TW-RAJ6MFWO-CYBStGL6.js} +1 -1
  153. package/dist/web/favicon-32.png +0 -0
  154. package/dist/web/favicon.svg +12 -0
  155. package/dist/web/index.html +6 -3
  156. package/package.json +4 -2
  157. package/dist/web/assets/channel-B_LXUtkZ.js +0 -1
  158. package/dist/web/assets/classDiagram-ZZMXUADV-zYihe46b.js +0 -1
  159. package/dist/web/assets/classDiagram-v2-VYDZK3BY-zYihe46b.js +0 -1
  160. package/dist/web/assets/flowDiagram-HODETNUW-CnV5VPNb.js +0 -1
  161. package/dist/web/assets/index-BLscnX3-.js +0 -212
  162. package/dist/web/assets/percentages-BXMCSKIN-B3ZxlSu3.js +0 -1
  163. package/dist/web/assets/stateDiagram-v2-MP3YSRHH-DWV16uKx.js +0 -1
  164. package/dist/web/assets/subset-shared.chunk-1t88pPR-.js +0 -1
  165. package/dist/web/assets/swimlanesDiagram-VR7AAH4N-CACbHpLI.js +0 -8
package/README.md CHANGED
@@ -1,21 +1,31 @@
1
1
  # excaliagent
2
2
 
3
- A spatial scratchboard for your Claude Code sessions, on an Excalidraw canvas.
3
+ A 2D board for your coding agents, on an Excalidraw canvas.
4
+
5
+ When you run many coding agents at once, it is hard to remember which one was
6
+ doing what. excaliagent is a memory palace for your agents: each session is a
7
+ card you place on a canvas, and when you come back, its place reminds you what
8
+ it was about.
9
+
10
+ Works with Claude Code, OpenAI Codex and OpenCode.
4
11
 
5
12
  ![The board: session cards triaged into lanes](https://raw.githubusercontent.com/martinkozle/excaliagent/main/docs/images/board.png)
6
13
 
7
14
  Every session is a card. You drag cards wherever they make sense to you (parked,
8
15
  blocked on a colleague, come back to, done) and draw anything around them. The
9
- app keeps each card's **color and label** in sync with the session and never
10
- moves, resizes, or edits anything else.
16
+ app keeps each card's **color and label** in sync with the session (and its
17
+ height fitted to a one- or two-line title, until you resize the card yourself)
18
+ and never moves, resizes, or edits anything else on its own; cards move only
19
+ when you drop one on a lane title or ask for a tidy-up.
11
20
 
12
21
  ```
13
- Fix flaky checkout test ✳ ← title (handwritten, larger), harness logo
14
- demo-app · fix/flaky ← repo · branch
15
- needs user: input needed · 2m ← status · what it waits for · last activity
16
- cache warm 41m ← prompt-cache warmth
17
- herdr: demo-app › oauth ← herdr workspace › tab
18
- PR #12 ← last PR link
22
+ 🐔 Fix flaky checkout ✳ ← character, title (handwritten, larger), harness logo
23
+ test
24
+ demo-app · fix/flaky ← repo · branch
25
+ needs user: input needed · 2m ← status · what it waits for · last activity
26
+ cache warm 41m ← prompt-cache warmth
27
+ herdr: demo-app › oauth ← herdr workspace › tab
28
+ PR #12 ← last PR link
19
29
  ```
20
30
 
21
31
  | Color | Meaning |
@@ -28,6 +38,39 @@ PR #12 ← last PR link
28
38
 
29
39
  ![Right-click on a card: the excaliagent section next to the Excalidraw menu](https://raw.githubusercontent.com/martinkozle/excaliagent/main/docs/images/card-menu.png)
30
40
 
41
+ ## What it is for
42
+
43
+ The spatial board is the point. Everything else (live status, characters,
44
+ lanes, jumping to a pane, resuming, more agents) is there to make that board a
45
+ better place to keep your sessions. Beyond that, nothing is off the table: new
46
+ features and ideas of any kind are welcome on top of it.
47
+
48
+ ## Supported agents
49
+
50
+ | Agent | Live sessions and status | Dormant sessions | Resume | Stop |
51
+ |---|---|---|---|---|
52
+ | Claude Code | registry in `~/.claude/sessions`: busy, idle, needs input, ... | transcripts | `claude --resume <id>` | yes |
53
+ | Codex (0.163) | Linux only: running threads; busy or idle (approval prompts show as busy) | rollouts in `~/.codex/sessions` | `codex resume <id>` | yes |
54
+ | OpenCode (1.19) | Linux only, best effort (see below); busy or idle | `~/.local/share/opencode/opencode.db` | `opencode -s <id>` | yes |
55
+
56
+ Codex cards carry no prompt-cache line or PR link (Codex records neither), and
57
+ on macOS Codex sessions are only offered as dormant ones. Stop is offered only
58
+ when the board knows the Codex process for sure (`codex resume <id>`, or
59
+ `codex exec`), not when it matched a `codex` started without an id by its
60
+ folder. Rollouts older than a week may be compressed; reading those needs
61
+ Node 22.15+. Codex is looked up in
62
+ `$CODEX_HOME`, else `~/.codex` (`--codex-dir` to change, `--no-codex` to
63
+ turn it off). Details: [design](docs/design.md#codex-data-verified-on-01630).
64
+
65
+ OpenCode keeps no record of which session a running TUI shows, so the board
66
+ infers it: a TUI started with `opencode -s <id>` shows that session, any other
67
+ TUI the newest session of its directory that changed since it started. After
68
+ `/new` or switching sessions inside a TUI the wrong card can be live; see
69
+ [design](docs/design.md#opencode-data-verified-on-1193). Stop is offered only
70
+ for a TUI started with `opencode -s <id>`. OpenCode support needs Node 22.13+
71
+ (for `node:sqlite`; the rest of the board runs on Node 22); `--opencode-dir`
72
+ points at another data dir, `--no-opencode` turns it off.
73
+
31
74
  ## Run
32
75
 
33
76
  ```sh
@@ -43,45 +86,84 @@ bookmark. Running it again while a board is up just opens that board.
43
86
  lanes next to it (To Do, In Progress, Review, Blocked, Parked, Done, and two
44
87
  blank ones to name yourself); they are plain shapes you can move, resize,
45
88
  rename (double-click) or delete. **+ Lane** (top right) adds one more at the
46
- right end. On an older
47
- board, add the whole set from the main menu: *Add starter lanes*.
48
- - **Dormant sessions** are added from the **Sessions** panel (top right).
89
+ right end.
90
+ - **Line cards up in a lane**: while you drag a card, every lane title shows a
91
+ faint *drop to stack* hint; drop the card on one (it lights up) and the card
92
+ goes into the lane's column, below the lowest card there.
93
+ Dropped anywhere else, a card stays exactly where you put it. Right-click a
94
+ lane → *Tidy cards* stacks its cards in one column, top to bottom (on the
95
+ inbox it packs its columns). **Tidy all** (top right, or the main menu)
96
+ does every lane and the inbox at once. Stacked cards are always 20 px
97
+ apart; if a title later grows a second line, its card may overlap the one
98
+ below a little until you tidy again. Cards
99
+ that are locked, rotated, attached to an arrow or grouped with something
100
+ else stay put; the column goes around them. Ctrl+Z undoes a tidy (or Tidy
101
+ all) in one step and a drop in two (the snap, then the drag). Turn the
102
+ title drop off in the main menu (*Drop on lane title stacks cards*).
103
+ - **Dormant sessions** are added from the **Sessions** panel (top right). On a
104
+ narrow window the top-right buttons show only their icons; hover for the name.
49
105
  - **Double-click a card** to jump to it: a live session focuses its
50
106
  [herdr](https://herdr.dev) pane and raises the terminal window (Hyprland,
51
- Sway, macOS). A dormant session is resumed with `claude --resume` in a new herdr
52
- tab, in the workspace for that repo. Without herdr, the resume command is
53
- copied instead.
107
+ Sway, macOS). A dormant session is resumed (`claude --resume <id>`,
108
+ `codex resume <id>`) in a new herdr tab, in the workspace for that repo. Without herdr, the resume command is
109
+ copied instead. A single click on the harness logo in the card's corner
110
+ does the same.
54
111
  - **Right-click a card** for an excaliagent section on top of the Excalidraw
55
112
  menu: focus or resume, copy the resume command (with or without `cd`), open
56
- the PR.
113
+ the PR, or stop a running session (asks first; the conversation is kept and
114
+ can be resumed).
57
115
  - A **PR link** (GitHub, Bitbucket, GitLab) shows on the card; the card's link
58
116
  icon opens it.
117
+ - Every card has a **character**, so you remember which agent is which: an
118
+ animal by default, different for every card on the board, and the same one
119
+ each time that session comes back. Right-click → *Change character…* picks
120
+ one by hand (or *Shuffle*, *Reset to automatic*, or *None*; deleting the
121
+ character from a card also keeps it off). The **Characters** panel
122
+ (top right) switches the pack (Animals, Cats & friends, Sea, Fantasy, Food)
123
+ and makes your own packs from emoji and images: type or paste an emoji, or
124
+ paste, drop or upload png, gif, webp, jpeg or svg files (up to 1 MB each). A
125
+ custom pack is a folder, `packs/<name>/` in the state directory, so you can
126
+ also drop image files there by hand, and list emoji in its `pack.json` as
127
+ `{"emoji": ["🧟", "👻"]}`.
128
+
129
+ ![The Characters panel: packs, and the characters of the active one](https://raw.githubusercontent.com/martinkozle/excaliagent/main/docs/images/characters.png)
130
+
59
131
  - The board is saved to `$XDG_STATE_HOME/excaliagent/scene.json`
60
132
  (default `~/.local/state/excaliagent/`), pasted images under `files/` next
61
- to it.
133
+ to it, character choices in `characters.json` and your packs under `packs/`.
62
134
  - **Start over**: main menu → *Reset the canvas* (undoable) lays out a fresh
63
135
  board with the live sessions. Or try a clean board without touching yours:
64
136
  `npx excaliagent --state-dir /tmp/excaliagent-fresh`.
65
137
 
66
- Options: `--port`, `--no-open`, `--state-dir`, `--claude-dir`, `--no-herdr`, `--no-raise`.
138
+ Options: `--port`, `--no-open`, `--state-dir`, `--claude-dir`, `--codex-dir`,
139
+ `--no-codex`, `--opencode-dir`, `--no-opencode`, `--no-herdr`, `--no-raise`.
67
140
  See `npx excaliagent --help`.
68
141
 
69
142
  ## Privacy and security
70
143
 
71
144
  - Reads `~/.claude/sessions/*.json` and the transcript files under
72
145
  `~/.claude/projects/` (only metadata lines: title, branch, timestamps, token
73
- usage, PR links; never message content). Installs no hooks, writes nothing
146
+ usage, PR links; never message content). For Codex it reads the rollouts
147
+ under `~/.codex/sessions/` (metadata, turn starts and ends, and the first
148
+ prompt, cut short, as the title, like `codex resume` shows it),
149
+ `session_index.jsonl` (names), the lock files in `thread-writer-locks/`, and
150
+ `/proc` (`/proc/locks`, and the command line and working directory of
151
+ `codex` processes) to tell which threads are running. For OpenCode it reads
152
+ `opencode.db` read-only (session titles, directories, times, and whether the
153
+ newest message is finished; never message content) and the command line,
154
+ working directory and start time of `opencode` processes. Installs no hooks, writes nothing
74
155
  outside its state directory.
75
156
  - Listens on loopback only. A random token (created once, kept in the state
76
157
  directory, readable only by you) is put into the URL it opens and exchanged
77
158
  for an HttpOnly cookie; every request needs it, so other users on the same
78
159
  machine stay out. Requests with a
79
160
  foreign `Host` (DNS rebinding) or cross-origin writes are refused.
80
- - Its only actions: focus a herdr pane, raise the terminal window, and start
81
- `claude --resume <id>` in a new herdr pane. It never types into a running
82
- session.
83
- - Images you paste onto the board are stored next to the scene, in the
84
- state directory.
161
+ - Its only actions: focus a herdr pane, raise the terminal window, start
162
+ `claude --resume <id>`, `codex resume <id>` or `opencode -s <id>` in a new herdr pane, and stop a session when you ask
163
+ (right-click → Stop session, confirmed; it exits as if its terminal closed).
164
+ It never types into a running session.
165
+ - Images you paste onto the board, and the images of your character packs,
166
+ are stored next to the scene, in the state directory.
85
167
  - The only outside request: Chinese, Japanese or Korean text on the board loads
86
168
  Excalidraw's CJK font from esm.sh (it is not bundled, to keep the package
87
169
  small). Everything else, including all other fonts, is served locally.
@@ -106,17 +188,19 @@ The repo ships a Nix flake with Node 24 and Chromium for the browser tests:
106
188
  direnv allow # or: nix develop
107
189
  npm install
108
190
  npm test # unit tests (vitest)
109
- npm run test:e2e # browser tests (playwright) against a mock Claude home
191
+ npm run test:e2e # browser tests (playwright) against mock Claude, Codex and OpenCode homes
110
192
  npm run demo # the board with a seeded, synthetic set of sessions
111
- npm run dev # server + Vite hot reload against your real ~/.claude
193
+ npm run dev # server + Vite hot reload against your real ~/.claude, ~/.codex and OpenCode data
112
194
  ```
113
195
 
114
- Tests never read your real `~/.claude` or talk to your running herdr:
115
- `test/mock-claude.ts` seeds a throwaway Claude home with dummy processes, and the
196
+ Tests never read your real `~/.claude`, `~/.codex` or OpenCode data or talk to
197
+ your running herdr: `test/mock-claude.ts`, `test/mock-codex.ts` and
198
+ `test/mock-opencode.ts` seed throwaway homes with dummy processes, and the
116
199
  herdr tests start an isolated `herdr server` with its own temp home and socket.
117
200
  A privacy test fails if any fixture contains this machine's home path or user
118
201
  name.
119
202
 
120
203
  Docs: [product](docs/product.md), [design](docs/design.md), [roadmap](docs/roadmap.md). Agents start at [AGENTS.md](AGENTS.md).
121
204
 
122
- MIT licensed. The harness logos on cards (from [simple-icons](https://simpleicons.org), CC0) are trademarks of their owners and only identify which agent a card belongs to.
205
+ MIT licensed. Built-in characters are Unicode emoji, drawn by your system's
206
+ emoji font. The harness logos on cards (from [simple-icons](https://simpleicons.org), CC0) are trademarks of their owners and only identify which agent a card belongs to. simple-icons has no OpenAI mark, so Codex cards show a neutral `>_` glyph drawn for this project; the OpenCode mark is from simple-icons too.
@@ -3,7 +3,7 @@ import { parseArgs } from "node:util";
3
3
  export const DEFAULT_PORT = 7357;
4
4
  export const USAGE = `Usage: excaliagent [options]
5
5
 
6
- A spatial Excalidraw board for your Claude Code sessions.
6
+ A spatial Excalidraw board for your coding-agent sessions (Claude Code, Codex, OpenCode).
7
7
 
8
8
  Options:
9
9
  --port <n> Port on 127.0.0.1 (default: 7357, or a random free port
@@ -11,6 +11,11 @@ Options:
11
11
  --no-open Do not open the browser, just print the URL
12
12
  --state-dir <dir> Where scene.json lives (default: $XDG_STATE_HOME/excaliagent)
13
13
  --claude-dir <dir> Claude Code home (default: ~/.claude)
14
+ --codex-dir <dir> Codex home (default: $CODEX_HOME, else ~/.codex)
15
+ --no-codex Do not show Codex sessions
16
+ --opencode-dir <dir> OpenCode data dir, holding opencode.db (default:
17
+ $XDG_DATA_HOME/opencode, else ~/.local/share/opencode)
18
+ --no-opencode Do not show OpenCode sessions
14
19
  --no-herdr Do not link sessions to herdr panes
15
20
  --no-raise Focus the herdr pane but do not raise its terminal window
16
21
  (raising supports Hyprland, Sway and macOS)
@@ -31,6 +36,10 @@ export function parseCliArgs(argv) {
31
36
  raise: { type: "boolean", default: true },
32
37
  "state-dir": { type: "string" },
33
38
  "claude-dir": { type: "string" },
39
+ codex: { type: "boolean", default: true },
40
+ "codex-dir": { type: "string" },
41
+ opencode: { type: "boolean", default: true },
42
+ "opencode-dir": { type: "string" },
34
43
  help: { type: "boolean", short: "h", default: false },
35
44
  version: { type: "boolean", short: "v", default: false },
36
45
  },
@@ -49,6 +58,10 @@ export function parseCliArgs(argv) {
49
58
  raise: values.raise,
50
59
  stateDir: values["state-dir"],
51
60
  claudeDir: values["claude-dir"],
61
+ codex: values.codex,
62
+ codexDir: values["codex-dir"],
63
+ opencode: values.opencode,
64
+ opencodeDir: values["opencode-dir"],
52
65
  help: values.help,
53
66
  version: values.version,
54
67
  };