collabmd 0.1.48 → 0.1.49

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 (268) hide show
  1. package/README.md +61 -5
  2. package/bin/collabmd.js +3 -0
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-C-nmgL5g.js +1 -0
  4. package/dist/client/assets/abnfDiagram-VCTEODGH-CdVZqicp.js +1 -0
  5. package/dist/client/assets/{architectureDiagram-5GKGNRK7-I39sYjHI.js → architectureDiagram-5GKGNRK7-wUo0bXif.js} +3 -3
  6. package/dist/client/assets/{blockDiagram-NRAW4CY4-C6DtJy5Y.js → blockDiagram-I7D4REHJ-BRSK3m49.js} +4 -4
  7. package/dist/client/assets/browser-utils-DbXSMI-6.js +1 -0
  8. package/dist/client/assets/{c4Diagram-UCG6FXSJ-CtWtxS9_.js → c4Diagram-7LVT6UL2-yD2poxqw.js} +1 -1
  9. package/dist/client/assets/channel-Fa4GS_-F.js +1 -0
  10. package/dist/client/assets/chunk-2E4U76K2-BPnTT-J3.js +2 -0
  11. package/dist/client/assets/{chunk-TEH6E4GO-DVayPj-q.js → chunk-4HAMMTFA-DStbIfJ1.js} +20 -20
  12. package/dist/client/assets/{chunk-75Z2AOVW-CdFSaPjz.js → chunk-75Z2AOVW-C5pGd3W9.js} +1 -1
  13. package/dist/client/assets/{chunk-CLGD4ZFX-DQLgbQrv.js → chunk-CLGD4ZFX-BMeArk03.js} +1 -1
  14. package/dist/client/assets/chunk-DU6HZSFF-Zkp69c6c.js +127 -0
  15. package/dist/client/assets/{chunk-F27PBJKO-CNHIFhjo.js → chunk-F27PBJKO-D4xNct1r.js} +1 -1
  16. package/dist/client/assets/{chunk-GMAD6QVW-CbcBqPM5.js → chunk-GMAD6QVW-NZ6WpDb8.js} +1 -1
  17. package/dist/client/assets/{chunk-OBVCFTLP-BJR7u1jh.js → chunk-GVQU2GXP-D8SDprfX.js} +1 -1
  18. package/dist/client/assets/{chunk-G27WJ6UU-D9-eg537.js → chunk-IMKFNOWR-D8jEuU3Q.js} +2 -2
  19. package/dist/client/assets/{chunk-JQ64N6SF-DSFNH4bh.js → chunk-L3NEJ4N5-aijKP-eh.js} +1 -1
  20. package/dist/client/assets/chunk-OSK3NFVY-CCbLQAMa.js +10 -0
  21. package/dist/client/assets/{chunk-P2QGCYS3-BRpqY32H.js → chunk-P2QGCYS3-Oag_FdCq.js} +1 -1
  22. package/dist/client/assets/{chunk-POPQ4Y6H-Cb4SlVZF.js → chunk-POPQ4Y6H-CYnpIgXT.js} +1 -1
  23. package/dist/client/assets/{chunk-PWAF6VOD-Cz8IwBB5.js → chunk-PWAF6VOD-JSNrcBmP.js} +1 -1
  24. package/dist/client/assets/{chunk-RM4UPSZO-CWRwxNWJ.js → chunk-RM4UPSZO-DOWllDY8.js} +4 -4
  25. package/dist/client/assets/{chunk-RHFEMEQ7-CWY8cf4H.js → chunk-SHT3W25Y-BiQGljao.js} +5 -5
  26. package/dist/client/assets/{chunk-SVP7TREG-CyHOmcac.js → chunk-SVP7TREG-DB485R5x.js} +1 -1
  27. package/dist/client/assets/{chunk-LCL6LL3I-DmDkVukh.js → chunk-TICWLB2K-8rAVvoS3.js} +4 -4
  28. package/dist/client/assets/{chunk-CKBBP62Z-DG26UiBv.js → chunk-TLUHSLCS-DTY5v0aj.js} +2 -2
  29. package/dist/client/assets/classDiagram-ZZMXUADV-BsQWoR3Q.js +1 -0
  30. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BsQWoR3Q.js +1 -0
  31. package/dist/client/assets/{comment-thread-store-CdcwrObc.js → comment-thread-store-CX98zR6q.js} +1 -1
  32. package/dist/client/assets/comment-threads-BnRwo5B9.js +4 -0
  33. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CdTPi2yO.js → cynefinDiagram-5FMLGOSQ-rTz9RhFH.js} +1 -1
  34. package/dist/client/assets/{dagre-3AP2YEHR-5gtJtd0O.js → dagre-GXQ25YYZ-Cr67wLpQ.js} +2 -2
  35. package/dist/client/assets/{diagram-S7CK7UJ4-BudWz9WU.js → diagram-S7CK7UJ4-DywERe__.js} +2 -2
  36. package/dist/client/assets/{diagram-UQ7AKVKN-3v4rbH-s.js → diagram-UQ7AKVKN-CNYlXtu4.js} +1 -1
  37. package/dist/client/assets/diagram-VSXAHHWV-0H1a61Bn.js +3 -0
  38. package/dist/client/assets/{diagram-VX7I27RA-C_-rj0sw.js → diagram-VX7I27RA-CsJbsx5F.js} +1 -1
  39. package/dist/client/assets/{diagram-Z3DM3KII-B4yxavgj.js → diagram-Z3DM3KII-D0mLxEgI.js} +1 -1
  40. package/dist/client/assets/dist--hk9I5HQ.js +1 -0
  41. package/dist/client/assets/{dist-DutPuFmC.js → dist-B1XEa-Zs.js} +1 -1
  42. package/dist/client/assets/dist-Bd1JucQF.js +1 -0
  43. package/dist/client/assets/{dist-DZAAWTG-.js → dist-C0G3AaXG.js} +1 -1
  44. package/dist/client/assets/dist-Dm4w5UId.js +1 -0
  45. package/dist/client/assets/{dist-B_yQaEv_.js → dist-DpYDHR9p.js} +1 -1
  46. package/dist/client/assets/{dist-CietwTVS.js → dist-DzNmC81X.js} +1 -1
  47. package/dist/client/assets/{dist-DDUn5zTz.js → dist-GvvCNBe4.js} +1 -1
  48. package/dist/client/assets/dist-JaU3aRlD.js +19 -0
  49. package/dist/client/assets/{dist-Bw3VIE_v.js → dist-TW8iFRyW.js} +1 -1
  50. package/dist/client/assets/{dist-Dir5dDKZ.js → dist-jVU5Be5P.js} +1 -1
  51. package/dist/client/assets/document-formatter-rDDjRfZ2.js +2 -0
  52. package/dist/client/assets/drawioEditor-JubEEha7.js +9 -0
  53. package/dist/client/assets/ebnfDiagram-PWID7BFC-HeTxHpCU.js +1 -0
  54. package/dist/client/assets/editor-session-Bk6oIvSr.js +54 -0
  55. package/dist/client/assets/{embedded-editor-base-B3l6Xy65.css → embedded-editor-base-BlCgz6mw.css} +1 -1
  56. package/dist/client/assets/{erDiagram-SSCWMZ5O-C-iy6VkX.js → erDiagram-RLTQ6QDP-CbrDdd5P.js} +2 -2
  57. package/dist/client/assets/{vault-utils-DvoSftJT.js → es-Bfdp096f.js} +13 -13
  58. package/dist/client/assets/excalidraw-element-link-YLIaTnVF.js +7 -0
  59. package/dist/client/assets/{excalidraw-scene-BOben2gr.js → excalidraw-scene-6uROebca.js} +1 -1
  60. package/dist/client/assets/excalidrawEditor-dBMbRX_S.js +9 -0
  61. package/dist/client/assets/export-page-CRRQ2NEl.js +57 -0
  62. package/dist/client/assets/exportDocument-BlQRd9_m.js +2 -0
  63. package/dist/client/assets/exportDocument-CNSbjZwu.css +1 -0
  64. package/dist/client/assets/flowDiagram-HODETNUW-D5Gy0wmg.js +1 -0
  65. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DtKHAbez.js → ganttDiagram-EL5Y4UJY-BHgOYiZz.js} +1 -1
  66. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-oue8fQ5o.js → gitGraphDiagram-WWUBYQGX-Dl__X3Sk.js} +1 -1
  67. package/dist/client/assets/image-ZVKINSPA-DgzW5zAy.js +1 -0
  68. package/dist/client/assets/index-D3RER1SZ.js +1023 -0
  69. package/dist/client/assets/index-DREVKl_K.css +1 -0
  70. package/dist/client/assets/{infoDiagram-RXCK75RN-BMzo6KIn.js → infoDiagram-27XIBGKW-DBpoANC9.js} +1 -1
  71. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIM3h287.js → ishikawaDiagram-5VMMS53U-BMPC6hfp.js} +1 -1
  72. package/dist/client/assets/{journeyDiagram-EYS64GPL-mF6Lh8O-.js → journeyDiagram-3NMN7TZE-B1sApUmM.js} +2 -2
  73. package/dist/client/assets/{kanban-definition-3QL26DDD-DLN2NyoR.js → kanban-definition-UXKFOSKX-C9yP4td1.js} +4 -4
  74. package/dist/client/assets/{line-BfTWJmgf.js → line-BFl3ujec.js} +1 -1
  75. package/dist/client/assets/mermaid.core-BrY09czX.js +11 -0
  76. package/dist/client/assets/mermaid.core-DfcNfOTv.js +1 -0
  77. package/dist/client/assets/{mindmap-definition-FBJOCRG2-CRyHaHTk.js → mindmap-definition-YA3MSWOX-BUQHcYbK.js} +8 -8
  78. package/dist/client/assets/pegDiagram-XKGWAZYB-Bi2Iml7Z.js +1 -0
  79. package/dist/client/assets/{pieDiagram-E7YTZNPT-B5OZPb88.js → pieDiagram-E7YTZNPT-_gYXnMoi.js} +1 -1
  80. package/dist/client/assets/preview-render-compiler-CfxJYldJ.js +41 -0
  81. package/dist/client/assets/preview-render-compiler-Cu8_i9iS.js +1 -0
  82. package/dist/client/assets/{preview-render-worker-_QTxqKvP.js → preview-render-worker-c4Yi93qW.js} +41 -35
  83. package/dist/client/assets/prod-BiJL30sl.js +1 -0
  84. package/dist/client/assets/prod-qAk7rHa4.js +177 -0
  85. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Drrw14YH.js → quadrantDiagram-AXDQQJYC-DwexhEhd.js} +1 -1
  86. package/dist/client/assets/quick-switcher-controller-BoIK_wuG.js +1 -0
  87. package/dist/client/assets/railroadDiagram-O6MQD6OU-BVA5UbMu.js +1 -0
  88. package/dist/client/assets/{requirementDiagram-EFPCY7ZU-CRZG6mRB.js → requirementDiagram-BXWQKSXE-C4cKwiIw.js} +2 -2
  89. package/dist/client/assets/runtime-config-DcmnGcXU.js +1 -0
  90. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DvarEJpo.js → sankeyDiagram-P5KCCOFB-B5HHkRT2.js} +1 -1
  91. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B4oWlb-w.js → sequenceDiagram-WJ2MYXX4-BX6jqJFD.js} +6 -6
  92. package/dist/client/assets/{stateDiagram-HBIQ2CUA-qbHIIqRZ.js → stateDiagram-D77RDMKH-CmqxyRGx.js} +1 -1
  93. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-zoLLQVyh.js +1 -0
  94. package/dist/client/assets/{swimlanes-XN3QIQJK-xB6CtUGj.js → swimlanes-42K2YHIH-Bmgb9Zld.js} +1 -1
  95. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DS-KQN37.js +8 -0
  96. package/dist/client/assets/{timeline-definition-24CTP7MA-Lj_yTNlY.js → timeline-definition-24CTP7MA-BA-lVH6P.js} +1 -1
  97. package/dist/client/assets/vault-api-client-iZLhMJKe.js +6 -0
  98. package/dist/client/assets/{vennDiagram-4TSXK5OY-BekRp5Y0.js → vennDiagram-4TSXK5OY-DNdUC_Xj.js} +1 -1
  99. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-kdnV_Hdm.js → wardleyDiagram-VM6X3IG4-C2oY-YbF.js} +1 -1
  100. package/dist/client/assets/wiki-link-resolver-DFIwErjc.js +1 -0
  101. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DufGwNSB.js → xychartDiagram-S5SC5T6Z-CoIR8CBX.js} +1 -1
  102. package/dist/client/assets/{yjs-provider-reset-guard-DE0vINDP.js → yjs-provider-reset-guard-9ul1qF6k.js} +1 -1
  103. package/dist/client/drawio-editor.html +11 -3
  104. package/dist/client/excalidraw-editor.html +45 -2
  105. package/dist/client/export-document.html +3 -3
  106. package/dist/client/index.html +67 -35
  107. package/integrations/pi/index.ts +94 -0
  108. package/package.json +41 -32
  109. package/src/client/app/drawio-editor.html +2 -2
  110. package/src/client/app/excalidraw-editor.html +2 -2
  111. package/src/client/app/export-document.html +1 -1
  112. package/src/client/app/index.html +49 -33
  113. package/src/client/app/main-entry.js +15 -1
  114. package/src/client/application/app-shell/chat-feature.js +7 -22
  115. package/src/client/application/app-shell/git-feature.js +23 -5
  116. package/src/client/application/app-shell/presence-feature.js +8 -25
  117. package/src/client/application/app-shell/ui-feature-shell.js +36 -91
  118. package/src/client/application/app-shell/ui-feature-sidebar.js +43 -7
  119. package/src/client/application/app-shell/ui-feature-tab-activity.js +19 -6
  120. package/src/client/application/app-shell/ui-feature-toolbar.js +16 -129
  121. package/src/client/application/app-shell-elements.js +4 -0
  122. package/src/client/application/preview-render-compiler.js +1 -87
  123. package/src/client/application/preview-render-scheduler.js +8 -24
  124. package/src/client/application/preview-renderer.js +2 -2
  125. package/src/client/application/webmcp-diagram-renderer.js +47 -0
  126. package/src/client/application/workspace-coordinator.js +3 -1
  127. package/src/client/application/workspace-route-controller.js +7 -0
  128. package/src/client/bootstrap/collabmd-app-shell.js +78 -1
  129. package/src/client/domain/excalidraw-element-link.js +73 -0
  130. package/src/client/domain/excalidraw-scene.js +21 -0
  131. package/src/client/domain/hash-routes.js +8 -0
  132. package/src/client/domain/room.js +1 -5
  133. package/src/client/domain/runtime-paths.js +5 -0
  134. package/src/client/excalidraw-editor.js +135 -10
  135. package/src/client/export/export-host.js +3 -1
  136. package/src/client/export/export-pipeline.js +4 -17
  137. package/src/client/infrastructure/agent-connection-api-client.js +23 -0
  138. package/src/client/infrastructure/auth-client.js +3 -13
  139. package/src/client/infrastructure/editor-session.js +11 -0
  140. package/src/client/infrastructure/editor-view-adapter.js +13 -0
  141. package/src/client/infrastructure/excalidraw-room-client.js +80 -1
  142. package/src/client/infrastructure/git-api-client.js +39 -33
  143. package/src/client/infrastructure/lobby-presence.js +2 -5
  144. package/src/client/infrastructure/runtime-config.js +11 -1
  145. package/src/client/infrastructure/tab-activity-lock.js +2 -5
  146. package/src/client/infrastructure/vault-api-client.js +33 -26
  147. package/src/client/infrastructure/webmcp-tool-registry.js +283 -0
  148. package/src/client/infrastructure/workspace-sync-client.js +6 -4
  149. package/src/client/presentation/agent-connection-controller.js +255 -0
  150. package/src/client/presentation/backlinks-panel.js +3 -0
  151. package/src/client/presentation/bases-preview-controller.js +27 -18
  152. package/src/client/presentation/comment-ui/comment-ui-card.js +4 -2
  153. package/src/client/presentation/create-menu-presenter.js +19 -16
  154. package/src/client/presentation/excalidraw-embed-controller.js +164 -4
  155. package/src/client/presentation/file-explorer-view.js +70 -12
  156. package/src/client/presentation/file-history-view-controller.js +13 -11
  157. package/src/client/presentation/git-diff-view-controller.js +35 -43
  158. package/src/client/presentation/git-panel-controller.js +77 -27
  159. package/src/client/presentation/image-lightbox-controller.js +20 -16
  160. package/src/client/presentation/layout-controller.js +3 -1
  161. package/src/client/presentation/quick-switcher-controller.js +20 -78
  162. package/src/client/presentation/quick-switcher-text-search.js +10 -14
  163. package/src/client/styles/components/navigation.css +1 -2
  164. package/src/client/styles/features/agent-connection.css +202 -0
  165. package/src/client/styles/features/collaboration-chat.css +8 -1
  166. package/src/client/styles/features/collaboration-dialogs.css +16 -1
  167. package/src/client/styles/features/collaboration-presence.css +17 -4
  168. package/src/client/styles/features/diff-toolbar.css +1 -1
  169. package/src/client/styles/features/media-lightbox.css +12 -3
  170. package/src/client/styles/features/quick-switcher.css +20 -11
  171. package/src/client/styles/foundation/themes.css +2 -0
  172. package/src/client/styles/layout/editor-page.css +25 -11
  173. package/src/client/styles/layout/responsive.css +2 -20
  174. package/src/client/styles/layout/shell.css +1 -0
  175. package/src/client/styles/layout/sidebar.css +7 -4
  176. package/src/client/styles/primitives/controls.css +21 -54
  177. package/src/client/styles/style.css +1 -0
  178. package/src/domain/agent-tool-definitions.js +796 -0
  179. package/src/domain/collabmd-content-capabilities.js +149 -0
  180. package/src/domain/collaboration-protocol.js +2 -0
  181. package/src/domain/comment-threads.js +3 -5
  182. package/src/domain/diagram-source.js +50 -0
  183. package/src/domain/editable-content-revision.js +10 -0
  184. package/src/domain/editable-text.js +3 -0
  185. package/src/domain/exact-text-edits.js +69 -0
  186. package/src/domain/excalidraw-agent-scene.js +522 -0
  187. package/src/domain/excalidraw-agent-verification.js +460 -0
  188. package/src/domain/excalidraw-room-codec.js +1 -5
  189. package/src/domain/video-embed.js +76 -0
  190. package/src/server/application/agent-connection-service.js +178 -0
  191. package/src/server/application/agent-content-service.js +773 -0
  192. package/src/server/application/workspace-reconciliation.js +5 -7
  193. package/src/server/config/env.js +51 -1
  194. package/src/server/create-app-server.js +36 -0
  195. package/src/server/domain/bases/base-query-service.js +1 -5
  196. package/src/server/domain/collaboration/collaboration-room.js +121 -25
  197. package/src/server/domain/collaboration/protocol.js +4 -0
  198. package/src/server/domain/hosted-workspace.js +21 -0
  199. package/src/server/domain/markdown-reference-extractor.js +15 -1
  200. package/src/server/infrastructure/git/git-service.js +19 -1
  201. package/src/server/infrastructure/git/history-service.js +1 -1
  202. package/src/server/infrastructure/git/local-exclude.js +25 -0
  203. package/src/server/infrastructure/git/parsers.js +19 -17
  204. package/src/server/infrastructure/git/path-utils.js +0 -16
  205. package/src/server/infrastructure/git/status-service.js +1 -1
  206. package/src/server/infrastructure/git/untracked-files.js +12 -21
  207. package/src/server/infrastructure/http/create-agent-api-handler.js +171 -0
  208. package/src/server/infrastructure/http/create-git-api-command-handler.js +32 -0
  209. package/src/server/infrastructure/http/create-request-handler.js +28 -0
  210. package/src/server/infrastructure/http/create-static-handler.js +6 -0
  211. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +199 -0
  212. package/src/server/infrastructure/persistence/agent-connection-store.js +120 -0
  213. package/src/server/infrastructure/persistence/pull-backup-store.js +2 -27
  214. package/src/server/infrastructure/persistence/vault-file-store.js +9 -2
  215. package/src/server/shared/agent-tool-image.js +22 -0
  216. package/src/server/shared/agent-tool-rate-limiter.js +20 -0
  217. package/src/server/startup/git-remote-bootstrap.js +5 -33
  218. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +0 -1
  219. package/dist/client/assets/abnfDiagram-VCTEODGH-BNDLzJ7L.js +0 -1
  220. package/dist/client/assets/browser-utils--H_DkyEF.js +0 -1
  221. package/dist/client/assets/channel-CaoKA_We.js +0 -1
  222. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +0 -2
  223. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +0 -127
  224. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +0 -10
  225. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +0 -1
  226. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +0 -1
  227. package/dist/client/assets/comment-threads-9J6Em-_y.js +0 -4
  228. package/dist/client/assets/comment-ui-shared-DuoyznXW.js +0 -7
  229. package/dist/client/assets/diagram-VSXAHHWV-CQRVEZR7.js +0 -3
  230. package/dist/client/assets/dist-73RPdcyU.js +0 -1
  231. package/dist/client/assets/dist-CH-sQu3r.js +0 -1
  232. package/dist/client/assets/document-formatter-Dxl_a8XO.js +0 -2
  233. package/dist/client/assets/drawio-editor-BVaNNtYp.js +0 -9
  234. package/dist/client/assets/drawioEditor-BkIBlXx0.js +0 -2
  235. package/dist/client/assets/ebnfDiagram-PWID7BFC-OXa8VEp1.js +0 -1
  236. package/dist/client/assets/editor-session-DMyVdHLj.js +0 -54
  237. package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +0 -9
  238. package/dist/client/assets/excalidraw-mermaid-stub-BNckbX2n.js +0 -1
  239. package/dist/client/assets/excalidraw-mermaid-stub-DE5FTiZB.js +0 -1
  240. package/dist/client/assets/excalidrawEditor-ChqF_d82.js +0 -2
  241. package/dist/client/assets/export-page-Dyu0XCbu.js +0 -57
  242. package/dist/client/assets/exportDocument-CJBx4Xjx.css +0 -1
  243. package/dist/client/assets/exportDocument-Dgvfa2Sd.js +0 -2
  244. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +0 -1
  245. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +0 -1
  246. package/dist/client/assets/index-CSNIMyOP.css +0 -1
  247. package/dist/client/assets/index-DG3N2Ps-.js +0 -2
  248. package/dist/client/assets/main-D0wCxpVn.js +0 -903
  249. package/dist/client/assets/mermaid.core-BJRLUQZE.js +0 -11
  250. package/dist/client/assets/pegDiagram-XKGWAZYB-B31fKPR2.js +0 -1
  251. package/dist/client/assets/preview-render-compiler-CrJIooVD.js +0 -35
  252. package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +0 -1
  253. package/dist/client/assets/preview-render-profile-B4RWYWHt.js +0 -1
  254. package/dist/client/assets/prod-BiYPMR1i.js +0 -177
  255. package/dist/client/assets/prod-VxdGZ5Ly.js +0 -1
  256. package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +0 -1
  257. package/dist/client/assets/railroadDiagram-O6MQD6OU-BPifP0MB.js +0 -1
  258. package/dist/client/assets/runtime-config-BLrEKVO1.js +0 -1
  259. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +0 -1
  260. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +0 -8
  261. package/dist/client/assets/vault-api-client-BkwdFjx0.js +0 -6
  262. package/src/client/app/drawio-editor-entry.js +0 -1
  263. package/src/client/app/excalidraw-editor-entry.js +0 -1
  264. package/src/client/excalidraw-mermaid-stub.js +0 -7
  265. package/src/client/main.js +0 -16
  266. /package/dist/client/assets/{drawio-editor-UQQ8XHou.css → drawioEditor-UQQ8XHou.css} +0 -0
  267. /package/dist/client/assets/{excalidraw-editor-BbSbI80a.css → excalidrawEditor-BbSbI80a.css} +0 -0
  268. /package/dist/client/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -10,7 +10,7 @@
10
10
  <header class="export-page-header">
11
11
  <div>
12
12
  <h1>Preparing export</h1>
13
- <p id="exportStatus">Initializing…</p>
13
+ <p id="exportStatus" role="status" aria-live="polite">Initializing…</p>
14
14
  </div>
15
15
  </header>
16
16
  <section id="exportWarningsSection" class="export-warnings-panel" hidden>
@@ -72,8 +72,8 @@
72
72
  </button>
73
73
  </div>
74
74
  </div>
75
- <div class="ui-nav-tabs" id="sidebarTabs">
76
- <button class="ui-nav-tab active" id="filesSidebarTab" type="button">
75
+ <div class="ui-nav-tabs" id="sidebarTabs" role="tablist" aria-label="Sidebar views">
76
+ <button class="ui-nav-tab active" id="filesSidebarTab" type="button" role="tab" aria-selected="true" aria-controls="fileTree" tabindex="0">
77
77
  <span class="ui-nav-tab-icon" aria-hidden="true">
78
78
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
79
79
  <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path>
@@ -81,7 +81,7 @@
81
81
  </span>
82
82
  <span class="ui-nav-tab-label">Files</span>
83
83
  </button>
84
- <button class="ui-nav-tab" id="commentsSidebarTab" type="button">
84
+ <button class="ui-nav-tab" id="commentsSidebarTab" type="button" role="tab" aria-selected="false" aria-controls="commentOverviewPanel" tabindex="-1">
85
85
  <span class="ui-nav-tab-icon" aria-hidden="true">
86
86
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
87
87
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
@@ -89,7 +89,7 @@
89
89
  </span>
90
90
  <span class="ui-nav-tab-label">Comments</span>
91
91
  </button>
92
- <button class="ui-nav-tab hidden" id="gitSidebarTab" type="button">
92
+ <button class="ui-nav-tab hidden" id="gitSidebarTab" type="button" role="tab" aria-selected="false" aria-controls="gitPanel" tabindex="-1">
93
93
  <span class="ui-nav-tab-icon" aria-hidden="true">
94
94
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
95
95
  <circle cx="18" cy="18" r="3"></circle>
@@ -125,9 +125,9 @@
125
125
  aria-label="Search changed files"
126
126
  >
127
127
  </div>
128
- <nav id="fileTree" class="file-tree" aria-label="File explorer"></nav>
129
- <section id="commentOverviewPanel" class="comment-overview-panel hidden" aria-label="Open comments"></section>
130
- <div id="gitPanel" class="git-panel hidden" aria-label="Git changes"></div>
128
+ <nav id="fileTree" class="file-tree" role="tabpanel" aria-labelledby="filesSidebarTab"></nav>
129
+ <section id="commentOverviewPanel" class="comment-overview-panel hidden" role="tabpanel" aria-labelledby="commentsSidebarTab"></section>
130
+ <div id="gitPanel" class="git-panel hidden" role="tabpanel" aria-labelledby="gitSidebarTab"></div>
131
131
  <div
132
132
  class="sidebar-resizer"
133
133
  id="sidebarResizer"
@@ -239,13 +239,11 @@
239
239
  type="button"
240
240
  class="ui-pill-badge ui-pill-badge--muted toolbar-badge toolbar-badge-button toolbar-presence-count"
241
241
  id="userCount"
242
- aria-controls="presencePanel"
243
- aria-expanded="false"
244
- data-presence-panel-trigger="true"
242
+ popovertarget="presencePanel"
245
243
  ></button>
246
244
  </div>
247
245
 
248
- <section class="collaboration-popover presence-panel hidden" id="presencePanel" aria-label="Online users" aria-hidden="true">
246
+ <section class="collaboration-popover presence-panel" id="presencePanel" aria-label="Online users" popover="auto">
249
247
  <div class="presence-panel-header">
250
248
  <div>
251
249
  <h2 class="presence-panel-title">Online now</h2>
@@ -256,7 +254,7 @@
256
254
  </section>
257
255
 
258
256
  <div class="chat-container" id="chatContainer">
259
- <button type="button" class="ui-button ui-button--ghost ui-button--toolbar chat-toggle-btn" id="chatToggleBtn" aria-label="Open team chat" aria-controls="chatPanel" aria-expanded="false" title="Team chat">
257
+ <button type="button" class="ui-button ui-button--ghost ui-button--toolbar chat-toggle-btn" id="chatToggleBtn" aria-label="Open team chat" popovertarget="chatPanel" title="Team chat">
260
258
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
261
259
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
262
260
  </svg>
@@ -265,7 +263,7 @@
265
263
  </button>
266
264
  <div class="toast-container chat-toast-container" id="chatToastContainer" aria-live="polite" aria-atomic="true"></div>
267
265
 
268
- <section class="collaboration-popover chat-panel hidden" id="chatPanel" role="dialog" aria-labelledby="chatPanelTitle">
266
+ <section class="collaboration-popover chat-panel" id="chatPanel" role="dialog" aria-labelledby="chatPanelTitle" popover="auto">
269
267
  <div class="chat-panel-header">
270
268
  <div class="chat-panel-heading">
271
269
  <h2 class="chat-panel-title" id="chatPanelTitle">Team chat</h2>
@@ -292,7 +290,7 @@
292
290
  <path class="chat-notification-mute-slash" d="m4 4 16 16"></path>
293
291
  </svg>
294
292
  </button>
295
- <button type="button" class="ui-icon-button chat-close-btn" id="chatCloseBtn" aria-label="Close team chat" title="Close team chat">
293
+ <button type="button" class="ui-icon-button chat-close-btn" id="chatCloseBtn" aria-label="Close team chat" popovertarget="chatPanel" popovertargetaction="hide" title="Close team chat">
296
294
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
297
295
  <line x1="18" y1="6" x2="6" y2="18"></line>
298
296
  <line x1="6" y1="6" x2="18" y2="18"></line>
@@ -327,7 +325,7 @@
327
325
  class="ui-button ui-button--ghost ui-button--toolbar toolbar-overflow-toggle"
328
326
  id="toolbarOverflowToggle"
329
327
  aria-label="Open more actions"
330
- aria-expanded="false"
328
+ popovertarget="toolbarOverflowMenu"
331
329
  title="More actions"
332
330
  >
333
331
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
@@ -337,7 +335,7 @@
337
335
  </svg>
338
336
  </button>
339
337
 
340
- <div class="toolbar-overflow-menu" id="toolbarOverflowMenu">
338
+ <div class="toolbar-overflow-menu" id="toolbarOverflowMenu" popover="auto">
341
339
  <button class="ui-button ui-button--ghost ui-button--toolbar hidden" id="fileHistoryBtn" aria-label="Open file history" title="View file history">
342
340
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
343
341
  <path d="M3 12a9 9 0 1 0 3-6.7"></path>
@@ -363,6 +361,14 @@
363
361
  <span class="ui-toolbar-button-label">Share</span>
364
362
  </button>
365
363
 
364
+ <button class="ui-button ui-button--ghost ui-button--toolbar hidden" id="connectAgentBtn" aria-label="Connect AI Agent" title="Connect AI Agent">
365
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
366
+ <rect x="5" y="7" width="14" height="11" rx="3"></rect>
367
+ <path d="M12 3v4M8 12h.01M16 12h.01M9 16h6"></path>
368
+ </svg>
369
+ <span class="ui-toolbar-button-label">Connect AI Agent</span>
370
+ </button>
371
+
366
372
  <button class="ui-button ui-button--ghost ui-button--toolbar toolbar-search-files-btn" id="searchFilesBtn" aria-label="Search files" title="Search files">
367
373
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
368
374
  <circle cx="11" cy="11" r="7"></circle>
@@ -460,7 +466,7 @@
460
466
  <circle cx="11" cy="11" r="8"></circle>
461
467
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
462
468
  </svg>
463
- Search Everything
469
+ Search everything
464
470
  <kbd class="empty-state-kbd">⌘K</kbd>
465
471
  </button>
466
472
  </div>
@@ -509,7 +515,7 @@
509
515
  </div>
510
516
  <div id="markdownToolbar" class="markdown-toolbar hidden" role="toolbar" aria-label="Markdown formatting"></div>
511
517
  <div id="editorContainer" class="editor-container">
512
- <div class="editor-loading" id="editorLoading">
518
+ <div class="editor-loading" id="editorLoading" role="status" aria-live="polite" aria-label="Loading file…">
513
519
  <div class="skeleton-line skeleton-line--title skeleton-line--break"></div>
514
520
  <div class="skeleton-line skeleton-line--full"></div>
515
521
  <div class="skeleton-line skeleton-line--ninety"></div>
@@ -630,7 +636,7 @@
630
636
  </div>
631
637
  <div class="diff-toolbar-actions">
632
638
  <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface hidden diff-back-btn" id="diffBackToHistoryBtn" type="button">
633
- Back to History
639
+ Back to history
634
640
  </button>
635
641
  <div class="diff-toolbar-actions-group diff-toolbar-actions-group-git" id="diffGitActionsGroup" role="group" aria-label="Git file actions">
636
642
  <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface" id="diffPrimaryActionBtn" type="button" disabled>
@@ -648,12 +654,12 @@
648
654
  <span class="ui-stat-token ui-stat-token--del diff-stats-del">-0</span>
649
655
  </div>
650
656
  <div class="ui-segmented-control hidden diff-layout-toggle" id="diffLayoutToggle" role="group" aria-label="Commit diff layout">
651
- <button class="ui-segmented-btn view-btn diff-layout-btn" data-diff-layout="stacked" type="button">Stacked</button>
652
- <button class="ui-segmented-btn active view-btn diff-layout-btn" data-diff-layout="focused" type="button">Focused</button>
657
+ <button class="ui-segmented-btn diff-layout-btn" data-diff-layout="stacked" type="button" aria-pressed="false">Stacked</button>
658
+ <button class="ui-segmented-btn active diff-layout-btn" data-diff-layout="focused" type="button" aria-pressed="true">Focused</button>
653
659
  </div>
654
660
  <div class="ui-segmented-control diff-mode-toggle" role="group" aria-label="Diff view mode">
655
- <button class="ui-segmented-btn active view-btn diff-mode-btn" data-diff-mode="unified" type="button">Unified</button>
656
- <button class="ui-segmented-btn view-btn diff-mode-btn" data-diff-mode="split" type="button">Split</button>
661
+ <button class="ui-segmented-btn active diff-mode-btn" data-diff-mode="unified" type="button" aria-pressed="true">Unified</button>
662
+ <button class="ui-segmented-btn diff-mode-btn" data-diff-mode="split" type="button" aria-pressed="false">Split</button>
657
663
  </div>
658
664
  <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
659
665
  <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
@@ -670,7 +676,7 @@
670
676
  </main>
671
677
  </div>
672
678
 
673
- <dialog class="app-dialog" id="displayNameDialog">
679
+ <dialog class="app-dialog" id="displayNameDialog" aria-labelledby="displayNameTitle">
674
680
  <form class="app-dialog-form" id="displayNameForm" method="dialog">
675
681
  <div class="app-dialog-header">
676
682
  <h2 class="app-dialog-title" id="displayNameTitle">Update display name</h2>
@@ -687,7 +693,17 @@
687
693
  </form>
688
694
  </dialog>
689
695
 
690
- <dialog class="app-dialog" id="fileActionDialog">
696
+ <dialog class="app-dialog agent-connection-dialog" id="agentConnectionDialog" aria-labelledby="agentConnectionTitle">
697
+ <div class="app-dialog-form">
698
+ <div class="app-dialog-header">
699
+ <h2 class="app-dialog-title" id="agentConnectionTitle">Connect an AI agent</h2>
700
+ <p class="app-dialog-copy">Follow the steps below to give an agent secure access to this workspace.</p>
701
+ </div>
702
+ <div id="agentConnectionContent"></div>
703
+ </div>
704
+ </dialog>
705
+
706
+ <dialog class="app-dialog" id="fileActionDialog" aria-labelledby="fileActionTitle">
691
707
  <form class="app-dialog-form" id="fileActionForm" method="dialog">
692
708
  <div class="app-dialog-header">
693
709
  <h2 class="app-dialog-title" id="fileActionTitle">Create file</h2>
@@ -706,7 +722,7 @@
706
722
  </form>
707
723
  </dialog>
708
724
 
709
- <dialog class="app-dialog" id="gitCommitDialog">
725
+ <dialog class="app-dialog" id="gitCommitDialog" aria-labelledby="gitCommitTitle">
710
726
  <form class="app-dialog-form" id="gitCommitForm" method="dialog">
711
727
  <div class="app-dialog-header">
712
728
  <h2 class="app-dialog-title" id="gitCommitTitle">Commit included files</h2>
@@ -724,7 +740,7 @@
724
740
  </form>
725
741
  </dialog>
726
742
 
727
- <dialog class="app-dialog" id="gitResetDialog">
743
+ <dialog class="app-dialog" id="gitResetDialog" aria-labelledby="gitResetTitle">
728
744
  <form class="app-dialog-form" method="dialog">
729
745
  <div class="app-dialog-header">
730
746
  <h2 class="app-dialog-title" id="gitResetTitle">Reset file</h2>
@@ -739,12 +755,12 @@
739
755
  </div>
740
756
  <div class="app-dialog-actions">
741
757
  <button class="ui-button ui-button--secondary" id="gitResetCancel" type="button">Cancel</button>
742
- <button class="ui-button ui-button--danger" id="gitResetSubmit" type="button">Reset File</button>
758
+ <button class="ui-button ui-button--danger" id="gitResetSubmit" type="button">Reset file</button>
743
759
  </div>
744
760
  </form>
745
761
  </dialog>
746
762
 
747
- <div class="tab-lock-overlay hidden" id="tabLockOverlay" role="dialog" aria-modal="true" aria-labelledby="tabLockTitle">
763
+ <dialog class="tab-lock-overlay" id="tabLockOverlay" aria-labelledby="tabLockTitle">
748
764
  <div class="tab-lock-card">
749
765
  <span class="tab-lock-kicker">Single active tab</span>
750
766
  <h2 class="tab-lock-title" id="tabLockTitle">This vault is active in another tab</h2>
@@ -753,11 +769,11 @@
753
769
  <button type="button" class="ui-button ui-button--primary ui-button--lg" id="tabLockTakeoverBtn">Take over here</button>
754
770
  </div>
755
771
  </div>
756
- </div>
772
+ </dialog>
757
773
 
758
774
  <div class="toast-container" id="toastContainer"></div>
759
775
 
760
- <div class="qs-overlay" id="quickSwitcher" role="dialog" aria-modal="true" aria-labelledby="quickSwitcherTitle" aria-hidden="true">
776
+ <dialog class="qs-overlay" id="quickSwitcher" aria-labelledby="quickSwitcherTitle" closedby="any">
761
777
  <div class="qs-modal">
762
778
  <h2 class="sr-only" id="quickSwitcherTitle">Search files and text</h2>
763
779
  <div class="qs-mode-tabs" role="tablist" aria-label="Search mode">
@@ -769,7 +785,7 @@
769
785
  <circle cx="11" cy="11" r="8"></circle>
770
786
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
771
787
  </svg>
772
- <input type="text" class="qs-input" id="quickSwitcherInput" role="combobox" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" aria-autocomplete="list" aria-expanded="false" autocomplete="off" spellcheck="false">
788
+ <input type="text" class="qs-input" id="quickSwitcherInput" role="combobox" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" aria-autocomplete="list" aria-expanded="false" autocomplete="off" spellcheck="false" autofocus>
773
789
  <kbd class="qs-kbd">esc</kbd>
774
790
  </div>
775
791
  <div class="qs-scope hidden" id="quickSwitcherScope" role="note" aria-hidden="true">Exact, case-insensitive text in Markdown, Base, Mermaid, PlantUML, Draw.io, and Excalidraw files. Images are excluded.</div>
@@ -781,7 +797,7 @@
781
797
  <span><kbd>Tab</kbd> Switch mode</span>
782
798
  </div>
783
799
  </div>
784
- </div>
800
+ </dialog>
785
801
  <script vite-ignore src="./app-config.js"></script>
786
802
  <script type="module" src="./main-entry.js"></script>
787
803
  </body>
@@ -1,5 +1,7 @@
1
1
  import darkHighlightThemeUrl from '../assets/vendor/highlight/github-dark.min.css?url';
2
2
  import lightHighlightThemeUrl from '../assets/vendor/highlight/github.min.css?url';
3
+ import { CollabMdAppShell } from '../bootstrap/collabmd-app-shell.js';
4
+ import { ensureClientAuthenticated } from '../infrastructure/auth-client.js';
3
5
  import '../styles/base.css';
4
6
  import '../styles/style.css';
5
7
 
@@ -18,4 +20,16 @@ function ensureHighlightThemeStylesheet() {
18
20
  }
19
21
 
20
22
  ensureHighlightThemeStylesheet();
21
- await import('../main.js');
23
+ async function start() {
24
+ await ensureClientAuthenticated();
25
+ const app = new CollabMdAppShell();
26
+ app.initialize();
27
+ }
28
+
29
+ if (document.readyState === 'loading') {
30
+ document.addEventListener('DOMContentLoaded', () => {
31
+ void start();
32
+ }, { once: true });
33
+ } else {
34
+ void start();
35
+ }
@@ -72,34 +72,23 @@ export const chatFeature = {
72
72
  this.renderChat();
73
73
  },
74
74
 
75
- toggleChatPanel() {
76
- if (this.chatIsOpen) {
77
- this.closeChatPanel({ restoreFocus: true });
78
- return;
79
- }
80
-
81
- this.openChatPanel();
82
- },
83
75
 
84
76
  openChatPanel() {
85
77
  this.chatIsOpen = true;
86
78
  this.chatUnreadCount = 0;
79
+ if (!this.elements.chatPanel?.matches(':popover-open')) {
80
+ this.elements.chatPanel?.showPopover();
81
+ }
87
82
  this.renderChat({ stickToBottom: true });
88
- requestAnimationFrame(() => {
89
- this.elements.chatInput?.focus();
90
- });
83
+ requestAnimationFrame(() => this.elements.chatInput?.focus());
91
84
  },
92
85
 
93
- closeChatPanel({ restoreFocus = false } = {}) {
94
- if (!this.chatIsOpen) {
95
- return;
86
+ closeChatPanel() {
87
+ if (this.elements.chatPanel?.matches(':popover-open')) {
88
+ this.elements.chatPanel.hidePopover();
96
89
  }
97
-
98
90
  this.chatIsOpen = false;
99
91
  this.renderChat({ messagesChanged: false });
100
- if (restoreFocus) {
101
- requestAnimationFrame(() => this.elements.chatToggleButton?.focus());
102
- }
103
92
  },
104
93
 
105
94
  handleChatSubmit() {
@@ -129,8 +118,6 @@ export const chatFeature = {
129
118
  },
130
119
 
131
120
  renderChat({ messagesChanged = true, stickToBottom = false } = {}) {
132
- this.elements.chatContainer?.classList.toggle('is-open', this.chatIsOpen);
133
- this.elements.chatPanel?.classList.toggle('hidden', !this.chatIsOpen);
134
121
 
135
122
  this.syncChatToggleButton();
136
123
  this.syncChatNotificationButton();
@@ -363,8 +350,6 @@ export const chatFeature = {
363
350
 
364
351
  button.classList.toggle('is-active', this.chatIsOpen);
365
352
  button.classList.toggle('is-unread', shouldEmphasizeUnread);
366
- button.setAttribute('aria-controls', 'chatPanel');
367
- button.setAttribute('aria-expanded', String(this.chatIsOpen));
368
353
  button.setAttribute(
369
354
  'aria-label',
370
355
  hasUnread ? `Open team chat, ${this.chatUnreadCount} unread` : 'Open team chat',
@@ -132,7 +132,7 @@ export const gitFeature = {
132
132
 
133
133
  button.classList.remove('hidden');
134
134
  if (mode === 'history-preview') {
135
- label.textContent = 'Back to History';
135
+ label.textContent = 'Back to history';
136
136
  button.setAttribute('aria-label', 'Back to file history');
137
137
  button.title = 'Back to file history';
138
138
  return;
@@ -326,6 +326,10 @@ export const gitFeature = {
326
326
  return await this.gitApiClient.stageFile({ path: payload.path, requestId });
327
327
  case 'unstage':
328
328
  return await this.gitApiClient.unstageFile({ path: payload.path, requestId });
329
+ case 'stage-all':
330
+ return await this.gitApiClient.stageAll({ requestId });
331
+ case 'unstage-all':
332
+ return await this.gitApiClient.unstageAll({ requestId });
329
333
  case 'push':
330
334
  return await this.gitApiClient.pushBranch({ requestId });
331
335
  case 'pull':
@@ -534,6 +538,20 @@ export const gitFeature = {
534
538
  });
535
539
  },
536
540
 
541
+ async stageAllGitFiles() {
542
+ await this.runGitActionWithStatus('Staging all changes...', async () => {
543
+ const result = await this.postGitAction('stage-all', {});
544
+ await this.finalizeGitAction({ action: 'stage-all', preferredScope: 'staged', result });
545
+ });
546
+ },
547
+
548
+ async unstageAllGitFiles() {
549
+ await this.runGitActionWithStatus('Unstaging all changes...', async () => {
550
+ const result = await this.postGitAction('unstage-all', {});
551
+ await this.finalizeGitAction({ action: 'unstage-all', preferredScope: 'working-tree', result });
552
+ });
553
+ },
554
+
537
555
  async pushGitBranch() {
538
556
  await this.runGitActionWithStatus('Pushing branch...', async () => {
539
557
  try {
@@ -595,7 +613,7 @@ export const gitFeature = {
595
613
  }
596
614
  this.elements.gitResetFileName.value = filePath;
597
615
  if (this.elements.gitResetSubmit) {
598
- this.elements.gitResetSubmit.textContent = 'Reset File';
616
+ this.elements.gitResetSubmit.textContent = 'Reset file';
599
617
  }
600
618
  this.elements.gitResetSubmit?.toggleAttribute('disabled', false);
601
619
 
@@ -619,10 +637,10 @@ export const gitFeature = {
619
637
 
620
638
  submit?.toggleAttribute('disabled', true);
621
639
  if (submit) {
622
- submit.textContent = 'Resetting...';
640
+ submit.textContent = 'Resetting';
623
641
  }
624
642
  try {
625
- await this.runGitActionWithStatus('Resetting file...', async () => {
643
+ await this.runGitActionWithStatus('Resetting file', async () => {
626
644
  const result = await this.postGitAction('reset-file', { path: filePath });
627
645
  await this.finalizeGitAction({
628
646
  action: 'reset',
@@ -636,7 +654,7 @@ export const gitFeature = {
636
654
  this.toastController.show(error.message || 'Failed to reset file');
637
655
  } finally {
638
656
  if (submit) {
639
- submit.textContent = 'Reset File';
657
+ submit.textContent = 'Reset file';
640
658
  }
641
659
  submit?.toggleAttribute('disabled', false);
642
660
  }
@@ -84,12 +84,10 @@ export const presenceFeature = {
84
84
  const effectiveConnectionState = getConnectedPresenceState(this);
85
85
  const hasUsers = this.globalUsers.length > 0;
86
86
  if (effectiveConnectionState.status !== 'connected') {
87
- this.presencePanelOpen = false;
87
+ this.closePresencePanel();
88
88
  }
89
89
 
90
90
  badge.type = 'button';
91
- badge.setAttribute('aria-controls', 'presencePanel');
92
- badge.setAttribute('aria-expanded', String(this.presencePanelOpen));
93
91
  badge.classList.toggle('is-active', this.presencePanelOpen);
94
92
 
95
93
  if (effectiveConnectionState.status === 'connected') {
@@ -173,12 +171,9 @@ export const presenceFeature = {
173
171
  overflow.className = 'user-avatar user-avatar-button user-avatar-overflow-trigger';
174
172
  overflow.style.backgroundColor = 'var(--color-surface-dynamic)';
175
173
  overflow.style.color = 'var(--color-text-muted)';
176
- overflow.setAttribute('aria-controls', 'presencePanel');
177
- overflow.setAttribute('aria-expanded', String(this.presencePanelOpen));
174
+ overflow.setAttribute('popovertarget', 'presencePanel');
178
175
  overflow.setAttribute('aria-label', `Show ${visibleUsers.length} online users`);
179
- overflow.setAttribute('data-presence-panel-trigger', 'true');
180
176
  overflow.title = `Show ${visibleUsers.length} online users`;
181
- overflow.addEventListener('click', () => this.openPresencePanel());
182
177
  const overflowLabel = document.createElement('span');
183
178
  overflowLabel.className = 'user-avatar-initial';
184
179
  overflowLabel.textContent = `+${visibleUsers.length - MAX_INLINE_AVATARS}`;
@@ -194,29 +189,19 @@ export const presenceFeature = {
194
189
  }
195
190
 
196
191
  this.presencePanelOpen = true;
197
- this.closeChatPanel?.();
198
- this.closeToolbarOverflowMenu?.();
192
+ if (!this.elements.presencePanel?.matches(':popover-open')) {
193
+ this.elements.presencePanel?.showPopover();
194
+ }
199
195
  this.renderAvatars();
200
196
  this.renderPresence();
201
197
  },
202
198
 
203
199
  closePresencePanel() {
204
- if (!this.presencePanelOpen) {
205
- return;
200
+ if (this.elements.presencePanel?.matches(':popover-open')) {
201
+ this.elements.presencePanel.hidePopover();
206
202
  }
207
-
208
203
  this.presencePanelOpen = false;
209
- this.renderAvatars();
210
- this.renderPresence();
211
- },
212
-
213
- togglePresencePanel() {
214
- if (this.presencePanelOpen) {
215
- this.closePresencePanel();
216
- return;
217
- }
218
-
219
- this.openPresencePanel();
204
+ this.renderAvatars?.();
220
205
  },
221
206
 
222
207
  renderPresencePanel() {
@@ -225,8 +210,6 @@ export const presenceFeature = {
225
210
  const status = this.elements.presencePanelStatus;
226
211
  if (!panel || !list) return;
227
212
 
228
- panel.classList.toggle('hidden', !this.presencePanelOpen);
229
- panel.setAttribute('aria-hidden', String(!this.presencePanelOpen));
230
213
  if (!this.presencePanelOpen) {
231
214
  return;
232
215
  }